從語音識別的HMM模型的解碼 到Viterbi算法的Token Passing實現

1 從語音識別說起

語音識別是什麼,通俗來說,就是輸入音頻,輸出識別文字結果。基本方程如下
這裏寫圖片描述
這裏寫圖片描述: 識別結果
W:任一單詞(以孤立詞舉例說明)
O:輸入的語音序列(Observation Sequence)

上述方程的變換應用了Bayes Rule.

等式右邊是兩項乘積,P(W)來自語言模型(Language Model, LM), 常用的模型有 N-gram。 P(O | W)來自於聲學模型(Acoustic Model, AM),傳統的語音識別系統普遍採用的是基於GMM-HMM的聲學模型,其中GMM用於對語音聲學特徵的分佈進行建模,HMM則用於對語音信號的時序性進行建模。具體介紹網上有很多通俗易懂的文章,這裏暫不贅述。本文重點講解聲學模型中的解碼問題,暫不涉及語言模型。

2 計算P(O | W) —— 解碼

P(O | W)可以繼續分解如下
P(O | W) = P(A, O | W) 這裏寫圖片描述
其中A表示狀態序列,O表示觀測序列,a表示轉移概率,b表示觀測概率
這裏寫圖片描述

如圖,上方是狀態序列(state sequence)(HMM),下方是觀測序列(observation sequence)。我們看到,states之間存在不同的轉移方式,每個state針對observation也有不同generate方式。可以想象,通過組合,我們可以得到一個巨大的狀態網絡。而我們語音識別的任務,通俗來說就是從這個巨大的狀態網絡中搜索到最佳路徑(partial path),也就是最大概率的路徑,對應上面公式的argmax。這個搜索匹配的過程在語音識別中叫做解碼(decode)。在衆多路徑中找到最佳路徑,一種暴力方法是窮舉,但是計算量大到不現實。目前應用的主流方法是Viterbi算法。

3 Viterbi算法

Viterbi算法的基礎概括成下面三點:

  1. 如果概率最大的路徑P(或者說是最短路徑)經過某點a,那麼這條路徑上從起始點s到a的這一段子路徑一定是s到a之間的最短路徑。否則用s到a的最短路徑來替換上述路徑,便構成了一條比P更短的路徑,矛盾。
  2. 從S到E的路徑必定經過第i時刻的某個狀態,假定第i時刻有k個狀態,那麼如果記錄了從S到第i個狀態的所有k個節點的最短路徑,最終的最短路徑必經過其中的一條。這樣,在任何時刻,只需要考慮非常有限條最短路徑即可。
  3. 結合上述兩點,假定當我們從狀態i進入狀態i+1時,從S到狀態i上各個節點的最短路徑已經找到,並且記錄在這些節點上,那麼在計算從起點S到前一個狀態i所有的k個結點的最短路徑,以及從這k個節點到Xi+1,j的距離即可。

    這裏寫圖片描述

上圖是一個簡單的四個狀態HMM應用Viterbi算法的例子。
Viterbi算法的思想是典型的動態規劃思想。動態規劃相對窮舉已經大大減少了計算量,然而面對巨大的網絡,我們意識到還是有很多不必要的計算。有些路徑的計算過程中概率已經很小,完全偏離了我們要的最佳路徑,繼續計算這樣的路徑顯然是沒有必要的。這個時候就需要剪枝(pruning),剪枝的Viterbi算法其中一個實現叫做Token Passing,著名的語音識別工具箱HTK的解碼部分應用的就是這一概念模型。

4 Token Passing Approach

4.1 概念模型

假設每一個HMM的state可以保存一個或多個Token。Token是一個概念上的對象object,它可以在state之間進行傳遞,一般都是按照箭頭指向的方向,所以也叫前傳(propagate)。每一個Token攜帶着它所經過路徑的打分score,這個分值一般是log量級的概率和(因爲我們要找的是最大概率路徑嘛,也就是最高分的路徑。)Token的傳遞是以觀測序列的generate爲節拍進行。
你可以想象每一條路徑都是一條貪吃蛇,token就是蛇的頭部的那一節,身體部分就是他所經過的state路徑。算法過程大致如下:

初始化(t=0):
    初始state(入口處)的Token的s=0
    其他state的Token的s=-inf
