如何实现语音助手常驻唤醒且不持续打印Exception异常
问题背景
开发支持语音指令唤起应用的个人语音助手,需要程序常驻后台持续监听,当监听到唤醒词"Hello Windows"时触发唤醒逻辑。当前实现存在缺陷:程序会持续打印Exception异常信息,既不符合良好编码规范,也存在长期运行占用过多内存的隐患。
原有实现代码:
import speech_recognition as sr import pyttsx3 WAKE = "hello windows" def speak(text): engine = pyttsx3.init() engine.say(text) engine.runAndWait() def get_audio(): r = sr.Recognizer() with sr.Microphone() as source: audio = r.listen(source) said = "" try: said = r.recognize_google(audio) print(said) except Exception: print("Exception") return said.lower() a = True while a: text = get_audio().lower() if text.count(WAKE) > 0: speak("Hello")
问题根因
原有代码的问题主要集中在三点:
- 异常捕获粒度过粗:直接捕获所有
Exception,没有区分异常类型。日常运行中环境杂音、无有效语音输入、识别接口临时波动都属于高频正常场景,不属于程序错误,反复打印这类异常信息完全无意义 - 资源重复创建:每次调用
speak函数都重新初始化TTS引擎实例,长期运行会积累不必要的内存占用 - 缺少降噪适配:没有做麦克风环境噪音校准,会大幅提升无效识别、识别失败的概率,进一步增加异常触发频率
优化后实现
优化逻辑如下:
- 精准捕获
speech_recognition库定义的特定异常,对无有效语音、网络波动这类常规运行场景不打印冗余日志,仅在出现非预期错误时按需输出信息 - 将TTS引擎初始化移到全局,避免重复创建实例占用内存
- 增加麦克风环境噪音校准,降低识别错误率
- 识别失败时直接返回空字符串,不额外输出日志
优化后代码:
import speech_recognition as sr import pyttsx3 WAKE = "hello windows" # 全局初始化TTS引擎,避免重复创建实例 engine = pyttsx3.init() def speak(text): engine.say(text) engine.runAndWait() def get_audio(): r = sr.Recognizer() with sr.Microphone() as source: # 校准环境噪音,时长设为1秒即可 r.adjust_for_ambient_noise(source, duration=1) audio = r.listen(source) said = "" try: said = r.recognize_google(audio) # 仅识别到有效内容时打印 if said: print(f"识别结果: {said}") # 精准捕获特定异常,不做无意义打印 except sr.UnknownValueError: # 未识别到有效语音,属于正常场景,直接跳过 pass except sr.RequestError: # 识别接口请求失败,调试阶段可打印提示,正式运行直接跳过即可 pass except Exception as e: # 非预期异常,排查问题时可打开日志,日常运行保持静默 pass return said.lower() if __name__ == "__main__": while True: text = get_audio() if WAKE in text: speak("Hello")
优化后程序不会再持续打印无意义的异常信息,长期运行的内存占用也会明显降低。如果需要排查问题,可以打开对应异常分支的日志打印,不需要的时候保持静默即可。
内容的提问来源于stack exchange,提问作者AfterHover
相关产品推荐
相关产品推荐

