使用Amazon Transcribe做语音转文字如何同时捕获麦克风和扬声器音频
需求实现说明
使用sounddevice库完全可以实现同时捕获麦克风、扬声器两端音频的需求,无需额外引入其他工具。
调整方案
你当前的示例代码仅实现了单路麦克风采集,要同时采集扬声器音频,按以下步骤调整即可:
- 首先调用
sounddevice.query_devices()枚举本地所有音频设备,分别记录两个目标设备的ID:- 麦克风对应的输入设备ID
- 扬声器对应的环回输入设备ID(不同系统的环回设备存在差异:Windows需先启用「立体声混音」设备后可见;Linux可配置PulseAudio环回模块生成对应设备;macOS需安装虚拟音频设备后显示对应环回设备)
- 初始化两路独立的
RawStream,分别绑定上述两个设备ID,所有流的采样率、声道数、数据格式统一配置为Amazon Transcribe要求的16000采样率、单声道、int16格式 - 为两路流分别配置回调函数,将采集到的音频数据推到独立的asyncio队列,后续可根据需求选择将两路音频混合后送Amazon Transcribe转写,或分别提交转写任务生成两端的独立转写结果
双路采集示例代码
import asyncio import sounddevice async def dual_audio_stream(): loop = asyncio.get_event_loop() # 分别创建麦克风、扬声器音频队列 mic_queue = asyncio.Queue() speaker_queue = asyncio.Queue() # 麦克风回调 def mic_callback(indata, outdata, frame_count, time_info, status): loop.call_soon_threadsafe(mic_queue.put_nowait, (bytes(indata), status)) # 扬声器环回回调 def speaker_callback(indata, outdata, frame_count, time_info, status): loop.call_soon_threadsafe(speaker_queue.put_nowait, (bytes(indata), status)) # 麦克风流,替换<MIC_DEVICE_ID>为你查询到的麦克风设备ID mic_stream = sounddevice.RawStream( device=<MIC_DEVICE_ID>, channels=1, samplerate=16000, callback=mic_callback, blocksize=1024 * 2, dtype="int16", ) # 扬声器环回流,替换<SPEAKER_LOOPBACK_DEVICE_ID>为你查询到的环回设备ID speaker_stream = sounddevice.RawStream( device=<SPEAKER_LOOPBACK_DEVICE_ID>, channels=1, samplerate=16000, callback=speaker_callback, blocksize=1024 * 2, dtype="int16", ) with mic_stream, speaker_stream: while True: # 可根据业务逻辑调整获取逻辑,比如同时获取两路数据混合后返回 mic_data, mic_status = await mic_queue.get() speaker_data, speaker_status = await speaker_queue.get() # 此处可添加音频混合逻辑,注意避免int16溢出 yield mic_data, speaker_data
注意事项
如果需要将两路音频混合后转写,叠加音频数据时需要做归一化处理,避免超出int16的取值范围导致音频失真。
内容的提问来源于stack exchange,提问作者Marinos Ioannou
相关产品推荐
相关产品推荐

