赞
踩
本文讲述了一个开源的 pytorch与kaldi结合的工具
论文地址 https://arxiv.org/pdf/1811.07453v2.pdf
github地址 https://github.com/mravanelli/pytorch-kaldi
所提供的解决方案专为标准机器和HPC集群上的大规模语音识别实验而设计。
工具在训练模型时使用pytorch,在特征提取、标签对齐、解码部分使用kaldi
训练模块 MLP RNN LSTM GRU Li-GRU几种模型
特征提取模块 MFCC FBANK fMLLR
数据集 TIMIT DIRHA CHiME4 LibriSpeech datasets(100h)
论文中提到了以下优势:
支持recurrent dropout
支持batch和图层规范化
支持单向/双向RNN
支持residual/skip连接
支持双正则化
python2/python3兼容性
多gpu训练
recovery/saving checkpoints
可与kaldi轻松对接。
结果如下:
$ git clone https://github.com/vesis84/kaldi-io-for-python.git
2.添加环境变量
$export PYTHONPATH=$PYTHONPATH:<kaldi-io-dir> $HOME/.bashrc
输入python -c "import kaldi_io"以检查包是否已正确安装。您可以在https://github.com/vesis84/kaldi-io-for-python上找到更多信息(包括一些读写测试)。
RNN模型的实现根据训练句的长度对训练句进行排序。这允许系统在形成微型机时最小化零填充的需要。使用sox提取每个句子的持续时间。请确保已安装(仅在create_chunk.sh中生成功能列表时使用)
3.运行kaldi基线
run.sh 脚本会训练出 5 种模型:
monophone 单音素模型是训练单音子隐马尔科夫模型,一共进行 40 次迭代;
tri1 三音素模型是训练与上下文相关的三音子模型;
tri2b 模型用来进行线性判别分析和最大似然线性转换;
tri3b 模型用来训练发音人自适应,基于特征空间最大似然线性回归;
tri4b 模型用来在现有特征上训练模型,它基于树统计中的计数的重叠判断的相似性来选择旧模型中最接近的状态。
4.强制对齐
对齐的意义是将每个音素对应一个标签,在通过合并算法合并
$ steps/nnet/align.sh --nj 4 data-fmllr-tri3/dev data/lang exp/dnn4_pretrain-dbn_dnn exp/dnn4_pretrain-dbn_dnn_ali_dev
$ steps/nnet/align.sh --nj 4 data-fmllr-tri3/test data/lang exp/dnn4_pretrain-dbn_dnn exp/dnn4_pretrain-dbn_dnn_ali_test
5.数据清洗和分割
转到pytorch-kaldi文件夹。
create_chunks.sh脚本首先对kaldi特征列表进行清洗或排序(根据句子长度),然后将其拆分为一定数量的块。混合列表可能适用于前馈DNN,而排序列表可用于RNN(用于最小化形成微缩位时零填充的需要)。该代码还计算每个发言者和每个句子的CMVN。
$ ./create_chunks.sh $KALDI_ROOT/egs/timit/s5/data/train mfcc_shu 5 train 0
$ ./create_chunks.sh $KALDI_ROOT/egs/timit/s5/data/dev mfcc_shu 1 dev 0
$ ./create_chunks.sh $KALDI_ROOT/egs/timit/s5/data/test mfcc_shu 1 test 0
6.设置配置文件
进入cfg文件夹
打开配置文件(例如,TIMIT_MLP.cfg,TIMIT_GRU.cfg)并根据您的路径修改它:
tr_fea_scp包含使用create_chunks.sh创建的功能列表。
tr_fea_opts允许用户轻松添加规范化,衍生物和其他类型的特征处理。
tr_lab_folder是包含对齐(标签)的kaldi文件夹。
tr_lab_opts允许用户派生依赖于上下文的电话目标(当设置为ali-to-pdf时)或单声道目标(当设置为ali-to-phone --per-frame时)。
请修改dev和测试数据的路径。
您可以根据需要随意修改DNN架构和其他优化参数。
所需的count_file用于在馈送解码器之前规范化DNN后验。该归一化步骤对于HMM-DNN语音识别是至关重要的。事实上,DNN提供后验概率,而HMM是与可能性一起工作的生成模型。为了得出所需的可能性,可以简单地将后验除以先验概率。计数文件包含上述先验,通过简单计算电话状态得出。如果运行完整的TIMIT s5配方(包括DNN部分),则会在此处自动创建计数文件:
$ $KALDI_ROOT/egs/timit/s5/exp/dnn4_pretrain-dbn_dnn/ali_train_pdf.counts
否则,您可以使用以下命令临时创建:
alidir=/home/mirco/kaldi-trunk/egs/timit/s5/exp/tri3_ali (change it with your own path)
num_pdf=$(hmm-info $alidir/final.mdl | awk '/pdfs/{print $4}')
labels_tr_pdf="ark:ali-to-pdf $alidir/final.mdl \"ark:gunzip -c $alidir/ali.*.gz |\" ark:- |"
analyze-counts --verbose=1 --binary=false --counts-dim=$num_pdf "$labels_tr_pdf" ali_train_pdf.counts
使用use_cuda=1选项在GPU上运行代码(强烈建议)。
使用save_gpumem = 0选项来保存gpu内存。代码会慢一点(大约10-15%),但它可以节省gpu内存。
有关所有可能选项的更详细说明,请参阅config_description.cfg。
7.运行代码
$ ./run_exp.sh cfg/baselines/TIMIT_GRU.cfg
要检查可能出现的错误,请大家看看到log.log保存到在CFG文件中指定的输出文件夹(out_folder)文件。请注意,run_exp.sh是一个执行完整ASR实验(训练,转发和解码步骤)的bash脚本。如果一切正常,您应该在输出文件夹中找到以下文件:
文件res.res总结了各个时期的训练和评估表现。查看exp/our_results,了解运行代码时应该获得的结果。
包含语音识别结果的文件夹decode_test。如果您输入./RESULTS,您应该能够看到每个实验的错误率(PER%)。
.pkl模型是用于语音解码的最终模型。
.info文件报告每个训练块的损失和错误性能。
log.log文件包含训练过程中可能发生的错误
实验部分参考
kaldi-pytorch官方教程
pytorch使用pytorch-kaldi实现ASR语音识别 - pytorch中文网
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。