基于Kinect的語音識別技術研究
朱榮李小映
(廣州工商學院計算機科學與工程系廣州510850)
針對Kinect語音識別技術中的語音命令交互控制功能沒有得到有效開發的問題,通過對Kinect麥克風陣列的基本原理進行闡述,對音頻捕獲、音頻處理和語音識別過程中主要使用到的應用接口、類、對象、屬性、方法和事件等進行深入剖析,以Kinect for Windows Developer Toolkit工具中的SpeechBasics-WPF案例中為研究對象,對該應用程序的每一個模塊進行單元測試,同時配合靜態分析技術,驗證了代碼的安全性和可靠性,并在此基礎上提出了基于Kinect的語音命令實現交互控制的開發流程和編程算法,為Kinect語音命令識別的應用與開發提供策略與方法。
語音識別;波束成形;回聲消除;自動增益控制;噪聲抑制
Class NumberTN912
1.1 硬件組成
由于聲音都是從上往下傳導的,所以在硬件方面Kinect四元麥克風陣列位于Kinect設備的下方。四元麥克風陣列是不對稱分布的,左邊三個右邊一個,四個相互獨立的小型麥克風,其排列呈線形。四個麥克風可以同時接收多聲道立體聲,每一個麥克風都捕獲相同的音頻信號,但因使用了數字信號處理(DSP)組件并采用波束成形(Beamforming)技術后,麥克風陣列可以根據接收聲音的時間差來定位聲源方向,再加上配置了立體聲模數轉換放大器,麥克風陣列又可對捕獲的音頻信號進行噪聲抑制(Noise Suppression)。如果要準確辨別出相應的語音命令,麥克風陣列最好在室內環境中偵聽,因為它需要根據室內的聲音反射來創建音頻分布圖并進行回聲消除(Acoustic Echo Cancellation,AEC)。
1.2 軟件接口
要應用Kinect的各項功能,必須安裝Kinect for windows SDK開發工具包,SDK包封裝了語音識別的組件,分別是DirectX媒體對象(DirectX MediaObject,DMO)和語音應用編程接口(Speech API,SAPI)。DMO是在DirectX的8.1版時從DirectShow(提供音視頻流的高質量捕捉和重放)分出的,是微軟公司提供的流數據處理COM組件,它支持音視頻的編解碼器和特效,其功能類似于過濾器,為四元麥克風陣列提供了一系列的編程接口,通過對該COM組件的引用,可以實現源代碼本地化,并支持回聲消除、噪聲抑制和自動增益控制(Automatic Gain Control,AGC)等功能。SAPI組件中包含了語音識別(speech recognition)和語音合成(speech synthesis)技術,該組件中的語音識別接口(Voice Dictation API)和語音命令接口(Voice Commands API)是應用程序中需要引用的部分。語音識別技術可以識別不同的語言,這些語音被封裝在運行語言包(Kinect for Windows Runtime Language Pack)中,它是負責解釋從四元麥克風陣列接收到的語言模型,并通過語言模型來優化語音命令識別。
Kinect的麥克風陣列主要的技術是語音識別技術,語音識別功能通常用于Xbox控制中心的導航、菜單控制,以及多媒體的播放,通過Kinect的語音識別,用戶可以完成語音的交互及控制。下面重點介紹語音識別過程中的兩類技術:音頻處理技術和命令識別技術。
2.1 音頻處理技術
Kinect的麥克風陣列可以自動捕獲和處理語音,主要是通過KinectAudioSource對象來實現的,雖然KinectAudioSource對象的最主要作用是為語音識別引擎提供音頻數據流,但是它也可以用來錄制音頻文件。下面將重點講解KinectAudioSource對象以及使用KinectAudioSource對象來捕獲音頻和處理音頻數據流。
KinectAudioSource對象可以通過一些配置使Kinect的麥克風陣列以不同的模式進行工作,也能夠用來探測從某個方向來的哪種音頻信息最先達到麥克風以及用來強制麥克風陣列接受指定方向的音頻信息。KinectAudioSource對象的主要作用是從麥克風陣列中提取原始的或者經過處理的音頻流,這些音頻流經過一系列的算法來處理可以提高音頻質量,這些處理包括:回聲消除、自動增益控制和波束成形。回聲消除是通過提取發聲者的聲音模式,然后根據這一模式從麥克風接收到的音頻中挑選出特定的音頻來消除回聲。自動增益控制是通過一些算法使用戶的聲音的振幅與時間保持一致。例如當用戶靠近或者或遠離麥克風時,聲音會出現變得響亮或更柔和。波束成形是模擬定向麥克風的算法技術,該技術使得麥克風陣列產生的效果和使用多個固定麥克風的效果相同。
在獲取和處理音頻中,通過C#語句進行實例開發,就先要將KinectAudioSource對象實例化,還要正確使用該對象的屬性、方法和事件。例如KinectAudioSource對象中的BeamAngleMode屬性可以決定通過何種方式來控制波束成形,EchoCancellationMode屬性可以控制回聲消除的開啟和關閉,KinectAudioSource對象包含Start()和Stop()兩個方法,Start()方法表示開始捕獲語音數據,Stop()方法則表示停止捕獲語音數據。舉例來說明KinectAudioSource對象的方法和屬性,例如EchoCancellationMode.none表示關閉回聲抑制;AutomaticGain-ControlEnabled.False表示關閉自動增益控制;source.Start()表示初始化并開開始捕獲音頻流;KinectSensor.KinectSensors[0].source.Stop()表示關閉Kinect音頻流和傳感器。
2.2 命令識別技術
Kinect的語音識別用于體感互動游戲時,不得不提到語音命令識別,玩家可以通過語言命令實現對游戲的控制。當然,Kinect首先會捕獲玩家的聲音,使用上一節中介紹到的KinectAudioSource對象中的部分屬性對捕獲到的音頻數據流進行回聲消除等處理后,再傳遞給SpeechRecognitionEngine對象,它是語音識別的核心,用于分析和解釋處理好的音頻數據流,匹配出最適合的語音命令,再判斷是否包含特定的待識別命令,如果包含就通過事件進行下一步處理,不包含就直接丟棄這部分音頻數據流。
在語音識別過程中,通過C#語句進行實例開發,就先要將SpeechRecognitionEngine對象實例化,還要正確使用該對象的屬性、方法和事件。例如SpeechRecognitionEngine對象中的RecognizerInfo屬性用于獲取有關SpeechRecognitionEngine的當前實例的信息,Grammars屬性用于獲取SpeechRecognitionEngine中的實例加載Grammar對象的集合。SetInputToAudioStream()方法用于配置SpeechRecognitionEngine對象以接收來自音頻流的輸入。RecognizeAsync(RecognizeMode)方法用于執行一個或多個異步語音識別操作。主要的SpeechRecognitionEngine對象的屬性和方法將通過下面的SpeechBasics-WPF示例來直觀闡述,并以此總結語音命令識別的開發流程和算法。
3.1 SpeechBasics-WPF示例
Kinect for Windows Developer Toolkit工具中就提供了以C#為開發語言的語音命令識別案例SpeechBasics-WPF。安裝好Kinect for Windows SDK包和Kinect for Windows Developer Toolkit工具,連接Kinect設備后,通過運行SpeechBasics-WPF即可通過語音命令“Forward”、“Back”、“Turn Left”、“Turn Right”來控制“烏龜”圖形的移動方向,如圖1所示,顯示了Kinect接收到“Turn Left”語音命令后,“烏龜”圖形向左旋轉90°。

