3. 使用 Vosk 进行语音识别(离线)

Vosk 是一个轻量级的语音转文本(STT)引擎,支持多种语言,并可在 Raspberry Pi 上**完全离线运行**。 您只需在首次下载语言模型时连接网络,之后即可在无网络环境下正常使用。

在本课程中,我们将安装并测试 Vosk,并选择合适的语言模型。

测试 Vosk

运行程序

cd ~/sunfounder-voice-assistant/examples
sudo python3 stt_vosk_stream.py

首次使用某种语言运行该程序时,Vosk 将会:

  • 自动下载语言模型 (默认下载轻量版本)。

  • 输出支持的语言列表

  • 开始通过麦克风**监听音频输入**。

终端中将显示类似以下内容:

vosk-model-small-en-us-0.15.zip: 100%|███████████████████| 39.3M/39.3M [00:05<00:00, 7.85MB/s]
['ar', 'ar-tn', 'ca', 'cn', 'cs', 'de', 'en-gb', 'en-in', 'en-us', 'eo', 'es', 'fa', 'fr', 'gu', 'hi', 'it', 'ja', 'ko', 'kz', 'nl', 'pl', 'pt', 'ru', 'sv', 'te', 'tg', 'tr', 'ua', 'uz', 'vn']
Say something

这表示:

  • 语言模型文件(vosk-model-small-en-us-0.15)已成功下载。

  • 已输出支持的语言列表。

  • 系统已进入监听状态——请对着 Pironman 5 Pro MAX 的麦克风说话,识别结果会显示在终端中。

提示:

  • 将麦克风保持在 15–30 cm 距离内,以获得更好的识别效果。

  • 选择与您的语言和口音匹配的模型。

  • 在安静环境中使用可提高识别准确率。

代码

from sunfounder_voice_assistant.stt import Vosk as STT

stt = STT(language="en-us")

while True:
   print("Say something")
   for result in stt.listen(stream=True):
      if result["done"]:
            print(f"final:   {result['final']}")
      else:
            print(f"partial: {result['partial']}", end="\r", flush=True)

代码说明:

  • stt.listen(stream=True) — 启动流式语音识别,在您说话的过程中持续返回中间识别结果。

  • result["partial"] — 显示**实时识别文本** (会不断更新)。

  • result["final"] — 当您停止说话时,显示**最终识别出的完整句子**。

  • 循环会持续运行,从而实现**免手动操作的实时语音转写**。

提示:这种流式模式非常适合用于 语音助手语音命令控制实时语音转写

故障排查

  • No such file or directory(运行 `arecord` 时出现)

    可能是使用了错误的声卡/设备编号。 运行:

    arecord -l
    

    然后将 1,0 替换为您 USB 麦克风对应的设备编号。

  • 录音文件没有声音

    打开混音器并检查麦克风音量:

    alsamixer
    
    • F6 选择您的 USB 麦克风。

    • 确保 Mic/Capture 未被静音(显示为 [OO] 而不是 [MM])。

    • 使用 ↑ 键提高音量。

  • Vosk 无法识别语音

    • 确保 语言代码 与模型一致(例如英语使用 en-us,中文使用 zh-cn)。

    • 将麦克风保持在 15–30 cm 距离,并避免背景噪声。

    • 说话清晰、语速适中。

  • 识别延迟较高 / 速度较慢

    • 默认自动下载的是 small 模型 (速度较快,但准确率略低)。

    • 如果仍然较慢,可以关闭其他程序以释放 CPU 资源。