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

树莓派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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:43:14