Julius 4.2
マクロ定義 | 関数
libjulius/src/beam.c

フレーム同期ビーム探索の実行(第1パス) [詳細]

#include <julius/julius.h>

ソースコードを見る。

マクロ定義

#define SD(A)   tindex_local[A-1]
 Index locater for sort_token_*()
#define SCOPY(D, S)   D = S
 Content copier for sort_token_*()
#define SVAL(A)   (tlist_local[tindex_local[A-1]].score)
 Score locater for sort_token_*()
#define STVAL   (tlist_local[s].score)
 Indexed score locater for sort_token_*()

関数

static void put_atom (TRELLIS_ATOM *atom, WORD_INFO *winfo)
 あるトレリス単語の情報をテキストで出力 (デバッグ用)
static LOGPROB trace_backptr (WORD_ID wordseq_rt[MAXSEQNUM], int *rt_wordlen, TRELLIS_ATOM *atom, WORD_INFO *winfo)
 認識結果の単語トレリス上の最尤単語系列を求める
static void find_1pass_result (int framelen, RecogProcess *r)
 第1パスの認識処理結果から認識結果を判定し,最尤単語系列を見つける.
static int compare_backscore (TRELLIS_ATOM **x1, TRELLIS_ATOM **x2)
 トレリス単語をスコアでソートするqsort関数.
static void find_1pass_result_word (int framelen, RecogProcess *r)
 find_1pass_result() の単語認識モード版.
static void bt_current_max (RecogProcess *r, int t)
 第1パスの処理中に,あるフレームまでのベストパスを表示する.
static void bt_current_max_word (RecogProcess *r, int t)
 第1パスの処理中に,あるフレーム上の最尤単語を表示する(デバッグ用)
static void malloc_nodes (FSBeam *d, int n, int ntoken_init)
 第1パスのビーム探索用の初期ワークエリアを確保する.
static void expand_tlist (FSBeam *d)
 第1パスのビーム探索用のワークエリアを伸ばして再確保する.
static void prepare_nodes (FSBeam *d, int ntoken_step)
 ノード情報を初期化する.
static void free_nodes (FSBeam *d)
 第1パスのビーム探索用のワークエリアを全て解放する.
static void clear_tlist (FSBeam *d, int tt)
 トークンスペースをリセットする.
static void clear_tokens (FSBeam *d, int tt)
 アクティブトークンリストをクリアする.
static TOKENID create_token (FSBeam *d)
 トークンスペースから新たなトークンを取りだす.
static void node_assign_token (FSBeam *d, int node, TOKENID tkid)
 木構造化辞書のノードにトークンを割り付ける.
static TOKENID node_exist_token (FSBeam *d, int tt, int node, WORD_ID wid)
 木構造化辞書上のあるノードが,現在なんらかのトークンを 保持しているかをチェックする.
static void sort_token_upward (FSBeam *d, int neednum, int totalnum)
 トークンスペースをスコアの大きい順にソートする.
static void sort_token_downward (FSBeam *d, int neednum, int totalnum)
 トークンスペースをスコアの小さい順にソートする.
static void sort_token_no_order (FSBeam *d, int neednum, int *start, int *end)
 トークンスペースをソートしてビーム内に残るトークンを決定する
static boolean init_nodescore (HTK_Param *param, RecogProcess *r)
 初期仮説の生成
boolean get_back_trellis_init (HTK_Param *param, RecogProcess *r)
 フレーム同期ビーム探索の初期化
static void propagate_token (FSBeam *d, int next_node, LOGPROB next_score, TRELLIS_ATOM *last_tre, WORD_ID last_cword, LOGPROB last_lscore)
 トークンを次ノードに伝搬する.
static void beam_intra_word_core (WCHMM_INFO *wchmm, FSBeam *d, TOKEN2 **tk_ret, int j, int next_node, LOGPROB next_a)
 単語内のあるノード間の遷移を行う.
static void beam_intra_word (WCHMM_INFO *wchmm, FSBeam *d, TOKEN2 **tk_ret, int j)
 単語内遷移を行う.
static TRELLIS_ATOMsave_trellis (BACKTRELLIS *bt, WCHMM_INFO *wchmm, TOKEN2 *tk, int t, boolean final_for_multipath)
 トークンからトレリス単語を保存する.
static void beam_inter_word (WCHMM_INFO *wchmm, FSBeam *d, TOKEN2 **tk_ret, TRELLIS_ATOM *tre, int j)
 単語末トークンからの単語間遷移.
