1. run.sh
#!/bin/bash
# run.pl 代码执行队列设置
train_cmd="utils/run.pl"
decode_cmd="utils/run.pl"
# 判断数据集是否存在 在s5路径下运行代码,检查当前目录下waves_yesno文件是否存在 不存在则下载yesno数据集
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
# 设置训练测试文件夹 变量赋值
train_yesno=train_yesno
test_base_name=test_yesno
# 层级删除data exp mfcc三个文件 文件不存在不会报错,存在则删除,代码运行会生成这三个文件夹,存储一些文件信息,
# 重新运行需要先将这三个文件夹删除
rm -rf data exp mfcc
# Data preparation 数据准备
# 执行prepare_data.sh 需要传递waves_yesno文件 文件内存储的是60个(0_0_0_0_1_1_1_1.wav )音频数据
# 运行结果:四个文件---text、wav.scp utt2spk spk2utt
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
# Feature extraction 特征提取
# 遍历train_yesno test_yesno 文件夹 对这两个文件夹里面的wav数据分别做mfcc特征提取
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
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
2. local/prepare_data.sh waves_yesno
#!/bin/bash
# 层级创建文件夹 准备存放生成的文件
mkdir -p data/local
local=`pwd`/local # s5/local
scripts=`pwd`/scripts # s5/scripts
# 设置环境变量
export PATH=$PATH:`pwd`/../../../tools/irstlm/bin
echo "Preparing train and test data"
# 设置变量
train_base_name=train_yesno
test_base_name=test_yesno
waves_dir=$1 # local/prepare_data.sh waves_yesno $1=waves_yesno
# 将waves_yesno文件夹里面的所有文件的文件名显示输出并重定向到waves_all.list文件中
ls -1 $waves_dir > data/local/waves_all.list
# 当前目录从s5跳转到s5/data/local目录中
cd data/local
# 传递waves_all.list,生成两个文件 waves.test(测试集部分) waves.train (训练集部分) 【分割数据集】
../../local/create_yesno_waves_test_train.pl waves_all.list waves.test waves.train
# 运行产生文件内容: 文件名前缀(0_0_0_0_1_1_1_1) 空格 waves_yesno/文件名(具体路径)
../../local/create_yesno_wav_scp.pl ${waves_dir} waves.test > ${test_base_name}_wav.scp
# 同上
../../local/create_yesno_wav_scp.pl ${waves_dir} waves.train > ${train_base_name}_wav.scp
# 保存成 文件名前缀0_0_0_0_1_1_1_1-(space)->NO NO NO NO YES YES YES YES 进行对应
../../local/create_yesno_txt.pl waves.test > ${test_base_name}.txt
../../local/create_yesno_txt.pl waves.train > ${train_base_name}.txt
cp ../../input/task.arpabo lm_tg.arpa
# 退回到s5目录
cd ../..
# This stage was copied from WSJ example
# 将wav.scp text utt2spk spk2utt文件复制到train test两个数据集文件夹中
for x in train_yesno test_yesno; do
mkdir -p data/$x
cp data/local/${x}_wav.scp data/$x/wav.scp
cp data/local/$x.txt data/$x/text
cat data/$x/text | awk '{printf("%s global\n", $1);}' > data/$x/utt2spk
utils/utt2spk_to_spk2utt.pl <data/$x/utt2spk >data/$x/spk2utt
done
待更新。。。