Java调用Whisper和Vosk语音识别(ASR)模型,实现高效实时语音识别(附源码)
使用SmartJavaAI在java中调用Whisper及Vosk语音识别模型实现高效实时语音识别
简介
语音识别(Automatic Speech Recognition, ASR)是将人类的语音信号自动转换为对应文字的技术,它使计算机能够“听懂”人说的话,是人机语音交互的核心技术,广泛应用于智能助手、语音输入、客服系统等场景。
现在我们已经可以借助 SmartJavaAI 项目,通过 Java 快速接入语音识别能力。本文将手把手教你如何使用 SmartJavaAI 来实现语音识别功能,即使你没有深度学习基础,也能轻松上手!
SmartJavaAI是什么?
SmartJavaAI是专为JAVA 开发者打造的一个功能丰富、开箱即用的 JAVA AI算法工具包,致力于帮助JAVA开发者零门槛使用各种AI算法模型,开发者无需深入了解底层实现,即可轻松在 Java 代码中调用人脸识别、目标检测、OCR 等功能。底层支持包括基于 DJL (Deep Java Library) 封装的深度学习模型,以及通过 JNI 接入的 C++/Python 算法,兼容多种主流深度学习框架如 PyTorch、TensorFlow、ONNX、Paddle 等,屏蔽复杂的模型部署与调用细节,开发者无需了解 AI 底层实现即可直接在 Java 项目中集成使用,后续将持续扩展更多算法,目标是构建一个“像 Hutool 一样简单易用”的 JAVA AI 通用工具箱

