【翻译】Kinect v2程序设计(C++-) AudioBeam篇

Kinect v2,Microphone Array可以用来对于水平面音源方向的推测(AudioBeam)和语音识别(Speech Recognition)。这一节是介绍如何取得AudioBeam。

上一节,介绍如何使用通过Kinect SDK v2预览版,从Kinect v2预览版的Color Camera和Depth 传感器中获取数据的方法。

本节,将介绍从Kinect的Microphone Array中取得AudioBeam(水平面音源方向的推测)的方法。

Microphone Array

在第一节中介绍过,Kinect除搭载了Color Camera,Depth传感器之外,还有Microphone Array。

 

Microphone Array由4个Microphone构成,能进行水平面音源方向的推测(AudioBeam)和语音识别(Speech Recognition)等。

这一节,将介绍取得AudioBeam的方法。


图1 Kinect v2预览版的Microphone Array

图2 Kinect SDK v2预览版的示例程序(AudioBasics)

示例程序

用Kinect SDK v2取得AudioBeam,将结果显示在console上的示例程序。

Audio的功能(AudioBeam,Speech Recognition)的数据取得流程,在「Sensor」~「Source」这一块与之前的Image(Color,Depth,BodyIndex,Body)的取得流程一样。不过在这之后还请注意Audio功能所特有的部分,这里主要是介绍与Image所同样的数据取得流程。

这个示例程序的全部内容,在下面的github里全部公开了。

https://github.com/UnaNancyOwen/Kinect2Sample

图3 Kinect SDK v2预览版的数据取得的流程(重发)

「Sensor」

取得「Sensor」

// Sensor
IKinectSensor* pSensor;   // ……1
HRESULT hResult = S_OK;
hResult = GetDefaultKinectSensor( &pSensor );  //……2
if( FAILED( hResult ) ){
  std::cerr << "Error : GetDefaultKinectSensor" << std::endl;
  return -1;
}
hResult = pSensor->Open();  //……3
if( FAILED( hResult ) ){
  std::cerr << "Error : IKinectSensor::Open()" << std::endl;
  return -1;
}

列表1.1 相当于图1「Sensor」的部分(重发)

1 处理Kinect v2预览版的Sensor接口。

2 取得默认的Sensor。

3 打开Sensor。

「Source」

从「Sensor」取得「Source」。

// Source
IAudioSource* pAudioSource;  //……1
hResult = pSensor->get_AudioSource( &pAudioSource );  //……2
if( FAILED( hResult ) ){
  std::cerr << "Error : IKinectSensor::get_AudioSource()" << std::endl;
  return -1;
}

列表1.2 相当于图1「Source」的部分

1 Audio功能的Source接口。

2 从Sensor取得Source。

「AudioBeamList」~「OpenAudioBeam」

从「Source」取得「AudioBeamList」,从List里打开指定的「AudioBeam」。

// Get Audio Beam List
IAudioBeamList* pAudioBeamList;   //……1
hResult = pAudioSource->get_AudioBeams( &pAudioBeamList );  //……2
if( FAILED( hResult ) ){
  std::cerr << "Error : IAudioSource::get_AudioBeams()" << std::endl;
  return -1;
}
// Open Audio Beam
IAudioBeam* pAudioBeam;  //……3
hResult = pAudioBeamList->OpenAudioBeam( 0, &pAudioBeam );  //……4
if( FAILED( hResult ) ){
  std::cerr << "Error : IAudioBeamList::OpenAudioBeam()" << std::endl;
  return -1;
}

列表1.3 取得Microphone Array和AudioBeam

1 AudioBeamList接口。

2 从Source取得AudioBeam,然后取得Microphone Array的List。

3 AudioBeam接口。

4 从List里取得AudioBeam,打开Microphone Array。

0代表第一个被找到的默认的Microphone Array。

「Get Angle and Confidence」

从「Stream」读入Audio数据,取得音源方向和推测的信赖值。

while( 1 ){
  // Get Angle and Confidence
  FLOAT angle = 0.0f;
  FLOAT confidence = 0.0f;
  pAudioBeam->get_BeamAngle( &angle ); // radian [-0.872665f, 0.872665f]  ……1
  pAudioBeam->get_BeamAngleConfidence( &confidence ); // confidence [0.0f, 1.0f]  ……2
  // Show Result
  // Convert from radian to degree : degree = radian * 180 / Pi
  if( confidence > 0.5f ){
    std::system( "cls" );
    std::cout << "Angle : " << angle * 180.0f / M_PI << ", Confidence : " << confidence << std::endl;  //……3
  }
  // Input Key ( Exit ESC key )
  if( GetKeyState( VK_ESCAPE ) < 0 ){
    break;
  }
}

列表1.5 取得音源方向和推测的信赖值

1 取得音源方向。

角度单位是radian(弧度)。

2 取得音源方向的推测信赖值。

取值范围是0.0f~1.0f,数值越大表示可信度更高。

3 把radian(弧度)转为dgree(度数)在Console上输出。

只显示当前的数值,如果注释掉「std::system("cls");」的话,那么之前的值也会留在Cconsole上。

可以取得的音源方向是Kinect v2的中心正面向水平方向左右+/-50°的范围。 

图4 音源方向的检测范围+/-50°

因为取得的音源方向的角度单位是「radian(弧度)」要利用公式1转换为「degree(度数)」。

【公式1 adian(弧度)转换为(度数)】

  • 弧度(radian)→角度(degree)∶ degree=radian×180÷π
  • 角度(degree)→弧度(radian)∶ radian=degree×π÷180

运行结果

运行这个示例程序,就像图5一样,将显示出声音的音源角度(Angle)和推测的信赖值(Confidence)。

