Funpack第二季第一期 Syntiant TinyML Board
用自带的麦克风,搭建机器学习模型,使板卡上的LED灯根据中文语音指令(不少于三个指令)呈现出不同效果,如开灯、关灯、闪烁、SOS、呼吸等
标签
嵌入式系统
Arduino
tingml
xbreeze
更新2022-07-06
551

Funpack第二季第一期

一 项目介绍

这次的funpack活动是基于Syntiant TinyML board的板子做语音识别,我选择的是任务一:用自带的麦克风,搭建机器学习模型,使板卡上的LED灯根据中文语音指令(不少于三个指令)呈现出不同效果,如开灯、关灯、闪烁、SOS、呼吸等。

二 板卡介绍:有一个超低功耗 Syntiant ® NDP101神经决策处理器™,可以使语音和传感器应用程序分别在 140 和 100 微瓦以下运行,与基于 MCU 的传统 MCU 相比,吞吐量提高 20 倍,系统效率提高 200 倍。Syntiant TinyML 板的尺寸为 24 毫米 x 28 毫米,是一个小型的独立系统,通过微型 USB 连接通过 Edge Impulse 轻松下载经过训练的模型,而无需任何专用硬件。主要硬件参数:主机处理器:SAMD21 Cortex-M0+ 32位低功耗48MHz ARM MCU,神经决策处理器使用NDP101,连接了BMI160 6轴运动传感器和SPH0641LM4H麦克风,NDP101支持多达 560k 个参数和 64 种输出分类,电路板可使用5V micro-USB或3.7V LiPo电池供电。

三 任务分析

因为Syntiant TinyML board是Edge Impulse平台适配过的,可以在Edge Impulse平台上上传自己的中文指令音频数据,通过Edge Impulse平台自带的算法模块,进行模型训练,最后在输出c++库文件。然后Syntiant TinyML board是兼容arduino mkr系列板子,所以可以用arduino工具和arduino的库快捷开发。再把自己的指令写在指令触发的位置,实现特定的功能。在直播的时候给了一个建议就是用四个字的中文语音的指令,能提高语音识别的准确度。第一步先制作自己的语音数据集,第二部就是训练自己语音模型,第三步把指令和语音模型库文件组合开发,最后在测试最终效果。

四 代码:


#include "src/syntiant.h"
#include <NDP.h>
#include <NDP_utils.h>
#include <Arduino.h>


void on_classification_changed(const char *event, float confidence, float anomaly_score)
{
  //听到“关闭”执行
  if (strcmp(event, "off") == 0)
  {  
    LED_all_off();
    
  }
  //听到“打开”执行
  if (strcmp(event, "on") == 0)
  {
    LED_all_off();
    digitalWrite(LED_RED, HIGH);
  }
  
  //听到“闪烁”执行
  if(strcmp(event, "twinkle") == 0)
  {
    LED_all_off();
    for(int i=0;i<5;i++){
      digitalWrite(LED_RED, HIGH); 
      delay(300);
      LED_all_off();
      delay(300);
    }
  }
  
  //听到“呼吸”执行 
  if(strcmp(event, "breath") == 0)
  {
    LED_all_off();
    int i=0;
    for(int x=5;x>0;x--){
      for(;i<256;i=i+3){
        setColor(0,0,i);
        delay(10);
      }
      for(;i>0;i=i-3){
        setColor(0,0,i);
        delay(10);
      }
      setColor(0,0,0);
    }
  }
}

//关闭所有灯光
void LED_all_off()
{
  digitalWrite(LED_RED, LOW);
  digitalWrite(LED_BLUE, LOW);
  digitalWrite(LED_GREEN, LOW);
}

//设置led亮度
void setColor(int red,int green,int blue) 
{
    analogWrite(LED_RED,red);
    analogWrite(LED_GREEN,green);
    analogWrite(LED_BLUE,blue);
}

void setup(void)
{
    syntiant_setup();//初始化 
}

void loop(void)
{
  syntiant_loop();
}

 

 

 

五 代码解析:

因为官方是在github写了一个示例,然后自己的代码可以在官方的基础上进行修改,在Edge Impulse平台上上传自己的音频文件,然后经过平台算法的训练,把训练的模型进行编译输出,on_classification_changed函数是当检测到语音指令就会调用 把值和每个指令进行比对,如果比对成功就执行自定义的代码。这里我选择了四个中文指令,分别是“打开灯光”,“关闭灯光”,“呼吸”,“闪烁”。setColor是一个改变灯光亮度的一个函数。在编译之后(在编译的时候 要选择Syntiant NDP101 library编译,然后下面Find posterior parameters这个选项里面的,把自己需要的中文指令也要打上勾)把编译的文件model-parameters和官方示例项目中。scr目录中 model-parameters文件进行替换。在"model_variables.h"这个头文件里面 把

 #include "edge-impulse-sdk/classifier/ei_model_types.h"这个行代码注释掉,
ei_model_performance_calibration_t ei_calibration这个常量也需要注释掉。我们自己编译的代码里面没有这两东西,但是删掉他们也不会有什么影响。但是不删掉arduino的编译通过不了,所以一定要删除。实现的原理就是板子的麦克风会一直监听语音,如果有和模型相同的语音指令就会调用
on_classification_changed这个函数,这个函数是我们自定义的指令执行代码。
 

六 心得体会:

这个项目最麻烦的地方就是数据训练,因为你需要大量的语音数据,数据越多然后特征就越明显,顺之而来的就是识别率的提升。得捷电子和硬核学堂和硬核学堂推出的Funpack活动,让我们这种没有基础和经验的人,体验到了人工智能快乐。最近这几年随着人工智能和深度学习的发展,越来越多电子厂商和软件平台开始向这方面发力,还有还多开源项目像雨后春笋一样冒出来。人工智能和深度学习离我们的生活越来越近,希望人工智能会越来越好。在这里谢谢得捷电子和硬核学堂举办的Funpack活动。谢谢群里面的大佬答疑解惑。

七 项目演示:

呼吸(蓝灯)

FjM4x1yer0ukV9u6OAsxcsdFrO0r

 

关闭

FsahNwPOA5KPSRLlgjGAad0eVBU5

打开

FtqFRw4cRWW49CFLbtdH0qyB2iq5

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