やってみよう!Kinectアプリ開発 - 第6回 音源の方向の取得

2012-07-06 17:07

zigsow 長谷川 勇
 

はじめに

前回まではKinect™ for Windows® SDKの画像処理に関する機能を紹介してきました。今回から音声処理に関する機能を紹介します。

Kinect for Windows SDKによる音声処理

Kinectセンサーは、音声処理のために4つのマイクを使用したマイクロフォンアレイ、24bit ADCを持ちます。Kinect for Windows SDKはこれらを利用し、アプリケーションに以下の機能を提供します。

  • 録音
  • ビームフォーミング
  • 音源の方向特定
  • 音声認識

ここでは、これらの機能を簡単に紹介します。

録音

Kinectでは24bit ADCによる高品質な録音が可能です。録音時はノイズやエコーの軽減機能もあり、これらはアプリケーションから自由にON/OFF可能です。

ビームフォーミング

マイクアレイというのは文字通り複数のマイクを並べたものなのですが、これを使うとビームフォーミングという技術により、特定の方向からの音を選択して録音(指向性録音)することができます。(以前からごく一部のノートPCにはこのマイクアレイが内蔵されていたのですが、外付けで手軽に入手できるマイクアレイはKinectが初めてなのではないでしょうか?)

音源の方向特定

Kinectは、音源の方向を特定する機能を持ち、アプリケーションから音源の方向を-50°~50°の範囲で取得できます。 (内部的にはでは前述のビームフォーミングを応用し、システムが自動的にビームの選択を行うことで特定しているようです)

音声認識

音声認識は、NUI(Natural User Interface)APIの主要な機能の一つとされており、 Kinect for Windows SDKでは、Microsoft Speech Platform Runtime (Version 11) を用いて音声認識を行います。 Kinect for Windows SDKには、Kinectセンサーのマイクアレイに最適化されたカスタム音響モデルを持ち、より正確な音声認識を提供しています。

Kinect for Windows Language Packs v1.5.0 の日本語用ロケールをインストールすることで、日本語に対してもカスタム音響モデルが利用できます。

音源の方向特定の利用

今回は、前回のアプリケーションに音源の方向特定を利用した機能を追加します。前回同様Kinectセンサーにより認識される人物の頭部にマスク画像を貼り付けますが、今回はさらにKinectセンサーのマイクアレイが拾う音が、認識している人物の方向から発せられている場合は、人物の頭部にさらに吹き出しの画像を上書きします。

処理方式

Kinect for Windows SDKでは、音源の方向が変化した際に呼び出すイベントハンドラを登録できます。このイベントハンドラ内で音源の方向を記録しておき、描画時に音源の方向と近い頭部がある場合には、その頭部に吹き出しの画像を上書きして描画します(図1)。


図1: アプリケーションの処理イメージ

なお、頭部の方向は直接取得できませんが、 Kinectセンサーからの三次元空間上の座標がありますので、これをもとに角度を計算します(図2)。


図2: 頭部方向の計算

アプリケーションの修正

それでは、Visual Studio®を使い、アプリケーションの修正を行いましょう。今回の修正は、吹き出し用の画像の追加と、コードの修正です。

吹き出し用の画像は何でも構いませんので、好きな画像ファイルを用意してください。追加の手順は、連載第4回の「プロジェクトへの画像ファイルの追加」と同様です。フォルダはすでに作ってありますので、手順3から行ってください。

ここでは、"fukidashi.png"という画像を追加しています。

次にコードの修正です。

    • フィールドの追加

      • fukidashiImage: 吹き出し画像を保持します。
      • soundDir: 音源の方向(角度)を保持します。ただしKinectセンサーが音を認識していないなど、方向が取得できない場合は値をNaNにしておきます(NaNとはNot A Numberの略で、1/0のように演算結果が未定義であることを示します)。
    • 初期化処理

      • 吹き出し画像の読み込み。これはmaskImageと同様なので問題ないでしょう。
      • SoundSourceAngleChangedイベントハンドラの登録
      • AudioStreamの取得開始
    • SoundSourceAngleChangedイベントハンドラ

      • SoundSourceAngleChangedEventArgsからは以下の値を取得できます。
        • Angle: Kinectセンサーが検知したもっとも強い音声の方向を、-50°~50°の範囲で返します。(※ 以前のバージョンではradianでしたが、正式版以降degreeに変わったので注意しましょう)
        • ConfidenceLevel: Angleの値の信頼度を0.0~1.0の範囲で返します。
      • ここでは信頼度が0.5より大きい場合は、その方向をsourceDirに代入しておき、そうでない場合は取得できなかったとしてNaNを代入しておきます。(※ うまく動作しない場合は、この数値を0.5より小さくしてみてください。0.3くらいにした方がうまく動くかもしれません。)
    • 描画処理

      • 描画処理では、マスク画像を表示するための頭部毎のループ内で以下の処理を行います。
      • 頭部の方向(角度)を取得。これは図2で説明した方法で取得します。ただし、Atan2関数はradianで値が返ってくるので、degreeに直します(180を掛けてπで割ります)。なお、Atan2関数の引数は、Y、Xの順なので注意しましょう。
      • 音源の方向と頭部の方向の差が10度以内の場合は、「同じ方向」と判断します。
      • 「同じ方向」の場合は、吹き出し画像を描画します。画像の描画はこれまでもでてきたので問題ないと思います。ここでは、96×64のサイズで、右に32ピクセルずらして描画しています(吹き出しっぽくみせるためで数字自体にはあまり意味がありません。みなさんも適宜調整してください)

修正は以上です。メニューから[デバッグ(D)]-[デバッグ実行(S)]を選択し、実行してみましょう。

 

マスク画像を上書きされた人物が、何か喋ることで吹き出しが表示されます。

まとめ

今回は音声処理機能の紹介として、音源の方向取得を説明しました。次回は音声認識について紹介します。

商標について

Kinect、Visual Studio、Windowsは、米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。

ジグソープレミアムレビュー

  • やってみようKinect(キネクト)アプリ開発 - ラボクルー集まれ!