Funpack第二季第一期任务一语音识别控制LED灯
使用syntiant tiny ml 实现语音控制LED灯,了解深度学习相关知识和arduino的使用。
标签
嵌入式系统
Arduino
Funpack
TinyML
语音识别
wjhgbpqm
更新2022-07-06
杭州电子科技大学
517

内容介绍

Funpack第二季第一期任务一语音识别控制LED灯

1.syntiant tiny ml 硬件介绍

Syntiant TinyML 配备了超低功耗 Syntiant ® NDP101神经决策处理器™,可以使语音和传感器应用程序分别在 140 和 100 微瓦以下运行,与基于 MCU 的传统 MCU 相比,吞吐量提高 20 倍,系统效率提高 200 倍。Syntiant TinyML 板的尺寸为 24 毫米 x 28 毫米,是一个小型的独立系统,通过微型 USB 连接通过 Edge Impulse 轻松下载经过训练的模型,而无需任何专用硬件。详细硬件图如图1.1,板子的实物图如图1.2所示Fh9-0Mdg0wwezDFOX7D2B06RL3in

图1.1 syntiant tinyml硬件

Fg0oMe-Dj2TdZKhLRGHBYJjlAZGJ

图1.2板子实物图

 

主要特点:

  1. 主机处理器:SAMD21 Cortex -M0+ 32位低功耗48MHz ARM MCU
  2. 内置256KB FLASH和32KB SRAM
  3. 5个数字I/O,与Arduino MKR系列板兼容
  4. 其中包含1路UART接口和1路I2C接口(包括在数字I/O引脚中)
  5. 2MB板载串行闪存
  6. 一个用户定义的RGB LED
  7. uSD卡插槽
  8. 神经决策处理器使用NDP101,连接了两个传感器:
  9. BMI160 6轴运动传感器
  10. SPH0641LM4H麦克风
  11. NDP101支持多达 560k 个参数和 64 种输出分类
  12. 电路板可使用5V micro-USB或3.7V LiPo电池供电

2.syntiant tinyml模型训练

使用Edg Impluse进行训练数据收集,并进行训练,训练后的模型下载到syntiant tinyml板子上。

2.1数据收集

使用syntiant tinyml开发板的麦克风收集语音数据,主要是使用Edge Impluse在网页上收集语音数据如图2.1所示。

FrDfryLYu7mWbaVM0uTo0JLfuIzq

图2.1语音数据收集

之后会得到一个如图2.2的语音数据,清楚地显示你的关键字,并被一些噪音隔开。新数据样本将显示在相应的训练或测试数据集中。

FoHDOeMyuKMEHneJjhrm92_eLYSX

图2.2语音数据

不过,这些数据还不适合机器学习。需要拆分出关键字的部分。对数据进行拆分得到关键词的部分,如图2.3所示。

FsqKdsC_XGgZQP9ih7jPOgOdWD4O

图2.3拆分语音数据

除了需要识别的数据之外,还要有一定的噪音数据,本项目的噪音数据使用了例程的z_openset数据集。

2.2神经网络模型构建