boolean get_back_trellis_proceed (int t, HTK_Param *param, RecogProcess *r, boolean final_for_multipath)
 フレーム同期ビーム探索を進行する.
void get_back_trellis_end (HTK_Param *param, RecogProcess *r)
 フレーム同期ビーム探索:最終フレーム
void finalize_1st_pass (RecogProcess *r, int len)
 第1パスの終了処理を行う.
void fsbeam_free (FSBeam *d)
 第1パスのためのワークエリア領域を開放する

説明

フレーム同期ビーム探索の実行(第1パス)

第1パスのフレーム同期ビーム探索を実際に実行する関数群です. 認識処理インスタンスごとに実行されます. 初期化,1フレームの認識処理,終了処理,第1パスの結果決定,セグメント 終了の検知などの処理が含まれています.

アルゴリズムについては,単語履歴近似は 1-best 近似がデフォルトです が,単語対近似も使用可能です. 単語N-gram では単語間の接続制約は 1-gram factoring (2-gram factoring も選択可)を用いて計算されます. 文法の 場合,木構造化辞書は文法のカテゴリ単位で作成され,単語間の接続(単語 対制約)は単語間遷移で適用されます. 単語認識モードでは単語間接続は 考慮されません.

作者:
Akinobu LEE
日付:
Tue Feb 22 17:00:45 2005
Revision:
1.17

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


関数

static void put_atom ( TRELLIS_ATOM atom,
WORD_INFO winfo 
) [static]

あるトレリス単語の情報をテキストで出力 (デバッグ用)

引数:
atom[in] 出力するトレリス単語
winfo[in] 単語辞書

beam.c251 行で定義されています。

参照元 trace_backptr().

static LOGPROB trace_backptr ( WORD_ID  wordseq_rt[MAXSEQNUM],
int *  rt_wordlen,
TRELLIS_ATOM atom,
WORD_INFO winfo 
) [static]

認識結果の単語トレリス上の最尤単語系列を求める

与えられたトレリス単語から入力始端に向かって単語トレリス上を トレースバックし, その最尤単語系列候補およびその言語スコアを返す. 起点となる最初のトレリス単語が与えられる必要がある.

引数:
wordseq_rt[out] 結果の最尤単語系列が格納されるバッファ
rt_wordlen[out] wordseq_rt の長さ
atom[in] バックトレースの起点となるトレリス単語
winfo[in] 単語辞書
戻り値:
得られた最尤単語系列の言語スコア.

beam.c293 行で定義されています。

参照元 bt_current_max(), と find_1pass_result().

static void find_1pass_result ( int  framelen,
RecogProcess r 
) [static]

第1パスの認識処理結果から認識結果を判定し,最尤単語系列を見つける.

第1パスの計算結果である単語トレリスから,第1パスでの最尤候補を求 め,インスタンス内の result.pass1 に保存する. 候補が得られない場合 はエラー(探索誤り:コード -1)となる.

ショートポーズセグメンテーション時は,認識結果が無音単語のみからなる場合, エラー(デコーダによる棄却:コード -4)となる.

また,WORD_GRAPH 定義時は,この関数内でさらに generate_lattice() を 呼び出し,単語グラフの抽出を行う.

引数:
framelen[in] 第1パスで処理が到達したフレーム数
r[in] 認識処理インスタンス

beam.c371 行で定義されています。

参照元 finalize_1st_pass().

static int compare_backscore ( TRELLIS_ATOM **  x1,
TRELLIS_ATOM **  x2 
) [static]

トレリス単語をスコアでソートするqsort関数.

引数:
x1[in] 要素1へのポインタ
x2[in] 要素2へのポインタ
戻り値:
qsort の値

beam.c549 行で定義されています。

参照元 find_1pass_result_word().

static void find_1pass_result_word ( int  framelen,
RecogProcess r 
) [static]

find_1pass_result() の単語認識モード版.

単語認識モードでは第1パスで 認識を終了するので,得られた候補は通常の第2パスと同じ場所に格納する.

引数:
framelen[in] 第1パスで処理が到達したフレーム数
r[i/o] 認識処理インスタンス

beam.c574 行で定義されています。

参照元 finalize_1st_pass().

static void bt_current_max ( RecogProcess r,
int  t 
) [static]

第1パスの処理中に,あるフレームまでのベストパスを表示する.

引数:
r[i/o] 認識処理インスタンス
t[in] 現在の入力フレーム

beam.c875 行で定義されています。

参照元 get_back_trellis_proceed().

