Kaldi中 聲紋識別的流程圖

總結了一波Kaldi中聲紋識別的流程和所用的可執行文件,.

把可執行文件當作一個庫來用,自己來仿照這sre08,sre10,或者aishell的run.sh用自己的數據來完成自己的聲紋識別系統就好.


自己還在研究,但是說幾個我認爲比較關鍵的地方:

1.

gmm-gselect : 對每幀選擇能取得最高likelihood的前n個分量, 其他的分量忽略. 返回的是這些分量的索引,後面計算的時候對於每幀只用這些索引的高斯分量進行統計量計算.減少計算過程和時間. 

詳細理論參考 :GMM-UBM論文


2.

計算ivector 時,因爲ivector的計算公式爲:

首先需要兩個統計量,分別式零階的統計量和一階的統計量

如最下的流程圖所示:

1. 零階統計量相關的操作 : fgmm-global-gselect-to-post 和scale post


fgmm-global-gselect-to-post  輸入是協方差全矩陣的features 以及 所選擇的高斯分量,輸出是對所選擇的高斯分量的後驗概率,這樣的話,原本後言概率的矩陣是  frames 長度*高斯總分量,現在變成了 長度*select過的高斯分量的個數

scale-post 乘上一個系數0 ~ 1的系數 控制連續的,繼承的特徵高度相關,因爲這兩步是維了去計算0階統計量,對角線都是後驗概率的協方差矩陣. 所以這裏可能可能是跟T矩陣的原因有關? 因爲我們知道T矩陣lowrank,這裏是否來控制冗餘??? (這裏我猜測)

上面是爲了計算零階統計量的操作,即N(u)就是對每個分量,每個frame計算gamma和



2. Ivector 的計算,T矩陣的計算:

ivector-extractor.h中一些變量的解析和理解
首先確定kaldi與輪中中對一些參數的變量的名字是不一樣的,這裏的D,I,S分別代表着mfcc特徵的維度,高斯的分量數以及ivector的維度,公式中分別式  F,C, I
 
//  D is the feature dim (e.g. D = 60)
//  I is the number of Gaussians (e.g. I = 2048)
//  S is the ivector dim (e.g. S = 400)


首先是 weight projection vector,因爲default 訓練ivector的extractor時:use_weights=false # set to true to turn on the regression of log-weights on the ivector
所以先不管它,表示是權重投影矩陣 那麼
Vector<double> w_vec_ 表示UBM的高斯分量的權重

std::vector<Matrix<double> > M_; 是ivector中最關鍵的元素,公式M=m+Tw中,M_就是T, 它是一個映射矩陣,能把高斯統計量映射到低緯度說話人表徵 i-vector,起到降維的作用. 它只用於表徵說話人變化,不帶有信道與噪聲變化.
它的維度是[ID,S]維矩陣, S要遠遠小於ID,V<<ID.

ivector=(Identity_matrix+T^(transpose)*sigma^(-1)*零階統計量*T)^(-1)*(T^(transpose)*sigma^(-1)*一階統計量)

std::vector<SpMatrix<double> > Sigma_inv_; 經過MAP的GMM-UBM說話人模型的協方差矩陣的^-1
上面ivector中的sigma^(-1)就是該值,通過公式,其實他的維度應該是 [ID,ID]維度,但kaldi中的[ID,D]維度有點怪


Matrix<double> U_;通過 上面公式所得的一個推到出來的變量 =T^transpose * sigama^-1 * T
自己把這些維度照着公式帶入就好,N(u)是[ID,ID]維度,F(u)是[ID,1]


3.

因爲在論文中ivector假設一個人的所有語音都是由不同的人產生的,

ivector-extract是去extract每一個utterance的ivector
所以在kaldi中,它對每個音頻都有一個ivector,
所以在最後提取ivector中
會有
    ivector-normalize-length scp:$dir/ivector.scp  ark:- \| \
    ivector-mean ark:$data/spk2utt ark:- ark:- ark,t:$dir/num_utts.ark \| \
    ivector-normalize-length ark:- ark,scp:$dir/spk_ivector.ark,$dir/spk_ivector.scp || exit 1;
目的是
首先先對每個音頻的ivector進行標準化處理,然後根據spk2utt文件,對所有來自與同一個人的音頻的ivector進行平均處理
然後再標準化 得到最終的屬於每一個人的ivector.


參考論文: Ivector定義

後續還會整理和更新


有問題的地方請各位大大們提出








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