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