如何在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
相关产品推荐
相关产品推荐

