第3回 Kinect for Windows SDKで録音/音源の位置特定/音声認識連載:Kinect for Windows SDK(ベータ版)開発入門(2/2 ページ)

» 2011年10月04日 00時00分 公開
前のページへ 1|2       

■サンプル・プログラム「Speech」

 最後に、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#版)のフォルダ&ファイルの構成

 このSpeech(C#版)の中では、下記の2つのファイルが重要である。

  • Speech.sln:Visual Studio 2010のソリューション・ファイルである。このファイルを開くと、Speechプロジェクトの開発ができる。
  • Program.cs:コンソール・プログラムであるSpeech本体である。

 実際にソリューション・ファイルを開いてみる。

SpeechをVisual Studio 2010で開いた場合

アセンブリの参照

 まず、参照設定を確認してみる。RecordAudioと同様にMicrosoft.Research.Kinectアセンブリが追加されている。さらに音声認識に必要なMicrosoft.Speechアセンブリも追加されている。

 なお、Microsoft.Speechアセンブリを利用するためには以下が必要である。もし導入がまだであれば、導入をお忘れなく。

サンプル・コードについて

 今回のサンプル・プログラムは、以下のことを実現するコードを含んでいる。

  • Kinectのオーディオ・ソースを利用する
  • 認識エンジンの準備
  • 認識の通知を受ける

名前空間

 名前空間は「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 FoundationMFPKEY_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);

音声認識エンジンを取得するコードの例(Program.csファイルの57行目以降)

 この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);

構文を構築するための準備をするコード例(Program.csファイルの59行目以降)

 構文が構築できたら、SpeechRecognitionEngineオブジェクトに読み込ませる(次のコードを参照)。

Grammar g = new Grammar(gb);
sre.LoadGrammar(g);

SpeechRecognitionEngineオブジェクトに構文を読み込ませるコード例(Program.csファイルの71行目以降)

 最後に、オーディオ・ストリームを開き、認識エンジンにオーディオ・ストリームを渡し、音声認識機能を開始する。

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();

音声認識機能を開始〜停止するコード例(Program.csファイルの78行目以降)

 音声認識を開始する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;

音声認識関連の通知イベントに対してイベント・ハンドラを追加するコード例(Program.csファイルの74行目以降)

 また、各イベント・ハンドラは以下のように利用する。

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プロパティ値は、認識失敗した音声オブジェクト
}

音声認識関連の通知イベントに対する各イベント・ハンドラのコード例(Program.csファイルの74行目以降)

サンプル・プログラムのまとめ

 このサンプル・プログラムは、Kinectのマイク・センサー・アレイを用いて音声認識していた。

  • Microsoft.Research.Kinectアセンブリを追加
  • 音声認識エンジンを使用するために、Microsoft.Speechアセンブリを追加
  • 今回使用したKinect for Windows SDK(ベータ版)の名前空間は「Microsoft.Research.Kinect.Audio」である
  • 音声認識エンジンを使用するために、Microsoft.Speech.Recognition名前空間を用いる
  • Microsoft Media Foundationの設定を用い、Kinectのオートマティク・ゲイン・コントロールを無効にした
  • Microsoft Speech PlatformのSpeechRecognitionEngineオブジェクトに認識したい単語を登録し、Kinectのオーディオ・ストリームを渡すことで、音声認識の利用をした

■まとめ

 前回〜今回は、Kinect for Windows SDK(ベータ版)のサンプル・プログラムを通じてKinectをC#から利用する方法について見てきた。

 サンプル・プログラムには、基本的なAPIの利用方法が記載されている。この詳細を把握することで、基本的なKinectを利用したアプリケーションの実現ができるのではないかと考える。

「連載:Kinect for Windows SDK(ベータ版)開発入門」のインデックス

連載:Kinect for Windows SDK(ベータ版)開発入門

前のページへ 1|2       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。