読者です 読者をやめる 読者になる 読者になる

Natural Software

KinectなどのDepthセンサーを中心に活動しています

KINECT SDK Beta2 で音声データを扱う( C# + WPF )#kinectsdk_ac

Kinect

このエントリは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++だと異様に難しくなるので、ちょっと時間を見つけてそちらもやってみたいですね。