Funpack第二季第一期——语音控制LED
Funpack第二季第一期任务一:用自带的麦克风,搭建机器学习模型,使板卡上的LED灯根据中文语音指令(不少于三个指令)呈现出不同效果,如开灯、关灯、闪烁、SOS、呼吸等。
标签
嵌入式系统
Arduino
Funpack
TinyML
Syntiant
MDYi
更新2022-07-05
北京交通大学
514

0.目录

  1. 项目要求

  2. 实现功能

  3. 建立模型

  4. 建立工程

  5. 修改代码

  6. 心得体会

 

1.项目要求

用自带的麦克风,搭建机器学习模型,使板卡上的LED灯根据中文语音指令(不少于三个指令)呈现出不同效果,如开灯、关灯、闪烁、SOS、呼吸等。

 

2.实现功能

通过中文语音控制板载RGB灯光,共使用3条指令,分别为“开启红灯”、“开启蓝灯”以及“关闭”,对应标签如下。

中文语音标签动作开启红灯red打开红色指示灯开启蓝灯blue打开蓝色指示灯关闭close关闭所有指示灯

板载RGB指示灯控制脚分别为PA06(绿色)、PA05(蓝色)、PA05(红色),高电平亮起,低电平熄灭。

FgkitrFPO7jtHPz3eLUa82Q3Rbmj

 

3.建立模型

1)进入Dashboard - Syntiant-RC-Go-Stop - Edge Impulse网站,克隆GO-STOP项目,按照指导手册熟悉使用流程。

2)新建项目,准备数据集。选择左侧“Data acquisition”进行数据采集工作。

FodXE2kWbJqwkHPla_b9fDmGcfLe

选择此处蓝色高亮的“Show Options”。

Fsxl5h6A10MTl2e5Kd9prwKhaRtg

采集方式有多种,可以通过开发板的板载麦克风、手机、电脑等方式进行音频采集,在这里选择第一项——使用板载麦克风,需要给予麦克风权限。

FpsoKGppzIlnxQjX5F91cpYHREUJ

采集时需要对音频设置标签,该标签在后续用来进行分类。采集时间可以设置的较长,进行多次采集后进行再分割较为方便。可以手动设置该段数据为训练集或测试集,也可以选择自动(Split automatically),尽量保证训练集与测试集比例为4:1。

FlyPIuNFelO8BuG0dV4rUm4dSxNx

采集后的数据可以在“Split sample”处进行分割。

Fjd4PcwevzQOdHwDRam6ow86btoE

3)建立模型,参数如下。

Fssuk9lb1PEoRhAPqObAc29EPSEd

Fvl8Wro9aDDFHRELUDs5fAB8Dzs1

4)进行训练,结果如下。

FuhIwuCT9rJVLicZ0AbHLjDV69E8

5)下载模型

在左侧菜单栏选择”Deployment“,可先在”Build firmware“中下载固件,利用arduino-cli烧录至开发板中,进行测试,具体过程参见指导手册。

arduino使用13.0版本如果如法烧录可以使用记事本打开”flash_windows.bat“,修改

set /a EXPECTED_CLI_MAJOR=0
set /a EXPECTED_CLI_MINOR=13

set /a EXPECTED_CLI_MAJOR=0
set /a EXPECTED_CLI_MINOR=0

即可忽略版本要求。

也可以使用arduino-cli的18.0版本。

 

4.建立工程

在github中下载开发例程(firmware-syntiant-tinyml),解压后将.ino文件所在文件夹命名为”firmware-syntiant-tinyml“,之后按照文件夹中README.md文件进行操作。

在”Create library“中下载库文件,解压后得到1个文件夹与2个文件,复制”model-parameters“文件夹下”dsp_blocks.h“与”model_metadata.h“两项替换”firmware-syntiant-tinyml“中同名文件夹下同名文件(注意:不要替换”model_variables.h“文件)。

Flqn4ArqingPwLXU0AFKodTUIBha

打开例程中的”model_variables.h“文件,修改第29行中的标签为上一步中的数据集标签。

const char* ei_classifier_inferencing_categories[] = { "blue", "close", "red" };

如果标签数量增多或减少,可通过”model_metadata.h“文件中第59行宏定义进行修改。

#define EI_CLASSIFIER_LABEL_COUNT         3

 

5.修改代码

使用arduino打开”firmware-syntiant-tinyml.ino“,程序依然分为setuploop两部分,不同的是多了一个中断函数。

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

该中断函数会在识别到语音片段后给出一个event字符串,将该字符串与训练集的标签进行匹配,即可确认是否为正确的语音。

在中断函数下修改不同的字符串匹配,进行不同的任务。由于本次任务较为简单,代码也较为简洁,主要代码如下。

void TurnOffLED(void){
  digitalWrite(LED_RED, LOW);
  digitalWrite(LED_BLUE, LOW);
  digitalWrite(LED_GREEN, LOW);
}
​
void on_classification_changed(const char *event, float confidence, float anomaly_score) {
  if (strcmp(event, "red") == 0) {
    TurnOffLED();
    digitalWrite(LED_RED, HIGH);
    delay(300);
  }
  if (strcmp(event, "blue") == 0) {
    TurnOffLED();
    digitalWrite(LED_BLUE, HIGH);
    delay(300);
  }
  if (strcmp(event, "close") == 0) {
    TurnOffLED();
    delay(300);
  }
}

 

6.心得体会

  • 训练集单人采集效率较低,且数量较少,训练效果差。

  • 受限于硬件性能,Syntiant Tinyml Board的识别准确率不高,仍难以应用于大型项目中。

  • 开发板小巧方便,可以在一些小型平台上实现嵌入式系统,且功耗极低,对供电压力小。

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