SpringBoot集成語(yǔ)音識(shí)別模型FunASR的過(guò)程詳解

01 引言
應(yīng)以為粉絲朋友要求,我們一起學(xué)習(xí)搭建了一個(gè)語(yǔ)言識(shí)別模型,并集成SpringBoot項(xiàng)目中。在搭建過(guò)程中遇到不少問(wèn)題,總結(jié)一下分享給其他需要的朋友。
官網(wǎng)的給出的Java客戶端稍微有點(diǎn)問(wèn)題,并不能接受到大模型識(shí)別的反饋。網(wǎng)上的相關(guān)的技術(shù)博客也很少,這里幫大家把坑點(diǎn)填平,本文一片文章助你輕松拿下FunASR。
02 FunASR簡(jiǎn)介
FunASR是一個(gè)基礎(chǔ)語(yǔ)音識(shí)別工具包,提供多種功能,包括語(yǔ)音識(shí)別(ASR)、語(yǔ)音端點(diǎn)檢測(cè)(VAD)、標(biāo)點(diǎn)恢復(fù)、語(yǔ)言模型、說(shuō)話人驗(yàn)證、說(shuō)話人分離和多人對(duì)話語(yǔ)音識(shí)別等。FunASR提供了便捷的腳本和教程,支持預(yù)訓(xùn)練好的模型的推理與微調(diào)。更是通過(guò)CPU可以直接跑起來(lái)的大模型。
FunASR旨在通過(guò)語(yǔ)音識(shí)別的學(xué)術(shù)研究和工業(yè)應(yīng)用之間架起一座橋梁。通過(guò)發(fā)布工業(yè)級(jí)語(yǔ)音識(shí)別模型的訓(xùn)練和微調(diào),研究人員和開發(fā)人員可以更方便地進(jìn)行語(yǔ)音識(shí)別模型的研究和生產(chǎn),并推動(dòng)語(yǔ)音識(shí)別生態(tài)的發(fā)展。讓語(yǔ)音識(shí)別更有趣!
開源倉(cāng)庫(kù)地址:https://github.com/modelscope/FunASR
03 FunASR 部署
我們采用Docker技術(shù)直接部署,部署的官方指導(dǎo)文檔:
https://github.com/modelscope/FunASR/blob/main/runtime/docs/SDK_advanced_guide_online_zh.md
Docker安裝的本章不在贅述,之前的文章中已經(jīng)介紹過(guò)安裝過(guò)程。
3.1 拉取鏡像并啟動(dòng)
我們這里使用的是cpu版本的模型:funasr-runtime-sdk-online-cpu-0.1.13。直接拉取鏡像并啟動(dòng):
#拉取鏡像 sudo docker pull \ registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.13 # 創(chuàng)建保存模型的文件夾 mkdir -p ./funasr-runtime-resources/models # 掛載啟動(dòng)鏡像 sudo docker run -p 10096:10095 -it --privileged=true \ -v $PWD/funasr-runtime-resources/models:/workspace/models \ registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.13
3.2 啟動(dòng)服務(wù)端
docker啟動(dòng)之后,啟動(dòng) funasr-wss-server-2pass服務(wù)程序。
因?yàn)?code>docker啟動(dòng)之后,直接進(jìn)入到workspace下??梢岳^續(xù)使用cd 等命令

啟動(dòng)腳本
cd FunASR/runtime nohup bash run_server_2pass.sh \ --certfile 0 \ --download-model-dir /workspace/models \ --vad-dir damo/speech_fsmn_vad_zh-cn-16k-common-onnx \ --model-dir damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-onnx \ --online-model-dir damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online-onnx \ --punc-dir damo/punc_ct-transformer_zh-cn-common-vad_realtime-vocab272727-onnx \ --lm-dir damo/speech_ngram_lm_zh-cn-ai-wesp-fst \ --itn-dir thuduj12/fst_itn_zh \ --hotword /workspace/models/hotwords.txt > log.txt 2>&1 & # 如果您想關(guān)閉ssl,增加參數(shù):--certfile 0 # 如果您想使用SenseVoiceSmall模型、時(shí)間戳、nn熱詞模型進(jìn)行部署,請(qǐng)?jiān)O(shè)置--model-dir為對(duì)應(yīng)模型: # iic/SenseVoiceSmall-onnx # damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-onnx(時(shí)間戳) # damo/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404-onnx(nn熱詞) # 如果您想在服務(wù)端加載熱詞,請(qǐng)?jiān)谒拗鳈C(jī)文件./funasr-runtime-resources/models/hotwords.txt配置熱詞(docker映射地址為/workspace/models/hotwords.txt): # 每行一個(gè)熱詞,格式(熱詞 權(quán)重):阿里巴巴 20(注:熱詞理論上無(wú)限制,但為了兼顧性能和效果,建議熱詞長(zhǎng)度不超過(guò)10,個(gè)數(shù)不超過(guò)1k,權(quán)重1~100) # SenseVoiceSmall-onnx識(shí)別結(jié)果中“<|zh|><|NEUTRAL|><|Speech|> ”分別為對(duì)應(yīng)的語(yǔ)種、情感、事件信息
這里的腳本比官網(wǎng)上增加了--certfile 0,用來(lái)關(guān)閉ssl。
啟動(dòng)之后,可能需要等一會(huì)。直到服務(wù)啟動(dòng)起來(lái),我們可以直接使用命令直接看看日志詳情:
tail -f log.txt
直到出現(xiàn)模型初始化成功表示啟動(dòng)成功,如圖:

