我想连续录制和音频。使用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()
答案 0 :(得分:0)
您可以创建Stream的实例,并将其作为参数传递给python线程,该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类在这里负责管理音频流和前端之间的错误(请注意,在这种情况下,我使用了websockets,但您可以简单地选择其他通信协议):
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 方法中实现,以便工作