DeepSpeech2中文语音识别

本项目是基于PaddlePaddle的DeepSpeech 项目开发的,做了较大的修改,方便训练中文自定义数据集,同时也方便测试和使用。DeepSpeech2是基于PaddlePaddle实现的端到端自动语音识别(ASR)引擎,其论文为《Baidu’s Deep Speech 2 paper》 ,本项目同时还支持各种数据增强方法,以适应不同的使用场景。支持在Windows,Linux下训练和预测,支持Nvidia Jetson等开发板推理预测。

本项目使用的环境:

  • Python 3.7
  • PaddlePaddle 2.1.2
  • Windows or Ubuntu

本教程源码:https://github.com/yeyupiaoling/PaddlePaddle-DeepSpeech

模型下载

数据集 卷积层数量 循环神经网络的数量 循环神经网络的大小 测试集字错率 下载地址
aishell(179小时) 2 3 1024 0.084532 点击下载
free_st_chinese_mandarin_corpus(109小时) 2 3 1024 0.170260 点击下载
thchs_30(34小时) 2 3 1024 0.026838 点击下载

说明: 这里提供的是训练参数,如果要用于预测,还需要执行导出模型,使用的解码方法是集束搜索。

有问题欢迎提 issue 交流

搭建环境

本人用的就是本地环境和使用Anaconda,并创建了Python3.7的虚拟环境,建议读者也本地环境,方便交流,出现安装问题,随时提issue 。

  • 首先安装的是PaddlePaddle 2.1.2的GPU版本,如果已经安装过了,请跳过。
conda install paddlepaddle-gpu==2.1.2 cudatoolkit=10.2 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/
  • 安装其他依赖库。
python -m pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/

数据准备

  1. download_data目录下是公开数据集的下载和制作训练数据列表和词汇表的,本项目提供了下载公开的中文普通话语音数据集,分别是Aishell,Free ST-Chinese-Mandarin-Corpus,THCHS-30 这三个数据集,总大小超过28G。下载这三个数据只需要执行一下代码即可,当然如果想快速训练,也可以只下载其中一个。注意: noise.py可下载可不下载,这是用于训练时数据增强的,如果不想使用噪声数据增强,可以不用下载。
cd download_data/
python aishell.py
python free_st_chinese_mandarin_corpus.py
python thchs_30.py
python noise.py

注意: 以上代码只支持在Linux下执行,如果是Windows的话,可以获取程序中的DATA_URL单独下载,建议用迅雷等下载工具,这样下载速度快很多。然后把download()函数改为文件的绝对路径,如下,我把aishell.py的文件单独下载,然后替换download()函数,再执行该程序,就会自动解压文件文本生成数据列表。

# 把这行代码
filepath = download(url, md5sum, target_dir)
# 修改为
filepath = "D:\\Download\\data_aishell.tgz"
  1. 如果开发者有自己的数据集,可以使用自己的数据集进行训练,当然也可以跟上面下载的数据集一起训练。自定义的语音数据需要符合以下格式,另外对于音频的采样率,本项目默认使用的是16000Hz,在create_data.py中也提供了统一音频数据的采样率转换为16000Hz,只要is_change_frame_rate参数设置为True就可以。

    1. 语音文件需要放在PaddlePaddle-DeepSpeech/dataset/audio/目录下,例如我们有个wav的文件夹,里面都是语音文件,我们就把这个文件存放在PaddlePaddle-DeepSpeech/dataset/audio/
    2. 然后把数据列表文件存在PaddlePaddle-DeepSpeech/dataset/annotation/目录下,程序会遍历这个文件下的所有数据列表文件。例如这个文件下存放一个my_audio.txt,它的内容格式如下。每一行数据包含该语音文件的相对路径和该语音文件对应的中文文本,要注意的是该中文文本只能包含纯中文,不能包含标点符号、阿拉伯数字以及英文字母。
dataset/audio/wav/0175/H0175A0171.wav 我需要把空调温度调到二十度
dataset/audio/wav/0175/H0175A0377.wav 出彩中国人
dataset/audio/wav/0175/H0175A0470.wav 据克而瑞研究中心监测
dataset/audio/wav/0175/H0175A0180.wav 把温度加大到十八
  1. 最后执行下面的数据集处理脚本,这个是把我们的数据集生成三个JSON格式的数据列表,分别是manifest.test、manifest.train、manifest.noise。然后建立词汇表,把所有出现的字符都存放子在zh_vocab.txt文件中,一行一个字符。最后计算均值和标准差用于归一化,默认使用全部的语音计算均值和标准差,并将结果保存在mean_std.npz中。以上生成的文件都存放在PaddlePaddle-DeepSpeech/dataset/目录下。
# 生成数据列表
python create_data.py

训练模型

  • 执行训练脚本,开始训练语音识别模型, 每训练一轮和每2000个batch都会保存一次模型,模型保存在PaddlePaddle-DeepSpeech/models/param/目录下,默认会使用数据增强训练,如何不想使用数据增强,只需要将参数augment_conf_path设置为None即可。关于数据增强,请查看数据增强部分。如果没有关闭测试,在每一轮训练结果之后,都会执行一次测试计算模型在测试集的准确率。执行训练时,如果是Linux下,通过CUDA_VISIBLE_DEVICES可以指定多卡训练。
