julius_progout
Julius progout
progoutの使い方
Julius (Julian) の第一パス候補を逐次出力する方法について。
Windows XP での実行例
Julian rev.3.5.2-galatea (fast) Engine configuration: - Base setup : fast - Tunings : DFA, NoThreaded - Compiled by: gcc -O6 -fomit-frame-pointer
モジュールモード(ソケットサーバ)で動かす。
[server.jconf]
-dfa grammar/lunch.dfa # 文法モデル lunch.* が用意されているものとする -v grammar/lunch.dict # 文法モデル -C hmm_ptm.jconf # 音響モデル hmm_ptm.jconf で定義済みとする -input mic # マイク入力 -module 10500 # モジュールモードでポート番号を指定(省略時は10500) -progout # 第1パスで解析途中から漸次的に結果を出力 -proginterval 50 # -progout 時の出力のインターバル(単位:msec) -outcode WLPSCwlps # デフォルトでは第1パス情報 (wlps) は出力されない
認識サーバの実行
julian.exe -C server.jconf
別のコマンドプロンプトでクライアントの実行。ここではtelnetで。
telnet localhost 10500
改行文字の違いで画面が乱れるが、下記のような情報が得られる。
- 50msec 周期で PHYPO が得られる。単語仮説が含まれれば WHYPO になる
- 発話終了後に SHYPO PASS="1" (sentence仮説?) が得られる
- 第2パス終了後に SHYPO RANK="1" が得られる(N-bestを2以上に指定していれば複数得られる)
出力例
<RECOGOUT> <PHYPO PASS="1" SCORE="-425.201385" FRAME="14" TIME="1270190836"> <WHYPO WORD="<s>" CLASSID="1" PHONE="silB"/> </PHYPO> </RECOGOUT> . <RECOGOUT> <PHYPO PASS="1" SCORE="-574.381653" FRAME="19" TIME="1270190836"> <WHYPO WORD="<s>" CLASSID="1" PHONE="silB"/> </PHYPO> </RECOGOUT> . <RECOGOUT> <PHYPO PASS="1" SCORE="-1000000.000000" FRAME="24" TIME="1270190836"> </PHYPO> </RECOGOUT> . <RECOGOUT> <PHYPO PASS="1" SCORE="-887.485352" FRAME="29" TIME="1270190836"> <WHYPO WORD="<s>" CLASSID="1" PHONE="silB"/> <WHYPO WORD="丼" CLASSID="0" PHONE="d o N"/> </PHYPO> </RECOGOUT> . <RECOGOUT> <PHYPO PASS="1" SCORE="-1013.955688" FRAME="34" TIME="1270190836"> <WHYPO WORD="<s>" CLASSID="1" PHONE="silB"/> <WHYPO WORD="丼" CLASSID="0" PHONE="d o N"/> </PHYPO> </RECOGOUT> . (中略) . <RECOGOUT> <PHYPO PASS="1" SCORE="-2215.407959" FRAME="74" TIME="1270190836"> <WHYPO WORD="<s>" CLASSID="1" PHONE="silB"/> <WHYPO WORD="串カツ" CLASSID="0" PHONE="k u sh i k a ts u"/> </PHYPO> </RECOGOUT> . (中略) . <RECOGOUT> <SHYPO PASS="1" SCORE="-3520.302490"> <WHYPO WORD="<s>" CLASSID="1" PHONE="silB"/> <WHYPO WORD="串カツ" CLASSID="0" PHONE="k u sh i k a ts u"/> <WHYPO WORD="</s>" CLASSID="2" PHONE="silE"/> </SHYPO> </RECOGOUT> . <INPUT STATUS="ENDREC" TIME="1270190837"/> . <INPUTPARAM FRAMES="126" MSEC="1260"/> . <RECOGOUT> <SHYPO RANK="1" SCORE="-3520.307373" GRAM="0"> <WHYPO WORD="<s>" CLASSID="1" PHONE="silB" CM="1.000"/> <WHYPO WORD="串カツ" CLASSID="0" PHONE="k u sh i k a ts u" CM="0.415"/> <WHYPO WORD="</s>" CLASSID="2" PHONE="silE" CM="1.000"/> </SHYPO> </RECOGOUT> . <INPUT STATUS="LISTEN" TIME="1270190837"/> .
不具合
Julius 4 系だと <PHYPO の開始要素が /> で閉じてしまい XML パーザに怒られる。4.1.5 で状況を確認。
勝手に直してみた http://github.com/nishimotz/julius/commit/9b3d7558b5ef7c7a496bdda36123f9bbe656f524
progout の実装
本項は 4.1.5 のソースコードに基づいている。
CALLBACK_RESULT_PASS1_INTERIM というIDでコールバック関数を登録する。
ライブラリ版では outcode オプションは無効だが progout と proginterval は有効。
- julius/module.c : outcodeオプションを処理
- julius/output_module.c : result_pass1_current() がコールバック関数。
- libjulius/src/pass1.c : recog→process_list の要素ごとに have_interim であれば callback_exec() する
- src/callback.c : callback_exec() の実装。recog→callback_function[][] が関数ポインタ
オプションの与え方とチェック
- julius/output_module.c : static boolean で out1_word などのフラグ。msock_word_out1() などで使用。
- libjulius/src/m_options.c : jconf→searchnow→output が構造体で、progout_flag と progout_interval のメンバに -progout および -proginterval の値が入る。
出力に使われるユーティリティ関数
- libsent/src/hmminfo/cdhmm.c : center_name() が triphone の音素名から中心音素の名前を取り出す処理らしい。
julius_progout.txt · 最終更新: 2014/05/21 21:57 by Takuya Nishimoto