連載
» 2011年10月04日 00時00分 UPDATE

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

サンプル・プログラムから基本的なAPIの使い方を学ぼう。これだけ学べば基本的なKinectアプリが開発できる。最終回。

[k1ha410(http://www.m-tea.info/),著]
連載:Kinect for Windows SDK(ベータ版)開発入門
Insider.NET

 

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

連載目次

 前回は、インストールされた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#版)のフォルダ&ファイルの構成

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

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

 実際にソリューション・ファイルを開いてみる(次の画面はその例)。

dt-kinectsdkbeta02_09.gif RecordAudioをVisual Studio 2010で開いた場合

アセンブリの参照

 まず、参照設定を確認してみる。前回の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();

Kinectのマイクから録音するためのKinectAudioSourceオブジェクトの使用例

 ストリームからの読み込みは、一般的なストリームの使い方と同様である。Readメソッドに、バッファ、オフセット、バッファの最大長を渡し、戻り値に読み込まれたバイト数が返却される(次のコードはその例)。

int count = audioStream.Read(buffer, 0, buffer.Length);

ストリームからオーディオ・データを読み込むコード例(Program.csファイルの44行目以降)

録音したデータを.waveファイルに保存

 ストリームから読み込まれたオーディオ・データはバッファに書き込まれている。サンプル・プログラムでは、このバッファを.waveファイルにRIFF形式で保存しているが、この詳細については割愛する(Program.csファイルの75行目以降)。

音源の位置を調べて表示

 Kinect for Windows SDK(ベータ版)では、Kinectのマイク・センサー・アレイとビーム・フォーミングという技術を使い、音源の位置(角度)を知ることができる。推定する範囲は、「50」〜「-50」度の範囲で10度刻みの11本であるイメージにすると下記のようになる。

dt-kinectsdkbeta02_10.gif Kinectのビーム・フォーミング

 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;

BeamChangedイベントにイベント・ハンドラを追加するコード例

static void source_BeamChanged(object sender, BeamChangedEventArgs e)
{
  // e.Angleで 検出したビームの角度をラジアンで取得できる
}

BeamChangedイベント・ハンドラのコード例

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

 このサンプル・プログラムは、オーディオの録音と、その音源の位置を推定していた。

  • Microsoft.Research.Kinectアセンブリの追加
  • 今回使用したKinect for Windows SDK(ベータ版)の名前空間は「Microsoft.Research.Kinect.Audio」
  • KinectAudioSourceオブジェクトを利用することで、音声を扱える。また使用後はDisposeメソッド呼び出しをしなければならない
  • KinectAudioSourceオブジェクトのStartメソッドで得られるストリームを用い、オーディオ・データが取得できる
  • SoundSourcePositionプロパティやMicArrayBeamAngleプロパティを用いて音源が11本のビームのどのビーム上にあるか推定できる
  • KinectAudioSourceオブジェクトのBeamChangedイベントで音源位置の変化を検知できる

 続いて次のページでは、サンプル・プログラムを基に、Audioを用いた音声認識について解説していく。

       1|2 次のページへ

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

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

メールマガジン登録

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