采用 EFR32xG24 的語音控制 Zigbee 開關
要創(chuàng)建支持 ML 的應用程序,需要兩個主要步驟。第一步是創(chuàng)建一個無線應用程序,您可以使用 Zigbee、BLE、Matter 或任何基于 2.4 GHz 協(xié)議的專有應用程序來完成。它甚至可以是未連接的應用程序。第二步是構建 ML 模型以將其與應用程序集成。
如上所述,Silicon Labs 提供了多種選項來為其 MCU 創(chuàng)建 ML 應用程序。此處選擇的方法是使用具有預定義模型的現(xiàn)有示例應用程序。在這個例子中,模型被訓練來檢測兩個語音命令:“on”和“off”。
EFR32xG24 應用程序入門
|
|
要開始使用,請獲取 EFR32MG24 開發(fā)人員套件 BRD2601A(左)。 該開發(fā)套件是一個緊湊型電路板,嵌入了多個傳感器(IMU、溫度、相對濕度等)、LED 和 Stereo I?2?S 麥克風。 該項目將使用 I?2?S 麥克風。 這些設備可能不像 GPU 那樣稀有,但如果您沒有機會獲得這些套件之一,您還可以使用基于系列 1 的舊開發(fā)套件,稱為“Thunderboard Sense 2”參考。SLTB004A(右)。 但是,此 MCU 沒有 MVP,將使用主內核執(zhí)行所有推理,無需加速。 |
? |
接下來,您需要 Silicon Labs 的 IDE Simplicity Studio 來創(chuàng)建 ML 項目。它提供了一種下載 Silicon Labs 的 Gecko SDK 軟件套件的簡單方法,該套件提供了應用程序所需的庫和驅動程序,如下所示。
·?無線網絡堆棧(本例中為 Zigbee)
·?硬件驅動程序(用于 I2S 麥克風以及 MVP)
·?TensorFlow Lite 框架
·?一個已經訓練過的用于檢測命令詞的模型
IDE 還提供工具來進一步分析您的應用程序功耗或網絡操作。
創(chuàng)建啟用 MVP 的 Zigbee 3.0 Switch 項目
Silicon Labs 提供了一個即用型示例應用程序 Z3SwitchWithVoice,您將創(chuàng)建和構建該應用程序。該應用程序已經附帶了一個 ML 模型,因此您無需創(chuàng)建一個。
創(chuàng)建后,請注意 Simplicity Studio 項目由組件帶來的源文件組成,這些組件是 GUI 實體,通過簡化復雜軟件的集成,可以輕松使用 Silicon Labs 的 MCU。在這種情況下,您可以看到默認安裝了 MVP 支持和 Zigbee 網絡堆棧。
主要應用程序代碼位于 app.c 源文件中。
在網絡方面,應用程序可以通過一個簡單的按鈕與任何現(xiàn)有的 Zigbee 3.0 網絡配對,也稱為“網絡轉向”。聯(lián)網后,MCU 將尋找兼容且可配對的照明設備,也稱為“綁定”。
當應用程序的網絡部分啟動并運行時,MCU 將定期輪詢麥克風數(shù)據(jù)樣本并在其上運行推理。此代碼位于keyword_detection.c 中。
/************************************************* ******************************//** ?* 處理來自 output_tensor 的輸出?************** ****************************************************** **************/ sl_status_t ?process_output?()
{
// 根據(jù)推理的輸出判斷是否識別到命令
uint8_t found_command_index = 0;
uint8_t分數(shù) = 0;
bool?is_new_command = false?;
uint32_t current_time_stamp;
// 獲取 CommandRecognizer 所需的當前時間戳
current_time_stamp = sl_sleeptimer_tick_to_ms(sl_sleeptimer_get_tick_count());
TfLiteStatus process_status = command_recognizer->ProcessLatestResults(
sl_tflite_micro_get_output_tensor(), current_time_stamp, &found_command_index, &score, &is_new_command);
if?(process_status !=?kTfLiteOk?) {
?return?SL_STATUS_FAIL;
}
if?(is_new_command) {
?if?(found_command_index == 0 || found_command_index == 1) {
printf( "聽說 %s (%d) @% ldms?\r\n" , kCategoryLabels[found_command_index],
分數(shù),current_time_stamp);
檢測到的關鍵字(found_command_index);
}
}
返回SL_STATUS_OK;
}
檢測到關鍵字后,app.c 中的處理程序將發(fā)送相應的 Zigbee 命令:
靜態(tài)?無效檢測到_keywork_event_handler ( sl_zigbee_event_t *事件)
{
EmberStatus狀態(tài);
如果(emberAfNetworkState()==?EMBER_JOINED_NETWORK){
emberAfGetCommandApsFrame()-> sourceEndpoint = SWITCH_ENDPOINT;
if?(detected_keyword_index == 0) {
emberAfFillCommandOnOffClusterOn();
} else ?if?(detected_keyword_index == 1) {
emberAfFillCommandOnOffClusterOff();
}
狀態(tài) = emberAfSendCommandUnicastToBindings();
sl_zigbee_app_debug_print( "%s: 0x%02X\n" , "發(fā)送到綁定" , status);
}
}
此時,您已在無線 MCU 上運行硬件加速推理以進行邊緣計算。
自定義 TensorFlow 模型以使用不同的命令詞
如前所述,實際模型已經集成到該應用程序中,并且沒有進一步修改。但是,如果您自己集成模型,則可以通過以下步驟進行:
1.?收集和標記數(shù)據(jù)
2.?設計和構建模型
3.?評估和驗證模型
4.?為嵌入式設備轉換模型
無論您對機器學習多么熟悉,都必須遵循這些步驟。不同之處在于如何構建模型,如下所示:
1.?如果您是 ML 的初學者,Silicon Labs 建議使用我們易于使用的端到端第三方合作伙伴平臺之一:Edge Impulse 或 SensiML 來構建您的模型。
2.?如果您是 Keras/TensorFlow 方面的專家并且不想使用第三方工具,您可以使用機器學習工具包 (MLTK),它是一個自助式、自助式的 Python 包。Silicon Labs 圍繞音頻用例創(chuàng)建了這個參考包,可以擴展、修改或以其他方式挑選專家認為有吸引力的部分。該包將在 GitHub 上提供,附帶文檔。您也可以直接導入一個 .tflite 文件,該文件在 TensorFlow lite 的嵌入式版本上運行,用于為 EFR32 產品線進行微編譯。您必須確保數(shù)據(jù)上的特征提取對于訓練模型與在目標芯片上運行推理完全相同。
在 Simplicity Studio 中,后者是最簡單的。要在 Simplicity Studio 中更改模型,請將 .tflite 模型文件復制到項目的 config/tflite 文件夾中。項目配置器提供了一個工具,可以自動將 .tflite 文件轉換為 sl_ml_model 源文件和頭文件。





