2002/10/22
2002/10/15
2002/09/12
京都大学情報学研究科知能情報学専攻音声メディア研究室
住吉貴志(sumiyosi@kuis.kyoto-u.ac.jp)
このドキュメントは、音声認識を利用したアプリケーションを作成する人へ向けた、SAPI を使ったアプリケーション開発についての簡単な解説です。音声認識エンジンとして Julius for SAPI を使用することを想定しています。
ドキュメントは現在作成中であり、まだ完全ではありません。
Microsoft Speech API (以下、SAPI)とは、Microsoft 社の作成する Windows の音声アプリケーションのための標準インターフェース群であり、音声認識、音声合成を用いたアプリケーション開発に便利です。
SAPI は音声アプリケーションと音声認識(あるいは音声合成)エンジンを仲介する役割を果たします。これまで音声アプリケーション開発は特定のエンジンに依存して開発するのが一般的であり、すなわちエンジンがなければ音声アプリケーションが開発できない状況でした。現在はこのSAPIのインターフェースを使って、エンジンに依存しない開発が可能となっています。
またWindows XP においては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 では使用できない項目が含まれています。以下に詳細な情報を示します。
ver 2.1 から、SAPI からの結果である SPPHRASE::pszPronunciation にデータが格納されるようになりました。内部的には、Julius が認識で使用した音素列から変換しています。
SPRECORESULTINFO, SPPHRASE には、認識した音声区間の情報が設定されています。また、SPPHRASEELEMENT には単語開始位置とサイズの情報が含まれています。位置情報はフレーム単位で計算していますので、それ以上の分解能はありません。
SPPHRASEELEMENT の ActualConfidence, EngineConfidence の値は無効です。
「デコード」の「N-best を計算する」をチェックすることで、Alternate に N-best の結果が出力されます。First-best が認識結果として返るため、Alternate として出力されるのは N-1 とおりになります。
SAPI 内部の処理によってすでに文字化けが起こっているようです。使わないようにしてください。
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 | デコード |
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] | ○ |