You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动