简介

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