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
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0