Funpack第二季第一期 Syntiant 语音识别
利用EDGE IMPULSE平台训练语音指令,部署在syntiant 板子上,达到开关灯的效果。
标签
Arduino
TinyML
Syntiant
EDGE IMPLUSE
qewtry
更新2022-07-06
496

项目简介:

      这是一期看起来简单,听起来也简单,做起来确有些绕的活动。拿到板子后,我选择了任务一:搭建机器学习模型,使板卡上的LED灯根据中文语音指令,呈现出不同效果。我训练的关键字及显示效果如下:王富贵-红灯,开始-绿灯,结束-蓝灯。

      虽然在实际操作时,多次因编译环境搭建不成功,一度想放弃,但syntiant板子确实做的可以,冲着这颜值,还是坚持了下来。 下图就是syntiant开发板,我们可以看到板子做的很精致。开发板出厂时候自带的例子效果特别好,准确度非常高,刷掉之后,一直没找到恢复的方法,如果有朋友知道如何恢复,烦请告知。

FnDHUq6LY08xOg53Kdlqg1bj6LSS

Fl5cARonTXIMNA67Qpyt8ig8hrXr      板上的NDP101是一块神经决策处理器,也是核心所在,语音识别全靠它。另外官方宣称这块芯片功耗极低,语音和传感器应用程序分别在 140 和 100 微瓦以下运行。我实测试了一下开发板整体电流也就27mA,确实很低。

FtF53e47PKN-vZxe7gmL3KsTPKmX

      上图是开发板的硬件框图,俗话说麻雀虽小但可以吃,开发板该有的功能模块它都有。我们可以看到它其实还有另外一块MCU SAMD21,这种双MCU架构显然是增加了软件开发复杂程度。不过倒也不用担心,官方很贴心的做了一键下载的工具包,还是很方便的。

实现过程:

      利用EDGE IMPULSE平台训练语音指令模型,部署在syntiant 板子上。通过调整官方示例代码匹配到关键字后控制板载led灯亮灭。

      1.EDGE IMPULSE训练模:这部分有一个很详细的训练教程,,参见Funpadk第二季第一期活动首页 可以说是有手就行。训练完之后可以查看一下分数。

Fk85Xxae8wcjZnnhHJbSbdhi9xhn

      2.修改arduino工程:因为官方有提供的示例代码,我们直接下载过来进行修改。我这里只做了很小的改动:在中断函数中,修改了匹配关键字及控制led状态指令。

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, "fugui") == 0) {
        // Toggle LED
        digitalWrite(LED_RED, HIGH);
        digitalWrite(LED_GREEN, LOW);
        digitalWrite(LED_BLUE, LOW);
    }

    if (strcmp(event, "kaishi") == 0) {
        // Toggle LED
        digitalWrite(LED_RED, LOW);
        digitalWrite(LED_GREEN, HIGH);
        digitalWrite(LED_BLUE, LOW);
    }

    if (strcmp(event, "jieshu") == 0) {
        // Toggle LED
         digitalWrite(LED_RED, LOW);
        digitalWrite(LED_GREEN, LOW);
        digitalWrite(LED_BLUE, HIGH);
    }
}

      3.在修改官方示例库时,需要做如下调整,将src文件下model-parameters中三个“dsp_blocks.h”,“model_metadata.h”,“model_variables.h”文件替换为自己的buld的库中的.h文件,并修改model_variables.h文件内容如下。

#ifndef _EI_CLASSIFIER_MODEL_VARIABLES_H_
#define _EI_CLASSIFIER_MODEL_VARIABLES_H_

#include <stdint.h>
#include "model_metadata.h"
//#include "edge-impulse-sdk/classifier/ei_model_types.h"

const char* ei_classifier_inferencing_categories[] = { "fugui", "huanjing", "jieshu", "kaishi" };

uint8_t ei_dsp_config_25_axes[] = { 0 };
const uint32_t ei_dsp_config_25_axes_size = 1;
ei_dsp_config_audio_syntiant_t ei_dsp_config_25 = {
    1,
    1,
    0.032f,
    0.024f,
    40,
    512,
    0,
    0,
    0.96875f
};
// const ei_model_performance_calibration_t ei_calibration = {
//     1, /* integer version number */
//     (int32_t)(EI_CLASSIFIER_RAW_SAMPLE_COUNT / ((EI_CLASSIFIER_FREQUENCY > 0) ? EI_CLASSIFIER_FREQUENCY : 1)) * 1000, /* Model window */
//     0.8f, /* Default threshold */
//     (int32_t)(EI_CLASSIFIER_RAW_SAMPLE_COUNT / ((EI_CLASSIFIER_FREQUENCY > 0) ? EI_CLASSIFIER_FREQUENCY : 1)) * 500, /* Half of model window */
//     0   /* Don't use flags */
// };

#endif // _EI_CLASSIFIER_MODEL_METADATA_H_

效果演示图

      说出中文指令后,syntiant开发板从串口打印出匹配结果,并点亮对应颜色led,如下图:

FqZeAMhQVSZcb34uGst_KE3id9MY

注意事项:

      1.使用cmd一键下载官方固件到开发板后,可能存在在设备管理器中找不到tinyml 语音输入设备的情况,此时电脑设备管理器串口栏会出现两个的串口。找到带感叹号的那个,右键卸载,重新插拔开发板后,tinyml音频输入设备就可以正常使用了。

Fm1E5QDtj1MwrXOJH-BTNiUYemmD

      2.训练模型时,尽量用网页提供的方法录音,电脑录音软件录音可能带来底噪,造成训练结果不佳的问题。

      3.备一张SD卡,格式化为FAT32,如果训练的模型识别率不高,效果不好,可以返回EDGE IMPULSE 重新训练buld后将ei_model.bin放进SD卡,重新上电后开发板会自动加载这个文件。

心得体会:

      1.作为一个拉线工,表示对环境的搭建有些力不从心,虽然有前辈视频教程在前,又有一批热心同行者在线答疑,但是弯路是一点没少走。

      2.如果有后来人跟笔者一样深受arduino环境搭建的苦,可以尝试如下思路,CMD一键下载后,使用上位机将电脑串口数据映射到另一个串口,再用另一块开发板判断匹配结果。

附件下载
firmware-syntiant-tinyml.zip
arduino 工程文件
syntiant-rc-go-stop-syntiant-ndp101-v46.zip
训练的模型文件
团队介绍
一个拖延症晚期患者。
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号