許業(yè)寬,黃 魯
(中國(guó)科學(xué)技術(shù)大學(xué) 微電子學(xué)院,安徽 合肥 230027)
語(yǔ)音識(shí)別技術(shù)在過(guò)去的數(shù)十年中得到了長(zhǎng)足的發(fā)展。現(xiàn)今大多數(shù)語(yǔ)音識(shí)別都是基于在線云平臺(tái)[1]和計(jì)算機(jī),而應(yīng)用在嵌入式終端上的離線語(yǔ)音識(shí)別技術(shù)尚不完善,無(wú)法滿足移動(dòng)機(jī)器人、聲控機(jī)械等各類(lèi)嵌入式終端在離線情況下對(duì)語(yǔ)音識(shí)別功能的需求。
目前在嵌入式移動(dòng)平臺(tái)上實(shí)現(xiàn)離線語(yǔ)音識(shí)別的方法大致分為三大類(lèi):一是利用專(zhuān)用語(yǔ)音識(shí)別芯片,一是使用傳統(tǒng)的語(yǔ)音識(shí)別算法,一是移植訊飛、百度等大公司的語(yǔ)音庫(kù)。文獻(xiàn)[2]采用語(yǔ)音識(shí)別芯片內(nèi)集成語(yǔ)音識(shí)別算法,雖然使用時(shí)方便快捷,但是具有硬件成本高、識(shí)別詞簡(jiǎn)單固定等不足。傳統(tǒng)的語(yǔ)音識(shí)別算法包括文獻(xiàn)[3][4]采用的基于動(dòng)態(tài)時(shí)間規(guī)整(Dynamic Time Warping,DTW)的算法和文獻(xiàn)[5][6][7]采用的基于隱馬爾科夫模型(Hidden Markov Model,HMM)的算法等。DTW算法雖然在特定人、少量孤立詞識(shí)別方面具有較好的效果,但是無(wú)法適用非特定人、大量詞的識(shí)別;基于HMM的算法,則存在識(shí)別時(shí)間長(zhǎng)、識(shí)別率偏低的不足。若要移植大公司的離線語(yǔ)音庫(kù),則需要大量的存儲(chǔ)空間,不適用于存儲(chǔ)量有限的嵌入式平臺(tái),同時(shí),還需要支付不菲的庫(kù)使用費(fèi),大大增加了軟件成本。
本文通過(guò)研究設(shè)計(jì)一種基于深度學(xué)習(xí)的嵌入式離線語(yǔ)音識(shí)別系統(tǒng),在節(jié)省語(yǔ)音識(shí)別芯片帶來(lái)的硬件成本和離線庫(kù)帶來(lái)的軟件成本的同時(shí),還解決了傳統(tǒng)算法存在的只能適用于特定人、識(shí)別延遲高、識(shí)別率偏低等不足,為嵌入式離線語(yǔ)音識(shí)別提供了一種新的方案。
如圖1所示,系統(tǒng)主要由麥克風(fēng)、音頻編解碼芯片、嵌入式處理器、PC四部分組成。麥克風(fēng)采用的是型號(hào)為MP34DT01TR的MEMS數(shù)字麥克風(fēng),實(shí)現(xiàn)語(yǔ)音信號(hào)的錄入采集,輸出PDM格式的數(shù)字音頻信號(hào);音頻編解碼芯片采用的是型號(hào)為WM8994ECS的超低功耗保真編解碼芯片,用以接收麥克風(fēng)輸出的數(shù)字音頻信號(hào),并將信號(hào)編碼處理后輸出至嵌入式處理器;嵌入式處理器采用的是型號(hào)為STM32F746NGH6的嵌入式MCU,通過(guò)芯片的SAI接口與音頻解碼芯片連接,對(duì)輸入的音頻數(shù)據(jù)進(jìn)行處理識(shí)別,并將識(shí)別結(jié)果輸出至串口;由于嵌入式平臺(tái)有限的資源難以滿足基于深度學(xué)習(xí)的聲學(xué)模型訓(xùn)練的需求,因而利用PC實(shí)現(xiàn)聲學(xué)模型的訓(xùn)練。