static void bt_current_max_word ( RecogProcess r,
int  t 
) [static]

第1パスの処理中に,あるフレーム上の最尤単語を表示する(デバッグ用)

引数:
r[i/o] 認識処理インスタンス
t[in] 現在の入力フレーム

beam.c934 行で定義されています。

参照元 get_back_trellis_proceed().

static void malloc_nodes ( FSBeam d,
int  n,
int  ntoken_init 
) [static]

第1パスのビーム探索用の初期ワークエリアを確保する.

足りない場合は探索中に動的に伸長される.

引数:
d[i/o] 第1パス探索処理用ワークエリア
n[in] 木構造化辞書のノード数
ntoken_init[in] 最初に確保するトークンの数

beam.c996 行で定義されています。

参照元 get_back_trellis_init().

static void expand_tlist ( FSBeam d) [static]

第1パスのビーム探索用のワークエリアを伸ばして再確保する.

引数:
d[i/o] 第1パス探索処理用ワークエリア

beam.c1024 行で定義されています。

参照元 create_token().

static void prepare_nodes ( FSBeam d,
int  ntoken_step 
) [static]

ノード情報を初期化する.

Julius は,木構造化辞書のサイズが直前の入力 時と変化がないときは,この関数によってノード情報を初期化するだけで よい. サイズが変更されているときはノードを開放・再確保する.

引数:
d[i/o] work area for 1st pass recognition processing
ntoken_step[in] required token step

beam.c1053 行で定義されています。

参照元 get_back_trellis_init().

static void free_nodes ( FSBeam d) [static]

第1パスのビーム探索用のワークエリアを全て解放する.

引数:
d[i/o] 第1パス探索処理用ワークエリア

beam.c1074 行で定義されています。

参照元 fsbeam_free(), と get_back_trellis_init().

static void clear_tlist ( FSBeam d,
int  tt 
) [static]

トークンスペースをリセットする.

引数:
d[i/o] 第1パス探索処理用ワークエリア
tt[in] ワークエリアID (0 または 1)

beam.c1101 行で定義されています。

参照元 get_back_trellis_proceed().

static void clear_tokens ( FSBeam d,
int  tt 
) [static]

アクティブトークンリストをクリアする.

引数:
d[i/o] 第1パス探索処理用ワークエリア
tt[in] 直前のワークエリアID (0 または 1)

beam.c1121 行で定義されています。

参照元 get_back_trellis_proceed().

static TOKENID create_token ( FSBeam d) [static]

トークンスペースから新たなトークンを取りだす.

引数:
d[i/o] 第1パス探索処理用ワークエリア
戻り値:
新たに取り出されたトークンのID

beam.c1147 行で定義されています。

参照元 init_nodescore(), と propagate_token().

static void node_assign_token ( FSBeam d,
int  node,
TOKENID  tkid 
) [static]

木構造化辞書のノードにトークンを割り付ける.

木構造化辞書のノードのアクティブトークンリストにトークンを保存する. またトークンスペースにおいてトークンからノード番号へのリンクを保存する.

既にトークンがある場合は,新たなトークンによって上書きされる. なお WPAIR 指定時はそのリストに新たなトークンを追加する.

引数:
d[i/o] 第1パス探索処理用ワークエリア
node[in] 木構造化辞書のノード番号
tkid[in] トークン番号

beam.c1193 行で定義されています。

参照元 init_nodescore(), と propagate_token().

static TOKENID node_exist_token ( FSBeam d,
int  tt,
int  node,
WORD_ID  wid 
) [static]

木構造化辞書上のあるノードが,現在なんらかのトークンを 保持しているかをチェックする.

WPAIR が定義されている場合,ノードは直前単語ごとに異なるトークンを複数 保持する. この場合, 指定された単語IDを直前単語とするトークンが そのノードに保持されているかどうかがチェックされる. すなわち,既にトークン が存在しても,そのトークンの表すパスの直前単語が指定した単語と異なって いれば未保持 (TOKENID_UNDEFINED) を返す.

引数:
d[i/o] 第1パス探索処理用ワークエリア
tt[in] 直前のワークエリアID (0 または 1)
node[in] ノード番号
wid[in] 直前単語のID (WPAIR定義時のみ有効, 他では無視される)
戻り値:
そのノードが既に保持するトークン番号,無ければ TOKENID_UNDEFINED.

beam.c1240 行で定義されています。

参照元 init_nodescore(), と propagate_token().

static void sort_token_upward ( FSBeam d,
int  neednum,
int  totalnum 
) [static]

