声明:本文中特征多针对Kinect for windows 1.0,新版的Kinect Sensor可能有部分数值或方法有一定变化,请知晓。
       Kinect的声音来自下方的4个麦克风组成的麦克风阵列。传感器内含数字信号处理器,可以用来强化接受声音的清晰度同时处理噪声,根据4个麦克风接收音量的强弱,Kinect可以分析出声音的来源,但这种分析受限于水平方向,垂直方向上的具体位置,Kinect则无法分辨。另外,Kinect对前后方的声音判断也是不敏感的,即接收到声音后它默认判断是从前方声源发出,且会自动将麦克风阵列对准环境中声音最大的来源位置。
       Kinect的声音接收覆盖角度为100度,即大致以右边两个摄像头的中点(也相当于Kinect的中心点)为中心,左右各延伸50度。
       
       开发者可以通过API,让麦克风阵列锁定特定来源区域的声音,比如通过用户的骨骼位置锁定声音检测区域。但是要注意Kinect每次仅能锁定区间范围为10度的区域作为接收范围,这样可以增强该用户的声音识别精确度。
        Kinect的声音采样频率为16kHz,采样位数为16位(2Byte,即声音分级为2的16次方)。一般音乐CD为44kHz,但那是高频的音乐质量,16kHz进行语音识别或者语音通信已经很足够了。
       我们可以打开之前我们打开过的Kinect Explorer-WPF,在下方就是声音的检测,我们可以发出声音,Kinect会输出我们声源的相关信息。如下图所示,这是我在Kinect的一侧咳嗽了一声后,Kinect Explorer反馈给我的结果。
       Beam Angle是麦克风阵列对准声音来源的角度即当前麦克风阵列朝向并重点采集声音的角度;Source Angle是经过Kinect内部算法处理后,计算出的声源角度;而最后一个confidence属性,是用来判断声音强弱或者声音远近的标识。如果要确定声源方向的话,Source Angle更加准确一些。
