我的書:
淘寶購買連結
當當購買連結
京東購買連結
##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狀态(
對象解析,通常是0,1,2…)HmmTopology
- 前向機率(
,)forward-pdf-id
- 自循環機率(
)self-loop-pdf-id
-
HmmTopology
對象的狀态索引
後四項可以看成是目标HMM狀态編碼成
HmmTopology
對象。
###
transition-ids
對象在初始化時建立了音素和整數之間的映射關系,此外還有轉換辨別符 (transition identifiers)TrainsitionModel
transition-ids
,轉換索引(transition indexes),轉換狀态(transition states)這些量。引入這些量為了完全使用基于FST的訓練方法。
###
使用的整型辨別符TransitionModel
- 音素(從1開始):可以從OpenFst符号表轉換成音頻的名字,并不要求音素是連續标号的。
- hmm狀态(從0開始):用于索引
對象。HmmTopology::TopologyEntry
- 機率或者pdf-ids(從0開始):源于決策樹聚類後結果,通常一個ASR系統有數以千計的pdf-id.
-
(從1開始):transition-state
定義。每一個可能的三元組(音素,hmm狀态,機率)映射到一個獨一無二的轉換狀态。TransitionModel
-
(從0開始):是對transition-index
的索引。HmmTopology::HmmState
-
(從1開始):是狀态轉換模型的轉換機率。二進制組(transition-id
,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添加機率。這樣可以在無機率時就可以建立圖了。