Kinect的麥克風陣列在Kinect裝置的下方。這一陣列由4個獨立的水平分布在Kinect下方的麥克風組成。雖然每一個麥克風都捕獲相同的音頻訊號,但是組成陣列可以探測到聲音的來源方向。使得能夠用來識別從某一個特定的方向傳來的聲音。麥克風陣列捕獲的音頻資料流經過複雜的音頻增強效果演算法處理來移除不相關的背景雜音。所有這些複雜操作在Kinect硬體和Kinect SDK之間進行處理,這使得能夠在一個大的空間範圍內,即使人離麥克風一定的距離也能夠進行語音命令的識別。
在Kinect第一次作為Xbox360的外設發布時,骨骼追蹤和語音辨識是Kinect SDK最受開發人員歡迎的特性,但是相比骨骼追蹤,語音辨識中麥克風陣列的強大功能有一點被忽視了。一部分原因歸於Kinect中的令人興奮的骨骼追蹤系統,另一部分原因在於Xbox遊戲操控面板以及Kinect體感遊戲沒有充分發揮Kinect音頻處理的優點。
作為一個開始使用Kinect進行應用開發的開發人員,Kinect上的麥克風陣列的出現使得基於Kinect應用程式的功能更加強大。雖然Kinect的視覺分析令人印象深刻,但是仍然不能很好的對馬達進行控制。當我們從一種人機互動介面切換到另一種人機互動介面:如從命令列互動應用程式到標籤頁互動介面,再到滑鼠圖形化使用者介面或者觸摸互動介面時,每一種互動介面都提供了各種最基本的更加容易實現的操作,這個操作就是選擇。進一步,可以說,每一種互動介面都改進了我們對對象進行選擇的能力。奇怪的是,Kinect破壞了這一趨勢。
在Kinect應用程式中,選擇操作是最複雜和難以掌握的行為之一。Xbox360中最初的選擇操作是通過將手放到特定的位置,然後保持一段時間。在《舞林大會》遊戲中,通過一個短暫的停頓加上滑動操作來對選擇操作進行了一點改進。這一改進也被應用在了Xbox的操作面板中。另外的對選擇進行改進的操作包括某種特定的手勢,如將胳膊舉起來。
這些問題,可以通過將語音辨識指令和骨骼追蹤系統結合起來產生一個複合的姿勢來相對簡單的解決:保持某一動作,然後通過語音執行。菜單的設計也可以通過首先展示功能表項目,然後讓使用者說出功能表項目的名稱來進行選擇-很多Xbox中的遊戲已經使用了這種方式。可以預見,無論是程式開發人員還是遊戲公司,這種複合的解決方案在未來會越來越多的應用到新的互動方式中,而不用再像以前那樣使用指然後點(point and click)這種方式來選擇。
1. 麥克風陣列
安裝完Microsoft Kinect SDK之後,語音辨識的組件會自動安裝。Kinect的麥克風陣列工作在一些語音辨識的類庫之上,這些類庫是從Vista系統之時就有的。他們包括語音捕獲DirectX多媒體對象(DirectX Media Object,DMO)以及語音辨識API(Speech Recognition API,SAPI)。
在C#中,Kinect SDK提供了對語音捕獲DMO的封裝。語音捕獲DMO最初是被設計用來給麥克風陣列提供API來支援一些功能如回聲消除(acoustic echo cancellation,AEC),自動增益控制(automatic gain control,AGC)和雜訊抑制(noise suppression)。這些功能在SDK的音頻控制類中可以找到。 Kinect SDK中音頻處理對語音捕獲DMO進行了簡單封裝,並專門針對Kinect感應器進行了效能最佳化。為了能夠使用Kinect SDK進行語音辨識,自動安裝的類庫包括:Speech Platform API, Speech Platform SDK和Kinect for Windows Runtime Language Pack。
語音辨識API能夠簡化作業系統內建的語音辨識所需的類庫。例如,如果你想通過普通的麥克風而不是Kinect麥克風陣列添加一些語音指令到傳統型應用程式中去,可以使用也可以不使用Kinect SDK。
Kinect for windows 運行語言套件是一系列的語言模型,用來在Kinect SDK和語音辨識API組件之間進行互操作。就像Kinect骨骼識別需要大量的計算模型來提供決策樹資訊來分析節點位置那樣,語音辨識API也需要複雜的模型來輔助解釋從Kinect麥克風陣列接收到的語言模型。Kinect語言套件提供了這些模型來最佳化語音指令的識別。
1.1 MSR Kinect Audio
Kinect中處理音頻主要是通過KinectAudioSource這個對象來完成的。KinectAudioSource類的主要作用是從麥克風陣列中提取原始的或者經過處理的音頻流。音頻流可能會經過一系列的演算法來處理以提高音頻品質,這些處理包括:降噪、自動增益控制和回聲消除。KinectAudioSource能夠進行一些配置使得Kinect麥克風陣列可以以不同的模式進行工作。也能夠用來探測從那個方向來的哪種音頻資訊最先達到麥克風以及用來強制麥克風陣列接受指定方向的音頻資訊。
本節盡量不會去介紹一些音頻處理技術方面的較低層次的技術。但是為了使用KinectAudioSource,瞭解語音捕獲以及語音傳輸中的一些術語可能會對熟悉KinectAudioSource中的一些屬性和方法有所協助。
回聲消除(acoustic echo cancellation, AEC) 當使用者的聲音從麥克風返回時,就會產生回聲。最簡單的例子就是使用者在打電話時能夠聽到自己的聲音,這些聲音有一些延遲,會在對方那裡重複一段時間。回聲消除通過提取發聲者的聲音模式,然後根據這一模式從麥克風接收到的音頻中挑選出特定的音頻來消除回聲。
回聲抑制(acoustic echo suppression, AES) 它是指通過一系列的演算法來進一步消除AEC處理後所遺留的回聲。
自動增益控制(acoustic gain control, AGS) 它涉及到一些演算法用來使使用者的聲音的振幅與時間保持一致。例如當使用者靠近或者或遠離麥克風時,聲音會出現變得響亮或更柔和,AGC通過演算法使得這一過程變得更加明顯。
波束成形(beamforming) 指的是類比槍型麥克風的演算法技術。和只有一個麥克風不同,波速成形技術用於麥克風陣列中 (如Kinect 感應器上的麥克風陣列)使得麥克風陣列產生和使用多個固定麥克風的效果相同。
中心削波(center clipping) 用來移除在單向傳輸中經AEC處理後殘留的小的回聲。
幀尺寸(Frame Size) AEC演算法處理PCM音頻樣本是是一幀一幀處理的。幀尺寸是樣本中音訊框架的大小。
擷取增益邊界(Gain Bounding) 該技術確保麥克風有正確的增益層級。如果增益過高,擷取到的訊號可能過於飽和,會被剪下掉。這種剪下有非線性效果,會使得AEC演算法失敗。如果增益過低,信噪比會比較低,也會使得AEC演算法失敗或者執行的不好。
雜訊填充(Noise Filling) 向中心削波移除了殘留的回波訊號後的部分訊號中添加少量的噪音。和留下空白的沉默訊號相比,這能夠獲得更好的使用者體驗。
雜訊抑制 (NS) 用於從麥克風接收到的音頻訊號中剔除非言語聲音。通過移除背景噪音,實際講話者的聲音能夠被麥克風更清楚更明確的捕獲到。
Optibeam Kinect感應器從四個麥克風中能夠獲得11個波束。 這11個波束是邏輯結構,而四個通道是物理結構。Optibeam 是一種系統模式用來進行波束成形。
信噪比(Signal-to-Noise Ratio,SNR) 訊號雜訊比用來度量語音訊號和總體背景雜訊的比例,信噪比越高越好。
單通道(Single Channel) Kinect感應器有四個麥克風,因此支援4個通道,單通道是一種系統模式用來關閉波束成形。