Press "Enter" to skip to content

Syntiant TinyML 开发板 + Edge Impulse 机器学习实现语音识别

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

 

 

项目说明

 

本次项目用 Syntiant TinyML 开发板自带的麦克风,通过 Edge Impulse 搭建机器学习模型,使板卡上的 LED 灯根据中文语音指令呈现出不同效果。一共训练了四个标签的声音数据,具体说明如下。

 

 

标签关键词动作
turn_on_blue打开蓝灯使板卡上的 RGB LED 灯显示蓝色
turn_on_green打开绿灯使板卡上的 RGB LED 灯显示绿色
turn_on_red打开红灯使板卡上的 RGB LED 灯显示红色
turn_off关灯关闭板卡上的 RGB LED 灯

 

硬件平台

 

Syntiant TinyML Board 是美国 AI 芯片研发商 Syntiant 推出的一款 TinyML 开发板,它配备了超低功耗 Syntiant NDP101 神经决策处理器,可以使语音和传感器应用程序分别在 140 和 100 微瓦以下运行。与基于 MCU 的传统 MCU 相比,Syntiant TinyML 板的吞吐量提高 20 倍,系统效率提高 200 倍。

 

Syntiant TinyML 板的尺寸非常小,仅为 24 毫米 x 28 毫米,是一个小型的独立系统。开发者可以直接通过 Micro USB 连接硬件,通过 Edge Impulse 轻松下载经过训练的模型,而无需任何专用调试硬件。

 

硬件组成:

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

语音训练

 

打开studio.edgeimpulse.com
网页,创建一个新的项目,例如 Syntiant_TinyML_Voice,作为本次语音训练的项目。

 

 

 

创建完成后进入项目主页面,在这里可以看到训练的大致流程:选择设备、选择语音输入源、采集语音数据、创建 Impulse 模型、训练数据、生成固件、部署到硬件。

 

 

 

语音数据采集方面,由于我们需要采集类似“打开红灯”这样的语音,为了方便采集和训练,我们将采集时长定为 2 秒。分别为四个标签采集 20 组数据,按照 8:2 的比例分为训练集和测试集。

 

 

 

采集数据后记得检查一下数据的质量,在 Data acquisition 页面选中任意一条采集的语音数据,可以看到声音的波形,回放该条录音。在训练之前需要确保所有训练和测试的数据完好,否则会影响训练效果。

 

 

 

如果数据没问题,接下来就可以创建机器学习模型,一共分为四个模块。首先是时间窗口的设置,对于 Syntiant TinyML 语音模块,Window size 大小固定为 968 ms,Window increase 设置为 30 ms(窗口增加设置比较小有利于机器学习匹配出语音)。第二个模块选择 Syntiant audio,第三个模块选择最近邻分类器(Nearest Neighbor Classifier),最后确认输出turn_off
turn_on_blue
turn_on_green
turn_on_red
四个标签。点击 Save Impulse 保存模型。

 

 

 

然后设置 Mel 滤波器特征参数,这里采用默认参数。

 

 

 

开始训练模式,训练结果准确率为 90.2%,不是特别高,但也可以测试看看。

 

 

 

点击左侧边栏的 Deployment,选择 Syntiant NDP101 library 下载训练好的库,将其替换到你的工程中(参考Syntiant TinyML Board 固件下载
)。

 

 

 

Arduino 工程

 

参考Syntiant_TinyML_Board_Demo
中的 VoiceResponding 项目,修改标签名称及其触发的动作,代码如下。

 

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_red") == 0) {
 
        // Toggle LED
        digitalWrite(LED_RED, HIGH);
        digitalWrite(LED_BLUE, LOW);
        digitalWrite(LED_GREEN, LOW);
    }
    if (strcmp(event, "turn_on_green") == 0) {
 
        // Toggle LED
        digitalWrite(LED_GREEN, HIGH);
        digitalWrite(LED_BLUE, LOW);
        digitalWrite(LED_RED, LOW);
    }
    if (strcmp(event, "turn_on_blue") == 0) {
 
        // Toggle LED
        digitalWrite(LED_BLUE, HIGH);
        digitalWrite(LED_GREEN, LOW);
        digitalWrite(LED_RED, LOW);
    }
    if (strcmp(event, "turn_off") == 0) {
 
        // Toggle LED
        digitalWrite(LED_BLUE, LOW);
        digitalWrite(LED_GREEN, LOW);
        digitalWrite(LED_RED, LOW);
    }
}

 

通过 Arduino IDE 重新编译、上传到 Syntiant TinyML Board,就可以看到效果啦!

 

演示视频

https://www.bilibili.com/video/BV1ZN4y1u7kX

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。