第10章 モジュールモード

目次

基本動作
サンプルクライアント jcontrol による動作確認
クライアントへの出力メッセージ仕様
クライアントから受信できる命令コマンド

Juliusをモジュールモードで起動することで,Julius を音声認識サーバーとして動かすことができる.モジュールモードで起動された Julius は,TCP/IP 経由でクライアントと接続し,クライアントへの認識結果や音声イベントの送信,およびクライアントからの動作制御を行うことができる.この章では,このモジュールモードについて解説する.

基本動作

Julius は -module を指定することでモジュールモードで起動する.モジュールモードでは,起動後,クライアントからの TCP/IP 接続待ちとなる.デフォルトのポート番号は 10500 であるが,-module portnum のようにポート番号を変更することができる.

クライアントからの接続を受けると,Julius は音声認識可能な状態となる. 音声入力に対して音声認識を行いながら,クライアントへ認識結果を送信する. また,音声入力の開始・終了などのイベントを随時送出する.クライアントからは,認識の一時停止や再開といった動作制御,認識用文法の追加や削除などが行える.また,複数モデルによるマルチデコーディング時は,認識処理インスタンスごとの一時停止なども行える.

クライアントとの接続は一対一を想定しており,複数クライアントの同時接続には対応していない.クライアントとのネットワークソケットが切断されると, Julius は認識を停止して,次のクライアントが接続するまで待ち状態となる.

サンプルクライアント jcontrol による動作確認

Julius にはサンプルのクライアント jcontrol が付属している.これはJuliusから送信されたメッセージをそのまま標準出力に出力し, またいくつかの簡単なコマンドを送ることができるツールである.これを使い, 以下の要領でJuliusのモジュール動作を試すことができる.

(1) サーバ:Julius を通常の起動方法に "-module" オプションを追加して起動

    % julius -C fast.jconf -module

(2) クライアント:jcontrol を以下のように起動

    % jcontrol (1)を実行しているホスト名

この状態で音声認識を行うと,結果が jcontrol 側に出力される.また, jcontrol で "pause" と入力して enter と押すと認識中断,"resume"で認識が再開できる.

以下,プロトコルについて詳細を述べる.なお,実際の実装については, jcontrol のソースコード,およびjulius/module.c, julius/output_module.c も大いに参考にされたい.

クライアントへの出力メッセージ仕様

Julius からクライアントへは,ソケット経由で XML 形式のテキストメッセージが送られる.文字エンコーディングは,認識に使用する言語モデルの内容がそのまま送られる.出力文字列のエンコーディングはオプション -charconv で変えることができる.たとえば日本語 shift-jis の出力を UTF-8 に変えるには,起動時に -charconv sjis utf8 と指定する.

メッセージは XML 形式で構成される.改行コードは "\n"である.クライアントがパーズしやすくするため, 1回のメッセージ送信ごとに,データの終端として,"." のみの行が送信される.以下はデータの例である.

<STARTPROC/>
<INPUT STATUS="LISTEN" TIME="994675053"/>
<INPUT STATUS="STARTREC" TIME="994675055"/>
<STARTRECOG/>
<INPUT STATUS="ENDREC" TIME="994675059"/>
<GMM RESULT="adult" CMSCORE="1.000000"/>
<ENDRECOG/>
<INPUTPARAM FRAMES="382" MSEC="3820"/>
<RECOGOUT>
  <SHYPO RANK="1" SCORE="-6888.637695" GRAM="0">
    <WHYPO WORD="silB" CLASSID="39" PHONE="silB" CM="1.000"/>
    <WHYPO WORD="上着" CLASSID="0" PHONE="u w a g i" CM="1.000"/>
    <WHYPO WORD="を" CLASSID="35" PHONE="o" CM="1.000"/>
    <WHYPO WORD="白" CLASSID="2" PHONE="sh i r o" CM="0.988"/>
    <WHYPO WORD="に" CLASSID="37" PHONE="n i" CM="1.000"/>
    <WHYPO WORD="して" CLASSID="27" PHONE="sh i t e" CM="1.000"/>
    <WHYPO WORD="下さい" CLASSID="28" PHONE="k u d a s a i" CM="1.000"/>
    <WHYPO WORD="silE" CLASSID="40" PHONE="silE" CM="1.000"/>
  </SHYPO>
