Mac下用Python+Blackhole对接Azure语音翻译遇SPXERR_MIC_ERROR求助
解决方案:Mac下Blackhole虚拟声卡对接Azure语音翻译
一、正确获取Azure Speech SDK兼容的设备名
Mac上Azure Speech SDK不支持ALSA格式的设备名,必须用SDK自身识别的设备名称。你可以通过以下代码枚举所有可用的输入设备,找到Blackhole对应的设备名:
import azure.cognitiveservices.speech as speechsdk # 枚举所有音频输入设备 devices = speechsdk.audio.AudioDeviceManager.list_audio_input_devices() for idx, device in enumerate(devices): print(f"设备索引:{idx},名称:{device.name}")
运行后找到Blackhole对应的设备名称(比如可能显示为Blackhole 2ch),直接将这个名称传入AudioConfig的device_name参数即可。
另外要确认Blackhole的采样率和Azure Speech SDK要求一致:
- 打开
音频MIDI设置,找到Blackhole设备,检查其采样率(通常为44100Hz或48000Hz) - 创建AudioConfig时可以显式指定采样率,避免不匹配:
audio_config = speechsdk.audio.AudioConfig( device_name="你的Blackhole设备名", properties={ speechsdk.PropertyId.SpeechServiceConnection_AudioSampleRate: "48000" } )
二、文件/流中转方案(如果设备直接调用仍失败)
如果直接指定设备还是报错,可以通过捕获Blackhole的音频流,再推送给Azure Speech SDK,步骤如下:
1. 用PyAudio捕获Blackhole音频流
先安装依赖:pip install pyaudio
然后编写捕获代码,将音频数据推送到Azure的PushAudioInputStream:
import pyaudio import azure.cognitiveservices.speech as speechsdk # 配置Blackhole设备参数(和Blackhole的采样率、通道数一致) FORMAT = pyaudio.paInt16 CHANNELS = 2 RATE = 48000 CHUNK = 1024 # 初始化PyAudio p = pyaudio.PyAudio() # 找到Blackhole的设备索引 blackhole_idx = None for i in range(p.get_device_count()): info = p.get_device_info_by_index(i) if "Blackhole" in info["name"]: blackhole_idx = i break # 创建Azure的Push音频流 push_stream = speechsdk.audio.PushAudioInputStream() audio_config = speechsdk.audio.AudioConfig(stream=push_stream) # 初始化语音翻译识别器 speech_translator = speechsdk.translation.TranslationRecognizer( speech_config=你的speech_config, audio_config=audio_config, target_languages=["zh-CN", "en-US"] # 替换成你的目标语言 ) # 定义翻译回调 def handle_translation_result(evt): if evt.result.reason == speechsdk.ResultReason.TranslatedSpeech: print(f"原文: {evt.result.text}") for lang, text in evt.result.translations.items(): print(f"翻译到{lang}: {text}") speech_translator.recognized.connect(handle_translation_result) # 开始捕获并推送音频 stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, input_device_index=blackhole_idx, frames_per_buffer=CHUNK) speech_translator.start_continuous_recognition() try: while True: data = stream.read(CHUNK) push_stream.write(data) except KeyboardInterrupt: pass # 清理资源 speech_translator.stop_continuous_recognition() stream.stop_stream() stream.close() p.terminate()
2. 临时文件中转(适合简单场景)
如果不想用流推送,也可以用ffmpeg将Blackhole的音频实时写入到一个临时WAV文件,再让Azure读取这个文件的流:
# 终端运行ffmpeg命令,将Blackhole音频写入临时文件 ffmpeg -f avfoundation -i ":Blackhole设备索引" -acodec pcm_s16le -ar 48000 -ac 2 -f wav pipe:1 > /tmp/zoom_audio.wav
然后在Python中读取这个文件的音频流,传给Azure的PullAudioInputStream:
import azure.cognitiveservices.speech as speechsdk # 创建Pull音频流,读取临时文件 pull_stream = speechsdk.audio.PullAudioInputStream( stream=open("/tmp/zoom_audio.wav", "rb") ) audio_config = speechsdk.audio.AudioConfig(stream=pull_stream) # 后续初始化翻译识别器的代码和前面一致
注意:这种方式需要确保ffmpeg持续写入文件,且Python端实时读取,可能会有轻微延迟。
内容的提问来源于stack exchange,提问作者serxio
相关产品推荐
相关产品推荐

