1 项目描述
1.1板卡简介
本项目基于Syntiant公司的TinyML板卡。TinyML板卡上搭载以Cortex M0+为核心的主控芯片,以及Syntiant公司研制的NDP101神经网络决策处理器。板卡上带有麦克风和6轴运动运动传感器两个传感器,能够完成基于神经网络的语音识别和动作识别。而且,该板卡完成神经网络时具有高实时性和超低功耗。
1.2 项目内容
本项目基于上述板卡完成了利用中文语音指令控制LED灯闪烁的功能。设计了唤醒词“你好,小板子”,并有三个中文指令,分别为“打开灯光”,“关闭灯光”以及“闪烁灯光”。当检测到唤醒词时,绿灯长亮。当检测到“打开灯光”时,红灯长亮。当检测到“关闭灯光”时,红灯关闭。当检测到“闪烁灯光”时,红灯快速闪烁。
2 项目设计思路
2.1 数据采集
首先收集语音数据,作为神经网络的训练和验证数据。针对唤醒词和三条指令,每句话收集了约50条语音。此外,为了防止乱触发(将杂音判断为指令)的现象,从官方数据集中选取了100条噪声信号。数据时长分布较为均匀,如下图所示。
2.2 神经网络训练
Edge Impulse网站能够快速的训练神经网络模型,然后生成在相应硬件上运行的代码库,能够非常方便地将神经网络部署到嵌入式设备上。本项目的神经网络的训练依赖于Edge Impulse完成。
下图是利用Edge Impulse搭建的语音信号处理与识别模型。首先会对语音信号进行梅尔滤波,提取倒谱系数作为语音信号的特征。然后将语音信号的特征输入到神经网络中。神经网络经过对特征的运算,输出语音信号属于每种类别的概率。取概率最大的作为最终判别结果。
随后对神经网络进行训练,得到的结果如下图所示。最终,神经网络在验证集上的准确率为88.2%,并不理想,但能基本满足使用要求。这可能是由于数据量过少,产生了过拟合的现象导致的。在混淆矩阵中可以看到,“关闭灯光”指令判断准确率较低,在测试的时候未对该指令进行测试。
2.3 硬件代码设计
硬件代码设计较为简单。在神经网络决策处理器完成了一次决策后,会产生中断。主控制器收到中断信号并调用中断服务函数。因此,在中断服务程序的对应位置添加上对应LED的正确操作即可。
例如,在检测到唤醒词时,使绿灯引脚输出高电平,代码如下所示:
void on_classification_changed(const char *event, float confidence, float anomaly_score) {
if (strcmp(event, "hello") == 0) {
digitalWrite(LED_GREEN,HIGH);
}
}
2.4 神经网络部署
将上节中编写的代码编译,并从Edge Impulse上下载模型文件,利用写好的Flash烧录脚本将代码烧录进芯片。将USB线拔下后再插上,待芯片完全重启后便能对语音识别的效果进行测试。
3 测试结果
下两图分别为打开灯光以及唤醒词的测试结果,与预期相符。由于闪烁灯光效果不便于使用图片展示,详情请见演示视频。在测试时,可以体会到该神经网络处理器强大的运算性能。
4 参加活动的感受
本次活动是我第一次接触真实的神经网络处理芯片,确实感受到了它极快的处理速度,这开拓了我的眼界。但本次活动的不足是未能公开NDP101内部的信息,供大家继续探索。