Kinect開發筆記之八C#實現Kinect聲音的追蹤

? ? ? ?聲明:本文中特征多針對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




本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277617.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277617.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277617.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Nginx常見配置:負載均衡、限流、緩存、黑名單和灰度發布

一、Nginx安裝(基于CentOS 6.5) 1.yum命令安裝 yum install nginx –y(若不能安裝,執行命令yum install epel-release) 2. 啟動、停止和重啟 service nginx startservice nginx stopservice nginx restart瀏覽器中 輸入服務器的 ip 地址&…

國服服務器_《Minecraft我的世界》第三方服務器的基本儲備

今天我想單獨來聊一聊Minecraft我的世界第三方服務器的發展。世外荒原玩家作品我來到頭條的第一篇文章就發表了一篇我對Minecraft現狀的看法,現在國服的狀態對老玩家不是很友好。(這不說明國服的運營戰略路線是有問題的)因此誕生了一大堆第三方服務器。世外荒原玩家…

Unity中Time.deltaTime的含義及其應用

相信Unity的開發者或者初學者都對Time.deltaTime并不陌生,我們經常會在代碼中用到或者看到它,今天去官方的API文檔查了一下,感覺它非常有用,所以翻譯一下以引導初學者。 原文網址: file:///Applications/Unity/Unity…

unity3d曲線text文本

