Vector Quantization Based Speaker Recognition
B97902079 資工三 林哲毅 (一) 動機
我個人還蠻喜歡跟安全性有關的議題,現在有指紋辨識或虹膜辨識之類的。
在語音方面就有像指紋一樣的「聲音指紋」來做為辨識,剛好第九章投影片有稍 微提到 Speaker Recognition,所以我就稍微查了一下資料有 HMM-Base Methods , VQ-Based Methods,Gaussian-Based Model 然後文獻說 VQ 的效果比較好,所以就 找了好幾篇 Paper 來研究。
(二) 簡介 – 什麼是 Speaker Recognition
Speaker Recognition簡單來說就是,辨別這句話是「誰」說的。這個問題可以 分成兩個問題,一個是Speaker identification跟 Speaker verification,其中這兩 個有些微的差距,Verification就是說一個人聲稱他是A,然後我們就看我們的資 料庫來決定他真的是A還是不是。而Identification,則是搜尋在資料庫中與測試 的聲音最相近的,其實這個問題也差不多就是Verification,只是Verification是取 一個值X,然後從Identification中找到最相近的資料(假設是A)之後,我們可以看 看他們的距離,如果大於這個X就說他不是A(假設他聲稱他是A) 。
其中Recognition也可以分成兩種類別,一種是text-dependent跟
text-independent,其中text-dependent就是使用者要講特定的詞語,這樣比較容 易做training-model但是安全性比較低。text-independent,則是不用特定的詞彙,
但要能抓到說話者的聲音特質。
Speaker identification中text-independent的常使用的方法有Vector
Quantization,Gaussian Mixture Speaker Model 或 HMM(但在Training data 小的時候VQ會比GMM (Gaussian Mixture Model)或HMM(Hidden Markov Model)來的好) 。Identification的流程簡單如下
1. 抓取 Feature
2. 比對 Feature 與資料庫中的資料 3. 找到最相近的
簡單的流程圖(Digital Signal Processing Mini-Project: An Automatic Speaker
Recognition System)
接下來因為上課講過 MFCC 以及 k-means 之類的演算法,所以我再閱讀這些 paper 時,把重點著重於向量比較,也就給一個未知的聲音,轉成 MFCC 之後 是如何找最相近的 codebook 呢?其餘的則簡單的帶過。
(三) 特徵擷取 – MFCC
MFCC 簡單的流程如下:
(來源:課本投影片)
(四) 分群 – Codebook
在 Vector Quantization 的分群方面我們可以使用像是 k-means 或 LBG 之 類的分群演算法,將相近的向量組成一個集合,這樣我們可以用這些集合裡 面的資料來代表一段聲音的所有 MFCC 資料,這樣我們可以簡化搜尋所有 向量的複雜度
這邊是一個簡單的示意圖,假設原來有 n 個 MFCC 向量現在因為有些資料很相近,
(圖中的白球)所以我們用分群演算法將 他們分在一群,然後用一個黑球(他們的 平均)來表示,這些黑球形成了一本本的 codebook
(五) 向量比較
(a) 相似度(similarity measure)
現在我們有一堆資料的向量也就是 VQ codebook(下面假設他的數量為 N 也就是 C = {C1,C2,……CN})我們要找到一筆 VQ codebook 讓他與資料最 相似。要怎麼找最相似呢?簡單的想法就是比較兩個向量(也就是 testing vector 跟某個 codebook)的相似程度最高。要算相似程度我們先假設 testing data 的向量是 X = {X1,X2,……,XM}現在通過下面這個算式,我們可以快速 的算出最相近的 codebook,在 paper 中,稱下面的數值為 similarity measure(相似度)。
∑
其中的 𝑚 𝑛 就是距離方程式,其實只要符合老師上課說的幾個原則就 行了,簡單起見我們可以用 Euclidean distance 這述式子的意思就是從 Codebook Ci 中離 Xj 這個向量最近的向量,將他最近的向量的距離倒數加起 來(一共有 m 個)取平均。最後再從這 i 個 Codebook 中取出最大的 Ci 就是離 它最近的結果了。(取最大的是因為有倒數的關西,所以越不相近的兩個向量 d()會越大,1/d()就越小,s()也會越小)
(b) weighted function
但是這其實不是一個很好的演算法,PAPER 中有提到一個改進的方法,
那就是在這個方程式後面再乘一個 w()也就是 weighted function,如下面式 子所示:
∑
接下來講解一下這個 w()是怎麼算出來的,簡單來說就是將每一個 Codebook 中的每一個向量都拿出來(假設是 cij,第 i 個 Codebook,第 j 個 向量),然後去對除了第 i 個 Codebook 以外的其他 N 個 Codebook 找這些 Codebook 中,距離 cij 最近的向量;把這些向量(一共是 N-1 個)的倒數全部 加起來,再做一次倒數就會得到 w(cij)的值了。
Paper 中提供的 SUDO CODE 改寫之後如下:
for(int i = 0;i < C.size();i++){ //C[i]是代表第i本 Codebook
for (int j = 0;j < C.at(i).size();j++){ //C[i][j]是代表第j個向量 double sum = 0;
for (int k = 0;k < C.size();k++){ //除了i以外其他的Codebook if (k == i)
continue;
else // C[i][j]到C[k]中最近的距離 sum += 1/DistanceToNearest(C[i][j],C[k])
}
w[i][j] = 1/sum;
} }
雖然Paper中沒有詳細講解這個weighted function的來源,不過他的核 心概念就是,我們發現距離別的codebook比較遠的向量,也就是比較不相 似的向量,我們可以給他比較高的分數,因為這些向量表示著人的聲音特質,
所以權重比較重,比較能夠突現這些向量(權重比較重的)的重要性。(舉一個 例子來說:有一個向量a跟一個向量b,a到codebook A 的距離是10到B的 也是10,b到codebook A 的距離是2到B的也是2,a的weight就是5,b的 weight則是1,凸顯a是比較獨特的向量,我們應該要重視他)
(c) 類似的相似度算法
不同的方法會倒致不同的結果,準確率也不一樣,接下來簡單介紹另一 個相似度的求法,並和上面那個做比較
∑
𝑚 𝑛
上述的式子其實就是之前介紹的方法倒過來來的想法,現在我們不 要從未知的 codebook X 來看,而從已知的 Model 來做比較,在已 知的 Model k{ }中,拿出一個 ,然後去比對 codebook X 中最相近的向量,最後再乘以他們之間的權重(跟上面的算法類似,
只是不算自己跟其他 Model 了,改算自己跟 X 所的向量的距離) 示意圖如下:
經過 paper 的實驗結果:
(註: 是我比較早介紹的方法,可以看出 比 平均來說,略好一點點)
(d) FKVQ–Based 和 Model 2-base Discriminative Weighted FKVQ
這邊是另外一種求相似程度,他也是建立在與上面類似的想法上,不過 他比上述的方法複雜許多,但簡而言之就是換成 Gaussian Kernel 的做法,
基本概念還是一樣的,這邊稱之為 FKVQ (Fuzzy Kernel Vector Quantization)他的算法如下
X 𝐶 W 𝐶 𝐶𝑘 𝑀∑
𝑚 𝑛 𝑥 𝐶 𝑊 𝑖 𝑘
其中 𝑚 𝑛 𝑥 𝐶 𝑊 𝑖 𝑘 是距離加上weight的方程式(假設𝐶一共有T個向 量,𝐶 𝑙表示第i本codebook的第𝑙個向量)
先介紹這邊的距離的算法與weighted function的求法
𝐾(𝑥 𝐶 𝑙) K(𝑥 𝑥) − 2K(𝑥 𝐶 𝑙) + K 𝐶 𝑙 𝐶 𝑙 K 𝑎 𝑏 𝑒−‖𝑎 𝑏‖
2
𝜎2 𝜎 idth of Gaussian kernel
這邊的 𝐾(𝑥 𝐶 𝑙)有別於之前的尤拉距離,而是用Gaussian Kernel的距離 來表示(類似於 𝑥 − 𝑦 𝑥 − 2𝑥𝑦 + 𝑦 )
weighted function
𝑘 𝐶 𝑙 𝐾 𝐶 𝑙 𝑌𝑘
∑𝑙 𝐾 𝐶 𝑙 𝑌𝑘
𝑌𝑘指的是,在第k本codebook中離𝐶 𝑙最近的一個向量,其中∑𝑙 𝑘 𝐶 𝑙
= 1
這邊的概念是對於第i本codebook中的所有向量,我們去找codebook k 中距離最近的來當他們的weight,這邊主要是為了更進一步的去區分i 跟k之間的關係,以達到更高的準確率。
有了上面兩個式子之後,我們可以定義最近距離的方程式:
𝑚 𝑛 𝑥 𝐶 𝑊 𝑖 𝑘 ∑[ 𝑘 𝐶 𝑙 𝐾 𝑥 𝐶 𝑙 ]
𝑙
這個方法最後跟之前有些微的不同,下面以SUDO CODE講解
先做S(X, 𝐶 , 𝑊 𝐶 𝐶 ))與S(X, 𝐶 , 𝑊 𝐶 𝐶 )),兩者中比較大的值把索引 記下來做o(如果S(X, 𝐶 , 𝑊 𝐶 𝐶 ))比較大,o = 1)
For i = 2 to N
比較S(X, 𝐶, 𝑊 𝐶 𝐶𝑜))與S(X, 𝐶𝑜, 𝑊 𝐶 𝐶𝑜))的大小,比較大的值把索引 寫入o
最後的n即是最佳答案了。
這種做法的好處是多比較了一次之前最佳解的codebook跟目前的 codebook,達到一個比較好的效果。
(註:M2B-DWFKVQ是使用上述演算法的錯誤率,FKVQ則是不比較兩個model直 接找所有裡面最好的錯誤率,可以看出M2B-DWFKVQ錯誤率較低,結果比較好)
(六) 結論
一個VQ比較,就有這麼多演算法,為了就是求得最佳的解,不斷的有新的演 算法來算這個問題,核心概念都是一樣的,就是為了要找到testing data與 training data最近似的類別,不同距離的算法跟重量,也會影響到最後的結果。
(七) 參考資料(讀的paper)
“Improved Weighted Matching for Speaker Recognition” ,Ozan Mut, Mehmet Göktürk, World Academy of Science, Engineering and Technology 11 2005
“Improved Speaker Identification Algorithm based on Discriminative Weighted Method”, Li Shaomei,Guo Yunfei, Liu Lixiong, 2009 IEEE
“Speaker Discriminative Weighting Method for VQ-based Speaker identification”, Tomi Kinnunen and Pasi Fränti
“A Vector Quantization Approach to Speaker Recognition”, F. K. Soong,A. E.
Rosenberg,L. R. Rabiner,B. H. Juang, 1985 IEEE,CH2