基于Windows CE的語(yǔ)音口令識別系統的設計
圖2 信號的采集和處理流程圖。
主程序在配置好初始化參數后,建立一個(gè)子線(xiàn)程,建立子線(xiàn)程有利于將靜音檢測的復雜運算過(guò)程和主程序的音頻數據采集過(guò)程分開(kāi)進(jìn)行,以確保在靜音檢測時(shí)不會(huì )丟掉音頻數據。與此同時(shí),主程序開(kāi)始采集數據,并存入到緩沖區。當預先設定好的緩沖區內的數據采集滿(mǎn)后,會(huì )將所采集的數據交給子線(xiàn)程,子線(xiàn)程做靜音檢測判斷。主程序會(huì )依然繼續重新采集新的音頻數據。對于子線(xiàn)程,子線(xiàn)程的任務(wù)是等待主程序發(fā)出命令,然后對數據做處理。如果檢測到有語(yǔ)音口令的開(kāi)始,會(huì )繼續采集數據,得到完整命令語(yǔ)音口令信號,提取相應的特征參數。
具體程序中有如下幾個(gè)主要過(guò)程:
?。?)初始化參數設置:
?。╝)FuncReturn=waveInOpen((Record_Buffer_Manager.hWaveIn),WAVE_MAPPER,wFormat,(LONG)(RecordBufferFillProc),(DWORD)this,CALLBACK_FUNCTION);//首先要調用API函數打開(kāi)音頻設備接口,并且設置相應的回調(CALLBACK)函數(回調函數是操作系統在每次緩沖區存滿(mǎn)后會(huì )自動(dòng)訪(fǎng)問(wèn)的一個(gè)特殊函數)
?。╞)Thread_process=AfxBeginThread((AFX_THREADPROC)RecordThreadProc,(LPVOID)this,THREAD_PRIORITY_NORMAL,0,0,0);//要為其單獨建立一個(gè)線(xiàn)程,為了實(shí)現靜音檢測,在混雜著(zhù)環(huán)境噪聲的前提下,找出語(yǔ)音口令信號。
?。╟)FuncReturn=waveInStart(Record_Buffer_Manager.hWaveIn);//打開(kāi)音頻數據流,開(kāi)始錄音。(緩沖區存滿(mǎn)后,系統會(huì )自動(dòng)訪(fǎng)問(wèn)回調函數)
?。?)主程序與子線(xiàn)程通信
SetEvent(pRecord-》hRecordEvent );//發(fā)出信號,使得子線(xiàn)程函數得到命令,對采集到的音頻流進(jìn)行靜音的檢測判斷。
?。?)在子線(xiàn)程內接收消息作出反應
WaitForSingleObject(pRecord-》hRecordEvent,INFINITE);ResetEvent(pRecord-》hRecordEvent);//與回調函數的信號發(fā)出程序對應,接受信號,并重新設定狀態(tài),等待下一次信號。
……
pRecord-》ProcessData((SAMPLE_TYPE *)pRecord-》pLeftData,……);//將得到的數據段進(jìn)行處理,也就是真正執行靜音檢測的部分。
?。?)得到完整語(yǔ)音口令信號后提取特征參數。
2 結束語(yǔ)
論文建立了一種基于Windows CE的語(yǔ)音口令識別系統,并且對上升、下降等14條口令進(jìn)行測試。實(shí)驗結果表明,本語(yǔ)音口令識別系統達到了實(shí)時(shí)的要求,可以廣泛應用于便攜式設備中。
評論