測試.pngusing System; using System.Collections.Generic;namespace UnityEngine.UI.Extensions {/// <summary>/// Curved text.讓文本按照曲線進行顯示 【注意對Image的變形 也是可以的】/// 說明&#xff1a; 對Text的操作就和 shadow 和 outline 組件類似。/// <…

HTML 和CSS

1 HTML 介紹1.1 web 服務本質import socket sk socket.socket() sk.bind(("127.0.0.1", 8080))sk.listen(5) while True: conn, addr sk.accept() data conn.recv(8096) conn.send(b"HTTP/1.1 200 OK\r\n\r\n") conn.send(b"<h1>Hello world…

Unity中Quaternion的含義及其使用

官網API文檔&#xff1a; file:///Applications/Unity/Unity.app/Contents/Documentation/html/en/ScriptReference/Quaternion.html Quaternion的意思是四元數&#xff0c;用于代表旋轉。 它們是緊致的&#xff0c;不會產生萬向節死鎖并且能夠很容易被插值。Unity內使用Quat…

Python PIPEs

2019獨角獸企業重金招聘Python工程師標準>>> https://www.python-course.eu/pipes.php https://www.tutorialspoint.com/python/os_pipe.htm 轉載于:https://my.oschina.net/zungyiu/blog/1860857

延時消息_Handler的消息延時是怎么實現的

消息延時做了什么特殊處理&#xff1f;是發送延時&#xff0c;還是消息處理延時&#xff1f;延時的精度如何&#xff1f;通常我們使用Handler的消息延時都是調用sendMessageDelayed函數實現的&#xff0c;其中delayMillis是需要延時的毫秒。通過跟蹤sendMessageDelayed函數可以…

5月JC學習總結

斷劍重鑄之日&#xff0c;王者歸來之時。為了更美好的明天而戰。 五月 悄悄地過了 人兒 不覺中散了 攜著一腔熱血&#xff1b;來到蛟川 來到機房 微涼的輕風&#xff0c;無聲地去了 熾熱的驕陽&#xff0c;即將要落了 站在4樓&#xff0c;向窗外眺望&#xff0c;映出的不是夕陽…

4 關卡流 進階_全息武器全解析,記住4個點全區第一就是你!

實不相瞞&#xff0c;每次看著全息武器糖糖都感覺自己像鋼鐵俠高端大氣上檔次&#xff0c;低調奢華有內涵那么問題來了&#xff01;這個全息武器究竟該怎么玩才能成為真正的鋼鐵俠&#xff1f;我的使命之全息武器【作者&#xff1a;D38激戰阿曼——潛龍小生】全息武器在屬性增加…

terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr

運行時報錯&#xff1a; terminate called after throwing an instance of std::out_of_rangewhat(): basic_string::substr&#xff1a;__pos Aborted (core dumped) 內存讀取越界。 解釋1&#xff1a;for example:const std::string sTest( "test" );sTest.substr…

記一次理想浪漫的畢旅

因為臨近畢業離別的氛圍和閑散的生活&#xff0c;雖然手頭積攢了不少可寫的素材和教程&#xff0c;但還是兩個月沒有在CSDN更新博客。論文答辯之后&#xff0c;我只是每天在宿舍玩玩電腦、打打撲克&#xff0c;唯一讓我難受的是&#xff0c;隔幾天便送走一位同窗好友。有時甚至…

【滲透過程】嘉緣網站 --測試

聲明&#xff1a;本片文章測試網站為測試靶場 信息收集階段&#xff1a; 首先使用了一些常見的掃描工具&#xff1a;nmap 御劍 使用nmap掃描端口 發現網站開放了 135 139 445 3306 等端口 這里可以看到網站開放了一些危害較高端口&#xff1a;135 225等 使用御劍掃描到一些敏感…

C編程經驗總結

Turbo c Return (z);return z; 圖形界面的有scanf(“%d ~%d\n”,&~,&~);注意&#xff1a;中間不能有亂的東西 Printf(“~~~ %d~~%d\n”,~,~);這兒可以有亂的東西&#xff0c;一切的提示圖形界面多是由它完成 函數&#xff0c;變量一定是有類型 除了函數&#xff08;&am…

文檔過期打不開怎么辦_標準的產品需求文檔在這里!(詳細說明版)(2)

接著上篇繼續寫&#xff0c;上篇請點擊標準的產品需求文檔在這里&#xff01;(詳細說明版)(1)入口已經寫完&#xff0c;讀此文檔的無論是研發人員還是測試都已經知曉此需求需要做的從哪里進入&#xff0c;接下來就是主菜了&#xff0c;進入以后該干嘛。進入以后當然就是新的頁面…

day32

udp(用戶數據包協議) 高并發(同時有大量客戶端訪問服務器,服務器處理不過來)?OSI模型中,屬于傳輸層得協議,僅用于不要求可靠性,以及不要求分組順序且數據量較小的簡單傳輸,力求快?通訊流程類似對講機 只管發送不管對方是否接收到,甚至不關心對方存在?UDP可以處理多個客戶端,…

Macbook全系列詳細分析及購機指南

時至今日&#xff0c;極佳的用戶體驗、強大的功能、獨特的設計感、廣闊的市場和無可比擬的品牌魅力已經讓蘋果公司各種電子產品的迅速普及&#xff0c;其中Macbook逐漸被越來越多的人所青睞&#xff0c;尤其是從事一些特定行業的工作者&#xff08;比如IT、電信、互聯網以及藝術…

惠普m1005連接電腦步驟_電腦連接電視機詳細步驟方法圖文

電腦連接電視機有什么好處呢&#xff1f;小編想到了幾點&#xff0c;那就是屏幕大&#xff0c;而且可以在電視機上使用網絡看到自己想看的劇。還有就是可以更多的人一起做著來看。所以總的來說電腦連接電視機還是好處比較多的。下面我就來告訴你們電腦怎么連接電視機。有的時候…

對程序實施精準手術!阿里安全獵戶座實驗室首創“自動逆向機器人”

近日舉辦的看雪安全開發者峰會上&#xff0c;阿里安全獵戶座實驗室首度向外界展示了最新的研究成果——“自動逆向機器人”。該機器人可以像醫生一樣“望聞問切”&#xff0c;對程序進行顯微鏡級別的勘察&#xff0c;并完整“回放”其運作過程&#xff0c;因此&#xff0c;可以…

(24) 不可能的出棧順序

一、問題描述 給定兩個數組&#xff0c;一個進棧順序&#xff0c;一個出棧順序。判定出棧數組的出棧順序是不是有可能的。 二、Code 1 package algorithm;2 3 import java.util.ArrayDeque;4 import java.util.Deque;5 6 /**7 * Created by adrian.wu on 2019/5/30.8 */9 pub…