[Day 17] TFLM + BLE Sense + MP34DT05 就成了迷你智慧音箱(下)

书接上回[Day 16] TFLM + BLE Sense + MP34DT05 就成了迷你智慧音箱(上)。接下来要继续谈如何让板子能清楚听懂且学会新的不同的命令及如何把训练好的成果布署到板子上。

产生资料集

使用公开资料集

在前面的章节中曾提到「好的老师(标注)带你上天堂,不好的老师带你住套房」,由此得知资料集的收集、清洗和高品质的标注是有多重要。在这个micro_speech的范例中,为了方便起见,它是采用公开的语音命令资料集(共2.3GByte)(相关论文)这个资料集就是TinyML一书作者Pete Warden所贡献的,它包括有超过10万多个WAV格式已分割好的声音文件,其中包括30个常用的英文单词,(数字0-9、上下左右、前进後退停止、猫狗鸟树房子床、Yes, No, WOW, On, Off...),每个单词约有1500~4000个样本不等,其中还包括不同人种、年纪、性别的发音,具有足够的多样性,很适合初学者作为练习用,可完整下载後再挑选自己需要的单词和必要的数量来作为资料集。不过这个资料集有个小缺点就是声音太乾净了,不是在有背景音的环境下录制,所以如果要让训练的成果更好些,更符合现实场景使用,可能还要利用程序加入一些白杂讯来改善。

如何自建资料集

那如果你需要的单词不在其中(含中文单词),那要如何产生资料集呢?首先可以利用手机、电脑上的麦克风或BLE Sense板子上的麦克风直接录音。录音时取样频率建议16KHz,同时不要以MP3这类压缩格式存档,一定要选WAV这类非压缩的格式,不然会严重破坏资料特徵。录的时候可以连续录音一次取得较多的样本,重覆说出单词(单词长度最好不要超过一秒)N次,每次中间休息一秒,比方说:开_开_(连续x次)_开_,至少10 ~ 20次,越多越好,由越多人来录更好(数十到数百人),原则上就是希望获取的资料集拥有更佳多样性。接着用市售或开源影音编辑软件把单一的声音档案(假设名为on.wav),切成很多个1秒的WAV格式的资料(建置一个on档案夹存放on_001.wav, on_002.wav,... on_xxx.wav) ,而切割时要适当的调整起点,让声音的波形尽量置中,方便後续取出特徵值。如图Fig. 17-1所示。不过这样的工作非常累人,要有点耐心完成它。

完整声音档案分割自建资料集方式
Fig. 17-1 完整声音档案分割自建资料集方式。(OmniXRI整理制作, 2021/9/30)

从时域转频域

由於录制的声音是时间域(Time Domain)的资料,所以不容易分析其主要成份(特徵),所以经常需要利用快速傅立叶转换(Fast Fourier Transform, FFT)来将时间域资料转换到频率域(Frequency domain)格式资料。可是只取频率域的资料又会失去时间顺序的特徵,所以就有频谱图(Spectrogram)的概念产生。使用一个小的移动视窗移动一小段距离,逐一取得频域结果(一维资料,X轴向变化),再将时间轴的变化组在一起(第二维资料,Y轴变化),如此作法就等於把声音变成影像来辨识,而每个声音档案都会转换成一张频谱图。如图Fig. 17-2所示。

以图Fig. 17-2为例,每个视窗范围(30ms)先以FFT转成256个频率特徵,再每6个平均成一组数值,余数自成一组,故可得43个数值,组成X轴向资料。接着移动20ms,再重复上述动作,并将得到内容从Y轴方向组合。这部份的数量就要看一个声音档案时长多少而定,同样地,余数也自成一组,所以1秒的声音会组出49个数值。因此最後会得到49x43(H x W, Rows x Columns)像素的一张频谱图。

而训练时可选择预先将频谱图转好再进行,这样可节省一些档案存取及训练的时间。而推论时,是直接从板子上的麦克风读入原始声音信号,所以MCU端程序就必须要有对应的频谱图转换(特徵提取)程序。

TensorFlow Lite Micro Micro Speech声音频谱图转换范例
Fig. 17-2 TensorFlow Lite Micro Micro Speech声音频谱图转换范例。(OmniXRI整理制作, 2021/9/30)

训练及优化模型

