Lattice


Lattice是一個無環WFSA,結點可以是hmm狀態、hmm(音素)、詞,每個結點是一段音頻在某個時間的對齊

用訓練好的聲學模型、現成的語言模型和發音字典構建解碼網絡(wfst),最后將提取的測試集的語音特征輸入以上解碼網絡,得到網格結構(lattice)的語音識別結果。

Lattice可用於語言模型的得分重估計

一個Lattice是為一段音頻產生的,Lattice是一個帶權無向圖,其中每個點代表一個聲學單元,每條弧包含兩個權重(聲學權重和語言權重)。解碼時,會使用Viterbi算法?結合兩種權重搜索Lattice,得分最高的路徑就是解碼結果。

   

識別的結果以lattice呈現,可以保存為standard lattice format (SLF)文件。

Lattice輸出可以用於重打分、生成n-best結果.

   

Lattice類型只是一個基於特定半環模板化的 FST

   

來自 <https://shiweipku.gitbooks.io/chinese-doc-of-kaldi/content/lattice.html>

   

Lattice的運算操作:

修剪Lattice

計算最優路徑

計算N-best結果

語言模型重打分

概率縮放

Lattice聯合(用於MMI

Lattice組合

Lattice內插

   

LatticeLatticeSimpleDecoder類(解碼器)生成,這個類是一個從SimpleDecoder類修改得來。 SimpleDecoder是Viterbi-Beam搜索算法的一種直接實現。

Lattice的產生過程大致為:LatticeSimpleDecoder首先產生狀態級晶格,並且用Lattice-Delta修剪它,然后使用特殊的確定性算法,只保留每個單詞序列的最佳路徑。

http://kaldi-asr.org/doc/lattices.html

   

因為每個狀態一個token,限制了可能得到的不同token歷史記錄的數量,所以他們不是最合適的。若每個模型狀態對應多個token,並且如果認為來自不同前序單詞的token是不同的,就可以避免上述限制。這樣就為生成hypotheses(譯者注:意為可能的識別結果)的lattice(譯者注:網格)提供了可能,lattice比單Best輸出更有用。基於這個思想的算法稱為lattice N-best

對輸入語音進行解碼轉錄成文本形成搜索空間, 為了減少識別錯誤,這種搜索空間通常不是單一的,而是以多個假設的形式存在(如網格形式, N-best 等)

   

   

Lattice

Lattices describe all theories considered by the Recognizer that have not been pruned out. Lattices are a directed graph containingNodes and Edges. A Node that corresponds to a theory that a word was spoken over a particular period of time. An Edge that corresponds to the score of one word following another. The usual result transcript is the sequence of Nodes though the Lattice with the best scoring path. Lattices are a useful tool for analyzing "alternate results".

Lattices是一個有向圖,結點是詞,邊是轉移概率。轉錄的結果是遍歷Lattices后得到的最高得分詞序列

   

源代碼中Lattice類型的解析

typedef fst::VectorFst<LatticeArc> Lattice;

Lattice是一個弧為LatticeArc基於VectorFst模板的FST

typedef fst::ArcTpl<LatticeWeight> LatticeArc;

LatticeArc是一個弧參數為LatticeWeight基於ArcTpl的類

typedef fst::LatticeWeightTpl<BaseFloat> LatticeWeight;

LatticeWeight是一個使用BaseFloat類型作為浮點型基於LatticeWeightTpl的類

LatticeWeightTpl是一個模板,定義在fst命名空間(fstext/lattice-weight.h),與詞典半環類似

OpenFst中的LexicographicWeight模板:

LexicographicWeight<TropicalWeight, TropicalWeight>

這兩個模板的加運算都被定義為取max,但是"max"被不同地定義。

LexicographicWeight首先比較第一個元素,並使用第二個元素打破關系。 LatticeWeight首先比較總和; 然后使用差異來打破關系。 因此,具有(ab)LatticeWeight等價於具有(a + ba-b)LexigraphicWeight LatticeWeight背后的基本直覺是保持采用最低代價路徑(其中總代價是語言加聲學代價)的語義,同時分別"記住"聲學代價和語言代價是什么。 在理想世界中,我們可能希望保持更多的信息分離:例如,語言模型代價,轉換模型代價,發音概率代價。 但這是不實際的,因為這些信息在解碼圖中全部混合在一起,並且在解碼圖中將其分離將導致解碼圖大小的顯着擴展。

   

如前所述,Lattice中的輸入符號表示transition-ids,輸出符號表示字(或解碼圖的輸出上的任何符號)

當設計Kaldi時,我們考慮使用LexicographicWeight類型,而不是LatticeWeight類型,其中第一個元素是(graph + acoustic)成本,第二個元素就是聲音成本。 我們最終決定反對這一點,因為雖然它可能為某些目的稍微更有效,我們認為這將是太混亂。

lattice上的許多算法(例如,采取最佳路徑或修剪)對於使用Lattice類型而不是CompactLattice類型是最有效的。 問題是,使用CompactLattice類型,權重包含transition-id的序列,並且像采取最佳路徑的操作將權重作乘法,這對應於將這些序列鏈接在一起。 對於許多算法,需要的時間是lattice中字長度的兩倍。如上所述,您可以從檔案(ark)中讀取Lattice,即使它包含CompactLattice,因為Holder類型(LatticeHolder)將執行自動轉換。 因此,即使在"lats_rspecifier"中指定的歸檔文件或腳本文件包含CompactLattice格式(通常會這樣),下面代碼仍然有效,因為這是我們通常寫Lattice的方式。

SequentialLatticeReader lattice_reader(lats_rspecifier);

for (; !lattice_reader.Done(); lattice_reader.Next()) {

std::string key = lattice_reader.Key();

Lattice lat = lattice_reader.Value();

...

}

格式類型轉換的示例是:

Lattice lat;

// initialize lat.

CompactLattice compact_lat;

ConvertLattice(lat, &compact_lat);

轉換為CompactLattice類型涉及一個"因式分解"操作,函數fst :: Factor()(fstext / factor.h中的us定義),它標識出可以組合成一個CompactLattice弧的狀態鏈。 將OpenFst算法應用於lattice的典型示例如下(此代碼,從latbin / lattice-best-path.cc修改,找到通過lattice的最佳路徑)

Lattice lat;

// initialize lat.

Lattice best_path;

fst::ShortestPath(lat, &best_path);

   

計算通過lattice的最佳路徑

程序 lattice-best-path 計算通過lattice的最佳路徑,並輸出相應的輸入符號序列(對齊,alignment)和輸出符號序列(轉錄,transcription)。 像往常一樣,輸入和輸出是以檔案的形式。示例命令行是:

lattice-best-path --acoustic-scale=0.1 ark:in.lats ark:out.tra ark:out.ali

程序lattice-nbest計算通過latticeN個最佳路徑(使用OpenFstShortestPath()函數),並將結果作為lattice(CompactLattice)輸出,但其具有特殊結構。 如OpenFst中的ShortestPath()函數所記錄的,開始狀態有(最多)n個發射弧,每個弧連接到一條單獨路徑的開始。 注意,這些路徑可以共享后綴。 示例命令行是:

lattice-nbest --n=10 --acoustic-scale=0.1 ark:in.lats ark:out.nbest

語言模型重打分

因為LatticeWeight的"圖部分"(第一部分)包含的語言模型得分與transition-model得分和任意發音或靜音概率混合在一起的,所以我們不能將其替換為新的語言模型得分,否則我們會失去轉移概率和發音概率。 相反,我們必須先減去"舊"LM概率,然后添加新的LM概率。 這兩個階段的核心操作是"組合"(也有一些權重的縮放)。 這樣做的命令行是:首先,刪除舊的LM概率:

lattice-lmrescore --lm-scale=-1.0 ark:in.lats G_old.fst ark:nolm.lats

然后添加新的LM概率:

lattice-lmrescore --lm-scale=1.0 ark:nolm.lats G_new.fst ark:out.lats

注意,還有其他方法來做到這一點;請參閱下面的lattice-compose的文檔(告訴我們程序lattice-lmrescore是什么).實際上,我們將首先使用簡單的版本。假設我們給出了LM-scaleLM G.fst。我們首先將G.fst中的所有代價乘以S.然后對於每個lattice,我們在右邊用G組成它(L o G),對其使用lattice-determinize(僅保留每個單詞序列通過G的最佳路徑),並將其輸出。這對positive S的效果良好,但對於negative S,它將相當於對每個單詞序列采用通過G的最差路徑。為了解決這個問題,我們做如下改動。對於每個輸入的lattice,我們首先通過S的倒數來縮放點陣的語言模型(或LM)成本;我們然后在G.fst右邊合成;我們對所得到的lattice運行lattice-determinize(參見上文),其對每個單詞序列僅保留通過lattice的最佳路徑;然后我們將lattice/ LM分數縮放為S.這對於negative S是正確的。當輸入的lattice對於每個單詞序列僅具有通過它的單個路徑時,上述過程才有意義(例如,如果它是lattice確定的)。我們假設在程序之間傳遞的所有lattice都有這個屬性(這就是為什么寫出"raw"狀態級lattice不是一個好主意,除非你知道你在做什么)。

   

注意,為了使composition(組合的fst)工作,該程序需要將G.fst"極小-加法半環"上映射到LatticeWeight半環。 這通過將G.fst的權重放入權重的第一部分("圖"部分),並且將權重的第二部分置為零(在半環中,這是1)來做到這一點。在C++級別,這個映射使用OpenFstMapFst機制來完成.其中,我們定義了一個Mapper類來將StdArc映射到LatticeArc,然后創建一個類型為MapFst的對象,根據需要進行評估,並將G.fst轉換為LatticeWeight權重類型。

   

  • lattice的改進

   

人們為了研究如何對ASR的輸出建立有效的索引進行了

很多研究,lattice中包含大量的冗余信息,除了直接在lattice上建立索引之

外,人們還研究了如何去除lattice中的冗余信息。人們提出了類似lattice

模型,但去除了lattice中的冗余信息,如混淆網絡

[33]

PSPLs(Position

SpecificPosteriorLattices)[34]

   

   

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM