第3回 Kinect for Windows SDKで録音/音源の位置特定/音声認識:連載:Kinect for Windows SDK(ベータ版)開発入門(1/2 ページ)
サンプル・プログラムから基本的なAPIの使い方を学ぼう。これだけ学べば基本的なKinectアプリが開発できる。最終回。
前回は、インストールされたC#版サンプル・プログラムの「Skeletal Viewer」について解説することで、NUI(ナチュラル・ユーザー・インターフェイス)のカメラ・イメージの取得、深度情報の取得、骨格情報の取得などのKinect for Windows SDK(ベータ版)の基本的な使い方について理解した。今回も引き続き、サンプル・プログラムを基に、録音/音源の位置特定/音声認識について解説する。
■サンプル・プログラム「RecordAudio」
まずは、SDKに付属のサンプル・プログラムである「RecordAudio」をひもときながら、Kinect for Windows SDK(ベータ版)のAudioについて、理解を深めていこう。
RecordAudioは、Kinectセンサー(以下、単に「Kinect」)のマイク・アレイを利用した録音および、ビーム・フォーミング(詳細後述)を利用した音源の位置特定のサンプル・プログラムである。
そのサンプル・プログラムは、「C:\Users\Public\Documents\Microsoft Research KinectSDK Samples\Audio\RecordAudio」にある。
C:\Users\Public\Documents\Microsoft Research KinectSDK Samples\Audio\RecordAudio
└─ CS
│ app.config
│ Program.cs
│ ReadMe.txt
│ RecordAudio.csproj
│ RecordAudio.sln
│
└─ Properties
AssemblyInfo.cs
このRecordAudio(C#版)の中では、下記の2つのファイルが重要である。
- RecordAudio.sln:Visual Studio 2010のソリューション・ファイルである。このファイルを開くと、RecordAudioプロジェクトの開発ができる。
- Program.cs:コンソール・プログラムであるRecordAudio本体である。
実際にソリューション・ファイルを開いてみる(次の画面はその例)。
●アセンブリの参照
まず、参照設定を確認してみる。前回のSkeletal Viewerと同様に、Microsoft.Research.Kinectアセンブリが追加されている。Audioの場合もNUIと同様にMicrosoft.Research.Kinectアセンブリへの参照が必要である。
●サンプル・コードについて
今回のサンプル・プログラムは、以下のことを実現するコードを含んでいる。
- Kinectのオーディオ・ソースを利用する
- 20秒間、Kinectのマイクから録音する
- 録音したデータを.waveファイルに保存する
- 音源の位置を調べ表示する
- 音源の位置が変化したら表示する
○名前空間
名前空間は「Microsoft.Research.Kinect.Audio」である。今回のサンプル・プログラムも、型修飾を軽減するためにusingキーワードを用いている(Program.csファイルの17行目付近)。
○Kinectのオーディオ・ソースを利用
KinectAudioSourceクラス(Microsoft.Research.Kinect.Audio名前空間)を生成することで、Kinectのオーディオ・ソースを利用できる。これは、前回で「DMO(DirectX Media Object)を用いてKinectのマイク・センサー・アレイを利用できる」と紹介したが、DMOをラッピングしたものである。
KinectAudioSource source = new KinectAudioSource();
なお、このオブジェクトはIDisposableインターフェイスを実装したものである。そのため、使い終わった際はリソースを解放するためにDisposeメソッドの呼び出しが必須である。サンプル・プログラムでは、暗黙的にDisposeメソッドを呼び出すためにusingステートメントを用いている(Program.csファイルの31行目)。
オブジェクトを生成したら、KinectAudioSource.SystemModeプロパティを用いて、MSRKinectAudio DMOの「MFPKEY_WMAAECMA_SYSTEM_MODEプロパティ」を設定する。
このKinectAudioSource.SystemModeプロパティは、以下のSystemMode列挙体値のどれかである。
- SystemMode.OptibeamArrayAndAec:複数のマイク・アレイを用い、さらにノイズ・キャンセルを行う。
- SystemMode.OptibeamArrayOnly:複数のマイク・アレイを用いる。
- SystemMode.SingleChannelAec:1つのマイクを用い、さらにノイズ・キャンセルを行う。
- SystemMode.SingleChannelNsAgc:1つのマイクを用いる。
今回のサンプル・プログラムは、次のように「SystemMode.OptibeamArrayOnly」を使用している。
source.SystemMode = SystemMode.OptibeamArrayOnly;
○Kinectのマイクから録音
KinectAudioSourceオブジェクトのStartメソッドを呼び出すことで、Kinectのマイクからキャプチャが始まる。このとき、Startメソッドは16kHz 16bit PCMフォーマットのストリームを返却する。このストリームから20秒間 オーディオ・データを読み込むことで録音が行える。なお、返却されたストリームもIDisposableインターフェイスを実装しているため、不要となった際はDisposeメソッドを呼び出さなければならない。
具体的には以下のように使用する
Stream audioStream = source.Start();
// audioStreamからオーディオ・データを読み込む
audioStream.Dispose();
ストリームからの読み込みは、一般的なストリームの使い方と同様である。Readメソッドに、バッファ、オフセット、バッファの最大長を渡し、戻り値に読み込まれたバイト数が返却される(次のコードはその例)。
int count = audioStream.Read(buffer, 0, buffer.Length);
○録音したデータを.waveファイルに保存
ストリームから読み込まれたオーディオ・データはバッファに書き込まれている。サンプル・プログラムでは、このバッファを.waveファイルにRIFF形式で保存しているが、この詳細については割愛する(Program.csファイルの75行目以降)。
○音源の位置を調べて表示
Kinect for Windows SDK(ベータ版)では、Kinectのマイク・センサー・アレイとビーム・フォーミングという技術を使い、音源の位置(角度)を知ることができる。推定する範囲は、「50」〜「-50」度の範囲で10度刻みの11本であるイメージにすると下記のようになる。
Kinect for Windows SDK(ベータ版)では、KinectAudioSourceオブジェクトのMicArrayBeamAngleプロパティを用い、おおよそどの軸上にいるかを推定でき、またSoundSourcePositionプロパティでより細かな推定が行える。なお、SoundSourcePositionプロパティ、MicArrayBeamAngleプロパティともに、ラジアンであることに注意されたい。
サンプル・プログラムでは以下のように表示している。
Console.Write(
"Sound source position (radians): {0}\t\tBeam: {1}\r",
source.SoundSourcePosition,
source.MicArrayBeamAngle);
また、KinectAudioSourceオブジェクトのSoundSourcePositionConfidenceプロパティが、SoundSourcePositionプロパティの値にどれくらいの信頼性があるかを「0.0」〜「1.0」の範囲で示している。
○音源の位置の変化を知る
音源の位置(=ビーム・フォーミングの検出されたビーム)が変更になったとき、KinectAudioSourceオブジェクトのBeamChangedイベントで通知を受けられる。以下のコードは、BeamChangedイベント・ハンドラの例。
source.BeamChanged += source_BeamChanged;
static void source_BeamChanged(object sender, BeamChangedEventArgs e)
{
// e.Angleで 検出したビームの角度をラジアンで取得できる
}
●サンプル・プログラムのまとめ
このサンプル・プログラムは、オーディオの録音と、その音源の位置を推定していた。
- Microsoft.Research.Kinectアセンブリの追加
- 今回使用したKinect for Windows SDK(ベータ版)の名前空間は「Microsoft.Research.Kinect.Audio」
- KinectAudioSourceオブジェクトを利用することで、音声を扱える。また使用後はDisposeメソッド呼び出しをしなければならない
- KinectAudioSourceオブジェクトのStartメソッドで得られるストリームを用い、オーディオ・データが取得できる
- SoundSourcePositionプロパティやMicArrayBeamAngleプロパティを用いて音源が11本のビームのどのビーム上にあるか推定できる
- KinectAudioSourceオブジェクトのBeamChangedイベントで音源位置の変化を検知できる
続いて次のページでは、サンプル・プログラムを基に、Audioを用いた音声認識について解説していく。
Copyright© Digital Advantage Corp. All Rights Reserved.