HTK解碼代碼分析(一)

每個HMM的每個狀態status都有一個TokenSet。這從結構體 _NetInst中可以看出。它有一個鏈表數據項TokenSet *state,就是保存每個狀態status的TokenSet。每個TokenSet.like只保存對應狀態的當前時刻觀察值的最佳概率(所有狀態到當前狀態轉移概率的最大值乘以觀察值的輸出概率),這個可以理解爲令牌傳遞給當前時刻每個狀態的概率。當這個概率小於pri->genThresh,對應狀態的令牌將會被裁剪掉(被置零)。TokenSet.tok.path和TokenSet.tok.align則保存令牌傳遞過程的信息。path和align是一個雙向鏈表,通過這兩個鏈表可以追溯識別結果的序列,包括單詞,HMM和狀態級別。

閱讀算法首先要理解數據結構:

/*節點實例*/
struct _NetInst
{
struct _NetInst *link; /* Doubly linked list of instances, forward 指向後繼節點實例*/
struct _NetInst *knil; /* Doubly linked list of instances, backward 指向前繼節點實例*/

NetNode *node;       /* Position of instance within network 實例所對應的節點*/

int flags;           /* Flags, active ... */
TokenSet *state;     /* TokenSet[0..N-2] in state [1..N-1] for hmm 一個HMM裏面的每一個State對應一個TokenSet。保存每個狀態的最佳概率和path&align信息*/
TokenSet *exit;      /* TokenSet in exit state 退出狀態的令牌*/

LogFloat wdlk;       /* Max likelihood of t=0 path to word end node */
LogFloat max;        /* Likelihood for pruning of instance 當前時間幀的概率最大值*/

Boolean pxd;         /* External propagation done this frame */
Boolean ooo;         /* Instance potentially out of order */

 #ifdef SANITY
  int ipos;
 #endif
 };

/* A tokenset is effectively a state instance 狀態的令牌結構體*/
typedef struct tokenset
{
short n;                  /* Number of rtok valid (0==1-best, 1>==N-best) n=0只有一條最佳路徑。N>=1則有N條最佳路徑*/
RelToken *set;            /* Likelihood sorted array[0..nToks] of rtoks 選擇N-BEST後用到,用於保存N條最佳路徑信息*/
Token tok;                /* Most likely Token in state 最佳路徑信息*/
}
TokenSet;

/* Tokens are reasonably standard except for extra Align field 當前最佳路徑的信息*/
typedef struct token
 {
LogDouble like;	/* Likelihood of token 當前時刻概率最大值*/
LogFloat lm;         /* LM likelihood of token 語言模型轉移概率*/
Path *path;		/* Route (word level) through network 單詞級別路徑信息*/
Align *align;        /* Route (state/model level) through network 狀態級別路徑信息*/
}
Token;

/*記錄單詞級別的路徑信息*/
struct path
{
Path *prev;		/* Previous word record 用於保存單詞級別的識別結果*/
LogDouble like;      /* Likelihood at boundary 進入新單詞時的概率*/
LogFloat lm;         /* LM likelihood of current word 單詞之間的轉移概率*/

NxtPath *chain;      /* Next of NBest Paths */
   
/* Pron pron;		Word level traceback info */
NetNode *node;       /* Word level traceback info 這條路徑對應哪個節點*/
int frame;           /* Time (frame) of boundary (end of word) 當前是第幾時間幀*/
Align *align;        /* State/model traceback for this word 對應的狀態級別路徑信息*/

Boolean used;        /* Reference to struct by current inst 本路徑是否被使用過*/
int usage;           /* Times struct ref'd (by next path) 本路徑被使用的次數*/

Path *link;          /* Next path in list 指向後繼節點實例*/
Path *knil;          /* Prev path in list 指向前繼節點實例*/
};

/* Extra alignments information for state/model level traceback 記錄狀態級別的路徑信息*/
struct align
{
 short state;         /* State level traceback info 對應的狀態*/
 NetNode *node;       /* Node for which alignment information present 對應的節點*/
 Align *prev;         /* Previous align record 用於保存狀態級別的識別結果*/

 LogDouble like;      /* Likelihood upon entering state/model end 進入新狀態時的概率*/
 int frame;           /* Frame number upon entering state/model end 當前是第幾時間幀*/
   
 Boolean used;        /* Reference to struct by current inst 本路徑是否被使用過*/
 int usage;           /* Times struct ref'd (by align or path) 本路徑被使用的次數*/

 Align *link;         /* Next align in list 指向後繼節點實例*/
 Align *knil;         /* Prev align in list 指向前繼節點實例*/
 };
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章