如何用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}")
关键细节说明
- 回环设备获取:
include_loopback=True参数会将扬声器的输出模拟为麦克风输入,解决了直接指定扬声器索引报错的问题 - 格式转换:
soundcard输出的是float32类型数据,需缩放转换为int16字节流才能被speech_recognition的AudioData接受 - 块时长调整:
CHUNK_DURATION不要设置过短(小于0.3秒),否则音频片段不足以被识别服务解析
内容的提问来源于stack exchange,提问作者notseriouss
相关产品推荐
相关产品推荐