執行過程(t>0):
    複製若干數目Token,並將其傳遞至所有與該state連接的其他state中,並且對其值做如下操作:  
    在每個state中,比較所有token,留下分值最高的token,拋棄其他所有token(Viterbi剪枝過程)
終態(t=T):
    比較所有終態(final state)的Token,保留其中分數最高的token

該token對應的就是最佳路徑的概率。

這裏寫圖片描述

上圖是一個Token Passing示意圖,過段時間我計劃做一個flash或者錄一個小視頻來更直觀的演示這個過程。

4.2 孤立詞識別(Isolated Word Recognition)

將Token Passing的思想應用到語音識別的解碼過程中,我們首先從孤立詞識別引入。一個英文單詞音頻一般分爲三個音素,而一個音素又可以分爲若干個狀態,這些層級展開一個網絡。他們之間的跳轉符合隱馬爾假設,所以可以應用Viterbi算法進行搜索解碼。
單詞級的HMM和音素級的HMM都可以直接套用上文的Token Passing模型,實現如下。
這裏寫圖片描述
這裏寫圖片描述

通過這一過程,我們對每一個單詞都建立了一個HMM model,爲後面的連續詞識別奠定了基礎。

4.3 連續識別(Connected Word Recognition 或 Continuous Speech Recognition)

連續識別的主要問題在於:

① 音頻中詞與詞之間的分界線(boundary)不明確
② 音頻序列中總的單詞數目不能確定

應用Token Passing模型,我們可以以上文的孤立詞識別爲基礎,將不同的孤立詞模型組合成一個網絡,構成複合的語句級別的HMM模型(sentence model),並進行下圖所示的抽象。在interface右邊是上文提到的孤立詞級別的模式匹配模型,在interface右邊是語句級別的連續識別匹配,這時候我們就可以不用關注單詞級別的具體實現。

這裏寫圖片描述

具體識別過程,即在上文提到的語句級複合HMM中繼續應用Token Passing模型(因爲我們的目標和之前一樣,還是尋找最佳路徑)。

這裏寫圖片描述

此外,在連續詞識別中,我們還需要對基礎的Token Passing進行一些擴展。爲了能夠準確的記錄我們識別出的句子所包含的單詞,我們引入一個新的概念Word Link Record(WLR). 顧名思義,這是一條記錄,裏面存放着記錄word link的指針。Token除了攜帶score信息,還要攜帶一個path identifier來記錄上一個WLR。
在C/C++中,token的數據結構大概會是:

struct Token{
    double score;
    struct WRL *path_id;      
    }

在上面的Token Passing基礎算法中,我們新增如下過程:

在時間 t ,對每一個完成單詞級識別的token(從小網絡傳遞到大網絡) do:
    創建一個新的WLR
    WLR包含 <token內容(最大概率), 時間t, 記錄路徑的path id, 剛剛完成識別的單詞model id>
    將token中的path id指向剛剛創建的這條新的WLR
end

這裏寫圖片描述

如圖所示,WLR構成的鏈表結構,記錄了所有潛在的boundary信息。例如,t-3時刻很可能是單詞two的結尾。
當到達T時刻整個句子識別結束後,我們再通過比較,得到得分最高的token,然後通過該token的path id以及WLR的鏈表結構可以輕鬆的回溯得出識別結果。

5 總結

以上就是應用Token Passing模型實現Viterbi算法的具體過程,該模型通俗易懂,有效的解決了連續詞識別的問題。泛化能力強,實際上One Pass、Level Building等經典算法都可以看做Token Passing的特殊情況。且易於擴展,譬如我們可以通過保留多個token來評比多條路徑(N-best)以提升識別效果。
本文爲了做到儘量通俗,有諸多不嚴謹之處,歡迎批評指正。

Reference:
[1] Young S J, Russell N H, Thornton J H S. Token passing: a simple conceptual model for connected speech recognition systems[M]. Cambridge, UK: Cambridge University Engineering Department, 1989.
[2] Young S, Evermann G, Gales M, et al. The HTK book[J]. Cambridge university engineering department, 2002, 3: 175.
[3] University of Cambridge Engineering Part IIB & EIST Part II Module 4F11: Speech Processing Lecture 11: Continuous Speech Recognition
[4] SGN-24006 Analysis of Audio, Speech and Music Signals lec09
[5] speech.zone

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章