SpringBoot集成語音識別模型FunASR的過程詳解

01 引言
應(yīng)以為粉絲朋友要求,我們一起學(xué)習搭建了一個語言識別模型,并集成SpringBoot項目中。在搭建過程中遇到不少問題,總結(jié)一下分享給其他需要的朋友。
官網(wǎng)的給出的Java客戶端稍微有點問題,并不能接受到大模型識別的反饋。網(wǎng)上的相關(guān)的技術(shù)博客也很少,這里幫大家把坑點填平,本文一片文章助你輕松拿下FunASR。
02 FunASR簡介
FunASR是一個基礎(chǔ)語音識別工具包,提供多種功能,包括語音識別(ASR)、語音端點檢測(VAD)、標點恢復(fù)、語言模型、說話人驗證、說話人分離和多人對話語音識別等。FunASR提供了便捷的腳本和教程,支持預(yù)訓(xùn)練好的模型的推理與微調(diào)。更是通過CPU可以直接跑起來的大模型。
FunASR旨在通過語音識別的學(xué)術(shù)研究和工業(yè)應(yīng)用之間架起一座橋梁。通過發(fā)布工業(yè)級語音識別模型的訓(xùn)練和微調(diào),研究人員和開發(fā)人員可以更方便地進行語音識別模型的研究和生產(chǎn),并推動語音識別生態(tài)的發(fā)展。讓語音識別更有趣!
開源倉庫地址: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)介紹過安裝過程。
3.1 拉取鏡像并啟動
我們這里使用的是cpu版本的模型:funasr-runtime-sdk-online-cpu-0.1.13。直接拉取鏡像并啟動:
#拉取鏡像 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 # 掛載啟動鏡像 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 啟動服務(wù)端
docker啟動之后,啟動 funasr-wss-server-2pass服務(wù)程序。
因為docker啟動之后,直接進入到workspace下??梢岳^續(xù)使用cd 等命令

啟動腳本
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模型、時間戳、nn熱詞模型進行部署,請設(shè)置--model-dir為對應(yīng)模型: # iic/SenseVoiceSmall-onnx # damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-onnx(時間戳) # damo/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404-onnx(nn熱詞) # 如果您想在服務(wù)端加載熱詞,請在宿主機文件./funasr-runtime-resources/models/hotwords.txt配置熱詞(docker映射地址為/workspace/models/hotwords.txt): # 每行一個熱詞,格式(熱詞 權(quán)重):阿里巴巴 20(注:熱詞理論上無限制,但為了兼顧性能和效果,建議熱詞長度不超過10,個數(shù)不超過1k,權(quán)重1~100) # SenseVoiceSmall-onnx識別結(jié)果中“<|zh|><|NEUTRAL|><|Speech|> ”分別為對應(yīng)的語種、情感、事件信息
這里的腳本比官網(wǎng)上增加了--certfile 0,用來關(guān)閉ssl。
啟動之后,可能需要等一會。直到服務(wù)啟動起來,我們可以直接使用命令直接看看日志詳情:
tail -f log.txt
直到出現(xiàn)模型初始化成功表示啟動成功,如圖:

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

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

瀏覽器里面直接訪問Url,自動下載壓縮包。打開里面的Html即可:

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

到這里,說明我們部署的語音大模型FunASR就已經(jīng)成功了。
04 SpringBoot集成FunASR
FunASR的部署得益于Docker的容器化部署,幾乎不會有問題。但是當與SpringBoot集成的時候,才是惡夢的開始。我們一起看看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)秀的代碼,直接拷貝到自己的項目中。為了能夠就減少問題,特意看了官方依賴的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>筆者這里采用單元測試的方式,使用的SpringBoot版本是2.6.13。

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

發(fā)現(xiàn)連上websocket,但是沒有數(shù)據(jù)返回。這是最大的坑。
由于我們對接的事實時語音識別,服務(wù)端使用的是socket協(xié)議,我們看看官方文檔的參數(shù)說明:
地址: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,\"通義實驗室\":30}",
"itn": true
}參數(shù)說明:
mode:offline,表示推理模式為一句話識別;online,表示推理模式為實時語音識別;2pass:表示為實時語音識別,并且說話句尾采用離線模型進行糾錯。wav_name:表示需要推理音頻文件名wav_format:表示音視頻文件后綴名,只支持pcm音頻流is_speaking:表示斷句尾點,例如,vad切割點,或者一條wav結(jié)束chunk_size:表示流式模型latency配置,[5,10,5],表示當前音頻為600ms,并且回看300ms,又看300msaudio_fs:當輸入音頻為pcm數(shù)據(jù)是,需要加上音頻采樣率參數(shù)hotwords:如果使用熱詞,需要向服務(wù)端發(fā)送熱詞數(shù)據(jù)(字符串),格式為 “{“阿里巴巴”:20,“通義實驗室”:30}”itn: 設(shè)置是否使用itn,默認Truesvs_lang: 設(shè)置SenseVoiceSmall模型語種,默認為“auto”svs_itn: 設(shè)置SenseVoiceSmall模型是否開啟標點、ITN,默認為True
對比參數(shù)發(fā)現(xiàn),案例的入?yún)⒑臀臋n說明的入?yún)⒉盍艘粋€chunk_size,我們加上參數(shù)看看結(jié)果:

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

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

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

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

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

