Python Vosk语音识别:自动适配WAV采样率解决识别异常问题
问题原因
- 在线转换后的WAV文件存在采样率元数据与实际音频数据不匹配的问题:wave库读取的是文件头记录的采样率,但部分文件的文件头被错误修改(仅改了元数据却未实际重采样音频),导致识别器用错误的采样率初始化,无法正确解析音频数据,输出无意义内容。
- 你之前用
librosa.load(audio_file, sr=48000)是强制将音频重采样到48000,但如果原音频实际采样率不是48000,这种强制重采样会导致音频失真,依然无法被正确识别。
解决方案
要实现自动化适配,核心是先获取音频的真实采样率,再统一转换为Vosk模型支持的采样率(你的代码中模型对应96000),步骤如下:
获取音频真实采样率
使用librosa不强制重采样的方式加载音频,得到实际采样率:import librosa y, actual_sr = librosa.load("a.wav", sr=None) # sr=None表示保留原始采样率统一重采样到目标采样率
将音频转换为Vosk模型要求的采样率(这里是96000):target_sr = 96000 if actual_sr != target_sr: y = librosa.resample(y, orig_sr=actual_sr, target_sr=target_sr)转换为Vosk兼容的音频格式并识别
Vosk需要16位单声道PCM格式的音频数据,转换后传入识别器:import vosk import numpy as np # 将浮点音频转换为16位PCM字节流 audio_pcm = (y * 32767).astype(np.int16).tobytes() # 初始化识别器(使用目标采样率) rec = vosk.KaldiRecognizer(model, target_sr) rec.AcceptWaveform(audio_pcm) print(rec.FinalResult())
补充说明:
- 若你的Vosk模型支持多种采样率,也可以直接用真实采样率初始化识别器,但统一转换为模型训练时用的采样率(比如96000)能获得更好的识别效果。
- 如果音频是立体声,记得先转成单声道:
y = librosa.to_mono(y),Vosk默认只支持单声道输入。
内容的提问来源于stack exchange,提问作者Alerto
相关产品推荐
相关产品推荐

