- 前言
在当今的物联网时代,语音辨识技术的应用日益广泛。本文将介绍如何部署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
Q1:如果辨识不准确,该从哪里下手检查问题?
A1:造成辨识不准确有很多可能,可以从麦克风、模型去看。
Q2:麦克风要怎么检查?
A2:要确认收音没问题,可以使用UDP传送PCM给电脑,在使用Pyaudio 将音讯播出来聆听是否有问题。
Q3:如何确认模型是否准确?
A3:从Tensorflow提供的tflite-micro中在tensorflow/lite/micro/examples/micro_speech中有提供evaluate.py,可以喂入wav查看是否准确。
Q4: 如果在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该怎么解决?
A4: main_function.cc检查op是否与模型符合,可以去netron看模型结构。
Q5:在执行py时遇到FLATBUFFERS_ASSERT(size < FLATBUFFERS_MAX_BUFFER_SIZE);相关问题如何解决?
A5: /Documents/tflite-micro/tensorflow/lite/micro/build_def.bzl的def micro_copts():中加入 "-Wno-error=sign-compare",,执行时使用bazel build --copt="-Wno-error" evaluate来忽略比较错误便可正常执行。
- 引用