【问题标题】:Using multiprocessing on audio streams对音频流使用多处理
【发布时间】:2019-06-09 19:19:57
【问题描述】:

我想连续录制和音频。这很容易使用 python 的 sounddevice 模块完成。但是,当音频超过 20 帧时,我还想开始将块发送到在后台工作的线程。执行此操作时声音设备的输入溢出,您能帮我解决这个问题,还是找到其他解决方案?

def callbackAmbient(indata, frames, time, status):
    if (status):
        print(status)
    VadFrames.append(indata)        

    if (len(VadFrames) > 19):
        Process(target = start_vad, args = (numpy.array(numpy.multiply(VadFrames, 0.5)), numpy.array(VadFrames), RATE, RATE)).start()
        VadFrames.pop(0)

print("System Recording...")

try:
    with sd.InputStream(samplerate=192000, blocksize=6144, channels=1, device=sd.query_devices(kind='input')['name'], callback=callbackAmbient):
        while True: 
            pass
except KeyboardInterrupt:
    print("System stopped...")
    sys.exit()

【问题讨论】:

    标签: python audio stream multiprocessing python-sounddevice


    【解决方案1】:

    您可以创建 Stream 的一个实例,并将其作为参数传递给负责数据管理、抛出错误或任何您想要的任何事情的 python 线程。

    audio_stream = AudioStream() #create an audio stream w. my soundcard
    websocket = Websocket(audio_stream) #create a websocket connection passing actual stream
    websocket.start()
    
    audio_stream.run()
    

    Websocket 类在这里负责管理音频流和前端之间的错误(请注意,我在这种情况下使用了 websocket,但您可以简单地选择其他通信协议):

    class Websocket(threading.Thread):
        def __init__(self, stream):
            super().__init__()
            self.audio_stream = stream
    
        def run(self):
            asyncio.set_event_loop(asyncio.new_event_loop())
            start_server = websockets.serve(self.handler, "localhost", 8083)
            asyncio.get_event_loop().run_until_complete(start_server)
            asyncio.get_event_loop().run_forever()
    
        #implementation.....
    

    您在这篇文章中提出的逻辑应该在 AudioStream 类 init 方法中实现才能正常工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-27
      相关资源
      最近更新 更多