Julius 4.2
関数
libjulius/src/search_bestfirst_v1.c

第2パスのViterbi演算および仮説スコア計算 (高速版) [詳細]

#include <julius/julius.h>

ソースコードを見る。

関数

static void free_node_exec (NODE *node)
 < Define if want triphone debug messages
void free_node (NODE *node)
 仮説ノードの利用を終了してリサイクル用にストックする
void clear_stocker (StackDecode *s)
 リサイクル用ノード格納庫を空にする.
NODEcpy_node (NODE *dst, NODE *src)
 仮説をコピーする.
NODEnewnode (RecogProcess *r)
 新たな仮説ノードを割り付ける.
void malloc_wordtrellis (RecogProcess *r)
 1単語分のトレリス計算用のワークエリアを確保.
void free_wordtrellis (StackDecode *dwrk)
 1単語分のトレリス計算用のワークエアリアを解放
static LOGPROB get_max_out_arc (HTK_HMM_Trans *tr, int state_num)
 最終状態への遷移確率の最大値を求める (multipath)
static LOGPROB max_out_arc (HMM_Logical *l)
 音素の出力状態への遷移確率の最大値を求める.
void scan_word (NODE *now, HTK_Param *param, RecogProcess *r)
 最後の1単語の前向きトレリスを計算して,文仮説の前向き尤度を更新する.
void next_word (NODE *now, NODE *new, NEXTWORD *nword, HTK_Param *param, RecogProcess *r)
 展開元仮説に次単語を接続して新しい仮説を生成する.
void start_word (NODE *new, NEXTWORD *nword, HTK_Param *param, RecogProcess *r)
 与えられた単語から初期仮説を生成する.
void last_next_word (NODE *now, NODE *new, HTK_Param *param, RecogProcess *r)
 終端処理:終端まで達した文仮説の最終的なスコアをセットする.

説明

第2パスのViterbi演算および仮説スコア計算 (高速版)

ここでは,第2パスにおいて探索中の仮説のViterbiスコアの更新演算, 次単語とのトレリス接続,および仮説のスコア計算を行う関数が定義されて います.

単語接続部の単語間音素環境依存性は,高速な backscan アルゴリズムに よって行われます. このファイルで定義されている関数は,config.h において PASS2_STRICT_IWCD が undef であるときに使用されます. 逆に上記が define されているときは,search_bestfirst_v2.c の関数が用いられます.

Backscan アルゴリズムでは,デコーディングの高速化のため, 次単語とその前の単語の接続点について,「単語間音素コンテキストの遅延処理」 を行ないます:

  1. 新仮説の生成(next_word())では,次単語の最後の音素の右コンテキスト のみが考慮される.
  2. その単語間の完全な音素環境依存性は,その仮説がいったんスタックに 入った後もう一度 POP されたときに scan_word() にて改めて計算する.

仮説生成時にはすべての生成仮説に対して依存計算を行なず,あとでスコアが 高く POP された仮説についてのみ再計算を行ないます. このため処理が 高速化されますが,仮説スコア計算(next_word())において次単語接続部分の 環境依存性が考慮されないので, 探索中のスコアに誤差が生じる場合があります.

実装について:

  1. next_word() では,次単語の最後の音素のみを右コンテキスト(=展開元 単語の最初の音素)を考慮して変化させ,トレリス接続点の出力確率を求める.
  2. scan_word() では,新単語部分ともう1つ前の単語の最初の音素を変化 させ,scan する. そのため新単語部分だけでなく,そのもう一音素前まで scan の対象となる. この "1-phoneme backscan" を行なうため, 各仮説ノードは最終HMM状態の前向きスコア (NODEにおける g[]) だけでなく, その backscan 開始点(もう1つ前の単語の最初の音素の手前)のスコア も保存しておく必要がある (NODE における g_prev[]).

なお,1音素のみからなる単語では backscan 開始点と単語境界が重なることを 考慮する必要があるため,実装はもう少し複雑になる.

作者:
Akinobu Lee
日付:
Sun Sep 11 23:54:53 2005
Revision:
1.6

search_bestfirst_v1.c で定義されています。


関数

static void free_node_exec ( NODE node) [static]

< Define if want triphone debug messages

仮説ノードを実際にメモリ上から解放する.

引数:
node[in] 仮説ノード

search_bestfirst_v1.c138 行で定義されています。

参照元 clear_stocker().

void free_node ( NODE node)

仮説ノードの利用を終了してリサイクル用にストックする

引数:
node[in] 仮説ノード

search_bestfirst_v1.c170 行で定義されています。

