Kaldi HMM拓撲和狀態轉換模型

語音增強和語音識別

HMM拓撲

使用c++的HmmTopology來描述音素的HMM拓撲。其描述的一個實例(3-state Bakis模型)如下:

<Topology>
 <TopologyEntry>
 <ForPhones> 1 2 3 4 5 6 7 8 </ForPhones>
 <State> 0 <PdfClass> 0
 <Transition> 0 0.5
 <Transition> 1 0.5
 </State>
 <State> 1 <PdfClass> 1
 <Transition> 1 0.5
 <Transition> 2 0.5
 </State>
 <State> 2 <PdfClass> 2
 <Transition> 2 0.5
 <Transition> 3 0.5
 </State>
 <State> 3
 </State>
 </TopologyEntry>
 </Topology>

在這個實例中只有一個TopologyEntry,其包括了音素1~8(所以這個例子總共8個音素,這些音素共享相同的拓撲)。有三個發射狀態,每個狀態包括一個自循環和發射到其它狀態的概率。還有最後一個非發射狀態(狀態3,沒有入口)。kaldi把狀態0作爲初始狀態,最後一個狀態作爲作爲終止狀態(無發射狀態,其概率等於1)。HmmTopology 對象中的概率用於初始化訓練。訓練的概率是上下文相關的HMM並且存儲在TransitionModel對象。TransitionModelc++類成員的方式存儲HmmTopology對象。HmmTopology的轉換概率通常除了初始化TransitionModel對象其它地方並不會被用到。

Pdf-class

Pdf-class是和對象HmmTopology有關的一個對象。HmmTopology爲每一個音素指定了一個HMM模型,每一個有編號的狀態有兩個變量forward_pdf_classself_loop_pdf_classself_loop_pdf_class是轉換到狀態自身的概率,缺省值是和forward_pdf_class一樣的。但是兩者的概率也可以不一樣。
音素的HMM狀態通常從0開始,連續的(1,2,。。。),這是爲了圖構建的方便。

狀態轉換模型(TransitionModel對象)

TransitionModel對象存儲了音素的HMM拓撲對應的轉變概率和信息。構建圖的代碼根據TransitionModelContextDependencyInterface對象來獲得拓撲結構和狀態轉換概率。

狀態轉化概率建模

狀態轉換的概率是和上下文相關的HMM狀態相關的,其依賴如下5項內容(5元組):

  • 音素
  • 源HMM狀態(HmmTopology對象解析,通常是0,1,2…)
  • 前向概率(forward-pdf-id,)
  • 自循環概率(self-loop-pdf-id
  • HmmTopology對象的狀態索引
    後四項可以看成是目標HMM狀態編碼成HmmTopology對象。

transition-ids

TrainsitionModel對象在初始化時建立了音素和整數之間的映射關係,此外還有轉換標識符 (transition identifiers)transition-ids,轉換索引(transition indexes),轉換狀態(transition states)這些量。引入這些量爲了完全使用基於FST的訓練方法。

TransitionModel使用的整型標識符

  • 音素(從1開始):可以從OpenFst符號表轉換成音頻的名字,並不要求音素是連續標號的。
  • hmm狀態(從0開始):用於索引HmmTopology::TopologyEntry對象。
  • 概率或者pdf-ids(從0開始):源於決策樹聚類後結果,通常一個ASR系統有數以千計的pdf-id.
  • transition-state(從1開始):TransitionModel定義。每一個可能的三元組(音素,hmm狀態,概率)映射到一個獨一無二的轉換狀態。
  • transition-index(從0開始):是對HmmTopology::HmmState的索引。
  • transition-id(從1開始):是狀態轉換模型的轉換概率。二元組(transition-statetransition-index)和transition-id可以互相映射。

轉換模型(transition model)訓練

用於訓練和測試的FST將transition-id做爲輸入label。在訓練過程中使用維特比解碼獲得輸入transition-id序列(每一個都是一個特徵向量),函數Transition::Update()對每個transition-state做最大似然估計。

對齊

和的語句長度一樣的包含一系列transition-ids的vector向量描述了對齊關係。transition-ids序列從解碼器得到。對齊用於維特比訓練和測試時自適應。由於transition-ids編碼了音素信息,可以通過工具SplitToPhones()ali-to-phones.cc根據對齊取出音素序列。
通常kaldi中需要處理由句子索引的對齊集合,這通常使用表的方式來實現。
函數ConvertAlignment()(命令行是convert-ali)將對齊從一個狀態轉變模型轉換到另一個模型。

狀態層次後驗概率

狀態級後驗概率是“對齊”概念的擴展,區別在於“對齊”概念上每幀對應一個狀態轉變ID,而狀態級後驗概率每幀的狀態轉變ID的數量沒有限制,且每個狀態ID都有一個權重對應。通常按如下結構存儲:

typedef std::vector<std::vector<std::pair<int32, BaseFloat> > > Posterior;

如果使用Posterior創建了一個名爲post的對象,則post.size()將等於句子幀數,post[i]存儲的是(transition-id, posterior)信息。
當前程序中,只有兩個方法創建posteriors

  • 使用ali-to-post程序將對齊轉換成後延概率。
  • 使用weight-silence-post修改後驗概率。
    當加入lattice是,也有工具從Lattice生成後驗概率。

高斯層次後驗概率

表示高斯層次的後驗概率類型如下:

typedef std::vector<std::vector<std::pair<int32, Vector<BaseFloat> > > > GauPost;

其狀態是使用向量浮點數來表示的。向量的size和高斯量的數目是一樣的。post-to-gpostPosterior結構轉換成GauPost結構。使用模型和特徵計算高斯層次的後驗概率。

HMMs轉成FSTs

GetHTransducer()

fst::VectorFst<fst::StdArc>*
GetHTransducer (const std::vector<std::vector<int32> > &ilabel_info,
                const ContextDependencyInterface &ctx_dep,
                const TransitionModel &trans_model,
                const HTransducerConfig &config,
                std::vector<int32> *disambig_syms_left);

該函數返回輸入是transition-ids,輸出是上下文相關音素的FST。FST具有初始和終止狀態,轉換出FST的狀態變換將輸出音素符號。通常轉出FST狀態會轉入一個表示3狀態HMM的結構體中,然後跳到起始狀態。

HTransducerConfig配置類

HTransducerConfig控制着GetHTransducer的行爲。

  • 變量trans_prob_scale是狀態轉變縮放因子。當轉變概率添加到圖裏時,會乘以縮放因子。命令行工具是transition-scale

GetHmmAsFst()

函數GetHmmAsFst()輸入是一段音素,返回的是狀態機最終狀態時得到的transition-ids序列。

AddSelfLoops()

是向圖中添加自循環。添加自循環的意義是可以進行狀態重新調整,而不加的意義在於決策過程可以更高效。

FST添加狀態轉變概率

函數AddTransitionProbs()向FST添加概率。這樣可以在無概率時就可以創建圖了。

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