s5/run.sh为完整脚本,下面分别解析每个步骤
1. 指定训练/解码脚本
-d 判断是否为目录 更多命令
命令之间使用 || 连接,实现逻辑或的功能。 linux中的分号&&和&,|和||说明与用法
只有在 || 左边的命令返回假(命令返回值$? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。
只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。 –直到返回真的地方停止执行。
如果没有数据,下载+解压
#!/bin/bash
train_cmd="utils/run.pl"
decode_cmd="utils/run.pl"
if [ ! -d waves_yesno ]; then
wget http://www.openslr.org/resources/1/waves_yesno.tar.gz || exit 1;
# was:
# wget http://sourceforge.net/projects/kaldi/files/waves_yesno.tar.gz || exit 1;
tar -xvzf waves_yesno.tar.gz || exit 1;
fi
2. 数据准备
train_yesno=train_yesno
test_base_name=test_yesno
rm -rf data exp mfcc
# Data preparation
local/prepare_data.sh waves_yesno
local/prepare_dict.sh
utils/prepare_lang.sh --position-dependent-phones false data/local/dict "<SIL>" data/local/lang data/lang
local/prepare_lm.sh
2.1 prepare_data.sh
create_yesno_waves_test_train.pl 输出路径 ./kaldi/egs/yesno/s5/data/local
../../local/create_yesno_waves_test_train.pl waves_all.list waves.test waves.train
三个参数:第一个全路径,第二个test,第三个train
功能:读取全部文件,一半训练一半测试
chomp($l); # perl函数,去掉换行符
create_yesno_wav_scp.pl / create_yesno_txt.pl 处理各种文件路径
2.2 prepare_dict.sh
准备词汇表,不发声的SIL
2.3 prepare_lang.sh
准备语言模型
3. 特征提取
# Feature extraction
for x in train_yesno test_yesno; do
steps/make_mfcc.sh --nj 1 data/$x exp/make_mfcc/$x mfcc
steps/compute_cmvn_stats.sh data/$x exp/make_mfcc/$x mfcc # Compute cepstral mean and variance statistics per speaker.
utils/fix_data_dir.sh data/$x
done
# Mono training
steps/train_mono.sh --nj 1 --cmd "$train_cmd" \
--totgauss 400 \
data/train_yesno data/lang exp/mono0a
# Graph compilation
utils/mkgraph.sh data/lang_test_tg exp/mono0a exp/mono0a/graph_tgpr
# Decoding
steps/decode.sh --nj 1 --cmd "$decode_cmd" \
exp/mono0a/graph_tgpr data/test_yesno exp/mono0a/decode_test_yesno
for x in exp/*/decode*; do [ -d $x ] && grep WER $x/wer_* | utils/best_wer.sh; done
4. 训练
steps/train_mono.sh --nj 1 --cmd "$train_cmd" \
--totgauss 400 \
data/train_yesno data/lang exp/mono0a
5. 生成HCLG图
utils/mkgraph.sh data/lang_test_tg exp/mono0a exp/mono0a/graph_tgpr
6. 解码
steps/decode.sh --nj 1 --cmd "$decode_cmd" \
exp/mono0a/graph_tgpr data/test_yesno exp/mono0a/decode_test_yesno
7.评估
for x in exp/*/decode*; do [ -d $x ] && grep WER $x/wer_* | utils/best_wer.sh; done