このエントリはKINECT SDK Advent Calendar 2011 : ATNDの12月11日分です
Advent Calendarでの、僕の全プロジェクトはこちらです
OpenNIと同じように、KINECTから取得した音声データ(WAVE)をPCから出力してみましょう。WAVEの出力には、OpenNIと同様に、自作のStreamingWavePlayerを使います。
コード
using System; using System.IO; using Microsoft.Research.Kinect.Audio; namespace Audio { class Program { static void Main( string[] args ) { // 音源を取得するインスタンスを生成する using ( KinectAudioSource source = new KinectAudioSource() ) { // SingleChannelAec:シングルチャネルのマイクで、エコーキャンセルを使用する // OptibeamArrayOnly:マルチチャネルのマイクのみを使用する(エコーキャンセルを使用しない) // OptibeamArrayAndAec:マルチチャネルのマイクと、エコーキャンセルを使用する) // SingleChannelNsAgc:??? source.SystemMode = SystemMode.SingleChannelAec; using ( Stream audioStream = source.Start() ) { Console.WriteLine( "Start... Press any key" ); byte[] buffer = new byte[4096]; Win32.StreamingWavePlayer player = new Win32.StreamingWavePlayer( 16000, 16, 1, 100 ); while ( !Console.KeyAvailable ) { int count = audioStream.Read( buffer, 0, buffer.Length ); player.Output( buffer ); } } } } } }
解説
KinectAudioSourceがKINECTからの音声入力になります。このインスタンスを生成します。次にKinectAudioSource.SystemModeで、使用するマイクのモードを選択します。マイクのモードは次の4種類です
- SingleChannelAec:シングルチャネルのマイクで、エコーキャンセルを使用する
- OptibeamArrayOnly:マルチチャネルのマイクのみを使用する(エコーキャンセルを使用しない)
- OptibeamArrayAndAec:マルチチャネルのマイクと、エコーキャンセルを使用する)
- SingleChannelNsAgc:???
static void Main( string[] args ) { // 音源を取得するインスタンスを生成する using ( KinectAudioSource source = new KinectAudioSource() ) { // SingleChannelAec:シングルチャネルのマイクで、エコーキャンセルを使用する // OptibeamArrayOnly:マルチチャネルのマイクのみを使用する(エコーキャンセルを使用しない) // OptibeamArrayAndAec:マルチチャネルのマイクと、エコーキャンセルを使用する) // SingleChannelNsAgc:??? source.SystemMode = SystemMode.SingleChannelAec; .... } }
音声の取得と出力
以上で準備ができたので、音声の取得と出力を開始します。音声の入力はKinectAudioSource .Start()で行います。このときにStreamが返ってくるので、これをReadすることで音声を読むことができます。読み込んだ音声はそのままStreamingWavePlayer.Outputで出力します。
ちなみに、KINECT SDKで取得できるWAVEデータは次のようになっているようです。
- サンプリングレート:16000
- 1サンプルあたりのビット数:16
- チャネル数:1
static void Main( string[] args ) { .... using ( Stream audioStream = source.Start() ) { Console.WriteLine( "Start... Press any key" ); byte[] buffer = new byte[4096]; Win32.StreamingWavePlayer player = new Win32.StreamingWavePlayer( 16000, 16, 1, 100 ); while ( !Console.KeyAvailable ) { int count = audioStream.Read( buffer, 0, buffer.Length ); player.Output( buffer ); } } } }
まとめ
とても簡単に音声を出力することができます。C++だと異様に難しくなるので、ちょっと時間を見つけてそちらもやってみたいですね。