https://shiweipku.gitbooks.io/chinese-doc-of-kaldi/content/lattice.html
一、lattice 基礎(chǔ)
????1、Lattice
????????① 它是一個FST;
????????② 輸入:transition-ids? ? ? 輸出:詞
????????③ 權(quán)重(weights):圖代價(graph cost) +? 聲學(xué)代價 (acoustic cost)
????2趣效、CompactLattice(本質(zhì)上包含了和Lattice相同的信息)
????????① 它是acceptor(輸入域輸出符號始終相同,均為詞)
????????② 權(quán)重(weights): 一對浮點數(shù)(Lattice中的權(quán)重 )+ 一個整數(shù)序列(transition-ids)
????3疮蹦、讀取 Lattice 和 CompactLattice 均可用 SequentialLatticeReader惰瓜。
? ? ? ????兩者之間轉(zhuǎn)換可使用 ConvertLattice()
????4否副、Lattice 和 CompactLattice 類型被當做數(shù)據(jù)結(jié)構(gòu)來表示傳統(tǒng)的網(wǎng)絡(luò),也用于表示 N-best 列表
????5崎坊、網(wǎng)絡(luò)上很多算法(如取最優(yōu)路徑备禀,或剪枝)用Lattice 類型比 CompactLattice 類型效率更高。
? ? ? ????這是因為 CompactLattice 類型的權(quán)重包括了transition-ids 序列(比較難處理)奈揍。
? ? ????? 像取最有路徑的操作痹届,會將權(quán)重相乘,對應(yīng)著序列相加 打月。
????6队腐、對很多算法來說,時間復(fù)雜度是網(wǎng)格長度的平方
????7奏篙、Lattices 通常以 CompactLattice 的形式存儲在 archive(檔案)
? ? ? ????而且慣例是 acoustic weights 不采用縮放(存儲的時候不縮放)
? ? ????? 所以當對 acoustic weights 做敏感的運算(如剪枝)柴淘,對應(yīng)的命令行會有 --acoustic-scale 選項 (在 thch30 ????例子中是0.1 or 0.08333333),并在進行運算前縮放秘通,運算結(jié)束后縮放回來为严。
????ps: 思考:根據(jù)第7點,調(diào)節(jié) --acoustic-scale 參數(shù)對模型調(diào)優(yōu)有沒有幫助肺稀?
二第股、與 weights 相關(guān) (graph cost, acoustic cost)
????1话原、LexicographicWeight 首先比較第一個元素并用第二個元素打破平局
????2夕吻、LatticeWeight? 首先比較和值,用差值打破平局
????3繁仁、根據(jù) 1和2 可知涉馅,LatticeWeight(a,b) 與 LexicographicWeight(a+b, a-b)等價
????4、LatticeWeight 的意圖是取總代價(graph+acoustic cost)最小的黄虱,同時分別記住 graph cost 和 acoustic cost
????5稚矿、之所以不用 LexicographicWeight 代替 LatticeWeight 是因為 (graph+acoustic cost, acoustic cost)這樣定義有些混亂
三捻浦、生成lattice
????1晤揣、目前,生成 lattice 的唯一解碼器是定義在 decoder/lattice-simple-decoder.h 中的類 LatticeSimpleDecoder朱灿,它被 gmm-latgen-simple.cc中調(diào)用
????2昧识、LatticeSimpleDecoder 是由 SimpleDecoder 修改得到的
? ? ????? SimpleDecoder 是 Veterbi beam search 算法的一個直接實現(xiàn),只有一個可調(diào)參數(shù) :pruning beam
? ? ????? LatticeSimpleDecoder 有一個更重要的可調(diào)參數(shù):lattice beam (也可稱為 lattice-delta)母剥,一般比 pruning ????beam 小
????3滞诺、基本框架是:
????????① LatticeSimpleDecoder 先生成一個狀態(tài)級網(wǎng)絡(luò)形导;
????????② 然后用 lattice-delta 剪枝环疼;
????????③ 最后執(zhí)行 determinization算法习霹,對每個詞序列僅保留最優(yōu)路徑
????4、在 SimpleDecoder 中炫隶,有引用計數(shù)的回溯(reference-counted tracebacks)
????????在 LatticeSimpleDecoder 中淋叶,單個回溯是不夠的,因為網(wǎng)格具有更復(fù)雜的結(jié)構(gòu)伪阶。
????????實際上煞檩,存儲前向鏈接比后向鏈接更方便。
????????為了釋放 lattice-delta pruning(剪枝) 時不需要的鏈接栅贴,我們需要做的比引用計數(shù)更多斟湃,實際上也沒有做引用計數(shù)。
四檐薯、一些 lattice 上的操作
????1凝赛、pruning lattices (剪枝)
????????網(wǎng)格可以用一個設(shè)定的 pruning beam 來剪枝。這會去掉和網(wǎng)格中最優(yōu)路徑的代價相差不夠小的那部分 arcs(弧) 和 states
????2坛缕、lattice composition (組合)
????① 組合網(wǎng)格
????????這是在轉(zhuǎn)換器(tansducer)形式下完成的墓猎。例如可以把網(wǎng)格看做 transition-ids 到 words 的一個轉(zhuǎn)換器
????② 組合網(wǎng)格和一個固定的FST (是指網(wǎng)格和 HCLG.fst 的組合嗎?)
????????為了這個目的赚楚, FST 被動態(tài)地轉(zhuǎn)換為網(wǎng)格毙沾;FST的權(quán)重解釋為網(wǎng)格權(quán)重的 "graph part"
????3、有些時候我們不需要網(wǎng)格結(jié)構(gòu)而是需要最佳路徑或 N-best 路徑
????????N-best 列表的格式和網(wǎng)格一樣宠页,除了每個句子有多個 FSTs (如果設(shè)定了n,最多 n 個)
????4左胞、如果想要網(wǎng)格的時間信息
????????① LatticeStateTimes 函數(shù) (for lattice)
????????② CompactLatticeStateTimes 函數(shù) (for CompactLattice)
五、總結(jié)
????根據(jù)之前看的資料举户,總結(jié)了一個基于 kaldi 的 ASR 和 KWS 流程罩句,只是個人見解,可能存在不對的地方敛摘。
????1门烂、wav2features 首先提取音頻特征(訓(xùn)練不同的模型需要的特征不一樣)
????2、提取的特征根據(jù)聲學(xué)模型 (final.mdl ?) 得到 phones or HMM states
????3兄淫、根據(jù) phones or HMM states 得到 lattices
????4屯远、把 lattice 和 HCLG.fst 組合得到新的 FST,再從中得到 N-best 路徑
????5捕虽、根據(jù)最佳路徑得 ASR 解碼結(jié)果慨丐;
? ? ? ? ? 根據(jù) N-best 路徑搜索關(guān)鍵詞。