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"),
("正在关闭风扇", , ),
(, , )
]
text, voice, filename common_commands:
asyncio.run(cache_tts(text, voice, filename))

