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 用 "-" <音频文件名>来表示, utt2spk的数据文件就是 <-> <音频文件名> 空格

自己数据:

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的底层就会通过这些花里胡哨的数据格式进行解析然后找到对应的音频进行一系列花里胡哨的操作后得到结果.

有问题请提问, 大家继续交流

 

 

你可能感兴趣的:(声纹识别,Kaldi)