每個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 指向前繼節點實例*/
};