You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:34:01