TinyML快速入門 使用Zilltek 麥克風實現TinyML語音識別
前言
在當今的物聯網時代,語音識別技術的應用日益廣泛。本文將介紹如何部署TinyML語音識別系統,并詳細記錄從資料收集到模型部署的過程。
TinyML快速入門:使用Zilltek 麥克風實現TinyML語音識別
TinyML語音識別在開發板上的部署 TinyML的實作始于資料的收集。在這一階段,我們選擇了speech_commands資料集進行模型訓練。該資料集包含多個語音指令類別,如"down", "go", "left", "no", "right", "stop", "up", "yes"等,可在Tensorflow官方GitHub中找到。
開發環境方面,我們使用Tensorflow2.10和python3.10進行開發,硬體方面則選用了esp32s3-c1。麥克風使用Zilltek ZTS6672 mems mic,IDF使用ESP-IDF,建置project輸入指令:
idf.py create-project-from-example "esp-tflite-micro:micro_speech"
獲取esp-tflite-micro的檔案

我們使用example中的micro_speech,內容我們需要做一些修改,首先在audio_provider.cc中對i2s輸入做一些設定。

另外模型經過訓練量化并轉成.tflite之后,我們需要將模型轉換成二進制,在model.cc中將自己的模型放進去,同時修改g_model_len以匹配模型大小。

在micro_model_settings.h中,根據模型訓練時的關鍵詞設定label。例如,若有6個分類,則`constexpr int kCategoryCount`應設為6,并將要識別的label放入`constexpr const char* kCategoryLabels[kCategoryCount]`中。

此外,若想添加語音識別連動功能,如聽到關鍵詞便開燈等操作,在main_function.cc中進行添加即可。只要confidence值高于0.8,就會執行相應指令。

當一切都完成之后就可以進行build的工作,使用ESP-IDF進行,依序輸入以下指令:
idf.py set-target esp32s3
idf.py build
idf.py -p /dev/ttyACM0 flash
idf.py -p /dev/ttyACM0 monitor
就可以看到識別的部分

結語
本文記錄了筆者在esp32s3-c1上實作TinyML語音識別的過程。從資料收集到部署實作,每一步都是寶貴的學習經驗。希望本文能對同樣對TinyML有興趣的讀者有所幫助。
Q&A
Q:如果識別不準確,該從哪里下手檢查問題?
A:造成識別不準確有很多可能,可以從麥克風、模型去看。詳情請參考:智能離線語音識別不靈敏?如何改善和提升識別率? (sunsili.com)
Q:麥克風要怎么檢查?
A:要確認收音沒問題,可以使用UDP傳送PCM給電腦,在使用Pyaudio 將音訊播出來聆聽是否有問題。
Q:如何確認模型是否準確?
A:從Tensorflow提供的tflite-micro中在tensorflow/lite/micro/examples/micro_speech中有提供evaluate.py,可以喂入wav查看是否準確。
Q:如果在build時遇到Didn't find op for builtin opcode 'CONV_2D' version '3'. An older version of this builtin might be supported. Are you using an old TFLite binary with a newer model?
Failed to get registration from op code CONV_2D該怎么解決?
A:main_function.cc檢查op是否與模型符合,可以去netron看模型結構。
Q:在執行py時遇到FLATBUFFERS_ASSERT(size < FLATBUFFERS_MAX_BUFFER_SIZE);相關問題如何解決?
A:/Documents/tflite-micro/tensorflow/lite/micro/build_def.bzl的def micro_copts():中加入 "-Wno-error=sign-compare",,執行時使用bazel build --copt="-Wno-error" evaluate來忽略比較錯誤便可正常執行。
引用
micro_speech_dataset
tflite-micro github
esp-tflite-micro github