トークンスペースをスコアの大きい順にソートする.

heap sort を用いて現在のトークン集合をスコアの大きい順にソートする. 上位 neednum 個のトークンがソートされればそこで処理を終了する.

引数:
d[i/o] 第1パス探索処理用ワークエリア
neednum[in] 上位 neednum 個が得られるまでソートする
totalnum[in] トークンスペース内の有効なトークン数

beam.c1341 行で定義されています。

参照元 sort_token_no_order().

static void sort_token_downward ( FSBeam d,
int  neednum,
int  totalnum 
) [static]

トークンスペースをスコアの小さい順にソートする.

ビームのしきい値決定のために,heap sort を用いて 現在のトークン集合をスコアの小さい順にソートする. 下位 neednum 個のトークンがソートされればそこで処理を終了する.

引数:
d[i/o] 第1パス探索処理用ワークエリア
neednum[in] 下位 neednum 個が得られるまでソートする
totalnum[in] トークンスペース内の有効なトークン数

beam.c1413 行で定義されています。

参照元 sort_token_no_order().

static void sort_token_no_order ( FSBeam d,
int  neednum,
int *  start,
int *  end 
) [static]

トークンスペースをソートしてビーム内に残るトークンを決定する

heap sort を用いて現在のトークン集合をソートし,上位スコアのトークン 集合を求める. 上位 neednum 個のトークン集合が得られれば良いので, 全体が完全にソートされている必要はない. よって 上位 neednum 個のトークンのみをソートする. 実際には,全体のトークン 数と必要なトークン数から sort_token_upward()sort_token_downward() の早い方が用いられる.

引数:
d[i/o] 第1パス探索処理用ワークエリア
neednum[in] 求める上位トークンの数
start[out] 上位 neednum のトークンが存在するトークンスペースの最初のインデックス番号
end[out] 上位 neednum のトークンが存在するトークンスペースの最後のインデックス番号

beam.c1491 行で定義されています。

参照元 get_back_trellis_init(), と get_back_trellis_proceed().

static boolean init_nodescore ( HTK_Param param,
RecogProcess r 
) [static]

初期仮説の生成

初期仮説は,N-gramでは winfo->head_silwid に固定されている. DFA では 文法上文頭にきうる単語すべてが初期仮説となる. 単語認識モードでは 全ての単語が初期仮説となる.

音響モデルが非multipathの場合,ここで最初のフレームの出力確率 計算まで行われる.

引数:
param[in] 入力ベクトル列情報(最初のフレームのみ必要)
r[in] 音声認識処理インスタンス

beam.c1551 行で定義されています。

参照元 get_back_trellis_init().

boolean get_back_trellis_init ( HTK_Param param,
RecogProcess r 
)

フレーム同期ビーム探索の初期化

ここではビームサーチに用いるワークエリアの確保と初期化を行う. 初期化説の生成は init_nodescore() で行われる.

引数:
param[in] 入力ベクトル列情報 (最初の1フレーム目のみ用いられる)
r[i/o] 音声認識処理インスタンス

beam.c1791 行で定義されています。

参照元 decode_proceed().

関数の呼び出しグラフ:

呼出しグラフ:

static void propagate_token ( FSBeam d,
int  next_node,
LOGPROB  next_score,
TRELLIS_ATOM last_tre,
WORD_ID  last_cword,
LOGPROB  last_lscore 
) [static]

トークンを次ノードに伝搬する.

引数:
d[i/o] work area for 1st pass recognition processing
next_node[in] next node id
next_score[in] score when transmitted to the next node
last_tre[in] previous word context for the next node
last_cword[in] previous context-valid word for the next node
last_lscore[in] LM score to be propagated

beam.c1910 行で定義されています。

参照元 beam_inter_word(), と beam_intra_word_core().

static void beam_intra_word_core ( WCHMM_INFO wchmm,
FSBeam d,
TOKEN2 **  tk_ret,
int  j,
int  next_node,
LOGPROB  next_a 
) [static]

単語内のあるノード間の遷移を行う.

引数:
wchmm[in] 木構造化辞書
d[i/o] 第1パスワークエリア
tk_ret[i/o] 伝搬元のトークン(内部でポインタ更新時は上書き)
j[in] tk_ret の元のトークンリストのID
next_node[in] 遷移先のノード番号
next_a[in] 遷移確率

< Temporal work to hold the current node number on the lexicon tree

beam.c1966 行で定義されています。

参照元 beam_intra_word().

