天天看點

Kaldi HMM拓撲和狀态轉換模型

我的書:

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

對象。

TransitionModel

c++

類成員的方式存儲

HmmTopology

對象。

HmmTopology

的轉換機率通常除了初始化

TransitionModel

對象其它地方并不會被用到。

##Pdf-class

Pdf-class

是和對象

HmmTopology

有關的一個對象。

HmmTopology

為每一個音素指定了一個HMM模型,每一個有編号的狀态有兩個變量

forward_pdf_class

self_loop_pdf_class

self_loop_pdf_class

是轉換到狀态自身的機率,預設值是和

forward_pdf_class

一樣的。但是兩者的機率也可以不一樣。

音素的HMM狀态通常從0開始,連續的(1,2,。。。),這是為了圖建構的友善。

##狀态轉換模型(TransitionModel對象)

TransitionModel

對象存儲了音素的HMM拓撲對應的轉變機率和資訊。建構圖的代碼根據

TransitionModel

ContextDependencyInterface

對象來獲得拓撲結構和狀态轉換機率。

###狀态轉化機率模組化

狀态轉換的機率是和上下文相關的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-state

    transition-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-gpost

Posterior

結構轉換成

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添加機率。這樣可以在無機率時就可以建立圖了。

繼續閱讀