DHMM 是 Discrete Hidden Markov Model 的簡稱,對語音辨識的應用而言,我們的目標,就是事先使用大量語料,對每一個辨識語句建立一個 DHMM,然後當我們取得使用者輸入的測試語句後,即對測試語句進行端點偵測及 MFCC 特徵擷取,然後再將 MFCC 送至各個辨識語句所形成的 DHMM,算出每一個模型的機率值,機率值最大的 DHMM,所對應的辨識語句就是此系統的辨識結果。

為方便說明,我們假設我們的目標示要建立一個 0 ~ 9 的數字語音辨識系統,建立流程可以分成兩大步驟:

  1. 收集語料:由於我們的目標是語者無關的語音辨識,所以我們所收集的語料要盡量涵蓋各種可能的變化,例如:
    • 錄音的人:各種不同的人,包含男女老少、高矮胖瘦等,以及各種南腔北調。
    • 錄音裝置:取用不同的裝置,例如不同的麥克風、不同的音效卡等。
    • 周遭環境:除了要在安靜的辦公室進行錄音外,也可以在吵雜的環境錄音,以增強語音辨識系統對於雜訊的抵抗力。
  2. 辨識系統的設計和測試:這也是我們下面的重點。
在進行 DHMM 的設計時,我們必須對每一個數字建立一個 HMM 模型,以數字「」的發音為例,相關的 HMM 模型可以圖示如下:
換句話說,我可以把「九」的發音切分成三個「狀態」(States),分別是代表 ㄐ、ㄧ、ㄡ 的發音,每一個狀態可以包含好幾個音框,而每一個音框隸屬於一個狀態的程度,是用一個機率值來表示,稱為「狀態機率」(State Probability)。此外,當一個新的音框進來時,我們可以將此音框留在目前的狀態,也可以將此音框送到下一個狀態,這些行為模式也都是用機率來表示,統稱為「轉移機率」(Transition Probability),其中我們使用「自轉移機率」(Self-transition Probability)來代表新音框留在目前狀態的機率,而用「次轉移機率」(Next-transition Probability)來代表新的音框跳到下一個狀態的機率。

由於每一個音框都會轉成一個語音特徵向量,我們首先使用 VQ 來將這些特徵向量轉成符號(Symbols),換句話說,每一個音框所對應的 VQ 群聚的索引值(Index),即是此音框的符號。若以數學來表示,k = O(i) 即代表 frame i 被分到 cluster k。

為了簡化討論,首先我們定義一些常用的數量:

HMM 的參數,就是指「狀態機率」和「轉移機率」,說明如下:

假設我們已經知道「九」的 HMM 所包含相關的參數 A 和 B,此時當我們錄音得到一段語音,我們如何算出來此語音隸屬於「九」的機率或程度?換句話說,我們如何將每個音框分配到各個狀態之中,使得我們能夠得到整段語音最高的機率值?最常用的方法稱為 Viterbi Decoding,這是根基於「動態規劃」(Dynamic Programming)的方法,可用數學符號定義如下:
  1. 目標函數:定義 D(i, j) 是 t(1:i) 和 r(1:j) 之間的最大的機率,t(1:i) 是前 i 個音框的特徵向量所成的矩陣,r(1:j) 則是由前 j 個狀態所形成的 DHMM,對應的最佳路徑是由 (1, 1) 走到 (i, j)。
  2. 遞迴關係:D(i, j) = B(O(i), j) + max{D(i-1, j)+A(j, j), D(i-1, j-1)+A(j-1, j)}
  3. 端點條件:D(1, j) = p(1, j) + B(O(1), j), j = 1 ~ stateNum
  4. 最後答案:D(m, n)
示意圖如下:
請特別注意,在上述數學式中,我們所用的所有機率都是「對數機率」(Log Probabilities),所以原來必須連乘的數學方程式,都變成了連加,具有下列好處: 假設轉移機率 A 和狀態機率 B 已知,那麼經由 Viterbi Decoding,我們可以找到最佳路徑(即是最佳分配方式),使整段路徑的機率值為最大,此機率值及代表輸入語音隸屬於此 DHMM 的機率,若是機率越高,代表此輸入語音越可能是「九」。

有關於 B(O(i),j)的定義,都是「音框 i 隸屬於狀態 j 的機率」,但是在 DHMM 和 CHMM 的算法差異很大,說明如下:

