ASR (自动语音识别)初探
ASR实验及记录
DeepSpeech2
DeepSpeech2是一个采用PaddlePaddle平台的端到端自动语音识别引擎的开源项目,具体原理参考论文Baidu’s Deep Speech 2 paper。
环境配置
- 使用官方镜像,运行失败。原因:PaddlePaddle版本不匹配,缺少RNN模块等关键组件;尝试进行修改后发现CUDNN版本也不匹配;
- 使用带有正确版本CUDA与CUDNN的镜像,手动安装PaddlePaddle,安装成功后clone DeepSpeech2项目,根据setup.sh进行相关依赖的安装与配置。注意镜像中缺少git、swig等基础命令或依赖包的安装,需通过apt-get进行安装。
数据准备及使用方式:
-
下载BaiduCN1.2k Model语音模型与Mandarin LM Small语言模型;
-
自行准备manifest文件,其中包括每条音频的存储路径,音频时长与数据标签(文本)。文本中不能含有标点符号、英文字母与阿拉伯数字。格式为:{“audio_filepath”: “”, “duration”: , “text”: “”}
-
使用如下命令可进行自定义语音音频识别
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35PYTHONIOENCODING=utf-8 // 需设定编码方式为utf-8,否则会出现错误;
python infer.py
--num_samples 1 //识别语音条数
--infer_manifest data/mydata/manifest //manifest文件路径
--use_gru TRUE //使用门控循环单元
--use_gpu FALSE
--mean_std_path models/baidu_ch1.2k/mean_std.npz //样本特征的均值与标准差
--vocab_path models/baidu_ch1.2k/vocab.txt //字典路径
--lang_model_path models/lm/zh_giga.no_cna_cmn.prune01244.klm //语言模型路径
--model_path models/baidu_ch1.2k //语音模型路径
--num_conv_layers=2 //卷积层数量
--num_rnn_layers=3 //循环神经网络配置
--rnn_layer_size=2048
--share_rnn_weights=False
--specgram_type='linear'
--error_rate_type=cer //错误率类型设置为字错误率
--alpha=0.4
--beta=0.3 -
使用tools/tune.py可使用不同参数进行识别,以找出最优参数。参数包括alpha与beta,分别为语言模型权重与单词插入权重。
-
使用tools/compute_mean_std.py和tools/build_vocab.py可获得自定义样本的特征均值、标准差(用于归一化)与字典;
-
相关命令及运行参数保存在command.txt中,方便使用。
实验结果分析
- 实验数据为100条语音数据,带有ground truth。使用BaiduCN1.2k Model语音模型与Mandarin LM Small语言模型,使用预训练模型的数据特征(即归一化方式)与字典,经测试,最佳运行参数为alpha=0.4, beta =0.3,测试结果的平均cer(字错误率)为55.19%
- 将语音模型替换为Aishell模型进行实验,错误率升高
迁移学习
在公开的模型上使用自己的数据集进行迁移训练
-
准备工作
1)修改词典中的阿拉伯数字为中文;
2)将正确数据标签中所有阿拉伯数字换为中文,去除所有标点符号与英文字母;
3)按照要求生成manifest.train文件,包含训练数据路径,时长与标签;
4)预处理出训练集数据特征的均值与标准差;
5)若要修改字典(添加或删除),则需要修改神经网络模型的结构,较为复杂;
-
运行train.py进行训练,命令及参数如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43PYTHONIOENCODING=utf-8
python train.py
--batch_size 16 //批量大小
--num_epoch 10 //训练周期数
--num_conv_layers=2
--num_rnn_layers=3
--rnn_layer_size=2048
--share_rnn_weights=False
--save_epoch 1 //每训练一个epoch进行一次模型保存
--num_samples 80
--learning_rate 0.05 //学习率,需调优
--max_duration 130 //最大音频时长
--use_gpu FALSE
--use_gru TRUE
--init_from_pretrained_model models/baidu_ch1.2k
--train_manifest data/mydata/manifest.train //训练集路径
--dev_manifest data/mydata/manifest.validation //验证集路径
--mean_std_path models/baidu_ch1.2k/mean_std.npz //可选择模型预训练时使用的数据的特征(即models/baidu_ch1.2k/mean_std.npz),或是当前进行迁移学习的数据的特征(data/mydata/ mean_std.npz)
--vocab_path models/baidu_ch1.2k/vocab_new.txt
--output_model_dir models/baidu_ch1.2k_new //新模型保存位置
--num_iter_print 1 //每一个epoch输出一次信息
--test_off TRUE//训练过程中是否进行验证
难点
- 环境难以配置,官方镜像存在问题,配置环境花费大量时间;
- 暂无法成功在docker中使用gpu,导致训练与识别速度非常慢;
- (15h仅训练了6个epoch)
- 自定义训练数据的特征均值和标准差与预训练模型使用的数据不同,导致迁移学习效果较差
- 若需修改字典,则必须深入了解DeepSpeech模型结构与修改方式,深入学习PaddlePaddle框架
Todo
- 结合预训练时使用的数据的特征,对我们的音频数据进行预处理,再进行迁移训练
- 修改字典,修改网络模型,使最后的全连接层与自定义字典相匹配
- 使用更大型的语言模型Mandarin LM Large
参考文档
-
https://github.com/PaddlePaddle/DeepSpeech/blob/develop/README_cn.md
-
https://baijiahao.baidu.com/s?id=1675202226359497084&wfr=spider&for=pc
CVTE开源模型
概述
- 基于Kaldi
- 批量将mp3或wav音频进行数据部署,并生成txt识别结果
- 无phone和ctm时间戳
实验过程
- 将音频文件放入data/wav/filename中
- 新建data/filename/test文件夹,并在其中创建text、utt2spk、spk2utt、wav.scp文件,text中保存标签数据,wav.scp中保存音频路径,utt2spk、spk2utt中保存音频与说话人的关系。
- 每次运行后需删除data/filename/test中的cmvn.scp文件,否则会报错。
- 创建好data/filename/test中相应文件后,可使用utils/validate_data_dir.sh进行检查(需加上 --no-feats)
- 运行run.sh开始语音识别,运行前需修改run.sh中的路径(有三处)
- 在exp/chain/tdnn/decode_filename/scoring_kaldi/中可查看识别结果,对于不同的参数会有不同的结果,可通过best_cer(best_wer)查看最优结果对应参数(记为参数a)参数包括inv-acoustic-scale∈[7,17] ,word-ins-penalty∈{0.0,0.5,1.0}。
- 猜测:最优识别结果对应的参数(参数a)是最适合对此类语音数据进行识别的参数。在没有text文件的情况下,最优结果大概率存在于使用参数a得到的结果中。
- 对于不同的数据集,需要进行测试以获取最优参数
实验结果分析
- 实验数据为28条语音数据,带有ground truth。经测试,最佳参数为inv-acoustic-scale=16, word-ins-penalty=0.0,测试结果的平均cer(字错误率)为50.18%
流程
- 将音频文件(wav格式)放入/kaldi-master/egs/cvte/s5/data/wav/filename中;
- 将text文件放入/kaldi-master/egs/cvte/s5/data/test_filename/test中,text格式为“音频ID 文字标签\r\n”(中间为Tab);
- 将conf与frame_shift放入test文件夹;
- 将进行整个识别流程封装入asr.sh文件。首先将自动生成wav.scp、utt2spk、spk2utt文件,并删除可能造成冲突的文件,然后开始语音识别;
- 识别结果将保存于/kaldi-master/egs/cvte/s5/exp/chain/tdnn/decode_filename/scoring_kaldi/中。若text文件中含有真实标签,则可查看最佳参数。打开最佳参数对应的文件夹可查看识别结果。
难点
- 无官方文档,相关参考资料较少
- 模型封装完整,无法进行修改,无法使用迁移学习进行模型优化
- 因未提供相关解码文件,无法获取时间戳信息