找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

433

积分

0

好友

55

主题
发表于 3 天前 | 查看: 8| 回复: 0

本文旨在分享在微控制器(MCU)上部署并运行基于卷积神经网络(CNN)的关键词识别(KWS)模型的具体过程。本次实践以恩智浦i.MX RT1020开发板为硬件平台,参考并基于ARM官方开源项目 ML-KWS-for-MCU 中已训练好的模型进行。掌握此流程后,开发者可进一步训练并部署自定义的语音识别模型。

一、准备工作

首先,克隆ARM官方的参考项目代码到本地:

git clone https://github.com/ARM-software/ML-KWS-for-MCU.git

接下来,需要下载 CMSIS(Cortex Microcontroller Software Interface Standard)软件包。请注意,需要下载与该项目兼容的早期版本,新版CMSIS可能存在接口不匹配的问题。 下载地址:https://www.keil.arm.com/packs/cmsis-arm/versions/

CMSIS版本选择

二、工程集成与代码适配

在自己的工程项目中新建一个kws文件夹,并将以下内容整合进来:

  1. Deployment/Source 目录下,除 KWS_F746NG 外的所有子文件夹复制到你的工程。
  2. 从下载的 CMSIS 包中,将 CMSIS/DSPCMSIS/NN 目录下的 IncludeSource 子目录复制到工程。
  3. 将原项目中的 simple_test/main.cpp 文件重命名为 kws_app.cpp 并添加至工程。

完成文件添加后,工程目录结构应类似于下图:

工程目录结构

随后,在IDE中正确设置上述源文件所在路径为头文件包含路径:

头文件包含路径设置

三、核心代码与配置修改

1. 修改 kws_app.cpp 文件 此文件是应用的主逻辑,我们将其修改为从静态音频数据中进行识别。

#include <stdint.h>
#include "xprintf.h"
#include "kws_ds_cnn.h"
#include "wav_data.h"

int16_t audio_buffer[16000]=WAVE_DATA; // 使用预置的语音数据

extern "C" int kws_test(void);

int kws_test(void)
{
    // 定义关键词类别标签
    char output_class[12][8] = {"Silence", "Unknown", "yes", "no", "up", "down", "left", "right", "on", "off", "stop", "go"};

    KWS_DS_CNN kws(audio_buffer);
    kws.extract_features(); // 提取MFCC特征
    kws.classify();         // 使用DNN进行分类推理

    int max_ind = kws.get_top_class(kws.output);
    xprintf("Detected %s (%d%%)\r\n", output_class[max_ind], ((int)kws.output[max_ind]*100/128));

    return 0;
}

2. 解决编译问题

  • 宏定义:在工程全局宏定义中添加 ARM_MATH_CM7__FPU_PRESENT=1,以启用Cortex-M7的硬件FPU和数学库支持。
  • 删除依赖:删除所有源代码中的 #include "mbed.h" 语句,因为本例不依赖mbed框架。
  • 数学常量:在 mfcc.cpp 文件中添加圆周率 M_PI 的宏定义,确保编译通过。
    #ifndef M_PI
    #define M_PI 3.14159265358979323846
    #endif

3. 调整内存配置 由于C++代码会使用newmalloc进行动态内存分配,需将堆(Heap)区域设置到容量更大的SDRAM中。修改链接脚本文件(如 MIMXRT1021xxxxx_sdram.scf),将SDRAM起始的1MB空间分配为堆。

ARM_LIB_HEAP 0x80000000 EMPTY 0x100000 {
    ; 分配SDRAM起始1MB作为堆区域
};

四、功能测试与验证

为了方便测试,我们添加一个简单的Shell命令来触发关键词识别函数。

// 命令表声明
static void kwstestfunc(uint8_t* param);
{ (uint8_t*)"kwstest", kwstestfunc, (uint8_t*)"kwstest"},

// 命令函数实现
extern int kws_test(void);
static void kwstestfunc(uint8_t * cmdbuf)
{
    (void)cmdbuf;
    kws_test(); // 执行KWS识别
}

将工程编译并下载到i.MX RT1020开发板后,在串口Shell中输入命令 kwstest,即可看到识别结果。测试结果会打印出检测到的关键词及其置信度。

Shell命令测试 识别结果输出

五、总结与展望

本次实践成功在i.MX RT1020 MCU上部署并离线测试了基于CNN的KWS关键词识别流程。整个过程涵盖了从开源项目整合、CMSIS软件包适配、工程配置、代码修改到最终功能验证的完整步骤,为在资源受限的嵌入式设备上运行轻量级人工智能模型提供了参考。

后续,可以将此离线文件测试模式扩展为实时音频采集与识别。例如,结合麦克风输入进行实时语音唤醒,再通过红外发射模块控制家电(如电视开关),从而构建一个完整的嵌入式语音交互原型系统。




上一篇:PyTorch自动微分原理与工程实践:从计算图到梯度优化
下一篇:SpringBoot异常处理最佳实践:7个技巧构建清晰可维护的异常体系
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区(YunPan.Plus) ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-7 00:45 , Processed in 0.072962 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 CloudStack.

快速回复 返回顶部 返回列表