設(shè)計一個基于邊緣人工智能的語音控制爐,實現(xiàn)Picovoice,人工智能生成的語音識別模型和PSoC 6單片機
Edge AI智能爐子,可以通過語音命令和交互式語音反饋UI(如Alexa)操作,無需互聯(lián)網(wǎng)連接。
想象一下,一個廚師在準備沙拉或做面團的時候正在烹飪一些東西,現(xiàn)在他/她可能需要調(diào)整爐子上的加熱。在這種情況下,語音控制的爐子/烤箱對廚師/廚師來說非常有用。在任何情況下,用戶的雙手都在忙著做事情是利用語音控制應(yīng)用程序的最佳方案。
不幸的是,現(xiàn)有的解決方案是連接的解決方案,比如Alexa或谷歌云連接烤箱之類的東西。但是,為什么要讓他們知道你做什么,什么時候做呢?此外,用戶需要為設(shè)備設(shè)置wifi連接并下載另一個應(yīng)用程序!這對許多用戶來說是一個很大的否定。
這是我的解決方案:邊緣人工智能語音控制爐,實現(xiàn)Picovoice。人工智能生成的語音識別模型和PSoC 6單片機。開箱即用!
這不是“物聯(lián)網(wǎng)”,而是“物外互聯(lián)網(wǎng)”,所以它仍然是一個物聯(lián)網(wǎng)(雙關(guān)語)。
特性
?聲控點火/火焰激活
?聲控火焰/加熱調(diào)節(jié)
?語音控制烹飪/燃燒器定時器設(shè)置
?交互式語音反饋UI確認
?語音控制關(guān)機
?邊緣人工智能語音識別,無云連接
?自然語言多命令操作
硬件
這些硬件用于建造這個項目:
PSoC?6 62S2 Wi-Fi BT先鋒套件(CY8CKIT-062S2-43012)
這是PSoC?62雙核MCU CY8C624ABZI-S2D44 (150-MHz Arm Cortex-M4和100-MHz Arm Cortex-M0+內(nèi)核)的開發(fā)板,具有2MB閃存。它的功能強大到可以在沒有互聯(lián)網(wǎng)連接的情況下運行語音識別人工智能
物聯(lián)網(wǎng)傳感擴展套件(CY8CKIT-028-SENSE)
物聯(lián)網(wǎng)感測擴展套件是一個可與先鋒套件一起使用的附加(屏蔽)板,該板具有用于音頻輸入的模擬/數(shù)字麥克風和用于音頻輸出的音頻編解碼器,這是本項目所需的
語音回放模塊
我最初的目標是使用物聯(lián)網(wǎng)感知套件的音頻編解碼器來播放語音UI消息,并在PSoC6上使用2MB閃存來存儲波文件。不幸的是,我無法使用Modustoolbox中提供的I2S音頻演示代碼。這就是為什么我決定使用我去年做的一個項目,它可以存儲多達1000個獨立的mp3格式的音頻信息,最長可達40分鐘。
這里是詳細的項目:倒計時語音計時器和起火器
它是使用費米子錄音/播放模塊,DFRobot甲蟲板和3瓦封閉式揚聲器。
我已經(jīng)更改了原始固件(附在下面),因此該模塊可以接收從PSoC 6發(fā)送的串行消息,并相應(yīng)地播放適當?shù)囊纛l消息。
權(quán)力SupplyModule
該模塊由LM7809線性穩(wěn)壓器和輸出5伏的DC-DC降壓轉(zhuǎn)換器模塊組成。我已經(jīng)使用9 Vdc輸出為PSoC6先鋒供電。Buck轉(zhuǎn)換器的5 Vdc用于為伺服電機和語音回放模塊提供足夠的電源。
金屬齒輪伺服電機
本項目采用了兩臺金屬齒輪伺服電機。其中一個伺服電機控制(燃料)氣體流量閥部分打開是必要的。當燃燒器需要關(guān)閉時,這個伺服電機可以完全關(guān)閉閥門。另一個伺服電機拉動點火桿產(chǎn)生火花點火。
便攜式煤氣爐
便攜式燃氣灶是一個小型的單燃燒器爐子,內(nèi)置peizo點火器,起動機和氣體流量調(diào)節(jié)閥。我選擇這個爐子是為了便于原型設(shè)計,因為它很容易把整個設(shè)置放在我的電腦附近,用一個小爐子來開發(fā)固件。當然,這個項目可以擴展到更大的,多燃燒器的爐子設(shè)置。
硬件建設(shè)
就像任何快速和低預(yù)算的原型一樣,我已經(jīng)用強力膠,熱熔膠,電纜扎帶和跳線組裝了硬件。主要目標是減少成本、時間和精力。
所有的部件按照這個示意圖連接:
其中一個伺服電機被超級粘在氣體調(diào)節(jié)閥上,像這樣:
另一個伺服電機是螺紋到peizo點火火花發(fā)電機杠桿這樣:
這就是串口TX線是如何在不修改Dev工具包的情況下被黑掉的:
所有部件用扎帶固定在一塊硬板上。跳線用于連接所有硬件部件。
modstoolbox編程&構(gòu)建語音AI模型
Modustoolbox
要對PSoC6先鋒套件進行編程,請下載并安裝Modustoolbox(MTB) SDK。我使用的是MTB 2.4版本,這個項目應(yīng)該避免使用MTB 2.1版本之前的任何版本。
安裝MTB后,您可能會遇到一些困難。確保在工具中添加路徑以使MTB正常工作。
以下是英飛凌的安裝指南,解釋了這個安裝過程:- modusool安裝指南
安裝了Modustoolbox(MTB)之后,讓我們首先開始進行語音識別演示。
運行MTB并單擊“快速開始”菜單中的“新建應(yīng)用程序”:
確保您的互聯(lián)網(wǎng)連接處于活動狀態(tài),因為這個過程將從Github下載示例應(yīng)用程序演示
從board Support Package菜單中選擇合適的平臺(PSoC 6)和正確的板(CY8CKIT-062S2-43012)
下一個。選擇Voice模板應(yīng)用,勾選demo項目“Picovoice E2E語音識別demo”,單擊“創(chuàng)建”
現(xiàn)在,打開Picovoice E2E語音識別演示代碼中的main.c文件。找到接受Picovoice訪問密鑰的線路,我們稍后會回到這里
保持MTB在后臺運行并打開web瀏覽器應(yīng)用程序,是時候使用Picovoice了。
Picovoice
Picovoice是構(gòu)建語音識別模型并在不同平臺上實現(xiàn)的最直觀的方法之一。簡單地說,你只需要輸入喚醒詞和語音到意圖詞,然后建立平臺特定的語音識別模型。一旦模型生成,下載并在您的嵌入式開發(fā)項目中實現(xiàn)語音識別模型。
以下步驟將解釋這一過程:
步驟0:創(chuàng)建一個新帳戶并登錄。此頁面將出現(xiàn)
步驟1:訪問鍵和UUID(唯一標識符)
首先點擊“Show AccessKey”,它將提供一個唯一的字符串,復(fù)制這個字符串并將其保存在一個文本文件中。這個訪問鍵在代碼中是必需的。
訪問鍵看起來像這樣(這是一個虛擬字符串):
該字符串必須在“ ”之間,并以;像這樣在代碼中:
為了制作語音識別模型,還需要一個信息,那就是設(shè)備UUID(在這種情況下是PSoC 6 (mcu)先鋒套件的UUID)。
復(fù)制Access Key字符串并粘貼/插入到之前像這樣打開的MTB演示代碼中:
現(xiàn)在,選擇演示項目并單擊構(gòu)建按鈕(錘子圖標)。
同時,構(gòu)建過程正在進行(需要一些時間),將PSoC6先鋒套件(+ IoT Sense Kit連接在其上)與USB電纜連接到計算機。
一旦構(gòu)建完成,點擊Green Play圖標來顯示代碼,確保選擇正確的程序員
Picovoice_E2E_Voice_Recognition_Program (KitProg3_MiniProg4)
現(xiàn)在,打開一個串口終端應(yīng)用程序,如Putty或TeraTerm,選擇正確的串口(例如:COM5),波特率115200
然后大聲說“嘿,皮科”
您應(yīng)該在串行監(jiān)視器上獲得響應(yīng),其中包含PSoC6先鋒套件的UUID,類似于以下內(nèi)容(十六進制數(shù)):
這個UUID將需要在Picovoice Console中創(chuàng)建語音識別模型。
現(xiàn)在。我們回到Picovoice控制臺。
步驟2:喚醒話語
Picovoice喚醒字是一個特殊的觸發(fā)字,它將激活設(shè)備。我要用這個詞:Hey Stove作為喚醒詞,因為這是一個語音控制的爐子。
轉(zhuǎn)到Picovoice控制臺的Porcupine選項
?類型短語:嘿,爐子
?選擇語言:英語
?選擇平臺:ARM Cortex-M
?選擇單板:PSoC6
?輸入之前的UUID/唯一標識符(十六進制數(shù))
接下來,單擊火車喚醒詞,在幾秒鐘內(nèi)你的喚醒詞訓練模型將準備好。下載訓練好的模型
您將得到一個下載的壓縮文件夾,將其解壓縮并使用任何文本編輯器(記事本)打開pv_porcupine_parms .h文件。這是喚醒詞模型,一個十六進制數(shù)的大數(shù)組。
稍后將詳細說明這一點。
步驟3:語音到意圖模型
喚醒詞“嘿,爐子”將激活設(shè)備,但它不會執(zhí)行任何爐子操作。我想打開爐子,關(guān)掉爐子,換煤氣/火焰,設(shè)置烹飪計時器等。我打算用我的爐子做一些事情。這就是需要語音到意圖引擎的地方。
Picovoice Rhino Speech-to-Intent引擎可以提取多個語音命令,這些命令可以用于執(zhí)行不同的操作。
轉(zhuǎn)到Picovoice控制臺的Rhino選項
型號名稱:聲控爐
選擇模板:空
然后點擊Create Context,這將帶你進入一個新頁面,在那里完成了實際的語音到意圖模型“編碼”。
這里是一個快速概述的意圖,槽和微語音宏:-
意圖
意圖是您希望通過語音控制執(zhí)行的某些操作。把它們看作語法中使用的動詞。意圖有表達方式,這與帶有動詞的句子的英語語法非常相似。
意圖表達=動作(做某事)+主語/賓語(關(guān)于某事)
這個語音控制爐有4個單獨的意圖:
?點火:在爐子上點火
?停止燃燒:停止燃燒
?設(shè)置火焰:通過調(diào)節(jié)氣體來改變火焰
?SetTimer:設(shè)置一個烹飪定時器,當時間過去時關(guān)閉火
每個意圖都有它自己的表達式,你必須鍵入它。表達式應(yīng)該是這樣的:
一開始可能看起來有點混亂,但你最終會明白的(別擔心)。
槽
槽是意圖中的變量。槽可以容納表示不同變量的多個元素,或者一個變量的不同名稱
把它想象成英語語法中的主語/賓語,需要在其上執(zhí)行動作。
例如,如果我們想設(shè)置一個烹飪計時器,時間將根據(jù)命令的不同而不同。
?把計時器設(shè)為一分鐘
?把計時器調(diào)到三分鐘
?把計時器調(diào)到五分鐘
?插槽=行動中的變量(通常)
語音到意圖引擎可以提取這些差異。
當在表達式中使用時,Slot前面會有$符號
Picovoice有一些內(nèi)置插槽,比如pv。百分比,它可以直接從用戶意圖中提取百分比值。
宏
宏完全用于具有相同含義(意圖)的不同單詞。它相當于英語語法中的同義詞。
在表達式中使用宏時,宏的前面會有@符號
宏=動詞的同義詞
例如:Start可以說成turn on/power up/enable/activate這些詞中的任意一個。
那么,你是怎么把這些東西組合在一起的呢?
首先,想想人類表達特定意圖的“同一件事”的所有可能方式。然后在Macros中列出所有動詞/名詞,在Slots中列出所有變量,并為意圖創(chuàng)建如下表達式:
如果語音識別模型能夠檢測到各種具有相同意圖的人類短語,那么它將會更好地工作。正確列出宏元素和更好的表達是成功的關(guān)鍵。
步驟4:訓練模型
當所有的intent, Slots, Macros都完成后,點擊右下角的“Train”:
選擇如下:
型號平臺:ARM Cortex-M
單板類型:PSoC6
唯一標識符(UUID):即十六進制數(shù)
然后點擊訓練“語音控制爐”為ARM Cortex-M
解壓縮下載的文件。
然后打開“Voice-Controlled-Stove_en_cortexm_v2_1_0.h”文件
文件中有一個十六進制數(shù)字的大數(shù)組,這是語音到意圖模型。
步驟5:在模塊工具箱中編輯main.c和param.h
現(xiàn)在,回到modstoolbox。復(fù)制這里附加的main.c代碼。
從Picovoice E2E語音識別演示的main.c中替換整個原始演示代碼
接下來,編輯param.h,將喚醒詞模型的數(shù)組和語音包含到意圖模型的數(shù)組中。這兩個模型(喚醒詞+從語音到意圖)被組合到param.h中。
我將修改后的param.h附在下面。復(fù)制它的內(nèi)容并替換param.h的原始內(nèi)容,以避免任何混淆。
如果你想了解代碼是如何工作的,請閱讀它。代碼中有大量的注釋解釋了大多數(shù)事情
最后,點擊錘子圖標來構(gòu)建和綠色播放按鈕圖標來將固件flash到PSoC6 mcu中,如前所述(見步驟1)。
準備播放語音的音頻文件
Step1:我使用了文字轉(zhuǎn)語音服務(wù)來進行音頻反饋。
第二步:當演講播放時,我用Audacity錄制了聲音。選擇Windows WASPAPI和源作為耳機/揚聲器,然后單擊Record圖標以在計算機中捕獲音頻播放。
第三步:錄音后,將音頻分割成多個mp3文件。要分離音頻的每個片段(每個數(shù)字的聲音),用鼠標選擇該部分,然后使用快捷鍵Ctrl+C(復(fù)制),Ctrl+N(新建),Ctrl+V(粘貼)該音頻片段。對每個音頻段重復(fù)此步驟。
第四步:進入Files >導出為MP3,選擇48 kbps的質(zhì)量,重命名為FILE0000.MP3, FILE0001.MP3, FILE0002.MP3,直到FILE0100.MP3
(所有的音頻文件都附在下面,你可以跳過第1-4步,只需按照第5步下載并復(fù)制文件)
第五步:語音模塊用USB C線連接到電腦,16mb閃存盤出現(xiàn)。第一次使用時需要格式化(FAT)。接下來,將所有mp3文件復(fù)制到語音模塊閃存驅(qū)動器中的DF_REC目錄。
您可以放置最多1000個MP3文件,總音頻長度為40分鐘@ 48kbps。更高采樣頻率的歌曲/音頻將工作,但音頻長度將減少,由于較大的文件大小
音頻回放是如何工作的?
連接PSoC6單片機的串行TX和甲蟲板單片機的串行RX,實現(xiàn)半雙工串行通信。PSoC6 mcu簡單地發(fā)送printf(“一些數(shù)字”),它被傳輸?shù)郊紫x板的mcu。根據(jù)從PSoC6 mcu接收到的數(shù)字,甲蟲板mcu將向語音播放模塊發(fā)送命令,播放代表該數(shù)字的mp3文件。
例如:printf("040")命令將播放0040.mp3文件。看看我的這個項目,它詳細地解釋了這一點
設(shè)備操作
為了理解設(shè)備操作,讓我們看一下所有的PSoC6應(yīng)用資源(PSoC6 mcu內(nèi)部硬件)
應(yīng)用程序資源
根據(jù)用戶的語音命令,這些資源中的一些將激活某些模塊來控制伺服器,啟用定時器,向語音播放模塊發(fā)送打印消息等。
兩個PWM模塊將產(chǎn)生50 Hz的PWM信號。通過調(diào)整這些信號的占空比,控制兩個伺服電機。
LPTIMER將測量烹飪計時器功能激活時所經(jīng)過的時間
UART TX將發(fā)送printf()消息到甲蟲板播放mp3文件
當檢測到喚醒字時,GPIO將驅(qū)動PSoC6 Pioneer Kit板上的綠色LED。當檢測到語音意圖時,藍色LED將發(fā)光。
下面是一些語音命令和硬件交互的例子:
當然,這些并不是唯一的語音命令。例如:
“嘿,爐子,打開燃燒器”也可以這樣說:
氣體/火焰調(diào)節(jié)限制
氣體或火焰可以調(diào)整為10%至100%之間的任何值,步進5%。也就是說,10% 15% 20% 25% .......100%
以下是一些有效的語音命令示例:
對于任何不能被5整除的值,默認氣體閥設(shè)置為30%
定時器設(shè)置約束
烹飪時間定時器可設(shè):1分鐘、2分鐘、3分鐘、5分鐘、10分鐘、15分鐘、20分鐘、25分鐘、30分鐘
當然,可以通過編輯main.c代碼來添加或多或少的選項。
以下是一些有效的定時器設(shè)置語音命令:
現(xiàn)有的定時器設(shè)置可以被新的定時器設(shè)置命令覆蓋。對于上面沒有列出的任何分鐘值,默認計時器設(shè)置為一分鐘。
結(jié)論
我用有限的預(yù)算(大約50美元的額外硬件)+ PSoC6先鋒套件(由英飛凌提供)和Picovoice開發(fā)者帳戶(由Picovoice免費提供)制作了這個項目。但如果有人想把它變成一種產(chǎn)品,可能會增加更多的功能。
本文編譯自hackster.io