libtorch+GPU部署wenet语音识别(gRPC通信)

前言

业务App中部分功能需要通过ASR识别5-7秒的语音命令,App本身不支持流式协议,需录音完成后传输至服务端进行识别及后续的NLP。
根据实际情况仅对语音模型进行增强,使用libtorch+GPU方式部署,gRPC方式调用,由于并发不大,使用flask+gunicorn部署API。

一、docker镜像准备

拉取 nvidia官方的cuda11.3 runtime镜像。

docker pull nvidia/cuda:11.3.1-runtime-ubuntu18.04

若不使用上述镜像,也可以在现有镜像内部署,需要安装cuda环境,首先下载cuda安装包:

wget https://developer.download.nvidia.cn/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run

运行:

sh cuda_11.3.0_465.19.01_linux.run

安装时仅需安装cuda toolkit。libtorch+GPU部署wenet语音识别(gRPC通信)_第1张图片
下载cudnn:

wget https://developer.nvidia.com/compute/machine-learning/cudnn/secure/8.2.1.32/11.3_06072021/cudnn-11.3-linux-x64-v8.2.1.32.tgz

安装cudnn,注意这里需要把cudnn_version.h拷贝过去:

cp cudnn/include/cudnn.h /usr/local/cuda-11.3/include
cp cudnn/lib/libcudnn* /usr/local/cuda-11.3/lib64*
cp cudnn/include/cudnn_version.h /usr/local/cuda-11.3/include/cudnn_version.h

chmod a+r /usr/local/cuda-11.3/include/cudnn.h
chmod a+r /usr/local/cuda-11.3/include/cudnn_version.h
chmod a+r /usr/local/cuda-11.3/lib64/libcudnn*

将so库加入路径:

export LD_LIBRARY_PATH=/usr/local/cuda-11.3/lib64:$LD_LIBRARY_PATH

二、编译运行wenet

这个步骤比较简单,先把项目clone到本地,根据文档中来就行。

cd wenet/runtime/libtorch
mkdir build && cd build && cmake -DGPU=ON -DGRPC=ON .. && cmake --build .

这里需要同时将GPU和GRPC设置为ON,由于编译项较多,编译速度比较慢,建议根据计算机配置加入 -j8 或者 -j16 多线程编译,加速明显。

cmake --build -j16 .

记录一些坑:
1.编译时部分依赖下载很慢或者无法下载,建议全程tizi。
2.windows下不支持GPU编译。
3.最新的cmake 3.25编译可能会遇到一些奇怪的问题,建议降级为3.22.5,亲测有效。
4.理论上通过修改\cmake\libtorch.cmake文件可以修改libtorch及cuda版本,没有实验过。

三、语言模型LM训练

通过对比研究测试,对语言模型增强+hotword可以有效提高降低本场景下的wer,训练LM有一点坎坷。

第一步,训练语言模型

使用srilm工具进行语言模型训练,tools文件夹下提供了安装srilm的sh,运行:

sh install_srilm.sh

若提示需要AWK,则运行:

apt-get install gawk

运行后程序将自动下载安装srilm工具。同时准备语料train.txt,以\n分割,运行命令以训练模型(arpa格式):

ngram-count -order 2 -no-sos -no-eos -text train.txt -lm train.arpa

完成后在同目录下将生成train.arqa文件。

第二步,ARPA生成FST

(1)启用GRAPH_TOOLS=ON编译【失败】
根据文档,在编译时设置GRAPH_TOOLS=ON

cd wenet/runtime/libtorch
mkdir build && cd build && cmake -DGRAPH_TOOLS=ON .. && cmake --build .

但是使用这种方案会未来会提示:

tools/fst/compile_lexicon_token_fst.sh: line 59: fstcompile: command not found
tools/fst/compile_lexicon_token_fst.sh: line 60: fstarcsort: command not found

发现这两个源码没有被编译,并且暂时无法找到解决方案,可能是我自己的问题,这里讲一个曲线救国的方案,殊途同归,不影响运行。

(2)自行编译安装OpenFST
通过OpenFST官网下载OpenFST的源码,建议下载1.6.5版本,解压源码,进行安装:

./configure
make -j16
make install

-j16参数根据计算机配置调整。安装完成后fstcompile和fstarcsort命令可以用,若提示找不到libfstscript.so.8等库运行:

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

OpenFST安装完成,在wenet项目中运行指令:

tools/fst/compile_lexicon_token_fst.sh dict tmp tmp2
tools/fst/make_tlg.sh lm tmp2 graph

graph文件夹下将生成fst文件:
libtorch+GPU部署wenet语音识别(gRPC通信)_第2张图片

若需要生成可视化pdf,运行:

mkdir -p pdf
fstdraw --isymbols=graph/tokens.txt --osymbols=graph/tokens.txt graph/T.fst | dot -Tpdf -o pdf/T.pdf
fstdraw --isymbols=graph/tokens.txt --osymbols=graph/words.txt graph/L.fst | dot -Tpdf -o pdf/L.pdf
fstdraw --isymbols=graph/words.txt --osymbols=graph/words.txt graph/G.fst | dot -Tpdf -o pdf/G.pdf
fstdraw --isymbols=graph/tokens.txt --osymbols=graph/words.txt graph/LG.fst | dot -Tpdf -o pdf/LG.pdf
fstdraw --isymbols=graph/tokens.txt --osymbols=graph/words.txt graph/TLG.fst | dot -Tpdf -o pdf/TLG.pd

四、API服务部署

拷贝build/bin文件夹下的主程序grpc_server_main到单独目录下,拷贝fc_base\libtorch-src\lib文件夹下的所有so依赖库到单独目录的lib中,目录结构。

├─你的文件夹
│  ├─lib
│  └─grpc_server_main

编写一个run.sh,或者直接启动grpc服务:

export LD_LIBRARY_PATH=/【你的文件夹】/lib:$LD_LIBRARY_PATH
export GLOG_logtostderr=1
export GLOG_v=2

model_dir=./model/
./grpc_server_main \
    --port 10090 \
    --workers 16 \
    --chunk_size -1 \
    --model_path $model_dir/final.zip \
    --context_path hotwords.txt \
    --context_score 9 \
    --unit_path $model_dir/units.txt

注意chunk_size为-1,hotword为热词,比如人名、地名、专有名词等。启动成功并在GPU中运行:
libtorch+GPU部署wenet语音识别(gRPC通信)_第3张图片

你可能感兴趣的:(语音识别,python,人工智能)