ASR实验及记录

ASR实验及记录

转载自我的个人网站 https://wzw21.cn/2020/12/23/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”: “”}

  • 使用如下命令可进行自定义语音音频识别

    PYTHONIOENCODING=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进行训练,命令及参数如下

    PYTHONIOENCODING=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://www.paddlepaddle.org.cn/install/quick

  • 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文件中含有真实标签,则可查看最佳参数。打开最佳参数对应的文件夹可查看识别结果。
难点
  • 无官方文档,相关参考资料较少
  • 模型封装完整,无法进行修改,无法使用迁移学习进行模型优化
  • 因未提供相关解码文件,无法获取时间戳信息
参考
  • https://chatopera.blog.csdn.net/article/details/107733688

  • https://blog.csdn.net/samurais/article/details/107889376

  • https://blog.csdn.net/tcx1992/article/details/85717100

  • https://github.com/tcxdgit/ASR_utils

  • https://blog.csdn.net/benbenls/article/details/102691710

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值