2004年3月12日

[julius-u:00164] Re: HMnetの認識でcoredump

奈良先端大の 李 です.

ご指摘ありがとうございます.

> 「triphoneのうち,(a-r+aとi-r+aのような)コンテキストが異なる同じ音素も
> すべて同じトポロジーである」
> ことを想定していて,そうではないHMnetなどの複雑なモデルでは
> 落ちてしまうことがあるとの結論に至りました。

はい,結果的にはご指摘のとおりです.


Juliusでは第1パスの単語間triphoneの計算時に,単語の先頭の音素モデルを,
その直前の単語コンテキストを考慮して切り替えています.
例えば "a k i" という単語がある場合,この単語の先頭音素は木構造化辞書で
biphone 'a+k' となっています.第1パス探索中に直前単語が例えば "w a"だっ
たとすると,それに従ってこの先頭音素は triphone 'a-a+k' の尤度が計算さ
れ,割り当てられます.

ここで,実際には各状態について,音響尤度を triphone 'a-a+k' の対応する
状態 (rset->state_loc) から計算して割り当てるだけで,木構造化辞書上の
トポロジは biphone 'a+k' のままとなっています.これは,木構造化辞書の
構造を探索中に動的に作り替えるのは難しいためこのような仕様になっていま
す.従って,第1パスでは単語先頭で厳密な triphone は計算されません.

ただし,今回ご指摘のように,入れ替える前の biphone の状態数と入れ替え
たあとの triphone の状態数が異なるとエラーとなりますね.

対処としては,とりあえず単語末尾の音素と同様に,
この第1パスの単語先頭のトライフォンの扱いを,トライフォンを引かずに
バイフォンのまま計算するようにすれば動くと思います.
具体的には,ご指摘の以下のトライフォンに入れ替えている部分,
----------------------------------------------------------------------
outprob_style.c:194
if ((ohmm = get_left_context_HMM(rset->hmm, (winfo->wseq[last_wid][winfo->wlen[last_wid]-1])->name, hmminfo)) != NULL) {
rhmm = ohmm;
} else {
/* if triphone not found, try to use the bi-phone itself */
rhmm = rset->hmm;
....
}
----------------------------------------------------------------------
を,
----------------------------------------------------------------------
rhmm = rset->hmm
----------------------------------------------------------------------
と変えることで,元のバイフォン (rset->hmm) をそのまま使うようになると
思います.

第1パスの性能は若干落ちますが,第2パスで単語間 triphone は再計算され
るので,第1パスのビーム幅さえ十分に与えていればそれほど精度に影響はな
いかもしれません.

では失礼します.
--
李 晃伸 (ri@xxxxx)
奈良先端科学技術大学院大学(奈良先端大)
情報科学研究科 音情報処理学講座 助手

投稿者 xml-rpc : 2004年3月12日 15:09
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/3800
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。