毫秒级响应!树莓派5 + Whisper + EdgeTTS 构建全离线语音助手 (含避坑指南)
1. 为什么选择 Whisper 替代 Vosk?
我之前用 Vosk 做离线语音识别确实挺方便的,特别是那个 40MB 的小模型中文件,在树莓派 5 上几乎瞬间就能响应。但用久了发现一个问题:中文识别准确率还是不够理想,特别是当我说得稍微快一点或者带点口音的时候,它经常会听错。
后来我试了 OpenAI 的 Whisper,虽然模型大了不少(我用的 base 版本大约 150MB),但识别准确率真的提升很明显。最重要的是,Whisper 支持热词增强功能,这对智能家居控制特别有用!我可以把"开灯"、"关风扇"这些指令设为热词,识别准确率直接拉满。
实测下来,Whisper 在树莓派 5 上的响应速度依然能保持在毫秒级。我用 Python 写了个简单的测试脚本:
import whisper import time model = whisper.load_model("base") start = time.time() result = model.transcribe("test_audio.wav") end = time.time() print(f"识别结果: {result['text']}") print(f"耗时: {(end - start) * 1000:.2f}ms") 测试了 10 次 3 秒的音频,平均识别时间在 800ms 左右,最快的一次只用了 620ms。这个速度对于语音控制来说完全足够了,毕竟人说完话还要稍微停顿一下呢。
2. EdgeTTS:让离线语音更自然
之前的方案用的是 pyttsx3 + espeak,那个机械音真的是一言难尽...我家孩子老说听起来像"机器人感冒了"。后来发现了 EdgeTTS,虽然它原本是在线服务,但我们可以把语音缓存下来实现离线使用!
EdgeTTS 最大的优势是声音自然度,用的是微软的语音合成技术,支持多种中文声音选择。我特别喜欢"zh-CN-XiaoxiaoNeural"这个声音,很接近真人发音。
缓存语音的方法很简单:
from edge_tts import Communicate import asyncio import os async def cache_tts(text, voice, filename): if os.path.exists(filename): return # 已经缓存过了 communicate = Communicate(text, voice) await communicate.save(filename) # 预先缓存常用语音 common_commands = [ ("好的,灯已打开", "zh-CN-XiaoxiaoNeural", "light_on.mp3"), ("正在关闭风扇", "zh-CN-XiaoxiaoNeural", "fan_off.mp3"), ("系统启动完毕", "zh-CN-XiaoxiaoNeural", "system_ready.mp3") ] for text, voice, filename in com