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 模塊。

基礎依賴
<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>

模型簡介及下載

這里僅介紹模型的開源項目,每個開源項目通常包含多個具體模型,本文不逐一列出。

模型下載-百度網盤地址

網盤僅包含部分常用模型,如需獲取更多模型,請點擊下方鏈接自行下載。

模型名稱模型簡介模型官網下載地址
WhisperOpenAI 開源的通用語音識別(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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96270.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96270.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96270.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第3周 機器學習課堂記錄

1.學習問題的分類有監督的學習分類回歸無監督學習聚類密度估計&#xff1a;確定輸入空間中的數據的分布可視化&#xff1a;把高位空間中的數據投影到二維或三維空間強化學習不給定最優輸出的示例&#xff0c;而是通過試錯發現最優輸出2.泛化versus過度擬合背景引入&#xff1a;…

消息隊列(MQ)高級特性深度剖析:詳解RabbitMQ與Kafka

一、引言&#xff1a;為什么需要關注高級特性&#xff1f; 在現代分布式系統架構中&#xff0c;消息隊列&#xff08;Message Queue&#xff09;已成為不可或缺的核心組件。初級使用消息隊列可能只需幾行代碼就能實現基本功能&#xff0c;但要真正發揮其在大規模生產環境中的威…

【GPT入門】第65課 vllm指定其他卡運行的方法,解決單卡CUDA不足的問題

【GPT入門】第65課 vllm指定其他卡運行的方法&#xff0c;解決單卡CUDA不足的問題&#xff11;.原理說明&#xff1a;&#xff12;.實踐&#xff11;.原理 要將 vllm 部署在第二張 GPU 卡上&#xff08;設備編號為 1&#xff09;&#xff0c;只需在命令前添加 CUDA_VISIBLE_DE…

Spring Boot Actuator自定義指標與監控實踐指南

Spring Boot Actuator自定義指標與監控實踐指南 本篇文章以生產環境實戰經驗為主線&#xff0c;結合某電商系統的業務場景&#xff0c;講解如何在Spring Boot Actuator中添加并暴露自定義指標&#xff0c;并使用Prometheus和Grafana進行完整的監控與告警配置。 一、業務場景描述…

Vue報錯<template v-for=“option in cardOptions“ :key=“option.value“>

在Vue項目中遇到報錯&#xff0c;原因是模板中使用了<template>標簽內的v-for指令&#xff0c;而當前Vue版本不支持此用法。解決方案是移除<template>標簽&#xff0c;直接在<el-option>上使用v-for。同時優化計算屬性cardOptions&#xff0c;使其能夠兼容歷…

人工智能學習:Transformer結構中的規范化層(層歸一化)

Transformer結構中的規范化層(層歸一化) 一、規范化層(層歸一化)介紹 概念 層歸一化(Layer Normalization) 是一種用于提高深度神經網絡訓練穩定性和加速收斂的技術,廣泛應用于現代深度學習模型中,尤其是在Transformer等序列建模網絡中。它通過對每一層的輸出進行歸一化…

盼之代售 最新版 decode__1174

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向分析 部分python代碼 cp1 execj…

Transformer系列 | Pytorch復現Transformer

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 一、Transformer和Seq2Seq 在之前的博客中我們學習了Seq2Seq(深度學習系列 | Seq2Seq端到端翻譯模型)&#xff0c;知曉了Attention為RNN帶來的優點。那么有沒有…

【MySQL】常用SQL語句

介紹常用的DDL語句、DML語句基本語法分號結尾使用空格和縮進不區分大小寫--或#注釋單行內容 /*注釋多行內容*/DDL數據定義語句&#xff1a;定義數據庫、表、字段一、操作庫-- 創建庫create database db1;-- 創建庫是否存在&#xff0c;不存在則創建create database if not exi…

云手機就是虛擬機嗎?

云手機并非等同于虛擬機&#xff0c;盡管二者存在一定相似性&#xff0c;但有著諸多區別&#xff0c;以下從多個方面來分析&#xff1a;云手機是一種基于云計算技術&#xff0c;將云端服務器虛擬化為手機設備&#xff0c;用戶能通過網絡遠程操控的虛擬手機服務&#xff0c;它從…

準確--Nginx 1.28.0 安裝與配置流程

Nginx 1.28.0 安裝與配置流程 1. 下載與解壓 cd ~ wget http://nginx.org/download/nginx-1.28.0.tar.gz tar -zxvf nginx-1.28.0.tar.gz cd nginx-1.28.02. 配置編譯參數 ./configure \--prefix/home/ynnewweb/nginx \--with-http_ssl_module \--with-http_gzip_static_module…

無標記點動捕新范式:Xsens系統助力人形機器人實現毫米級動作復刻

Xsen搭載Manus數據手套在機器人操作與機器學習中的應用當前&#xff0c;人形機器人正加速向工業裝配、家庭陪護、倉儲物流等場景滲透&#xff0c;而 “如何讓機器人的動作既符合人類運動規律&#xff0c;又能實現高精度執行” 成為制約其落地的核心瓶頸。Xsens 高精度全身動捕系…

mysql57超管root忘記密碼怎么辦

目錄 背景 1.首先停止數據庫 2.使用免密模式啟動 3.修改密碼 3.1刷新權限配置 3.2修改密碼 4.殺掉mysql 5.重新正常啟動mysql 6.查看mysql狀態 7.驗證 7.1首先服務器本地驗證 7.2遠程驗證 背景 數據庫密碼忘記了,急的抓耳撓腮,怎么也想不起來,于是就開始重置吧 1.…

RESTful API:@RequestParam與@PathVariable實戰對比

RequestParam vs PathVariable 在刪除和查找操作中的使用差異 在項目實戰中&#xff0c;選擇使用 RequestParam 還是 PathVariable 來接收ID參數&#xff0c;通常基于以下幾個考慮因素&#xff1a; 1. RESTful API 設計原則 查找操作使用 PathVariable GetMapping("/depts…

劇本殺小程序系統開發:開啟沉浸式社交娛樂新紀元

在當今數字化浪潮席卷的時代&#xff0c;社交娛樂方式正經歷著前所未有的變革。劇本殺&#xff0c;這一融合了角色扮演、推理懸疑與社交互動的線下娛樂項目&#xff0c;近年來迅速風靡全國&#xff0c;成為年輕人熱衷的社交新寵。而隨著移動互聯網的蓬勃發展&#xff0c;劇本殺…

中線安防保護器,也叫終端電氣綜合治理保護設備為現代生活筑起安全防線

中線安防保護器&#xff08;Neutral Line Protection Device&#xff0c;簡稱NLPD&#xff09;是一種專門用于監測和保護電力系統中性線的安全裝置。中線安防保護器的基本原理為:通過電流檢測環節采集系統中性線上過電流信息&#xff0c; 經控制器快速計算并提取各次諧波電流的…

Spring Cloud Alibaba快速入門02-Nacos配置中心(下)

文章目錄前言配置中心 - 數據隔離示例1.先創建命名空間2.創建配置3.克隆配置4.動態切換環境5.yml多文檔模式spring.profiles.activedevspring.profiles.activetest總結前言 上一章簡單了解了Nacos配置中心的基本用法&#xff0c;這一章將開始Nacos配置中心的實戰案例。 配置中…

基于結構光相移法的三維重建

基于結構光相移法的三維重建程序 1. 介紹 結構光相移法是一種常用的三維重建技術&#xff0c;通過投射條紋圖案并捕捉其變形來計算物體的三維形狀。相移法通過多次投射不同相位的條紋圖案&#xff0c;利用相位信息來提取物體表面的深度信息。 2. MATLAB實現 2.1 生成條紋圖案 首…

機器學習10——降維與度量學習(K近鄰、多維縮放、主成分分析)

上一章&#xff1a;機器學習09——聚類 下一章&#xff1a;機器學習11——特征選擇與稀疏學習 機器學習實戰項目&#xff1a;【從 0 到 1 落地】機器學習實操項目目錄&#xff1a;覆蓋入門到進階&#xff0c;大學生就業 / 競賽必備 文章目錄一、k近鄰學習&#xff08;kNN&#…

Js 圖片加載完成 與 圖片緩存加載的區別

這兩個有什么區別// 圖片加載完成后淡入$img.on(load, function () {$img.css(opacity, 1);});// 處理圖片緩存情況if ($img[0].complete) {$img.css(opacity, 1);}要理解這兩段代碼的區別&#xff0c;需要先明確它們的核心作用場景和執行時機差異—— 本質是解決 “圖片加載完…