使用Vosk Python语音识别API始终返回空文本,命令行工具却可正常识别
Vosk Python语音识别API始终返回空文本,命令行工具却可正常识别
这种情况确实挺让人困惑的——明明命令行工具能精准转写,换用Python API就只返回空文本,大概率是音频数据的处理方式不符合Vosk API的要求。我帮你梳理几个排查和解决的方向:
1. 用正确的方式读取WAV音频数据
你现在直接用open读取二进制文件,但WAV文件开头包含了文件头信息(不是原始的音频采样数据),直接把这部分喂给Vosk识别器会导致它无法解析。应该用Python的wave模块来解析WAV文件,自动跳过文件头,提取正确的PCM采样数据。
修改后的代码如下:
import vosk import wave # 加载Vosk模型 model = vosk.Model("voskSmallFr") # 用wave模块打开音频,获取正确的音频参数 wf = wave.open("speech3.wav", "rb") # 验证音频参数是否符合Vosk要求(单声道、16位采样、16kHz采样率) assert wf.getnchannels() == 1, "音频必须是单声道(Mono)" assert wf.getsampwidth() == 2, "音频必须是16位采样格式" assert wf.getframerate() == 16000, "音频采样率必须为16000Hz" # 用音频实际的采样率初始化识别器 recognizer = vosk.KaldiRecognizer(model, wf.getframerate()) # 分块读取音频数据并识别 while True: # 读取音频帧(而不是直接读二进制字节) data = wf.readframes(4000) if len(data) == 0: break # 可以打印中间识别结果,方便排查 if recognizer.AcceptWaveform(data): print("中间识别结果:", recognizer.Result()) # 获取最终识别结果 print("最终识别结果:", recognizer.FinalResult())
2. 确保音频格式完全符合要求
如果上面的代码触发了断言错误,说明你的WAV文件参数和Vosk要求不匹配(比如是立体声、采样率不是16kHz)。可以用ffmpeg把音频转成标准格式:
ffmpeg -i speech3.wav -ac 1 -ar 16000 -acodec pcm_s16le speech3_mono_16k.wav
然后用转换后的speech3_mono_16k.wav测试你的代码。
3. 确认模型路径的准确性
虽然你的代码没报错,但还是要检查voskSmallFr这个模型文件夹是否在Python脚本的当前工作目录下。如果不确定,可以试试用绝对路径指定模型位置,比如:
model = vosk.Model("C:/path/to/your/voskSmallFr")
4. 排查过程中可以查看中间结果
在循环里加入对AcceptWaveform返回值的判断,可以看到识别器是否在处理过程中识别到了内容,这能帮你快速定位是全程没识别,还是最后FinalResult的问题。
备注:内容来源于stack exchange,提问作者Rémi Descamps




