硬核实战 | 基于Cortex-M85平台的KWS语音关键字识别测试应用

描述

本文分享基于 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数据。

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分