【语音识别】WeNet:面向工业落地的E2E语音识别工具

这篇具有很好参考价值的文章主要介绍了【语音识别】WeNet:面向工业落地的E2E语音识别工具。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WeNet:面向工业落地的E2E语音识别工具

一、WeNet语音识别平台搭建

1、参考资料

  • wenet-e2e/wenet
  • Mozilla DeepSpeech
  • yeyupiaoling/PaddlePaddle-DeepSpeech

2、快速搭建WeNet平台

参考 WeNet中文文档

下载官方提供的预训练模型,并启动 docker 服务,加载模型,提供 websocket 协议的语音识别服务。


wget https://wenet-1256283475.cos.ap-shanghai.myqcloud.com/models/aishell2/20210618_u2pp_conformer_libtorch.tar.gz
tar -xf 20210618_u2pp_conformer_libtorch.tar.gz
model_dir=$PWD/20210618_u2pp_conformer_libtorch
docker run --rm -it -p 10086:10086 -v $model_dir:/home/wenet/model wenetorg/wenet-mini:latest bash /home/run.sh

Note

  • 这里的$PWD = "/home/wenet/model"

  • 一定要保证预训练模型文件的存储位置要正确,即解压在$PWD 下,执行如下命令

    model_dir=$PWD/20210618_u2pp_conformer_libtorch进行变量赋值,否则会报:
    【语音识别】WeNet:面向工业落地的E2E语音识别工具

实时识别

使用浏览器打开文件**index.html,在 WebSocket URL 中填入 ws://127.0.0.1:10086 (若在windows下通过wsl2**运行docker, 则使用ws://localhost:10086) , 允许浏览器弹出的请求使用麦克风,即可通过麦克风进行实时语音识别。

这里使用wsl2下的docker进行演示:如果靠近麦克风,误检率比较低。

【语音识别】WeNet:面向工业落地的E2E语音识别工具

二、WeNet实现推理(暂时无法使用onnx cpu版本进行推理)

Note

  • 如果仅使用wenet/bin/recognize.py,使用libTorch模型进行推理,可以在windows中搭建环境,具体搭建过程参考WeNet官网

  • 如果要使用wenet/bin/recognize_onnx.py进行推理,需要先下载ctc_encoder,这里要注意pypi上的ctc_encoder只有2020的版本(WeNet1.0),和当前的WeNet3.0版本不一致,因此需要到https://github.com/Slyne/ctc_decoder下载并编译。由于编译swig_encoder过程中需要用到bash命令,所以尝试在linux系统中运行,这里使用WSL + ubuntu作为解决方案。

    其实windows安装git就可以执行bash命令,只不过这里在安装好wget.exe,swig.exe ,git clone相应的package(kenlm,ThreadPool)之后,对于下载的openfst-1.6.3,即使在VC中补全了.h文件,无法编译成功。

    【语音识别】WeNet:面向工业落地的E2E语音识别工具

1、搭建WeNet环境

这里由于要尝试使用onnx推理模型,因此使用WSL + ubuntu作为解决方案

WSL + Docker Desktop 的使用教程参考 WSL Ubuntu + Docker Desktop搭建python环境

