說話人識別中取到i-vector之後怎麼做分類?

現在有了gmm-ubm,自適應得到了每個人的gmm模型,用M=m+Tw得到了w,即每個人的i-vector,接下來怎麼辦呢?這時來了一個測試音頻,是某個人說的話.wav,取其mfcc特徵後怎麼判斷屬於哪個人呢?

換句話說,i-vector和dnn怎麼配合呢?

還是我之前的思路不對?可以簡述一下思路原理給幾篇文獻或者代碼嗎


訓練時有了GMM-UBM,有了T矩陣,測試時就對enrollment和test的MFCC提取高斯超矢量M;然後根據M = m + Tw,得到w,也就是屬於enrollment和test的i-vector;接下來就可以做分類了。

得到i-vector,那接下來就用PLDA或者cos作為後端分類器就好了,這個在kaldi的SRE10里有腳本。

如果想要在提取i-vector過程中使用到DNN,那就是藉助語音識別的辦法,訓練DNN模型;然後以DNN的輸出節點數作為UBM的高斯數。這個在SRE10-v2里有,不過這整套工程跑起來挺費時。

如果把DNN作為後端分類,也不是不行,就是把整個流程搞得太長了:得到i-vector之後,每次直接把單句話的iv輸入進去,輸入節點數等於iv維度;集內有多少個SPK,輸出節點就有多少維,標籤就有多少維;每個SPK的標籤都保持one-hot;訓練階段用softmax或者cross entroy;這樣就可以完成集內的識別。當然這方法有幾個弊端,一是集內二是基於ivector。

如果要做識別,當然還有更暴力的方法,脫掉UBM T矩陣 ivector那一套,如果數據量夠多的話,直接用MFCC輸入DNN作識別就OK了,參考d-vector方法;不過dvector辦法還是有弊端。同樣,做二分類確認,也可以直接用DNN解決,只是還有些trick。


對@yichi 的回答稍微補充一點, 對於 1:N 識別的話,最簡單的就是對註冊集的每一個人的ivector特徵取平均,直接作為這個人的model, 然後測試的時候直接計算cos距離就好了,取top1作為識別結果(親測比gmm-ubm效果要好一點,可以直接yichi提到的sre10/v1中的腳本提)。 同理的可以lda之後再這麼做。 如果數據足夠多的話,可以用ivector特徵再用簡單的dnn模型訓或者svm,random forest, 當然,一般註冊集每個人就幾句話,所以一般可以不考慮這種做法, 還有就是如果新註冊一個說話人,難道你要重新訓一遍模型?


謝邀。

首先,你應該採用的是i-vector說話人識別技術路線對吧,這方面論文不少,搜關鍵字即可。

對測試語音,同樣提取mfcc-&>提取i-vector,然後進行打分,打分的方法有cosine, LDA, PLDA,其中PLDA的效果是最好的,但是需要數據去訓練獲得參數。

代碼的話,推薦kaldi里的sre10/v1,裡面有全套的i-vector/PLDA說話人識別系統流程。

i-vector和DNN的配合?請問這個你指的是什麼,我不是太明白。。


謝邀。

上面的回答已經比較詳細了。如果你已經有了i-vector,那麼後端就需要分類器或打分的演算法了。一般還是GPLDA或Cosine Distance。你也可以自行設計一個neural networks去做這個打分或分類。

另外補充一點的是,聲紋裡面有identification和verification之分的。你所提的問題是identification的。


最近看到一篇台灣大學在ICASSP2017上的文章,用的ivector+autoencoders(用DNN實現),說白了就是用DNN代替了PLDA的工作(後端換為NN的文章真心不多,大部分都是用NN做特徵提取或者直接end-to-end)。


推薦閱讀:

讓機器聽懂人類語言,主流麥克風陣列技術解讀
AI(I)語音(I):MFCC特徵參數提取
如何在國內學習Amazon Echo的成功經驗?
信號處理需要什麼電路的知識?

TAG:自然語言處理 | 語音識別 | 中文語音識別 | 數字信號處理 | 聲紋識別 |