圖1 SpeechBasics-WPF運行效果
使用Visual Studio軟件將該項目的Xaml打開,通過查看在Xaml.cs中的程序可知,語音命令識別中的引用部分除了添加Microsoft.Kinect命名空間還有Microsoft.Speech.AudioFormat(音頻信息輸入引擎)和Microsoft.Speech.Recognition(語音識別引擎)。
在該案例的語音命令識別部分,程序中WindowLoaded()函數中就已經對Kinect進行了初始化,并讀取了Xaml配置文件的語言庫,而對已經匹配成功的語音命令則通過定義名為SpeechRecognized()函數來實現window界面中元素屬性的變化,通過switch…case…語句提供“烏龜”圖形坐標位置的算法。下面以執行“Forward”命令為例,當用戶發出了與“Forward”匹配的語音命令時,應用程序需要實現的功能為界面窗口中“Forward”提示文字顏色變成天空藍,文字字體加粗,“烏龜”圖形的X、Y坐標位置,并保證坐標位置不超過窗口的寬度和高度。
3.2 測試
程序中的每一個模塊的功能都需要通過測試來驗證它的正確性,在C#面向對象的程序設計中單元測試是最基本的測試方法,通過單元測試是可以判斷某個特定條件(或者場景)下某個特定函數的行為。從SpeechBasics-WPF案例中了解到程序中主要使用到的函數包括WindowLoaded()、GetKinectRecognizer()、SpeechRecognized()、SpeechRecognitionRejected()、ClearRecognizer(),函數調用關系如圖2所示。把這些函數稱為一個模塊或單元,在Visual Studio2010中選中該應用程序中的每一個模塊,右鍵單擊后通過單元測試,測試結果顯示“測試通過”,接著配合靜態分析技術對程序代碼進行掃描,通過驗證,該程序代碼滿足規范性、安全性、可靠性和可維護性。