快速开始
借助 SmartJavaAI 开源项目,你可以直接在 Java 中集成语音识别模型,无需自己处理复杂的深度学习框架。
Maven引入
在项目的 pom.xml 中添加以下依赖,详细引入方式参考 Maven 引入。
如需引入全部功能,请使用 【不推荐 ❌】 all 模块。
基础依赖
<dependency>
<groupId>cn.smartjavaai</groupId>
<artifactId>speech</artifactId>
<version>1.0.24</version>
</dependency>
FFmpeg 依赖
语音模块依赖 FFmpeg,可引入 jave-all-deps 或按平台引入对应原生库(推荐按平台选择,减小包体积)。
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-all-deps</artifactId>
<version>3.5.0</version>
</dependency>
模型简介及下载
这里仅介绍模型的开源项目,每个开源项目通常包含多个具体模型,本文不逐一列出。
网盘仅包含部分常用模型,如需获取更多模型,请点击下方链接自行下载。
模型名称 | 模型简介 | 模型官网 | 下载地址 |
---|---|---|---|
Whisper | OpenAI 开源的通用语音识别(ASR)模型,支持多语言转写和翻译,具有较高的识别精度,尤其在嘈杂环境中表现良好,适合离线和批量音频处理。 | Github | 官方下载 |
Vosk | 一个轻量级离线语音识别工具包,支持多种语言和平台(包括移动端与嵌入式设备),可在低资源环境中运行,适合实时语音识别场景。 | Github | 官方下载 |
Whisper语音识别
1、获取语音识别模型
public SpeechRecognizer getWhisperRecognizer() {
AsrModelConfig config = new AsrModelConfig();
config.setModelEnum(AsrModelEnum.WHISPER);
//模型下载地址:https://huggingface.co/ggerganov/whisper.cpp/tree/main
config.setModelPath("/Users/xxx/Documents/develop/model/speech/ggml-medium.bin");
return SpeechRecognizerFactory.getInstance().getModel(config);
}
2、语音识别
public void testWhisper() {
try {
SpeechRecognizer recognizer = getWhisperRecognizer();
WhisperParams params = new WhisperParams();
//语言:中文
params.setLanguage(Language.ZH);
R<AsrResult> result = recognizer.recognize("src/main/resources/speech_zh.mp3", params);
if (result.isSuccess()){
log.info("识别成功:{}", JsonUtils.toJson(result.getData()));
}else{
log.info("识别失败:{}", result.getMessage());
}
} catch (Exception e) {
e.printStackTrace();
}
}
3、语音识别(个性化配置)
public void testWhisperWithCustomConfig() {
try {
SpeechRecognizer recognizer = getWhisperRecognizer();
WhisperParams params = new WhisperParams();
//语言:中文
params.setLanguage(Language.ZH);
/**
* 解码搜索策略类型:
* GREEDY - 贪婪解码,逐步选择概率最高的结果;
* BEAN_SEARCH - Beam 搜索,保留多个候选路径以提高准确性。
*/
WhisperFullParams fullParams = new WhisperFullParams(WhisperSamplingStrategy.BEAN_SEARCH);
//语言
fullParams.language = Language.ZH.getCode();
//线程数,设为 0 表示使用最大核心数。
fullParams.nThreads = 0;
//解码器使用的历史文本作为提示的最大 token 数。
fullParams.nMaxTextCtx = 16384;
//解码起始偏移(毫秒)
fullParams.offsetMs = 0;
//解码持续时长(毫秒),超过此长度的音频将被截断
fullParams.durationMs = 0;
//是否翻译为英文
fullParams.translate = false;
// 初始提示,用于提供上下文或样例,帮助模型更准确地理解语音内容
fullParams.initialPrompt = "简体中文";
//禁用上下文链接,不使用前一段解码结果作为上下文
fullParams.noContext = true;
//是否强制仅输出一个段落(适用于短语音)
fullParams.singleSegment = false;
//是否打印特殊标记
fullParams.printSpecial = false;
//是否直接从 whisper.cpp 中打印结果(不推荐,建议使用回调方式替代)
fullParams.printRealtime = false;
//抑制非语音 token输出
fullParams.suppressNonSpeechTokens = false;
//更多参数请查看官网:https://github.com/GiviMAD/whisper-jni/blob/33854520b1f0b3697106a7932a2fd64e8191bca9/src/main/java/io/github/givimad/whisperjni/WhisperFullParams.java
params.setParams(fullParams);
//建议上传 WAV 格式音频。其他格式将自动转换为 WAV,可能影响处理速度
R<AsrResult> result = recognizer.recognize("src/main/resources/speech_zh.mp3", params);
if (result.isSuccess()){
log.info("识别成功:{}", JsonUtils.toJson(result.getData()));
}else{
log.info("识别失败:{}", result.getMessage());
}
} catch (Exception e) {
e.printStackTrace();
}
}
4、语音识别(使用Grammar语法规则)
public void testWhisperWithGrammar() {
try {
WhisperRecognizer whisperRecognizer = (WhisperRecognizer)getWhisperRecognizer();
//语法规则
String grammarText = "root ::= \" And so, my fellow American, ask not what your country can do for you, ask what you can do for your country.\"";
try (WhisperGrammar grammar = whisperRecognizer.parseGrammar(grammarText)){
WhisperParams params = new WhisperParams();
WhisperFullParams fullParams = new WhisperFullParams(WhisperSamplingStrategy.BEAN_SEARCH);
//语言:英文
fullParams.language = Language.EN.getCode();
fullParams.grammar = grammar;
params.setParams(fullParams);
//建议上传 WAV 格式音频。其他格式将自动转换为 WAV,可能影响处理速度
R<AsrResult> result = whisperRecognizer.recognize("src/main/resources/jfk_en.wav", params);
if (result.isSuccess()){
log.info("识别成功:{}", JsonUtils.toJson(result.getData()));
}else{
log.info("识别失败:{}", result.getMessage());
}
} catch (Exception e) {
throw new RuntimeException(e);
}
} catch (Exception e) {
e.printStackTrace();
}
}
Vosk语音识别
1、获取Vosk中文语音模型
public SpeechRecognizer geVoskRecognizer() {
AsrModelConfig config = new AsrModelConfig();
config.setModelEnum(AsrModelEnum.VOSK);
/**
* 每个模型只支持一种语言,请下载对应语音的模型,模型下载地址:https://alphacephei.com/vosk/models
* 将模型解压后,将模型目录位置填写到此处
*/
config.setModelPath("/Users/wenjie/Documents/develop/model/speech/vosk-model-cn-0.22");
/**
* macos m系列芯片需要手动下载依赖库,并指定位置,其他平台不需要
* 下载地址:https://pan.baidu.com/s/1LZ_EX1XdTTp_f5ruud82MA?pwd=1234 提取码: 1234
*/
config.setLibPath(Paths.get("/Users/wenjie/Downloads/vosk-arrch64-dylib-main/libvosk.dylib"));
return SpeechRecognizerFactory.getInstance().getModel(config);
}
2、Vosk语音识别
public void testVosk() {
try {
SpeechRecognizer recognizer = geVoskRecognizer();
//建议上传 WAV 格式音频。其他格式将自动转换为 WAV,可能影响处理速度
R<AsrResult> result = recognizer.recognize("src/main/resources/lff_zh.mp3");
if (result.isSuccess()){
log.info("识别成功:{}", JsonUtils.toJson(result.getData()));
}else{
log.info("识别失败:{}", result.getMessage());
}
} catch (Exception e) {
e.printStackTrace();
}
}
3、Vosk 语音识别(使用Grammar语法规则)
public void testVoskWithGrammar() {
try {
//获取英文模型
SpeechRecognizer recognizer = geEnVoskRecognizer();
VoskParams voskParams = new VoskParams();
//英文
voskParams.setLanguage(Language.EN);
voskParams.setGrammar("[\"one two three four five six seven eight nine zero oh\"]");
//建议上传 WAV 格式音频。其他格式将自动转换为 WAV,可能影响处理速度
R<AsrResult> result = recognizer.recognize("src/main/resources/test_en.wav",voskParams);
if (result.isSuccess()){
log.info("识别成功:{}", JsonUtils.toJson(result.getData()));
}else{
log.info("识别失败:{}", result.getMessage());
}
} catch (Exception e) {
e.printStackTrace();
}
}
4、Vosk 语音识别(使用Vosk内部识别器)
public void testVoskAdvanced() {
try {
VoskRecognizer recognizer = (VoskRecognizer)geVoskRecognizer();
//使用vosk内部接口,需要指定识别音频的采样率
Recognizer voskRecognizer = recognizer.createAdvancedRecognizer(16000);
voskRecognizer.setWords(true);
voskRecognizer.setPartialWords(true);
// 使用vosk内部接口,只支持wav格式
String audioPath = "src/main/resources/lff_zh.wav";
InputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream(audioPath)));
int nbytes;
byte[] b = new byte[4096];
while ((nbytes = ais.read(b)) >= 0) {
if (voskRecognizer.acceptWaveForm(b, nbytes)) {
log.info(voskRecognizer.getResult());
} else {
log.info(voskRecognizer.getPartialResult());
}
}
log.info(voskRecognizer.getFinalResult());
} catch (Exception e) {
e.printStackTrace();
}
}
5、Vosk 实时语音识别(麦克风)
public void testVoskRealTime() {
try {
VoskRecognizer recognizer = (VoskRecognizer)geVoskRecognizer();
//使用vosk内部接口,需要指定识别音频的采样率
Recognizer voskRecognizer = recognizer.createAdvancedRecognizer(16000);
voskRecognizer.setWords(true);
voskRecognizer.setPartialWords(true);
// 设置音频格式: 16kHz, 16bit, 单声道, PCM
AudioFormat format = new AudioFormat(16000, 16, 1, true, false);
// 获取可用的 TargetDataLine
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
if (!AudioSystem.isLineSupported(info)) {
System.out.println("麦克风不支持该格式");
System.exit(0);
}
TargetDataLine microphone = (TargetDataLine) AudioSystem.getLine(info);
microphone.open(format);
microphone.start();
int nbytes;
byte[] b = new byte[4096];
while ((nbytes = microphone.read(b,0,b.length)) >= 0) {
if (voskRecognizer.acceptWaveForm(b, nbytes)) {
log.info(voskRecognizer.getResult());
} else {
log.info(voskRecognizer.getPartialResult());
}
}
log.info(voskRecognizer.getFinalResult());
} catch (Exception e) {
e.printStackTrace();
}
}
完整示例项目
项目地址:https://gitee.com/dengwenjie/SmartJavaAI/tree/master/examples
开源项目地址
🔗 Gitee 项目地址:https://gitee.com/dengwenjie/SmartJavaAI
🔗 GitHub 项目地址:https://github.com/geekwenjie/SmartJavaAI
🔗 GitCode 项目地址:https://gitcode.com/geekwenjie/SmartJavaAI
📖 在线文档地址:http://doc.smartjavaai.cn
更多推荐
所有评论(0)