Julius for SAPI ver 2.1
Document for Developers

2002/10/22
2002/10/15
2002/09/12

京都大学情報学研究科知能情報学専攻音声メディア研究室
住吉貴志(sumiyosi@kuis.kyoto-u.ac.jp)


はじめに

このドキュメントについて

このドキュメントは、音声認識を利用したアプリケーションを作成する人へ向けた、SAPI を使ったアプリケーション開発についての簡単な解説です。音声認識エンジンとして Julius for SAPI を使用することを想定しています。

ドキュメントは現在作成中であり、まだ完全ではありません。

Speech API(SAPI) とは

Microsoft Speech API (以下、SAPI)とは、Microsoft 社の作成する Windows の音声アプリケーションのための標準インターフェース群であり、音声認識、音声合成を用いたアプリケーション開発に便利です。

SAPI は音声アプリケーションと音声認識(あるいは音声合成)エンジンを仲介する役割を果たします。これまで音声アプリケーション開発は特定のエンジンに依存して開発するのが一般的であり、すなわちエンジンがなければ音声アプリケーションが開発できない状況でした。現在はこのSAPIのインターフェースを使って、エンジンに依存しない開発が可能となっています。

またWindows XP においてはSAPIが標準で組み込まれているため、ユーザが別途面倒なインストール手続きをすることなく音声アプリケーションを使用することができます。

Julius for SAPI とは

Julius for SAPI は、もともとUNIX OSで研究用途を目的として開発されていたフリーの大語彙連続音声認識エンジン Julius の優れたデコードルーティンを搭載した、SAPI 準拠を目的とする音声認識エンジンです。現在はSAPIで規定されている機能のほとんどを提供できるエンジンとなっています。

現在のヴァージョンは ver 2.1 です。これは Julius 3.2 をベースに作成され、いくつかの改良がなされいます。

コマンド文法

(SpeechSDK 5.1 Help: \Application-Level Interfaces\Grammar Compiler Interfaces\Text Grammar Format , \White Papers\XML Schema : Grammar を参照)

コマンド文法とは、音声認識アプリケーションで、ユーザがどのような発話をしたときに、それがアプリケーションにとってどのような意味を持つかの記述です。

詳細な説明はヘルプに譲ることにして、ここでは Julius for SAPI に特有の注意点について述べます。

文法の記述法と文法のクラス

SAPI では左再帰性を持つ文法は書けません。

<RULE name="LeftRecursion" toplevel="ACTIVE">
  <O>
  <RULEREF name="LeftRecursion" />
  </O>
  <P>とんで</P>
</RULE>

すべての左再帰表記の文法は等価な右再帰表記に書くことができるので、次のように記述します。

<RULE name="LeftRecursion" toplevel="ACTIVE">
  <P>とんで</P>
  <O>
    <RULEREF name="LeftRecursion" />
  </O>
</RULE>

Julius for SAPI では正規文法のみ扱うことが可能です。すなわち、下記のような文脈自由文法は利用できません。

<RULE name="Sentence" toplevel="ACTIVE">
  <L>
    <P>ぼくは</P>
    <P>彼は</P>
    <P>彼女は</P>
  </L>
  <L>     <P>嘘だ</P>     <RULEREF name="Sentence" />   </L>
  <P>と言った</P>
</RULE>

Julius for SAPI は Dictation, TextBuffer, WildCard には対応していません。また、信頼度の設定は無視します。

漢字などの読み

SAPI-XMLでは、単語の表記についていくつかの方法を規定しています。

一番目の表記は、画面表示形のみを指定します。二番目の表記は、画面表示形と辞書登録形を指定しています。最後のものはさらに発音形を指定しています。

Julius for SAPI ではこれらの情報から音素列を求めます。2番目や3番目のように仮名表記が存在する場合はそれぞれ辞書登録形、発音形を利用しますが、1番目のように画面表示形のみしか存在しない場合は、外部モジュールのIMEの機能を使って求めます。

IMEで求められた読みは、文法制作者の意図しないものになる可能性があるので、なるべく発音形まで文法で指定するようにしてください。

次に、得られた仮名表記から、音素列を求めます。この変換方法については固定で、以下の標準的な音素の列への変換となります。

 a i u e o a: i: u: e: o: N w y p py t k ky b by d dy
g gy ts ch m my n ny h hy f s sh z j r ry q sp silB silE

