虛擬機器+FunASR的安裝與使用

我的十四行诗在哪里發表於2024-04-08

寫在前面:我是偶然瞭解到這個語音識別這個AI方向的,由於當時沒有接觸過其他的AI模型(ps:當時常見的AI大都是使用過的,但只是止於直接地使用,畫個圖,讓AI幫我解決一些不知道的問題而已),所以FunASR算是我接觸過的首個開源且我現有的裝置能跑的動的AI專案。所以我對AI的瞭解是十分淺顯的,如果在文章中有什麼錯誤希望各位多多擔待,也麻煩幫忙指正,謝謝。

FunASR簡介

FunASR 是一個基本的語音識別工具包,提供多種功能,包括語音識別 (ASR)、語音活動檢測 (VAD)、標點符號恢復、語言模型、說話人驗證、說話人分類和多說話者 ASR。 FunASR提供方便的指令碼和教程,支援預訓練模型的推理和微調。

它由阿里達摩研究院推出的語音提取工具包,現在這個工具包還在被開發中,但是現在它能實現的功能已經很強大,當然如果你有更好的想法和點子,也可以加入FunASR的開發。我對於FunASR還是很佩服的,雖說其相對於openai旗下whisper效能上還是存在某些方面的差距的,但是FunASR跟適合中國寶寶體質,FunASR的標點符號更加精確,對於普通話來說有著能給人更好的體驗。

無論您是初學者還是經驗豐富的專業人士,FunASR都是一個值得一試的平臺。它不僅為您提供了學習語音識別所需的工具和資源,更重要的是,它為學習者帶來了樂趣和激勵,讓語音識別的學習之旅變得愉悅而充實。

如果您對語音識別技術充滿興趣,並且希望以一種全新的方式來探索和學習它,那麼不妨加入FunASR的行列,一起開啟這段富有樂趣的學習之旅吧!

前期準備

硬體裝置:我使用的虛擬機器 centos7

軟體:無

由於FunASR是對硬體有要求的,所以這裡我用的是電腦來進行安裝與實驗的(ps:能夠滿足其對效能需求的伺服器有點貴,本人有點承擔不起),如果有大佬剛好想玩這且有高效能伺服器的,還是建議使用伺服器來使用。

安裝

一、 最簡單的安裝

使用達摩院的大佬們寫好的包快速部署:一鍵部署工具流程包括安裝Docker、下載Docker映象、啟動服務。

① 首先從網址下載一鍵部署的包和工具。

curl -O https://raw.githubusercontent.com/alibaba-damo-academy/FunASR/main/runtime/deploy_tools/funasr-runtime-deploy-offline-cpu-zh.sh;

② 執行部署工具

根據提示按Enter鍵即可完成伺服器的安裝部署。目前便捷部署工具僅支援Linux環境。

sudo bash funasr-runtime-deploy-offline-cpu-zh.sh install --workspace ./funasr-runtime-resources

注:如果需要部署時間戳模型或hotword模型,請在安裝部署過程的第2步中選擇對應的模型,其中1為paraformer-large模型,2為paraformer-large時間戳模型,3為paraformer-large時間戳模型。 paraformer-large 熱詞模型;伺服器從:./funasr-runtime-resources/hotowrds.txt 載入熱詞檔案(每行一個熱詞,格式為詞重:阿里巴巴 20)。

注意這只是簡單的安裝,某些功能的實現還是得後期設定。

這裡只要執行部署工具就會啟動服務,所以執行完這步服務已經就啟動了。

③客戶端測試和使用

這裡客戶端不需要我們再去下載①步驟中已經幫我們下好了,這是我為什麼推薦新手使用此方法的原因,真的很簡單不與要動腦子。

客戶端有很多種,這裡不做太多的介紹,後面客戶端部分會著重介紹,此處僅介紹python端。

Python語言客戶端為例,使用下面的程式碼啟動Python語言客戶端

python3 funasr_wss_client.py --host "127.0.0.1" --port 10095 --mode offline --audio_in "../audio/asr_example.wav"

注:linux中最好是先升級到python3,因為python2在有些機器中命令過時了,導致無法使用,先將python升級到python3無論在該快速方法裡還是之後的手工搭建中都可以避免很多的問題為我們節省腦子。

二、 純手工搭建實時語音聽寫服務

前期準備

升級yum源

將python升級到python3 新的虛擬機器映象往往自帶的是python2,但是在新開發的專案裡python2很多時候是不夠用的,所以升級到python3不是什麼壞事,可以兩個源共存一起使用。

①Docker安裝

如果你已經安裝了Docker,請忽略此步驟!(這裡提供兩個方式)

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
curl -O https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/shell/install_docker.sh;
sudo bash install_docker.sh

②拉取和啟動映象

使用以下命令拉取並啟動FunASR軟體包的docker映象:

sudo docker pull \
  registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.9
  #建立資料夾
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.9

③啟動伺服器

使用以下指令碼啟動伺服器:

cd FunASR/runtime
nohup bash run_server_2pass.sh \
  --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 &
# 如果您想關閉ssl,增加引數:--certfile 0(請在上面的程式碼裡改好,不要直接複製上去再去改,不讓就改不了了)
# 這裡是時間戳模型和熱詞模型都已經加上了

上面的這部分程式碼是在docker裡的,如果你們安裝好了docker和DockerDesktop可以直接在DockerDesktop中直接操作。

上面的模型如果你想在配置檔案中配置你可以在docker容器中找到FunASR/runtime目錄下的run_server_2pass.sh檔案中找到對應部分修改它。內部檔案內容大概如下:

