树莓派3B+Python开发个人助手:语音转文本(STT)功能求助
针对树莓派3B+Python个人助手的STT语句自动结束方案
嘿,我懂你折腾4个月做个人助手的那份执着——树莓派3B虽然不是性能最优选择,但用来实现这个需求完全够用!针对你提到的「语音转文本+自动识别语句结束并生成可处理字符串」的问题,给你两个实用的本地方案,不用依赖外部API,适配树莓派的硬件情况:
方案一:SpeechRecognition + PocketSphinx + WebRTC VAD(纯本地、低资源)
这个组合完全离线运行,对树莓派3B的压力很小,核心是用WebRTC VAD检测语音活动的起止,当检测到持续静音时自动结束录音并转文本。
步骤1:安装依赖
先在树莓派上安装需要的库:
pip install SpeechRecognition pocketsphinx webrtcvad sounddevice
(sounddevice用来处理音频输入,比PyAudio在树莓派上兼容性更好)
步骤2:示例代码
这段代码会持续监听麦克风,当检测到约0.6秒以上的静音时,自动停止录音并转换为文本:
import speech_recognition as sr import webrtcvad import sounddevice as sd import numpy as np # 配置VAD:模式3(最敏感,适合安静环境),采样率16000Hz(VAD要求的固定采样率) vad = webrtcvad.Vad(3) sample_rate = 16000 frame_duration_ms = 30 # VAD仅支持10/20/30ms的帧时长 frame_size = int(sample_rate * frame_duration_ms / 1000) silence_threshold = 20 # 连续多少帧静音判定为语句结束(可调整) def listen_and_transcribe(): recognizer = sr.Recognizer() silence_frames = 0 audio_frames = [] print("开始说话...") # 流式录制音频 with sd.InputStream(samplerate=sample_rate, channels=1, dtype=np.int16) as stream: while True: frame, overflow = stream.read(frame_size) # 检查当前帧是否为语音 is_speech = vad.is_speech(frame.tobytes(), sample_rate) if is_speech: silence_frames = 0 audio_frames.append(frame) else: silence_frames += 1 # 静音帧超过阈值,停止录制 if silence_frames > silence_threshold: print("检测到语句结束,开始转写...") break # 合并录制的音频帧 audio_data = np.concatenate(audio_frames) # 转换为SpeechRecognition兼容格式 sr_audio = sr.AudioData(audio_data.tobytes(), sample_rate, 2) try: # 使用PocketSphinx本地转写 text = recognizer.recognize_sphinx(sr_audio) print(f"转写结果:{text}") return text except sr.UnknownValueError: print("无法识别语音内容") return None except sr.RequestError as e: print(f"PocketSphinx服务出错:{e}") return None # 测试调用 if __name__ == "__main__": listen_and_transcribe()
调整技巧
- 环境噪音大时,把VAD模式调低(比如1或2),同时增大
silence_threshold的值 - 想延长静音判定时长,比如改成1秒,可把
silence_threshold设为33
方案二:OpenAI Whisper(本地轻量模型,转写精度更高)
Whisper的tiny或base模型可以在树莓派3B上跑通,虽然比PocketSphinx占用资源多,但转写精度提升明显,而且自带语句边界检测能力。
步骤1:安装依赖
pip install openai-whisper # 自动下载tiny英文模型(也可手动下载放到~/.cache/whisper/目录) whisper download tiny.en
步骤2:示例代码
结合静音检测+Whisper转写,自动识别语句结束:
import whisper import sounddevice as sd import numpy as np import webrtcvad # 加载tiny轻量模型 model = whisper.load_model("tiny.en") vad = webrtcvad.Vad(2) sample_rate = 16000 frame_size = int(sample_rate * 30 / 1000) silence_threshold = 25 def listen_with_whisper(): audio_frames = [] silence_frames = 0 print("开始说话...") with sd.InputStream(samplerate=sample_rate, channels=1, dtype=np.float32) as stream: while True: frame, overflow = stream.read(frame_size) # 转换为int16格式供VAD检测 frame_int16 = (frame * 32767).astype(np.int16) is_speech = vad.is_speech(frame_int16.tobytes(), sample_rate) if is_speech: silence_frames = 0 audio_frames.append(frame) else: silence_frames += 1 if silence_frames > silence_threshold: break audio_data = np.concatenate(audio_frames) # Whisper自动处理转写,关闭词级时间戳提升速度 result = model.transcribe(audio_data, word_timestamps=False) print(f"转写结果:{result['text']}") return result['text'] if __name__ == "__main__": listen_with_whisper()
注意事项
- 树莓派3B跑tiny模型转写大概需要几秒,base模型会稍慢,优先选tiny.en即可
- 如果麦克风无输入,先通过
arecord -d 5 test.wav录制音频测试硬件是否正常,再调整ALSA默认输入设备
内容的提问来源于stack exchange,提问作者Josh Foulkes
相关产品推荐
相关产品推荐

