JuliusMFT は,大語彙音声認識システム Julius を HARK 用に改造を行った 音声認識モジュールである.HARK 0.1.x 系では,大語彙音声認識システ ムJulius 3.5 をもとに改良されたマルチバンド版 Julius1 に対するパッチ として,提供していたが,HARK 1.0 では,Julius 4.1 系をベースに実装およ び機能を大きく見直した.HARK 1.0 の JuliusMFT では,オリジナルのJulius と比較して,下記の4点に対応するための変更を行っている.
ミッシングフィーチャー理論の導入
MSLS特徴量のネットワーク入力(mfcnet)対応
音源情報(SrcInfo) の追加に対応
同時発話への対応(排他処理)
実装に関しては,Julius 4.0 から導入されたプラグイン機能を用いて極 力 Julius 本体に変更を加えない形で,実装を行った,
インストール方法,使用方法を説明するとともに,Julius との違 い,FlowDesigner 上の HARK モジュールとの接続について,解説する.
JuliusMFT の実行は,例えば設定ファイル名を julius.conf とすれば,以下のように行う.
> julius_mft -C julius.jconf > julius_mft.exe -C julius.jconf (Windows版)
HARK では,JuliusMFT を起動したのち,IPアドレスやポート番号が正しく設 定された SpeechRecognitionClient (または SpeechRecognitionSMNClient ) を含んだネットワークを起動することにより,JuliusMFT とのソケット接続 が行われ,音声認識が可能な状態となる.
上述の julius.jconf は JuliusMFT の設定を記述したテキストファイルで ある.設定ファイルの中身は,基本的に “-” で始まる引数オプションからなっ ており,起動時に直接,julius のオプションとして引数指定することも可能で ある.また,# 以降はコメントとして扱われる.Julius で用いるオプション は,
http://julius.sourceforge.jp/juliusbook/ja/desc_option.html にまと められているので,そちらを参照していただきたいが,最低限必要な設定は, 以下の7種類である.
-notypecheck
-plugindir /usr/lib/julius_plugin
-input mfcnet
-gprune add_mask_to_safe
-gram grammar
-h hmmdefs
-hlist allTriphones
-notypecheck
特徴パラメータの型チェックをスキップする設定.オリジナルの Julius では任意で指定可能なオプションであるが,JuliusMFT では 指定が必須のオプションとなっている. このオプションを指定しないとタイプチェックが行われるが, JuliusMFT のプラグインでは,特徴量 と共にマスクデータを計算しているため(マスクなしの場合でも1.0を出力 する),タイプチェックでサイズ不一致となり,認識が行われない.
-plugindir プラグインディレクトリ名
プラグイン(*.jpi)が存在するディレクトリを指定する.引数にカレントディ レクトリからの相対パス,もしくはプラグインの絶対パスを指定する.この パスは,apt-get でインストールした場合には,/usr/lib/julius_plugin, ソースコードをパス指定せずコンパイルおよびインストールした場合に は/usr/local/lib/julius_plugin がデフォルトとなる.なお,このパス は,-input mfcnet や,-gprune add_mask_to_safe などプラグインで実 現されている機能の指定よりも前に指定する必要がある.このパス下にある 拡張プラグインファイルは,実行時に全て読み込まれるので注意. 尚、Windows版においては、プラグインを使用しないためプラグインディレクトリ名は 任意となるが、本オプションは必須となる.
-input mfcnet
-input 自体はオリジナル Julius で実装されているオプションで,マイクロホン, ファイル,ネットワーク経由の入力などがサポートされている.JuliusMFT では,SpeechRecognitionClient (または,SpeechRecognitionSMNClient ) から送信される音響特徴量とマスクをネットワーク経由で受信できるよう にこのオプションを拡張し,音声入力ソースとして mfcnet を指定できるよ うにした.この機能は -input mfcnet と指定することにより,有効にするこ とができる.また,mfcnet 指定時のポート番号は,オリジナルの Julius で,音声入力ソース adinnet 用ポート番号を指定するために使用される -adportを用いて “-adport ポート番号” のように指定することができる.
-gprune
既存の出力確率計算にマスクを利用する場合に使用する枝刈りアルゴリズム を指定する.基本的に,HARK 0.1.x で提供していた julius_mft(ver3.5)に 搭載された機能を移植したもので,$\{ add\_ mask\_ to\_ safe \| add\_ mask\_ to\_ heu \| add\_ m,ask\_ to\_ beam \| add\_ mask\_ to\_ none \} $ の4種類からアルゴリズムを選択する(指定しない場合はデフォルトの計 算方法となる).それぞれオリジナル Julius の $\{ safe \| heuristic \| beam \| none \} $ に対応している.な お,julius_mft(ver3.5) の eachgconst を用いた計算方法は厳密には正確 ではないため,オリジナルと比較すると計算結果(score)に誤差が出てしまっ ていた.今回,オリジナルと同様の計算方法を取り入れ,この誤差問題を解 決している.
-gram grammar
言語モデルを指定する.オリジナル Julius と同様.
-h hmmdefs
音響モデル (HMM) を指定する.オリジナル Julius と同様.
-hlist allTriphones
HMMList ファイルを指定する.オリジナル Julius と同様.
なお,後述のモジュールモードで利用する際には,オリジナル Julius と同様に -module オプションを指定する必要がある.
mfcnet を音声入力ソースとして利用するには,上述のように,JuliusMFT 起 動時に “-input mfcnet” を引数として指定する.この 際,JuliusMFT は TCP/IP 通信サーバとなり,特徴量を受信する.ま た,HARK のモジュールであ る SpeechRecognitionClient や,SpeechRecognitionSMNClient は,音響特 徴量とミッシングフィーチャーマスクを JuliusMFT に送出するためのクライア ントして動作する. クライアントは,1発話ごとに JuliusMFT に接続し,送信終了後 ただちに接続を切断する.送信されるデータはリトルエンディアンである必要 がある(ネットワークバイトオーダーでないことに注意).具体的には,1発話に 対して以下の流れで通信を行う.
ソケット接続
ソケットを開き,JuliusMFT に接続.
通信初期化(最初に1回だけ送信するデータ)
クライアントから,ソケット接続直後に1回だけ, 表 6.83に示すこれから送信する音源に関する情報を送信す る.音源情報は SourceInfo 構造体(表 6.84)で表され,音 源ID,音源方向,送信を開始した時刻を持つ.時刻は,$<$sys/time.h$>$ で定義 されている timeval 構造体で表し,システムのタイムゾーンにおける紀元 (1970年1月1日00:00:00)からの経過時間である.以後,時刻は紀元からの 経過時間を指すものとする.
データ送信(毎フレーム)
音響特徴量とミッシングフィーチャーマスクを送信する. 表 6.85 に示すデータを1フレームとし,1発話の特徴量を 音声区間が終了するまで繰り返し送信する.特徴量ベクトルとマスクベクト ルの次元数は同じ大きさであることが JuliusMFT 内部で仮定されている.
終了処理
1音源分の特徴量を送信し終えたら,終了を示すデータ(表 6.86)を送信してソケットを閉じる.
サイズ[byte] |
型 |
送信するデータ |
4 |
0 |
-module を指定するとオリジナル Julius と同様にモジュールモードで動作さ せることができる.モジュールモードでは, JuliusMFT がTCP/IP通信のサー バとして機能し, JuliusMFT の状態や認識結果を jcontrol などのクライア ントに提供する.また,コマンドを送信することにより動作を変更することが できる.日本語文字列の文字コードは,通常EUC-JPを利用しており,引数によっ て変更可能である.データ表現には XML ライクな形式が用いられており,一つ のメッセージごとにデータの終了を表す目印として "."(ピリオド)が送信さ れる. JuliusMFT で送信される代表的なタグの意味は以下の通りである.
INPUTタグ 入力に関する情報を表すタグで,属性としてSTATUSとTIMEがある.STATUSの値はLISTEN,STARTREC,ENDRECのいずれかの状態をとる. LISTENのときは Julius が音声を受信する準備が整ったことを表す.STARTRECは特徴量の受信を開始したことを表す.ENDRECは受信中の音源の最後の特徴量を受信したことを表す.TIMEはそのときの時刻を表す.
SOURCEINFOタグ 音源に関する情報を表す,JuliusMFT オリジナルのタグである.属性としてID,AZIMUTH,ELEVATION,SEC,USECがある.SOURCEINFOタグは第2パス開始時に送信される.IDはHARKで付与した音源ID(話者IDではなく,各音源に一意に振られた番号)を,AZIMUTHは音源の最初のフレームのときのマイクロホンアレー座標系からみた水平方向(度)を,ELEVATIONは同垂直方向(度)を,SECとUSECは音源の最初のフレームの時刻を表しSECが秒の位,USECがマイクロ秒の位を表す.
RECOGOUTタグ 認識結果を表すタグで,子要素は漸次出力,第1パス,第2パスのいずれかである.漸次出力の場合は,子要素としてPHYPOタグを持つ.第1パスと第2パス出力の場合は,子要素として文候補のSHYPOタグを持つ.第1パスの場合は,最大スコアとなる結果のみが出力され,第2パスの場合はパラメータで指定した数だけ候補を出力するので,その候補数だけSHYPOタグが出力される.
PHYPOタグ 漸次候補を表すタグで,子要素として単語候補WHYPOタグの列が含まれる.属性としてPASS,SCORE,FRAME,TIMEがある.PASSは何番目のパスかを表し,必ず1である.SCOREはこの候補のこれまでの累積スコアを表す.FRAMEはこの候補を出力するのにこれまでに処理したフレーム数を表す.TIMEは,そのときの時刻(秒)を表す.
SHYPOタグ 文仮説を表すタグで,子要素として単語仮説WHYPOタグの列が含まれる.属性としてPASS,RANK,SCORE,AMSCORE,LMSCOREがある. PASSは何番目のパスかを表し,属性PASSがあるときは必ず1である.RANKは仮説の順位を表し,第2パスの場合にのみ存在する.SCOREはこの仮説の対数尤度,AMSCOREは対数音響尤度,LMSCOREは対数言語確率を表す.
WHYPOタグ 単語仮説を表すタグで,属性としてWORD,CLASSID,PHONE,CMを含む.WORDは表記を,CLASSIDは統計言語モデルのキーとなる単語名を,PHONEは音素列を,CMは単語信頼度を表す.単語信頼度は,第2パスの結果にしか含まれない.
SYSINFOタグ システムの状態を表すタグで,属性としてPROCESSがある.PROCESSがEXITのときは正常終了を,ERREXITのときは異常終了を,ACTIVEのときは音声認識が動作可能である状態を,SLEEPのときは音声認識が停止中である状態を表す. これらのタグや属性が出力されるかどうかは,Julius MFTの起動時に指定された引数によって変わる.SOURCEINFOタグは必ず出力され,それ以外はオリジナルのJuliusと同じなので,オリジナルのJuliusの引数ヘルプを参照のこと.
オリジナルのJulius と比較した場合,JuliusMFT における変更点は,以下の2点である.
上述の音源定位に関する情報用タグである SOURCEINFO タグ関連の追加,および,関連する下記のタグへの音源ID(SOURCEID)の 埋め込み.
STARTRECOG, ENDRECOG, INPUTPARAM, GMM, RECOGOUT, REJECTED, RECOGFAIL, GRAPHOUT, SOURCEINFO
同時発話時の排他制御による処理遅れを改善するために, モジュールモードのフォーマット変更を行った. 具体的には,これまで発話単位で排他制御を行っていたが,これをタグ単位で行う よう 出力が複数回に分かれており,一度に出力する必要がある下記のタグの出力に 改造を施した.
《開始タグ・終了タグに分かれているもの》
$<$RECOGOUT$>$...$<$/RECOGOUT$>$
$<$GRAPHOUT$>$...$<$/GRAPHOUT$>$
$<$GRAMINFO$>$...$<$/GRAMINFO$>$
$<$RECOGPROCESS$>$...$<$/RECOGPROCESS$>$
《1行完結のタグであるが,内部では複数回に分けて出力されているもの》
$<$RECOGFAIL ... /$>$
$<$REJECTED ... /$>$
$<$SR ... /$>$
標準出力モードの出力例
Stat: server-client: connect from 127.0.0.1 forked process [6212] handles this request waiting connection... source_id = 0, azimuth = 5.000000, elevation = 16.700001, sec = 1268718777, usec = 474575 ### Recognition: 1st pass (LR beam) ..........................................................................................................................................................................................................read_count < 0, read_count=-1, veclen=54 pass1_best: <s> 注文お願いします </s> pass1_best_wordseq: 0 2 1 pass1_best_phonemeseq: silB | ch u: m o N o n e g a i sh i m a s u | silE pass1_best_score: 403.611420 ### Recognition: 2nd pass (RL heuristic best-first) STAT: 00 _default: 19 generated, 19 pushed, 4 nodes popped in 202 sentence1: <s> 注文お願いします </s> wseq1: 0 2 1 phseq1: silB | ch u: m o N o n e g a i sh i m a s u | silE cmscore1: 1.000 1.000 1.000 score1: 403.611786 connection end ERROR: an error occured while recognition, terminate stream ←このエラーログが出るのは仕様
モジュールモードの出力サンプル
下記のXMLライクな形式でクライアント(jcontrolなど)に出力される.行頭の “$>$” は, jcontrol を用いた場合に jcontrol によって出力される(出力情報には含まれない).
> <STARTPROC/> > <STARTRECOG SOURCEID="0"/> > <ENDRECOG SOURCEID="0"/> > <INPUTPARAM SOURCEID="0" FRAMES="202" MSEC="2020"/> > <SOURCEINFO SOURCEID="0" AZIMUTH="5.000000" ELEVATION="16.700001" SEC="1268718638" USEC="10929"/> > <RECOGOUT SOURCEID="0"> > <SHYPO RANK="1" SCORE="403.611786" GRAM="0"> > <WHYPO WORD="<s>" CLASSID="0" PHONE="silB" CM="1.000"/> > <WHYPO WORD="注文お願いします" CLASSID="2" PHONE="ch u: m o N o n e g a i sh i m a s u" CM="1.000"/> > <WHYPO WORD="</s>" CLASSID="1" PHONE="silE" CM="1.000"/> > </SHYPO> > </RECOGOUT>
-outcode オプションの制約
タグ出力をプラグイン機能を用いて実装したため,出力情報タイプを指定でき る -outcode オプションもプラグイン機能を用いて実現するように変更した. このため,プラグインが読み込まれていない状態で -outcodeオプションを指定 すると,エラーとなってしまう.
標準出力モードの発話終了時のエラーメッセージ
標準出力モードで出力されるエラー “ERROR: an error occured while recognition, terminate stream” (出力例を参照)は, 作成した特徴量入力プラグイン(mfcnet)で生成した子プロセスを終了する際に, 強制的にエラーコードをjulius本体側に返しているため出力される. Julius 本体に極力修正を加えないようこのエラーに対する対処を行わず, 仕様としている. なお,モジュールモードでは,このエラーは出力されない.
apt-get を用いる方法
apt-get の設定ができていれば,下記でインストールが完了する.な お,Ubuntu では オリジナルの Julius もパッケージ化されているため,オリ ジナルの Julius がインストールされている場合には,これを削除してから, 以下を実行すること.
> apt-get install julius-4.1.4-hark julius-4.1.3-hark-plugin
ソースからインストールする方法
julius-4.1.4-hark と julius_4.1.3_plugin をダウンロードし,適当なディレクトリに展開する.
julius-4.1.4-hark ディレクトリに移動して以下のコマンドを実効する. デフォルトでは, /usr/local/bin にインストールされてしまうため,パッケージと同様に /usr/binにインストールするためには,以下のように -prefix を指定する.
./configure --prefix=/usr --enable-mfcnet; make; sudo make install
実行して以下の表示が出力されれば Julius のインストールは正常に終了している.
> /usr/bin/julius Julius rev.4.1.4 - based on JuliusLib? rev.4.1.4 (fast) built for i686-pc-linux Copyright (c) 1991-2009 Kawahara Lab., Kyoto University Copyright (c) 1997-2000 Information-technology Promotion Agency, Japan Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology Copyright (c) 2005-2009 Julius project team, Nagoya Institute of Technology Try '-setting' for built-in engine configuration. Try '-help' for run time options. >
次にプラグインをインストールする. julius_4.1.3_plugin ディレク トリに移動して以下のコマンドを実行する.
> export JULIUS_SOURCE_DIR=../julius_4.1.4-hark; make; sudo make install
JULIUS_SOURCE_DIR には julius_4.1.4-hark のソースのパスを指定する. 今回は同じディレクトリに Julius と plugin のソースを展開した場合を想定した.
以上でインストール完了である.
/usr/lib/julius_plugin 下にプラグインファイルがあるかどうかを確認する.
> ls /usr/lib/julius_plugin calcmix_beam.jpi calcmix_none.jpi mfcnet.jpi calcmix_heu.jpi calcmix_safe.jpi >
以上のように5つのプラグインファイルが表示されれば,正常にインストールできている.
Windows 版のインストール方法については、3.2章のソフトウェアのインストール方法を参照.
Footnotes