這裡要注意一下,我們如果是沒有ssl證書就將certfile設定為0,只要這一切設定好了,後面啟動我們只要啟動服務就好了,不用再每次都再來設定引數。

bash run_server_2pass.sh

這個時候服務已經啟動了,接下來就只要管客戶端了。

④關閉FunASR服務方法

# 檢視 funasr-wss-server-2pass 對應的PID
ps -x | grep funasr-wss-server-2pass
kill -9 PID

注意:替換正在使用的模型或者其他引數,需先關閉FunASR服務,修改需要替換的引數,並重新啟動FunASR服務。其中模型需為ModelScope中的ASR/VAD/PUNC模型,或者從ModelScope中模型finetune後的模型。

# 例如替換ASR模型為 damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-onnx,則如下設定引數 --model-dir
    --model-dir damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-onnx 
# 設定埠號 --port
    --port <port number>
# 設定服務端啟動的推理執行緒數 --decoder-thread-num
    --decoder-thread-num <decoder thread num>
# 設定服務端啟動的IO執行緒數 --io-thread-num
    --io-thread-num <io thread num>
# 關閉SSL證書 
    --certfile 0

三、 客戶端

快速開發的客戶端

快速開發由於需要下載的東西都會幫我們下好,所以我們只需要在./funasr-runtime-resources(預設安裝目錄)中找到下載客戶端測試工具目錄samples即可

手工搭建的客戶端

下載客戶端

pip install funasr_samples.tar.gz

解壓客戶端

這裡要記好你安裝的目錄,因為如果python版本低了,可能導致WebSocket服務無法使用,所以要配置環境檔案,要用到

tar -zxvf funasr_samples.tar.gz

客戶端的使用

python-client

使用下面的程式碼啟動Python語言客戶端

python3 funasr_wss_client.py --host "127.0.0.1" --port 10095 --mode offline --audio_in "../audio/asr_example.wav"
html-client

在瀏覽器中開啟 html/static/index.html

這裡需要注意,asr地址如果我麼們沒有ssl則直接使用ws://+地址+埠號(10095)即可

java-client
FunasrWsClient --host localhost --port 10096 --mode 2pass
cpp-client

進入samples/cpp目錄後,可以用cpp進行測試,指令如下:

./funasr-wss-client-2pass --server-ip 127.0.0.1 --port 10096 --mode 2pass \
   --wav-path ../audio/asr_example.pcm

遇到的問題

centos7自帶的python為python2不支援WebSocket服務,所以我重新下載python3,因為對於Python 3,通常你不需要特別指定gevent-websocketpython-socketio已經包含了WebSocket的支援。

注意:這裡我只給出一個解決方法,我當時的操作和這大同小異,因為我當時沒有截圖,所以無法給出當時的所有操作了。

  1. 安裝依賴: 使用pip安裝Flask-SocketIO以及相應的非同步庫,如gevent、eventlet等,根據專案需求選擇合適的非同步環境。

    Bash

    1pip install flask flask-socketio
    2# 如果使用gevent作為非同步伺服器
    3pip install gevent
    4# 或者如果使用eventlet
    5pip install eventlet
    
  2. 初始化Flask應用與SocketIO例項: 建立一個Flask應用,並將其與SocketIO結合。

    Python

    1from flask import Flask, render_template
    2from flask_socketio import SocketIO, emit
    3
    4app = Flask(__name__)
    5app.config['SECRET_KEY'] = 'your-secret-key-here'
    6socketio = SocketIO(app, async_mode='gevent' | 'eventlet' | 'threading')
    7
    8# 根據你的部署環境選擇async_mode,例如在本地開發時,可能選用'threading'模式,在生產環境為了效能可能會選擇'gevent'或'eventlet'。
    
  3. 定義SocketIO事件處理器: 在後端編寫處理SocketIO事件的函式。

    Python

    1@socketio.on('message')
    2def handle_message(data):
    3    print('Received message: ', data)
    4    # 可以在這裡向客戶端傳送響應
    5    emit('response', {'message': 'The server received your message.'}, broadcast=True)
    
  4. 啟動SocketIO服務: 設定路由並啟動Flask應用,同時開啟SocketIO監聽。

    Python

    1if __name__ == '__main__':
    2    # 先啟動Flask應用
    3    app.run(host='0.0.0.0', port=5000)
    4
    5    # 對於非同步伺服器,直接呼叫socketio.run()替代app.run()
    6    socketio.run(app, host='0.0.0.0', port=5000)
    
  5. 建立一個.py指令碼檔案:來作為可執行程式,來實現WebSocket服務。

    這裡我只在客戶端的資料夾samples/html/static下建立的python.py和需要啟動的index.html在同一目錄下

#在標準.py檔案做下面的修改
from flask import Flask
app = Flask(__name__, static_url_path='', static_folder='.')

這樣設定之後,訪問根目錄下的 index.html 可能需要透過 URL 像這樣訪問:

http://localhost:5000/index.html

透過下面命令啟動服務

python3 python.py

這樣設定之後,訪問根目錄下的 index.html 可能需要透過 URL 像這樣訪問:

http://localhost:5000/index.html

相關連結

FunASR線上實時工具包文件

https://github.com/alibaba-damo-academy/FunASR/blob/main/runtime/docs/SDK_advanced_guide_online.md

教程:

大佬的:遙遙領先,國產之光 funasr 部署一把過_嗶哩嗶哩_bilibili

官方的:FunASR實時聽寫軟體包_嗶哩嗶哩_bilibili
有問題可以聯絡郵箱:wllei13@outlook.com

相關文章