本文分享基于 Titan Mini Board实现KWS语音关键字识别测试,分享应用Demo。代码详见附件完整工程, 导入Titan_Mini_wavplayer到打开工程即可。
1 过程
参考https://github.com/ARM-software/ML-KWS-for-MCU.git基于该项目训练的模型进行。
先下载该项目代码git clone https://github.com/ARM-software/ML-KWS-for-MCU.git
然后下载CMSIS 5.4.0:https://www.keil.arm.com/packs/cmsis-arm/versions/
项目中新建kws文件夹
添加以下代码到自己的工程
Deployment\Source下除了KWS_F746NG的所有子文件夹
CMSIS/DSP CMSIS/NN 都只要Include和Source子目录
simple_test main.cpp改为kws_app.cpp
工程目录如下

代码中使用了C++需要按照以下支持C++编译
使能C++支持

有编译报错按照如下处理
//__COMPILER_BARRIER();
改为
__ASM volatile("":::"memory");
rt-thread\components\libc\cplusplus\cxx_crt_init.c中
改为
#elif defined(__GNUC__)typedef void(*pfunc)();extern pfunc __init_array_start[];extern pfunc __init_array_end[];pfunc *p;for (p = __init_array_start; p < __init_array_end; p++)(*p)();#endif
如果工程目录看不到子文件夹和c++文件,按照如下配置



并设置对应的头文件包含路径,C和C++都要配置


工程中定义宏C和C++都要配置
ARM_MATH_CM7
__FPU_PRESENT=1
HAVE_CONFIG_H


其他详见代码
2 测试
添加shell命令
shell_func.c中添加
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();}
Shell中输入kws_test输入结果如下


还可以录音不同测试文件,通过shell导入到开发板
这里使用Audacity录音单声道16k的语音
"yes","no","up","down","left","right","on","off","stop","go"
波录->录制->录制
文件->导出音频

将文件导入到开发板
rxfile /yes.wav 55884

其他文件类似

增加测试命令
static void kwstestwavfunc(uint8_t* param);{ (uint8_t*)"kwstestwav", kwstestwavfunc, (uint8_t*)"kwstestwav path"},extern int kws_run(int16_t* in);static int16_t audio_buffer[16000];static int read_wav(char* name, int16_t* buffer, int len){uint8_t tmp[64];FRESULT res;FIL fil;UINT br;wav_t wav;if(FR_OK == (res=f_open(&fil,(constchar*)name, FA_READ))){if(FR_OK != (res=(f_lseek(&fil,0)))){f_close(&fil);return-2;}res = f_read(&fil,tmp,sizeof(tmp),&br);if(res != FR_OK){f_close(&fil);return-3;}if(wav_decode(tmp, &wav, br) < 0){f_close(&fil);xprintf("decode wav err\r\n");return-4;}xprintf("audioformat:%d\r\n",wav.audioformat);xprintf("bitspersample:%d\r\n",wav.bitspersample);xprintf("blockalign:%d\r\n",wav.blockalign);xprintf("byterate:%d\r\n",wav.byterate);xprintf("chunksize:%d\r\n",wav.chunksize);xprintf("datasize:%d\r\n",wav.datasize);xprintf("numchannels:%d\r\n",wav.numchannels);xprintf("off:%d\r\n",wav.off);xprintf("samplerate:%d\r\n",wav.samplerate);if(FR_OK != (res=(f_lseek(&fil,wav.off)))){f_close(&fil);return-5;}if(FR_OK == (res = f_read(&fil,buffer,len,&br))){}if(FR_OK != (res = f_close(&fil))){xprintf("close %s err %d\r\n",name,res);}return br;}else{xprintf("open %s err %d",name,res);return-1;}}static void kwstestwavfunc(uint8_t * cmdbuf){char name[32];int len;int res;len = sscanf((charconst *)cmdbuf, "%*s %31s", name);if (len == 1){res = read_wav(name, audio_buffer, sizeof(audio_buffer));if(res < 0){xprintf("read wav err\r\n");} elseif(res < sizeof(audio_buffer)){xprintf("wav is too short\r\n");}kws_run(audio_buffer);}}
Shell中输入kwstestwav /yes.wav
打印如下

其他关键字测试


3 总结
以上分享了KWS语音关键字识别测试,分享应用Demo。实践中可以将上述测试数据改为实时获取MIC数据。
全部0条评论
快来发表一下你的评论吧 !