最後に、Speechをひもときながら、Kinect for Windows SDK(ベータ版)のAudioを用いた音声認識について、理解を深めていく。Speechは、Kinectのマイク・センサー・アレイを利用し、さらにMicrosoft Speech Platform※で音声認識するサンプル・プログラムである。サンプル・プログラムは、「C:\Users\Public\Documents\Microsoft Research KinectSDK Samples\Audio\Speech」にある。
※Microsoft Speech Platformは、かなり幅広い技術である。ここでは網羅的な技術詳細は解説しない。
C:\Users\Public\Documents\Microsoft Research KinectSDK Samples\Audio\Speech
└─ CS
│ app.config
│ Program.cs
│ ReadMe.txt
│ Speech.csproj
│ Speech.sln
│
└─ Properties
AssemblyInfo.cs
このSpeech(C#版)の中では、下記の2つのファイルが重要である。
実際にソリューション・ファイルを開いてみる。
●アセンブリの参照
まず、参照設定を確認してみる。RecordAudioと同様にMicrosoft.Research.Kinectアセンブリが追加されている。さらに音声認識に必要なMicrosoft.Speechアセンブリも追加されている。
なお、Microsoft.Speechアセンブリを利用するためには以下が必要である。もし導入がまだであれば、導入をお忘れなく。
●サンプル・コードについて
今回のサンプル・プログラムは、以下のことを実現するコードを含んでいる。
○名前空間
名前空間は「Microsoft.Research.Kinect.Audio」である。Microsoft Speech Platformにおける認識の名前空間は「Microsoft.Speech.Recognition」であり、録音するために「Microsoft.Speech.AudioFormat」も使用している。
○Kinectのオーディオ・ソースを利用
RecordAudioと同様にKinectのオーディオ・ソースの準備を行い、KinectAudioSource.SystemModeプロパティの設定を行う。
KinectAudioSource source = new KinectAudioSource();
source.SystemMode = SystemMode.OptibeamArrayOnly;
この後、音声認識のために、Kinectのオートマティック・ゲイン・コントロールを無効にしている。この設定をするためには、Microsoft Media FoundationのMFPKEY_WMAAECMA_FEATR_AGCプロパティを「VARIANT_FALSE」にしなければならい。そのためには、MFPKEY_WMAAECMA_FEATURE_MODEプロパティを「VARIANT_TRUE」にしておく。
サンプル・プログラムでは、KinectAudioSource.FeatureModeプロパティとKinectAudioSource. AutomaticGainControlプロパティでその設定を行っている(Program.csファイルの43行目以降)。
○認識エンジンの準備
Microsoft Speech PlatformはWindows Desktop Speech Technologyを実現する機構である。この機構は「特定の語句」や「語」のパターン認識などを提供する。
パターン認識を実現するために、SpeechRecognitionEngineクラスのオブジェクトを生成し、そのオブジェクトに構文を読み込ませて認識する。構文を定義する方法は、GrammarBuilderクラスを使う例がある。このGrammarBuilderオブジェクトに、語の集合を示すChoicesクラスのオブジェクトを追加して、構文を構築する。この周辺の詳細は、System.Speech.Recognition名前空間などを参照されたい。
では、サンプル・プログラムについて見ていく。
まず、システムに導入されている音声認識エンジンの列挙を行い、SpeechRecognitionEngineオブジェクトを生成する。今回は「SR_MS_en-US_Kinect_10.0」に一致するエンジンを選択する。
RecognizerInfo ri = SpeechRecognitionEngine.InstalledRecognizers().
Where(r => r.Id == "SR_MS_en-US_Kinect_10.0").FirstOrDefault();
SpeechRecognitionEngine re = new SpeechRecognitionEngine(ri.Id);
このSpeechRecognitionEngineクラスもまたDisposableであるため、不要となった際は、Disposeメソッドを呼び出さなければならない。
次に、構文を構築するためにGrammarBuilderオブジェクトとChoicesオブジェクトを準備する。ここでは“red”“green”“blue”の3単語からなる構文を構築する。
GrammarBuilder gb = new GrammarBuilder();
gb.Culture = ri.Culture;
Choices colors = new Choices();
colors.Add("red");
colors.Add("green");
colors.Add("blue");
gb.Append(colors);
構文が構築できたら、SpeechRecognitionEngineオブジェクトに読み込ませる(次のコードを参照)。
Grammar g = new Grammar(gb);
sre.LoadGrammar(g);
最後に、オーディオ・ストリームを開き、認識エンジンにオーディオ・ストリームを渡し、音声認識機能を開始する。
Stream s = source.Start();
sre.SetInputToAudioStream(s, new SpeechAudioFormatInfo(
EncodingFormat.Pcm, 16000, 16, 1, 32000, 2, null));
sre.RecognizeAsync(RecognizeMode.Multiple);
Console.ReadLine();
sre.RecognizeAsyncStop();
音声認識を開始するSpeechRecognitionEngineオブジェクトのSetInputToAudioStreamメソッドは、オーディオ・ストリームとそのストリームの情報(=PCM形式、16KHz、16bit、1chデータであること)を渡さなければならない。
また、SpeechRecognitionEngineオブジェクトのRecognizeAsyncメソッドを用いて、認識を1度だけかまたは複数回継続かを指定できる。今回は、複数回継続を意味する「RecognizeMode.Multiple」を指定した。なお、複数回継続した場合には、RecognizeAsyncCancelメソッドまたはRecognizeAsyncStopメソッドを呼ぶまで継続する。
○音声認識の通知を受ける
SpeechRecognitionEngineオブジェクトは、信頼性の高い1つ以上の句を見つけたとき、SpeechRecognizedイベントを経由して通知を行う。またオーディオ・ストリームから一時的に音声を認識したときに、SpeechHypothesizedイベントを経由して通知を行い、もし音声を検出したが認識に失敗したときはSpeechRecognitionRejectedイベントを経由して通知が行われる。
実際には、以下のようにイベント・ハンドラを追加する。
sre.SpeechRecognized += SreSpeechRecognized;
sre.SpeechHypothesized += SreSpeechHypothesized;
sre.SpeechRecognitionRejected += SreSpeechRecognitionRejected;
また、各イベント・ハンドラは以下のように利用する。
static void SreSpeechHypothesized(object sender, SpeechHypothesizedEventArgs e)
{
// e.Result.Textプロパティ値は、認識結果のテキスト
}
static void SreSpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
// e.Result.Textプロパティ値は、認識結果のテキスト
}
static void SreSpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e)
{
// e.Result.Audioプロパティ値は、認識失敗した音声オブジェクト
}
●サンプル・プログラムのまとめ
このサンプル・プログラムは、Kinectのマイク・センサー・アレイを用いて音声認識していた。
前回〜今回は、Kinect for Windows SDK(ベータ版)のサンプル・プログラムを通じてKinectをC#から利用する方法について見てきた。
サンプル・プログラムには、基本的なAPIの利用方法が記載されている。この詳細を把握することで、基本的なKinectを利用したアプリケーションの実現ができるのではないかと考える。
Copyright© Digital Advantage Corp. All Rights Reserved.