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

语音助手执行Google函数时跳转回Listen函数的问题求助

问题分析与修复方案

兄弟,我懂你折腾好几天的烦躁——触发Google功能后直接跳回Listen,这事儿确实闹心。咱们来一步步把问题揪出来搞定它:

核心问题1:语法错误触发异常递归

先看你Google()函数里的这行代码:

with sr.Microphone as source:

sr.Microphone是个类,必须加括号实例化成对象才能用,也就是sr.Microphone()。少了括号会直接抛出运行时异常,而你的Listen()函数里的except块根本没做判断,直接递归调用自己,程序自然就跳回Listen流程了。

核心问题2:识别方法调用错误+缺失异常处理

还有Google()里的这行:

Search = r.recognize(Search)

speech_recognition的Recognizer类根本没有recognize()方法,你得用recognize_google()才行。而且这里完全没加异常处理,一旦语音识别失败(比如没听清、网络问题),同样会抛出异常,再次触发Listen()的递归逻辑。

完整修复后的代码

修复后的Google()函数

def Google():
    print("What would you like me to search for you? ")
    engine.say("What would you like me to search for you? ")
    engine.runAndWait()
    # 修复:给Microphone加括号实例化
    with sr.Microphone() as source:
        # 先调整环境噪音,提升识别准确率
        r.adjust_for_ambient_noise(source, duration=0.5)
        print("Listening for your search query...")
        try:
            Search = r.listen(source, phrase_time_limit=3)
            # 修复:使用正确的recognize_google方法
            search_query = r.recognize_google(Search)
            print(f"Searching for: {search_query}")
            # 补上打开谷歌搜索的逻辑(你原来的代码没写这部分)
            webbrowser.open(f"https://www.google.com/search?q={search_query}")
            engine.say(f"Searching for {search_query}")
            engine.runAndWait()
        except sr.UnknownValueError:
            print("Sorry, I couldn't catch what you said.")
            engine.say("Sorry, I couldn't catch what you said.")
            engine.runAndWait()
            # 可以选择重新询问或者返回主命令流程
            Google()
        except sr.RequestError:
            print("Oops, my speech service is unavailable right now.")
            engine.say("Oops, my speech service is unavailable right now.")
            engine.runAndWait()

优化Listen()的异常处理(避免盲目递归)

原来的Listen()把所有异常一股脑接住直接递归,不利于调试,也容易出栈溢出问题,改成针对性捕获:

def Listen():
    with sr.Microphone() as sourceL:
        print("Listening for wake word...")
        # 调整环境噪音,提升唤醒词识别率
        r.adjust_for_ambient_noise(sourceL, duration=0.5)
        try:
            Open = r.listen(sourceL, phrase_time_limit=2)
            recognized_text = r.recognize_google(Open)
            if "Nova" in recognized_text:
                print("Nova received...")
                Command()
            else:
                print(f"Didn't catch wake word, heard: {recognized_text}")
                Listen()
        except sr.UnknownValueError:
            print("Couldn't understand audio, listening again...")
            Listen()
        except sr.RequestError:
            print("Speech service is down, check your internet connection.")
            # 加个延迟再重试,避免疯狂循环
            time.sleep(5)
            Listen()
        except Exception as e:
            print(f"Unexpected error: {str(e)}")
            Listen()

额外优化小建议

  • 少用递归,改用循环:递归次数太多容易触发栈溢出,比如Listen()可以改成while True循环,逻辑更安全。
  • 复用全局Recognizer:你在Command()里新建了Cr = sr.Recognizer(),直接用全局的r就行,减少不必要的资源消耗。
  • 明确麦克风资源释放:每个with sr.Microphone()块都会自动释放资源,但尽量避免嵌套使用麦克风,防止冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:08:16