任麗莉,丁 浩,康 冰,閆冬梅
(1.長(zhǎng)春師范大學(xué)網(wǎng)絡(luò)中心,吉林長(zhǎng)春 130032;2.吉林大學(xué)通信工程學(xué)院,吉林長(zhǎng)春 130022;3.吉林大學(xué)大數(shù)據(jù)和網(wǎng)絡(luò)管理中心,吉林長(zhǎng)春 130012)
語(yǔ)音識(shí)別技術(shù)改變了人與計(jì)算機(jī)的互動(dòng)模式。人們只需動(dòng)動(dòng)口,就能打開或關(guān)閉程序,改變工作界面。這種使電腦人性化的結(jié)果是使人的雙手得到解放,使每個(gè)人都能操作和應(yīng)用計(jì)算機(jī)。這種變化不僅體現(xiàn)在計(jì)算機(jī)行業(yè)還體現(xiàn)在其它方面,比如電話手機(jī)、導(dǎo)航控制、檢索文件、控制儀器等。語(yǔ)音識(shí)別技術(shù)涉及很多領(lǐng)域的知識(shí),語(yǔ)音識(shí)別技術(shù)與其他學(xué)科的科學(xué)技術(shù)相結(jié)合,可以構(gòu)建出更加復(fù)雜的系統(tǒng)。隨著技術(shù)的發(fā)展,語(yǔ)音識(shí)別系統(tǒng)應(yīng)用于機(jī)器人領(lǐng)域成為必然趨勢(shì)[1-3]。語(yǔ)音識(shí)別系統(tǒng)具有很強(qiáng)的專業(yè)性,有很強(qiáng)大的市場(chǎng)潛力。無(wú)論是目前還是未來(lái),研制出識(shí)別能力強(qiáng)、識(shí)別語(yǔ)種多的語(yǔ)音識(shí)別系統(tǒng),并將其應(yīng)用于機(jī)器人領(lǐng)域,對(duì)提高作業(yè)安全性、生產(chǎn)快捷性、操作簡(jiǎn)單性都有積極意義,在服務(wù)型機(jī)器人和家庭型機(jī)器人應(yīng)用方面更是有不可替代的作用。用戶可以通過(guò)語(yǔ)音識(shí)別交互系統(tǒng)直接控制機(jī)器人,省去了非語(yǔ)音識(shí)別機(jī)器人的復(fù)雜操作流程。像敬老院、醫(yī)院等場(chǎng)所可以通過(guò)安裝有語(yǔ)言識(shí)別系統(tǒng)的機(jī)器人完成老人、病人的無(wú)人化照顧,具有一定的現(xiàn)實(shí)意義。
從根本上講,語(yǔ)音識(shí)別系統(tǒng)是一種特別的模式識(shí)別系統(tǒng),由三個(gè)基本結(jié)構(gòu)單元組成,分別是參考模板庫(kù)、特征提取和模式匹配,基本結(jié)構(gòu)如圖1所示。
用戶通過(guò)語(yǔ)音輸入裝置輸入語(yǔ)音,將輸入語(yǔ)音轉(zhuǎn)換為電信號(hào),并添加到語(yǔ)音識(shí)別系統(tǒng)的輸入端口。首先對(duì)信號(hào)進(jìn)行預(yù)處理。由特定算法提取出能夠有效地表現(xiàn)語(yǔ)音特征的特征參數(shù),以區(qū)別不同的語(yǔ)音命令。然后將提取的特征參數(shù)與模板庫(kù)中以同一方法在訓(xùn)練階段保存的其它語(yǔ)音的特征參數(shù)進(jìn)行匹配,利用搜索匹配法進(jìn)行匹配比較之后將最佳結(jié)果作為識(shí)別結(jié)果,將識(shí)別結(jié)果輸出或存儲(chǔ)到其它操作中[4-5]。
本系統(tǒng)設(shè)計(jì)更傾向于程序算法的設(shè)計(jì),加之簡(jiǎn)單的組件添加。程序設(shè)計(jì)是在VC++6.0的MFC下進(jìn)行編程實(shí)現(xiàn)的,在設(shè)計(jì)過(guò)程中,硬件方面要求有一個(gè)帶有Windows操作系統(tǒng)的輪式機(jī)器人、一個(gè)裝有VC++6.0的Windows PC、一個(gè)電源、一個(gè)麥克風(fēng)裝置等。在MFC平臺(tái)中使用微軟語(yǔ)音SDK 5.1開發(fā)語(yǔ)音識(shí)別的主要步驟如下:下載安裝完程序后,首先配置VC環(huán)境,然后在編程前添加相應(yīng)的頭文件,再進(jìn)行程序編寫。其中,編程部分可分為文字轉(zhuǎn)語(yǔ)音(語(yǔ)音輸出)和語(yǔ)音識(shí)別兩部分。
文字轉(zhuǎn)語(yǔ)音步驟如下:
(1)導(dǎo)入所需的語(yǔ)音頭文件。
(2)文字轉(zhuǎn)語(yǔ)音函數(shù)的設(shè)置。在這里調(diào)用CBodyBasics∶∶MSSSpeak(LPCTSTR speakContent)函數(shù)即可將需要輸出的文字轉(zhuǎn)為語(yǔ)音,speakContent為L(zhǎng)PCTSTR型的字符串。
(3)在進(jìn)行輸入輸出設(shè)置之前要用ISpVoice*pVoice=NULL指令進(jìn)行com初始化,并檢測(cè)是否成功給予反饋。
(4)獲取SpVoice接口,之后進(jìn)行語(yǔ)音輸出音量的設(shè)置,pVoice->SetVolume((USHORT)100)指令設(shè)置語(yǔ)音輸出的音量,其有效范圍是0至100,再用pVoice->SetRate(2)指令設(shè)置輸出語(yǔ)音的速度,其有效范圍是-10至10。
(5)利用pSpeech->Speak(L"……")指令輸出所需語(yǔ)音,“……”為輸出內(nèi)容。語(yǔ)音輸出功能整體代碼設(shè)置完畢后釋放com資源。至此文字轉(zhuǎn)語(yǔ)音編程設(shè)置完畢。
語(yǔ)音轉(zhuǎn)文字步驟如下:
(1)首先設(shè)置工程屬性。在VC中打開屬性選項(xiàng),打開配置屬性,點(diǎn)擊C/C++預(yù)處理器,點(diǎn)擊預(yù)處理器定義,勾選_WIN32_DCOM選項(xiàng)。若不如此設(shè)置編譯將無(wú)法通過(guò)。
(2)導(dǎo)入所需頭文件,語(yǔ)音頭文件庫(kù)、語(yǔ)音識(shí)別頭文件、要用的CString頭文件等。
(3)在程序的.h頭文件中定義變量,添加入頭文件后還需對(duì)頭文件中的變量進(jìn)行定義,否則在運(yùn)行時(shí)會(huì)出現(xiàn)錯(cuò)誤。需要定義的變量有:語(yǔ)音識(shí)別引擎(recognition)的接口、識(shí)別引擎上下文(context)的接口、識(shí)別文法(grammar)的接口、流()的接口、語(yǔ)音特征的(token)接口、音頻(Audio)的接口(用來(lái)保存原來(lái)默認(rèn)的輸入流)。
(4)進(jìn)行語(yǔ)音識(shí)別初始化函數(shù)創(chuàng)建。在創(chuàng)建之前與語(yǔ)音輸出部分相同要進(jìn)行com接口初始化,并檢測(cè)是否成功加以反饋。微軟語(yǔ)音識(shí)別開發(fā)包提供了兩種模式:一種是共享模式(Share);另一種是獨(dú)享模式(InProc)。一般情況下選用共享模式,大型的服務(wù)程序使用獨(dú)立模式。本系統(tǒng)使用共享模式(Share)。具體的編程設(shè)置如下:利用hr=m_cpRecoEngine.CoCreateInstance(CLSID_SpSharedRecognizer)指令來(lái)創(chuàng)建共享模式,執(zhí)行完創(chuàng)建指令后要進(jìn)行檢測(cè),檢查識(shí)別引擎是否創(chuàng)建成功。成功后進(jìn)行以下操作:首先創(chuàng)建識(shí)別上下文接口,再設(shè)置識(shí)別消息,隨后設(shè)置我們感興趣的事件,即需要識(shí)別的事件。要進(jìn)行語(yǔ)音識(shí)別需要在工程中添加需要的語(yǔ)音,也就需要?jiǎng)?chuàng)建語(yǔ)法規(guī)則C&C命令式,此時(shí)語(yǔ)法文件使用xml格式,具體在(6)中介紹。創(chuàng)建語(yǔ)法規(guī)則后要加載語(yǔ)法才能使用,在進(jìn)行識(shí)別前,首先要激活語(yǔ)音識(shí)別函數(shù),之后再進(jìn)行識(shí)別,在主體程序設(shè)置完畢后釋放com資源。至此語(yǔ)音識(shí)別部分編程設(shè)置完畢。
(5)定義消息處理函數(shù)。消息處理函數(shù)需要和上文所述的其他代碼放在一起。根據(jù)本文上述部分進(jìn)行編程,在其后添加修改消息反應(yīng)模塊即可實(shí)現(xiàn)所需功能。先參照前文進(jìn)行語(yǔ)音識(shí)別部分的編程設(shè)置,當(dāng)輸入語(yǔ)音后系統(tǒng)進(jìn)行識(shí)別,取出識(shí)別結(jié)果等待消息反應(yīng)模塊做出反應(yīng)。在消息處理函數(shù)中利用識(shí)別結(jié)果進(jìn)行進(jìn)一步操作,如當(dāng)機(jī)器人識(shí)別出語(yǔ)音“機(jī)器人”后給出“你好”的回應(yīng),在工程中通過(guò)Recstring=="機(jī)器人"指令保存識(shí)別出的語(yǔ)音,隨后通過(guò)pSpeech->Speak(L"你好!");指令回應(yīng),實(shí)現(xiàn)語(yǔ)音識(shí)別、語(yǔ)音輸出的交互。
(6)修改語(yǔ)法文件。對(duì)Strkeyword.xml文件進(jìn)行修改,可以增添刪減關(guān)鍵詞,使某些特殊詞匯的識(shí)別度提高,使其識(shí)別效果變得更好,像名字、專有名詞等。
通過(guò)以上方法進(jìn)行語(yǔ)音識(shí)別編程,整體編程實(shí)現(xiàn)方法如圖2和圖3所示。在硬件上只需在機(jī)器人上連接麥克風(fēng)。
在MFC平臺(tái)運(yùn)行完成程序加載后,形成相應(yīng)的可執(zhí)行文件即應(yīng)用軟件。啟動(dòng)應(yīng)用軟件后(啟動(dòng)后圖標(biāo)狀態(tài)如圖4所示),機(jī)器人會(huì)進(jìn)入語(yǔ)音識(shí)別狀態(tài),用戶通過(guò)麥克風(fēng)輸入語(yǔ)音指令,系統(tǒng)對(duì)接收到的語(yǔ)音信號(hào)進(jìn)行識(shí)別并提取相應(yīng)的特征參數(shù),如果與程序中設(shè)定目標(biāo)語(yǔ)音的特征參數(shù)一致,那么就可以將其作為最終的識(shí)別結(jié)果,語(yǔ)音識(shí)別結(jié)果會(huì)暫時(shí)被保存,在機(jī)器人執(zhí)行周期執(zhí)行函數(shù)時(shí)使用,作為條件對(duì)機(jī)器人行動(dòng)進(jìn)行控制。
經(jīng)過(guò)設(shè)計(jì)可實(shí)現(xiàn)如下功能:點(diǎn)擊啟動(dòng)圖標(biāo),屏幕顯示“開始聆聽(tīng)”即可進(jìn)行語(yǔ)音識(shí)別。機(jī)器人發(fā)出“準(zhǔn)備飲料獲取演示”聲音,輸入“機(jī)器人”,回應(yīng)“你好,請(qǐng)問(wèn)需要飲料嗎”,輸入“是的”,回答“好的,我將為你取回飲料”,之后機(jī)器人開始行動(dòng)。圖5所示為輪式機(jī)器人。
如果要進(jìn)行其他語(yǔ)音識(shí)別設(shè)置,可進(jìn)行如下操作:
(1)語(yǔ)音識(shí)別。語(yǔ)音識(shí)別的關(guān)鍵詞文件放置在工程的Grammar子目錄下,根據(jù)需要對(duì)里面的關(guān)鍵詞進(jìn)行自由增減,在微軟官方網(wǎng)站可以找到相關(guān)語(yǔ)法規(guī)則。語(yǔ)音識(shí)別到的關(guān)鍵詞,最后會(huì)以字符串變量的形式被傳遞到CRobotEvent∶∶SR_KeyWord()回調(diào)函數(shù)中。
(2)語(yǔ)音輸出。在類CRobotEvent中,可隨時(shí)通過(guò)pSpeech指針調(diào)用CSpeech類的Speak()函數(shù)接口將文字轉(zhuǎn)換成語(yǔ)音播放出來(lái)。
(3)接口函數(shù)進(jìn)行語(yǔ)音輸出,函數(shù)為pSpeech->Speak(CString inStr),其中參數(shù)inStr為字符串類型,指代內(nèi)容為需要進(jìn)行語(yǔ)音輸出的語(yǔ)句。
長(zhǎng)春師范大學(xué)學(xué)報(bào)2018年8期