圖1 系統(tǒng)總體架構(gòu)
文獻(xiàn)[8][9]提出的DS-CNN神經(jīng)網(wǎng)絡(luò)作為標(biāo)準(zhǔn)三維卷積的有效替代方案,已經(jīng)被用于在計(jì)算機(jī)視覺(jué)領(lǐng)域?qū)崿F(xiàn)緊湊的網(wǎng)絡(luò)架構(gòu)。DS-CNN的核心就是將原本標(biāo)準(zhǔn)的卷積操作因式分解成一個(gè)depthwise convolution和pointwise convolution(即一個(gè)1×1的卷積操作)。簡(jiǎn)單講就是將原來(lái)一個(gè)卷積層分成兩個(gè)卷積層,其中前面一個(gè)卷積層的每個(gè)卷積核都只與輸入的每個(gè)通道進(jìn)行卷積,后面一個(gè)卷積層則負(fù)責(zé)連接,即將上一層卷積的結(jié)果進(jìn)行合并。
若以M表示輸入特征的通道數(shù),N表示輸出特征的通道數(shù)(也是本層的卷積核個(gè)數(shù))。假設(shè)卷積核大小是DK×DK×M×N,輸出是DF×DF×N,那么標(biāo)準(zhǔn)卷積的計(jì)算量是DK×DK×M×N×DF×DF。去掉M×N,就變成一個(gè)二維卷積核去卷積一個(gè)二維輸入feature map;如果輸出feature map的尺寸是DF×DF,由于輸出feature map的每個(gè)點(diǎn)都是由卷積操作生成的,而每卷積一次就會(huì)有DK×DK個(gè)計(jì)算量,因此一個(gè)二維卷積核去卷積一個(gè)二維輸入feature map就有DF×DF×DK×DK個(gè)計(jì)算量;如果有M個(gè)輸入feature map和N個(gè)卷積核,就會(huì)有DF×DF×DK×DK×M×N個(gè)計(jì)算量。
DS-CNN則是將上述過(guò)程分為兩步。第一步用M個(gè)維度為DK×DK×1的卷積核去卷積對(duì)應(yīng)輸入的M個(gè)feature map,然后得到M個(gè)結(jié)果,而且這M個(gè)結(jié)果相互之間不累加。因此計(jì)算量是DF×DF×DK×DK×M,生成的結(jié)果是DF×DF×M。然后用N個(gè)維度為1×1×M的卷積核卷積第一步的結(jié)果,即輸入是DF×DF×M,最終得到DF×DF×N的feature map,計(jì)算量是DF×DF×1×1×M×N。即DS-CNN計(jì)算量為DF×DF×DK×DK×M+DF×DF×M×N。計(jì)算量與標(biāo)準(zhǔn)卷積計(jì)算量之比為:
以3×3的卷積核為例,卷積操作時(shí)間降到標(biāo)準(zhǔn)卷積的1/9。
可以看出,相較于標(biāo)準(zhǔn)的卷積神經(jīng)網(wǎng)絡(luò),DS-CNN大大減少了運(yùn)算量,這使得在資源有限的微控制器上可以實(shí)現(xiàn)更深和更寬的結(jié)構(gòu)。將DS-CNN神經(jīng)網(wǎng)絡(luò)應(yīng)用于語(yǔ)音識(shí)別的流程圖如圖2。

