Funpack第二季第一期——基于Syntiant TinyML实现中文语音指令识别
sytiant tinyml搭载超低功耗的NDP101神经网络处理器,在使用单片机处理神经网络模型决策时,在节省功耗的情况下有提高了工作效率。
标签
嵌入式系统
Arduino
机器学习
TinyML
奈奎斯特不稳定
更新2022-07-05
667

硬件平台介绍

FtF53e47PKN-vZxe7gmL3KsTPKmX

如图所示,本次平台使用的芯片为SAMD21,使用NDP101模块进行神经网络加速。利用micro-phone进行音频的提取,使用RGB灯对音频命令进行操作。

SAMD21

该芯片使用的是SAMD21 Cortex-M0+ 32位低功耗48MHz ARM MCU,内置256KB FLASH和32KB SRAM,足够完成本次任务。与芯片直接连接的uSD卡槽以及板载RGB led是本次项目用到的两个主要的硬件。

NDP101

NDP101是神经决策处理器,其主要功能是加速处理神经网络的决策功能,直接连接了6轴运动传感器和数字麦克风,本次项目主要用到了SPH0641LM4H麦克风。

未来发展前景

Syntiant TinyML Board配备超低功耗 Syntiant ® NDP101神经决策处理器™,可以使语音和传感器应用程序分别在 140 和 100 微瓦以下运行,与基于 MCU 的传统 MCU 相比,吞吐量提高 20 倍,系统效率提高 200 倍。Syntiant TinyML 板的尺寸为 24 毫米 x 28 毫米,是一个小型的独立系统,通过微型 USB 连接通过 Edge Impulse 轻松下载经过训练的模型,而无需任何专用硬件。将来可以取代传统手机上的触摸按键,实现使用完全的离线语音控制,对边缘设备进行控制。主要的有手机,智能家居,智能手表,遥控器,物联网端点灯方面的应用。

网络模型训练以及部署 edge impulse平台

今天在sytiant的开发板上再一次进行了简单的语音识别,这次任务给我印象最深刻的地方在于,他的语音处理的流程是可选的。这里每个部分就需要自己尝试了,文档没有专门的说明,只是介绍了每一个模块是干什么的,但是这个模块选择了之后的结果是什么,怎么选择却没有明确得细说。

收集数据

首先是数据收集上的问题,也就是选肉的问题,我在网上找了一圈,没有找到适合本项目的语音训练集合,所以这些语音训练集合只能自己录制。一开始只需要把需要的每个关键词录制个100个左右就行,不用太多。测试集按照建议的录制25个就行,每个关键词录制后面会根据模型训练的效果来适当增加。这是数据收集上的问题。在录制时还需要特别关注一个问题:录音设备最好使用的是syntiant自己的板子,因为如果使用的电脑音频的话,很容易就会出现:数据集特征相差过远的情况。导致最后训练的模型成为废品。

数据处理

然后就是语音处理上的问题,毫无疑问,想要语音处理我们不能把声音文件(WAV)直接扔给神经网络,它不认这玩意,我们要做的是将声音文件转换成一堆堆数据,方便神经网络进行特征值的提取。怎么转换呢,这里就用到了梅尔频谱系数这个方法。梅尔频谱系数是音频神经网络学习中,提取音频特征的重要工具。在选择处理模块时需要注意我们要选择带(sytiant)的模块,这样最终才能生成适合ndp101的模型。

神经网络构建

之后就是神经网络的选择,这里一共也就三种选择,建议每一种都试一下。因为我也不知道哪一种是最好的,只有试过才知道。

关于音频处理模块和神经网络模块的参数,第一次调整选择的都是默认值。需要注意的是,我之前有尝试调整参数的时候没有注意神经网络的要求:但是由于我选择的网络支持默认参数,在如果调整了处理模块的参数,会导致神经网络编译报错。

模型测试

最后是模型测试,对训练出来的模型直接应用于开发板多半会出现无法识别的问题,这是由于训练出来的模型需要经过验证,这时候我们之前录制的测试文件就起到了作用,在model testing这个模块中,可以验证测试的模型是否符合预期。这个步骤就可以排除一些小问题。

还可以使用在线功能,我一开始对live classification的用法很迷惑,因为如果只是对数据进行分析判断的话,使用model testing就可以实现了,而且效率更加高效。用了一段实践这个页面后,我发现了其真正的用法:先录一段测试音频然后使用live classification进行分析,其根据设定的步进距离一个一个的分析,这样可以排除很多意想不到的bug。比如,我之前有两个关键词分别是“打开”和“蓝灯”,在分开测试的时候没有问题,但是何在一起后,说“打开蓝灯”后会发现,如果语速过快,或者习惯性得说蓝灯得时候用了虚化得语气,AI就很难识别出来。

