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

使用SpeechRecognition时麦克风断开处理及线程错误捕获方法

线程异常捕获解决方法

因为listen_in_background会启动独立线程执行识别逻辑,主线程的try...except无法捕获子线程抛出的异常,必须把异常处理逻辑放到识别回调函数内部,或者通过全局线程异常钩子处理:

  • 回调内捕获异常(推荐):把所有识别相关逻辑包裹在回调的try...except里,直接处理子线程内的错误
import speech_recognition as sr

def callback(recognizer, audio):
    try:
        # 执行语音识别操作
        text = recognizer.recognize_google(audio)
        print(f"识别结果: {text}")
    except sr.UnknownValueError:
        print("无法解析音频内容")
    except sr.RequestError as e:
        print(f"调用识别服务失败: {str(e)}")
    except Exception as e:
        # 捕获其他所有未预料的异常
        print(f"识别线程发生错误: {str(e)}")

# 初始化并启动后台监听
r = sr.Recognizer()
mic = sr.Microphone()
stop_listening = r.listen_in_background(mic, callback)
  • 全局线程异常钩子(Python 3.8+支持):如果需要统一处理所有线程的异常,可以设置threading.excepthook:
import threading
import traceback

def thread_error_handler(args):
    print(f"线程 [{args.thread.name}] 抛出未捕获异常:")
    traceback.print_exception(args.exc_type, args.exc_value, args.exc_traceback)

threading.excepthook = thread_error_handler
麦克风断开的处理方案

针对麦克风断开的场景,可以从异常捕获、设备状态检测、监听恢复三个维度处理:

  • 捕获设备断开异常:麦克风断开时,SpeechRecognition通常会抛出OSError或IOError,可以在回调或初始化逻辑中捕获:
def callback(recognizer, audio):
    try:
        text = recognizer.recognize_google(audio)
    except OSError as e:
        if "Invalid input device" in str(e):
            print("麦克风已断开连接")
            # 停止当前监听
            stop_listening()
            # 触发重连逻辑
            reconnect_microphone()
  • 定期检测设备状态:通过PyAudio枚举系统音频设备,检查当前使用的麦克风是否存在:
import pyaudio

def is_mic_available(target_device_id):
    p = pyaudio.PyAudio()
    device_exists = False
    for idx in range(p.get_device_count()):
        dev_info = p.get_device_info_by_index(idx)
        if dev_info["index"] == target_device_id:
            device_exists = True
            break
    p.terminate()
    return device_exists

# 主线程中定时检测(比如用time.sleep循环)
import time
while True:
    if not is_mic_available(mic.device_index):
        print("麦克风已断开,尝试重连...")
        stop_listening()
        # 重新初始化麦克风
        try:
            mic = sr.Microphone(device_index=target_device_id)
            stop_listening = r.listen_in_background(mic, callback)
            print("麦克风重连成功")
        except OSError:
            print("重连失败,等待5秒后重试")
    time.sleep(5)
  • 监听恢复逻辑:当检测到麦克风重新连接后,调用listen_in_background重启监听即可,注意要先调用之前返回的stop_listening()函数终止旧线程。

内容的提问来源于stack exchange,提问作者David.Arthur8

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:20:24