語音識別的研究歷史悠久,出現了許多著名的算法和工具。從事語音算法工作兩年期間,我在語音識別方向做了一點工作,對此有一些體會。面對諸多的算法如何學習掌握呢?我認為一個不錯的方法是歸納不同算法的異同,形成體系。由于個人的知識有限,這里說的歸納也是不完全的歸納。但我相信,隨著知識面不斷拓展,個人的認知會逐漸從偏到全。
本文主要討論如何從 ASR 的原始的優化目標出發,以一個較為統一的視角看待傳統 ASR 算法和端到端 ASR 算法,各類算法的具體實現和訓練優化留到以后文章再討論。現代成熟的語音識別系統包含音頻采集、前處理、識別、后處理等模塊,本文關注的也僅僅是識別模塊。
語音識別 pipeline, 本文關注點在于 ASR Model
本文目錄
1. 語音識別問題形式化
2. 傳統 ASR 算法原理
2.1 動態展開的解碼
2.2 引入 WFST 的靜態圖解碼
2.3 聲學模型
2.3.1 基于 HMM 的聲學模型
2.3.2 基于 CTC 的聲學模型
2.4 語言模型
3. 端到端 ASR 算法原理
3.1 CTC-based E2E Models
3.2 RNN-Transducer、RNA、Neural Transducer 等
3.3 Attention-based E2E Models
3.4 引入了 WFST 的端到端算法
3.5 拓展思考
4. 總結
5. 參考資料
1. 語音識別問題形式化
語音識別可以看做是語音內容理解的一個子任務,目的是獲取一段語音中包含的文本內容。可以這樣定義語音識別:根據特征幀序列,窮舉所有可能的 Token 序列, 獲取后驗概率最大的序列, 即
我們常會以 字(Char) 或 詞(word)來作為 Token,此時表示字序列或詞序列,表示所有可能的 Token 序列。
語音識別也可以看成是一個搜索任務,搜索的排序準則是序列后驗概率最大,這樣一個搜索過程我們稱之為 ASR 的解碼。
2. 傳統 ASR 算法原理
傳統 ASR 算法基于 Bayes 法則,將后驗概率的求解分解成先驗概率和修正系數(似然概率)的形式,從而將 ASR 系統模塊化,并且引入了 WFST 來簡化各模塊的實現。
根據 Bayes 公式,
而求最優 過程與 無關,因此有
在傳統 ASR 算法中, 建模似然概率 的模型稱為聲學模型,先驗概率 則由語言模型建模。為了讓系統更加模塊化,可以進一步細化建模單元為音節/音素。此時需要增加詞典模型來建模 ,優化目標轉化為:
其中 表示序列 的所有可能發音序列。在工程實現上,我們可以用最大概率的一個發音序列來近似上式,并取 log,即
2.1 動態展開的解碼
上式的一種窮舉方法是分步驟求解,對于每個序列 ,根據語言模型求 ,然后根據詞典模型求最大概率的序列 的得分 ,再聲學模型得到該發音序列 的聲學得分 ,匯總得分后取得分最高的一個序列即為 。
另一種窮舉方式是遍歷每一個發音序列 ,先根據聲學模型計算聲學得分 ,然后獲取發音對應的 Token 序列與得分 ,最后每個序列得分 。
我們剛才說到,這里聲學模型的建模單元是發音,因此也相當于額外假設了每一幀輸入 可以描述一個發音 ,但是對于每一個Token ,需要多幀 才能描述,并且每個人再說同一個字詞的時候語速都不一樣,因此這個長度 無法確定,第一種窮舉方式在連續語音識別實現起來過于復雜,幾乎是不可行的,只有在孤立詞、關鍵詞檢測等 長度固定、數量有限的任務里還可以考慮考慮這種方法。
在傳統 ASR 算法里用的是第二種窮舉方法。由于輸入序列 是按時間逐個輸入的,隨著 的不斷輸入,我們保留的中間結果也逐漸增多,相關的 序列不斷地進行樹狀擴展,因此這種遍歷方式可以稱之為動態展開的解碼。需要注意的是窮舉的方式,暴力窮舉的復雜度是指數級。幸好在 ASR 的解碼過程中,當前時刻的結果可以認為只和之前時刻相關,可以通過動態規劃的方式來窮舉,可以把時間復雜度降低到多項式級別。
2.2 引入 WFST 的靜態圖解碼
是否可以進一步簡化、優化上述的解碼過程呢?我們的前輩引入了一個相當高級的工具:加權有限狀態轉換機(Weighted Finite-State Transducer, WFST)[1]。我們把要優化的目標函數做一點修改,
可以看到, WFST 視角下的 ASR 是一個從輸入音頻特征幀序列 到詞序列 的一個轉換任務。ASR 系統中的每一個模塊可以用不同的 WFST 來表示,其信息可以編碼到 WFST 的跳轉弧上。聲學模型對應的 WFST 把聲學模型建模單元的 id 序列轉化為對應的發音序列 ,得分用跳轉弧權重表示 。詞典模型對應的 WFST 把發音單元 id 序列轉化為 Token 序列, 。語言模型對應的 WFST 主要編碼詞序列的語言得分, 。
之前說的幾個模塊動態展開的窮舉,通過 WFST 的合并操作(Compose)可以簡化為單一的 WFST 的靜態圖搜索,可以說在很大程度上簡化了 ASR 的解碼。同時,運用 WFST 的一些優化操作,可以優化搜索路徑,讓這個搜索過程效率更高。
實際上這里代表描述了聲學模型得分、聲學建模單元與發音之間的關聯,如果采用 HMM 聲學模型則,如果采用 CTC-based 聲學模型,則。其中和編碼的都只是聲學建模單元與發音之間的關聯。
那 中的聲學得分在哪呢?在解碼過程中, (在 kaldi 中以 Lattice 形式存儲)的跳轉弧權重包含兩個值,一個是預留的"聲學得分" acoustic_cost,由聲學模型計算并動態賦值。另一個是由詞典得分、語言得分經過 FST Compose 之后合并成了靜態的"圖得分" graph_cost。
2.3 聲學模型
2.3.1 基于 HMM 的聲學模型
目前 kaldi [14] 是采用隱馬爾可夫模型(HMM)[2] 來實現聲學模型,并且 kaldi 的聲學模型建模的是比音素更細粒度的單元,即 HMM 狀態。不同音素可以用不同的 HMM 來描述,每一個 HMM 都包含指定數量的狀態。采用 HMM 作為聲學模型,對于某一個觀測序列 ,其似然概率的計算方式為:
其中 表示 HMM 拓撲中所有可能的狀態序列, 表示以 為初始狀態的概率, 表示從狀態 到狀態 的轉移概率, 為狀態 發射概率。
此時 ASR 總的優化目標可以表示為
其中,狀態之間的跳轉關系通過 WFST 表示,也就是 ,初始概率、轉移概率以權重編碼在跳轉弧上,最終成為圖得分 graph_cost 的一部分。
我們通常看到的 GMM-HMM、DNN-HMM 里的 GMM、DNN 建模的是發射概率,解碼過程中動態賦值的也是發射概率(轉移概率等已經編碼成了圖得分了,這個設計很好地抽象出了聲學得分的接口)。其中 GMM 通直接過統計數據分布的方式建模,DNN 對狀態后驗概率 建模,并通過以下公式近似得到 HMM 發射概率
另外,在實現上,常常考慮發音單元的上下文關聯/協同發音,把建模的發音單元從上下文無關的單音素(Context-Independent Phoneme, CI-Phone),更改為上下文相關音素 (Context-Dependent Phoneme, CD-Phone),并增加一個上下文音素轉換為單音素的 WFST。
因此我們最常見的傳統 ASR 系統架構如下圖所示:
2.3.2 基于 CTC 的聲學模型
CTC 拓撲可以看作是一種特殊的 HMM 結構,不過由于其特殊性,這里單獨列出來討論。例如清華大學提出的 CTC-CRF 模型,建模直接為單音素 ,并且用一個 WFST 來描述音素、blank之間的跳轉關系。
CTC-CRF 中的 CTC 拓撲結構[4]
不同的 HMM,CTC 可以看作特殊的 HMM [5]
2.4 語言模型
ASR 中用到的語言模型在形式上較簡單,建模的是根據歷史 Token 預測下一個 Token 的概率。常用的有 RNN 語言模型和 n-gram 語言模型,建模方式分別為:
3. 端到端 ASR 算法原理
端到端 ASR 算法直接求解后驗概率
即:序列整體的后驗概率可以通過 Token 的后驗概率累積得到。但這里也做了簡化,假設當前 Token 只依賴于之前出現的 Token ,這個假設在我看來是合理的。
從這個觀點出發看不同的端到端算法。
3.1 CTC-based E2E 模型
基于 CTC [6] 的模型,通過引入 blank Token 實現軟對齊,并且假設每一幀之間的 Token 相互獨立,
序列 CAT 的所有可能的軟對齊路徑
可以得到:
其中 是將軟對齊序列轉換為最終序列的操作,包含去除相鄰重復 Token 和去除 blank, 是序列 的所有可能的對齊序列, 是其中一個序列。
上述是針對某一個已知序列 的后驗概率,但是在解碼的時候, 是待求解的未知量,求解的方法是先求最大概率的對齊序列 ,再轉換得到 。
3.2 RNN-Transducer、RNA、Neural Transducer 等
這里討論一下 RNNT 和CTC-based Models 的區別。
首先,RNNT 也包含軟對齊,但是它和 CTC-based Models 對齊的方式/topo 不同;
不同算法的軟對齊的狀態機表示[7]
其次,RNNT 引入了語言模型和一個 JointNet 用于融合聲學和語言得分,其解碼過程的計算可以寫作下式
式中的 t 是解碼過程中動態確定的,因為 RNNT 設計的解碼算法中,一幀輸入是可以對應多個輸出的。式中每一個 Token 的后驗概率計算過程為:先由 Encoder(聲學模型)、PredictorNet(語言模型)獨立計算得到聲學特征和語言特征:
最后由 JointNet 融合兩者得到最終結果
RNNT 通過 PreditorNet 和 JointNet 引入了 Token 之間的相關性,可以看到,RNNT 的優化目標和 ASR 最初的目標是很接近的,這也是它優于 CTC-based Models 的內在原因。
RNA、Neural Transducer 這兩種模型[8]是基于 RNNT 的:
- RNA 放棄不確定的 ,假設每一幀只輸出一個 Token 。
- Neural Transducer 則以特征幀序列 window 作為輸入,而不是一幀一幀輸入,每接受一個 window ,依然可以對應多個輸出。
3.3 Attention-based E2E Models
Attention-based 模型的常見架構為 Encoder-Decoder ,例如 LAS[9]、Transformer [10] 等。
Encoder 用于提取音頻的高層次特征
Decoder 有兩種不同的模式,自回歸(AutoRegressive)模式的根據高層特征和歷史輸出進行解碼
非自回歸(Non-AutoRegressive)的模型需要對 Encoder 的輸出做進一步處理得到初步結果,Decoder 大多只作為一個糾錯或重打分模塊,這里暫時不展開敘述。
我們看自回歸的解碼計算過程,可以歸納為
上式中,每一項 由 Decoder 直接建模,比 RNNT 更簡潔。這與我們描述的端到端 ASR 最初的優化目標如出一轍,因此我認為這一類模型在理論上最好地闡釋了“端到端”概念的。
However, unlike the RNN transducer, in which the encoder and the prediction network are modeled independently and combined in the joint network, an attention-based model uses a single decoder to produce a distribution over the labels conditioned on the full sequence of previous predictions and the acoustics.[11]
在具體實現上,Encoder,Decoder 可以采取不同的模型結構。LAS 模型采用了 BLSTM 實現 Encoder, LSTM 實現 Decoder。近幾年,出現更多的是采用基于自注意力機制的網絡結構實現 Encoder Decoder,現在最有名氣的莫過于 Transformer 了。
3.4 引入了 WFST 的端到端算法
端到端 ASR 模型引入語言模型的方式有幾種,包括在解碼過程中加入語言得分的 On-the-fly Rescore 的方式、對 n-best 結果 Rescore 的方式、以及采用 WFST 解碼圖的方式。
目前開源的項目中,采用 WFST 解碼圖的有 ESSEN[13]、WeNet[12],它把 Ngram 語言模型得分、詞典(字->詞)得分、以及 CTC topo 都編碼在的跳轉弧上,聲學模型的作用是提供聲學得分給解碼,這很好地借鑒了傳統 ASR 解碼器,區別在于聲學模型的建模單元不再是狀態或音素,而是更大粒度的字、子詞。其優化過程可以寫作
式中指代 Token 序列,如字序列、子詞序列等,描述不同 Token 之間的跳轉方式,上面介紹的 CTC-CRF 類似。
3.5 拓展思考
端到端 ASR 算法的解碼也可以用 WFST 搜索的形式來描述,但原始的搜索圖是沒有經過優化的,其結構僅僅類似于。從這個角度看,傳統 ASR 和端到端 ASR 的解碼都可以用 WFST 框架來描述,可見 WFST 確實是一個強大的工具。
4. 總結
圍繞求解最大后驗概率的問題,傳統 ASR 算法將求解過程分解成多個步驟,將系統模塊化后分別優化,各模塊任務明確;端到端 ASR 算法則直接求解后驗概率,系統更加簡潔。不同的算法包含了不同的前提假設,前提不同,那么算法的適用場景就會有所區別,因此不能簡單地說孰優孰劣。
在文章末尾,我也提到,不同的 ASR 算法在實現上都可以用同一個框架來描述,是否可以說,眾多的 ASR 算法從同一個起點出發,走不同的路,最終又殊途同歸了呢?
參考資料
- WFST: https://cs.nyu.edu/~mohri/postscript/csl01.pdf
- HMM: https://cogsci.ucsd.edu/~ajyu/Readings/Tutorials/hmm.pdf
- 傳統ASR架構: 3人半年打造語音識別引擎--58同城語音識別自研之路
- 清華大學CTC-CRF: http://oa.ee.tsinghua.edu.cn/~ouzhijian/pdf/ctc-crf.pdf
- Chain topo: http://www.danielpovey.com/files/2018_interspeech_end2end.pdf
- CTC: Sequence Modeling with CTC
- e2e topo: HMM, CTC和RNN-Transducer對齊方式的差異
- 李宏毅 e2e: https://zhuanlan.zhihu.com/p/130899095
- LAS 模型: https://arxiv.org/abs/1508.01211v2
- Transformer: https://arxiv.org/abs/1706.03762v5
- google e2e: https://www.isca-speech.org/archive/Interspeech_2017/pdfs/0233.PDF
- WeNet: wenet-e2e/wenet
- ESSEN: srvk/eesen
- Kaldi: kaldi-asr/kaldi