kaldi中的chain model詳解

      網友投稿 1051 2025-03-31

      chain model的結構

      chain model實際上是借鑒了CTC的思想,引入了blank用來吸收不確定的邊界。但CTC只有一個blank,而chain model中每一個建模單元都有自己的blank。如下圖所示:

      對應kaldi中的結構定義為:

      在kaldi中,把Sp和Sb看做同一個狀態(都對應state 0),只是pdfclass不同。ForwardPdfClass表示Sp,SelfLoopPdfClass表示Sb。

      kaldi中的chain model訓練

      chain model實際上也是一種序列鑒別性訓練的方法,所以它也要構造分母fst和分子fst。

      ps:這里不用分母詞圖(lattice)和分子詞圖(lattice)的表述,一、因為chain model(lattice free)不需要構建分母詞圖,而是用類似于HCLG這樣的fst結構代替分母詞圖。二、同時chain model為了將每個句子分成一小塊chunk,也會把分子lattice轉換成分子fst(因為fst可以保留時間對齊信息,方便根據時間切分成塊)

      下面我們講解chain model訓練的關鍵步驟(為了系統性地說明,我們以aishell中的BAC009S0712W0300這個音頻為例)

      一、為每個句子構建訓練圖,然后解碼得到每個句子的可能對齊結果(lattice)

      這一步類似于構建解碼用的HCLG,但解碼用的HCLG是所有句子通用的。而我們這里構建的HCLG是根據每個句子的transcripts(轉錄文本)構建的,所以圖會比較小,每個句子有自己的一個HCLG圖。具體構建訓練圖的方法可參考:

      Decoding-graph creation recipe (training time) kaldi-asr.org/doc/graph_recipe_train.html

      有了訓練圖之后,我們就可以在上面解碼,得到每個句子所有可能的對齊方式。kaldi中將所有可能的對齊用lattice這樣的數據結構來保存,這樣可以節省存儲空間。得到的lattice(CompactLattice)的格式如下:

      說明:

      第一列和第二列是lattice結點的編號

      第三列是word

      接下來的兩個數字(比如4.45809,3339.97)分別是語言模型概率和聲學模型概率

      接下來以”_“分隔的每個數字都是每一幀對應的transition-id。

      為什么不是得到唯一的(最有可能的)對齊呢?kaldi文檔中有解釋:

      這一步構建的訓練圖在后面分母fst的構建和分子fst的構建中都會用到。

      二、分母fst的構建

      1、構建phone級別的語言模型

      構建語言模型必須要有語料,那么phone級別的語料從何而來呢?首先根據第一步的lattice(多種可能的對齊方式),我們進一步解碼得到最有可能的對齊方式。kaldi中每個句子的最有可能的對齊方式寫在ali文件中,格式如下:

      說明:加粗的表示音頻名字,音頻名字后跟的數字表示每一幀對應的transition-id。

      根據transition-id,我們可以得到每一幀對應的phone,如下:

      2、構建分母fst

      chain model的分母fst類似于解碼時建立的HCLG圖。但是chain model的語言模型是phone級別,所以構圖時我們不需要發音詞典了,其實構造的是HCP(P表示phone LM,HCP就是fst結構,所以叫分母fst)。為了限制HCP圖的大小,我們使用4元phone LM。值得注意的是:不同的句子是共用同一個HCP圖,這一點與傳統的序列鑒別性訓練不同,傳統的序列鑒別性每個句子都有自己的分母lattice。

      三、分子fst的構建

      1、將第一步得到的以word為單位的lattice轉換成以phone為單位的lattice。

      chain model是在phone-level上進行訓練的,所以需要得到以phone為單位的對齊,如下圖所示:

      2、構建分子fst:將phone-level的lattice轉換成fst,同時將transiton-id轉換成pdf-id

      lattice與fst的不同是,根據fst中編碼了time-alignment信息,可以方便我們根據時間點切分整段音頻。為什么要將transiton-id轉換成pdf-id?因為聲學模型是對pdf-id建模。

      說明:

      第一列和第二列是fst結點的編號

      第三列和第四列是pdf-id(輸出和輸出相同,實際上它是FSA)

      同時,在這一步,我們還會以3倍的步幅跳幀進行采樣(至于為什么可以跳幀,在最下面的“常見疑問”模塊會有我自己的理解)。從這個圖我們可以看到跳幀采樣的現象,理論上音素sil對應41幀(通過上上張phone leveld的圖中sil對應的transition-id數可以得到),但現在13幀(通過上張圖,1和218(1和218都對應到音素sil)連續出現的次數可以得到)?;蛟S看上張圖,你還有疑問,為什么pdf-id 218之間還有pdf-id 253呢?這是因為原來的對齊結果不一定是準確的(基于CD-HMM-GMM),kaldi中提供了--left-tolerance和--right-tolerance兩個選項,以phone為單位,允許phone在原來的對齊結果基礎上,向前延伸--left-tolerance幀和向后延伸-right-tolerance幀(通常是5幀)。

      到這一步,理論上每個句子的分子fst就構建完成了。

      4、將每個句子的分子fst分成多個小chunk,用于訓練

      之所以將整個音頻分成chunk,是為了加快訓練速度和解碼速度。因為fst中有時間對齊信息,所以我們很容易將整段fst分成一小塊,如下圖所示:

      Chain model和傳統的序列鑒別性訓練(MMI/MPE/sMBR)的區別

      基于CD-DNN-HMM的序列鑒別性訓練,需要以下幾步:

      1. 訓練一個基于CE(交叉熵)準則的CD-DNN-HMM模型作為種子模型,因為CD-DNN-HMM通常會優于CD-GMM-HMM。然后利用該種子模型,得到基于狀態層面的強制對齊作為分子詞圖。

      2. 基于一元語言模型構建一個HCLG,然后在HCLG上解碼得到每個句子的分母詞圖。之所以采用一元的語言模型,應該是為了使詞圖不會太大。

      chain model雖然也是一種序列鑒別性訓練,但它的訓練流程比較簡單:

      1. chain model不需要事先訓練一個CE準則的DNN模型;而是直接使用CD-HMM-GMM模型得到每個句子的對齊結果,然后生成分子fst。

      2. chain model不需要為每個句子構建分母fst,而是直接使用HCP圖(P表示phone LM)。

      同時,chain model是直接在phone級別上建模的。傳統的序列鑒別性訓練是在word-level上建模的。

      chain model的優點:

      kaldi中的chain model詳解

      1、解碼速度更快。因為chain model采用拼幀降采樣(每三幀取一幀)的方式,也就是說幀移變成了30ms,而不是10ms,所以幀率是傳統神經網絡聲學模型的三分之一;

      2、訓練速度更快。不需要預先訓練DNN模型,同時省去了分母lattice的生成。

      chain model和CTC對比

      這是Dan Povey在回答為什么將CTC腳本從kaldi中移除的原話:

      常見的疑問

      1、為什么說chain model是lattice free?

      答:之前的鑒別性訓練是需要對每個音頻解碼得到分母詞圖(每個音頻都有自己對應的詞圖)。而chain model的分母fst實際上是HCP(P表示發音詞典的概率),也就是說所有音頻共享同一個HCP圖,不需要分別解碼得到對應的lattice,所以叫lattice free。

      2、為什么chain model可以采用跳幀降采樣的方式訓練和解碼,而傳統的HMM-GMM不行?

      答:主要跟建模粒度有關。chain model中的每個phone只有一個state(不考慮blank),所以我們可以認為它的建模單元是phone。而傳統的HMM-GMM的每個phone有3或5個state,所以傳統的HMM-GMM實際上是對state建模。因為state的建模粒度比較小,采用跳幀的方式時,可能跳過了中間重要的幾個state,從而影響識別結果。而phone的建模粒度較大,采用跳幀的方式通常不會跳過phone。

      3、實際處理時(如kaldi),為什么要將句子分成多個小塊(chunk)?

      答:對于非循環模型和非chain模型的情況,分成chunk主要是考慮到我們訓練時是利用上下文信息的,比如考慮了前10幀和后10幀,那么每個訓練的example需要存儲21幀特征,8個example需要存儲168幀。如果我們將連續8幀做成一個chunk,那么我們只需要存儲28幀(10+8+10),節省了存儲空間。

      實時語音識別 機器學習 深度學習 神經網絡

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:WPS在表格怎樣繪制圖畫(wps表格畫圖怎么畫)
      下一篇:怎么把 分節符改為手動分頁符(怎么把兩張圖片拼在一起)
      相關文章
      亚洲a级成人片在线观看| 亚洲AV女人18毛片水真多| 亚洲AV中文无码字幕色三| 亚洲精品国产精品乱码不卡| 亚洲综合色一区二区三区| 亚洲成年人电影网站| 久久亚洲中文字幕精品有坂深雪 | 亚洲最大AV网站在线观看| 亚洲电影在线播放| 久久精品国产亚洲AV电影| 久久亚洲中文字幕精品有坂深雪 | 亚洲av成人中文无码专区| 亚洲中文字幕一区精品自拍| 亚洲小视频在线观看| 亚洲精品福利你懂| 久久亚洲AV无码西西人体| 性色av极品无码专区亚洲| 久久亚洲欧美国产精品| 国产精品亚洲精品久久精品| 国产精品亚洲а∨无码播放不卡| 久久精品国产亚洲AV电影网| 国产青草亚洲香蕉精品久久| 亚洲 另类 无码 在线| 亚洲无码精品浪潮| 情人伊人久久综合亚洲| 亚洲日本va午夜中文字幕一区| 亚洲AV色香蕉一区二区| 亚洲国产一区国产亚洲| 亚洲视频在线不卡| 亚洲成a人片在线观看中文!!!| 亚洲人成人77777在线播放| 国产成人精品日本亚洲专| 亚洲自偷自偷在线成人网站传媒| 亚洲欧美日韩中文字幕在线一区| 日韩亚洲欧洲在线com91tv| 亚洲AV区无码字幕中文色| 亚洲精品熟女国产| 亚洲三级中文字幕| 亚洲精品国产suv一区88| 亚洲国产精品成人精品软件| 亚洲AV一二三区成人影片|