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

如何实现语音助手常驻唤醒且不持续打印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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:24:18