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

如何在Python中为Azure认知服务获取麦克风设备ID并指定特定麦克风进行关键词监听

如何在Python中为Azure认知服务获取麦克风设备ID并指定特定麦克风进行关键词监听

我之前做类似的Azure语音项目时,刚好遇到过一模一样的问题!给你分享几个亲测有效的方案,不管是做用户下拉选择还是跨平台适配都能搞定:

方案一:直接用Azure Speech SDK自带的设备枚举API

其实你完全不用找第三方库,Azure的Python Speech SDK本身就自带了音频设备枚举的方法,拿到的设备ID就是SDK要求的格式,直接能用,还跨平台(Mac、Windows都支持),简直是为你的需求量身定做的!

比如你可以这样写代码:

import azure.cognitiveservices.speech as speechsdk

# 枚举所有可用的麦克风设备
audio_devices = speechsdk.audio.AudioDeviceEnumerator.get_audio_input_devices()

# 把设备名和ID列出来,方便用户选择
for idx, device in enumerate(audio_devices):
    print(f"[{idx+1}] 麦克风名称: {device.name}, 对应SDK可用ID: {device.id}")

# 假设用户选了第二个设备,直接把ID传给AudioConfig
selected_device_id = audio_devices[1].id
audio_config = speechsdk.audio.AudioConfig(device_name=selected_device_id)
# 正常初始化关键词识别器
keyword_recognizer = speechsdk.KeywordRecognizer(audio_config=audio_config)

做下拉框的话更简单:把每个设备的name显示给用户,把id作为隐藏值存起来,用户选中后直接取对应的id传进AudioConfig就行,完全不用让用户接触到复杂的ID字符串。

方案二:Mac上用PyObjC调用Core Audio(备用方案)

如果因为某些特殊原因你不想用SDK自带的方法,那可以用PyObjC调用Mac系统的Core Audio框架获取设备ID,不过这个方法只针对Mac平台,Windows得换其他逻辑。

先装依赖:

pip install pyobjc-framework-CoreAudio pyobjc-framework-AudioToolbox

然后用这段代码获取设备:

import CoreAudio

def get_mac_microphones():
    mic_list = []
    # 获取系统所有音频设备数量
    device_count = CoreAudio.AudioHardwareGetNumberOfDevices(None)
    for i in range(device_count):
        device_ref = CoreAudio.AudioHardwareGetDevice(i, None)
        # 判断是不是可用的输入设备(麦克风)
        if CoreAudio.AudioDeviceIsAlive(device_ref) and CoreAudio.AudioDeviceIsInputDevice(device_ref):
            # 获取设备名称
            name = CoreAudio.AudioDeviceGetProperty(device_ref, None, 0, CoreAudio.kAudioDevicePropertyDeviceName, None)
            # 转换为Azure SDK兼容的ID格式
            sdk_device_id = str(device_ref)
            mic_list.append({"name": name, "id": sdk_device_id})
    return mic_list

# 调用获取麦克风列表
mics = get_mac_microphones()
for mic in mics:
    print(f"麦克风: {mic['name']}, 设备ID: {mic['id']}")

关于Windows平台的补充

Windows上不用额外折腾,方案一的SDK自带枚举方法完全能用,拿到的ID直接传给AudioConfig就搞定。如果非要单独处理的话,也可以用sounddevice库或者Windows的API,但还是推荐用SDK自带的方法,省得跨平台适配麻烦。

给你做下拉选择的小示例

比如用Tkinter做一个简单的下拉选择界面,用户选完直接拿到对应ID:

import tkinter as tk
from tkinter import ttk
import azure.cognitiveservices.speech as speechsdk

root = tk.Tk()
root.title("选择监听麦克风")

# 枚举所有麦克风设备
audio_devices = speechsdk.audio.AudioDeviceEnumerator.get_audio_input_devices()
# 生成下拉选项:显示名称,存储ID
device_options = [(dev.name, dev.id) for dev in audio_devices]
selected_id = tk.StringVar()

# 创建下拉框
mic_combo = ttk.Combobox(root, values=[name for name, _ in device_options], state="readonly")
mic_combo.pack(padx=20, pady=20)

def on_mic_selected(event):
    # 匹配用户选择的名称和对应的ID
    current_name = mic_combo.get()
    for name, dev_id in device_options:
        if name == current_name:
            selected_id.set(dev_id)
            print(f"已选中设备ID: {dev_id}")
            break

# 绑定选择事件
mic_combo.bind("<<ComboboxSelected>>", on_mic_selected)

root.mainloop()

# 后续使用时直接取selected_id.get()作为设备ID

备注:内容来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 06:09:37