如何用Python实现麦克风连续监听及类谷歌/Alexa的唤醒词检测
实现连续监听与唤醒词触发的语音助手
一、解决连续监听问题
你的当前代码仅执行单次listen()调用,因此只能完成一轮监听。要实现持续监听,核心是用循环包裹监听逻辑,同时优化识别器参数减少不必要的中断:
1. 优化初始化逻辑
不要每次监听都重新创建Recognizer和Microphone对象,将它们放到类的初始化方法中,避免重复占用资源:
def __init__(self): # 初始化识别器和麦克风 self.rec = Recognizer() self.source = Microphone() # 仅执行一次环境噪音适配,让识别器适应当前环境 with self.source: self.rec.adjust_for_ambient_noise(self.source, duration=0.5) # 设置静音阈值:静音超过1秒才停止监听(可根据环境调整) self.rec.pause_threshold = 1 # 其他初始化代码(比如UI元素)...
2. 循环实现连续监听
修改监听逻辑为循环执行,每次识别完成后自动回到监听状态:
def start_continuous_listening(self): while True: print("listening...") self.c.itemconfig(self._micro, image=self._microphone) try: # 持续监听音频,直到检测到设定时长的静音 audio = self.rec.listen(self.source) print("Recognising...") self.c.itemconfig(self._micro, image=self._microphoneoff) get_text = self.rec.recognize_google(audio).lower() # 先检查唤醒词,再处理后续逻辑 self.check_wake_word(get_text) except sr.RequestError: self.printing_on_interface( "No internet connection found", "No internet connection found...") # 网络错误后继续循环监听 continue except sr.UnknownValueError: # 无法识别语音时,直接回到监听状态 self.c.itemconfig(self._micro, image=self._microphone) continue
二、实现唤醒词检测(无需机器学习)
因为你不熟悉机器学习,先用简单文本匹配实现唤醒词触发,后续可按需升级为更精准的方案:
1. 添加唤醒词检查逻辑
在类中新增方法处理唤醒词判断,只有检测到唤醒词才触发后续命令处理:
def check_wake_word(self, text): # 定义你的唤醒词列表,比如["嘿助手", "我的助手"] wake_words = ["hey assistant", "我的助手"] # 检查识别文本是否包含任意唤醒词 for word in wake_words: if word in text: print("唤醒词触发!") self.printing_on_interface("唤醒成功", "请说出你的命令...") # 调用命令处理逻辑 self.handle_user_command() return # 未检测到唤醒词,继续监听 print("未检测到唤醒词,继续监听...")
2. 命令处理逻辑示例
当唤醒词触发后,新增方法处理用户的具体命令:
def handle_user_command(self): # 再次监听用户的命令内容 try: audio = self.rec.listen(self.source) command_text = self.rec.recognize_google(audio).lower() self.printing_on_interface("你说的是", command_text) # 调用原有的命令处理逻辑 self.conditions(command_text) except sr.RequestError: self.printing_on_interface("网络错误", "无法识别命令") except sr.UnknownValueError: self.printing_on_interface("无法识别", "请再说一遍")
三、注意事项
- 调整
pause_threshold参数:环境噪音大时可适当调高(比如2秒),避免误判静音停止监听;环境安静时可设为0.5秒。 - 避免资源泄漏:确保
Microphone对象仅初始化一次,不要在循环内重复创建。 - 唤醒词优化:选择独特、不易被日常对话触发的词语,减少误触发概率。
内容的提问来源于stack exchange,提问作者VINAY KUMAR GUPTA
相关产品推荐
相关产品推荐

