Juliusをモジュールモードで起動することで,Julius を音声認識サーバーとして動かすことができる.モジュールモードで起動された Julius は,TCP/IP 経由でクライアントと接続し,クライアントへの認識結果や音声イベントの送信,およびクライアントからの動作制御を行うことができる.この章では,このモジュールモードについて解説する.
Julius は -module
を指定することでモジュールモードで起動する.モジュールモードでは,起動後,クライアントからの TCP/IP 接続待ちとなる.デフォルトのポート番号は 10500 であるが,-module
のようにポート番号を変更することができる.
portnum
クライアントからの接続を受けると,Julius は音声認識可能な状態となる. 音声入力に対して音声認識を行いながら,クライアントへ認識結果を送信する. また,音声入力の開始・終了などのイベントを随時送出する.クライアントからは,認識の一時停止や再開といった動作制御,認識用文法の追加や削除などが行える.また,複数モデルによるマルチデコーディング時は,認識処理インスタンスごとの一時停止なども行える.
クライアントとの接続は一対一を想定しており,複数クライアントの同時接続には対応していない.クライアントとのネットワークソケットが切断されると, Julius は認識を停止して,次のクライアントが接続するまで待ち状態となる.
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 | - | カレントインスタンスを次の認識処理インスタンスに変更 |
ADDPROCESS | jconfパス名(Juliusから見えるパスで) | エンジンに新たに認識処理インスタンスを追加する |
DELPROCESS | 認識処理インスタンス名 | 指定されたインスタンスをエンジンから削除する |
LISTPROCESS | - | すべての認識処理インスタンスの情報を出力する |
DEACTIVATEPROCESS | 認識処理インスタンス名 | 指定されたインスタンスを一時無効化する |
ACTIVATEPROCESS | 認識処理インスタンス名 | 指定されたインスタンスを有効化する |
表 10.4. クライアントから送信できるコマンド(カレントインスタンスが文法の場合)
コマンド | 引数 | Julius の動作 |
---|---|---|
GRAMINFO | - | エンジンが現在持つ文法情報を返す |
CHANGEGRAM 名前 | 文法データ(DFA+辞書) | 文法データを受け取り,エンジンの現在保持する文法をそれに入れ替える. |
ADDGRAM 名前 | 文法データ(DFA+辞書) | 文法データを受け取り,エンジンに追加する. |
DELGRAM | 数字もしくは文法の名前(複数の場合空白で区切る) | 指定された文法をエンジンから削除する. |
DEACTIVATEGRAM | 数字もしくは文法の名前(複数の場合空白で区切る) | 指定された文法を一時的に無効化する |
ACTIAVETGRAM | 数字もしくは文法の名前(複数の場合空白で区切る) | 指定された文法を有効化する |
INPUTONCHANGE | "TERMINATE", "PAUSE" あるいは "WAIT" | 文法をクライアントから受信したときに,指定されたタイミングで文法を更新する |
SYNCGRAM | - | 文法の更新を今すぐ行う |
ADDWORD | 文法ID,その後辞書エントリ | 受け取った辞書エントリを指定された文法に追加する |