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

Python语音识别+Streamlit:麦克风仅首次触发可用问题求助

问题分析

首次点击按钮能正常完成语音识别,第二次点击无响应且无法进入识别逻辑的try代码块,核心原因是全局sr.Recognizer实例在Streamlit的重运行机制下残留了异常状态,且麦克风资源未被正确释放。Streamlit每次交互都会重新执行整个脚本,全局变量会保留之前的上下文,导致第二次调用时麦克风被占用或识别器处于异常状态。

修复方案

1. 重构语音识别函数,避免全局实例

将Recognizer和Microphone的初始化移到函数内部,确保每次调用都使用全新实例,避免状态残留:

import speech_recognition as sr

def get_audio():
    # 每次调用都重新初始化识别器和麦克风
    r = sr.Recognizer()
    said = ""
    try:
        with sr.Microphone() as source:
            print("正在监听...")
            r.pause_threshold = 0.5
            audio = r.listen(source)
        print("进入识别逻辑")
        said = r.recognize_google(audio, language="fr-FR")
        print(f"识别结果: {said}")
    except sr.UnknownValueError:
        print("Exception: Google语音识别无法理解音频")
    except sr.RequestError as e:
        print(f"无法连接Google语音识别服务: {e}")
    except Exception as e:
        # 新增通用异常捕获,排查麦克风底层问题
        print(f"麦克风或系统异常: {str(e)}")
    return said

2. 调整Streamlit交互逻辑,避免状态冲突

修改按钮和输入框的逻辑,确保每次点击触发全新识别流程,同时避免输入框key重复导致的状态缓存问题:

import streamlit as st

st.title("语音识别工具")

if st.button("点击开始说话"):
    with st.spinner("正在监听音频..."):
        text = get_audio()
    # 使用动态key保证每次点击后输入框状态独立
    query = st.text_input("识别结果", value=text, key=f"transcription_{st.session_state.get('click_count', 0)}")
    # 更新点击计数,确保key唯一
    st.session_state['click_count'] = st.session_state.get('click_count', 0) + 1
    if query:
        st.success(f"已获取输入: {query}")

3. 补充资源释放验证(可选)

如果仍存在麦克风占用问题,可手动添加资源释放逻辑(虽然后台上下文管理器会自动处理,但极端场景下可强制释放):

def get_audio():
    r = sr.Recognizer()
    source = None
    said = ""
    try:
        source = sr.Microphone()
        with source:
            r.pause_threshold = 0.5
            audio = r.listen(source)
        said = r.recognize_google(audio, language="fr-FR")
    except Exception as e:
        print(f"异常: {str(e)}")
    finally:
        # 确保麦克风资源被释放
        if source:
            del source
    return said
关键说明
  • Streamlit每次交互都会重新执行整个脚本,全局变量会保留之前的状态,因此不要将Recognizer或Microphone实例设为全局变量。
  • 新增通用异常捕获,能快速定位麦克风权限、设备占用等底层问题,方便排查第二次调用失败的具体原因。
  • 使用动态key的输入框,可避免Streamlit的状态缓存导致输入框显示异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:22:48