蘇自清,李國(guó)欣
(中國(guó)礦業(yè)大學(xué) 電氣學(xué)院,江蘇 徐州 221116)
人工智能從1956年達(dá)特茅斯會(huì)議上第一次被提出開(kāi)始,經(jīng)歷了萌芽、發(fā)展、質(zhì)疑、沉寂、再發(fā)展等階段,現(xiàn)階段人工智能正實(shí)實(shí)在在地影響著人們生活的方方面面。機(jī)器學(xué)習(xí)(Machine Learning)是人工智能的重要分支[1],通過(guò)使用大量數(shù)據(jù)訓(xùn)練神經(jīng)網(wǎng)絡(luò),使得系統(tǒng)具備學(xué)習(xí)新事物的能力,能夠理解相關(guān)新情況并做出有效的決策,可以說(shuō)機(jī)器學(xué)習(xí)應(yīng)用幾乎已經(jīng)遍布人工智能的所有領(lǐng)域。雖然大多數(shù)機(jī)器學(xué)習(xí)的訓(xùn)練都發(fā)生在強(qiáng)大的云端服務(wù)器上,但是隨著嵌入式系統(tǒng)內(nèi)部微控制器處理能力的不斷增強(qiáng),人們對(duì)把機(jī)器學(xué)習(xí)模型部署到微控制器內(nèi)越來(lái)越感興趣,由此TinyML(Tiny Machine Learning,微型機(jī)器學(xué)習(xí))誕生了[2],旨在實(shí)現(xiàn)機(jī)器學(xué)習(xí)模型和深度學(xué)習(xí)算法在低內(nèi)存、價(jià)格親民、低功耗的微控制器上運(yùn)行。直接在微處理器中嵌入人工智能,逐漸成為消費(fèi)和工業(yè)物聯(lián)網(wǎng)場(chǎng)景的關(guān)鍵。這種方法并不依賴于外部程序,也不依賴邊緣和云端,能夠提供最佳的實(shí)時(shí)響應(yīng),同時(shí)也能為人們的隱私提供極大保護(hù)。
雖然機(jī)器學(xué)習(xí)在云端平臺(tái)已經(jīng)有了廣泛應(yīng)用,但在微控制器端的應(yīng)用卻很有限,語(yǔ)音識(shí)別在微小型機(jī)器人、機(jī)器小車(chē)平臺(tái)上也有巨大的需求。本文研究了TinyML 的實(shí)現(xiàn)流程;采用極簡(jiǎn)的低功耗微控制器和麥克風(fēng)傳感器等硬件元器件,對(duì)音頻文件進(jìn)行預(yù)處理,并通過(guò)深度學(xué)習(xí)訓(xùn)練音頻樣本文件,經(jīng)過(guò)驗(yàn)證和測(cè)試后生成相關(guān)模型;最后在微控制器上部署,實(shí)現(xiàn)了語(yǔ)音命令的采集、處理、識(shí)別功能;利用語(yǔ)音識(shí)別的結(jié)果,驅(qū)動(dòng)伺服電機(jī)實(shí)現(xiàn)小車(chē)的前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)等動(dòng)作,從而在更基礎(chǔ)層面實(shí)現(xiàn)微控制器端的機(jī)器學(xué)習(xí)的部署和應(yīng)用。
目前,語(yǔ)音識(shí)別技術(shù)在Android 平臺(tái)、機(jī)器人交換等領(lǐng)域的應(yīng)用非常廣泛,但是在微控制器端的應(yīng)用卻相對(duì)較少,因此本文的設(shè)計(jì)目的是把微控制器和關(guān)鍵詞識(shí)別結(jié)合起來(lái),在微控制器端部署機(jī)器學(xué)習(xí)模型對(duì)關(guān)鍵詞進(jìn)行識(shí)別,通過(guò)驅(qū)動(dòng)小車(chē)的載體驗(yàn)證識(shí)別結(jié)果的準(zhǔn)確性、穩(wěn)定性和可靠性。系統(tǒng)的總體設(shè)計(jì)思路如下:
第一步,遴選要識(shí)別的關(guān)鍵詞,根據(jù)驅(qū)動(dòng)小車(chē)要實(shí)現(xiàn)的動(dòng)作,確定將谷歌語(yǔ)音數(shù)據(jù)集Speech Commands Data Set的音頻文件作為訓(xùn)練、驗(yàn)證和測(cè)試的樣本數(shù)據(jù),給關(guān)鍵詞的音頻數(shù)據(jù)文件設(shè)置相應(yīng)的標(biāo)簽。
第二步,在PC 端對(duì)音頻文件進(jìn)行預(yù)處理,包括提取音頻文件的采樣率,再對(duì)其進(jìn)行時(shí)域到頻域的轉(zhuǎn)換,然后通過(guò)短時(shí)傅里葉變換提取特征頻譜圖。
第三步,將音頻文件對(duì)應(yīng)的頻譜圖輸入到機(jī)器學(xué)習(xí)模型中,并對(duì)模型進(jìn)行訓(xùn)練、驗(yàn)證、測(cè)試、優(yōu)化,從中找出最適合本系統(tǒng)的機(jī)器學(xué)習(xí)模型。
第四步,模型轉(zhuǎn)換。通過(guò)使用TensorFlow Lite 和TensorFlow Lite Converter運(yùn)行并轉(zhuǎn)換模型,生成一個(gè)保留原有性能但是模型規(guī)模大小降低的文件,使得訓(xùn)練過(guò)的模型適用于微控制器小內(nèi)存的環(huán)境。
第五步,訓(xùn)練模型轉(zhuǎn)換為包含TensorFlow Lite 模型的C源文件。由于微控制器大多沒(méi)有本地文件系統(tǒng)的支持,因此轉(zhuǎn)換后的C 源文件包含一個(gè)char 類(lèi)型的C 數(shù)組,將其整合到微控制器端的應(yīng)用程序中。
第六步,利用微控制器端麥克風(fēng)傳感器采集包含關(guān)鍵詞的實(shí)時(shí)語(yǔ)音信號(hào),經(jīng)過(guò)模數(shù)轉(zhuǎn)換等預(yù)處理以及快速傅里葉變換后提取相關(guān)特征,經(jīng)由部署在微控制器端的機(jī)器學(xué)習(xí)模型進(jìn)行計(jì)算,獲取關(guān)鍵詞的概率,從而判斷輸出對(duì)應(yīng)的關(guān)鍵詞,控制電機(jī)做出規(guī)定的動(dòng)作。
根據(jù)語(yǔ)音控制小車(chē)的設(shè)計(jì)目標(biāo)和總體設(shè)計(jì)思路,本系統(tǒng)可以分為訓(xùn)練、轉(zhuǎn)換和應(yīng)用三部分。訓(xùn)練部分主要是訓(xùn)練機(jī)器學(xué)習(xí)模型并驗(yàn)證和測(cè)試,包含兩個(gè)模塊,分別為音頻數(shù)據(jù)獲取模塊和機(jī)器學(xué)習(xí)訓(xùn)練模塊。轉(zhuǎn)換部分主要是優(yōu)化訓(xùn)練模型,生成適合微控制器運(yùn)行環(huán)境的模型。應(yīng)用部分用于小車(chē)端關(guān)鍵詞識(shí)別,包括兩個(gè)模塊,實(shí)時(shí)關(guān)鍵詞識(shí)別模塊和電機(jī)驅(qū)動(dòng)控制模塊。總體結(jié)構(gòu)如圖1所示。
圖1 中的訓(xùn)練、轉(zhuǎn)換、應(yīng)用三部分通過(guò)將訓(xùn)練好的機(jī)器學(xué)習(xí)模型轉(zhuǎn)換后部署在微控制器應(yīng)用部分建立聯(lián)系。訓(xùn)練和轉(zhuǎn)換部分可以在PC 端實(shí)現(xiàn);直觀上,應(yīng)用部分的每個(gè)實(shí)時(shí)語(yǔ)音要完整地經(jīng)歷輸入、識(shí)別、特征提取、機(jī)器學(xué)習(xí)模型計(jì)算等4 個(gè)環(huán)節(jié),相對(duì)耗時(shí)比較多,若被識(shí)別為關(guān)鍵詞,需要立刻轉(zhuǎn)化為電機(jī)驅(qū)動(dòng)信號(hào),保證整個(gè)系統(tǒng)的實(shí)時(shí)性是非常關(guān)鍵的。因此考慮在微控制器端加入實(shí)時(shí)的嵌入式操作系統(tǒng)FreeRTOS,以實(shí)現(xiàn)多個(gè)任務(wù)在宏觀上的并行運(yùn)行。
圖1 系統(tǒng)總體結(jié)構(gòu)
機(jī)器學(xué)習(xí)涉及最多的就是對(duì)多種格式的數(shù)據(jù)進(jìn)行處理。在音頻數(shù)據(jù)分析領(lǐng)域,可以對(duì)音頻數(shù)據(jù)進(jìn)行很多操作,比如自動(dòng)語(yǔ)音識(shí)別、數(shù)字信號(hào)處理、音樂(lè)分類(lèi)等。在本文中將嘗試分析音頻數(shù)據(jù),通過(guò)對(duì)音頻數(shù)據(jù)的深度學(xué)習(xí),建立框架,識(shí)別相應(yīng)的語(yǔ)言命令。
小車(chē)是通過(guò)接收并識(shí)別語(yǔ)音關(guān)鍵詞來(lái)驅(qū)動(dòng)的,意味著每一個(gè)關(guān)鍵詞對(duì)應(yīng)獨(dú)一無(wú)二的小車(chē)動(dòng)作。因此,本課題選擇4個(gè)關(guān)鍵詞,分別是:left(左轉(zhuǎn)),right(右轉(zhuǎn)),forward(前進(jìn)),backward(后退)。對(duì)除此以外的其他語(yǔ)音輸入小車(chē)均無(wú)響應(yīng)。針對(duì)所選的關(guān)鍵詞,為了有效地進(jìn)行語(yǔ)音數(shù)據(jù)的機(jī)器學(xué)習(xí),需要有包含關(guān)鍵詞的大量樣本數(shù)據(jù)。本文采用谷歌公司推出的Speech Commands Data Set語(yǔ)音數(shù)據(jù)集(以下簡(jiǎn)稱“谷歌語(yǔ)音數(shù)據(jù)集”)[3]。
在采用機(jī)器學(xué)習(xí)模型對(duì)音頻數(shù)據(jù)進(jìn)行訓(xùn)練時(shí),最大的挑戰(zhàn)是如何處理音頻文件使之適合機(jī)器學(xué)習(xí)。音頻數(shù)據(jù)作為一種非結(jié)構(gòu)化的數(shù)據(jù)形式,使用它之前需要對(duì)其進(jìn)行結(jié)構(gòu)化處理,一種常用的方法是提取音頻數(shù)據(jù)的頻譜圖特征,再對(duì)音頻文件對(duì)應(yīng)的頻譜圖進(jìn)行機(jī)器學(xué)習(xí)模型的訓(xùn)練。語(yǔ)音數(shù)據(jù)機(jī)器學(xué)習(xí)模型訓(xùn)練共分為以下四個(gè)階段:
第一階段:對(duì)音頻文件進(jìn)行預(yù)處理。
第二階段:對(duì)預(yù)處理的音頻文件進(jìn)行短時(shí)傅里葉變換(Short Time Fourier Transform,STFT),生成頻譜圖(spectrogram),具體生成numpy格式的訓(xùn)練集、驗(yàn)證集和測(cè)試集頻譜圖。
第三階段:在PC 端構(gòu)建深度學(xué)習(xí)網(wǎng)絡(luò),對(duì)頻譜圖進(jìn)行機(jī)器學(xué)習(xí)訓(xùn)練,并對(duì)模型進(jìn)行驗(yàn)證和評(píng)估。
第四階段:對(duì)評(píng)估性能良好的模型進(jìn)行轉(zhuǎn)化,生成適合微控制器運(yùn)行模型的文件。
語(yǔ)音數(shù)據(jù)機(jī)器學(xué)習(xí)模型訓(xùn)練流程如圖2所示。
圖2 語(yǔ)音數(shù)據(jù)機(jī)器學(xué)習(xí)模型訓(xùn)練流程
預(yù)處理主要是對(duì)音頻數(shù)據(jù)進(jìn)行降噪、引入背景音等操作,豐富語(yǔ)音數(shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)增強(qiáng)。實(shí)現(xiàn)機(jī)器學(xué)習(xí)的一個(gè)重要手段是構(gòu)建深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Networks,DNN)。與利用深度神經(jīng)網(wǎng)絡(luò)對(duì)圖片進(jìn)行識(shí)別、分類(lèi)不同的是:圖片預(yù)處理的方式相對(duì)簡(jiǎn)單,甚至可以直接輸入深度神經(jīng)網(wǎng)絡(luò)。而開(kāi)發(fā)語(yǔ)音識(shí)別應(yīng)用時(shí),需要充分利用已知的音頻數(shù)據(jù)特性,處理并生成音頻數(shù)據(jù)的特征編碼,然后再提供給DNN,一種常用的方法是把音頻信號(hào)轉(zhuǎn)換為頻譜圖。通常有兩種方法來(lái)表示聲音:時(shí)域(Time domain)和頻域(Frequency domain)[4]。針對(duì)時(shí)域,通常用橫軸表示自變量時(shí)間,縱軸表示信號(hào)變換,表達(dá)信號(hào)隨著時(shí)間的變化。時(shí)間被認(rèn)為是時(shí)域中的一個(gè)獨(dú)立變量,它展示了信號(hào)如何隨時(shí)間變化。相反,頻域?qū)⑿盘?hào)的頻率視為自變量,它顯示了在一個(gè)頻率范圍內(nèi)每個(gè)頻帶中有多少信號(hào)。頻譜圖(spectrogram)是通過(guò)時(shí)域信號(hào)的計(jì)算顯示信號(hào)頻率隨時(shí)間的變化,是將音頻信息表示為一系列頻率信息切片的標(biāo)準(zhǔn)方式,每個(gè)時(shí)間窗口為一個(gè)切片。通過(guò)將這些組合成一個(gè)序列,它們隨著時(shí)間的推移形成獨(dú)特的聲音指紋[5]。
通常采用短時(shí)傅里葉變換實(shí)現(xiàn)音頻信號(hào)轉(zhuǎn)換。短時(shí)傅里葉變換是將要轉(zhuǎn)換的信號(hào)函數(shù)乘以一個(gè)在短時(shí)片段上非零的窗口函數(shù),對(duì)信號(hào)函數(shù)進(jìn)行一維傅里葉變換,當(dāng)窗口沿時(shí)間軸滑動(dòng)時(shí)得到一系列的傅里葉變換頻域值,將這些頻域值依次按時(shí)間展開(kāi),從而得到一個(gè)二維的時(shí)頻圖[6]。
在離散傅里葉變換公式的基礎(chǔ)上,把要轉(zhuǎn)換的原始信號(hào)分成較短的等長(zhǎng)片段,然后在每個(gè)片段上分別進(jìn)行傅里葉變換。生成時(shí)頻域內(nèi)的復(fù)數(shù)矩陣,公式為:
短時(shí)傅里葉變換原理描述如圖3所示。
圖3 短時(shí)傅里葉變換原理描述
對(duì)一段連續(xù)的音頻信號(hào)進(jìn)行短時(shí)傅里葉變換要確定如下參數(shù):
(1)加窗:短時(shí)傅里葉變換的核心就是加窗,把整個(gè)時(shí)域信號(hào)過(guò)程分解成若干個(gè)等長(zhǎng)的小過(guò)程,這樣就保證每個(gè)小過(guò)程為近似平穩(wěn)信號(hào)。圖3 中的window size 即為設(shè)置的窗口大小,當(dāng)信號(hào)中最后一個(gè)開(kāi)窗大于原始信號(hào)長(zhǎng)度時(shí),對(duì)原始信號(hào)進(jìn)行補(bǔ)零以匹配窗口長(zhǎng)度。
(2)滑動(dòng)步長(zhǎng)(hop size,H):主要涉及到信號(hào)重疊頻點(diǎn),重疊的主要原因是為了減少邊界處的偽跡。
(3)窗口的序號(hào)m:如圖3所示加了三個(gè)窗口,m依次為1、2、3。
(4)一個(gè)窗口內(nèi)離散采樣點(diǎn)的數(shù)量N。
(5)窗函數(shù)w[n]:是頻譜分析中的一個(gè)重要部分。對(duì)原始的非平穩(wěn)信號(hào)截取時(shí)會(huì)發(fā)生頻譜泄露,為了解決這一問(wèn)題,通過(guò)對(duì)截取信號(hào)進(jìn)行加窗處理降低頻譜中因泄露而造成的測(cè)量不準(zhǔn)確性。窗函數(shù)既可以加在時(shí)域上,也可以加在頻域上,通常的做法是加在時(shí)域上。加窗在時(shí)域上是點(diǎn)乘的形式,在頻域上則表現(xiàn)為卷積。一個(gè)理想的窗函數(shù)應(yīng)該是在頻域的主瓣非常窄,保證有足夠的頻率分辨率,而旁瓣則要求非常低,降低頻率之間的干擾。但在實(shí)際應(yīng)用中,窗口函數(shù)很難同時(shí)滿足主瓣和旁瓣性能最佳要求,通常在這兩種中取得平衡。常見(jiàn)的窗函數(shù)有矩形窗(rectangular)、Hanning(漢寧)、Gaussian(高斯)等。矩形窗的優(yōu)點(diǎn)是主瓣比較集中,頻率分辨率最高,不足之處是旁瓣也較高。Hanning 窗又稱升余弦窗,主瓣變寬,頻率分辨率下降;旁瓣減少,可有效獲知頻譜泄露[7]。Hanning 窗函數(shù)如圖4所示,具體公式為:
圖4 Hanning 窗函數(shù)
Gaussian 窗主瓣較寬,頻率分辨率低,沒(méi)有負(fù)旁瓣。綜合比較而言,Hanning 窗函數(shù)是短時(shí)傅里葉變換的首選窗函數(shù)。
圖5 是Speech command 數(shù)據(jù)集中的left/00b01445_nohash_0.wav 文件波形圖和頻譜圖。圖5(b)是調(diào)用TensorFlow 框架中tf.signal.stft 函數(shù)生成的頻譜圖,圖5(c)是調(diào)用librosa.stft 函數(shù)生成的頻譜圖,兩幅頻譜圖雖然顏色不同,但是圖5(b)和圖5(c)明亮部分都準(zhǔn)確顯示了時(shí)域內(nèi)頻率的分布情況。頻譜圖中顏色較亮的部分比顏色較暗的部分集中了更多的聲音,顏色較暗部分的聲音幾乎是空白的。
圖5 聲音文件的波形圖和短時(shí)傅里葉變換生成的頻譜圖
構(gòu)建深度學(xué)習(xí)網(wǎng)絡(luò)主要包括導(dǎo)入頻譜圖、預(yù)處理、構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)、訓(xùn)練模型和驗(yàn)證模型等步驟,具體如下:
步驟1:調(diào)用np.load 導(dǎo)入訓(xùn)練、驗(yàn)證和測(cè)試集數(shù)據(jù)。
步驟2:預(yù)處理,為訓(xùn)練、驗(yàn)證和測(cè)試集標(biāo)簽獨(dú)立編碼,設(shè)置batch_size并創(chuàng)建train_dataset、validation_dataset和test_dataset。
步驟3:構(gòu)建卷積神經(jīng)網(wǎng)絡(luò),由輸入層、卷積層、池化層、Flatten 層、Dropout 層、全連接層和輸出層組成[8]。語(yǔ)音數(shù)據(jù)卷積神經(jīng)網(wǎng)絡(luò)組成如圖6所示。
圖6 卷積神經(jīng)網(wǎng)絡(luò)組成
模型訓(xùn)練結(jié)果如圖7所示。從圖7 中可以看出,隨著一個(gè)完整的數(shù)據(jù)集在神經(jīng)網(wǎng)絡(luò)中前向傳播和反向傳播次數(shù)的增多(10個(gè)epoch),一方面,訓(xùn)練集和驗(yàn)證集的準(zhǔn)確率不斷提高,達(dá)到92%左右,loss 在不斷降低;另一方面,兩者的準(zhǔn)確率和loss 趨于接近,說(shuō)明模型很好地處理了過(guò)擬合問(wèn)題。
圖7 模型訓(xùn)練結(jié)果
基于前文所述的系統(tǒng)功能,小車(chē)系統(tǒng)硬件主要包括ESP32 微控制器模塊、INMP441 語(yǔ)音接收模塊[9]和360°舵機(jī)驅(qū)動(dòng)模塊。
ESP32 端程序主要由應(yīng)用層、驅(qū)動(dòng)層和神經(jīng)網(wǎng)絡(luò)部署層共三層組成,如圖8所示。
圖8 微控制器端程序結(jié)構(gòu)
應(yīng)用層主要由4 個(gè)模塊組成,利用FreeRTOS 創(chuàng)建并開(kāi)啟系統(tǒng)運(yùn)行總體任務(wù)[10];硬件引腳配置模塊主要完成I2S 引腳的設(shè)定和參數(shù)設(shè)置;語(yǔ)音命令監(jiān)測(cè)模塊完成語(yǔ)音輸入和處理、神經(jīng)網(wǎng)絡(luò)初始化的工作以及開(kāi)啟利用神經(jīng)網(wǎng)絡(luò)對(duì)輸入關(guān)鍵詞進(jìn)行識(shí)別的任務(wù);電機(jī)驅(qū)動(dòng)模塊根據(jù)識(shí)別的關(guān)鍵詞結(jié)果設(shè)置驅(qū)動(dòng)命令隊(duì)列,通過(guò)調(diào)整2 路PWM 輸出驅(qū)動(dòng)左右兩輪。
驅(qū)動(dòng)層由兩個(gè)模塊組成。語(yǔ)音數(shù)據(jù)輸入包括從I2S 端口讀入采樣數(shù)據(jù)并加入至樣本隊(duì)列,啟動(dòng)采樣任務(wù)并不斷取出樣本隊(duì)列中的語(yǔ)音數(shù)據(jù);語(yǔ)音數(shù)據(jù)處理模塊對(duì)采樣數(shù)據(jù)進(jìn)行短時(shí)傅里葉變換生成頻譜圖數(shù)據(jù)。
神經(jīng)網(wǎng)絡(luò)部署層由兩個(gè)模塊組成。神經(jīng)網(wǎng)絡(luò)部署模塊包括從PC 端獲取的訓(xùn)練好的模型轉(zhuǎn)換數(shù)組,建立微控制器端的神經(jīng)網(wǎng)絡(luò)模型,并根據(jù)模型轉(zhuǎn)換數(shù)組在本地端進(jìn)行解析。TFLite 內(nèi)核模塊包括TensorFlow 框架版本信息和TFLite 提供的內(nèi)核以及第三方的一些支持文件。
本文構(gòu)建了一個(gè)基于微控制端TinyML 的語(yǔ)音識(shí)別系統(tǒng),利用其識(shí)別結(jié)果控制小車(chē)運(yùn)動(dòng),從而驗(yàn)證語(yǔ)音識(shí)別的效果。具體開(kāi)展了以下工作:(1)研究了TinyML 的特點(diǎn)和流程,提出了在小車(chē)端基于微型機(jī)器學(xué)習(xí)實(shí)現(xiàn)語(yǔ)音關(guān)鍵詞識(shí)別的總體設(shè)計(jì);(2)基于谷歌語(yǔ)音集,選擇合適的關(guān)鍵詞,在PC 端對(duì)關(guān)鍵詞進(jìn)行了預(yù)處理;通過(guò)短時(shí)傅里葉變換,把語(yǔ)音數(shù)據(jù)轉(zhuǎn)換為頻譜圖;(3)構(gòu)建深度神經(jīng)網(wǎng)絡(luò),對(duì)頻譜圖進(jìn)行模型訓(xùn)練并驗(yàn)證、分類(lèi),并轉(zhuǎn)換為T(mén)FLite;(4)設(shè)計(jì)了基于ESP32 微控制器的小車(chē)系統(tǒng),實(shí)現(xiàn)語(yǔ)音識(shí)別控制小車(chē);(5)采用TensorFlow TFLite 框架,實(shí)現(xiàn)TinyML 全流程。