</RECOGOUT>
.

<SHYPO> のところは認識結果の文単位の情報である. SCORE が音声認識エンジンの出した尤度,GRAM は文法使用時に,この文章が属する文法番号である.WORD, CLASSID, PHONE, CM はそれぞれ認識結果の単語表記,言語エントリ(N-gramの単語エントリあるいは文法のカテゴリ番号),音素列,単語確信度を表す. 認識失敗時は <RECOGOUT> ... </RECOGOUT> の代わりに <RECOGFAIL/> が出力される.

Julius からクライアントへ送信されるメッセージの一覧を,表 10.1. 「モジュールモードの送信メッセージ」に示す.また,認識結果出力の詳細を表 10.2. 「モジュールモードの認識結果出力の詳細」に示す.

表 10.1. モジュールモードの送信メッセージ

内容意味送信タイミング
<STARTPROC/>認識エンジン動作開始起動時,あるいは一時停止状態からの再開など,認識エンジン全体が動き始めたとき
<ENDPROC/>認識エンジン停止時一時停止時やエラー時など,認識エンジン全体が停止したとき
<STARTRECOG/>認識処理開始認識対象となる入力区間を検知し,第1パスの認識処理をスタートした時点
<ENDRECOG/>認識処理終了現在の区間の認識処理が完了した時点
<INPUT STATUS="LISTEN" TIME="..."/>入力開始音声入力部が,入力を開始できる状態になったとき
<INPUT STATUS="STARTREC" TIME="..."/>入力始端検知音声入力部が,音入力の開始を検知したとき
<INPUT STATUS="ENDREC" TIME="..."/>入力終端検知音声入力部が,音入力の終端を検知したとき
<INPUTPARAM FRAMES="..." MSEC="..."/>入力長情報現在認識中の区間の入力長が確定した時点
<GMM RESULT="xxx" CMSCORE="..."/>GMM最尤のモデルとそのGMM信頼度入力終了後,GMM による入力全体の尤度が得られた時点
<RECOGOUT>...</RECOGOUT>認識結果(成功時)認識結果が得られたとき
<RECOGFAIL/>認識失敗最尤解が得られず解なしとなった場合.入力が極端に短かったり, 入力内容が認識文法と大きくかけ離れている場合など.
<REJECTED REASON="...">入力棄却GMMや入力長制限などによって入力が棄却されたとき
<GRAPHOUT>...</GRAPHOUT>単語グラフ単語グラフ出力が指定されている場合,認識成功時
<GRAMINFO>...</GRAMINFO>現在エンジンが保持している文法情報文法切り替え時,および SYNCGRAMコマンド受信時
<SYSINFO PROCESS="ACTIVE|SLEEP">エンジンの現在の状態STATUSコマンド受信時
<ENGINEINFO TYPE="Julius" VERSION="4.1" CONF="fast"/>エンジンのバージョンVERSIONコマンド受信時
<GRAMMAR STATUS="RECEIVED"/>文法受け取り確認クライアントから文法データを受け取ったとき
<GRAMMAR STATUS="READY"/>文法準備完了確認SYNCGRAM コマンドを処理終了し,文法の更新が終了したとき
<GRAMMAR STATUS="ERROR" REASON="..."/>エラー文法関連のコマンドでエラーが発生したとき
<RECOGPROCESS>...<RECOGPROCESS/>認識処理インスタンスの情報プロセス関連のコマンド実行時

表 10.2. モジュールモードの認識結果出力の詳細

出力意味
<RECOGOUT>...</RECOGOUT>認識結果全体
<SHYPO>...</SHYPO>文候補.RANKは順位, SCOREは対数尤度(音響スコア+言語スコア), GRAMは複数文法使用時にその候補の属する文法のIDをそれぞれ表す.
<WHYPO>...</WHYPO>文候補内の単語候補. WORDは出力文字列, CLASSIDは言語エントリ(N-gramではN-gramエントリ,文法ではカテゴリ番号), PHONEは音素列, CMは単語信頼度をそれぞれ表わす.