最後に、認識精度を上げるため、以下の変換を行います。

「ああ」→「あー」 ("a a " → "a: ")
「いい」→「いー」 ("i i " → "i: ")
「うう」→「うー」 ("u u " → "u: ")
「ええ」→「えー」 ("e e " → "e: ")
「えい」→「えー」 ("e i " → "e: ")
「おお」→「おー」 ("o o " → "o: ")
「おう」→「おー」 ("o u " → "o: ")

カテゴリについての補足

SAPI-XML 形式の文法は、Julian のカテゴリという概念がありませんが、Julian の枠組みを利用するために、変換時にカテゴリを自動で作成しています。SAPI-XML形式(RTN)をDFAに変換した後、開始状態と終了状態が同じである遷移の遷移単語を1つのカテゴリとしています。

イベント

Julius for SAPI は、認識過程においてさまざまなイベントをSAPIに返します。アプリケーションはそのイベントを、Win32 イベントオブジェクト、ウィンドウメッセージ、コールバック関数などを利用して得ることができます。

以下に、Julius の処理の過程でどのようなイベントが発行されるかをまとめます。

音声ストリーム開始 SPEI_START_SR_STREAM (by SAPI)
音声検出(切り出しを行う場合は、切り出し開始位置検出時) SPEI_SOUND_START
切り出し終了位置検出 SPEI_SOUND_END
第1パス仮説生成、最初に生成したとき SPEI_PHRASE_START
第1パス仮説生成 SPEI_HYPOTHESIS
第1パス最終結果生成 SPEI_HYPOTHESIS
第2パス最終結果生成 SPEI_RECOGNITION / SPEI_FALSE_RECOGNITION
音声ストリーム終了 SPEI_END_SR_STREAM (by SAPI)

SPEI_START_SR_STREAM SPEI_END_SR_STREAM は、SAPI によって発行されるため、Julius for SAPI では発行しません。

SPEI_SOUND_START は、切り出しオプションが設定されている場合は切り出し開始位置を検出したときに発行されます。切り出しオプションが設定されていないときは常にストリームの最初で発行されます。

SPEI_SOUND_END が、SPEI_RECOGNITION よりも前に発行されることに注意してください。

結果

音声認識の結果は SPRECORESULTINFO に格納されます。 Julius for SAPI が返す SPRECORESULTINFO 以下の情報は、SAPIでは規定されているものの Julius for SAPI では使用できない項目が含まれています。以下に詳細な情報を示します。

FAQ

その他

レジストリ情報

Julius for SAPI の情報はレジストリに記録されています。

インストール時に、JuliusSAPI.dll によって HKEY_LOCAL_MACHINE\Software\Microsoft\Speech\Recognizers\Tokens\ に Julius for SAPI キーが追加され、いくつかのオプションのデフォルト値が設定されます。またインストーラによって、ErrLogFile がインストールディレクトリの errlog.txt に設定されます。

InitialModelsInstall をインストールすることで、音響モデルと言語モデル関係のレジストリがインストールしたモデルファイルに設定されます。

Julius for SAPI のオプションはダイアログで設定可能で、その情報は、HKEY_LOCAL_MACHINE\Software\Microsoft\Speech\Recognizers\Tokens\Julius for SAPI\ 以下に記録されます。以下にその詳細を記します。

相対パス 説明 対応するコマンドラインオプション ダイアログ
Models\ モデルファイル情報
  NgramFile Julius bingram 形式のモデルファイル名 -d 言語モデル
  NgramArpaLRFile ARPA形式の 2gramモデルファイル名(Left to Right) -nlr 言語モデル
  NgramArpaRLFile ARPA形式の 3gramモデルファイル名(Right to Left) -nrl 言語モデル
  DfaFile --
  DictFile Ngram 用辞書ファイル (htkdic 形式) -v 言語モデル
  HmmFile HMM 定義ファイル名 -h 音響モデル
  MapFile HMM マッピングファイル名 -hlist 音響モデル
  GsHmmFile -gshmm 音響モデル
  UseMapFile [MapFile] が有効なら 1 無効なら 0 音響モデル
  UseGsHmmFile [GsHmmFile] が有効なら 1 無効なら 0 音響モデル
  UseArpaFile 1 なら [NgramArpaLRFile] [NgramArpaRLFile] を、0 なら [NgramFile] を使用 言語モデル
