Java调用Whisper和Vosk语音识别(ASR)模型,实现高效实时语音识别(附源码)

简介

语音识别(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 模块。

基础依赖
xml 复制代码
<dependency>
    <groupId>cn.smartjavaai</groupId>
    <artifactId>speech</artifactId>
    <version>1.0.24</version>
</dependency>
FFmpeg 依赖

语音模块依赖 FFmpeg,可引入 jave-all-deps 或按平台引入对应原生库(推荐按平台选择,减小包体积)。

xml 复制代码
<dependency>
    <groupId>ws.schild</groupId>
    <artifactId>jave-all-deps</artifactId>
    <version>3.5.0</version>
</dependency>

模型简介及下载

这里仅介绍模型的开源项目,每个开源项目通常包含多个具体模型,本文不逐一列出。

模型下载-百度网盘地址

网盘仅包含部分常用模型,如需获取更多模型,请点击下方链接自行下载。

模型名称 模型简介 模型官网 下载地址
Whisper OpenAI 开源的通用语音识别(ASR)模型,支持多语言转写和翻译,具有较高的识别精度,尤其在嘈杂环境中表现良好,适合离线和批量音频处理。 Github 官方下载
Vosk 一个轻量级离线语音识别工具包,支持多种语言和平台(包括移动端与嵌入式设备),可在低资源环境中运行,适合实时语音识别场景。 Github 官方下载

Whisper语音识别

1、获取语音识别模型

java 复制代码
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、语音识别

java 复制代码
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、语音识别(个性化配置)

java 复制代码
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语法规则)

java 复制代码
 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中文语音模型

java 复制代码
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语音识别

java 复制代码
 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语法规则)

java 复制代码
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内部识别器)

java 复制代码
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 实时语音识别(麦克风)

java 复制代码
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

相关推荐
电商API_180079052474 分钟前
电商商品价格监控工具淘宝京东商品价格抓取API项目实操分享
java·大数据·开发语言·前端·数据挖掘
zzzll11115 分钟前
深度剖析:HashMap 并发死循环与 ConcurrentHashMap 两代演进全解
java·开发语言
秋名RG17 分钟前
2026/5/27 生产事故复盘与整改方案
java
m0_4626052222 分钟前
week05
人工智能
johnsong25 分钟前
AI 前沿日报:2026年9月4日
人工智能
lee_curry1 小时前
AI Agent 工程师完整学习路线(面向生产级项目与面试)
人工智能·学习·ai·面试·agent
大模型真好玩1 小时前
DeepSeek Harness 入门很简单(二)——DeepSeek Harness通用设置及Agent预设详解
人工智能·agent·deepseek
血小板要健康1 小时前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
坐吃山猪1 小时前
【多线程】CompletableFuture使用
java·开发语言·多线程
前端世界1 小时前
基于 Linux 的本地 AI 智能问答平台搭建实践 —— Ollama + FastAPI + Nginx 实现本地大模型 Web 服务
linux·运维·人工智能