基于Kinect的語音識別技術(shù)研究
朱榮李小映
(廣州工商學院計算機科學與工程系廣州510850)
針對Kinect語音識別技術(shù)中的語音命令交互控制功能沒有得到有效開發(fā)的問題,通過對Kinect麥克風陣列的基本原理進行闡述,對音頻捕獲、音頻處理和語音識別過程中主要使用到的應(yīng)用接口、類、對象、屬性、方法和事件等進行深入剖析,以Kinect for Windows Developer Toolkit工具中的SpeechBasics-WPF案例中為研究對象,對該應(yīng)用程序的每一個模塊進行單元測試,同時配合靜態(tài)分析技術(shù),驗證了代碼的安全性和可靠性,并在此基礎(chǔ)上提出了基于Kinect的語音命令實現(xiàn)交互控制的開發(fā)流程和編程算法,為Kinect語音命令識別的應(yīng)用與開發(fā)提供策略與方法。
語音識別;波束成形;回聲消除;自動增益控制;噪聲抑制
Class NumberTN912
1.1 硬件組成
由于聲音都是從上往下傳導(dǎo)的,所以在硬件方面Kinect四元麥克風陣列位于Kinect設(shè)備的下方。四元麥克風陣列是不對稱分布的,左邊三個右邊一個,四個相互獨立的小型麥克風,其排列呈線形。四個麥克風可以同時接收多聲道立體聲,每一個麥克風都捕獲相同的音頻信號,但因使用了數(shù)字信號處理(DSP)組件并采用波束成形(Beamforming)技術(shù)后,麥克風陣列可以根據(jù)接收聲音的時間差來定位聲源方向,再加上配置了立體聲模數(shù)轉(zhuǎn)換放大器,麥克風陣列又可對捕獲的音頻信號進行噪聲抑制(Noise Suppression)。如果要準確辨別出相應(yīng)的語音命令,麥克風陣列最好在室內(nèi)環(huán)境中偵聽,因為它需要根據(jù)室內(nèi)的聲音反射來創(chuàng)建音頻分布圖并進行回聲消除(Acoustic Echo Cancellation,AEC)。
1.2 軟件接口
要應(yīng)用Kinect的各項功能,必須安裝Kinect for windows SDK開發(fā)工具包,SDK包封裝了語音識別的組件,分別是DirectX媒體對象(DirectX MediaObject,DMO)和語音應(yīng)用編程接口(Speech API,SAPI)。DMO是在DirectX的8.1版時從DirectShow(提供音視頻流的高質(zhì)量捕捉和重放)分出的,是微軟公司提供的流數(shù)據(jù)處理COM組件,它支持音視頻的編解碼器和特效,其功能類似于過濾器,為四元麥克風陣列提供了一系列的編程接口,通過對該COM組件的引用,可以實現(xiàn)源代碼本地化,并支持回聲消除、噪聲抑制和自動增益控制(Automatic Gain Control,AGC)等功能。SAPI組件中包含了語音識別(speech recognition)和語音合成(speech synthesis)技術(shù),該組件中的語音識別接口(Voice Dictation API)和語音命令接口(Voice Commands API)是應(yīng)用程序中需要引用的部分。語音識別技術(shù)可以識別不同的語言,這些語音被封裝在運行語言包(Kinect for Windows Runtime Language Pack)中,它是負責解釋從四元麥克風陣列接收到的語言模型,并通過語言模型來優(yōu)化語音命令識別。
Kinect的麥克風陣列主要的技術(shù)是語音識別技術(shù),語音識別功能通常用于Xbox控制中心的導(dǎo)航、菜單控制,以及多媒體的播放,通過Kinect的語音識別,用戶可以完成語音的交互及控制。下面重點介紹語音識別過程中的兩類技術(shù):音頻處理技術(shù)和命令識別技術(shù)。
2.1 音頻處理技術(shù)
Kinect的麥克風陣列可以自動捕獲和處理語音,主要是通過KinectAudioSource對象來實現(xiàn)的,雖然KinectAudioSource對象的最主要作用是為語音識別引擎提供音頻數(shù)據(jù)流,但是它也可以用來錄制音頻文件。下面將重點講解KinectAudioSource對象以及使用KinectAudioSource對象來捕獲音頻和處理音頻數(shù)據(jù)流。
KinectAudioSource對象可以通過一些配置使Kinect的麥克風陣列以不同的模式進行工作,也能夠用來探測從某個方向來的哪種音頻信息最先達到麥克風以及用來強制麥克風陣列接受指定方向的音頻信息。KinectAudioSource對象的主要作用是從麥克風陣列中提取原始的或者經(jīng)過處理的音頻流,這些音頻流經(jīng)過一系列的算法來處理可以提高音頻質(zhì)量,這些處理包括:回聲消除、自動增益控制和波束成形。回聲消除是通過提取發(fā)聲者的聲音模式,然后根據(jù)這一模式從麥克風接收到的音頻中挑選出特定的音頻來消除回聲。自動增益控制是通過一些算法使用戶的聲音的振幅與時間保持一致。例如當用戶靠近或者或遠離麥克風時,聲音會出現(xiàn)變得響亮或更柔和。波束成形是模擬定向麥克風的算法技術(shù),該技術(shù)使得麥克風陣列產(chǎn)生的效果和使用多個固定麥克風的效果相同。
在獲取和處理音頻中,通過C#語句進行實例開發(fā),就先要將KinectAudioSource對象實例化,還要正確使用該對象的屬性、方法和事件。例如KinectAudioSource對象中的BeamAngleMode屬性可以決定通過何種方式來控制波束成形,EchoCancellationMode屬性可以控制回聲消除的開啟和關(guān)閉,KinectAudioSource對象包含Start()和Stop()兩個方法,Start()方法表示開始捕獲語音數(shù)據(jù),Stop()方法則表示停止捕獲語音數(shù)據(jù)。舉例來說明KinectAudioSource對象的方法和屬性,例如EchoCancellationMode.none表示關(guān)閉回聲抑制;AutomaticGain-ControlEnabled.False表示關(guān)閉自動增益控制;source.Start()表示初始化并開開始捕獲音頻流;KinectSensor.KinectSensors[0].source.Stop()表示關(guān)閉Kinect音頻流和傳感器。
2.2 命令識別技術(shù)
Kinect的語音識別用于體感互動游戲時,不得不提到語音命令識別,玩家可以通過語言命令實現(xiàn)對游戲的控制。當然,Kinect首先會捕獲玩家的聲音,使用上一節(jié)中介紹到的KinectAudioSource對象中的部分屬性對捕獲到的音頻數(shù)據(jù)流進行回聲消除等處理后,再傳遞給SpeechRecognitionEngine對象,它是語音識別的核心,用于分析和解釋處理好的音頻數(shù)據(jù)流,匹配出最適合的語音命令,再判斷是否包含特定的待識別命令,如果包含就通過事件進行下一步處理,不包含就直接丟棄這部分音頻數(shù)據(jù)流。
在語音識別過程中,通過C#語句進行實例開發(fā),就先要將SpeechRecognitionEngine對象實例化,還要正確使用該對象的屬性、方法和事件。例如SpeechRecognitionEngine對象中的RecognizerInfo屬性用于獲取有關(guān)SpeechRecognitionEngine的當前實例的信息,Grammars屬性用于獲取SpeechRecognitionEngine中的實例加載Grammar對象的集合。SetInputToAudioStream()方法用于配置SpeechRecognitionEngine對象以接收來自音頻流的輸入。RecognizeAsync(RecognizeMode)方法用于執(zhí)行一個或多個異步語音識別操作。主要的SpeechRecognitionEngine對象的屬性和方法將通過下面的SpeechBasics-WPF示例來直觀闡述,并以此總結(jié)語音命令識別的開發(fā)流程和算法。
3.1 SpeechBasics-WPF示例
Kinect for Windows Developer Toolkit工具中就提供了以C#為開發(fā)語言的語音命令識別案例SpeechBasics-WPF。安裝好Kinect for Windows SDK包和Kinect for Windows Developer Toolkit工具,連接Kinect設(shè)備后,通過運行SpeechBasics-WPF即可通過語音命令“Forward”、“Back”、“Turn Left”、“Turn Right”來控制“烏龜”圖形的移動方向,如圖1所示,顯示了Kinect接收到“Turn Left”語音命令后,“烏龜”圖形向左旋轉(zhuǎn)90°。
圖1 SpeechBasics-WPF運行效果
使用Visual Studio軟件將該項目的Xaml打開,通過查看在Xaml.cs中的程序可知,語音命令識別中的引用部分除了添加Microsoft.Kinect命名空間還有Microsoft.Speech.AudioFormat(音頻信息輸入引擎)和Microsoft.Speech.Recognition(語音識別引擎)。
在該案例的語音命令識別部分,程序中WindowLoaded()函數(shù)中就已經(jīng)對Kinect進行了初始化,并讀取了Xaml配置文件的語言庫,而對已經(jīng)匹配成功的語音命令則通過定義名為SpeechRecognized()函數(shù)來實現(xiàn)window界面中元素屬性的變化,通過switch…case…語句提供“烏龜”圖形坐標位置的算法。下面以執(zhí)行“Forward”命令為例,當用戶發(fā)出了與“Forward”匹配的語音命令時,應(yīng)用程序需要實現(xiàn)的功能為界面窗口中“Forward”提示文字顏色變成天空藍,文字字體加粗,“烏龜”圖形的X、Y坐標位置,并保證坐標位置不超過窗口的寬度和高度。
3.2 測試
程序中的每一個模塊的功能都需要通過測試來驗證它的正確性,在C#面向?qū)ο蟮某绦蛟O(shè)計中單元測試是最基本的測試方法,通過單元測試是可以判斷某個特定條件(或者場景)下某個特定函數(shù)的行為。從SpeechBasics-WPF案例中了解到程序中主要使用到的函數(shù)包括WindowLoaded()、GetKinectRecognizer()、SpeechRecognized()、SpeechRecognitionRejected()、ClearRecognizer(),函數(shù)調(diào)用關(guān)系如圖2所示。把這些函數(shù)稱為一個模塊或單元,在Visual Studio2010中選中該應(yīng)用程序中的每一個模塊,右鍵單擊后通過單元測試,測試結(jié)果顯示“測試通過”,接著配合靜態(tài)分析技術(shù)對程序代碼進行掃描,通過驗證,該程序代碼滿足規(guī)范性、安全性、可靠性和可維護性。
圖2 函數(shù)調(diào)用關(guān)系圖
3.3 開發(fā)流程與算法語句
在3.2節(jié)中的代碼驗證通過的基礎(chǔ)上可以將語音命令識別應(yīng)用程序的開發(fā)流程及其主要算法進行詳細闡述,總共分為七個步驟,每個步驟列出了主要的算法語句及其對應(yīng)的注釋,如下所示。
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的服務(wù)器版本,System.Speech是SAPI的桌面版本,而針對Kinect并不適用于識別自由語音或者說比較適合識別語音命令的特點,通常情況下不會在引用部分添加System.Speech,或者同時添加兩個版本的引擎。所以在引用部分通常需要添加using Microsoft.Kinect和using Microsoft. Speech。
3.3.2 初始化Kinect
Kinect可能在執(zhí)行其他的應(yīng)用程序,一般都需要初始化,初始化的方法基本相同,主要通過使用條件判斷語句。如果當前的Kinect設(shè)備空置,則使用start()方法激活Kinect,如果不是空置,則將null賦值于Kinect,讓其空置。
3.3.3 編寫語法文件
由于Microsoft.Speech庫中沒有提供語音命令模式,不支持命令語法,使用SDK中的語音識別,就需要知道所有的語音命令并將其包含在一個固定的語法中,這個語法可以直接寫入到代碼中,也可以將語法寫入XML文件,該XML文件是W3C中的語音識別語法說明書1.0作為標準,并只支持英語語種,下面以“FORWARD”語音命令為例,首先需要考慮用戶對于“向上”的命令可能發(fā)聲的單詞,例如發(fā)聲的單詞是forward、front、straight等,在編寫語法文件的時候就必須把這三個子項包含于“FORWARD”語音命令中。一旦語音識別引擎接收到這三個子項的同時,也知道它們是“FORWARD”中的語義分類。主要語句如下所示:
3.3.4 獲取語音識別引擎接口信息
創(chuàng)建語法XML文件后需要加載到語音識別引擎中,加載語法的第一步就是要將RecognizerInfo信息指向語音識別引擎。RecognizerInfo是語音識別引擎中的一個類,用于獲取語音識別引擎接口的信息,它的AdditionalInfo屬性可以獲取語音識別引擎實例的相關(guān)附加信息,Id屬性可以獲取語音識別引擎實例的標識符。在編程語句中通過聲明Get-KinectRecognizer()函數(shù)來返回recognizer的值,speechEngine是SpeechRecognitionEngine實例化名,recognizer的值就是speechEngine的附加信息。主要語句如下所示:
3.3.5 將語法加載到語音識別引擎
實例化后,需要建立了一個MemoryStream記憶流指向XML語法文件,下面語句中memoryS-tream是記憶流的實例化名稱,需要通過Grammar構(gòu)造函數(shù)去使該記憶流實例化,實例化名稱為m,接著使用LoadGrammar方法將實例化后的語法m加載到語音識別引擎中。主要語句如下:
3.3.6 捕獲音頻數(shù)據(jù)流
上述步驟準備好就可以偵聽用戶的語音,獲取音頻數(shù)據(jù)流,并設(shè)置音頻數(shù)據(jù)流的格式信息。SpeechAudioFormatInfo類是語音識別引擎中用于表示音頻格式的信息,初始化SpeechAudioFormat-Info的新實例并指定編碼格式、每秒的示例、每個示例的位數(shù)、通道的數(shù)目、每秒平均字節(jié)、塊對齊值。
//采用脈沖編碼調(diào)制(Pulse Code Modulation,Pcm)為音頻編碼格式,每秒接收16000個采樣,每個樣本占16位,只有1個通道,每秒中產(chǎn)生32000字節(jié)數(shù)據(jù),塊對齊值為2
3.3.7 匹配語音命令
語音識別引擎可以開始偵聽并捕獲用戶發(fā)出“口語命令”,如果識別出的“口語命令”與XML語法文件中預(yù)先定義好的語音命令匹配成功,則需要編寫應(yīng)用程序來實現(xiàn)窗口中元素的變化,例如實現(xiàn)“烏龜”圖形的移動。這里就要提到SpeechRecognized和SpeechRecognitionRejected事件,當語音識別引擎與其加載啟用的Grammar語音命令對象匹配的時候觸發(fā)SpeechRecognized事件。在下面的語句中定義了SpeechRecognized事件,它負責處理傳進去的語音命令,并對識別出的命令執(zhí)行相應(yīng)的操作,其中SpeechRecognizedEventArgs是語音識別引擎中的公共類,繼承于RecognitionEventArgs,這里實例化為e,通過它可以為SpeechRecognized事件提供獲取到的與語音識別事件關(guān)聯(lián)的識別數(shù)據(jù),而ConfidenceThreshold則是語音識別引擎對“口語命令”與XML語法文件中的語音命令匹配的可能性或相對度量,稱為置信度,該值的范圍從0.0到1.0,值越高說明匹配越成功,當然也需要一個閾值來限制置信度,比如下面的置信度閾值為0.3,如果低于0.3就不執(zhí)行switch…case…語句(語句中主要描述每一個匹配的語音命令在窗口界面中能實現(xiàn)的效果或執(zhí)行的操作),也完成不了語音命令對應(yīng)的交互結(jié)果。
匹配成功則觸發(fā)SpeechRecognized事件,當匹配不成功時,則觸發(fā)SpeechRecognitionRejected事件,SpeechRecognitionRejected事件中編寫的語句主要實現(xiàn)的功能與SpeechRecognized事件的功能相反。
語音識別技術(shù)就是將人發(fā)出的語音詞匯轉(zhuǎn)換成計算機可讀的輸入,語音識別通常都會使用模式匹配方法,Kinect的語音識別技術(shù)同樣也是使用該方法,所以在對其語音識別技術(shù)的研究過程中不會去考慮語種限制(只支持英語、法語、日語等),用戶發(fā)音的標準性對語音命令的交互功能的限制,還有Kinect也不適用于去識別自由語言,擅長于識別語音命令等問題。
目前,由于Kinect語音識別技術(shù)在實際的商業(yè)應(yīng)用中用處也相對小,在人機交互方面其雙向交互特性導(dǎo)致開發(fā)成本高等因素,使得Kinect開發(fā)者基本都著重于骨骼追蹤技術(shù)和手勢識別技術(shù)。其實,這兩種技術(shù)和語音識別技術(shù)在每一個交互應(yīng)用中都應(yīng)該是相輔相成的不可或缺的整體。Kinect的語音識別技術(shù)在實際的應(yīng)用開發(fā)過程中還處在基礎(chǔ)命令識別階段,與骨骼追蹤和手勢識別結(jié)合運用不夠廣泛和深入,這也是筆者需要繼續(xù)研究的地方。當然,如果能從聲音特征識別、語種識別、語氣語調(diào)情感探測等方面進行完善,相信Kinect的語音識別技術(shù)會得到更多開發(fā)者的重視和應(yīng)用。
[1]余濤.Kinect應(yīng)用開發(fā)實戰(zhàn)[M].北京:機械工業(yè)出版社,2013:232-239.
YU Tao.Kinect application development[M].Beijing:Mechanical Industry Press,2013:232-239.
[2]王森.Kinect體感程序設(shè)計入門(使用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]張詩潮,錢冬明.體感技術(shù)現(xiàn)狀與發(fā)展研究[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]劉曉暉,萬麗莉,季紅.基于中文語音交互的虛擬裝配技術(shù)研究[J].系統(tǒng)仿真學報,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傳感器的移動機器人聲源目標跟蹤系統(tǒng)[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日
廣東省普通高校青年創(chuàng)新人才類項目(編號:2014KQNCX238)資助。
朱榮,女,碩士研究生,講師,研究方向:體感互動技術(shù)、移動互聯(lián)網(wǎng)技術(shù)。李小映,女,副教授,研究方向:計算機應(yīng)用技術(shù)、軟件工程。