环境部署

最后也是最关键的一点,是环境的部署问题,如果之前的参数选择正确。那么最后deployment选项中应该会看到这个界面:

FkcmWIWirngk5gx9H6VWH2om9ERM

选择NDP101的库文件生成,在选择参数时,需要注意,参数的识别率不能低于0.85,如果低于0.85,那么生成出来的bin文件就很容易出现无法识别语音。这是因为识别准确率过低,导致单片机不知道相信哪个识别。

在一切调整完毕后,点击build按钮,会自动开始编译,编译完成后,会跳出弹窗提示下载,下载完成后是一个压缩包,解压出来后如图所示:

FmAUa2Uo7G-XTct_sy1WEjs6FNVU

主要用到的是bin文件,以及model-parameters这个文件,将文件夹里的文件替换原工程中的参数文件。

之后将bin文件下载到sd卡中,计划是从sd卡中读取网络模型,直接烧入也行,但是本人更加喜欢写到sd卡中,这样就不需要反复烧录了。至此,网络模型布置已经结束,接下来就是愉快得编程环节。

 

小结

训练模型主要有以下几个步骤:获取数据,转换数据,训练神经网络。训练完成后,还需要将训练的模型进行测试,已确保模型的准确性。最后的部署环节需要注意参数的选择,可信度不能低于85%,否则将模型烧入于芯片中也无法正确识别。

关键代码讲解 程序整体框图

首先是对程序整体框图的解释,流程图如下图所示

FjbqwxhTsRdWk3qFBm8_8luw5I-G

其中,初始化中关键的部分包括对模型的导入,初始化任务LED灯,初始化片上flash,初始化定时器3使其在休眠模式下也能给NDP芯片提供时钟信号。使能定时器4,使能NDP中断。连接信息等任务。

NDP中断任务

利用外部中断,可以通知主控芯片信息匹配完成:

// INT pin interrupt from NDP. Simply flag form main() routine to process
void ndpInt()
{
SCB->SCR &= !SCB_SCR_SLEEPDEEP_Msk; // Don't Allow Deep Sleep
doInt = 1;
ledTimerCount = 1 * (50000 / timer_in_uS); // flash LED for 5 second

if (!doingMgmtCmd)
{
timer4.enableInterrupt(true);
}
ints++;
// Serial.print(ints);
}

重置定时器计数的同时,将中断标志位置一。

匹配成功

匹配成功时将匹配完成的任务字节赋相应的值:

// here you can write application code, e.g. to toggle LEDs based on keywords
if (strcmp(event, "open") == 0) //打开
CMD_RE |= 0x10; //高位第一位
else if (strcmp(event, "close") == 0) //关闭
CMD_RE |= 0x10 << 1; //高位第二位
else if (strcmp(event, "shine") == 0) //闪烁
CMD_RE |= 0x10 << 2; //高位第三位

if (CMD_RE & 0xf0)
{
if (strcmp(event, "blue") == 0) //蓝灯
CMD_RE |= 0x01; //将第一位置1
}

处理任务字节

处理匹配后的字节任务:

void CMD_RE_RESOLV()
{
if (CMD_RE & 0xf0)
{
switch (CMD_RE & 0xf0)
{
case 0x10:
if (CMD_RE & 0x01)
{
digitalWrite(LED_BLUE, HIGH);
CMD_RE &= 0x00;
}
break;
case 0x10 << 1:
if (CMD_RE & 0x01)
{
digitalWrite(LED_BLUE, LOW);
CMD_RE &= 0x00;
}
break;
case 0x10 << 2:
if (CMD_RE & 0x01)
{
digitalWrite(LED_BLUE, millis() / 1000 % 2 == 1);
if (millis() % 1000 == 0)
ei_printf("time:%d\n", (millis() / 1000) % 2);
// CMD_RE &= 0x00;
}
break;
default:
ei_printf("error:mode conflict! or not support!\n");
CMD_RE &= 0x00;
break;
}
}
}

功能展示

FkavaJEB8GUaVMduxk2Rm3O38Z3K

Fnan4pHdBMba-tiYK_GV-Am06PYc

心得

之前我也在别的平台上做过类似的语音识别,但是当时就是完全按着说明文档走,自己基本没有过脑子。而且他们提供的api非常详细,使用的是python作为编程语言,当时我是只走了一遍语音识别的流程而已,基本没有学到什么有用的内容。本次训练使用的平台开放度相对较高,文档提供的内容非常详细,用模块化的流程向我们展示了训练神经网络模型的大致流程。想要完成本次项目,光是跟着文档的描述来走是不行的,还要充分学习神经网络的相关知识,不断试错才能完成本次的项目。

附件下载
src.zip
团队介绍
已经毕业的大学生一枚
团队成员
奈奎斯特不稳定
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号