Java调用Vosk识别RecordRTC上传的Wave音频返回空文本如何解决?
Vosk Java语音识别返回空结果排查与解决方案
核心排查方向
- 音频参数不符合Vosk要求:Vosk默认要求输入为16kHz采样率、单声道、16位小端PCM格式的音频,RecordRTC默认输出的wav通常为48kHz立体声,参数不匹配会导致识别为空。
- Java音频流处理错误:AudioSystem读取的音频流未做格式转换、字节序不匹配,或误将wav文件头当作音频数据投喂给识别器。
- 模型与音频不匹配:使用的Vosk模型语言和音频语言不一致,比如用英文模型识别中文语音。
- 音频本身无效:上传的音频为空白静音、音量过低、录音损坏。
具体解决步骤
1. 前端录音参数对齐(最优方案)
修改RecordRTC初始化配置,直接输出符合Vosk要求的音频,避免服务端转码损耗:
const recorder = RecordRTC(stream, { type: 'audio', mimeType: 'audio/wav', sampleRate: 16000, numberOfAudioChannels: 1, desiredSampRate: 16000 });
2. 服务端强制音频格式转换
如果前端无法修改,在Java代码中新增音频格式校验与转换逻辑,统一转为Vosk要求的格式,修改后的代码如下:
LibVosk.setLogLevel(LogLevel.DEBUG); try (Model model = new Model("model"); InputStream fileStream = new BufferedInputStream(new FileInputStream(filepath)); AudioInputStream rawAis = AudioSystem.getAudioInputStream(fileStream)) { // 定义Vosk要求的目标音频格式 AudioFormat targetFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, 16000, 16, 1, 2, 16000, false // 明确指定为小端字节序 ); // 校验是否支持格式转换 if (!AudioSystem.isConversionSupported(targetFormat, rawAis.getFormat())) { throw new RuntimeException("当前音频格式无法转换为识别要求的格式"); } try (AudioInputStream convertedAis = AudioSystem.getAudioInputStream(targetFormat, rawAis); Recognizer recognizer = new Recognizer(model, 16000)) { int nbytes; byte[] buffer = new byte[4096]; while ((nbytes = convertedAis.read(buffer)) >= 0) { if (recognizer.acceptWaveForm(buffer, nbytes)) { System.out.println(recognizer.getResult()); } else { System.out.println(recognizer.getPartialResult()); } } System.out.println(recognizer.getFinalResult()); } }
3. 验证模型与音频匹配
确认使用的Vosk模型和音频语言完全一致,比如中文语音需要使用vosk-model-cn系列模型,不要混用其他语言模型。如果识别口音较重的语音,优先使用全量模型而非轻量小模型测试。
4. 验证音频有效性
将上传的wav文件下载到本地播放,确认存在清晰可辨的人声,无长时间静音、音量过小、杂音盖过人声的问题。
内容的提问来源于stack exchange,提问作者aniran mohammadpour
相关产品推荐
相关产品推荐

