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

使用PyAudio录制麦克风输入失败问题求助

解决PyAudio多麦克风录制返回空数据的问题

排查与修复步骤

  • 匹配设备原生参数
    你当前硬编码了采样率和通道数,部分麦克风可能不兼容这类强制配置。修改代码读取设备自身支持的参数:

    device_info = p.get_device_info_by_index(device_index)
    # 使用设备默认采样率和最大输入通道数
    RATE = int(device_info['defaultSampleRate'])
    CHANNELS = device_info['maxInputChannels']
    

    避免驱动因参数不匹配无法正常捕获音频。

  • 修复读取逻辑与异常处理
    Windows下DirectSound易出现缓冲区溢出,在stream.read()中添加参数关闭溢出异常,同时改用时间循环替代固定次数循环,确保录制时长准确:

    import time
    # 替换原有的for循环
    start_time = time.time()
    frames = []
    while time.time() - start_time < RECORD_SECONDS:
        data = stream.read(CHUNK, exception_on_overflow=False)
        frames.append(data)
    

    固定次数循环会因采样率不匹配导致提前结束,时间循环能保证实际录制10秒。

  • 切换HostAPI并验证设备状态
    尝试改用pyaudio.paMME(Windows多媒体API),部分设备对DirectSound支持不佳。同时在筛选麦克风时打印完整设备信息,确认设备未被占用:

    for idx in range(p.get_device_count()):
        device_info = p.get_device_info_by_index(idx)
        if device_info['maxInputChannels'] > 0 and name_filter in device_info['name']:
            print(f"设备{idx}: {device_info['name']} | HostAPI:{device_info['hostApi']} | 支持采样率:{device_info['defaultSampleRate']}")
    
  • 重装适配Windows的PyAudio版本
    直接pip安装的PyAudio可能缺少Windows底层驱动,卸载后用pipwin重新安装:

    pip uninstall pyaudio
    pip install pipwin
    pipwin install pyaudio
    
  • 改用多线程并发录制
    串行录制会导致后续设备无法获取音频资源,用多线程同时处理多个麦克风:

    import threading
    threads = []
    for mic in microphones:
        t = threading.Thread(target=record_audio, args=(mic,))
        threads.append(t)
        t.start()
    for t in threads:
        t.join()
    

修改后的完整代码示例

import pyaudio
import wave
import time
import threading

FORMAT = pyaudio.paInt16
CHUNK = 1024
RECORD_SECONDS = 10

name_filter = 'UMM-6'
host_api_filter = pyaudio.paMME  # 切换到MME API

p = pyaudio.PyAudio()

def record_audio(device_index):
    device_info = p.get_device_info_by_index(device_index)
    RATE = int(device_info['defaultSampleRate'])
    CHANNELS = device_info['maxInputChannels']
    print(f"开始录制设备: {device_info['name']} ({device_index}) | HostAPI: {device_info['hostApi']} | 采样率: {RATE} | 通道数: {CHANNELS}")

    stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK,
                    input_device_index=device_index,
                    exception_on_overflow=False)

    frames = []
    start_time = time.time()
    while time.time() - start_time < RECORD_SECONDS:
        data = stream.read(CHUNK)
        frames.append(data)

    stream.stop_stream()
    stream.close()

    with wave.open(f"recording_{device_index}.wav", 'wb') as wf:
        wf.setnchannels(CHANNELS)
        wf.setsampwidth(p.get_sample_size(FORMAT))
        wf.setframerate(RATE)
        wf.writeframes(b''.join(frames))

    print(f"设备{device_index}录制完成")

# 筛选并打印可用麦克风
microphones = []
for idx in range(p.get_device_count()):
    device_info = p.get_device_info_by_index(idx)
    if device_info['maxInputChannels'] > 0 and name_filter in device_info['name']:
        if host_api_filter == 0 or device_info['hostApi'] == host_api_filter:
            microphones.append(idx)
            print(f"找到可用设备: {idx} - {device_info['name']}")

# 多线程并发录制
threads = []
for mic in microphones:
    t = threading.Thread(target=record_audio, args=(mic,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

p.terminate()

内容的提问来源于stack exchange,提问作者John M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:20:14