語音識別是機器通過識別和理解過程把人類的語音信號轉變為相應文本或命令的技術,其根本目的是研究出一種具有聽覺功能的機器。本設計研究孤立詞語音識別系統及其在 STM32 嵌入式平臺上的實現。識別流程是:預濾波、ADC、分幀、端點檢測、預加重、加窗、特征提取、特征匹配。端點檢測(VAD)采用短時幅度和短時過零率相結合。檢測出有效語音后,根據人耳 聽覺感知特性,計算每幀語音的 Mel 頻率倒譜系數(MFCC)。然后采用動態時間彎折(DTW)算法與特征模板相匹配,最終輸出識別結果。先用 Matlab 對上述算法進行仿真,經多次試驗得出算法中所需各系數的最優值。然后將算法移植到 STM32 嵌入式平臺, 移植過程中根據嵌入式平臺存儲空間相對較小、計算能力也相對較弱的實際情況,對算法進行優化。最終設計并制作出基于
STM32 的孤立詞語音識別系統。
本設計的孤立詞語音識別是語音識別技術中較為基本的,算法實現也較簡單,適合于在嵌入式平臺中實現一些簡單的語音控制功能。以往類似系統大都基于 ARM9、ARM11、DSP、SOC 等。這些平臺系統規模較大、開發和維護的難度較大、成本也相對較高。STM32 是意法半導體(ST)公司推出的基于 ARM Cortex-M3 內核的高性能單片機。上市之后,由于其出色的性能、低廉的價格,很快被運用到眾多產品中。經測試,STM32F103VET6 單片機擁有能夠滿足本系統孤立詞語音識別所需的運算和存儲能力。所以在本系統中采用 STM32F103VET6 作為主控制器,采集并識別語音信號。
一,系統設計任務要求
本系統利用單片機設計了一個孤立詞語音識別系統,能夠識別 0~9、 “上”、“下”、“左”、“右”14 個漢語語音指令。系統通過觸摸式 LCD 與用戶交互。
本設計的主要要求如下:
1.采集外部聲音信號,轉換為數字信號并存儲。
2.在采集到的聲音信號中找出有效語音信號的開始和結束點。
3.分析檢測到的有效語音,得出語音信號特征。
4.對每個待識別的語音指令,建立特征模版。
5.比較輸入語音信號特征與特征模版,識別輸入的語音信號
6.顯示系統操作界面,并能夠接受用戶控制。
系統硬件由音頻放大模塊、MCU、觸摸屏、電源四部分組成。音頻放大模塊完成對外部聲音信號的采集和放大。將聲音信號轉化為電信號,并放大到 0~3V。MCU 的 ADC 參考電壓為其電源電壓 3.3V。音頻放大模塊的輸出信號不超出 MCU ADC 的電壓范圍,并且能夠獲得最大的量化精度。MCU 對音頻放大模塊輸入的聲音信號進行 AD 轉換。然后提取并識別信號特征。另外,MCU 還控制觸摸屏的顯示和讀取觸摸屏點擊位置。觸摸屏負責顯示操作界面,并接收用戶操作。電源為電池供電。
系統硬件框圖
本系統中采集一個漢語語音指令。錄音時間長度 2s,以 8KHz 16bit 采樣率對語音進行采集,所需存儲空間為 32KB,另外加上語音處理、特征提取及特征匹配等中間步驟所需 RAM 空間不會超過 64KB。而 STM32F103VET6 帶有 512KB Flash 和 64KB RAM。所以 STM32F103VET6 在程序空間上能夠滿足。語音識別中最耗時的部分是特征提取中的快速傅立葉變換換。一般來說,孤立詞語音識別中有效語音時間長度小于 1s。語音信號一般 10~30ms 為一幀,本系統中按 20ms 一幀,幀移(相鄰兩幀的重疊部分)
10ms,這樣一個語音指令不超過 100 幀。在 8KHz 16bit 的采樣率下,20ms 為 160 采樣點 。STM32 固件庫所提供的 16 位、1024 點 FFT,在內核以 72MHz 運行時每次運算僅需 2.138ms。完成 100 幀數據的 FFT 所需時間為 213.8ms,加上其他處理所需時間,識別一個語音指令耗時不會超過 0.5s。所以在程序運行時間上 STM32F103VET6 也能夠滿足需要,能夠進行實時的孤立詞語音識別。
二、 音頻信號采集方案選擇
音頻信號采集多采用音頻編解碼芯片,例如 UDA1341、VS1003 等。此類芯片能夠提供豐富的功能,且系統一致性較好,但它們成本較高。本系統是一個低成本解決方案,并且只需要采集音頻信號。因此不宜采用那些專用的音頻編解碼芯片。
在本系統的音頻放大模塊中使用小型話筒完成聲電信號轉換,兩個 9014 三極管構成兩級共基極放大電路。在每一級中加電壓負反饋,穩定放大倍數。
語音信號的頻帶為 300~3400Hz,根據抽樣定理,抽樣頻率設為 8000Hz就足以完成對語音信號的采集。在本系統中 TIM1被設置為 ADC觸發信號源。TIM時鐘源為系統時鐘 72MHz。經 100分頻,變為 720KHz。計數模式為向上遞增,自動重載值為 90, 即計數值從 0遞增到 90再返回 0。比較匹配值設為 0~90間任意一個數值 ,則每秒可發出 8000次比較匹配事件。ADC每秒完成 8000次 A/D轉換,即抽樣頻率為 8KHz。
三,采樣軟件算法
對采集到的音頻信號進行預處理、端點檢測、特征提取、模板訓練、特征匹配的一些列處理,最終識別輸入語音。 系統軟件流程圖如下圖所示。
語音信號的預處理主要包括: ADC、分幀、數據加窗、預加重。
語音信號的頻率范圍通常取 100Hz~3400Hz,因為這個頻段包含絕大部分的語音信息,對語音識別的意義最大。根據采樣定律, 要不失真地對 3400Hz 的信號進行采樣,需要的最低采樣率是 6800Hz。為了提高精度,常用的 A/D 采樣率在 8kHz 到 12kHz。語音信號有一個重要的特性:短時性。由于人在說話中,清音與濁音交替出現,并且每種音通常只延續很短的一段時間。因此, 從波形上看,語音信號具有很強的“時變特性”。在濁音段落中它有很強的周期性,在清音段落中又具有噪聲特性,而且濁音和清音的特征也在不斷變化之中。如圖 1.4 所示,其特性是隨時間變化的,所以它是一個非穩態過程。但從另一方面看,由于語音的形成過程是與發音器官的運動密切相關的,這種物理性的運動比起聲音振動速度來說是緩慢的(如圖 1.5 所示)。因此在一個短時間范圍內,其特性變化很小或保持不變,可以將其看做一個準穩態過程。我們可以用平穩過程的分析處理方法來分析處 理語音信號。
基于以上考慮,對語音信號的分析處理必須采用短時分析法,也就是分幀。語音信號通常在 10ms~30ms 之間保持相對平穩。在本設計中,每幀取 20ms。為了使前后幀之間保持平滑過渡,幀移 10ms,即前后幀之間交疊 10ms。
四、 端點檢測算法選擇
語音端點檢測(VAD),也稱為語音活動性檢測,主要應用在語音處理中的語音編解碼,語音識別及單信道語音增強等領域。語音 端點檢測的基本方法可以用一句話來表達:從輸入信號中提取一個或一系列的對比特征參數,然后將其和一個或一系列的門限 閥值進行比較(如圖 3-2)。如果超過門限則表示當前為有音段;否則表示當前為無音段。門限閥值通常是根據無音段時的特征確 定的。但是由于語音和環境噪聲的不斷變化,使得這一判決過程變得非常復雜。通常語音端點檢測是在語音幀的基礎上進行的, 語音幀的長度在 10ms~30ms 不等。一個好的語音端點檢測算法必須具有對各種噪聲的魯棒性,同時要簡單、適應性能好、時 延小、且易于實時實現。 在高信噪比的情況下,常用的檢測方法大體上有以下幾種:短時能量、短時過零率。這些方法都是利用了語音和噪聲的特征參 數,因此判別效果較好。并且它們實現簡單,計算量相對較小,因而得到廣泛的應用。 短時能量定義如下式: (1-6) 式中 N 為幀長,E 為一幀的短時能量值。 短時能量主要有以下幾個方面的應用:首先短時能量可以區分清音和濁音,因為濁音的能量要比清音的大得多;其次可以用短 時能量對有聲段和無聲段進行判定,以及連字分界等。短時能量由于是對信號進行平方運算,因而人為增加了高低信號之間的 差距。更重要的的是平方運算的結果很大,容易產生數據溢出。解決這些問題的簡單方法是采用短時平均幅度值來表示能量的
4.1 音頻信號采集電路設計 音頻信號采集電路原理圖如下
4.2 語音預處理算法設計
語音信號預處理包括: 語音信號采集、分幀、數據加窗、預加重。 語音信號采集就是將外部模擬的語音信號,轉換為 MCU 可處理和識別的數字信號的過程。在本設計中,通過 MCU 內部的定時 器、模數轉換器以及 DMA 控制器實現了對音頻信號采集模塊輸入語音信號的數字化。其處理流程如下圖所示。
在程序中,控制語音信號采集的函數如下。
分幀就是將采集到的語音數據分割成相同長度的片段,以用于短時分析。本設計中取 20ms 即 160 點為一幀,幀移 10ms 即 80 點。為了適應 MCU 存儲空間有限的實際情況,分幀并沒有被單獨設計和占用單獨的空間,而是在讀語音數據緩沖區的時候按照 幀長幀移的順序依次讀取。 由于端點檢測屬于時域分析,并不需要加窗和預加重,所以本設計中,分幀和預加重都加在端點檢測之后提取 MFCC 之前。
4.3 端點檢測算法設計
本設計采用短時幅度和短時過零率相結合的端點檢測算法。 首先去緩沖區前 300ms 作為背景噪聲,提取背景噪聲參數。用于后續端點檢測。背景噪聲參數由以下結構體定義。
提取函數為 void noise_atap(const u16* noise,u16 n_len,atap_tag* atap),其提取過程如下。
然后根據提取到的短時過零率和短時幅度計算有效語音起始和結束點。有效語音端點由以下結構體定義。
端點檢測函數為 void VAD(const u16 *vc, u16 buf_len, valid_tag *valid_voice, atap_tag *atap_arg)。其流程圖如下。
4.4 特征提取算法設計及優化
本設計選用 12 階 MFCC 作為語音特征。此步是整個算法流程中最耗時也是優化空間最大的部分。因此,在程序設計中,沿用經 典算法的同時做了大量的針對 STM32 嵌入式平臺的優化工作。優化的中心思想是:盡量少使用或不使用浮點運算;使用整型數, 其運算結果應盡量大以減少舍入噪聲,但必須保證數據不會溢出;空間換時間。 FFT 函數是 u32* fft(s16* dat_buf, u16 buf_len)。它封裝了了 ST 提供的 STM32 固件庫里的 void cr4_fft_1024_stm32(void *pssOUT, void *pssIN, u16 Nbin)函數。cr4_fft_1024_stm32()輸入參數是有符號數,包括實數和虛數,但語音數據只包括實數 部分,虛數用 0 填充,fft 點數超出輸入數據長度時,超過部分用 0 填充。cr4_fft_1024_stm32()輸出數據包括實數和虛數,應 該取其絕對值,即平方和的根。 語音特征用如下結構體定義。
獲取 MFCC 的函數是
void get_mfcc(valid_tag *valid, v_ftr_tag *v_ftr, atap_tag *atap_arg)。
獲取 MFCC 的一般步驟在上一章 已有論述,在此介紹移植到 MCU 上需做的優化。 預加重的高通濾波系數為 0.95,如果直接使用,則需要進行浮點運算,盡量避免,故使用 y(n)=x(n)-x(n-1)×95/100。加漢明窗 窗函數值如果每次都要重新計算,則需要進行三角函數運算,耗時嚴重,效率低下。但其數值是一定的,因此事先計算好 160 點的漢明窗值。存于數組中 const u16 hamm[],使用時直接讀取。FFT 函數直接輸入 ADC 轉換過的值-2048~2047,其輸出頻 譜幅值過小,舍入誤差較大。數據輸入前需作放大處理。vc_temp[i]=(s16)(temp*hamm[i]/(hamm_top/10));此句代碼在實現加 窗的同時,將語音數據放大 10 倍。Mel 三角濾波器的中心頻率和數值的計算涉及到對數運算,不宜直接計算,也實現計算好的 數值存于 Flash 中,使用時直接讀取。還有其他的優化措施,詳見附件代碼。
void get_mfcc(valid_tag *valid, v_ftr_tag *v_ftr, atap_tag *atap_arg)
函數流程如下。
4.5 模板訓練算法設計
本設計模板訓練采用冗余模板算法,即每個語音指令存儲 4 個特征模板,識別時輸入特征分別與每個特征模板相比較,匹配距 離最小的,就是識別結果。這 4 個特征模板存儲于 MCU Flash 后端,模板訓練時,將模板存于指定的 Flash 地址。為了保證保 存的特征模板不被擦除或被其他代碼或數據占用,需設置編譯器的地址范圍。
4.6 特征匹配算法設計
本設計特征匹配算法采用 DTW(動態時間彎折)。其原理在上一章已有論述,在此不再贅述。其流程如下。
最后原理樣機經過設計方案論證,設計了相應的硬件電路和系統軟件,制作了電路原理樣機并進行單機調試,結果表明,所設計的 電路和軟件能完成基本的測試功能。 采用 STM32F103VET6 單片機構建語音識別系統,通過此系統對語音信號進行采集、前端放大、AD 轉換、預處理、MFCC 特征 提取、模板訓練、DTW 特征匹配的一系列步驟,完成孤立詞語音識別的預期目標。 本設計目前也存在一些不足,例如語音信號采集模塊的動態范圍不足,當說話聲音較大或較小時,會出現無法識別的現象,需 加上自動增益控制功能。語音識別時,錄音控制不方便,最好能夠改進為完全通過語音控制。特征模板僅僅用 12 階 MFCC 略顯 不足,可添加 MFCC 一階差分。