这个范例中使用了一个名为tiny_conv的模型架构(原始出处官网连结已失效),它的结构很简单,只有一层输入层,一层卷积层,一层全连结层和一层输出层,如图Fig. 17-3所示。输入层是一张二维影像,即49 x 40(H x W, Rows x Columns)像素的频谱图。卷积层使用8个10 x 8的卷积核(Kernel),卷积核XY方向的平移距离(Stride)为2,填空方式(Padding)为SAME,即卷积核移到最右边或最下方时,超出没有对应到的像素一样进行卷积。因此卷积完会得到8张25 x 20像素大小的特徵图,此时再将其展平得到4000(25x20x8)个神经元,再和输出层进行全连结。而输出层则是有4个输出神经元,每个神经元再以Softmax来进行输出机率正规化,分别代表静音、Yes、No和Unknow的辨识结果。

而这样的模型结构是否够用,则需要更多实验,经过不断地调整平移距离、网路层数、卷积核大小、全连结神经元数量等各项超参数。必要时还要透过混淆矩阵及其它可视化工具来判定调整方向,甚至重新增加资料集数量及多样性,以满足推论准确性的接受度。

官方目前有提供一个Colab版本的训练程序,可依其步骤说明,将自定义的资料集替换上去,再进行重新训练、转换(TF转TFLite)及优化(INT8量化),即可得到MCU端所需的modle.cc。而这几个步骤大致上和[Day 12]的说明类似,这里就不再赘述。

贴心提醒
依据Colab训练程序上的说明,指出以GPU进行训练大约1~2小时可以完成,不过理想很丰满,现实很骨感,理论上Colab可连续使用12小时,但实际上可能随时会断线,有可能是因为线上人数过多资源不足或者自己的电脑不小心睡觉,还要三不五时用滑鼠点一下网页,以免网页浏览器自己停止更新。更惨的是如果多次长时间进行训练时,可能还会被误会在作商业行为而被短暂停权一到数日。因此如果准备的资料集很大、模型参数很多、网路结构很复杂,建议可能还是在自己的电脑上用GPU来跑或者花钱买Colab进阶版使用权,以免所有训练结果没了,得不偿失。

TensorFlow Lite Micro Micro Speech tiny_conv声音片段分类模型
Fig. 17-3 TensorFlow Lite Micro Micro Speech tiny_conv声音片段分类模型

布署、推理及输出

最後要把Colab产出的model.cc中的参数复制到MCU的档案中,如[Day 16]图Fig. 16-2所示,故名思义,micro_features_model.cpp,这个档案就是MCU辨识「YES」、「NO」的模型参数档,是由TFLM训练、转换和优化出来的,而其内容类似[Day 13]图Fig. 13-1,只需把产出的C Code阵列内容复盖掉这个档案中相同的位置,之後再以Arduino IDE重新编译即可。

/*
  micro_features_model.cpp
  已完成训练、转换及优化的模型参数
*/

const unsigned char g_model[] DATA_ALIGN_ATTRIBUTE = {
    0x20, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x00, 0x00,
    ... (略)
    0x03, 0x00, 0x00, 0x00};   // 模型参数,用TFLM产出的结果来替代
const int g_model_len = 18712; // 模型参数数量

花了这麽长的篇幅说明,大家大概已经可以感受到tinyML的开发流程颇为麻烦,所以[Day 10] tinyML整合开发平台介绍才会帮大家介绍几个常见的云端一站式tinyML整合开发平台,再来tinyML的应用就会改用这类平台来完成,如此就可以更轻松上手了。

参考连结

TensorFlow Lite Microcontroller - Micro Speech 微语音辨识
TensorFlow - TensorFlow - Examples - speech_commands 语音命令相关开源码
Simple audio recognition: Recognizing keywords 说明文件
Train a Simple Audio Recognition Model Colab范例程序


<<:  D30 第十七周 (回忆篇)

>>:  [Day31]C# 鸡础观念- 结语

[Day25] 求值策略

Call by Value 传值 Call by Reterence 传参照 Call by Sh...

第二十八天:文字排版

金鱼都能懂的网页切版:22、23、24、25 文字排版 在文字排版里,html版面基本是一模一样,只...

JavaScript学习日记 : Day23 - 解构赋值

解构赋值(Destructuring Assignment)是一个在ES6的新特性,用於提取阵列或物...

DAY08 - 自制MOCK API,让你开发更方便

什麽是Mock API Mock(模拟)这个词,其实源自於单元测试。主要的概念就是先省略中间的复杂情...

[Day 28] Device Simulation & Remote Debugging

随着网站的手机使用率越来越高,行动版网站渐渐变成标配,为了避免同时需要维护多个网站或是 SEO 被...