参照元 free_all_nodes(), pass2_finalize_on_no_result(), put_all_in_stack(), put_to_stack(), result_reorder_and_output(), と wchmm_fbs().

関数の呼び出しグラフ:

呼出しグラフ:

void clear_stocker ( StackDecode s)

リサイクル用ノード格納庫を空にする.

引数:
s[in] stack decoding work area

search_bestfirst_v1.c206 行で定義されています。

参照元 wchmm_fbs().

関数の呼び出しグラフ:

呼出しグラフ:

NODE* cpy_node ( NODE dst,
NODE src 
)

仮説をコピーする.

引数:
dst[out] コピー先の仮説
src[in] コピー元の仮説
戻り値:
dst を返す.

search_bestfirst_v1.c247 行で定義されています。

参照元 last_next_word(), と wchmm_fbs().

呼出しグラフ:

NODE* newnode ( RecogProcess r)

新たな仮説ノードを割り付ける.

もし格納庫に以前試用されなくなった ノードがある場合はそれを再利用する. なければ新たに割り付ける.

引数:
r[in] 認識処理インスタンス
戻り値:
新たに割り付けられた仮説ノードへのポインタを返す.

search_bestfirst_v1.c324 行で定義されています。

参照元 pass2_finalize_on_no_result(), と wchmm_fbs().

関数の呼び出しグラフ:

呼出しグラフ:

void malloc_wordtrellis ( RecogProcess r)

1単語分のトレリス計算用のワークエリアを確保.

引数:
r[in] 認識処理インスタンス

search_bestfirst_v1.c427 行で定義されています。

参照元 wchmm_fbs().

関数の呼び出しグラフ:

呼出しグラフ:

static LOGPROB get_max_out_arc ( HTK_HMM_Trans tr,
int  state_num 
) [static]

最終状態への遷移確率の最大値を求める (multipath)

引数:
tr[in] 遷移行列
state_num[in] 状態数
戻り値:
最終状態への遷移確率への最大値を返す.

search_bestfirst_v1.c527 行で定義されています。

参照元 max_out_arc().

static LOGPROB max_out_arc ( HMM_Logical l) [static]

音素の出力状態への遷移確率の最大値を求める.

(multipath)

引数:
l[in] 音素
戻り値:
出力状態への遷移確率の最大値を返す.

search_bestfirst_v1.c558 行で定義されています。

参照元 scan_word().

void scan_word ( NODE now,
HTK_Param param,
RecogProcess r 
)

最後の1単語の前向きトレリスを計算して,文仮説の前向き尤度を更新する.

引数:
now[i/o] 文仮説
param[in] 入力パラメータ列
r[in] 認識処理インスタンス

< Temporal pointer to current buffer

< Temporal pointer to previous buffer

search_bestfirst_v1.c585 行で定義されています。

参照元 wchmm_fbs().

関数の呼び出しグラフ:

呼出しグラフ:

void next_word ( NODE now,
NODE new,
NEXTWORD nword,
HTK_Param param,
RecogProcess r 
)

展開元仮説に次単語を接続して新しい仮説を生成する.

次単語の単語トレリス上の スコアから最尤接続点を求め,仮説スコアを計算する.

引数:
now[in] 展開元仮説
new[out] 新たに生成された仮説が格納される
nword[in] 接続する次単語の情報
param[in] 入力パラメータ列
r[in] 認識処理インスタンス

search_bestfirst_v1.c1378 行で定義されています。

参照元 wchmm_fbs().

関数の呼び出しグラフ:

呼出しグラフ:

void start_word ( NODE new,
NEXTWORD nword,
HTK_Param param,
RecogProcess r 
)

与えられた単語から初期仮説を生成する.

引数:
new[out] 新たに生成された仮説が格納される
nword[in] 初期仮説単語の情報
param[in] 入力パラメータ列
r[in] 認識処理インスタンス

search_bestfirst_v1.c1607 行で定義されています。

参照元 wchmm_fbs().

関数の呼び出しグラフ:

呼出しグラフ:

void last_next_word ( NODE now,
NODE new,
HTK_Param param,
RecogProcess r 
)

終端処理:終端まで達した文仮説の最終的なスコアをセットする.

引数:
now[in] 終端まで達した仮説
new[out] 最終的な文仮説のスコアを格納する場所へのポインタ
param[in] 入力パラメータ列
r[in] 認識処理インスタンス

search_bestfirst_v1.c1697 行で定義されています。

参照元 wchmm_fbs().

関数の呼び出しグラフ:

呼出しグラフ: