./utils/subset_data_dir_tr_cv.shy腳本分析,用於劃分訓練集和驗證集。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章