如何使用Vosk等快速离线语音识别工具为虚拟助理设置唤醒词
为现有语音识别代码添加离线唤醒词触发功能
实现逻辑
选用轻量离线识别工具作为唤醒检测层,全程只在本地运行,只有检测到预设唤醒词后才会调用Google在线识别接口采集完整指令,从根源避免麦克风音频持续上传的隐私问题:
- 第一阶段(持续离线监听):调用CMU Sphinx/Vosk离线识别实时检测音频,仅匹配预设唤醒词,匹配失败则丢弃音频继续监听
- 第二阶段(在线指令采集):唤醒词命中后,调用原有Google识别逻辑采集用户指令,指令识别完成后自动切回离线监听状态
前置依赖安装
如果用CMU Sphinx(和现有SpeechRecognition库兼容性最好,改动最小):pip install pocketsphinx
如果用Vosk(识别准确率更高,支持自定义唤醒词更灵活):pip install vosk
基于Sphinx的修改后代码示例
import speech_recognition as sr # 自定义唤醒词,可根据需求修改 WAKE_WORD = "hey google" def detect_wake_word(): """离线检测唤醒词,仅本地运行""" r = sr.Recognizer() with sr.Microphone() as source: r.chunk_size = 2048 r.adjust_for_ambient_noise(source) audio = r.listen(source) try: # 用离线Sphinx识别检测唤醒词 text = r.recognize_sphinx(audio).lower() return WAKE_WORD in text except: return False def takeCommand(): """原有Google在线识别逻辑,仅唤醒后调用""" r = sr.Recognizer() with sr.Microphone() as source: print("已唤醒,正在听指令...") r.chunk_size = 2048 r.adjust_for_ambient_noise(source) audio = r.listen(source) try: print("正在识别指令....") query = r.recognize_google(audio, language='en-in') print(f"你说的是: {query}\n") except Exception as e: print(e) print("请再说一遍...") return "None" return query # 主运行逻辑 if __name__ == "__main__": while True: print("等待唤醒...") if detect_wake_word(): print("唤醒成功!") command = takeCommand() # 这里可添加后续指令处理逻辑 print(f"处理指令: {command}") # 指令处理完成后自动回到等待唤醒状态
优化说明
- 如果对Sphinx的唤醒准确率不满意,可以替换成Vosk实现,自定义唤醒词的匹配精度更高,还支持中文唤醒词
- 可以给唤醒检测添加阈值过滤,避免误触发,比如连续两次检测到唤醒词才进入在线识别阶段
- 唤醒后可以添加提示音反馈,让用户明确知道现在可以说指令
内容的提问来源于stack exchange,提问作者Snipey
相关产品推荐
相关产品推荐

