树莓派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
相关产品推荐
相关产品推荐

