如何将Speech Recognition录制的音频帧转为Whisper兼容的NumPy数组?
直接将Speech Recognition录制的音频字节转为NumPy数组传入Whisper
核心步骤说明
Speech Recognition录制的音频会封装为AudioData对象,我们可以直接提取其原始字节数据,转换为Whisper兼容的NumPy数组,无需写入文件:
- 提取
AudioData的原始16位PCM字节(单声道、16kHz) - 将字节转换为int16格式的NumPy数组,再归一化到Whisper要求的[-1.0, 1.0]范围的float32数组
- 直接将该数组传入Whisper的
transcribe方法
完整代码示例
import speech_recognition as sr import numpy as np import whisper # 初始化Speech Recognition的识别器和麦克风(指定16kHz采样率) r = sr.Recognizer() mic = sr.Microphone(sample_rate=16000) # 录制音频 with mic as source: print("正在录音...") audio = r.listen(source) # 将AudioData的原始字节转为NumPy数组 # raw_data是16位有符号小端字节,先转成int16数组 audio_np = np.frombuffer(audio.get_raw_data(), dtype=np.int16) # 归一化到[-1.0, 1.0]的float32数组(Whisper的要求格式) audio_np = audio_np.astype(np.float32) / 32768.0 # 加载Whisper模型(根据需求选tiny/base/small等) model = whisper.load_model("base") # 直接传入NumPy数组进行转录 result = model.transcribe(audio_np, language="zh") print("转录结果:", result["text"])
关键细节
- 确保录制的音频采样率是16kHz:Whisper默认期望16kHz单声道音频,和我们指定的采样率一致,无需额外重采样
- 归一化必须做:Whisper要求输入的音频数组是float32类型,且数值范围在[-1,1]之间,而Speech Recognition的原始数据是int16(范围-32768到32767),所以除以32768.0完成转换
AudioData.get_raw_data()返回的是未经压缩的原始音频字节,没有文件IO开销,完全符合你的需求
内容的提问来源于stack exchange,提问作者potatohprogrammer
相关产品推荐
相关产品推荐

