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