LogFiles\ ログファイル関係
  OutLogFile 認識結果のみを記録するログファイル名 なし 全般
  ErrLogFile エラー情報のみを記録するログファイル名 なし 全般
  DebugLogFile いろいろな情報を記録するログファイル名 なし 全般
  UseOutLogFile [OutLogFile] が有効なら 1 無効なら 0 なし 全般
  UseErrLogFile [ErrLogFile] が有効なら 1 無効なら 0 なし 全般
  UseDebugLogFile [DebugLogFile] が有効なら 1 無効なら 0 なし 全般
  IMEDllFile 指定するIME の DLL ファイル名 なし 言語モデル
  UseIME SAPI-XML の単語読みを求めるのにIMEを使うなら 1 使わないなら 0 なし 言語モデル
  UseIMEDllFile IME の DLL を [IMEDllFile] で指定するなら 1 しないなら 0 なし 言語モデル
AudioOptions\ 入力音声に関するパラメータ
  PauseSegment 入力音声の切り出しを(0:しない 1:する 2:マイク入力のみする) -pausesegment
-nopausesegment
入力音声
  LevelThreshold 切り出しの零交差のレベル閾値 -lv 入力音声
  HeadMarginMsec 音声区間開始部のマージン(ミリ秒) -headmargin 入力音声
  TailMarginMsec 音声区間終了部のマージン(ミリ秒) -tailmargin 入力音声
  ZeroCross 切り出しの零交差数閾値 -zc 入力音声
  StripZeroSample 完全に零の区間のサンプルを取り除くか -nostrip 入力音声
  WaveFormat 内部処理用の波形フォーマット(音響モデルにあわせなければいけない)
0: 16kHz 16bit Mono  1: 8kHz 16bit Mono
-smpPeriod / -smpFreq 入力音声
  HiPassFreq 高周波成分カットオフ周波数 -hipass 入力音声
  LoPassFreq 低周波成分カットオフ周波数 -lopass 入力音声
  FrameSizeSample 窓サイズ(単位:サンプル)※WaveFormatによって時間は変化 -fsize 入力音声
  FrameShiftSample フレームシフト幅(単位:サンプル)※WaveFormatによって時間は変化 -fshift 入力音声
  WaveOutFile 処理波形(SAPI変換後)のログ出力ファイル名
ここに指定した名前+000からインクリメントされる3桁の数値+.wav というファイル名で保存される

なし

入力音声
DecodeOptions\
  TrellisBeamWidth ビーム幅(HMMノード数) -b デコード
  GsStateNum GMS 使用時([UseGsHmmFile]=1)、全モノフォンの状態の中から上位いくつの状 態のトライフォンを計算するかを指定 -gsnum 音響モデル
  CalcWordAlign デコード
  FalseRecognitionThreshold なし デコード
  LmWeight 第1パスの言語重み -lmp デコード
  LmWeight2 第1パスの単語挿入ペナルティ -lmp2 デコード

  LmPenalty

第2パスの言語重み -lmp デコード
  LmPenalty2 第2パスの単語挿入ペナルティ -lmp2 デコード
  LmpSpecified [LmWeight], [LmPenalty] が有効なら 1 無効なら 0 -lmp デコード
  Lmp2Specified [LmWeight2], [LmPenalty2] が有効なら 1 無効なら 0 -lmp2 デコード
  Penalty1 --
  Penalty2 --
  Nbest N-best 数 -nbest n デコード
  UseNbest N-best を計算する -nbest デコード
  UseCM 信頼度を計算する -SAPICM デコード

Compliance Test の結果

Speech SDK に付属の Compliance Test の実行結果です。

Required 理由
SoundStart
SoundEnd
FalseRecognition × Rejection に未対応のため
FPhraseStart
Recognition
SoundStart -> SoundEnd order
PhraseStart -> Recongnition order
Events Offset
Synchronize before loading Command & Control grammar
Synchronize Command & Control grammar after loading engine
Application Lexicon for Command & Control
Uses user lexicon before application lexicon for Command & Control 
Case sensitive lexicon
L tag
Expected Rule
P[hrase] tag
O[ptional] tag
RULE and RULEREF tags
/Disp/lex/pron
Case sensitive grammar
SpPhraseElements ver 2.1c より対応
Automatically pause engine on recognition
Invalidate top level rule × Rejection に未対応のため
Invalidate non-top level rule
Multi Instance
Multiple application contexts [ISpRecoContext]