接上回,完成数据准备的工作后,shell显示
说明已经创建这些文件完毕。 我们看到生成的spk2utt的文件格式是这样的:
我们看到它是先是一个说话者id号 然后是这个说话者id下的所有名称,
而word.txt和text是一样的。
既然我们已经数据准备了,所以以后就不用再进行数据准备了,所以在下次运行run.sh时, 先注释掉相关数据准备的shell脚本。
#data preparation
#generate text, wav.scp, utt2pk, spk2utt
#local/thchs-30_data_prep.sh $H $thchs/data_thchs30 || exit 1;
我们接下来继续看run.sh
#produce MFCC features 生成 mfcc特征
rm -rf data/mfcc && mkdir -p data/mfcc && cp -R data/{train,dev,test,test_phone} data/mfcc || exit 1;
#先删除data下的mfcc目录, 并且创建mfcc目录,拷贝这些数据到mfcc目录
for x in train dev test; do
#make mfcc 生成mfcc
steps/make_mfcc.sh --nj $n --cmd "$train_cmd" data/mfcc/$x exp/make_mfcc/$x mfcc/$x || exit 1; #调用steps/make_mfcc.sh ,$n是cpu的并发数,--cmd "$train_cmd"是 训练的cmd ,它调用的是 cmd.sh中设置的train_cmd ,data/mfcc/$x 是每个数据的目录,exp/make_mfcc/$x, mfcc/$x 这些都是目录的参数
#compute cmvn 计算cmvn
steps/compute_cmvn_stats.sh data/mfcc/$x exp/mfcc_cmvn/$x mfcc/$x || exit 1;
done
咱们先来看看steps/make_mfcc.sh是怎么样提取mfcc特征的:
#!/bin/bash
# Copyright 2012-2016 Johns Hopkins University (Author: Daniel Povey)
# Apache 2.0
# To be run from .. (one directory up from here)
# see ../run.sh for example
# Begin configuration section.
nj=4 #默认nj为4
cmd=run.pl #调用run.pl
mfcc_config=conf/mfcc.conf #mfcc配置文件为conf/mfcc.conf 此时说明一下 我们看到 配置文件中只有如下两行:
--use-energy=false # only non-default option.
#--sample-frequency=8000 说明没有选定使用能量,也就是不使用能量
compress=true #这里应该是启用了压缩
write_utt2num_frames=false # if true writes utt2num_frames 这里表示如果选择true 则就写utt2num_frames
# End configuration section.
echo "$0 $@" # Print the command line for logging 这里是打印命令行到日志,$0为执行的命令 $@表示所有参数脚本的内容
if [ -f path.sh ]; then . ./path.sh; fi #这句的意思是如果存在path.sh那么就执行它,为了测试它调用了,我们一会在path.sh中添加一些打印,来查看。
我们先看到这,将后面的先注释掉。
我们还需要在path中添加一些打印来方便查看,我们在path.sh中的开始部分加入
echo "come here,for test" ,如果打印多次,说明run.sh中的for循环通过make_mfcc.sh调用了path.sh多次。
我们调试一下ÿ