树莓派4运行speech_recognition录音代码出现ALSA报错问题咨询
问题原因说明
你看到的大段ALSA输出90%以上是不影响功能的无害警告,不是致命错误。
speech_recognition库默认调用PyAudio作为音频后端,PyAudio初始化时会遍历ALSA配置里声明的所有设备节点,而树莓派默认ALSA配置里写了rear环绕、center_lfe中置、hdmi音频、modem、phoneline等大量树莓派硬件根本不存在的设备通道,枚举不到就会打印这些日志,只要系统命令行arecord/aplay正常,这些日志本身不会阻断录音识别功能。
分场景解决方法
场景1:代码能正常识别语音,只是想屏蔽刷屏的ALSA警告
选任意一种方法即可:
- 方法1:代码层面屏蔽加载音频库阶段的ALSA日志,在导入pyaudio、speech_recognition之前加入如下代码,不影响后续业务代码的报错打印:
import os import sys # 临时重定向stderr屏蔽ALSA低级警告 stderr_fd = os.dup(sys.stderr.fileno()) devnull_fd = os.open(os.devnull, os.O_WRONLY) os.dup2(devnull_fd, sys.stderr.fileno()) # 导入音频相关依赖 import pyaudio import speech_recognition as sr # 恢复正常stderr输出 os.dup2(stderr_fd, sys.stderr.fileno()) os.close(devnull_fd) os.close(stderr_fd)
- 方法2:修改ALSA全局配置,注释掉不存在的设备节点,编辑
/usr/share/alsa/alsa.conf文件,找到如下配置行全部加#注释:
# pcm.rear cards.pcm.rear # pcm.center_lfe cards.pcm.center_lfe # pcm.side cards.pcm.side # pcm.hdmi cards.pcm.hdmi # pcm.modem cards.pcm.modem # pcm.phoneline cards.pcm.phoneline
保存退出后重新运行代码即可。
场景2:代码无法正常录音/识别,警告之外确实有功能异常
按顺序排查修复:
- 修正你之前的配置文件名错误:ALSA用户级配置文件是home目录下的隐藏文件
.asoundrc,不是你创建的arecordrc,文件名写错配置永远不会生效,把你之前写的PCM配置写入~/.asoundrc即可。 - 不要硬编码
device_index=1,设备序号可能随重启、外设插拔变动,先运行如下代码列出所有识别到的音频输入设备,找到名称带USB PnP Sound Device的对应序号再填入代码:
import speech_recognition as sr for index, name in enumerate(sr.Microphone.list_microphone_names()): print(f"设备序号 {index} : {name}")
- 初始化Microphone时显式指定和你arecord测试一致的采样参数,避免参数不匹配导致的采集异常:
# 替换成你实际查到的设备序号 with sr.Microphone(device_index=对应序号, sample_rate=16000, chunk_size=1024) as source: recognizer.adjust_for_ambient_noise(source, duration=0.5) # 可选,自动校准环境噪声阈值,比硬写energy_threshold效果稳定 # 后续原有逻辑不变
- 如果以上操作都无效,替换系统源安装的旧版PyAudio,apt源里的pyaudio版本老旧常存在设备枚举bug,执行如下命令重装:
sudo apt remove -y python3-pyaudio pip3 install --upgrade pyaudio
内容的提问来源于stack exchange,提问作者Ahmed saad
相关产品推荐
相关产品推荐