CUDA_VISIBLE_DEVICES=0,1 python train.py
  • 在训练过程中,程序会使用VisualDL记录训练结果,可以通过以下的命令启动VisualDL。
visualdl --logdir=log --host=0.0.0.0
  • 然后再浏览器上访问http://localhost:8040可以查看结果显示,如下。



评估

执行下面这个脚本对模型进行评估,通过字符错误率来评价模型的性能。

python eval.py --resume_model=./models/param/50.pdparams

输出结果:

-----------  Configuration Arguments -----------
alpha: 1.2
batch_size: 64
beam_size: 10
beta: 0.35
cutoff_prob: 1.0
cutoff_top_n: 40
decoding_method: ctc_greedy
error_rate_type: cer
lang_model_path: ./lm/zh_giga.no_cna_cmn.prune01244.klm
mean_std_path: ./dataset/mean_std.npz
resume_model: ./models/param/50.pdparams
num_conv_layers: 2
num_proc_bsearch: 8
num_rnn_layers: 3
rnn_layer_size: 1024
test_manifest: ./dataset/manifest.test
use_gpu: True
vocab_path: ./dataset/zh_vocab.txt
------------------------------------------------
W0318 16:38:49.200599 19032 device_context.cc:252] Please NOTE: device: 0, CUDA Capability: 75, Driver API Version: 11.0, Runtime API Version: 10.0
W0318 16:38:49.242089 19032 device_context.cc:260] device: 0, cuDNN Version: 7.6.
[INFO 2021-03-18 16:38:53,689 eval.py:83] 开始评估 ...
错误率:[cer] (64/284) = 0.077040
错误率:[cer] (128/284) = 0.062989
错误率:[cer] (192/284) = 0.055674
错误率:[cer] (256/284) = 0.054918
错误率:[cer] (284/284) = 0.055882
消耗时间:44526ms, 总错误率:[cer] (284/284) = 0.055882
[INFO 2021-03-18 16:39:38,215 eval.py:117] 完成评估!

导出模型

训练保存的或者下载作者提供的模型都是模型参数,我们要将它导出为预测模型,这样可以直接使用模型,不再需要模型结构代码,同时使用Inference接口可以加速预测,在一些设备也可以使用TensorRT加速。

python export_model.py --resume_model=./models/param/50.pdparams

输出结果:

成功加载了预训练模型:./models/param/50.pdparams
-----------  Configuration Arguments -----------
mean_std_path: ./dataset/mean_std.npz
num_conv_layers: 2
num_rnn_layers: 3
rnn_layer_size: 1024
pretrained_model: ./models/param/50.pdparams
save_model_path: ./models/infer/
use_gpu: True
vocab_path: ./dataset/zh_vocab.txt
------------------------------------------------
成功导出模型,模型保存在:./models/infer/

本地预测

我们可以使用这个脚本使用模型进行预测,如果如何还没导出模型,需要执行导出模型操作把模型参数导出为预测模型,通过传递音频文件的路径进行识别,通过参数--wav_path指定需要预测的音频路径。支持中文数字转阿拉伯数字,将参数--to_an设置为True即可,默认为True。

python infer_path.py --wav_path=./dataset/test.wav

输出结果:

-----------  Configuration Arguments -----------
alpha: 1.2
beam_size: 10
beta: 0.35
cutoff_prob: 1.0
cutoff_top_n: 40
decoding_method: ctc_greedy
enable_mkldnn: False
is_long_audio: False
lang_model_path: ./lm/zh_giga.no_cna_cmn.prune01244.klm
mean_std_path: ./dataset/mean_std.npz
model_dir: ./models/infer/
to_an: True
use_gpu: True
vocab_path: ./dataset/zh_vocab.txt
wav_path: ./dataset/test.wav
------------------------------------------------
消耗时间:132, 识别结果: 近几年不但我用书给女儿儿压岁也劝说亲朋不要给女儿压岁钱而改送压岁书, 得分: 94

长语音预测

通过参数--is_long_audio可以指定使用长语音识别方式,这种方式通过VAD分割音频,再对短音频进行识别,拼接结果,最终得到长语音识别结果。

python infer_path.py --wav_path=./dataset/test_vad.wav --is_long_audio=True

Web部署

在服务器执行下面命令通过创建一个Web服务,通过提供HTTP接口来实现语音识别。启动服务之后,如果在本地运行的话,在浏览器上访问http://localhost:5000,否则修改为对应的 IP地址。打开页面之后可以选择上传长音或者短语音音频文件,也可以在页面上直接录音,录音完成之后点击上传,播放功能只支持录音的音频。支持中文数字转阿拉伯数字,将参数--to_an设置为True即可,默认为True。

python infer_server.py

打开页面如下:

GUI界面部署

通过打开页面,在页面上选择长语音或者短语音进行识别,也支持录音识别,同时播放识别的音频。默认使用的是贪心解码策略,如果需要使用集束搜索方法的话,需要在启动参数的时候指定。

