NtKinect: Kinect V2 C++ Programming with OpenCV on Windows10

Kinect V2 で音声を取得する


2016.07.18: created by
Japanese English
目次へ

前提として理解しておくべき知識


音声を取得する

USE_AUDIO 定数を define してから NtKinect.h を include する と NtKinect の音声関係のメソッドや変数が有効になります。

setAudio() 関数を呼び出すことで音声が取得され、録音中ならば音声データがファイルに書き込まれます。 録音の開始はファイルのパスを指定して openAudioFile(string)関数を呼出、 録音の終了では closeAudioFile()を呼び出します。

NtKinect

NtKinect の音声に関するメソッド

返り値の型 メソッド名 説明
void setAudio(bool flag = false)

音声を取得し、録音中ならファイルに保存する。
音声の方向を判定し、変数 beamAngle にセットする。

引数
flag
setSkeleton()を呼び出した後で引数をtrueにして呼び出すと 発話者のskeletonTrackingId[i] をメンバ変数audioTrackingId にセットする。
void drawAudioDirection(cv::Mat& image ) 音声ビームの方向を image に描画する。
bool isOpenedAudio() 録音ファイルをopen中かどうかを返す。
void openAudio(string path ) path を録音用ファイルとしてオープンする。
void closeAudio() 録音用ファイルをクローズする。
NtKinect

NtKinect の音声に関するメンバ変数

変数名 説明
float beamAngle 音声の方向(左右への角度)
float beamAngleConfidence beamAngleの信頼度 (0.0 〜 1.0)
UINT64 audioTackingId 発話者のskeletonTrackingId

プログラム作成の手順

  1. NtKinect: Kinect V2 でRGBカメラ画像を取得する(基本設定)」 の Visual Studio のプロジェクト KinectV2.zipを用いて作成します。
  2. WaveFile.hをプロジェクトに追加します。
  3. Microsoft が配布している AudioCaptureRaw-Console C++ Sample の WaveFile.h を少し変更したものをプロジェクトに加えます。







    もしもプロジェクトに既存のファイル追加してもincludeできないというエラーが起きる場合は、追加したファイルを 一旦削除してから、「ソリューションエクスプトーラー」の「ヘッダーファイル」を右クリックして メニューの中から「追加」「新しい項目」「VisualC++のヘッダーファイル(.h)」で 「名前」に"WaveFile.h"を指定して下さい。 新たに作成されたファイルにダウンロードしたファイルの内容をコピーして下さい。

  4. main.cppの内容を以下のように変更します。
  5. NtKinect.hをincludeする前に USE_AUDIO 定数をdefineします。 録音開始は openAudioFile()関数、録音終了は closeAudioFile()を呼び出します。 音声の取得は setAudio()関数で行いますが、録音中は自動的にファイルに保存されます。

    下のプログラム例では、現在時刻を取得して、 それをファイル名(例 "2016-07-18_09-16-32.wav")とする wav ファイルを作成しています

    main.cpp
    #include <iostream>
    #include <sstream>
    
    #define USE_AUDIO
    #include "NtKinect.h"
    
    using namespace std;
    
    #include <time.h>
    string now() {
      char s[1024];
      time_t t = time(NULL);
      struct tm lnow;
      localtime_s(&lnow, &t);
      sprintf_s(s, "%04d-%02d-%02d_%02d-%02d-%02d", lnow.tm_year + 1900, lnow.tm_mon + 1, lnow.tm_mday, 
    	    lnow.tm_hour, lnow.tm_min, lnow.tm_sec);
      return string(s);
    }
    
    void doJob() {
      NtKinect kinect;
      bool flag = false;
      while (1) {
        kinect.setRGB();
        if (flag) kinect.setAudio();
        cv::putText(kinect.rgbImage, flag ? "Recording" : "Stopped", cv::Point(50, 50),
    		cv::FONT_HERSHEY_SIMPLEX, 1.2, cv::Scalar(0, 0, 255), 1, CV_AA);
    // rename CV_AA as cv::LINE_AA (in case of opencv3 and later)
        cv::imshow("rgb", kinect.rgbImage);
        auto key = cv::waitKey(1);
        if (key == 'q') break;
        else if (key == 'r') flag = true;
        else if (key == 's') flag = false;
    
        if (flag && !kinect.isOpenedAudio()) kinect.openAudio(now() + ".wav");
        else if (!flag && kinect.isOpenedAudio()) kinect.closeAudio();
      }
      cv::destroyAllWindows();
    }
    
    int main(int argc, char** argv) {
      try {
        doJob();
      } catch (exception &ex) {
        cout << ex.what() << endl;
        string s;
        cin >> s;
      }
      return 0;
    }
    
  6. プログラムを実行するとRGB画像が表示されます。'q'キーで終了します。
  7. 'r'キーで録音開始、's'キーで録音停止です。 RGB画像の左上に録音状態が "Recording" または "Stopped" と表示されます。

  8. サンプルのプロジェクトはこちら KinectV2_audio.zip
  9. 上記のzipファイルには必ずしも最新の NtKinect.h が含まれていない場合があるので、 こちらから最新版をダウンロードして 差し替えてお使い下さい。



http://nw.tsuda.ac.jp/