在完成好WSL和Docker Desktop安装之后,WeNet环境配置步骤如下:

  1. 实例化anaconda容器

    docker run -it --name="anaconda" -p 8888:8888 continuumio/anaconda3 /bin/bash
    

    如果退出了,可以重启anaconda容器

    #重启
    docker start anaconda
    docker exec -it anaconda /bin/bash
    
  2. base环境下配置wenet环境(不要创建虚拟环境,方便之后打包成镜像,供pycharm使用

    将WSL中的wenet项目拷贝到docker容器中(假设在WSL的/home/usr下有wenet项目)

    docker cp /home/usr/wenet/requirements.txt 9cf7b3c196f3:/home/  #9cf7b3c196f3为anaconda容器id
    

    进入anaconda容器内,在/home/使用pip安装所有包(conda源修改参考 ubuntu更换conda源 )

    pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
    conda install pytorch=1.10.0 torchvision torchaudio=0.10.0 cudatoolkit=11.1 -c pytorch -c conda-forge
    
  3. 下载ctc_encoder项目(让conformer进行语音识别时能够使用beam_search方法)

    ctc_encoder官网如下:https://github.com/Slyne/ctc_decoder.

    由于github clone在ubuntu中可能不好使,所以在windows中进入swig/setup.sh

    #!/usr/bin/env bash
    
    if [ ! -d kenlm ]; then
        git clone https://github.com/kpu/kenlm.git
        echo -e "\n"
    fi
    
    if [ ! -d openfst-1.6.3 ]; then
        echo "Download and extract openfst ..."
        wget http://www.openfst.org/twiki/pub/FST/FstDownload/openfst-1.6.3.tar.gz --no-check-certificate
        tar -xzvf openfst-1.6.3.tar.gz
        echo -e "\n"
    fi
    
    if [ ! -d ThreadPool ]; then
        git clone https://github.com/progschj/ThreadPool.git
        echo -e "\n"
    fi
    
    echo "Install decoders ..."
    # python3 setup.py install --num_processes 10
    python3 setup.py install --user --num_processes 10
    

    将必要的包安装好后(在git bash中使用setup.sh中的命令,wget,swig直接安装exe即可),整体文件结构如下(多了这四个文件):

    【语音识别】WeNet:面向工业落地的E2E语音识别工具

    再把完整的ctc_encoder复制到anaconda容器中,直接进行编译即可。

  4. 编译ctc_encoder

    假设现在在anaconda容器中,ctc_encoder项目在/home目录下,进入swig文件夹后,运行bash setup.sh即可完成编译(需要先apt install gcc, apt install g++

  5. 配置onnx,onnxruntime环境

    pip install onnx==1.9.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install onnxruntime==1.9.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
    
  6. Docker运行时容器打包成镜像

    将anaconda容器运行时的环境打包成镜像,给pycharm专业版调用,参考Pycharm使用docker容器内的环境开发

    #OPTIONS说明:
    #    -a :提交的镜像作者;
    #    -c :使用Dockerfile指令来创建镜像;
    #    -m :提交时的说明文字;
    #    -p :在commit时,将容器暂停。
    
    #2b1ad7022d19为anaconda容器运行时的id
    docker commit -a "wangxiaoxi" -m "wenet_env" 2b1ad7022d19  wenet_env:v1
    

2、模型训练

参考Tutorial on AIShell

3、基于libTorch模型的推理

下载aishell2 sample数据集进行wenet模型的推理,官网如下:希尔贝壳

下载WeNet的预训练模型(下载Checkpoint model - conformer)

将测试数据集和预训练模型放在项目路径下,比如:

【语音识别】WeNet:面向工业落地的E2E语音识别工具

修改train.yaml中的cmvn_file的位置(如果使用docker容器中的python环境,建议使用相对路径)

cmvn_file: ../../test/aishell2/global_cmvn     #这里使用相对路径

将aishell2数据集修改成wenet数据格式

{"key": "D4_753", "wav": "../../test/aishell2/test_data/D4_750.wav", "txt": ""}
{"key": "D4_754", "wav": "../../test/aishell2/test_data/D4_751.wav", "txt": ""}
{"key": "D4_755", "wav": "../../test/aishell2/test_data/D4_752.wav", "txt": ""}
{"key": "D4_753", "wav": "../../test/aishell2/test_data/D4_753.wav", "txt": ""}
{"key": "D4_754", "wav": "../../test/aishell2/test_data/D4_754.wav", "txt": ""}
{"key": "D4_755", "wav": "../../test/aishell2/test_data/D4_755.wav", "txt": ""}
{"key": "D4_756", "wav": "../../test/aishell2/test_data/D4_756.wav", "txt": ""}

使用wenet/bin/recognize.py,输入如下命令

python recognize 
--config=../../test/aishell2/train.yaml \
--dict=../../test/aishell2/units.txt \
--checkpoint=../../test/aishell2/final.pt \
--result_file=../../test/aishell2/att_res_result.txt \
--test_data=../../test/aishell2/test_data/data.list \

输出结果如下:

Namespace(batch_size=16, beam_size=10, bpe_model=None, checkpoint='../../test/aishell2/final.pt', config='../../test/aishell2/train.yaml', connect_symbol='', ctc_weight=0.0, data_type='raw', decoding_chunk_size=-1, dict='../../test/aishell2/units.txt', gpu=-1, mode='attention', non_lang_syms=None, num_decoding_left_chunks=-1, override_config=[], penalty=0.0, result_file='../../test/aishell2/att_res_result.txt', reverse_weight=0.0, simulate_streaming=False, test_data='../../test/aishell2/test_data/data1.list')
2022-07-04 15:54:22,441 INFO Checkpoint: loading from checkpoint ../../test/aishell2/final.pt for CPU
F:\ASR\wenet\wenet\transformer\asr_model.py:266: UserWarning: __floordiv__ is deprecated, and its behavior will change in a future version of pytorch. It currently rounds toward 0 (like the 'trunc' function NOT 'floor'). This results in incorrect rounding for negative values. To keep the current behavior, use torch.div(a, b, rounding_mode='trunc'), or for actual floor division, use torch.div(a, b, rounding_mode='floor').
  best_hyps_index = best_k_index // beam_size
2022-07-04 15:54:27,189 INFO D4_753 中国人民保险集团股份有限公司闽宁营销服务部
2022-07-04 15:54:27,189 INFO D4_755 中国电信闽宁镇合作营业厅
2022-07-04 15:54:27,189 INFO D4_754 闽宁镇卫生院
2022-07-04 15:54:27,189 INFO D4_756 闽宁镇客运站
2022-07-04 15:54:27,189 INFO D4_753 第六十一集
2022-07-04 15:54:27,189 INFO D4_755 第六十三集
2022-07-04 15:54:27,189 INFO D4_754 第六十二集

4、WeNet导出onnx模型

参考 ONNX backend on WeNet

这里先下载WeNet的预训练模型(下载Checkpoint model - conformer),接着使用wenet/bin/export_onnx_cpu.py, 设置如下参数,即可将libtorch的pt文件转换成onnx文件

python export_onnx_cpu.py
 --config F:/ASR/model/20210618_u2pp_conformer_libtorch_aishell2/train.yaml \
 --checkpoint F:/ASR/model/20210618_u2pp_conformer_libtorch_aishell2/final.pt \
 --chunk_size 16 \
 --output_dir F:/ASR/model/20210618_u2pp_conformer_libtorch_aishell2/onnx_dir \
 --num_decoding_left_chunks -1

如果onnx导出成功,会在输出文件夹中生成如下3个文件:encoder.onnx,ctc.onnx, decoder.onnx

5、使用recognize_onnx进行推理(未解决)

参考 https://github.com/wenet-e2e/wenet/pull/761.

先下载conformer模型的权重文件(checkpoint model),https://wenet.org.cn/wenet/pretrained_models.html

解压好权重文件之后,文件夹目录如下

【语音识别】WeNet:面向工业落地的E2E语音识别工具
修改train.yaml中的cmvn_file的位置

#cmvn_file: F:/ASR/model/20210618_u2pp_conformer_libtorch_aishell2/global_cmvn
cmvn_file: ../../test/aishell2/global_cmvn     #这里使用相对路径

转换成wenet的json数据格式:假设现在有音频文件D4_750.wav,通过格式转换成如下json格式, 参考https://wenet.org.cn/wenet/tutorial_librispeech.html?highlight=test_data#stage-0-prepare-training-data

{"key": "D4_753", "wav": "../../test/aishell2/test_data/D4_750.wav", "txt": "而对楼市成交抑制作用最大的限购"}

接着运行:

python3 wenet/bin/recognize_onnx.py --config=20210618_u2pp_conformer_exp/train.yaml --test_data=raw_wav/test/data.list --gpu=0 --dict=20210618_u2pp_conformer_exp/words.txt --mode=attention_rescoring --reverse_weight=0.4 --ctc_weight=0.1 --result_file=./att_res_result.txt --encoder_onnx=onnx_model/encoder.onnx --decoder_onnx=onnx_model/decoder.onnx

注意这里最好使用相对路径,因为使用的是docker里的python环境,如果在读取文件时使用windows下的绝对路径,会导致如下错误。解决思路参考https://github.com/microsoft/onnxruntime/issues/8735(反正我解决不了)

{FileNotFoundError}[Errno 2] No such file or directory: 'F:/ASR/model/20210618_u2pp_conformer_libtorch_aishell2/train.yaml'

这里使用export_onnx_cpu导出的onnx模型,使用recognize_onnx进行推理

encoder_ort_session=onnxruntime.InferenceSession(encoder_outpath, providers=['CPUExecutionProvider']);
ort_inputs = {
    encoder_ort_session.get_inputs()[0].name: feats.astype('float32'),
    encoder_ort_session.get_inputs()[1].name: feats_lengths.astype('int64'),
    encoder_ort_session.get_inputs()[2].name: np.zeros((12,4,0,128)).astype('float32'),
    encoder_ort_session.get_inputs()[3].name: np.zeros((12,1,256,7)).astype('float32')
}
encoder_ort_session.run(None, ort_inputs)

会抛出错误

{Fail}[ONNXRuntimeError] : 1 : FAIL : Non-zero status code returned while running Slice node. Name:'Slice_49' Status Message: slice.cc:153 FillVectorsFromInput Starts must be a 1-D array

应该是cuda和onnxruntime版本不一致导致的,参考 OnnxRunTime遇到FAIL : Non-zero status code returned while running BatchNormalization node.

后来发现recognize_onnx是对export_onnx_gpu.py导出的模型进行推理,而不是export_onnx_cpu.py。要使用export_onnx_gpu.py还得 安装nividia_dockeronnxruntime_gpu,否则会报错:

/opt/conda/lib/python3.9/site-packages/onnxruntime/capi/onnxruntime_inference_collection.py:53: UserWarning: Specified provider 'CUDAExecutionProvider' is not in available provider names.Available providers: 'CPUExecutionProvider'
  warnings.warn("Specified provider '{}' is not in available provider names."
Traceback (most recent call last):
  File "/opt/project/wenet/bin/export_onnx_gpu.py", line 574, in <module>
    onnx_config = export_enc_func(model, configs, args, logger, encoder_onnx_path)
  File "/opt/project/wenet/bin/export_onnx_gpu.py", line 334, in export_offline_encoder
    test(to_numpy([o0, o1, o2, o3, o4]), ort_outs)
NameError: name 'test' is not defined

这里就不费这个力了,等wenet项目完善吧。文章来源地址https://www.toymoban.com/news/detail-458231.html

到了这里,关于【语音识别】WeNet:面向工业落地的E2E语音识别工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 探索单元测试和 E2E 测试:提升软件质量的关键步骤(下)

    🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入

    2024年01月20日
    浏览(38)
  • [E2E Test] Python Behave Selenium 一文学会自动化测试

    本文将使用Python Behave与Selenium,和同学们一起认识自动化测试,并附上完整的实践教程。 项目源码已上传:CSDN 郭麻花 Azure Repo python-behave-selenium 1. 什么是E2E Test E2E即End-to-end,意思是从头到尾的系统功能测试。它通过编写自动化测试脚本,完全从用户的角度出发,验证系统功

    2024年02月09日
    浏览(31)
  • Cypress 做 e2e 测试,如何在获得某个 checkbox 后先判断它是否被 check 然后再更改它的状态?

    比如如果这个 checkbox 已经被 check 了,就不做操作,否则将它 check。 我们假设这个 checkbox 的 data-testid 属性是 VendorCodeCheckbox-0-test-id 。Cypress 的代码如下: 注意,对于不同的前端框架,寻找组件的逻辑可能不同。

    2024年02月11日
    浏览(34)
  • 深度学习应用-WeNet语音识别实战01

    概括         本文对WeNet声音识别网络的Python API上介绍的Non-Streaming Usage和 Streaming-Usage分别做了测试,两者本质相同。API对应采样的声音帧率、声道都做了限制。效果还可以,但是部分吐字不清晰、有歧义的地方仍然不能识别清晰。 项目地址: GitHub - wenet-e2e/wenet: Production

    2024年02月12日
    浏览(44)
  • libtorch+GPU部署wenet语音识别(gRPC通信)

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

    2024年02月10日
    浏览(24)
  • 西工大 ASLP 实验室在 WeNet 中开源基于 CPPN 的神经网络热词增强语音识别方案

    语境偏置 (Contextual biasing)旨在将语境知识集成到语音识别(ASR)系统中,以提高在相关领域词汇(俗称“ 热词 ”)上的识别准确率。在许多ASR场景中,待识别语音中可能会包含训练数据中数量很少或完全没出现的短语,例如一些领域专有名词、用户通讯录中的人名等,这

    2024年02月07日
    浏览(28)
  • 阿里达摩院开源大型端到端语音识别工具包FunASR | 弥合学术与工业应用之间的差距

    本文首发于微信公众号 CVHub,严禁私自转载或售卖到其他平台,违者必究。 Title: FunASR: A Fundamental End-to-End Speech Recognition Toolkit PDF: https://arxiv.org/pdf/2305.11013v1.pdf Code: https://github.com/alibaba-damo-academy/FunASR 本文介绍了一个开源语音识别工具包FunASR,旨在弥合学术研究和工业应用之

    2024年02月13日
    浏览(29)
  • 【语音识别】落地实现--离线智能语音助手

    参考:基于python和深度学习(语音识别、NLP)实现本地离线智能语音控制终端(带聊天功能和家居控制功能) 基于V3S的语音助手(三)移植pocketsphnix唤醒 基于V3S的语音助手(二)移植pyaudio到开发板 基于V3S的语音助手(一)python3的编译和安装(该版本解决zlib readline可

    2024年03月09日
    浏览(36)
  • 【测试与自动化】介绍-框架-Jest-覆盖率-异步代码-e2e-Vue测试

    了解什么是软件测试,以及自动化方式的测试 什么是软件测试? 定义: 在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。 目的: 促进目标鉴定软件的正确性、完整性、安全性和质量。 本质: 其实是对软件的

    2024年02月16日
    浏览(28)
  • 【论文阅读】Paraformer工业级非自回归端到端语音识别模型

    论文下载 目前ASR常用的Transformer模型虽然效果比较好,但是因为引入了自回归的解码器,所以计算相对效率低一些。为了加速推理,设计了非自回归模型并行生成识别结果,比如单步自回归模型。然而由于输出标签之间的独立性假设,单步自回归模型的效果相比自回归模型会

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包