在 Studio 中,转到创建Impluse选项卡,添加时间序列数据、音频 (Syntiant)和神经网络 (Keras)块。将窗口大小设置为 968 ms,将窗口增加到 484 ms(确认采样频率设置为 16000 Hz,然后单击Save Impulse,详细设置如图2.4所示

Fk0i3nDCIgVt-stF6vxZ0CBXJqI9

图2.4创建Impluse

 

单击左侧导航菜单中的Syntiant选项卡,可以配置 Syntiant 块的一些参数,详细设置如图2.5所示。生成的特征数量必须为 1600,这对应于 Syntiant 神经网络输入层。要生成 1600 个特征,必须验证以下等式:窗口大小 = 1000 x(39 x 帧步长 + 帧长度)。

                        FrRvHFzVWGqTM_h6pe7blfLVNVrT

图2.5Syntiant设置

之后单击单击左侧菜单中的NN Classifier,进行神经网络参数的配置,详细配置如图2.6

FuVmtC9ugd3Ui3Nle-9SZjeCEMRd

图2.6 Syntiant NN 配置

神经网络架构自动填充 Syntiant 配置:256 个神经元的 3 个 Dense 层和 3 个 Dropout 层,之后开始进行训练,得到的训练模型后进行下载后替换到官方提供的arduino工程里的模型。详细教程参考https://docs.edgeimpulse.com/docs/tutorials/hardware-specific-tutorials/responding-to-your-voice-syntiant-rc-commands-go-stop

3软件部分编写

本项目使用了arduino1.8.9软件进行程序编写,代码的主要逻辑是,当识别到语音为打开后对全局变量turn_on_count加1,在turn_on_count不等于0的情况下,识别到语音为绿灯,蓝灯,红灯后,进行相应处理并把turn_on_count置为零,在turn_on_count等于0的情况下,当识别语音为绿灯,蓝灯,红灯时保持LED灯关闭。这里主要处理的是语音识别的中断函数,详细修改代码如下:

#include "src/syntiant.h"

#include <NDP.h>

#include <NDP_utils.h>

#include <Arduino.h>

static int turn_on_count=0;

/**

* @brief Called when a inference matches 1 of the features

*

* @param[in] event The event

* @param[in] confidence The confidence

* @param[in] anomaly_score The anomaly score

*/

void on_classification_changed(const char *event, float confidence, float anomaly_score)

{

// here you can write application code, e.g. to toggle LEDs based on keywords

if (strcmp(event, "turn_on") == 0)

{




turn_on_count+=1;

Serial.print(turn_on_count);




}

/* else if(strcmp(event,"turn_off"))

{




turn_on_count=0;

digitalWrite(LED_RED,LOW);

digitalWrite(LED_GREEN,LOW);

digitalWrite(LED_BLUE,LOW);

}

*/

else if (strcmp(event, "red_led") == 0)

{

if(turn_on_count>0)

{




digitalWrite(LED_RED, HIGH);

turn_on_count=0;

}

else

{

digitalWrite(LED_RED, LOW);

digitalWrite(LED_GREEN, LOW);

digitalWrite(LED_BLUE, LOW);




}

}

else if (strcmp(event, "green_led") == 0)

{

if(turn_on_count>0)

{




digitalWrite(LED_GREEN, HIGH);

turn_on_count=0;

}




else

{

digitalWrite(LED_RED, LOW);

digitalWrite(LED_GREEN, LOW);

digitalWrite(LED_BLUE, LOW);







}

}

else if (strcmp(event, "blue_led") == 0)

{

if(turn_on_count>0)

{




digitalWrite(LED_BLUE, HIGH);

turn_on_count=0;

}

else

{

digitalWrite(LED_RED, LOW);

digitalWrite(LED_GREEN, LOW);

digitalWrite(LED_BLUE, LOW);




}




}

else if (strcmp(event, "z_openset") == 0)

{




digitalWrite(LED_RED, LOW);

digitalWrite(LED_GREEN, LOW);

digitalWrite(LED_BLUE, LOW);

}

Serial.println(turn_on_count);

}

void setup(void)

{

syntiant_setup();

}

void loop(void)

{

syntiant_loop();

}

4.结果与总结

4.1结果

板子连接上电脑后,打开arduino软件,打开串口监视器串口波特率设置为115200,可以观察到识别的信息,详细的识别过程在视频中,从识别结果来看,识别比较精准,但是也有识别错误的时候,主要是数据量少以及噪声的影响。板子运行状态如图4.1。

Fuq-6jPY945YcmQWR9mdy0bdHtJA

 

图4.1识别时运行状态

4.2总结

很高兴参加硬禾学堂和得捷电子举办的这一期的活动,学习了深度学习相关知识和arduino的使用。

附件下载

funpack2-1.zip

团队介绍

评论

0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号