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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:55:55