基于Pytorch实现的MASR中文语音识别
原文博客:Doi技术团队 链接地址:https://blog.doiduoyi.com/authors/1584446358138 初心:记录优秀的Doi技术团队学习经历 本文链接:基于Pytorch实现的MASR中文语音识别
MASR是一个基于端到端的深度神经网络的中文普通话语音识别项目,本项目是基于masr 进行开发的。
本教程源码地址:https://github.com/yeyupiaoling/MASR.git
模型原理
MASR使用的是门控卷积神经网络(Gated Convolutional Network),网络结构类似于Facebook在2016年提出的Wav2letter,只使用卷积神经网络(CNN)实现的语音识别。但是使用的激活函数不是ReLU
或者是HardTanh
,而是GLU
(门控线性单元)。因此称作门控卷积网络。根据我的实验,使用GLU
的收敛速度比HardTanh
要快。
- 以下用字错误率CER来衡量模型的表现,CER = 编辑距离 / 句子长度,越低越好,大致可以理解为 1 - CER 就是识别准确率。
安装环境
- 执行
requirements.txt
安装依赖环境,在安装过程中出现Pyaudio安装错误,可以先执行sudo apt-get install portaudio19-dev
这个安装,再重新执行。pip install -r requirements.txt - 安装ctcdecode依赖,该库笔者只在Ubuntu执行成功过,Windows无法编译。git clone --recursive https://github.com/parlance/ctcdecode.git cd ctcdecode/third_party
由于网络问题,在安装过程中可能无法正常下载以下这两个文件,你需要自行下载这两个文件,并把它们解压到third_party
目录下。
https://sites.google.com/site/openfst/home/openfst-down/openfst-1.6.7.tar.gz
https://dl.bintray.com/boostorg/release/1.67.0/source/boost_1_67_0.tar.gz
然后回到该源码的根目录,编辑ctcdecode/build.py
,注释以下4行代码。
# Download/Extract openfst, boost
download_extract('https://sites.google.com/site/openfst/home/openfst-down/openfst-1.6.7.tar.gz',
'third_party/openfst-1.6.7.tar.gz')
download_extract('https://dl.bintray.com/boostorg/release/1.67.0/source/boost_1_67_0.tar.gz',
'third_party/boost_1_67_0.tar.gz')
在ctcdecode根目录下执行以下命令开始安装ctcdecode。
pip install .
- 安装warp-CTC,如果安装过程中出现
c10/cuda/CUDAGuard.h: 没有那个文件或目录
错误,将pytorch_binding/src/binding.cpp
将#include <c10/cuda/CUDAGuard.h>
修改成#include "ATen/cuda/CUDAGuard.h"
。git clone https://github.com/SeanNaren/warp-ctc.git cd warp-ctc mkdir build cd build cmake .. make cd ../pytorch_binding python setup.py install准备语言模型和数据集
语言模型
下载语言模型并放在lm目录下,下面下载的小语言模型,如何有足够大性能的机器,可以下载70G的超大语言模型,点击下载Mandarin LM Large ,这个模型会大超多。
git clone https://github.com/yeyupiaoling/MASR.git
cd MASR/
mkdir lm
cd lm
wget https://deepspeech.bj.bcebos.com/zh_lm/zh_giga.no_cna_cmn.prune01244.klm
语音数据集
- 在
data
目录下是公开数据集的下载和制作训练数据列表和字典的,本项目提供了下载公开的中文普通话语音数据集,分别是Aishell,Free ST-Chinese-Mandarin-Corpus,THCHS-30 这三个数据集,总大小超过28G。下载这三个数据只需要执行一下代码即可,当然如何想快速训练,也可以只下载其中一个。cd data/ python aishell.py python free_st_chinese_mandarin_corpus.py python thchs_30.py
如果开发者有自己的数据集,可以使用自己的数据集进行训练,当然也可以跟上面下载的数据集一起训练。自定义的语音数据需要符合一下格式:
- 语音文件需要放在
dataset/audio/
目录下,例如我们有个wav
的文件夹,里面都是语音文件,我们就把这个文件存放在dataset/audio/
。dataset/audio/wav/0175/H0175A0171.wav 我需要把空调温度调到二十度 dataset/audio/wav/0175/H0175A0377.wav 出彩中国人 dataset/audio/wav/0175/H0175A0470.wav 据克而瑞研究中心监测 dataset/audio/wav/0175/H0175A0180.wav 把温度加大到十八 - 然后把数据列表文件存在
dataset/annotation/
目录下,程序会遍历这个文件下的所有数据列表文件。例如这个文件下存放一个my_audio.txt
,它的内容格式如下。每一行数据包含该语音文件的相对路径和该语音文件对应的中文文本,要注意的是该中文文本只能包含纯中文,不能包含标点符号、阿拉伯数字以及英文字母。 - 生成训练的数据列表和数据字典。python create_manifest.py python build_vocab.py
训练模型
执行train.py
代码开始训练。
python train.py
-
train_manifest_path
为训练数据列表路径。 -
dev_manifest_path
每一轮评估的数据列表路径。 -
vocab_path
数据字典路径。 -
save_model_path
保存模型的路径。 -
epochs
训练轮数。 -
batch_size
batch size大小,最好使用默认的。
训练输出结果如下:
----------- Configuration Arguments -----------
batch_size: 32
dev_manifest_path: dataset/manifest.dev
epochs: 1000
save_model_path: save_model/
train_manifest_path: dataset/manifest.train
vocab_path: dataset/zh_vocab.json
------------------------------------------------
[1/1000][0/415] Loss = 3498.923828125
[1/1000][1/415] Loss = 3244.679443359375
[1/1000][2/415] Loss = 2989.6904296875
[1/1000][3/415] Loss = 875.3290405273438
[1/1000][4/415] Loss = 411.30633544921875
预测
本项目提供了三种预测方式,分别是通过音频路径识别infer_path.py
,实时录音识别infer_record.py
和提供HTTP接口识别infer_server.py
,他们的公共参数model_path
训练保存的模型路径,lm_path
为语言模型路径,根据你的电脑性能,使用超大语言模型还是小的语言模型。
-
infer_path.py
的参数wav_path
为语音识别的的音频路径。 -
infer_record.py
的参数record_time
为录音时间。 -
infer_server.py
的参数host
为服务的访问地址,当为localhost时,本地访问页面,可以在浏览器chrome上在线录音,其他的地址可以使用选择音频文件上传获取预测结果。
模型下载
训练数据 |
下载链接 |
---|---|
三个公开的数据集 |
参考资料
- ngx_pagespeed-nginx前端优化模块介绍
- Tomcat利用MSM实现Session共享方案解说
- Tomcat集群环境下session共享方案梳理(1)-通过memcached(MSM)方法实现
- nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理
- python常用知识梳理
- 如何打击“假货、高仿”类小程序
- centos 6x系统下源码安装mysql操作记录
- 【3】利用Word模板生成文档的总结
- 【2】快速代码集的由来及概览
- silverlight数据绑定模式TwoWay,OneWay,OneTime的研究
- Silverlight数据绑定/IValueConverter学习笔记
- silverlight:DeepZoom版的图片局部放大效果
- Linq之ToDictionary<TSource, TKey, TElement>的写法
- vs.net的调试小技巧之#define debug(适合新手)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 微PE制作U盘启动盘,并安装Win10
- Angular单元测试如何只执行指定的测试用例,提高测试速度
- 院长智能部署Frp内网穿透---支持多系统
- dotnet OpenXML 元素 cNvPr NonVisual Drawing Properties 重复 id 标识处理
- Magicodes.IE之花式导出
- vue列表点击切换颜色
- JVM加载过程科普
- 我没学过计算机,是怎么接了四个私活还挣了两个 iPad 的?
- Helm安装Prometheus Operator
- 【每日一题】【vue2源码学习】vue如何检测数组的变化
- JavaScript 实现输入框内容一键复制(附上 Vue 3 实现方式)
- python 迭代器/iterator与生成器/generator的区别
- CSS 实现文本超出容器范围用省略号显示(单行+多行)
- ESP8266和ROS收发消息读取模拟量控制LED亮度
- 纯 CSS 实现下拉菜单尖角图标(实心+空心)