Chapter 6 Micro_speech 範例程式-喚醒詞偵測:建構 app

本章節對應到 TinyML TensorFLow Lite 機器學習中文版 的第七章, 佩服作者在機器學習功力的深厚, 在這一章裡, 也介紹了機器學習 app 的模型框架, 以及語音樣本資料 - 聲譜 (spectrogram) - 的簡介. 我會再後續補充於 §附錄 D 音頻聲譜的說明與模型分析.

再說一次:

訓練就是‘學習’; 推論就是‘考試’

這個範例, 作者先從 inference - 喚醒詞偵測的構建 app 開始, 訓練模型留待下一章 (第 §7 章) 介紹.

本文介紹可以運作 micro_speech 示範程式的有以下的前兩種 (網路上有更新, 可以支援更多設備):

6.1 在 STM32 DISCO_F746NG 上實現 micro_speech

6.1.1 (無痛執行)在筆電上編譯程式, 並下載至 STM32 DISCO_F746NG

因為 TensorFlow Lite Micro 的開發持續在進行, 部份文件並沒有隨著開發進度而更新, 如果照著 github 上執行會產生一些錯誤, 而且, 在編譯 (make) 之前, 需要將 STM32 DISCO_F746NG 相關檔案複製到主程式目錄下, 因此, 我在 github 創建了一個 branch, 針對 DISCO_F746NG 的開發板做了檔案安排及設定調整, 可以直接編譯, 並下載到 DISCO_F746NG 開發板上執行.

參考我的 TFLM github - micro_speech無痛執行

在下一節說明如果從 TFLM github 官網下載內容時, 需要做的修改.

6.1.2 (微痛執行)在筆電上編譯程式, 並下載至 STM32 DISCO_F746NG

此節乃針對已經熟悉上一節的內容, 順利執行後, 進一步從 TFLM github 官網下載, 得自行修改部份內容方能順利執行無誤.

動手修改內容

需要修改的內容有
1. 改從 https://github.com/tensorflow 官網下載
2. 將 tensorflow/lite/micro/examples/micro_speech/disco_f746ng/ 這目錄改名成為 tensorflow/lite/micro/examples/micro_speech/mbed/
其餘從 make 以後的操作維持跟原先內容不變

6.1.2.1 改從 https://github.com/tensorflow 官網下載

# 從我的 github
$ git clone -b example --depth 1 https://github.com/marconi1964/tensorflow.git
# 改到用 Tensorflow 官網的 github
$ git clone --depth 1 https://github.com/marconi1964/tensorflow.git
# 或是
$ git clone --depth 1 https://github.com/tensorflow/tensorflow.git
$ cd tensorflow

6.1.2.2 將 tensorflow/lite/micro/examples/micro_speech/disco_f746ng/ 這目錄改名成為 tensorflow/lite/micro/examples/micro_speech/mbed/

DISCO_F746NG 的驅動程式 (audio_provider.cc 與 command_responder.cc) 跟標準的示範程式不同, 需要讓 make 把 F746NG 的驅動程式包含在主程式才能在開發板上執行, 這部分已經在 Makefile 完成, 只是目前 Makefile 的寫法是擷取 TARGET=mbed 中的 ‘mbed,’ 再到 micro_speech 目錄下尋找 ‘mbed’ 子目錄, 而不是尋找 disco_f746ng 子目錄, 且 mbed 子目錄是不存在的, 這是問題所在, 因此需要做以下調整.

# 接續上一個動作, 已經在 tensorflow 目錄下, 切換到 micro_speech 示範程式目錄
$ cd tensorflow/lite/micro/examples/micro_speech/

$ mv disco_f746ng mbed
# 完成後, 回到 tensorflow 主目錄下
$ cd ~/tensorflow

(以上的動作, 看起來很簡單, 卻是我花最多時間的地方, 需要去了解 Makefile 及層層疊加上的 Makefile.inc 和 *_makefile.inc 的複雜架構.)

繼續執行 make 以及後續的動作

$ make -f tensorflow/lite/micro/tools/make/Makefile TARGET=mbed ALL_TAGS=disco_f746ng generate_micro_speech_mbed_project
$ cd tensorflow/lite/micro/tools/make/gen/mbed_cortex-m4_default/prj/micro_speech/mbed
$ mbed config root .
$ mbed deploy
$ mbed compile -m DISCO_F746NG -t GCC_ARM

執行後, 可以打開 screen 或 Coolterminal 來監看 DISCO_F746NG 偵測 ‘yes,’ ‘no,’ ‘unknown,’ 或 ‘silence’ 的預測結果各是如何.

此處的模型很小, 也不完美, 你會發現它比較擅長偵測 ‘yes,’ 處理 ‘no’ 的效果較差, 從這個例子可以看到小型模型的大小進行優化將導致準確性下降, 將在下一個章節 (第 §7 章) 進一步討論這主題

6.2 在 Arduino Nano 33 BLE 上實現 micro_speech

在 §3.4 Arduino IDE 安裝後, 將 Arduino Nano 33 BLE 接上電腦的 USB, 進入 Arduino IDE 的 Tools - Boards 及 Port 確定已經安裝完成, 再到 File - Examples 找到 Arduino_TensorFlowLite 下會有 4 個範例

  • hello_world
  • magic_wand
  • micro_speech
  • person_detection

選擇我們想要的範例 micro_speech. 打開後, IDE 環境會同時展開好幾個程式, 找到 model.cpp 檔案, 用 colab 訓練完成的 g_model[ ] 內容來取代現有 model.cpp 內的 g_model[ ], 即可按照一般 Arduino 的程式般下載到 Nano 33 BLE 後執行.

執行中, 可以打開 Arduino IDE menu
* Tool - Serial Monitor : 看到 Nano 33 回饋的預測是 ‘yes,’ ‘no,’ ‘unknown,’ 或 ‘silence’

同時, Nano 33 的燈號顏色也會隨著辨識結果也不同

  • yes: 綠燈
  • no: 紅燈
  • unknown: 藍燈
  • silence: (不亮燈)

此處的模型很小, 也不完美, 你會發現它比較擅長偵測 ‘yes,’ 處理 ‘no’ 的效果較差, 從這個例子可以看到小型模型的大小進行優化將導致準確性下降, 將在下一個章節 (第 §7 章) 進一步討論這主題