標籤:c# kinect visual studio 語音辨識
聲明:本文中特徵多針對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:21By Mr.Losers
Kinect開發筆記之八C#實現Kinect聲音的追蹤