python infer_gui.py

打开界面如下:

相关项目

  • 基于PaddlePaddle实现的声纹识别:VoiceprintRecognition-PaddlePaddle
  • 基于PaddlePaddle 2.0实现的语音识别:PPASR
  • 基于Pytorch实现的语音识别:MASR

基于PaddlePaddle实现的DeepSpeech2端到端中文语音识模型相关推荐

  1. 基于对抗互信息学习特征解耦的零样本语音转换|INTERSPEECH 2022

    零样本语音转换在转换时只需目标说话人的一段语音,更适合实际应用需求,具有广泛应用前景. 现有工作只考虑内容和音色表征的解耦,没有考虑与语音旋律相关的 韵律 和 音高 表征,导致与音高和韵律相关的信息泄 ...

  2. 基于PaddlePaddle2.0验证码端到端的识别

    验证码端到端的识别,是对<我的PaddlePaddle学习之路>笔记六--验证码端到端的识别 的升级,这篇文章是我18年初写的,基于当时的V2版本编写,现在有点过时了,突然想升级一下. 在 ...

  3. [Paddle Detection]基于PP-PicoDet行车检测(完成安卓端部署)

    基于PP-PicoDet行车检测(完成安卓端部署)_哔哩哔哩_bilibili 一.项目简介 项目背景: 基于视觉深度学习的自动驾驶场景,旨在对车载摄像头采集的视频数据进行道路场景解析(行车检测),为 ...

  4. 基于激光雷达点云的3D目标检测算法—端到端多视图融合

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨Rubicon007@知乎 来源丨https://zhuanlan.zhihu.com/p/44 ...

  5. 丢弃Transformer!旷视和西安交大提出基于FCN的端到端目标检测网络

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 本文作者:王剑锋  | 编辑:Amusi https://zhuanlan.zhihu.com ...

  6. 基于深度学习的端到端人脸识别技术:全面调研

    44页,共计371篇参考文献.本文全面介绍了端到端深度学习人脸识别技术,包括人脸检测,人脸预处理和人脸表征等方向,详细介绍了最新的算法设计,评估指标,数据集,性能比较等. The Elements o ...

  7. 基于Docker的开源端到端开发者平台

    今天和大家一起分享的是一个基于Docker的适用于多平台的端到端开发者平台,Appwrite Appwrite,可以适用如Flutter.Vue.Angular.React.iOS.Android等众 ...

  8. c++ 图片验证码识别_基于tensorflow 实现端到端的OCR:二代身份证号识别

    最近在研究OCR识别相关的东西,最终目标是能识别身份证上的所有中文汉字+数字,不过本文先设定一个小目标,先识别定长为18的身份证号,当然本文的思路也是可以复用来识别定长的验证码识别的. 本文实现思路主 ...

  9. pyaudio:基于pyaudio利用Python编程从电脑端录制音频保存到指定文件夹+将录音上传服务器+录音进行识别并转为文本保存

    pyaudio:基于pyaudio利用Python编程从电脑端录制音频保存到指定文件夹+将录音上传服务器+录音进行识别并转为文本保存 目录 输出结果 代码实现 输出结果 代码实现 # -*- codi ...

最新文章

  1. linux下截屏工具
  2. DB2安全(一)——概述
  3. 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换?
  4. camuda流程引擎如此简单「五」
  5. java高并发(十二)并发容器J.U.C
  6. SAP Spartacus cypress集成测试执行失败的一些常见原因
  7. 如何在 C# 中使用匿名类型
  8. php数组转为js json,javascript-将数组php转换为JSON时出错
  9. 要闻君说:华为发布2018年年度报告:全球销售收入超千亿美元;微软”立誓“不过愚人节;大众与AWS一起做工业汽车云...
  10. java 检测表情符号_java – 检测String中的字符是否是表情符号(使用Android)
  11. OpenCV3学习(2.4)——彩色图像读取、灰度图转化、RGB通道分割与合并
  12. 直流电机PID调节——P
  13. iOS CocoaPods:Updating local specs repositories一直停在那里了
  14. iOS 开发之 GCD 不同场景使用
  15. ubuntu20.04.1下安装qt4相关依赖库
  16. 自制网站服务器主机,自制服务器主机迷你
  17. python做饼图出现重影_解决echarts中饼图标签重叠的问题
  18. ubuntu apt-get安装或卸载软件时出现了python-minimal等错误问题的解决方法
  19. 套接字Socket编程
  20. STM32F407 ADC+DMA+定时器 定时采样模拟量

热门文章

  1. C语言|const的使用
  2. kernel_neon_begin
  3. 用样本推断整体,中心极限定理及其一些前提条件
  4. Direct3D中的纹理映射
  5. excel设置行高_手把手教你用wps表格excel制作田字格书法练习字帖
  6. 关于解决移动端息屏后定时器不工作的问题
  7. HTML5 自定义视频播放器
  8. 数据库连接池 DBCP和c3p0数据库连接池
  9. RISC-V指令集架构优势
  10. Linux 字符集设置