如果Microphone Array的反应过度敏感或迟钝,可以通过调整操作系统的录音设备属性来改善(在[控制面板]-[声音]-[录制]的录音设备中的「麦克排列Xbox NUI Sensor」的属性里调整等级)。


图5 运行结果

在Console上显示了音源方向的角度和推测的信赖值。

总结

这一节是介绍如何使用Kinect SDK v2预览版取得AudioBeam。

与Kinect SDK v1相比,从Microphone Array取得Audio数据的处理更加简单。

时间: 2024-10-19 12:04:57

【翻译】Kinect v2程序设计(C++-) AudioBeam篇的相关文章

【翻译】Kinect v2程序设计(C++) BodyIndex篇

通过Kinect SDK v2预览版,取得BodyIndex(人体区域)的方法和示例代码. 上一节,介绍了从Kinect v2预览版用Kinect SDK v2预览版获取Depth数据的方法. 这一节,介绍从Kinect取得BodyIndex(人体区域)的方法. BodyIndex 基于从Kinect取得的Depth数据(传感器的距离信息)获取人体区域. 因为人体区域基于Depth数据,同时也依赖Depth传感器的分辨率.像上一节介绍的一样,因为Kinect v2 预览版(512×424)的De

Kinect v2程序设计(C++) Body 篇

Kinect SDK v2预览版的主要功能的使用介绍,基本上完成了.这次,是关于取得Body(人体姿势)方法的说明. 上一节,是使用Kinect SDK v2预览版从Kinect v2预览版取得BodyIndex(人体区域)的方法. 这一节,介绍从Kinect取得Body(人体姿势)的方法. Body 到目前为止,Kinect能取得Depth(通过传感器的距离信息)和BodyIndex(人体区域).并且,基于这些数据可以取得人体姿势. Kinect的人体姿势,是向学习了基于庞大数量的姿势信息的识

Kinect V2程序设计(C++) Color篇

Kinect SDK v2预览版,获取数据的基本流程的说明.以及取得Color图像的示例程序的介绍. 上一节,是关于当前型号Kinect for Windows(后面称作Kinect v1)和次世代型的Kinect for Windows的开发者预览版(后面称作Kinect v2 预览版)的配置比较和介绍. 从这一节开始,是Kinect的各种数据的取得方法的比较和介绍. Color Camera Kinect和通常的Web摄像头一样,搭载了 Color Camera,可以取得Color图像.关于

【翻译】Kinect v2程序设计(C++) Depth编

Kinect SDK v2预览版,取得Depth数据的方法说明. 上一节,介绍了通过使用Kinect for Windows SDK v2预览版(以下简称为,Kinect SDK v2预览版)从Kinect for Windows v2开发者预览版(后面称,Kinect v2 预览版)取得Color的方法. 这一节,介绍的是从Kinect取得Depth数据的方法. Depth传感器 Kinect搭载Depth传感器,可以取得Depth数据(和传感器的距离信息). Kinect v1,可以读取投射

Kinect v1和Kinect v2的彻底比较

本连载主要是比较Kinect for Windows的现行版(v1)和次世代型的开发者预览版(v2),以C++开发者为背景介绍进化的硬件和软件.本文主要是对传感的配置和运行条件进行彻底的比较. 本连载介绍的Kinect for Windows Developer Preview是暂定的,软件.硬件以及API有可能因为最终的产品版发生变更,还请谅解. 关于本连载 本连载主要是比较次世代型的Kinect for Windows(后面称作Kinect v2预览版)和现行型的Kinect for Win

标定Kinect v2彩色摄像头:使用iai_kinect2,采用qhd(960*540)大小的彩色图像

开篇一作,这篇博文是纯应用的,没有任何理论说明,就当是一个实践提醒啦. 安装kinect v2相机驱动和标定程序得益于下面二位前辈的引荐工作: http://www.cnblogs.com/gaoxiang12/p/5161223.html http://www.cnblogs.com/hitcm/p/5118196.html 十分感谢! 请读者先按照上面前辈的博文安装好libfreenect2和iai_kinect2. 在iai_kinect2标定步骤中(https://github.com/

Linux C 程序设计多线程基础篇

   Linux C 程序设计多线程基础篇 题记:因为 Linux 网络入侵检测系统的设计与实现希望使用多线程,因此希望系统的学习一下 Linux C程序设计多线程的知识 注意事项:因为 pthraed 库不是 Linux 系统默认的库,因此在进行多线程开发的时候,需要加上头文件#include <pthread.h>,编译时要加参数 -lpthread;了:gcc thread.c -o thread -lpthread. 进程和线程: 进程是程序执行,资源分配的基本单位,每个进程都拥有自己

ubuntu14.04下 Kinect V2+Ros接口安装

1. 首先git下载代码,放到主文件夹下面 git clone https://github.com/OpenKinect/libfreenect2.git 2. 然后安装依赖项如下,最好事先编译安装好OpenCV sudo apt-get install build-essential cmake pkg-config libturbojpeg libjpeg-turbo8-dev mesa-common-dev freeglut3-dev libxrandr-dev libxi-dev 3.

ubuntu连接kinect v2

经过这个过程才悟到,有的时候不是方法不对,也不是问题解决的不对,只是因为配置问题,如果配置不对,自然会出现各种各样问题,不如一开始就确定配置.不过,如果不是经历了这个过程,我也不知道是因为我的配置问题导致的问题,哎. 我用的是ubuntu14.04LTS,ROS 版本是indigo,kinect v2,我是用双系统装的ubuntu,用虚拟机装的ubuntu是不行的,会出现各种各样问题,因为虚拟机用的是它自带的驱动器,这显然是不行的. 下面正式进入安装 1.安装libfreenect2,这个lib