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

树莓派4B基于ALSA的语音识别功能异常问题求助

解决Raspberry Pi OS中speech_recognition库的ALSA错误与语音识别无结果问题

问题背景

在Raspberry Pi OS上使用Python 3.9.2和speech_recognition库编写语音识别代码,代码如下:

def recognizer():
    try:
        with sr.Microphone() as voice:
            listen = sr.Recognizer()
            voices = listen.listen(voice, 2, 30)
            command = listen.recognize_google(voices, language="es-ES")
    except:
        command = ''
    return command

print(recognizer())

运行后出现大量ALSA相关错误(如采样率匹配失败、未知PCM设备、PulseAudio连接拒绝等),但PulseAudio可正常识别麦克风并录音,代码始终返回空字符串,即使使用sudo运行也无法解决。

排查与解决步骤

1. 先定位核心错误原因

代码中except:捕获所有异常但不输出具体信息,无法区分是音频捕获失败还是谷歌识别接口失败。先修改代码打印异常详情:

def recognizer():
    try:
        with sr.Microphone() as voice:
            listen = sr.Recognizer()
            # 添加环境降噪,提升录音质量
            listen.adjust_for_ambient_noise(voice, duration=1)
            print("请说话...")
            voices = listen.listen(voice, timeout=2, phrase_time_limit=30)
            command = listen.recognize_google(voices, language="es-ES")
    except Exception as e:
        print(f"错误详情: {str(e)}")
        command = ''
    return command

print(recognizer())

运行后即可明确问题出在音频捕获还是识别环节。

2. 指定正确的麦克风设备

sr.Microphone()默认使用系统默认麦克风,可能误识别到非目标设备(如板载麦克风而非USB麦克风)。先列出所有可用麦克风:

import speech_recognition as sr
for index, name in enumerate(sr.Microphone.list_microphone_names()):
    print(f"麦克风索引 {index}: {name}")

找到目标麦克风的索引后,在代码中指定:

# 替换为你的目标麦克风索引
with sr.Microphone(device_index=1) as voice:
    # 后续代码不变

3. 修复ALSA与PulseAudio的冲突

错误中出现PulseAudio: Unable to connect: Connection refused,说明pyaudio(speech_recognition的依赖库)尝试直接用ALSA访问设备,而非通过PulseAudio:

  • 重新安装带PulseAudio支持的pyaudio:
sudo apt install portaudio19-dev pulseaudio libpulse-dev
pip install pyaudio --force-reinstall
  • 强制Python使用PulseAudio,运行代码前设置环境变量:
export ALSA_CONFIG_PATH=/usr/share/alsa/alsa.conf.d/99-pulseaudio-default.conf
python3 your_script.py

也可以把环境变量配置加到代码开头:

import os
os.environ['ALSA_CONFIG_PATH'] = '/usr/share/alsa/alsa.conf.d/99-pulseaudio-default.conf'

4. 检查用户音频权限

确保当前用户拥有音频设备访问权限:

sudo usermod -aG audio $USER

注销后重新登录生效。

5. 单独测试音频捕获功能

用pyaudio直接测试音频捕获,排除speech_recognition的问题:

import pyaudio
import wave

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "test.wav"

p = pyaudio.PyAudio()

# 替换为你的目标麦克风索引
stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                input_device_index=1,
                frames_per_buffer=CHUNK)

print("录音中...")

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

print("录音结束")

stream.stop_stream()
stream.close()
p.terminate()

wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()

如果能生成正常可播放的test.wav,说明音频捕获无问题,需排查谷歌语音识别接口的网络或权限问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:07:01