劉歡
摘要:本設(shè)計(jì)是利用微軟語(yǔ)音軟件開(kāi)發(fā)包Speech SDK,在vc++6.0的MFC平臺(tái)下實(shí)現(xiàn)計(jì)算機(jī)語(yǔ)音識(shí)別的過(guò)程。通過(guò)對(duì)微軟語(yǔ)音開(kāi)發(fā)理論的學(xué)習(xí)與探索,了解MFC平臺(tái)的開(kāi)發(fā)與應(yīng)用,掌握Microsoft Speech SDK(SAPI)在VC++6.0下的加載運(yùn)行,設(shè)計(jì)出的在Windows系統(tǒng)下的人機(jī)交互語(yǔ)音識(shí)別系統(tǒng)。系統(tǒng)總體設(shè)計(jì)包含上位機(jī)設(shè)計(jì)和下位機(jī)設(shè)計(jì),以上位機(jī)軟件設(shè)計(jì)為主體設(shè)計(jì)部分,下位機(jī)部分作為功能擴(kuò)展部分,其中下位機(jī)設(shè)計(jì)使用STC89C51單片機(jī)作為主控芯片。整個(gè)系統(tǒng)設(shè)計(jì)旨在為人們?nèi)粘I钐峁└嗟谋憷?/p>
關(guān)鍵詞:語(yǔ)音識(shí)別:Speech SDK;MFC
語(yǔ)音識(shí)別技術(shù)的產(chǎn)生與不斷發(fā)展的過(guò)程已經(jīng)有六十多年的歷史,在計(jì)算機(jī)與現(xiàn)代通信技術(shù)的不斷進(jìn)步,語(yǔ)音識(shí)別技術(shù)的進(jìn)步及其擴(kuò)大的應(yīng)用領(lǐng)域也得以體現(xiàn)。目前,一些基于語(yǔ)音識(shí)別技術(shù)的產(chǎn)品如語(yǔ)音撥號(hào)電話,智能語(yǔ)音搜索引擎等在國(guó)內(nèi)外都相繼得到了開(kāi)發(fā)與使用。最早利用計(jì)算機(jī)技術(shù)實(shí)現(xiàn)語(yǔ)音識(shí)別技術(shù)的有IBM、APPLE、GOOGLE等公司,在目前的Win-dows、Android等智能移動(dòng)設(shè)備中都相繼得到了開(kāi)發(fā)。語(yǔ)音識(shí)別技術(shù)是語(yǔ)音領(lǐng)域的重要組成部分,同時(shí)在計(jì)算機(jī)科學(xué)領(lǐng)域中發(fā)揮著不可或缺的作用。在應(yīng)用領(lǐng)域中語(yǔ)音識(shí)別是人機(jī)交互方式的一個(gè)重要應(yīng)用,伴隨著語(yǔ)音技術(shù)、通信技術(shù)、智能物聯(lián)網(wǎng)技術(shù)的發(fā)展,語(yǔ)音識(shí)別技術(shù)將在遠(yuǎn)程智能控制、教育培訓(xùn)、電子商務(wù)管理等各個(gè)新型領(lǐng)域中發(fā)揮著更大的作用。本設(shè)計(jì)利用微軟語(yǔ)音開(kāi)發(fā)包Microsoft Speech SDK 5.1開(kāi)發(fā)設(shè)計(jì)出具有語(yǔ)音識(shí)別功能的軟件。該軟件的使用是在Windows操作系統(tǒng)下運(yùn)行的,識(shí)別相關(guān)語(yǔ)音命令來(lái)加載運(yùn)行所指定的功能。
1系統(tǒng)上位機(jī)設(shè)計(jì)
1.1語(yǔ)音識(shí)別的過(guò)程
語(yǔ)音識(shí)別的編程離不開(kāi)由上所述的幾種語(yǔ)音識(shí)別引擎接口即以下四個(gè)語(yǔ)音引擎RecoGrammar_ISP,Recognizer_ISP,ISpPhrase以及CRInstanceCreat_ISP它們都遵循COM組件的工作原理和Windows應(yīng)用程序的工作原理即消息驅(qū)動(dòng)機(jī)制,在實(shí)現(xiàn)過(guò)程中首先需要構(gòu)造出操作語(yǔ)音識(shí)別的類即CSpeechRecog-nition,接下來(lái)即可通過(guò)CSpeechRecognition類來(lái)實(shí)現(xiàn)一個(gè)語(yǔ)音識(shí)別程序。語(yǔ)音識(shí)別系統(tǒng)執(zhí)行所需的各個(gè)引擎接口都在CSpeechRecognition類中封裝好了,它們分別是m_cpRecoEn-gine,m_cpRecoCotxt和m_cpDictationGrammars,使用這些接口的目的在于它們使語(yǔ)音識(shí)別過(guò)程得到了簡(jiǎn)潔方便。
1.1.1初始化COM庫(kù)
COM庫(kù)存在于DLL中,其在OLE32.DLL與OLE32.LIB中,定義了一些常用的函數(shù),因此對(duì)COM的調(diào)用必須先用函數(shù)CoInitialize(Null)來(lái)對(duì)其進(jìn)行初始化。
1.1.2對(duì)語(yǔ)音識(shí)別對(duì)象的創(chuàng)建
在對(duì)語(yǔ)音識(shí)別對(duì)象的創(chuàng)建過(guò)程中需要以特定的順序定義各個(gè)語(yǔ)音接口的對(duì)象,語(yǔ)音識(shí)別對(duì)象的識(shí)別事件可以對(duì)計(jì)算機(jī)用戶發(fā)出的聲音做出響應(yīng),判斷用戶朗讀的詞匯并執(zhí)行相應(yīng)的操作。語(yǔ)音識(shí)別對(duì)象Recognizer Object是實(shí)現(xiàn)語(yǔ)音識(shí)別引擎的方法。
1.1.3上下文語(yǔ)音識(shí)別命令的創(chuàng)建
上下文語(yǔ)音識(shí)別命令(Recognition Context)的創(chuàng)建是為系統(tǒng)在語(yǔ)音識(shí)別過(guò)程中,對(duì)語(yǔ)音識(shí)別的命令請(qǐng)求起到通知作用并驅(qū)動(dòng)語(yǔ)法規(guī)則對(duì)象的創(chuàng)建,使每個(gè)語(yǔ)音識(shí)別上下文對(duì)象正好與相應(yīng)的消息處理函數(shù)對(duì)應(yīng)。
1.1.4對(duì)識(shí)別消息和感興趣事件的設(shè)置
此處需調(diào)用SetNotifyWindowMessage函數(shù),為了將識(shí)別消息送給windows,讓windows辨別具體需要進(jìn)行處理的識(shí)別消息。在對(duì)語(yǔ)音響應(yīng)時(shí)間的確定時(shí)需要通過(guò)函數(shù)中定義的消息WMSrenent來(lái)計(jì)量,此時(shí)在初始化函數(shù)的響應(yīng)窗口中會(huì)得到通知。接下來(lái)需要對(duì)感興趣事件進(jìn)行設(shè)置。
1.1.5語(yǔ)法和規(guī)則的裝載
語(yǔ)音識(shí)別引擎需要有一套特定的語(yǔ)法,APP需要首先初始化的步驟是語(yǔ)法的裝載,而且需要對(duì)RecoGrammar_ISP接口進(jìn)行執(zhí)行激活處理。當(dāng)存在的語(yǔ)法規(guī)則被RecoGrammar_ISP接口識(shí)別,ISpRecogContext對(duì)象會(huì)向APP發(fā)出語(yǔ)音識(shí)別消息,接下來(lái)就會(huì)對(duì)識(shí)別消息響應(yīng)函數(shù)進(jìn)行調(diào)用;在編輯消息函數(shù)中,獲取識(shí)別的結(jié)果是通過(guò)ISpPhraser接口實(shí)現(xiàn)的。在語(yǔ)法規(guī)則還沒(méi)有被終止,這一步可以一直循環(huán)下去。根據(jù)實(shí)際應(yīng)用的情況確定在此次程序設(shè)計(jì)采用聽(tīng)說(shuō)式語(yǔ)法規(guī)則,由于它具有相當(dāng)大的語(yǔ)言詞匯量,適合漢語(yǔ)普通話的錄入識(shí)別。
1.1.6響應(yīng)各種事件
在以上五個(gè)步驟都依次執(zhí)行完畢時(shí),即已經(jīng)完成了語(yǔ)音識(shí)別的初始化過(guò)程,接下來(lái)就能對(duì)每個(gè)程序事件進(jìn)行直接響應(yīng)。當(dāng)應(yīng)用程序退出時(shí),卸載COM平臺(tái)。
1.2上位機(jī)程序設(shè)計(jì)過(guò)程
上位機(jī)設(shè)計(jì)總體過(guò)程包括語(yǔ)法規(guī)則文件即“微軟語(yǔ)音識(shí)別CmdCtrl.xml”文件的編寫(xiě)、程序初始化即語(yǔ)音識(shí)別初始化和串口通信初始化以及消息函數(shù)的實(shí)現(xiàn)過(guò)程。其中XML文件采用記事本進(jìn)行編輯,將需要錄入的語(yǔ)音信息寫(xiě)人文件中。程序設(shè)計(jì)需要首先安裝微軟Speech SDK 5.1,vc++6.0中建立MFC工程,在工程設(shè)計(jì)中加入串口通信、Flash控件。文件配置中添加語(yǔ)音引擎sapi的頭文件和庫(kù)文件。
1.2.1編寫(xiě)語(yǔ)法規(guī)則文件
XML文件是一種可以用來(lái)作為擴(kuò)展標(biāo)記的語(yǔ)言文件,其主要作用是定義數(shù)據(jù)類型,使系統(tǒng)文件更具有結(jié)構(gòu)化的特點(diǎn)。在實(shí)際應(yīng)用當(dāng)中,XML文件需要由用戶自己編寫(xiě),來(lái)實(shí)現(xiàn)源語(yǔ)言的文件標(biāo)記,XML文件在Web信息的交換中起到了主要的作用。XML文件的編寫(xiě)有一套統(tǒng)一的約束規(guī)則,而HAXML文件在對(duì)系統(tǒng)主程序結(jié)構(gòu)的描述和交換提供了獨(dú)立的方法。在本上位機(jī)設(shè)計(jì)中需要裝載XLM文件,在對(duì)語(yǔ)音識(shí)別信息語(yǔ)音信號(hào)錄入的關(guān)鍵詞依次寫(xiě)入XML語(yǔ)法規(guī)則文件中。在這些由用戶錄入的特定的語(yǔ)句,需要命令控制約束進(jìn)行對(duì)其識(shí)別,程序中編寫(xiě)的“微軟語(yǔ)音識(shí)別CmdCtrl.xml”文件需要在語(yǔ)法規(guī)則RecoGrammar_ISP接口中裝載并被激活。endprint
1.2.2上位機(jī)系統(tǒng)初始化
程序初始化過(guò)程中需要對(duì)語(yǔ)音識(shí)別進(jìn)行初始化,在這里語(yǔ)音識(shí)別初始化即COM口初始化、語(yǔ)音識(shí)別對(duì)象的創(chuàng)建、上下文語(yǔ)音識(shí)別命令的創(chuàng)建、識(shí)別消息和感興趣事件的設(shè)置、語(yǔ)法和規(guī)則的裝載六個(gè)底層驅(qū)動(dòng)過(guò)程。接著是對(duì)串口進(jìn)行初始化,串口初始化的目的是為了與下位機(jī)進(jìn)行通信,串口初始化過(guò)程中需要進(jìn)行的操作有串口端口號(hào)的設(shè)定、輸入模式設(shè)定為二進(jìn)制模式、收到一個(gè)字節(jié)引發(fā)OnComm事件、串口參數(shù)的設(shè)置其中波特率9600bit/s,無(wú)奇偶校驗(yàn)。
1.2.3消息函數(shù)實(shí)現(xiàn)
在以上語(yǔ)音識(shí)別引擎和串口初始化完畢,系統(tǒng)初始化完成,接下來(lái)是對(duì)程序消息函數(shù)的實(shí)現(xiàn)過(guò)程。在MFC程序運(yùn)行過(guò)程中,程序需要由事件驅(qū)動(dòng)。系統(tǒng)維護(hù)是維護(hù)窗口例行過(guò)程中主要的維護(hù)機(jī)制,對(duì)在傳人系統(tǒng)的消息時(shí)消息處理函數(shù)會(huì)對(duì)其進(jìn)行處理。在建立一個(gè)窗口前,為了讓消息處理函數(shù)與窗口建立聯(lián)系,消息處理函數(shù)必須先寫(xiě),當(dāng)系統(tǒng)檢測(cè)到消息時(shí)就會(huì)調(diào)用消息處理函數(shù)。消息函數(shù)中包含的消息事件是在程序流程中依次被取出,在程序執(zhí)行實(shí)現(xiàn),將實(shí)現(xiàn)結(jié)果依次發(fā)送到特定的窗口中。整個(gè)消息響應(yīng)過(guò)程是一個(gè)程序輪詢的過(guò)程。在程序輪詢中按照取出消息,派發(fā)消息的循環(huán)過(guò)程,直到退出循環(huán),程序終止。本程序在對(duì)消息響應(yīng)函數(shù)的設(shè)計(jì)過(guò)程中,在語(yǔ)法規(guī)則被識(shí)別引擎CRInstanceCreat_ISP識(shí)別之后,應(yīng)用程序需要由ISpRecoContext對(duì)象發(fā)出語(yǔ)音識(shí)別消息,并調(diào)用識(shí)別消息的各個(gè)響應(yīng)函數(shù)。
2系統(tǒng)下位機(jī)設(shè)計(jì)
為了實(shí)現(xiàn)更多的擴(kuò)展應(yīng)用,使人機(jī)互動(dòng)過(guò)程更加靈活多樣,系統(tǒng)方案中加人了PC與MCU的通信部分。系統(tǒng)下位機(jī)設(shè)計(jì)的硬件部分包括51單片機(jī)最小系統(tǒng),電平轉(zhuǎn)換電路,語(yǔ)音播報(bào)模塊。系統(tǒng)下位機(jī)軟件設(shè)計(jì)采用C語(yǔ)言在Keil下編程,將生成的.hex文件通過(guò)串口燒寫(xiě)到單片機(jī)-制。
2.1下位機(jī)主要硬件設(shè)計(jì)
這里使用STC89C51單片機(jī)作為下位機(jī)MCU,整個(gè)下位機(jī)電路系統(tǒng)包括語(yǔ)音模塊電路,單片機(jī)最小系統(tǒng)電路以及串口通信電平轉(zhuǎn)換電路。
2.1.1語(yǔ)音控制模塊及流水燈電路設(shè)計(jì)
語(yǔ)音播報(bào)控制芯片選用WTV020-SD語(yǔ)音模塊,該模塊控制方式多樣,這里選用該模塊的三線串口控制方式,三線串口控制方式具有對(duì)存儲(chǔ)在SD卡中的任意一個(gè).AD4格式文件進(jìn)行語(yǔ)音播報(bào)的功能。
3結(jié)論
在MFC加載編譯,執(zhí)行程序后,生成的可執(zhí)行文件即最終的應(yīng)用軟件。啟動(dòng)應(yīng)用軟件后,系統(tǒng)立即進(jìn)人語(yǔ)音識(shí)別狀態(tài),由用戶對(duì)著PC的麥克風(fēng)發(fā)出相關(guān)語(yǔ)音請(qǐng)求指令,系統(tǒng)會(huì)對(duì)發(fā)出的語(yǔ)音請(qǐng)求信號(hào)進(jìn)行識(shí)別與判斷,如果與預(yù)期設(shè)定的語(yǔ)音請(qǐng)求指令相一致,那么就可以獲得有效的識(shí)別結(jié)果,在函數(shù)調(diào)用中加載相應(yīng)的功能指令。系統(tǒng)實(shí)現(xiàn)調(diào)用Windows系統(tǒng)應(yīng)用程序、打開(kāi)網(wǎng)站、播放Flash動(dòng)畫(huà)與下位機(jī)進(jìn)行通信并實(shí)現(xiàn)相應(yīng)功能等。如圖1所示為系統(tǒng)功能流程。endprint