1. 程式人生 > >Kaldi sre10, sre16 資料格式

Kaldi sre10, sre16 資料格式

做個記錄, 給大多數跑指令碼但是又沒有官方資料的朋友一起交流討論:

引用自己在知乎的回答:

跑kaldi的指令碼到最後都是得用自己的資料去訓練去測試的, kaldi只需要三個檔案utt2spk, spk2utt和wav.scp.

具體的你其實可以看看他們做資料的perl指令碼,

我個人是用python寫一個指令碼把資料集變成kaldi可讀的格式的, 我程式碼弱智水平都能做,相信大牛的你們也沒問題的. 如果有需要, 後期我把程式碼貼上來,只不過寫的太醜,不好意思放.

這裡的官方資料是NIST SRE 16的測試資料,來舉個例子方便對比, 我以SRE16 xvector的系統為例. 這裡是測試資料, 因為網上有pretrainModel, 直接下載下來用就好. 若不知道pretrain model在哪請參考我之前的博文, 有地址. 當然, 訓練資料也是跟如下的格式差不多. 自己訓練也可,但是最好資料集大一點,畢竟是supervised learning,就是能在data augmentation的表現中想必傳統的ivector更好

大概就是這種格式:

utt2spk:

官方資料:

1081_sre16-eeppywd_sre16 1081_sre16
1082_sre16-eefrtca_sre16 1082_sre16

1081_sre16代表說話人的ID或者名字, eeppywd_sre16代表音訊檔名, 因為utt需要speakerID作為字首, 並用"-"連結,否則會報錯,所以這裡的utt 用 <speakerID> "-" <音訊檔名>來表示, utt2spk的資料檔案就是<speakerID> <-> <音訊檔名> 空格 <speakerID>

自己資料:

1-SI_device3_P30001_XM3_advertisement_90 1

2-SI_device3_P30002_XM3_advertisement_90 2

3-SI_device3_P30003_XM3_advertisement_90 3

1代表speaker ID, SI_device3_P30001_XM3_advertisement_90 表示音訊檔名, 這裡的1其實跟P30001都是同一個人,只是我把資料夾的名字叫做1

 

spk2utt:(utt2spk反過來)

官方資料:

1081_sre16 1081_sre16-eeppywd_sre16
1082_sre16 1082_sre16-eefrtca_sre16
1083_sre16 1083_sre16-eedvtuu_sre16 1083_sre16-eefqdst_sre16 1083_sre16-eemtklx_sre16

utt2spk轉過來,可以直接用指令碼

utils/utt2spk_to_spk2utt.pl utt2spk >spk2utt 轉過來得到

自己資料:

1 1-SI_device3_P30001_XM3_advertisement_90

2 2-SI_device3_P30002_XM3_advertisement_90

3 3-SI_device3_P30003_XM3_advertisement_90

 

 

wav.scp:

官方資料

1081_sre16-eeppywd_sre16 sph2pipe -f wav -p -c 1 /media/yongyu/data/LDC2018E30_2016_NIST_Speaker_Recognition_Evaluation_Test_Set/data/eval/R149_0_1/data/enrollment/eeaaeih-eezzfam/eeppywd_sre16.sph |
1082_sre16-eefrtca_sre16 sph2pipe -f wav -p -c 1 /media/yongyu/data/LDC2018E30_2016_NIST_Speaker_Recognition_Evaluation_Test_Set/data/eval/R149_0_1/data/enrollment/eeaaeih-eezzfam/eefrtca_sre16.sph |
1083_sre16-eedvtuu_sre16 sph2pipe -f wav -p -c 1 /media/yongyu/data/LDC2018E30_2016_NIST_Speaker_Recognition_Evaluation_Test_Set/data/eval/R149_0_1/data/enrollment/eeaaeih-eezzfam/eedvtuu_sre16.sph |

 

自己資料

1-SI_device3_P30001_XM3_advertisement_90 /media/yongyu/data/1/register/SI_device3_P30001_XM3_advertisement_90.wav

speakerID-音訊名 音訊路徑

注意:官方資料是用字尾為.sph的檔案格式儲存的, 需要用sph2pip去轉換為wav,  但假如自己資料是wav檔案,則不需要,直接放上去即可,最後面也不需要 "|"符號

這幾個檔案的邏輯是, utt2spk跟spk2utt有種索引的關係, 然後wav.scp能根據索引找到對應的音訊的意思

 

trials檔案:

官方資料:

1081_sre16 etabjvx_sre16 nontarget
1081_sre16 etacfan_sre16 nontarget
1081_sre16 etacpsa_sre16 nontarget
1081_sre16 etacrqg_sre16 nontarget
1081_sre16 etacyvp_sre16 nontarget
1081_sre16 etadgty_sre16 nontarget
1081_sre16 etadnlf_sre16 nontarget
1081_sre16 etaeiji_sre16 nontarget
1081_sre16 etaeiqa_sre16 nontarget
1081_sre16 etaenln_sre16 nontarget
1081_sre16 etaergg_sre16 nontarget

自己資料

這裡注意1 跟P30001代表同一個id為1的人, 只是我把資料夾命名為1了

1 SI_device3_P30001_XM3_advertisement_91 target

1 SI_device3_P30001_XM3_advertisement_92 target

1 SI_device3_P30001_XM3_advertisement_93 target

1 SI_device3_P30001_XM3_advertisement_94 target

1 SI_device3_P30001_XM3_advertisement_95 target

1 SI_device3_P30010_XM3_advertisement_91 nontarget

1 SI_device3_P30010_XM3_advertisement_92 nontarget

1 SI_device3_P30010_XM3_advertisement_93 nontarget

1 SI_device3_P30010_XM3_advertisement_94 nontarget

大概就是 把資料按每個人為一個資料夾分配,然後每個測試資料都與所有資料夾遍歷比對一次, 如果比到自己的資料夾就是target否則是nontarget

總而言之, 言而總之,就是把你們自己已有的資料集分成3個檔案 utt2spk, spk2utt, wav.scp即可, 其實這三個檔案起了一個指明的作用,就是誰對應哪個音訊,在哪裡找到該音訊. 然後kaldi的提取mfcc的底層就會通過這些花裡胡哨的資料格式進行解析然後找到對應的音訊進行一系列花裡胡哨的操作後得到結果.

有問題請提問, 大家繼續交流