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定义

后续还会整理和更新


有问题的地方请各位大大们提出








猜你喜欢

转载自blog.csdn.net/robingao1994/article/details/80320999