クライアントから受信できる命令コマンド

クライアントから Julius にソケット経由でコマンドを送ることで,Julius を制御することができる.コマンドは,コマンドの文字列を末尾に改行コード "\n" をつけて送信する.そのコマンドが引数を必要とする場合は,そのコマンド文字列の次の行として,引数を送る.

ADDGRAM, CHANGEGRAM では,クライアントから Julius へ文法を送信する.クライアントは,コマンド文字列の行につづけて,文法ファイル(.dfa) と辞書ファイル (.dict) の中身を Julius へ送信する.各ファイルの最後には, "DFAEND" あるいは"DICEND" のみの行をそれぞれ送る.また,これらのコマンドのみ,送信する文法の名称をコマンド文字列の直後に空白につづけて指定する.ADDGRAM の送信内容の概要を以下に示す(CHANGEGRAM も同じである).

ADDGRAM 新文法名
 [文法ファイル (.dfa) の内容]
DFAEND
 [辞書ファイル (.dict) の内容]
DICEND

Julius が複数モデルを使って認識処理インスタンスを同時に走らせるマルチデコーディングを行っている場合,プロセス関係および文法操作は「カレントインスタンス」について行われる.全処理インスタンスの一覧は LISTPROCESS で得ることができ,カレントインスタンスは,CURRENTPROCESS や SHIFTPROCESS で変更できる.また,ACTIVATEPROCESS や DEACTIVATEPROCESS を使うことで,個々の認識処理インスタンスを無効化・有効化できる.

コマンドの一覧を 表 10.3. 「クライアントから送信できるコマンド(共通)」および 表 10.4. 「クライアントから送信できるコマンド(カレントインスタンスが文法の場合)」に示す.

表 10.3. クライアントから送信できるコマンド(共通)

コマンド引数Julius の動作
STATUS-エンジンが現在動作中であるかどうかを返す
DIE-Julius を強制終了する
VERSION-Julius のバージョンを返す
PAUSE-エンジンを一時停止する.受信時点で入力待ちだったときは即座に停止する.認識を実行中の場合,その入力が終わり認識が終了してから停止する.
TERMINATE-エンジンを一時停止する.入力待ち・認識実行中にかかわらず,即時停止する.
RESUME-一時停止状態から復帰してエンジン動作を再開する
CURRENTPROCESS認識処理インスタンス名カレントインスタンスを指定された名前のインスタンスに変更
SHIFTPROCESS-カレントインスタンスを次の認識処理インスタンスに変更
ADDPROCESSjconfパス名(Juliusから見えるパスで)エンジンに新たに認識処理インスタンスを追加する
DELPROCESS認識処理インスタンス名指定されたインスタンスをエンジンから削除する
LISTPROCESS-すべての認識処理インスタンスの情報を出力する
DEACTIVATEPROCESS認識処理インスタンス名指定されたインスタンスを一時無効化する
ACTIVATEPROCESS認識処理インスタンス名指定されたインスタンスを有効化する

表 10.4. クライアントから送信できるコマンド(カレントインスタンスが文法の場合)

コマンド引数Julius の動作
GRAMINFO-エンジンが現在持つ文法情報を返す
CHANGEGRAM 名前文法データ(DFA+辞書)文法データを受け取り,エンジンの現在保持する文法をそれに入れ替える.
ADDGRAM 名前文法データ(DFA+辞書)文法データを受け取り,エンジンに追加する.
DELGRAM数字もしくは文法の名前(複数の場合空白で区切る)指定された文法をエンジンから削除する.
DEACTIVATEGRAM数字もしくは文法の名前(複数の場合空白で区切る)指定された文法を一時的に無効化する
ACTIAVETGRAM数字もしくは文法の名前(複数の場合空白で区切る)指定された文法を有効化する
INPUTONCHANGE"TERMINATE", "PAUSE" あるいは "WAIT" 文法をクライアントから受信したときに,指定されたタイミングで文法を更新する
SYNCGRAM-文法の更新を今すぐ行う
ADDWORD文法ID,その後辞書エントリ受け取った辞書エントリを指定された文法に追加する