簡介
語音識別(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/mainconfig.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.javaparams.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, 單聲道, PCMAudioFormat format = new AudioFormat(16000, 16, 1, true, false);// 獲取可用的 TargetDataLineDataLine.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