kaldi中解碼圖的構建一

解碼圖譜建立概要

解碼圖譜也就是我們構建的的:HCLG=H*C*L*G,這裏

        G是對語法或者語言模型編碼的受體,它的輸入和輸出是一樣的;

        L是發音字典,它的輸出是單詞,輸入是音素;

        C代表語境相關性,它的輸出是音素,輸入符號代表上下文相關音素;

        H包含了Hmm定義,它的輸出符號代表上下文相關音素,輸入符號是包含概率分佈函數id和其他信息的狀態轉移id

這是標準方案,但是這裏還有其它一些細節。我們想確保輸出是確定化、最小化的。爲了使HCLG是確定的,我們引入消歧符號。

我們儘可能的想保證HCLG是隨機的;在傳統的方案中,我們使用"push-weights"操作。我們確保隨機性的方法是不同的,and is based on ensuring that no graph creation step "takes away" stochasticity。

如果想用一句話來總結我們的方法(很顯然,一句話抓不住所有細節),這句話如下:

    HCLG=asl(min(rds(det(H' * min(det(C * min(det(L * G)))))))), 這裏asl=="add-self-loops", rds=="remove-disambiguation symbols", H'是沒有自循環的H。

Weight-pushing 不是這個方案的一部分,相反,只要G是隨機的,我們就要確保圖譜創建的任何階段都不會阻止結果的隨機性。當然,由於帶有回退(backoff)的arpa格式語言模型用fst的表達方式,G一般都不是隨機的,但是我們的方法至少確保這種非隨機性"stays put", 而且也不會比開始的時候更糟,這種方法避免了Weight-pushing操作失敗或者是方案更糟。

消歧符號

形如#1,#2,#3等的消歧符號通常被添加在lexicon的音素序列尾部,當一個音素序列是另一個音素序列的前綴或者出現在不止一個單詞當中時,就要在音素序列後面加上消歧符號。這些符號是需要的,它們可以保證L * G是確定化的。我們也把消歧符號加到另外兩個地方。我們在語言模型G的回退弧(backoff arcs)有一個#0,這可以確保G在刪除空邊後是確定化的(確定化算法確實刪掉空邊)。我們也在出現在fst C左支的空邊(語音剛開始時)上添加#-1,這對於解決單詞用空音節表示的細微問題很必要,例如,句子的開始結束符號<s>,</s>。

我們給出證明中間階段(例如LG,CLG,HCLG)是確定化的總結,這對於我們的方案從不失敗很重要。通過確定化,我們可以在刪除空邊後保證確定化。大致的步驟如下:

    首先,我們規定G必須是確定的,這也是需要#0的原因;然後,我們要L也是確定的,這樣對於任何確定的G,L * G都是確定的 ;再次,The same goes for C, with L o G on the right instead of G。

有很多理論的細節需要充實,但是記住兩條特性,對於L就足夠了。

    1、L^-1不許函數化:L的任何輸入序列都只有一個輸出序列;對於任何線性的接收器(acceptor)A, A * L是一個線性transducer或者是空。

    2、L有雙胞胎特性:there are no two states reachable with the same input-symbol sequence, that each have a cycle with the same input sequence but different weight or output sequence.

fst C傳遞器也是如此,我們相信我們腳本建立的這些傳遞器有這些性能。

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