2004年3月21日

[julius-u:00166] Re: tmix_read fuction bug ?

奈良先端大の 李 です。

以下、かなり専門的なお話ですが・・・

> 数理システムの齋藤と申します。初めて投稿させていただきます。
>
> 現在Julius(version 3.4)のソースをハックしているのですが、
>
> libsent/src/hmminfo/rdhmmdef_tiedmix.c tmix_read関数内 115-116行目
>

> > /* set pointer to the GCODEBOOK structure */
> > state->b = (HTK_HMM_Dens **)thebook;
>
> となっています。thebookはGCODEBOOK型の変数で、GCODEBOOK型は
>
> libsent/include/sent/htk_hmm.h内で
>
> /* Gaussian(mixture) codebook for tied-mixture model */
> typedef struct {
> char *name; /* codebook name */
> int num; /* # of mixtures in the codebook */
> HTK_HMM_Dens **d; /* pointer to each mixture info */
> unsigned short id;
> } GCODEBOOK;
>
> のように宣言されています。ですから、116行目は
>
> > state->b = (HTK_HMM_Dens **)thebook->d;
>
> が適当と思うのですが、いかがでしょうか。

いえ、state->b = (HTK_HMM_Dens **)thebook; で合っています。
これは tied-mixture モデル使用時の設定です。

通常の音響モデルでは、HMM状態ごとに混合ガウス分布を定義しており、
この各状態(state)に属するガウス分布のリストが state->b に格納されます。
これに対して、tied-mixture形式の音響モデルの場合、ガウス分布集合は
状態間で共有されるため、ガウス分布のリストは状態から切り離されて
定義されます。この場合、Julius では このガウス分布リスト定義を
GCODEBOOK 構造体に格納して、各HMM状態からは、そのガウス分布リスト
へのポインタ、およびその中の各要素に対する重みパラメータ配列を
定義するようになっています。
このため、tied-mixtureモデル使用時には、
state->b には通常の混合分布リストではなく、
代わりにガウス分布リスト(GCODEBOOK)のポインタ thebook が記録されます。
thebook->d だけ記録すると、コードブックのサイズ (thebook->num) など
のデータが計算時に参照できませんので、thebook へのポインタを
保存しています。

異なるデータ型 (HTK_HMM_Dens ** と GCODEBOOK *)へのポインタを
格納しているので、プログラムスタイル的には良くないですね。
本来なら GCODEBOOK の定義を下記のようにunion で定義するのが
筋かもしれません。

typedef struct {
char *name; /* codebook name */
int num; /* # of mixtures in the codebook */
struct union {
HTK_HMM_Dens **d; /* pointer to each mixture info */
GCODEBOOK *book /* pointer to gcodebook info */
} mixlist;
unsigned short id;
} GCODEBOOK;

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

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




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