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

如何基于SpeechRecognition/PyAudio实现Python实时语音转文本?

实现实时逐词语音识别输出

要实现实时逐词输出而不是等待用户说完再一次性输出,核心思路是持续监听小段音频并增量识别,而非用r.listen()等待完整语音输入。下面是具体的实现方案和代码:

核心思路

  1. 先校准环境噪音,避免背景音干扰识别准确性
  2. 循环监听短时长的音频片段(比如1秒),高频获取语音内容
  3. 每次识别片段内容后,和之前的识别结果对比,提取新增的单词并即时输出
  4. 处理识别过程中的内容修正(比如之前识别的内容被更新),保证输出连贯性

完整代码示例

import speech_recognition as sr

def real_time_word_recognition():
    r = sr.Recognizer()
    microphone = sr.Microphone(device_index=0)
    
    # 先校准环境噪音,只需要执行一次
    with microphone as source:
        r.adjust_for_ambient_noise(source, duration=1)
        print("🎙️ 开始实时识别,按Ctrl+C停止...")
    
    previous_text = ""
    
    try:
        while True:
            with microphone as source:
                # 每次监听1秒的音频片段,phrase_time_limit控制单次监听时长
                audio = r.listen(source, phrase_time_limit=1)
            
            try:
                # 调用Google语音识别API处理当前音频片段
                current_text = r.recognize_google(audio)
                
                # 对比新旧识别结果,输出新增内容
                if current_text.startswith(previous_text):
                    # 如果当前结果是之前内容的延续,提取新增单词
                    new_content = current_text[len(previous_text):].strip()
                    if new_content:
                        print(new_content, end=" ", flush=True)
                        previous_text = current_text
                else:
                    # 如果识别结果有修正(比如之前识别错误),更新并重新输出当前完整内容
                    print(f"\r{current_text}", end=" ", flush=True)
                    previous_text = current_text
                    
            except sr.UnknownValueError:
                # 没识别到有效内容,直接跳过
                continue
            except sr.RequestError as e:
                print(f"\n❌ Google识别服务请求失败: {e}")
                break
                
    except KeyboardInterrupt:
        print("\n🛑 识别已停止")

if __name__ == "__main__":
    real_time_word_recognition()

关键细节说明

  • phrase_time_limit=1:这个参数控制单次监听的最长时长,设置为1秒可以保证我们频繁获取音频片段,实现"实时"效果。你可以根据需求调整(比如0.5秒更灵敏,但识别错误率可能上升)
  • flush=True:强制控制台立刻输出内容,避免因系统缓冲导致的输出延迟
  • 文本对比逻辑:用前缀匹配判断是否是内容延续,避免重复输出已识别的单词;如果识别结果有修正,则更新并重新输出当前完整内容,保证准确性
  • 异常处理:捕获UnknownValueError(无有效识别内容)和RequestError(API请求失败),让程序运行更稳定

进阶优化建议

  • 若需要更高的准确性和精准逐词检测,可以使用Google Cloud Speech-to-Text的流式识别API(当前代码用的是非流式API),它支持实时流式传输音频并返回逐词结果
  • 可以引入分词库(比如nltk)优化文本对比逻辑,将文本拆分为单词列表后对比差异,比字符串前缀匹配更可靠
  • 可添加音量检测,仅当检测到用户说话时才触发识别,减少无效的监听和API请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:37:29