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

基于Python SpeechRecognition库检测唤醒词ODI的误识别问题求助

可行解决方案如下:

1. 修正关键词检测阈值

你之前设置的阈值1、1e+20都是无效配置,pocketsphinx的关键词阈值应为负指数级数值,数值越小对匹配精度要求越高:

  • 初始建议设置为1e-15,再根据实际使用场景调整:如果误判多就再调低到1e-20左右,如果漏判多就调高到1e-10左右
  • 修正后的关键词参数写法为:keyword_entries=[('ODI', 1e-15)]

2. 自定义关键词发音,避免复用现有单词

没必要强行用发音接近的ode,可以直接为ODI添加自定义发音,完全匹配你的目标读音:

  1. 新建一个纯文本字典文件,比如命名为odi_dict.dic,内容写一行:
    ODI OW D IY
    (上述为CMU音标,对应发音就是你要的"ODI"读音)
  2. 调用recognize_sphinx时添加字典参数:dict='odi_dict.dic',这样就不会和现有英文单词的发音判定混淆。

3. 修正监听逻辑

你当前的代码逻辑有问题:同一段音频既做关键词检测又做指令识别,无法实现「检测到关键词后再录后续指令」的效果,应调整为两步循环逻辑:

  • 第一步:开常驻循环,用pocketsphinx持续监听,仅做关键词检测,不需要全量语音识别
  • 第二步:检测到关键词后,立刻启动新的录音流程,录制接下来的用户指令音频,单独传给Google识别器处理

4. 增加误判过滤机制

可以加简单的逻辑过滤偶发误判:

  • 连续2次检测到关键词才触发后续指令录制,单次识别到直接忽略
  • 限制关键词检测的音频长度,单次录音最长1秒,避免把长段语音误识别为关键词

修正后的参考代码

import speech_recognition as sr
import time

class ODI_Assistant:
    def __init__(self):
        self.recognizer = sr.Recognizer()
        self.microphone = sr.Microphone()
        # 自定义关键词阈值,可根据效果调整
        self.keyword_threshold = 1e-15
        # 自定义字典路径
        self.custom_dict = "odi_dict.dic"

    def detect_keyword(self):
        """持续检测关键词,检测到返回True"""
        with self.microphone as source:
            self.recognizer.adjust_for_ambient_noise(source, duration=0.5)
            audio = self.recognizer.listen(source, phrase_time_limit=1)
        try:
            transcript = self.recognizer.recognize_sphinx(
                audio, 
                language='en-us', 
                keyword_entries=[('ODI', self.keyword_threshold)],
                dict=self.custom_dict
            ).lower()
            return "odi" in transcript
        except:
            return False

    def get_command(self):
        """检测到关键词后录制并识别指令"""
        print("检测到ODI,正在接收指令...")
        with self.microphone as source:
            audio = self.recognizer.listen(source, phrase_time_limit=3)
        try:
            return self.recognizer.recognize_google(audio, language='en-ie').lower()
        except:
            print("指令识别失败,请重试")
            return None

    def run(self):
        """主循环"""
        print("ODI助手已启动,等待唤醒...")
        detect_count = 0
        while True:
            if self.detect_keyword():
                detect_count +=1
                # 连续2次检测到才触发,过滤误判
                if detect_count >=2:
                    command = self.get_command()
                    if command:
                        print(f"识别到指令:{command}")
                        # 这里加你的指令处理逻辑
                    detect_count = 0
                    time.sleep(0.5)
            else:
                detect_count = 0
                time.sleep(0.1)

内容的提问来源于stack exchange,提问作者Dev_elop_er_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 11:27:02