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

PyAudio录制语音遇[Errno -9981]输入溢出问题求助

问题:语音录制脚本recognize.py抛出输入溢出错误

我在部署语音认证库时遇到问题:add_user.py可以正常录制语音并写入数据库,但recognize.py执行时触发OSError: [Errno -9981] Input overflowed错误。两个脚本的录制核心代码和参数完全一致,调整参数后问题依旧。当前环境为MacOS,未连接树莓派。

正常运行的add_user.py核心代码

FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 1024
RECORD_SECONDS = 3

source = "./voice_database/" + name

os.mkdir(source)

for i in range(3):
    audio = pyaudio.PyAudio()

    if i == 0:
        j = 3
        while j >= 0:
            time.sleep(1.0)
            os.system('cls' if os.name == 'nt' else 'clear')
            print("Say your name in {} seconds".format(j))
            j -= 1

    elif i == 1:
        time.sleep(2.0)
        print("Say your name one more time")
        time.sleep(0.8)
    
    else:
        time.sleep(2.0)
        print("Say your name one last time")
        time.sleep(0.8)

    # start Recording
    stream = audio.open(format=FORMAT, channels=CHANNELS,
                rate=RATE, input=True,
                frames_per_buffer=CHUNK)

    print("recording...")
    frames = []

    for _ in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
        data = stream.read(CHUNK)
        frames.append(data)

    # stop Recording
    stream.stop_stream()
    stream.close()
    audio.terminate()

触发错误的recognize.py核心代码

FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 1024
RECORD_SECONDS = 4
FILENAME = "./test.wav"

audio = pyaudio.PyAudio()

# start Recording
stream = audio.open(format=FORMAT, channels=CHANNELS,
            rate=RATE, input=True,
            frames_per_buffer=CHUNK)

time.sleep(2.0)
print("recording...")
frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)
print("finished recording")

# stop Recording
stream.stop_stream()
stream.close()
audio.terminate()

解决方法

1. 调整流启动时机

recognize.py中在流启动后直接睡眠,导致后台缓冲的音频数据无法及时读取引发溢出。把睡眠操作移到流打开之前:

audio = pyaudio.PyAudio()

time.sleep(2.0)
print("recording...")
# 先完成提示延迟,再启动音频流
stream = audio.open(format=FORMAT, channels=CHANNELS,
            rate=RATE, input=True,
            frames_per_buffer=CHUNK)

frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)
print("finished recording")

2. 忽略溢出错误(可选)

如果可以接受少量数据丢失,在读取时添加参数关闭溢出异常:

data = stream.read(CHUNK, exception_on_overflow=False)

3. 检查MacOS麦克风权限

打开「系统偏好设置 → 安全性与隐私 → 隐私 → 麦克风」,确认你的Python解释器已被授予麦克风访问权限。

4. 调整采样参数降低压力

尝试降低采样率或增大块大小,减少系统实时处理负载:

RATE = 22050
CHUNK = 2048

内容的提问来源于stack exchange,提问作者Ananya Aggarwal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 09:40:15