但是,如何經由大量語料來估測每個 HMM 模型的最佳參數值 A 和 B 呢?首先,我們必須先定義什麼是「最佳參數」:對某一個特定模型而言,最佳參數值 A 和 B 應能使語料產生最大的對數機率總和。這個定義和 MLE 完全相同,也非常合理。

計算最佳參數的方法,稱為 Re-estimation,其原理非常類似 batch k-means (Forgy's method) 的方法,先猜 A 和 B 的值,再反覆進行 Viterbi Decoding,然後再重新估算 A 和 B 的值,如此反覆計算,我們可以證明在疊代過程中,機率總和會一路遞增,直到逼近最佳值。(但是,就如同 k-means Clustering,我們並無法證明所得到的機率值是 Global Maximum,因此在訓練的過程中,可以使用不同的啟始參數,看看是否在反覆疊代後,能夠得到更好的機率總和。)求取參數的方法說明如下:

  1. 將所有的訓練語句切出音框,並將每一個音框轉成語音特徵向量,例如 39 維的 MFCC。
  2. 對所有語音特徵向量進行VQ,找出每一個向量所對應的 symbol(此即為對應的中心點或codeword)
  3. 先猜一組 A 和 B 的啟始值。如果沒有人工的標示資料,我們可以使用簡單的「均分法」,示意圖如下:
  4. 反覆進行下列兩步驟,直到收斂
    • Viterbi decoding:在 A 和 B 固定的情況下,利用 Viterbi decoding,找出 n 句「九」的語料所對應的 n 條最佳路徑。
    • Re-estimation:利用這 n 條最佳路徑,重新估算 A 和 B。
估算 A 的方法,可由下列示意圖說明:
估算 B 的方法,可由下列示意圖說明:
如果我們使用 D(i,j) 代表音框i屬於狀態j的機率,則 D(i,j) = B(O(i),j),針對上述範例中的一條路徑,我們可以得到:

假設我們的目標函數可以寫成 P(A, B, Path),則上述求參數的方法會讓 P(A, B, Path)逐次遞增,直到收斂,因為:

  1. 在 A, B 固定時,Viterbi decoding 會找出最佳的路徑,使 P(A, B, Path) 有最大值
  2. 在路徑(Path)固定時,Re-estimation 會找出最佳的 A, B 值以使 P(A, B, Path)有最大值
上述第一點是無庸置疑,因為 Viterbi Decoding 會使每一條路徑的機率值為最大,因此其總和 P(A, B, Path) 也是最大。至於第二點的證明,也是非常直覺,可以說明如下。

以上述範例而言,此條路徑的總機率可以拆解成在三個 state 中的機率:

對於 N 條路徑而言,所得到的總機率就是這 N 條路徑的機率乘積。因此若要求 A 和 B 的最佳值,我們必須同時考慮這 N 條路徑。

以下將求取 A 和 B 的最佳值。對任一個 state 而言,假設共有 a+b 個音框屬於這個 state,其中

則我們可以形成下列最佳化問題:
Max J(p, q) = pa qb s.t. p≧0, q≧, and p + q = 1
由於算數平均數大於或等於幾何平均數:
x1 + x2 + ... + xn ≧ n (x1 x2 ... xn)1/n
同時上述等式,只發生在 x1 = x2 = ... = xn。利用此不等式,我們可以得到
p/a + p/a + ... + q/b + q/b ... ≧ (a + b) [(p/a)a(q/b)b]1/(a+b)
1 ≧ (a + b) [(p/a)a(q/b)b]1/(a+b)
因此 J(p, q) = pa qb 的最大值是 aabb/(a+b)a+b,此最大值發生在 p/a = q/b,也就是 p=a/(a+b), q=b/(a+b)。

對任一個 state 而言,假設這個 state 內的音框只屬於三個 cluster,機率分別是 p, q, r:

則我們可以形成下列最佳化問題:
J(p, q, r) = pa qb rc
其中 p, q, r 必須滿足 p + q + r = 1。同理,利用算數平均數大於或等於幾何平均數,我們可得到最佳參數值 p=a/(a+b+c), q=b/(a+b+c) , r=c/(a+b+c)。

本章節說明,請參考下列投影片:


Data Clustering and Pattern Recognition (資料分群與樣式辨認)