使用kaldi训练aishell数据集


目录

  1. 数据准备
  2. 提取特征
  3. 单音素训练
  4. 三音素训练
  5. nnet3网络训练
  6. chain网络训练

1. 数据准备

数据准备分为六个步骤,所用到的脚本列表如下:

步骤 脚本
1. 下载数据 local/download_and_untar.sh
2. 准备dict local/aishell_prepare_dict.sh
3. 准备语音 local/aishell_data_prep.sh
4. 准备lang utils/prepare_lang.sh
5. 训练语言模型 local/aishell_train_lms.sh
6. 生成语言模型fst utils/format_lm.sh

下载数据

准备dict

准备语音

准备lang

训练语言模型

生成语言模型fst

返回目录

2. 提取特征

提取mfcc_pitch特征

计算CMVN(Cepstral Mean and Variance Normalization):倒谱均值和方差归一化

验证文件夹里的数据

返回目录

3. 单音素训练

训练mono

训练步骤:(参考许开拓的博文

  1. 初始化单音素模型。调用gmm-init-mono,生成0.mdl、tree。
  2. 编译训练时的图。调用compile-train-graph生成text中每句抄本对应的fst,存放在fsts.JOB.gz中。
  3. 第一次对齐数据。调用align-equal-stats-ali生成对齐状态序列,通过管道传递给gmm-acc-stats-ali,得到更新参数时用到的统计量。
  4. 第一次更新模型参数。调用gmm-est更新模型参数。
  5. 进入训练模型的主循环:在指定的对齐轮数,使用gmm-align-compiled对齐特征数据,得到新的对齐状态序列;每一轮都调用gmm-acc-stats-ali计算更新模型参数所用到的统计量,然后调用gmm-est更新模型参数,并且在每一轮中增加GMM的分量个数。

解码mono

1. 生成graph

2. 执行解码

对齐mono到mono_ali

对齐步骤:

  1. 检查一下训练时的phones.txt只是比最开始lang里的多了消歧音素
  2. 调用compile-train-graph生成对应的fst
  3. 使用gmm-align-compiled对齐特征数据
  4. 执行steps/diagnostic/analyze_alighments.sh验证

对齐的结果可以用show-alignments指令查看: (参考链接)

$ show-alignments phones.txt final.mdl "ark:gunzip -c ali.1.gz |" | less

返回目录

4. 三音素训练

aishell的三音素训练有5个步骤:tri1, tri2, tri3a, tri4a和tri5a

步骤 feature[1] 训练脚本 解码脚本 对齐脚本
tri1 delta steps/train_deltas.sh steps/decode.sh steps/align_si.sh
tri2 delta steps/train_deltas.sh steps/decode.sh steps/align_si.sh
tri3a LDA steps/train_lda_mllt.sh steps/decode.sh steps/align_fmllr.sh
tri4a LDA steps/train_sat.sh steps/decode_fmllr.sh steps/align_fmllr.sh
tri5a LDA steps/train_sat.sh steps/decode_fmllr.sh steps/align_fmllr.sh

[1] 这列不是很确定,delta与LDA的区别需要再研究一下

训练tri1

训练tri2

训练tri3a: LDA+MLLT

训练tri4a和tri5a

返回目录

5. nnet3网络训练

提取特征:ivector和mfcc_hires

这一步的总脚本为local/nnet3/run_ivector_common.sh,其中包含以下步骤:

  1. utils/data/perturb_data_dir_speed_3way.sh用于准备data/train_sp(speed-perturbed data)
  2. steps/align_fmllr.sh用于将perturbed data对齐(结果在tri5a_sp_ali)
  3. steps/make_mfcc_pitch.sh用于提取mfcc_hires特征,其配置文件为conf/mfcc_hires.conf,在用这个脚本提取mfcc_hires特征之前用utils/data/perturb_data_dir_volume.sh脚本做了volume perturbation
  4. 分离出没有pitch的mfcc_hires特征用于extract iVector:utils/data/limit_feature_dim.sh
  5. steps/online/nnet2/get_pca_transform.sh计算pca
  6. steps/online/nnet2/train_diag_ubm.sh训练diagonal UBM
  7. steps/online/nnet2/train_ivector_extractor.sh训练iVector extractor (结果放在exp/nnet3/extractor)
  8. steps/online/nnet2/extract_ivectors_online.sh用于extract iVector,对于验证集和测试集没有用speed perturbation

训练nnet3神经网络

主体脚本在local/nnet3/run_tdnn.sh里,其主要步骤如下:

  1. 生成神经网络配置文件:输入层为mfcc_hires特征,维度为43。输出层维度为gmm probability density function的个数。
  2. 调用steps/nnet3/train_dnn.py训练神经网络
  3. 解码验证集和测试集,解码用的graph是tri5a的graph

Tips: 在local/nnet3/tuning文件夹下面还有一个run_tdnn_2a.sh脚本,其中增加了online decoding。

返回目录

6. chain网络训练

返回目录