static void beam_intra_word ( WCHMM_INFO wchmm,
FSBeam d,
TOKEN2 **  tk_ret,
int  j 
) [static]

単語内遷移を行う.

引数:
wchmm[in] 木構造化辞書
d[i/o] 第1パスワークエリア
tk_ret[i/o] 伝搬元のトークン(内部でポインタ更新時は上書き)
j[in] tk_ret の元のトークンリストのID

< Temporal work to hold the next states of a node

beam.c2116 行で定義されています。

参照元 get_back_trellis_proceed().

static TRELLIS_ATOM* save_trellis ( BACKTRELLIS bt,
WCHMM_INFO wchmm,
TOKEN2 tk,
int  t,
boolean  final_for_multipath 
) [static]

トークンからトレリス単語を保存する.

引数:
bt[i/o] バックトレリス構造体
wchmm[in] 木構造化辞書
tk[in] 単語末端に到達しているトークン
t[in] 現在の時間フレーム
final_for_multipath[in] 入力最後の1回処理時 TRUE
戻り値:
新たに格納されたトレリス単語へのポインタ

beam.c2171 行で定義されています。

参照元 get_back_trellis_end(), と get_back_trellis_proceed().

static void beam_inter_word ( WCHMM_INFO wchmm,
FSBeam d,
TOKEN2 **  tk_ret,
TRELLIS_ATOM tre,
int  j 
) [static]

単語末トークンからの単語間遷移.

引数:
wchmm[in] 木構造化辞書
d[i/o] 第1パスワークエリア
tk_ret[in] 伝搬元の単語末トークン
tre[in] tk_ret から生成されたトレリス単語
j[in] tk_ret の元のトークンリストのID

< Temporal pointer to hold inter-word cache array

beam.c2232 行で定義されています。

参照元 get_back_trellis_proceed().

boolean get_back_trellis_proceed ( int  t,
HTK_Param param,
RecogProcess r,
boolean  final_for_multipath 
)

フレーム同期ビーム探索を進行する.

与えられた1フレーム分,探索処理を進める. また,フレーム内に残った 単語を単語トレリス構造体に保存する. ショートポーズセグメンテーション時 はセグメント終了の判断もこの中から呼び出される.

引数:
t[in] 現在のフレーム (このフレームについて計算が進められる)
param[in] 入力ベクトル列構造体 (t 番目のフレームのみ用いられる)
r[in] 認識処理インスタンス
final_for_multipath[i/o] 入力最後のフレームを処理するときに TRUE
戻り値:
TRUE (通常どおり終了) あるいは FALSE (ここで探索を中断する 場合: 逐次デコーディング時にショートポーズ区間を検出したか,ビーム内の アクティブノード数が0になったとき)

< Local workarea to hold the generated trellis word

< Temporal work to hold the current node number on the lexicon tree

beam.c2606 行で定義されています。

参照元 decode_proceed(), と get_back_trellis_end().

関数の呼び出しグラフ:

呼出しグラフ:

void get_back_trellis_end ( HTK_Param param,
RecogProcess r 
)

フレーム同期ビーム探索:最終フレーム

第1パスのフレーム同期ビーム探索を終了するために, (param->samplenum -1) の最終フレームに対する終了処理を行う.

引数:
param[in] 入力ベクトル列 (param->samplenum の値のみ用いられる)
r[in] 音声認識処理インスタンス

beam.c2995 行で定義されています。

参照元 decode_end().

関数の呼び出しグラフ:

呼出しグラフ:

void finalize_1st_pass ( RecogProcess r,
int  len 
)

第1パスの終了処理を行う.

この関数は get_back_trellis_end() の直後に呼ばれ,第1パスの終了処理を 行う. 生成した単語トレリス構造体の最終的な後処理を行い第2パスで アクセス可能な形に内部を変換する. また, 仮説のバックトレースを行い第1パスのベスト仮説を出力する.

引数:
r[in] 認識処理インスタンス
len[in] 第1パスで処理された最終的なフレーム長
戻り値:
第1パスの最尤仮説の累積尤度,あるいは仮説が見つからない場合 は LOG_ZERO.

beam.c3076 行で定義されています。

参照元 decode_end(), と decode_end_segmented().

関数の呼び出しグラフ:

呼出しグラフ:

void fsbeam_free ( FSBeam d)

第1パスのためのワークエリア領域を開放する

引数:
d[in] work are for 1st pass input handling

beam.c3122 行で定義されています。

参照元 j_recogprocess_free().

関数の呼び出しグラフ:

呼出しグラフ: