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