圖2 DS-CNN用于語(yǔ)音識(shí)別的流程圖
使用平均池,然后使用全連接層,提供全局交互,并減少最終層中的參數(shù)總數(shù)。
聲學(xué)模型訓(xùn)練采用Google speech commands dataset作為訓(xùn)練集,在Tensorflow框架中使用標(biāo)準(zhǔn)的交叉熵?fù)p失和adam優(yōu)化器進(jìn)行訓(xùn)練,批量大小為100,模型以20 000次迭代,初始學(xué)習(xí)率為5×10-4,并在第一個(gè)10 000 次迭代后減少到10-4。訓(xùn)練數(shù)據(jù)增加了背景噪音和高達(dá)100 ms的隨機(jī)時(shí)移,以模擬復(fù)雜的背景環(huán)境,提高系統(tǒng)的魯棒性。
利用ARM開(kāi)發(fā)的深度學(xué)習(xí)庫(kù)arm_nn建立DS-CNN神經(jīng)網(wǎng)絡(luò)框架,將聲學(xué)模型訓(xùn)練得到的各項(xiàng)模型參數(shù)輸入至該框架中相應(yīng)的位置。在后續(xù)新建嵌入式工程時(shí)移植已輸入聲學(xué)模型參數(shù)的DS-CNN神經(jīng)網(wǎng)絡(luò),即可完成聲學(xué)模型的移植。
按照常規(guī)方法,在Linux系統(tǒng)下利用ARM開(kāi)發(fā)的Mbed平臺(tái)開(kāi)發(fā)本系統(tǒng)的嵌入式程序。首先安裝Mbed,然后在Mbed平臺(tái)下編譯代碼。實(shí)際操作時(shí),發(fā)現(xiàn)兩個(gè)問(wèn)題:(1)Mbed部分指令不可用;(2)使用Mbed無(wú)法在線調(diào)試以便于定位程序中的BUG。因此,本文提出了另一種解決方法,即采用Windows 10環(huán)境下的Keil 5.12開(kāi)發(fā)本系統(tǒng)的嵌入式程序。方法如下:
在Keil中新建工程μVision Project,在“Options for Target→Device”中選擇芯片型號(hào)STM32F746NGHx;“Options for Target→C/C++”中的“Define”選項(xiàng)卡添加“STM32F7xx,USE_HAL_DRIVER,ARM_MATH_CM7,_CC_ARM,__FPU_PRESENT,_FPU_USED=1”,以使之支持stm327xx_hal庫(kù)和浮點(diǎn)運(yùn)算。然后再移植工程組件stm32fxx_hal庫(kù)和cmsis庫(kù),Arm開(kāi)發(fā)的適用于深度學(xué)習(xí)的arm_nn庫(kù),以及用于硬件浮點(diǎn)運(yùn)算的DSP庫(kù)。經(jīng)測(cè)試,該方法可以順利新建工程,并實(shí)現(xiàn)程序的正常編譯和在線調(diào)試。
此外,在開(kāi)發(fā)過(guò)程中,發(fā)現(xiàn)程序編譯時(shí)間過(guò)長(zhǎng),完整編譯一次程序竟需10 min左右,嚴(yán)重延緩了程序編譯和調(diào)試速度。研究發(fā)現(xiàn),該問(wèn)題是由移植的庫(kù)中冗余的文件引起的。因此,對(duì)移植的庫(kù)做出以下調(diào)整:
(1)對(duì)于stm327xx_hal庫(kù),注釋掉stm32f7xx_hal_conf.h文件中本系統(tǒng)未用到的外設(shè)的define項(xiàng),使程序編譯時(shí)略過(guò)相應(yīng)的外設(shè)庫(kù)文件,僅使能DMA、FLASH、SDRAM、GPIO、RCC、SAI、UART等外設(shè),如圖3所示。

圖3 stm32_f7xx_hal庫(kù)使能外設(shè)
(2)對(duì)于龐大的arm_nn庫(kù),僅保留建立DS-CNN神經(jīng)網(wǎng)絡(luò)時(shí)會(huì)用到的文件,如圖4所示。將其他文件從工程項(xiàng)目文件中移除。

圖4 DSP庫(kù)保留文件
經(jīng)過(guò)上述調(diào)整,程序編譯時(shí)間從10 min左右降為2 min左右,大大縮短了程序開(kāi)發(fā)時(shí)間。
為便于后續(xù)的信號(hào)處理,需要對(duì)輸入的音頻信號(hào)進(jìn)行分幀、加窗等預(yù)處理操作。采樣點(diǎn)數(shù)設(shè)置為16 000,分幀時(shí)設(shè)置幀長(zhǎng)為40 ms,幀移為20 ms。為了消除分幀造成的每幀音頻數(shù)據(jù)首尾的重疊現(xiàn)象,選用Hamming窗來(lái)對(duì)每幀音頻數(shù)據(jù)進(jìn)行加窗操作。
對(duì)音頻數(shù)據(jù)進(jìn)行分幀、加窗等預(yù)處理操作后,需要對(duì)每幀音頻數(shù)據(jù)進(jìn)行MFCC特征提取。具體步驟如下:
(1)對(duì)每幀音頻數(shù)據(jù),通過(guò)快速傅里葉變換(Fast Fourier Transform,FFT)得到對(duì)應(yīng)的頻譜。設(shè)置FFT運(yùn)算點(diǎn)數(shù)為2 048,通過(guò)FFT運(yùn)算得到每幀數(shù)據(jù)的實(shí)部和虛部,并以實(shí)部和虛部的平方和作為能量譜,獲得分布在時(shí)間軸上不同時(shí)間窗內(nèi)的頻譜;
(2)創(chuàng)建Mel三角濾波器組,對(duì)每幀音頻數(shù)據(jù)進(jìn)行Mel頻率轉(zhuǎn)換。設(shè)置Mel三角濾波器組數(shù)為40,通過(guò)Mel濾波器組將線性自然頻譜轉(zhuǎn)換為能體現(xiàn)人類(lèi)聽(tīng)覺(jué)特性的Mel頻譜;
(3)在Mel頻譜上進(jìn)行倒譜分析。對(duì)得到的Mel頻譜進(jìn)行取對(duì)數(shù)操作,并通過(guò)離散余弦變換(Discrete Cosine Transform,DCT)來(lái)實(shí)現(xiàn)Mel逆變換。取Mel逆變換后得到的第2~13個(gè)系數(shù)作為這幀語(yǔ)音的特征。
整體的特征提取流程如圖5所示。

