https://shiweipku.gitbooks.io/chinese-doc-of-kaldi/content/lattice.html
一、lattice 基礎(chǔ)
????1、Lattice
????????① 它是一個(gè)FST;
????????② 輸入:transition-ids? ? ? 輸出:詞
????????③ 權(quán)重(weights):圖代價(jià)(graph cost) +? 聲學(xué)代價(jià) (acoustic cost)
????2、CompactLattice(本質(zhì)上包含了和Lattice相同的信息)
????????① 它是acceptor(輸入域輸出符號始終相同,均為詞)
????????② 權(quán)重(weights): 一對浮點(diǎn)數(shù)(Lattice中的權(quán)重 )+ 一個(gè)整數(shù)序列(transition-ids)
????3、讀取 Lattice 和 CompactLattice 均可用 SequentialLatticeReader。
? ? ? ????兩者之間轉(zhuǎn)換可使用 ConvertLattice()
????4、Lattice 和 CompactLattice 類型被當(dāng)做數(shù)據(jù)結(jié)構(gòu)來表示傳統(tǒng)的網(wǎng)絡(luò),也用于表示 N-best 列表
????5、網(wǎng)絡(luò)上很多算法(如取最優(yōu)路徑,或剪枝)用Lattice 類型比 CompactLattice 類型效率更高。
? ? ? ????這是因?yàn)?CompactLattice 類型的權(quán)重包括了transition-ids 序列(比較難處理)。
? ? ????? 像取最有路徑的操作,會將權(quán)重相乘,對應(yīng)著序列相加 。
????6、對很多算法來說,時(shí)間復(fù)雜度是網(wǎng)格長度的平方
????7、Lattices 通常以 CompactLattice 的形式存儲在 archive(檔案)
? ? ? ????而且慣例是 acoustic weights 不采用縮放(存儲的時(shí)候不縮放)
? ? ????? 所以當(dāng)對 acoustic weights 做敏感的運(yùn)算(如剪枝),對應(yīng)的命令行會有 --acoustic-scale 選項(xiàng) (在 thch30 ????例子中是0.1 or 0.08333333),并在進(jìn)行運(yùn)算前縮放,運(yùn)算結(jié)束后縮放回來。
????ps: 思考:根據(jù)第7點(diǎn),調(diào)節(jié) --acoustic-scale 參數(shù)對模型調(diào)優(yōu)有沒有幫助?
二、與 weights 相關(guān) (graph cost, acoustic cost)
????1、LexicographicWeight 首先比較第一個(gè)元素并用第二個(gè)元素打破平局
????2、LatticeWeight? 首先比較和值,用差值打破平局
????3、根據(jù) 1和2 可知,LatticeWeight(a,b) 與 LexicographicWeight(a+b, a-b)等價(jià)
????4、LatticeWeight 的意圖是取總代價(jià)(graph+acoustic cost)最小的,同時(shí)分別記住 graph cost 和 acoustic cost
????5、之所以不用 LexicographicWeight 代替 LatticeWeight 是因?yàn)?(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 算法的一個(gè)直接實(shí)現(xiàn),只有一個(gè)可調(diào)參數(shù) :pruning beam
? ? ????? LatticeSimpleDecoder 有一個(gè)更重要的可調(diào)參數(shù):lattice beam (也可稱為 lattice-delta),一般比 pruning ????beam 小
????3、基本框架是:
????????① LatticeSimpleDecoder 先生成一個(gè)狀態(tài)級網(wǎng)絡(luò);
????????② 然后用 lattice-delta 剪枝;
????????③ 最后執(zhí)行 determinization算法,對每個(gè)詞序列僅保留最優(yōu)路徑
????4、在 SimpleDecoder 中,有引用計(jì)數(shù)的回溯(reference-counted tracebacks)
????????在 LatticeSimpleDecoder 中,單個(gè)回溯是不夠的,因?yàn)榫W(wǎng)格具有更復(fù)雜的結(jié)構(gòu)。
????????實(shí)際上,存儲前向鏈接比后向鏈接更方便。
????????為了釋放 lattice-delta pruning(剪枝) 時(shí)不需要的鏈接,我們需要做的比引用計(jì)數(shù)更多,實(shí)際上也沒有做引用計(jì)數(shù)。
四、一些 lattice 上的操作
????1、pruning lattices (剪枝)
????????網(wǎng)格可以用一個(gè)設(shè)定的 pruning beam 來剪枝。這會去掉和網(wǎng)格中最優(yōu)路徑的代價(jià)相差不夠小的那部分 arcs(弧) 和 states
????2、lattice composition (組合)
????① 組合網(wǎng)格
????????這是在轉(zhuǎn)換器(tansducer)形式下完成的。例如可以把網(wǎng)格看做 transition-ids 到 words 的一個(gè)轉(zhuǎn)換器
????② 組合網(wǎng)格和一個(gè)固定的FST (是指網(wǎng)格和 HCLG.fst 的組合嗎?)
????????為了這個(gè)目的, FST 被動態(tài)地轉(zhuǎn)換為網(wǎng)格;FST的權(quán)重解釋為網(wǎng)格權(quán)重的 "graph part"
????3、有些時(shí)候我們不需要網(wǎng)格結(jié)構(gòu)而是需要最佳路徑或 N-best 路徑
????????N-best 列表的格式和網(wǎng)格一樣,除了每個(gè)句子有多個(gè) FSTs (如果設(shè)定了n,最多 n 個(gè))
????4、如果想要網(wǎng)格的時(shí)間信息
????????① LatticeStateTimes 函數(shù) (for lattice)
????????② CompactLatticeStateTimes 函數(shù) (for CompactLattice)
五、總結(jié)
????根據(jù)之前看的資料,總結(jié)了一個(gè)基于 kaldi 的 ASR 和 KWS 流程,只是個(gè)人見解,可能存在不對的地方。
????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)鍵詞。