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

如何用Python实现系统声音流式传输及语音转文本识别?

实现系统扬声器输出的流式语音识别

问题核心

你遇到的问题本质是:

  • speech_recognition库的Microphone类仅支持输入设备(麦克风),直接指定扬声器索引会因设备类型不匹配报错
  • soundcard的record()方法是批量捕获固定时长音频,无法直接对接流式实时识别的需求

解决方案:结合soundcard流式捕获 + speech_recognition识别

核心思路是用soundcard实时捕获小块扬声器回环音频,转换成speech_recognition兼容的格式后,调用识别接口实现实时转写。

完整可运行代码

import speech_recognition as sr
import soundcard as sc
import numpy as np

# 基础配置
SAMPLERATE = 48000
# 单次捕获的音频块时长(建议0.3-1秒,太短会导致识别失败)
CHUNK_DURATION = 0.5
CHUNK_FRAMES = int(SAMPLERATE * CHUNK_DURATION)

# 获取系统扬声器的回环捕获设备
loopback_device = sc.get_microphone(id=str(sc.default_speaker().name), include_loopback=True)

recognizer = sr.Recognizer()
# 提前用回环音频校准环境噪音
with loopback_device.recorder(samplerate=SAMPLERATE) as mic:
    calibrate_data = mic.record(numframes=int(SAMPLERATE * 1))
    # 转换为speech_recognition需要的AudioData格式
    calibrate_audio = sr.AudioData(
        (calibrate_data[:, 0] * 32767).astype(np.int16).tobytes(),
        SAMPLERATE,
        2  # 16位音频深度,对应2字节
    )
    recognizer.adjust_for_ambient_noise(calibrate_audio, duration=1)

# 启动流式捕获与识别
with loopback_device.recorder(samplerate=SAMPLERATE) as mic:
    while True:
        try:
            # 捕获小块音频
            chunk_data = mic.record(numframes=CHUNK_FRAMES)
            # 格式转换:soundcard输出float32范围[-1,1] → 转int16字节流(符合语音识别要求)
            audio_data = sr.AudioData(
                (chunk_data[:, 0] * 32767).astype(np.int16).tobytes(),
                SAMPLERATE,
                2
            )
            # 调用Google语音识别
            text = recognizer.recognize_google(audio_data, language='en-US').lower()
            print(f"识别结果:{text}")
        except sr.UnknownValueError:
            # 音频无法识别时跳过
            continue
        except sr.RequestError as e:
            print(f"识别服务请求失败:{e}")
        except Exception as e:
            print(f"其他错误:{e}")

关键细节说明

  1. 回环设备获取:include_loopback=True参数会将扬声器的输出模拟为麦克风输入,解决了直接指定扬声器索引报错的问题
  2. 格式转换:soundcard输出的是float32类型数据,需缩放转换为int16字节流才能被speech_recognition的AudioData接受
  3. 块时长调整:CHUNK_DURATION不要设置过短(小于0.3秒),否则音频片段不足以被识别服务解析

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:40:21