语音助手执行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
相关产品推荐
相关产品推荐

