You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:35:26