./utils/subset_data_dir_tr_cv.sh脚本分析
这个脚本的作用是根据说话人来划分数据集,分为训练集和验证集。
使用代码的结构如下:
Usage: $0 [opts] <src-data> <train-data> <cv-data>
src_data:指的就是原始的数据集合
trn_data:指的是划分的训练集合
cv_data:指的是划分的验证集合
可选项有两个:
–cv-spk-percent N (default 10):
第一个是默认选项,并且值默认为10。第一个选项的意思就是按照说话人的比例来划分数据集。比如说默认情况的N=10,也就是随机将10%的说话人对应的utt话语划分为验证集,剩余90%的说话人对应的utt话语划分为训练集。
–cv-spk-list (a pre-defined list with cv speakers)
对于受干扰的数据,我们没办法直接按照比例去进行划分,所以我们通过传入验证集的说话人列表,将list中的说话人对应的utt划分为验证集,其余的说话人集是训练集。
首先我们来看没有传入spk-list的情况,也就是按照比例划分训练集和验证集
38 if [ -z "$cv_spk_list" ]; then
39 # Select 'cv_spk_percent' speakers randomly,
40 cat $src_data/spk2utt | awk '{ print $1; }' | utils/shuffle_list.pl --srand $seed >$tmp/speakers
41 n_spk=$(wc -l <$tmp/speakers)
42 n_spk_cv=$(perl -e "print int($cv_spk_percent * $n_spk / 100); ")
43 #
44 head -n $n_spk_cv $tmp/speakers >$tmp/speakers_cv
45 tail -n+$((n_spk_cv+1)) $tmp/speakers >$tmp/speakers_trn
38行:[ -z STRING ] “STRING” 的长度为零则为真。
40行:提取出所有的speak,然后将所有speak的顺序随机排列一下。
41.42:根据之前设置的比例,计算验证集需要的speak的数量
44.45:将前 n_spk_cv数量的speak划分给验证集,剩余的就是训练集的speak
接下来看传入spk-list的情况:
46 else
47 # Use pre-defined list of speakers,
48 cp $cv_spk_list $tmp/speakers_cv
49 join -v2 <(sort $cv_spk_list) <(awk '{ print $1; }' <$src_data/spk2 utt | sort) >$tmp/speakers_trn
50 fi
49行的作用就是提取出spk2所有的说话人列表中不包含cv_spk_list中说话人的其他说话人。
关于join的使用方法的话可以参考我之前的博客:传送门
通过以上的过程,speakers_cv中包含的是验证集的说活人列表,speakers_trn中包含的是训练集的说话人;列表。
下一步主要是一个检查的作用,判断训练集和验证集划分出来的说话人是否存在交叠重复的现象。
52 # Sanity checks,
53 n_spk=$(wc -l <$src_data/spk2utt)
54 echo "Speakers, src=$n_spk, trn=$(wc -l <$tmp/speakers_trn),
cv=$(wc -l $tmp/speakers_cv)"
55 overlap=$(join <(sort $tmp/speakers_trn) <(sort $tmp/speakers_cv) | wc -l)
56 [ $overlap != 0 ] && \
57 echo "WARNING, speaker overlap detected!" && \
58 join <(sort $tmp/speakers_trn) <(sort $tmp/speakers_cv) | head && \
59 echo '...'
最后一步就是调用./utils/data/subset_data_dir.sh 脚本根据我们划分出来的说话人列表,来对原始的数据进行划分,生成相应的数据集。
61 # Create new data dirs,
62 utils/data/subset_data_dir.sh --spk-list $tmp/speakers_trn $src_data $trn_data
63 utils/data/subset_data_dir.sh --spk-list $tmp/speakers_cv $src_data $ cv_data
utils/data/subset_data_dir.sh 脚本主要是根据说话人的列表。去过滤相应的文件的信息,从而生成相应的训练集和测试集,这里就不详细展开了,有兴趣的可以去kaldi的代码。