使用Edge Impulse和麥克風(fēng)構(gòu)建完全離線的ESP32語(yǔ)音助手
掃描二維碼
隨時(shí)隨地手機(jī)看文章
語(yǔ)音接口已經(jīng)成為與電子產(chǎn)品交互的最直觀的方式之一。然而,大多數(shù)語(yǔ)音識(shí)別系統(tǒng)依賴(lài)于云服務(wù)、互聯(lián)網(wǎng)接入和外部api。這會(huì)帶來(lái)延遲、隱私問(wèn)題和持續(xù)的服務(wù)限制。如果你能建立一個(gè)完全離線的語(yǔ)音助手,直接在微控制器上運(yùn)行呢?
在這個(gè)項(xiàng)目中,我們將ESP32變成一個(gè)完全由Edge Impulse驅(qū)動(dòng)的獨(dú)立離線語(yǔ)音識(shí)別模塊。與基于互聯(lián)網(wǎng)的平臺(tái)不同,這種方法允許在ESP32的雙核240 MHz處理器上進(jìn)行本地推理。結(jié)果是一個(gè)完全獨(dú)立的語(yǔ)音激活系統(tǒng),能夠在不向云發(fā)送音頻的情況下識(shí)別喚醒詞和命令分類(lèi)。
您將使用ESP32、INMP441 I2S麥克風(fēng)、用于數(shù)據(jù)集訓(xùn)練的Edge Impulse和直接通過(guò)Arduino IDE部署的輕量級(jí)神經(jīng)網(wǎng)絡(luò)來(lái)構(gòu)建嵌入式語(yǔ)音識(shí)別管道。到最后,您將擁有一個(gè)完整的語(yǔ)音助手,通過(guò)“開(kāi)”,“關(guān)”等命令控制led,以及“馬文”等喚醒詞。
這是一個(gè)完整的工程級(jí)指南,適用于制造商,嵌入式開(kāi)發(fā)人員和ML工程師,他們希望實(shí)際介紹基于邊緣的語(yǔ)音識(shí)別。
項(xiàng)目的特性
基于原始文檔,這個(gè)ESP32語(yǔ)音轉(zhuǎn)文本系統(tǒng)提供:
?完全離線語(yǔ)音識(shí)別
?自定義喚醒詞和命令檢測(cè)
?實(shí)時(shí)ML推理
?沒(méi)有云,沒(méi)有API調(diào)用,沒(méi)有網(wǎng)絡(luò)依賴(lài)
?低延遲(總計(jì)200-500 ms)
?低功率運(yùn)行
?可擴(kuò)展架構(gòu),支持更多命令
嵌入式機(jī)器學(xué)習(xí)、數(shù)字音頻捕獲和ESP32處理的結(jié)合使這成為一個(gè)緊湊但功能強(qiáng)大的邊緣計(jì)算演示。
INMP441由于其低噪聲,MEMS結(jié)構(gòu)和數(shù)字I2S接口而被使用,使其成為音頻推理的理想選擇。
系統(tǒng)架構(gòu)概述
?ESP32語(yǔ)音助理系統(tǒng)遵循這個(gè)工作流程
?音頻采集(INMP441→ESP32 I2S)
?預(yù)處理(MFCC或光譜特征)
?神經(jīng)網(wǎng)絡(luò)推理(邊緣脈沖模型)
?喚醒詞決策邏輯
?命令的分類(lèi)
?LED輸出執(zhí)行
這種混合管道允許ESP32連續(xù)偵聽(tīng)喚醒字,然后解釋后續(xù)命令。
步驟1:數(shù)據(jù)集收集
本項(xiàng)目使用谷歌Speech Commands V2數(shù)據(jù)集:本項(xiàng)目使用谷歌Speech Commands V2數(shù)據(jù)集
?噪音
?馬文(喚醒詞)
?開(kāi)
?關(guān)
您還可以記錄自定義剪輯或擴(kuò)展多語(yǔ)言數(shù)據(jù)。如文中所述,現(xiàn)實(shí)世界的準(zhǔn)確性可以通過(guò)以下方式提高:
?多個(gè)揚(yáng)聲器
?不同的口音
?各種背景條件
?與麥克風(fēng)的距離不同
Edge Impulse接受批量上傳,基于文件夾的導(dǎo)入,以及每個(gè)聲音類(lèi)別的標(biāo)簽。
步驟2:訓(xùn)練邊緣脈沖下的語(yǔ)音識(shí)別模型
本節(jié)源自源文檔中的分步接口說(shuō)明
?創(chuàng)建你的Edge沖動(dòng)項(xiàng)目
?登錄
創(chuàng)建一個(gè)新項(xiàng)目
將其命名為ESP32_STT_Recognition之類(lèi)的東西
上傳音頻數(shù)據(jù)集
使用數(shù)據(jù)采集→添加數(shù)據(jù)→上傳數(shù)據(jù),為每個(gè)標(biāo)記的類(lèi)選擇文件夾。正確的標(biāo)簽對(duì)于準(zhǔn)確的關(guān)鍵詞分類(lèi)是必不可少的。
設(shè)計(jì)沖動(dòng)
沖動(dòng)設(shè)計(jì)下:
?添加音頻(MFCC)處理塊
?添加分類(lèi)學(xué)習(xí)塊
?選擇1秒的窗口大小
?訓(xùn)練模型
設(shè)置:
?訓(xùn)練周期:50-100次
?學(xué)習(xí)率:默認(rèn)
?驗(yàn)證分割:自動(dòng)
點(diǎn)擊“保存并訓(xùn)練”。
您將收到訓(xùn)練輸出圖表,準(zhǔn)確性指標(biāo)和混淆矩陣。
驗(yàn)證模型
使用所有分類(lèi)對(duì)保留的數(shù)據(jù)集進(jìn)行測(cè)試。目的:
?85%以上用于原型設(shè)計(jì)
?90%以上用于生產(chǎn)
步驟3:將模型部署到ESP32
從源文件中的部署說(shuō)明中獲取
?打開(kāi)部署
?選擇arduino Library并單擊Build
?下載ZIP文件
?通過(guò)Sketch→Include Library→Add.ZIP Library安裝
這將完整的神經(jīng)網(wǎng)絡(luò)推理引擎添加到Arduino IDE中。
步驟4:硬件布線
布線信息取自文件中的布線表和引腳圖以及麥克風(fēng)引腳部分。布線信息取自文件中的布線表和引腳圖
麥克風(fēng)接線(INMP441)
INMP441引腳
?L / R
?WS
?SCK
?SD
?VDD
?GND
LED布線
?指示燈LED→GPIO23→220 Ω→GND
?命令LED→GPIO22→220 Ω→GND
步驟5:基本代碼和完全修改的代碼
原始文件包括測(cè)試示例和擴(kuò)展的生產(chǎn)就緒代碼。
I2S音頻配置
從文件的代碼塊中
核心數(shù)據(jù)緩沖結(jié)構(gòu)
從原始代碼部分
信心的閾值
步驟6:實(shí)時(shí)測(cè)試
上傳代碼后打開(kāi)串口監(jiān)視器。
您將看到類(lèi)似如下的輸出:
這為每個(gè)檢測(cè)到的單詞提供了實(shí)時(shí)分類(lèi)置信度。
結(jié)論
你現(xiàn)在有一個(gè)完整的離線ESP32語(yǔ)音識(shí)別使用邊緣脈沖,能夠檢測(cè)喚醒詞和執(zhí)行語(yǔ)音命令完全在設(shè)備上。該項(xiàng)目展示了嵌入式機(jī)器學(xué)習(xí)的功能,并可作為語(yǔ)音控制物聯(lián)網(wǎng)系統(tǒng)、家庭自動(dòng)化、機(jī)器人和可訪問(wèn)設(shè)備的理想起點(diǎn)。
該系統(tǒng)是完全可擴(kuò)展的:收集更多的語(yǔ)音樣本,重新訓(xùn)練,并重新部署新的模型到您的ESP32。
本文編譯自hackster.io