下面我们使用Visual Studio来写一个侦测声音来源方向的程序。
先贴出代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Kinect;namespace KinectListener
{class Program{static KinectAudioSource AudioSourceSetup(KinectAudioSource source) {//对我们的KinectAudioSource对象进行初始化source.NoiseSuppression = true;//开启抑制噪声功能source.AutomaticGainControlEnabled = true;//自动增益控制功能source.BeamAngleMode = BeamAngleMode.Adaptive;//设置BeamAngleMode为adaptive属性,适合环境噪声大的环境return source;}static void SoundTracking(KinectAudioSource source) {source = AudioSourceSetup(source);//对传入的KinectAudioSource对象初始化source.BeamAngleChanged += audioSource_BeamAngleChanged;source.SoundSourceAngleChanged += audioSource_SoundSourceAngleChanged;//初始化后,注册时间处理函数source.Start();//启动KinectAudioSource对象}static void audioSource_BeamAngleChanged(object sender, BeamAngleChangedEventArgs e) {//事件处理函数 取得麦克风阵列最新对准的方向string output = "侦测到Beam Angle :"+ e.Angle.ToString();Console.WriteLine(output);}static void audioSource_SoundSourceAngleChanged(object sender, SoundSourceAngleChangedEventArgs e) {//事件处理函数 取得当前声音来源方向string output = "侦测到Source Angle:" + e.Angle.ToString() + ", Source Confidence :" + e.ConfidenceLevel.ToString();Console.WriteLine(output);}static void Main(string[] args){KinectSensor sensor = KinectSensor.KinectSensors[0];//获得传感器sensor.Start();//启动传感器KinectAudioSource source = sensor.AudioSource;//要使用Kinect的声音功能,必须从KinectSensor对象中取出AudioSensor对象SoundTracking(source);//追踪声音Console.WriteLine("退出请按空格键");string maxmin1 = ",最大Beam Angle :" + KinectAudioSource.MaxBeamAngle + ",最小Beam Angle :" + KinectAudioSource.MinBeamAngle;string maxmin2 = ",最大Source Angle :" + KinectAudioSource.MaxSoundSourceAngle + ",最小Source Angle :" + KinectAudioSource.MinSoundSourceAngle;Console.WriteLine(maxmin1);Console.WriteLine(maxmin2);while (Console.ReadKey().Key != ConsoleKey.Spacebar) { }sensor.Stop();}}
}
       首先还是和上次一样,在解决方案资源管理器中要先添加Kinect引用,然后添加Microsoft.Kinect的命名空间。
       要使用Kinect的声音API,首先必须从KinectSensor对象中取出 AudioSource对象;同时对于声音方向,微软提供了BeamAngle和SoundSourceAngle属性;对于音量的大小,则有SoundSourceAngleConfidence属性。
简单讲解一下这个程序:
       一开始是AudioSourceSetup方法,它有一个形式参数,需要我们传入一个KinectAudioSource对象,然后方法进行初始化后将这个对象返回。
       后面是SoundTracking方法,也就是声音追踪,它同样有一个KinectAudioSource类型的形参,对这个传入的KinectAudioSource对象首先执行AudioSourceSetup(),然后方法中注册了两个事件处理函数,这两句话是告诉系统,一旦侦测到SoundSourceAngle和BeamAngle的数值改变,那就调用这里注册的事件处理函数。

source.BeamAngleChanged += audioSource_BeamAngleChanged;
source.SoundSourceAngleChanged += audioSource_SoundSourceAngleChanged;

       接下来,就是我们的事件函数。第一个用于取得麦克风阵列最新对准的方向;第二个用于获取当前声音来源方向,它们会输出当前准确的数值。
        Main方法就很简单了,最后设计了一个空格退出的while循环。
       我们可以运行这个程序来发出声音,看看返回给我们的数值。当你在同一个地方发出声响的时候,他是只会提示SoundSourceAngle的变化的,如果你换一个位置,它才会再次显示BeamAngle的数值。而且当你一段时间内不发出任何声音的时候,SoundSource会逐渐变化归零。
备注:代码修改自《Kinect体感程序设计入门》
2015.4.6   17:21
By Mr.Losers

Kinect开发笔记之八C#实现Kinect声音的追踪相关推荐

  1. Kinect开发笔记之六Kinect Studio的应用

    这一次我们来操作一下Kinect Studio,体验一下它给我们带来的功能. 首先我们需要打开Developer Toolkit Browser 1.8,打开后在默认情况下,光标是选择在All选项卡上 ...

  2. Kinect开发笔记之三Kinect开发环境配置详解

            0.前言:        首先说一下我的开发环境,Visual Studio是2013的,系统是win8的64位版本,SDK是Kinect for windows SDK 1.8版本. ...

  3. Kinect开发笔记之七Visual Studio结合C#调控Kinect俯仰角度

    总感觉自己前面啰啰嗦嗦写了好多,却一直都没有使用用开发kinect的重型武器--Visual Studio. 那么本次我们就借助于Visual Studio,写一个C#程序,连接Kinect并调用Ki ...

  4. Kinect开发笔记之五使用PowerShell控制Kinect

    这是第一次用MarkDown编辑器来写博客,挺喜欢这种没有任何格式舒服的编辑器,自由洒脱更加易读,留一个不自然的自然段纪念下找到舒服的编辑器. 这次要记录使用win7/win8内建的PowerShel ...

  5. Kinect开发笔记之二Kinect for Windows 2.0新特性

    这是本博客的第一篇翻译文档,笔者已经苦逼的竭尽全力的在翻译了,但无奈英语水平也是很有限,不对或者不妥当不准确的地方必然会有,还恳请大家留言或者邮件我以批评指正,我会虚心接受.谢谢大家.         ...

  6. 【Visual C++】游戏开发笔记之八——基础动画显示(二)游戏循环的使用

    在笔记七中我们讲解了用定时器来产生动画的效果.定时器的使用固然简单方便,但是事实上这样的方法仅适合用在显示简易动画及小型的游戏程序中.因为一般而言,游戏本身需要显示顺畅的游戏画面,使玩家感觉不到延迟的 ...

  7. Kinect开发笔记之一Kinect详细介绍

      毕业设计的课题我选择了结合Kinect和Unity3D开发体感游戏,这是我十分感兴趣的一个课题,所以做好当然责无旁贷.准备再写一系列Kinect的学习笔记,记录自己毕设一步一个脚印的历程.     ...

  8. Kinect开发笔记之四检测并调试Kinect设备

           之前我们已经装好了Developer Toolkit 1.8,下面我们来做进一步的测试.        首先到开始菜单中找到Kinect for Windows SDK v1.8,点击其 ...

  9. Kinect开发教程四:用Kinect控制鼠标玩水果忍者PC版

    最近Kinect连接Xbox玩水果忍者的视频非常红火,可惜小斤只有本本和Kinect,没法玩Xbox上的体感游戏.幸运的是,寻寻觅觅后,小斤发现水果忍者有PC版本,既然上一个教程我们已经可以让Kine ...

最新文章

  1. 马斯克刚刚宣布辞去特斯拉董事会职务,仍然担任CEO
  2. Spring Boot配置文件有提示
  3. java获取整点与凌晨的时间戳
  4. 浏览器滚动条样式更改
  5. OSI网络模型(TCP/IP五层模型)
  6. public/protected/private简介
  7. android源码编译出错的原因
  8. 数据存储与访问之——初见SQLite数据库
  9. could not get batchedbridge, make sure your bundle is packaged correctly
  10. AutoSar之CAN网络管理详解
  11. YB1205B 外置MOS异步升压恒流LED驱动控制器
  12. 一文带你明白什么是浏览器插件?
  13. 叶君—国画大师笔下的“忠义千秋”
  14. 数据结构实验-稀疏一元多项式计算
  15. 瞧,他的代码,他的内裤
  16. Linux之编写shell脚本
  17. 通过blacklist来禁用驱动
  18. centos7.5系统动态扩容磁盘及系统挂载未分配硬盘空间
  19. Error Correction
  20. Python小工具——格雷码转换器

热门文章

  1. 程序员简历的 8 个建议
  2. 盘点Win10系统的实用“小设计”
  3. php的正则表达式函数,php中常用的正则表达式函数
  4. 重口味动漫_每种口味的图标样式
  5. ai创造了哪些职业_关于创造职业的思考
  6. Codeforces 741 D - Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
  7. 论文的写作要求、流程与写作技巧
  8. OS X 10.11 安装Cocoapods
  9. 使用eclipse运行mapreduce程序
  10. Android 控件之RatingBar评分条