前言

业务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。
下载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.hchmod 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文件:

若需要生成可视化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=2model_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通信)相关推荐

  1. 《WeNet语音识别实战》答疑回顾(一)

    问 1:现在语音识别落地比较难的点? 答:目前来说,语音识别落地的难点有中英混.方言.预训练模型等.首先,中英混是一个语音识别落地的难点,现在有很多研究在做:其次,方言也是一个难点,这里面主要是数据的 ...

  2. grpc通信原理_容器原理架构详解(全)

    目录 1 容器原理架构 1.1 容器与虚拟化 1.2 容器应用架构 1.3 容器引擎架构 1.4 Namespace与Cgroups 1.5 容器镜像原理 2 K8S原理架构 2.1 K8S主要功能 ...

  3. 如何在 Knative 中部署 WebSocket 和 gRPC 服务?

    作者 | 冬岛 阿里云容器平台工程师 导读:虽然说 Knative 默认就支持 WebSocket 和 gRPC,但在使用中会发现,有时想要把自己的 WebSocket 或 gRPC 部署到 Knat ...

  4. grpc通信原理_gRPC原理简析

    gRPC原理简析 gRPC是由谷歌提出并开发的RPC协议,gRPC提供了一套机制,使得应用程序之间可以进行通信. 降级开发者的使用门槛,屏蔽网络协议,调用对端的接口就像是调用本地的函数一样.而gRPC ...

  5. VMware平台部署KVM网络无法通信

    问题描述 公司IMAGE镜像BUILD服务器部署在VMware ESXI主机上,启动了一台VMware CentOS7虚拟机,CentOS7虚拟机内部安装了KVM虚拟化,并且在KVM启动了一台虚拟机用 ...

  6. k8s的etcd部署以及实现pod通信

    一.三种部署方式 Minikube Minikube是一个工具,可以在本地快速运行一个单节点微型K8s,及用于学习.预览k8s的一些特性使用 部署地址:https://kubernetes.io/do ...

  7. 深度学习应用-WeNet语音识别实战01

    概括 本文对WeNet声音识别网络的Python API上介绍的Non-Streaming Usage和 Streaming-Usage分别做了测试,两者本质相同.API对应采样的声音帧率.声道都做了 ...

  8. wenet语音识别---demo快速开发教程/windows下识别(大白/零基础)

    一.先去GitHub上,下载一个项目 https://github.com/wenet-e2e/wenet/blob/main/README_CN.md 找到下面这个图 把上面的地址先clone下到本 ...

  9. 拥抱云原生,Java与Python基于gRPC通信

最新文章

  1. 利用JFreeChart生成简单柱状图(Java)
  2. thymeleaf 判断页面不显示_Thymeleaf 中 Spring Security 的使用 0151
  3. webp转换gif_用 WebP 创建尺寸更小、细节更丰富的图片,以此来提高网站的速度...
  4. java access远程连接_Java程序实现对access数据库的远程访问
  5. MVC中某个页面不需要引用母版页的正确写法
  6. python显示邮件发送成功失败_python stmp module 163邮箱发送邮件不成功
  7. LADRC的学习——换被控对象进行仿真测试
  8. 反射机制——获取Class中的方法
  9. QQ vx 刷屏神器!!
  10. 镜头(焦距,CRA),光圈,红外灯,sensor 选型专栏
  11. 【通过】华为OD机试真题59:叠积木
  12. java列举生活中类和对象_趣味解读Python面向对象编程 (类和对象)
  13. 用python输出圣诞树_教你怎样用Python画了一棵圣诞树,赶紧来学习
  14. 怎样用电脑收发短信?
  15. 伤寒论阳明篇(python文本搜索)
  16. 代码实现:圣诞树效果(易懂,必会)/用html实现圣诞树效果
  17. HTML:相对定位和绝对定位
  18. (荐)电子方面不错的论坛 推荐几个电子方面不错的论坛
  19. PHP错题本功能实现,收藏| 最高效的"错题本"制作攻略!手把手教会你!
  20. pvif(pvifa是什么计算公式)

热门文章

  1. 19条跨端cpp开发有效经验总结
  2. 中国氢氧化钡行业研究与投资战略报告(2021版)
  3. 如何更好的利用区块链API
  4. day04【JS高级】BOM对象、Window对象、二种定时器、 Location对象、DOM对象、DOM获取元素、DOM操作内容、DOM操作属性、DOM操作样式、DOM操作元素(标签)、 正则表达式
  5. 万科2015苏州城市乐跑音乐节昨日在太湖国际会议中心开跑
  6. 天刀服务器维护4月19,5月19日服务器例行维护公告
  7. 【第137期】游戏策划:不用编程,在游戏里做一个双开门
  8. 浙江大学计算机与软件学院2019年保研上机模拟练习 --- 凌宸1642
  9. VVC帧间预测(六)BCW
  10. SLMi333国内首款兼容光耦带DESAT保护功能的隔离式栅极驱动器