圖2 函數調用關系圖
3.3 開發流程與算法語句
在3.2節中的代碼驗證通過的基礎上可以將語音命令識別應用程序的開發流程及其主要算法進行詳細闡述,總共分為七個步驟,每個步驟列出了主要的算法語句及其對應的注釋,如下所示。
3.3.1 添加引用
添加對Kinect以及Microsoft.Speech API的引用,需要使用到的Microsoft語音識別API(Microsoft Speech Recognition API,SAPI)編程接口包括四個class類,分別是KinectSensor、KinectAudioSource、SpeechRecognitionEngine、Grammar,其中前兩個屬于Microsoft.Kinect類庫,后兩個屬于Microsoft. Speech類庫。一般情況下,后兩個類歸于System. Speech類庫,System.Speech與Microsoft.Speech兩個引擎基本都是相同的,不同之處的在于Microsoft. Speech是SAPI的服務器版本,System.Speech是SAPI的桌面版本,而針對Kinect并不適用于識別自由語音或者說比較適合識別語音命令的特點,通常情況下不會在引用部分添加System.Speech,或者同時添加兩個版本的引擎。所以在引用部分通常需要添加using Microsoft.Kinect和using Microsoft. Speech。
3.3.2 初始化Kinect
Kinect可能在執行其他的應用程序,一般都需要初始化,初始化的方法基本相同,主要通過使用條件判斷語句。如果當前的Kinect設備空置,則使用start()方法激活Kinect,如果不是空置,則將null賦值于Kinect,讓其空置。
3.3.3 編寫語法文件
由于Microsoft.Speech庫中沒有提供語音命令模式,不支持命令語法,使用SDK中的語音識別,就需要知道所有的語音命令并將其包含在一個固定的語法中,這個語法可以直接寫入到代碼中,也可以將語法寫入XML文件,該XML文件是W3C中的語音識別語法說明書1.0作為標準,并只支持英語語種,下面以“FORWARD”語音命令為例,首先需要考慮用戶對于“向上”的命令可能發聲的單詞,例如發聲的單詞是forward、front、straight等,在編寫語法文件的時候就必須把這三個子項包含于“FORWARD”語音命令中。一旦語音識別引擎接收到這三個子項的同時,也知道它們是“FORWARD”中的語義分類。主要語句如下所示:

3.3.4 獲取語音識別引擎接口信息
創建語法XML文件后需要加載到語音識別引擎中,加載語法的第一步就是要將RecognizerInfo信息指向語音識別引擎。RecognizerInfo是語音識別引擎中的一個類,用于獲取語音識別引擎接口的信息,它的AdditionalInfo屬性可以獲取語音識別引擎實例的相關附加信息,Id屬性可以獲取語音識別引擎實例的標識符。在編程語句中通過聲明Get-KinectRecognizer()函數來返回recognizer的值,speechEngine是SpeechRecognitionEngine實例化名,recognizer的值就是speechEngine的附加信息。主要語句如下所示:

