夜雨飘零 f250e13823 | 2 years ago | |
---|---|---|
conf | 3 years ago | |
data | 3 years ago | |
data_utils | 2 years ago | |
dataset | 3 years ago | |
decoders | 2 years ago | |
docs | 2 years ago | |
model_utils | 2 years ago | |
static | 3 years ago | |
templates | 2 years ago | |
tools | 2 years ago | |
utils | 2 years ago | |
.gitignore | 2 years ago | |
LICENSE | 4 years ago | |
README.md | 2 years ago | |
client.py | 3 years ago | |
eval.py | 2 years ago | |
export_model.py | 2 years ago | |
infer_path.py | 2 years ago | |
infer_server.py | 2 years ago | |
requirements.txt | 2 years ago | |
train.py | 2 years ago |
本项目是基于PaddlePaddle的DeepSpeech 项目开发的,做了较大的修改,方便训练中文自定义数据集,同时也方便测试和使用。DeepSpeech2是基于PaddlePaddle实现的端到端自动语音识别(ASR)引擎,其论文为《Baidu's Deep Speech 2 paper》 ,本项目同时还支持各种数据增强方法,以适应不同的使用场景。支持在Windows,Linux下训练和预测,准备支持Nvidia Jetson开发板预测。
本项目使用的环境:
本教程源码:https://github.com/yeyupiaoling/PaddlePaddle-DeepSpeech
本人用的就是本地环境和使用Anaconda,并创建了Python3.7的虚拟环境,建议读者也本地环境,方便交流,出现安装问题,随时提issue ,如果想使用docker,请查看搭建Docker环境。
conda install paddlepaddle-gpu==2.1.1 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/
注意: 如果出现LLVM版本错误,解决办法LLVM版本错误。
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
create_manifest.py
中也提供了统一音频数据的采样率转换为16000Hz,只要is_change_frame_rate
参数设置为True就可以。
DeepSpeech/dataset/audio/
目录下,例如我们有个wav
的文件夹,里面都是语音文件,我们就把这个文件存放在DeepSpeech/dataset/audio/
。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 把温度加大到十八
manifest.dev、manifest.test、manifest.train
。然后计算均值和标准差用于归一化,脚本随机采样2000个的语音频谱特征的均值和标准差,并将结果保存在mean_std.npz
中。建立词表。最后建立词表,把所有出现的字符都存放子在zh_vocab.txt
文件中,一行一个字符。以上生成的文件都存放在DeepSpeech/dataset/
目录下。# 生成数据列表
python tools/create_manifest.py
# 计算均值和标准差
python tools/compute_mean_std.py
# 构建词汇表
python tools/build_vocab.py
在生成数据列表的是要注意,该程序除了生成训练数据列表,还提供对音频帧率的转换和生成噪声数据列表,开发者有些自定义的数据集音频的采样率不是16000Hz的,所以提供了change_audio_rate()
函数,帮助开发者把指定的数据集的音频采样率转换为16000Hz。提供的生成噪声数据列表create_noise
函数,前提是要有噪声数据集,使用噪声数据在训练中实现数据增强。
if __name__ == '__main__':
# 生成噪声的数据列表
create_noise()
# 生成训练数据列表
main()
DeepSpeech/models/
目录下,默认会使用噪声音频作为数据增强一起训练的,如果没有这些音频,自动忽略噪声数据增强。关于数据增强,请查看数据增强部分。如果没有关闭测试,在每一轮训练结果之后,都会执行一次测试,为了提高测试的速度,测试使用的是最优解码路径解码,这个解码方式结果没有集束搜索的方法准确率高,所以测试的输出的准确率可以理解为保底的准确率。CUDA_VISIBLE_DEVICES=0,1 python train.py
visualdl --logdir=log --host=0.0.0.0
http://localhost:8040
可以查看结果显示,如下。如果是Windows环境,请忽略。语言模型是集束搜索解码方法使用的,集束搜索解码方法只能在Ubuntu下编译,Windows用户只能使用贪心策略解码方法。下载语言模型并放在lm目录下,下面下载的小语言模型,如何有足够大性能的机器,可以下载70G的超大语言模型,点击下载Mandarin LM Large ,这个模型会大超多。
cd DeepSpeech/
mkdir lm
cd lm
wget https://deepspeech.bj.bcebos.com/zh_lm/zh_giga.no_cna_cmn.prune01244.klm
这里我也提示几点,在预测中可以提升性能的几个参数,预测包括评估,推理,部署等等一系列使用到模型预测音频的程序。解码方法,通过decoding_method
方法选择不同的解码方法,支持ctc_beam_search
集束搜索和ctc_greedy
贪心解码策略两种,Windows只支持ctc_greedy
贪心解码策略,其中ctc_beam_search
集束搜索效果是最好的,但是速度就比较慢,这个可以通过beam_size
参数设置集束搜索的宽度,以提高执行速度,范围[5, 500],越大准确率就越高,同时执行速度就越慢。如果对准确率没有太严格的要求,可以考虑直接使用ctc_greedy
贪心解码策略,其实准确率也低不了多少,而且Windows,Linux都支持,省去编译ctc_decoders
的麻烦。
ctc_beam_search
集束搜索,需要编译ctc_decoders
库,该编译只支持Ubuntu,其他Linux版本没测试过。cd decoders
sh setup.sh
ctc_beam_search
集束搜索方法有两个参数通过调整可以达到最好的准确率。该程序主要是为了寻找ctc_beam_search
集束搜索方法中最优的alpha
,beta
参数,以获得最好的识别准确率。默认的参数是比较好的,如果如果对准确率没有太严格的要求可以直接跳过这一步。python tools/tune.py --model_path=./models/step_final/
ctc_beam_search
集束搜索,如果是Windows用户,可以指定解码方法为ctc_greedy
贪心解码策略。python eval.py --model_path=./models/step_final/ --decoding_method=ctc_beam_search
输出结果:
----------- 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_beam_search
error_rate_type: cer
lang_model_path: ./lm/zh_giga.no_cna_cmn.prune01244.klm
mean_std_path: ./dataset/mean_std.npz
model_path: models/step_final/
num_conv_layers: 2
num_proc_bsearch: 8
num_rnn_layers: 3
rnn_layer_size: 2048
share_rnn_weights: False
test_manifest: ./dataset/manifest.test
use_gpu: True
use_gru: 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.
成功加载了预训练模型:models/epoch_19/
初始化解码器...
======================================================================
language model: is_character_based = 1, max_order = 5, dict_size = 0
======================================================================
初始化解码器完成!
[INFO 2021-03-18 16:38:51,442 model.py:523] begin to initialize the external scorer for decoding
[INFO 2021-03-18 16:38:53,688 model.py:531] language model: is_character_based = 1, max_order = 5, dict_size = 0
[INFO 2021-03-18 16:38:53,689 model.py:532] end initializing scorer
[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 --pretrained_model=./models/step_final/
输出结果:
成功加载了预训练模型:./models/step_final/
----------- Configuration Arguments -----------
mean_std_path: ./dataset/mean_std.npz
num_conv_layers: 2
num_rnn_layers: 3
pretrained_model: ./models/step_final/
rnn_layer_size: 2048
save_model_path: ./models/infer/
share_rnn_weights: False
use_gpu: True
use_gru: True
vocab_path: ./dataset/zh_vocab.txt
wav_path: ./dataset/test.wav
------------------------------------------------
成功导出模型,模型保存在:./models/infer/
我们可以使用这个脚本使用模型进行预测,通过传递音频文件的路径进行识别。默认使用的是ctc_greedy
贪心解码策略,这也是为了支持Windows用户。
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
lang_model_path: ./lm/zh_giga.no_cna_cmn.prune01244.klm
mean_std_path: ./dataset/mean_std.npz
model_dir: ./models/infer/
use_gpu: True
use_tensorrt: False
vocab_path: ./dataset/zh_vocab.txt
wav_path: ./dataset/test.wav
------------------------------------------------
I0729 19:48:39.860693 14609 analysis_config.cc:424] use_dlnne_:0
I0729 19:48:39.860721 14609 analysis_config.cc:424] use_dlnne_:0
I0729 19:48:39.860729 14609 analysis_config.cc:424] use_dlnne_:0
I0729 19:48:39.860736 14609 analysis_config.cc:424] use_dlnne_:0
I0729 19:48:39.860746 14609 analysis_config.cc:424] use_dlnne_:0
I0729 19:48:39.860757 14609 analysis_config.cc:424] use_dlnne_:0
消耗时间:260, 识别结果: 近几年不但我用书给女儿儿压岁也劝说亲朋不要给女儿压岁钱而改送压岁书, 得分: 94
ctc_greedy
贪心解码策略。python infer_server.py
index.html
中的请求url,把url改为加上读者服务器的IP即可,启动服务之后,在浏览器上访问http://localhost:5001
。python client.py
数据集 | 字错率 | 下载地址 |
---|---|---|
AISHELL | 0.055882 | 点击下载 |
free_st_chinese_mandarin_corpus | 0.138749 | 点击下载 |
thchs_30 | 0.112128 | 点击下载 |
自收集(超过1300小时) | 0.072669 | 点击下载 |
说明: 这里提供的是训练参数,如果要用于预测,还需要执行导出模型
有问题欢迎提 issue 交流
基于PaddlePaddle实现的语音识别,中文语音识别。项目完善,识别效果好。支持Windows,Linux下训练和预测,支持Nvidia Jetson开发板预测。
Python JavaScript HTML CSS
Dear OpenI User
Thank you for your continuous support to the Openl Qizhi Community AI Collaboration Platform. In order to protect your usage rights and ensure network security, we updated the Openl Qizhi Community AI Collaboration Platform Usage Agreement in January 2024. The updated agreement specifies that users are prohibited from using intranet penetration tools. After you click "Agree and continue", you can continue to use our services. Thank you for your cooperation and understanding.
For more agreement content, please refer to the《Openl Qizhi Community AI Collaboration Platform Usage Agreement》