
本文介紹 kaldi-ctc 構建 CTC[1, 2, 3, 4] 語音識別加權有限狀態機(WFST)解碼網絡的方式。
示例相關資源 lifeiteng/codingmath/CTC-decoding-graph
構建語言模型
以 單句 “how are you are” 作為文本語料,訓練 bi-gram(order=2)語言模型

生成 G.fst [data/lang_2/G.pdf],如下圖

准備"發音" 詞典
不同單元 phone[1, 2] / character[3, 4],都可以抽象為“發音”詞典的形式,以 phone 詞典為例

其中 !SIL SIL 為額外添加,作為 OOV 的替換符號使用,亦可使用其他記號 e.g. UNK NSN 。

其中 --num-sil-states 1 --num-nonsil-states 1 用於構建單狀態TransitionModel(HMM)。
生成 L.fst [data/lang_2/L.pdf]

Optinal 的 SIL( SIL : / 2_1 )使得發音詞典與語言模型 Composition 之后的搜索空間允許單詞間停頓而不影響語言模型概率計算。
構建HCLG
像 DNN-HMM hybrid 系統一樣構建HCLG[5]:

kaldi-ctc 可以方便構建CI[1] phone / CD[2] phone / character[3, 4] 的 CTC 系統,只需構建相應 CI-phone / CD-phone / character 的決策樹和訓練數據即可。
HCLG [exp/mono_ctc_decoding_graph/HCLG.pdf] 網絡:

修改HCLG 構建CTC解碼網絡
修改 HCLG 的 input label(即 TransitionId)並插入 blank loop 構建CTC解碼網絡。
arc.ilabel++, 添加 blank loop

最終 CTC 解碼網絡如下: [exp/mono_ctc_decoding_graph/CTC.pdf]

解碼時從解碼網絡獲得TransitionId轉為對應的PdfId做為 RNN 輸出層索引獲得
log_likelihood = log(RNN output[pdf_id]) - log(prior[pdf_id])
尖峰現象
以 CTC 准則訓練的 RNN 模型輸出概率有明顯的尖峰現象[1]: [images/pink.png]

解碼時跳過blank概率接近1的幀可以極大提升實時率。