3.3.5 將語法加載到語音識別引擎
實例化后,需要建立了一個MemoryStream記憶流指向XML語法文件,下面語句中memoryS-tream是記憶流的實例化名稱,需要通過Grammar構造函數去使該記憶流實例化,實例化名稱為m,接著使用LoadGrammar方法將實例化后的語法m加載到語音識別引擎中。主要語句如下:

3.3.6 捕獲音頻數據流
上述步驟準備好就可以偵聽用戶的語音,獲取音頻數據流,并設置音頻數據流的格式信息。SpeechAudioFormatInfo類是語音識別引擎中用于表示音頻格式的信息,初始化SpeechAudioFormat-Info的新實例并指定編碼格式、每秒的示例、每個示例的位數、通道的數目、每秒平均字節、塊對齊值。

//采用脈沖編碼調制(Pulse Code Modulation,Pcm)為音頻編碼格式,每秒接收16000個采樣,每個樣本占16位,只有1個通道,每秒中產生32000字節數據,塊對齊值為2
3.3.7 匹配語音命令
語音識別引擎可以開始偵聽并捕獲用戶發出“口語命令”,如果識別出的“口語命令”與XML語法文件中預先定義好的語音命令匹配成功,則需要編寫應用程序來實現窗口中元素的變化,例如實現“烏龜”圖形的移動。這里就要提到SpeechRecognized和SpeechRecognitionRejected事件,當語音識別引擎與其加載啟用的Grammar語音命令對象匹配的時候觸發SpeechRecognized事件。在下面的語句中定義了SpeechRecognized事件,它負責處理傳進去的語音命令,并對識別出的命令執行相應的操作,其中SpeechRecognizedEventArgs是語音識別引擎中的公共類,繼承于RecognitionEventArgs,這里實例化為e,通過它可以為SpeechRecognized事件提供獲取到的與語音識別事件關聯的識別數據,而ConfidenceThreshold則是語音識別引擎對“口語命令”與XML語法文件中的語音命令匹配的可能性或相對度量,稱為置信度,該值的范圍從0.0到1.0,值越高說明匹配越成功,當然也需要一個閾值來限制置信度,比如下面的置信度閾值為0.3,如果低于0.3就不執行switch…case…語句(語句中主要描述每一個匹配的語音命令在窗口界面中能實現的效果或執行的操作),也完成不了語音命令對應的交互結果。

