2003年6月17日

[julius-u:00131] Patch for 3.3p4

坂野@名古屋大です.

Julius 3.3p4のバグを修正しましたので報告させて頂きます.

#Julius for Windowsと,Juliuslibの3.3p4対応版ももうすぐ
正式リリースします.お待ちの方は(いるんだろうか?),
いましばらくお待ち下さい.

----
現象:

RealtimeParam (realtime-1stpass.c) の中の
get_back_trellis_proceed (beam.c) の
最初の for ループの

/* tk: token data node: lexicon tree node ID that holds the 'tk' */
tk = &(tlist[tl][tindex[tl][j]]);

の部分で落ちる。特に長時間Juliusを実行した場合に発生しやすい。


原因:
RealTimePipeLineのf_raw が f_delayよりも小さいときに
get_back_trellis_initが実行されていない。


原因詳細:

1. f_rawがf_delayに達しないうちに、以下の所で
関数 RealTimePipeLine (realtime-1stpass.c) が終了してしまう。

if (windownum < windowlen) break; /* shortage or last */

2. すると、get_back_trellis_initが実行されないうちに
get_back_trellis_proceedが実行される。

3. これにより、get_back_trellis_initで確保されるはずのtlistとかtindexの
メモリーが確保されない状態でアクセスされてしまう。


解決方法:
patch参照。

--------
diff -Ncr julius-free-3.3p4/julius/realtime-1stpass.c julius-free-3.3p4-2/julius/realtime-1stpass.c
*** julius-free-3.3p4/julius/realtime-1stpass.c Thu Nov 7 01:56:41 2002
--- julius-free-3.3p4-2/julius/realtime-1stpass.c Tue Jun 17 18:57:03 2003
***************
*** 194,203 ****
}

while (now < nowlen) { /* till whole input is processed */
/* fill as many as possible */
for(i = min(windowlen - windownum, nowlen - now); i > 0 ; i--)
window[windownum++] = (float) Speech[now++];
! if (windownum < windowlen) break; /* shortage or last */
#ifdef RDEBUG
/* printf("%d used, %d rest\n", now, nowlen - now);

--- 194,205 ----
}

while (now < nowlen) { /* till whole input is processed */
+ if (f_raw >= maxframelen) return(1);
+
/* fill as many as possible */
for(i = min(windowlen - windownum, nowlen - now); i > 0 ; i--)
window[windownum++] = (float) Speech[now++];
! if (windownum < windowlen) return(1); /* shortage or last */
#ifdef RDEBUG
/* printf("%d used, %d rest\n", now, nowlen - now);

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




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