./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的代碼。