匹配成功則觸發SpeechRecognized事件,當匹配不成功時,則觸發SpeechRecognitionRejected事件,SpeechRecognitionRejected事件中編寫的語句主要實現的功能與SpeechRecognized事件的功能相反。
語音識別技術就是將人發出的語音詞匯轉換成計算機可讀的輸入,語音識別通常都會使用模式匹配方法,Kinect的語音識別技術同樣也是使用該方法,所以在對其語音識別技術的研究過程中不會去考慮語種限制(只支持英語、法語、日語等),用戶發音的標準性對語音命令的交互功能的限制,還有Kinect也不適用于去識別自由語言,擅長于識別語音命令等問題。
目前,由于Kinect語音識別技術在實際的商業應用中用處也相對小,在人機交互方面其雙向交互特性導致開發成本高等因素,使得Kinect開發者基本都著重于骨骼追蹤技術和手勢識別技術。其實,這兩種技術和語音識別技術在每一個交互應用中都應該是相輔相成的不可或缺的整體。Kinect的語音識別技術在實際的應用開發過程中還處在基礎命令識別階段,與骨骼追蹤和手勢識別結合運用不夠廣泛和深入,這也是筆者需要繼續研究的地方。當然,如果能從聲音特征識別、語種識別、語氣語調情感探測等方面進行完善,相信Kinect的語音識別技術會得到更多開發者的重視和應用。
[1]余濤.Kinect應用開發實戰[M].北京:機械工業出版社,2013:232-239.
YU Tao.Kinect application development[M].Beijing:Mechanical Industry Press,2013:232-239.
[2]王森.Kinect體感程序設計入門(使用C#和C++)[M].北京:科學出版社,2015:205-236.
WANG Seng.Introduction to Kinect programming(Using C#and C++)[M].Beijing:Mechanical Science Press,2015:205-236.
[3]張詩潮,錢冬明.體感技術現狀與發展研究[J].華東師范大學學報(自然科學版),2014(2):40-49.
ZHANG Shichao,QIAN Dongming.Research on the current situation and development of somatosensory Technology[J].Journal of East China Normal University(Natural Science Edition),2014(2):40-49.
[4]劉曉暉,萬麗莉,季紅.基于中文語音交互的虛擬裝配技術研究[J].系統仿真學報,2014(9):2056-2061.
LIU Xiaohui,WAN Lili,JI Hong.Research on virtual assembly technology based on Chinese speech interaction[J].Journal of system simulation,2014(9):2056-2061.
[5]韓雪,李澤滔,孫昊.基于Kinect傳感器的移動機器人聲源目標跟蹤系統[J].自動化與儀器儀表,2015(6):185-186.
HAN Xue,LI Zetao,SUN Hao.Acoustic source target tracking system of mobile robot based on Kinect sensor[J]. Automation and instrumentation,2015(6):185-186.
[6]Davison,Andrew.Kinect Open Source Programming Secrets:Hacking the Kinect with OpenNI,NITE and Java[M].Europe:McGraw-Hill Education,2012.
[7]Erica Naone.Microsoft Kinect:How the Device Can Respond to Your Voice and Gestures[J].Pioneering with Scienceand Technology,2011,4(4):82-83.
[8]Martha Yifiru Tachbelie,Solomon Teferra Abate,Wolfgang Menzel.Using morphemes in language modeling and automatic speech recognition of Amharic[J].Natural Language Engineering,2012,20(2):235-259.
[9]Mohammad Reza Mirzaei,Seyed Ghorshi,Mohammad Mortazavi.Audio-visual speech recognition techniques in augmented reality environments[J].The Visual Computer,2014,30(3):245-257.
[10]Yangecnu.Kinect for Windows SDK development introduction(Twelve):SpeechRecognition[EB/OL].(2012-05-03)[2015-07-15]http://www.cnblogs.com/ yangecnu/archive/2012/05/03/KinectSDK_SpeechRecognition_part1.html.
[11]Yangecnu.Kinect for Windows SDK development introduction(Thirteen):SpeechRecognition[EB/OL].(2012-05-04)[2015-07-15]http://www.cnblogs.com/ yangecnu/archive/2012/05/04/KinectSDK_SpeechRecognition_part2.html.
[12]Leland Holmquest.Listening with Kinect[EB/OL].(2012-12-04)[2015-07-15]https://msdn.microsoft. com/en-us/magazine/jj884371.aspx.
Speech Recognition Technology of Kinect Sensor
ZHU RongLI Xiaoying
(Department of Computer Science and Engineering,Guangzhou College of Technology and Business,Guangzhou510850)
For the issue of the interactive control on Kinect voice commands is not be used effectively,this paper describes the basic principle of Kinect microphone array,also analyses the application interfaces,classes,objects,properties,methods and events in the process of audio capture,audio processing and speech recognition.Taking SpeechBasics-WPF case in the Kinect for Windows Developer Toolkit tool as the research object,the paper uses unit tests for each module of the application,at the same time with the static analysis technology,verifing the security and reliability of the code,also proposes the development process and programming algorithm of voice command to achieve interactive control based on Kinect,provides strategy and method for application and development of command recognition.
speech recognition,beamforming,acoustic echo cancellation,automatic gain control,noise suppression
TN912
10.3969/j.issn.1672-9722.2017.06.041
2016年12月6日,
2017年1月28日
廣東省普通高校青年創新人才類項目(編號:2014KQNCX238)資助。
朱榮,女,碩士研究生,講師,研究方向:體感互動技術、移動互聯網技術。李小映,女,副教授,研究方向:計算機應用技術、軟件工程。