本文旨在分享在微控制器(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/

二、工程集成与代码适配
在自己的工程项目中新建一个kws文件夹,并将以下内容整合进来:
- 将
Deployment/Source 目录下,除 KWS_F746NG 外的所有子文件夹复制到你的工程。
- 从下载的 CMSIS 包中,将
CMSIS/DSP 和 CMSIS/NN 目录下的 Include 与 Source 子目录复制到工程。
- 将原项目中的
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. 解决编译问题
3. 调整内存配置
由于C++代码会使用new和malloc进行动态内存分配,需将堆(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,即可看到识别结果。测试结果会打印出检测到的关键词及其置信度。

五、总结与展望
本次实践成功在i.MX RT1020 MCU上部署并离线测试了基于CNN的KWS关键词识别流程。整个过程涵盖了从开源项目整合、CMSIS软件包适配、工程配置、代码修改到最终功能验证的完整步骤,为在资源受限的嵌入式设备上运行轻量级人工智能模型提供了参考。
后续,可以将此离线文件测试模式扩展为实时音频采集与识别。例如,结合麦克风输入进行实时语音唤醒,再通过红外发射模块控制家电(如电视开关),从而构建一个完整的嵌入式语音交互原型系统。