圖5 MFCC特征提取流程圖
將提取的MFCC特征輸入到聲學(xué)模型中,利用arm_nn庫(kù)中的run_nn函數(shù)和arm_softmax_q7函數(shù)完成音頻特征的分類(lèi)過(guò)程。利用滑動(dòng)窗口對(duì)分類(lèi)結(jié)果進(jìn)行平均運(yùn)算,以得到平滑的分類(lèi)結(jié)果。根據(jù)分類(lèi)結(jié)果即可得到最終的識(shí)別結(jié)果。
將程序通過(guò)ST-Link下載到主頻為216 MHz的STM32F746NGH6微處理器中,并開(kāi)啟在線調(diào)試模式。程序運(yùn)行開(kāi)始,初始化系統(tǒng),并開(kāi)啟SAI外設(shè)和DMA通道,實(shí)時(shí)監(jiān)聽(tīng)麥克風(fēng)端的語(yǔ)音輸入。用USB接口連接嵌入式平臺(tái)與PC端串口接收程序,將識(shí)別結(jié)果輸出到PC端。測(cè)試時(shí),在麥克風(fēng)端說(shuō)出含有訓(xùn)練集中詞語(yǔ)的語(yǔ)句,即可在PC端串口接收程序的接收窗口內(nèi)看到相應(yīng)的語(yǔ)音識(shí)別輸出,如圖6所示。

圖6 語(yǔ)音識(shí)別結(jié)果串口打印
選取訓(xùn)練集中的50個(gè)詞,對(duì)選出的每個(gè)詞,分別在安靜環(huán)境和噪聲環(huán)境下進(jìn)行20次測(cè)試,計(jì)算平均識(shí)別時(shí)間和平均識(shí)別率。為了方便比較,在同樣的硬件平臺(tái)上,使用相同的訓(xùn)練集和測(cè)試樣本,應(yīng)用傳統(tǒng)的基于HMM的方法來(lái)進(jìn)行語(yǔ)音識(shí)別。
最終得出的測(cè)試結(jié)果如表1所示。

表1 語(yǔ)音識(shí)別測(cè)試結(jié)果
綜上所述,與基于DTW算法的嵌入式語(yǔ)音識(shí)別系統(tǒng)相比,本文所述方法可以突破特定人的限制,應(yīng)用在非特定人的語(yǔ)音識(shí)別上,大大擴(kuò)展了語(yǔ)音識(shí)別的應(yīng)用范圍;而與基于HMM算法的嵌入式語(yǔ)音識(shí)別系統(tǒng)相比,本文所述方法不但在識(shí)別時(shí)間上有所減少,在識(shí)別率上也有明顯提高。
本文基于深度學(xué)習(xí)和DS-CNN神經(jīng)網(wǎng)絡(luò),在嵌入式平臺(tái)上設(shè)計(jì)實(shí)現(xiàn)了離線語(yǔ)音識(shí)別系統(tǒng)。與現(xiàn)有的基于傳統(tǒng)算法的嵌入式離線語(yǔ)音識(shí)別系統(tǒng)相比,提高了識(shí)別率,減短了識(shí)別延遲;與基于專(zhuān)用語(yǔ)音識(shí)別芯片或離線語(yǔ)音庫(kù)的嵌入式離線語(yǔ)音識(shí)別系統(tǒng)相比,則節(jié)約了硬件或軟件成本。測(cè)試結(jié)果表明,系統(tǒng)能較好地實(shí)現(xiàn)嵌入式離線語(yǔ)音識(shí)別功能,在節(jié)約軟硬件成本的同時(shí),減少了識(shí)別時(shí)間,提高了識(shí)別率,是一種有效的嵌入式離線語(yǔ)音識(shí)別方案。