如何在Python 3.9.7的AI助手代码中添加唤醒词?求解决方案
唤醒词功能实现解决方案
核心思路
放弃在speech_recognition常规识别流程中硬加唤醒词判断,改用持续监听+轻量唤醒词检测的架构——speech_recognition的recognize_*方法是一次性识别逻辑,不适合实时唤醒场景。
具体实现步骤
1. 安装依赖
除speech_recognition外,引入轻量唤醒词检测库pvporcupine(免费版支持自定义唤醒词),执行安装命令:
pip install pvporcupine speechrecognition pyaudio
2. 替换原有监听逻辑
将单次语音识别流程改为:
- 用Porcupine持续监听唤醒词
- 检测到唤醒词后,再调用
speech_recognition处理后续指令
3. 代码修改示例
假设原有基础代码结构如下:
import speech_recognition as sr r = sr.Recognizer() with sr.Microphone() as source: print("Listening...") audio = r.listen(source) try: text = r.recognize_google(audio, language='zh-CN') print(f"You said: {text}") # 后续指令处理逻辑 except sr.UnknownValueError: print("Could not understand audio")
修改为带唤醒词的版本:
import speech_recognition as sr import pvporcupine import pyaudio # 初始化Porcupine,使用内置唤醒词(免费版支持"alexa"等内置词) # 自定义唤醒词需生成对应的ppn文件,替换下方参数即可 porcupine = pvporcupine.create(keywords=["alexa"]) pa = pyaudio.PyAudio() # 配置音频流 audio_stream = pa.open( rate=porcupine.sample_rate, channels=1, format=pyaudio.paInt16, input=True, frames_per_buffer=porcupine.frame_length ) r = sr.Recognizer() print("等待唤醒词...") while True: # 读取音频帧检测唤醒词 pcm = audio_stream.read(porcupine.frame_length) pcm = pvporcupine.convert_pcm_to_int16(pcm) keyword_index = porcupine.process(pcm) if keyword_index >= 0: print("唤醒成功!请说话...") # 唤醒后监听用户指令 with sr.Microphone() as source: r.adjust_for_ambient_noise(source) audio = r.listen(source) try: text = r.recognize_google(audio, language='zh-CN') print(f"识别到指令: {text}") # 在此添加你的指令处理逻辑 except sr.UnknownValueError: print("没听清,请再说一遍") except sr.RequestError as e: print(f"语音识别服务出错: {e}") print("回到等待唤醒词状态...") # 程序退出时释放资源(需捕获Ctrl+C等中断信号执行) porcupine.delete() audio_stream.close() pa.terminate()
4. 关键注意事项
- 自定义唤醒词:若要使用专属唤醒词(如"小助手"),需生成对应的
.ppn文件,修改初始化代码为porcupine = pvporcupine.create(keyword_paths=["你的唤醒词文件.ppn"]) - 权限与环境:确保麦克风权限已开启,Linux系统可能需额外安装音频驱动
- 性能优化:Porcupine检测逻辑轻量,不会占用过多系统资源,适合持续运行
- 错误处理:添加键盘中断捕获(如
try-except KeyboardInterrupt)实现优雅退出
无第三方库备选方案
若不想引入额外依赖,可通过speech_recognition持续识别短音频片段,检查结果中是否包含唤醒词:
import speech_recognition as sr import time r = sr.Recognizer() with sr.Microphone() as source: r.adjust_for_ambient_noise(source) print("等待唤醒词...") while True: try: # 每秒识别一次短音频片段 audio = r.listen(source, phrase_time_limit=1) text = r.recognize_google(audio, language='zh-CN').lower() if "小助手" in text: print("唤醒成功!请说话...") # 监听完整指令 audio = r.listen(source) cmd = r.recognize_google(audio, language='zh-CN') print(f"指令: {cmd}") # 处理指令逻辑 print("回到等待唤醒词状态...") except sr.UnknownValueError: continue except sr.RequestError as e: print(f"服务出错,等待重试: {e}") time.sleep(5)
该方案缺点是误唤醒率较高,且依赖网络识别,仅适合快速测试。
内容的提问来源于stack exchange,提问作者aminerijalleblad
相关产品推荐
相关产品推荐

