0.目录
-
项目要求
-
实现功能
-
建立模型
-
建立工程
-
修改代码
-
心得体会
1.项目要求
用自带的麦克风,搭建机器学习模型,使板卡上的LED灯根据中文语音指令(不少于三个指令)呈现出不同效果,如开灯、关灯、闪烁、SOS、呼吸等。
2.实现功能
通过中文语音控制板载RGB灯光,共使用3条指令,分别为“开启红灯”、“开启蓝灯”以及“关闭”,对应标签如下。
中文语音标签动作开启红灯red打开红色指示灯开启蓝灯blue打开蓝色指示灯关闭close关闭所有指示灯
板载RGB指示灯控制脚分别为PA06(绿色)、PA05(蓝色)、PA05(红色),高电平亮起,低电平熄灭。
3.建立模型
1)进入Dashboard - Syntiant-RC-Go-Stop - Edge Impulse网站,克隆GO-STOP项目,按照指导手册熟悉使用流程。
2)新建项目,准备数据集。选择左侧“Data acquisition”进行数据采集工作。
选择此处蓝色高亮的“Show Options”。
采集方式有多种,可以通过开发板的板载麦克风、手机、电脑等方式进行音频采集,在这里选择第一项——使用板载麦克风,需要给予麦克风权限。
采集时需要对音频设置标签,该标签在后续用来进行分类。采集时间可以设置的较长,进行多次采集后进行再分割较为方便。可以手动设置该段数据为训练集或测试集,也可以选择自动(Split automatically),尽量保证训练集与测试集比例为4:1。
采集后的数据可以在“Split sample”处进行分割。
3)建立模型,参数如下。
4)进行训练,结果如下。
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“文件)。
打开例程中的”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“,程序依然分为setup与loop两部分,不同的是多了一个中断函数。
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的识别准确率不高,仍难以应用于大型项目中。
-
开发板小巧方便,可以在一些小型平台上实现嵌入式系统,且功耗极低,对供电压力小。