SAPI トレーニングの実装は比較的難しく、ドキュメンテーションでは、何を知る必要があるかについてはあまり説明されていません。
ISpRecognizer2::SetTrainingStateは、レコグナイザーをトレーニング モードに切り替えたり、トレーニング モードから切り替えたりします。
トレーニング モードに入ると、実際に行われるのは、レコグナイザーがユーザーに認識に関するより多くの余裕を与えることだけです。そのため、フレーズを認識しようとしている場合、エンジンは認識に関してそれほど厳格ではありません。
トレーニング モードを終了し、fAdaptFromTrainingData フラグを設定するまで、エンジンは実際には適応を行いません。
エンジンが適応すると、プロファイル データに保存されているトレーニング オーディオがスキャンされます。新しいオーディオ ファイルを、エンジンが適応のために見つけられる場所に配置するのは、トレーニング コードの役割です。
これらのファイルにもラベルを付ける必要があるため、エンジンは何が語られたかを認識できます。
では、どうやってこれを行うのですか?あまり知られていない 3 つの SAPI API を使用する必要があります。特に、 ISpRecognizer::GetObjectTokenと SpObjectToken::GetStorageFileNameを使用してプロファイル トークンを取得し、ファイルを適切に見つける必要があります。
最後に、 ISpTranscriptを使用して、適切にラベル付けされたオーディオ ファイルを生成する必要もあります。
すべてをまとめるには、次のことを行う必要があります (疑似コード)。
インプロセス認識エンジンを作成し、適切なオーディオ入力をバインドします。
認識のためにオーディオを保持していることを確認してください。後で必要になります。
トレーニングするテキストを含む文法を作成します。
認識が発生したときにレコグナイザーを一時停止するように文法の状態を設定します。(これは、音声ファイルからのトレーニングにも役立ちます。)
認識が発生した場合:
認識されたテキストと保持された音声を取得します。
CoCreateInstance(CLSID_SpStream) を使用してストリーム オブジェクトを作成します。
ISpRecognizer::GetObjectTokenとISpObjectToken::GetStorageFileNameを使用してトレーニング オーディオ ファイルを作成し、ストリームにバインドします ( ISpStream::BindToFileを使用)。
保持されたオーディオをストリーム オブジェクトにコピーします。
ISpTranscriptインターフェイスのストリーム オブジェクトを QI し、ISpTranscript::AppendTranscriptを使用して、認識されたテキストをストリームに追加します。
次の発話のために文法を更新し、レコグナイザーを再開して、トレーニング テキストがなくなるまで繰り返します。