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