1. 程式人生 > >基於深度神經網路特徵提取的文字無關的說話人識別

基於深度神經網路特徵提取的文字無關的說話人識別

對文章“Deep neural network embeddings for text-independent speaker verification” 的解讀。

1. 概要

  在實際應用中,往往被測試者或被驗證者的語音長度相對較短,若使用傳統的PLDA/ivector模型效果會相對一般(這一點會在結果中體現出來)。神經網路具有極強的特徵提取能力,所以這篇文章提出了使用TDNN提取語音的embeddings,然後再基於一個PLDA backend 對embeddings進行相似度打分。

2. 實現

   2.1 訓練思路

  階段一(對神經網路的訓練):

  訓練的神經網路結構如圖所示,pooling層之前的結構是TDNN,TDNN總的輸入是一段語音,每次TDNN取固定幀數,這個原理會在深度學習TDNN的介紹裡詳細說。然後pooling層把每個TDNN的輸出向量積累下來後,計算均值和標準差作為pooling層的輸出。pooling層之後接著兩層全向連線層最後加一個softmax層為輸出。輸出的神經元個數和我們訓練集中說話人個數保持一致。可以看到圖中所寫,輸出是一個後驗概率。這樣設計的好處就是,我們可以處理時長不同的語音。

  訓練用損失函式為交叉熵:

  其中 n代表要輸入的語音(segment),k代表各個說話人, 是輸入segment n後,由softmax層給出的它屬於各個說話人的後驗概率。只有當segment n 的標記(說話人)是k時才等於1,否則為0。觀察公式,靠裡的求和其實只有一項,靠外是對所有(或者是一個bash)內的語音的求和。

  眾所周知,神經網路並不僅僅是一個分類器,而是一個特徵提取器和分類器的結合,每一層都有極強的特徵提取能力。所以我們要高度利用神經網路的這種能力,因此我們把softmax層之前的兩層用來作為這段語音的embeddings(可以理解為特徵向量)。

 階段二:

去掉已經訓練好的神經網路的softmax層,之前已經說過,我們僅僅需要它的特徵抽象能力。利用剩餘結構為我們匯出每段語音的embeddings。之後就是利用這些embeddings訓練PLDA模型。和經典的PLDA/ivector相比較,文章提出的方法區別僅僅在於對語音特徵向量提取的方法,提取出特徵向量後(無論是ivector還是xvector)其餘步驟都是一樣的。

 2.2 細節

特徵處理:這篇文章裡餵給神經網路的特徵是20維MFCC特徵,幀長是25ms,幀移沒有提(一般是幀長的一般10ms左右)。在3s內特徵還需要做一個歸一化,我個人認為是為了減弱聲音強度對特徵能量的影響。

PLDA歸一化:一是在進入PLDA模型打分前,需要對embeddings做length normalization(研究了下但是沒看懂怎麼弄,我的感覺是對原始向量的一種投影,減弱其非高斯表現);二是PLDA打分後得分的歸一化,用的是adaptive s-norm,本質是一種test-norm,這裡不再贅述。

3.  結果及結論

從圖中能看出我們提取了兩個embeddings,分別是a,b。所以我們主要討論embeddings的使用對結果的影響,還有就是我們的訓練是基於sre2010的,都是英文,單獨還測試了這個模型對廣東話和tagalog的效果。結果如下:

(fusion指的是對embeddings和ivector的PLDA打分的等加權融合;10s-10s:指的是註冊語音10s,測試10s,其餘列都是註冊語音full length,測試的分別為5s-full的變化)

 結論:1. 測試語音比較長時,ivector的優勢比較明顯;2測試語音在5-20s時,dnn效果較好;3. embedding的綜合要比只用單個embedding好;4. dnn對out of domain 的效果優於ivector