树莓派4运行语音识别程序时出现ALSA错误求助
树莓派4语音识别程序Segmentation Fault问题排查与解决
问题背景
在树莓派4上开发语音识别程序,已安装speechRecognition、pyaudio和pyspeech库,确认音频设备ID无误,但运行代码时出现ALSA相关错误并触发Segmentation fault。
运行代码
import speech_recognition as sr listening = True while listening: with sr.Microphone() as source: recognizer = sr.Recognizer() recognizer.energy_threshold = 1568 recognizer.dynamic_energy_threshold = True try: print("Listening...") audio = recognizer.listen(source) response = recognizer.recognize_google(audio) print(response) except sr.UnknownValueError: print("Sorry....")
错误输出
ALSA lib pcm_dmix.c:1075:(snd_pcm_dmix_open) unable to open slave ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline ALSA lib pcm_oss.c:377:(_snd_pcm_oss_open) Unknown field port ALSA lib pcm_oss.c:377:(_snd_pcm_oss_open) Unknown field port Segmentation fault
解决方案
1. 修复ALSA配置文件
ALSA错误是因为系统尝试加载不存在的音频设备(如HDMI、后置声道等),可修改配置屏蔽无效设备:
- 编辑ALSA主配置文件:
sudo nano /usr/share/alsa/alsa.conf - 注释掉默认设备配置行(在行前加
#):# defaults.pcm.card 0 # defaults.pcm.device 0 # defaults.ctl.card 0 - 添加自定义配置,指定实际使用的音频设备(先通过
arecord -l查看设备ID,例如下方指定设备1、子设备0):defaults.pcm.card 1 defaults.pcm.device 0 defaults.ctl.card 1 - 保存退出后重启ALSA服务:
sudo alsa force-reload
2. 显式指定麦克风设备ID
代码中sr.Microphone()默认使用系统默认设备,显式指定设备ID可避免冲突:
- 先运行以下代码获取可用麦克风列表:
import pyaudio p = pyaudio.PyAudio() for i in range(p.get_device_count()): print(i, p.get_device_info_by_index(i)['name']) - 修改原代码,将
sr.Microphone()替换为指定设备ID的版本(例如设备ID为1):with sr.Microphone(device_index=1) as source:
3. 重新编译安装PyAudio
树莓派预编译的PyAudio可能存在兼容性问题,手动编译更稳定:
- 卸载现有PyAudio:
pip uninstall pyaudio - 安装编译依赖:
sudo apt-get install portaudio19-dev python3-all-dev - 从源码编译安装:
pip install --no-binary :all: pyaudio
4. 优化代码资源管理
原代码在循环内重复创建recognizer实例易导致资源泄漏,调整为循环外初始化:
import speech_recognition as sr # 初始化识别器,仅执行一次 recognizer = sr.Recognizer() recognizer.energy_threshold = 1568 recognizer.dynamic_energy_threshold = True listening = True while listening: with sr.Microphone(device_index=你的设备ID) as source: try: print("Listening...") audio = recognizer.listen(source) response = recognizer.recognize_google(audio) print(response) except sr.UnknownValueError: print("Sorry....") # 补充网络请求异常处理 except sr.RequestError as e: print(f"Google语音识别服务请求失败: {e}")
内容的提问来源于stack exchange,提问作者Beeharee Arnav
相关产品推荐
相关产品推荐