3.3 客戶端測(cè)試
官方提供了多個(gè)客戶端,我們選擇最簡(jiǎn)單的H5客戶端測(cè)試大模型是否部署成功

Html客戶端我們可以從GitHub直接下載,也可以從docker里面的下載,說(shuō)明文檔里面也給了鏈接:
wget https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/sample/funasr_samples.tar.gz

瀏覽器里面直接訪問(wèn)Url,自動(dòng)下載壓縮包。打開里面的Html即可:

下載的samples喜下面還包含了,離線的.wav后綴的audio語(yǔ)音文件。
測(cè)試

到這里,說(shuō)明我們部署的語(yǔ)音大模型FunASR就已經(jīng)成功了。
04 SpringBoot集成FunASR
FunASR的部署得益于Docker的容器化部署,幾乎不會(huì)有問(wèn)題。但是當(dāng)與SpringBoot集成的時(shí)候,才是惡夢(mèng)的開始。我們一起看看Java客戶端。

Java的客戶端是讓我們將Java代碼構(gòu)建成shell命令,這并不是我們想要的。好在Github上提供了Java的案例
地址:https://github.com/modelscope/FunASR/tree/main/runtime/java/java_http2ws_src

4.1 踩坑1
代碼里面的關(guān)鍵類:RecognitionServiceImpl

多么優(yōu)秀的代碼,直接拷貝到自己的項(xiàng)目中。為了能夠就減少問(wèn)題,特意看了官方依賴的Maven。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20240303</version>
</dependency>筆者這里采用單元測(cè)試的方式,使用的SpringBoot版本是2.6.13。

standardWebSocketClient.execute()報(bào)錯(cuò),最終采用了劃紅線的方法代替。
4.2 踩坑2
按照官方的模版代碼,修正了錯(cuò)誤之后,正常連接Websocket:

發(fā)現(xiàn)連上websocket,但是沒(méi)有數(shù)據(jù)返回。這是最大的坑。
由于我們對(duì)接的事實(shí)時(shí)語(yǔ)音識(shí)別,服務(wù)端使用的是socket協(xié)議,我們看看官方文檔的參數(shù)說(shuō)明:
地址:https://github.com/modelscope/FunASR/blob/main/runtime/docs/websocket_protocol_zh.md

{
"mode": "2pass",
"wav_name": "wav_name",
"is_speaking": true,
"wav_format": "pcm",
"chunk_size": [5,10,5],
"hotwords": "{\"阿里巴巴\":20,\"通義實(shí)驗(yàn)室\":30}",
"itn": true
}參數(shù)說(shuō)明:
mode:offline,表示推理模式為一句話識(shí)別;online,表示推理模式為實(shí)時(shí)語(yǔ)音識(shí)別;2pass:表示為實(shí)時(shí)語(yǔ)音識(shí)別,并且說(shuō)話句尾采用離線模型進(jìn)行糾錯(cuò)。wav_name:表示需要推理音頻文件名wav_format:表示音視頻文件后綴名,只支持pcm音頻流is_speaking:表示斷句尾點(diǎn),例如,vad切割點(diǎn),或者一條wav結(jié)束chunk_size:表示流式模型latency配置,[5,10,5],表示當(dāng)前音頻為600ms,并且回看300ms,又看300msaudio_fs:當(dāng)輸入音頻為pcm數(shù)據(jù)是,需要加上音頻采樣率參數(shù)hotwords:如果使用熱詞,需要向服務(wù)端發(fā)送熱詞數(shù)據(jù)(字符串),格式為 “{“阿里巴巴”:20,“通義實(shí)驗(yàn)室”:30}”itn: 設(shè)置是否使用itn,默認(rèn)Truesvs_lang: 設(shè)置SenseVoiceSmall模型語(yǔ)種,默認(rèn)為“auto”svs_itn: 設(shè)置SenseVoiceSmall模型是否開啟標(biāo)點(diǎn)、ITN,默認(rèn)為True
對(duì)比參數(shù)發(fā)現(xiàn),案例的入?yún)⒑臀臋n說(shuō)明的入?yún)⒉盍艘粋€(gè)chunk_size,我們加上參數(shù)看看結(jié)果:

結(jié)果發(fā)現(xiàn)直到導(dǎo)致服務(wù)異常了,服務(wù)器上可以看出json參數(shù)異常了。我們打印出參數(shù)看看參數(shù)看看:

傳遞的數(shù)據(jù)結(jié)果變成了內(nèi)存地址了,我們不用官方提供的,我們直接用fastjson2序列化,只要保證數(shù)組打印出來(lái)的是數(shù)組的值就好了。
測(cè)試結(jié)果終于正常了:

