參考腳本:egs/voxceleb/v2
提取Xvector
假設(shè)我們已經(jīng)完成了train.sh的訓(xùn)練,并生成了相應(yīng)的模型數(shù)據(jù),諸如:final.raw,mean.vec.plda.transform.mat等
確認(rèn)必要文件存在
模型目錄下須有final.raw、min_chunk_size、max_chunk_size
數(shù)據(jù)目錄下須有feats.scp、vad.scp
根據(jù)final.raw和extract.config生成新的網(wǎng)絡(luò)
extract.config文件中只有1行:output-node name=output input=tdnn6.affine,表示以第6層作為提取層,該文件是在local/nnet3/xvector/run_xvector.sh腳本stage7中設(shè)置的
final.raw:顧名思義,是訓(xùn)練網(wǎng)絡(luò)后的最終產(chǎn)物,通過(guò)nnet3-info fianl.raw可以查看具體配置
工具:/src/nnet3bin/nnet3-copy
按speaker劃分文件
在注冊(cè)enroll與驗(yàn)證test目錄下,有這些文件:feats.scp spk2utt utt2dur utt2num_frames utt2spk vad.scp wav.scp,因?yàn)槭遣⑿刑幚恚孕枰鶕?jù)設(shè)定的nj數(shù)將數(shù)據(jù)分塊。
工具:utils/split_scp.pl、utils/utt2spk_to_spk2utt.pl
1)用utils/split_scp.pl將utt2spk分在split40/目錄下的40個(gè)子文件夾下,每個(gè)speaker的所有utt必須都在同一個(gè)文件夾下
2)用utils/utt2spk_to_spk2utt.pl將各目錄下的utt2spk轉(zhuǎn)化為spk2utt(因?yàn)闆](méi)有以speaker為索引的文件,所以這步可以省略)
根據(jù)子目錄下的utt2spk,以u(píng)tt為索引,生成各自的feats.scp spk2utt utt2dur utt2num_frames vad.scp wav.scp
提取MFCC
工具:/src/featbin/apply-cmvn-sliding、/src/ivectorbin/select-voiced-frames
將每個(gè)子目錄下的feats.scp文件進(jìn)行CMVN與VAD(根據(jù)各自目錄下的vad.scp文件)
提取xvector
工具:/src/nnet3bin/nnet3-xvector-compute
根據(jù)nnet網(wǎng)絡(luò)和MFCC,提取出每個(gè)子目錄下的xvector并放至模型文件夾下
聚合x(chóng)vector并按speaker拆分
工具:/src/ivectorbin/ivector-mean
將所有utt的xvector都集中在xvector.scp中,并根據(jù)spk2utt取每個(gè)人的均值xvector,存放于spk_xvector.{scp,ark},并得到num_utts.ark文件,該文件記錄每個(gè)說(shuō)話人的utt數(shù)目
PLDA打分
準(zhǔn)備PLDA模型
復(fù)制train目錄下的PLDA模型,并對(duì)類內(nèi)協(xié)方差進(jìn)行平滑處理
工具:/src/ivectorbin/ivector-copy-plda
去中心化
對(duì)xvector去均值處理,均值使用mean.vec
工具:/src/ivectorbin/ivector-subtract-global-mean
向量投影
對(duì)去均值后的向量進(jìn)行投影以最大化類間差距,投影矩陣為transform.mat
工具:/src/bin/transform-vec
向量長(zhǎng)度歸一化
工具:/src/ivectorbin/ivector-normalize-length
計(jì)算相似度
注冊(cè)用的是spk_xvector.scp,也就是每個(gè)人的均值xvector(模型),但是測(cè)試使用的是xvector.scp,也就是每句話的xvector,比較兩個(gè)向量與plda模型的相似度
工具:/src/ivectorbin/ivector-compute-lda
流程圖整理如下:
