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

    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
    43
    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

参考文档

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文件中含有真实标签,则可查看最佳参数。打开最佳参数对应的文件夹可查看识别结果。

难点

  • 无官方文档,相关参考资料较少
  • 模型封装完整,无法进行修改,无法使用迁移学习进行模型优化
  • 因未提供相关解码文件,无法获取时间戳信息

参考