但是chunk_size到底是什么?雖然官方給了解釋,但是還是一頭霧水,又從官方主頁(yè)里面找到了相關(guān)的解釋,終于有了一點(diǎn)點(diǎn)了解,但還是懵逼狀態(tài)。
小編簡(jiǎn)單以為:就是控制返回文字的頻率和時(shí)間的一個(gè)指標(biāo)

4.3 踩坑3
識(shí)別結(jié)果的處理:官方demo加了TODO,可能就會(huì)有人問(wèn)到,這里獲取不到結(jié)果怎么處理?

真正接收識(shí)別結(jié)果的事圖中黃色的WebSocketClient,那我們?nèi)绾螌⒆R(shí)別的結(jié)果傳到指定的位置呢?
具體實(shí)現(xiàn)可以通過(guò)java.util.concurrent.CompletableFuture實(shí)現(xiàn),具體不在贅述。
到此這篇關(guān)于SpringBoot集成語(yǔ)音識(shí)別模型FunASR的文章就介紹到這了,更多相關(guān)SpringBoot語(yǔ)音識(shí)別模型FunASR內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot整合Java?DL4J實(shí)現(xiàn)交通標(biāo)志識(shí)別系統(tǒng)全過(guò)程
- SpringBoot實(shí)現(xiàn)圖片識(shí)別文字的四種方式小結(jié)
- SpringBoot 整合Tess4J庫(kù)實(shí)現(xiàn)圖片文字識(shí)別案例詳解
- IDEA無(wú)法識(shí)別SpringBoot項(xiàng)目的簡(jiǎn)單解決辦法
- IDEA導(dǎo)入Springboot項(xiàng)目,注解和pom文件不識(shí)別的解決
- SpringBoot集成百度AI實(shí)現(xiàn)人臉識(shí)別的項(xiàng)目實(shí)踐
- SpringBoot+OCR?實(shí)現(xiàn)圖片文字識(shí)別
相關(guān)文章
使用Spring Boot實(shí)現(xiàn)操作數(shù)據(jù)庫(kù)的接口的過(guò)程
本文給大家分享使用Spring Boot實(shí)現(xiàn)操作數(shù)據(jù)庫(kù)的接口的過(guò)程,包括springboot原理解析及實(shí)例代碼詳解,感興趣的朋友跟隨小編一起看看吧2021-07-07
Sentinel流控規(guī)則實(shí)現(xiàn)限流保護(hù)詳解
這篇文章主要介紹了Sentinel流控規(guī)則實(shí)現(xiàn)限流保護(hù),Sentinel是一個(gè)分布式系統(tǒng)的流量控制組件,它可以實(shí)現(xiàn)限流,流控,降級(jí)等功能,提高系統(tǒng)的穩(wěn)定性和可靠性,感興趣想要詳細(xì)了解可以參考下文2023-05-05
SpringBoot使用TraceId進(jìn)行日志追蹤的實(shí)現(xiàn)
本文主要介紹了SpringBoot使用TraceId進(jìn)行日志追蹤的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
java實(shí)現(xiàn)清理DNS Cache的方法
這篇文章主要介紹了java實(shí)現(xiàn)清理DNS Cache的方法,分析了幾種常用的清理方法,并給出了反射清理的完整實(shí)例,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01
java.lang.OutOfMemoryError: Java heap space錯(cuò)誤
本文主要介紹了java.lang.OutOfMemoryError: Java heap space錯(cuò)誤的問(wèn)題解決,包括內(nèi)存泄漏、數(shù)據(jù)過(guò)大和JVM堆大小配置不足,提供了解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03
java實(shí)現(xiàn)導(dǎo)出數(shù)據(jù)為zip壓縮文件
這篇文章主要為大家詳細(xì)介紹了java如何實(shí)現(xiàn)導(dǎo)出數(shù)據(jù)為zip壓縮文件,并且解壓后為json文件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
Spring?Boot整合Zookeeper實(shí)現(xiàn)分布式鎖的場(chǎng)景分析
這篇文章主要介紹了Spring?Boot整合Zookeeper實(shí)現(xiàn)分布式鎖,zk實(shí)現(xiàn)分布式鎖完全是依靠zk節(jié)點(diǎn)類型當(dāng)中的臨時(shí)序號(hào)節(jié)點(diǎn)來(lái)實(shí)現(xiàn)的,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
提交gRPC-spring-boot-starter項(xiàng)目bug修復(fù)的pr說(shuō)明
這篇文章主要介紹了這篇文章主要為大家介紹了gRPC-spring-boot-starter項(xiàng)目提交bug修復(fù)的pr的原因說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-02-02
Springboot整合Dubbo+Nacos實(shí)現(xiàn)RPC調(diào)用的示例代碼
隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,越來(lái)越多的企業(yè)和開發(fā)者開始關(guān)注微服務(wù)架構(gòu),Nacos是阿里巴巴開源的一個(gè)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái),本文講解如何將Spring Boot與Dubbo和Nacos整合,實(shí)現(xiàn)RPC調(diào)用,需要的朋友可以參考下2024-02-02

