标题:
stm32-speech-recognition小程序
[打印本页]
作者:
辉煌008
时间:
2019-11-26 17:30
标题:
stm32-speech-recognition小程序
有需要可以下来看看
单片机源程序如下:
/********* main.C **********/
#include "includes.h"
#include "VAD.H"
#include "MFCC.H"
#include "DTW.H"
#include "GUI.H"
#include "flash.h"
#include "delay.h"
#define DEBUG
#ifdef DEBUG
#define DBP(fmt,arg...) USART1_printf(fmt,##arg)
#define DBPLN(fmt,arg...) USART1_printf_line(fmt,##arg)
#define DBPH(src, len) USART1_print_hex(src, len)
#else
#define DBP(fmt,arg...)
#define DBPLN(fmt,arg...)
#define DBPH(src, len)
#endif
u16 VcBuf[VcBuf_Len];
atap_tag atap_arg;
valid_tag valid_voice[max_vc_con];
v_ftr_tag ftr;
typedef struct
{
u8 str[3];
}comm_tag;
comm_tag commstr[]={"0 ","1 ","2 ","3 ","4 ","5 ","6 ","7 ","8 ","9 ","上","下","前","后","左","右","大","小"};
#define sel_clor BRED
#define dis_sel_clor GRED
#define spk_clor BRED
#define prc_clor GRED
#define save_ok 0
#define VAD_fail 1
#define MFCC_fail 2
#define Flash_fail 3
void disp_comm(u8 comm)
{
GUI_ClrArea(&(Label[comm]));
GUI_DispStr(&(Label[comm]),(u8 *)(commstr[comm-G_comm_fst].str));
}
void set_comm_backclor(u8 comm, u16 backclor)
{
Label[comm].BackColor=backclor;
disp_comm(comm);
}
void set_label_backclor(GUI_Area *Label, u16 backclor)
{
Label->BackColor=backclor;
GUI_ClrArea(Label);
}
void disp_home(void)
{
GUI_ClrArea(&Screen);
GUI_ClrArea(&(Label[G_wel]));
GUI_DispStr(&(Label[G_wel]),"欢迎使用");
GUI_ClrArea(&(Label[G_neme]));
GUI_DispStr(&(Label[G_neme]),"孤立词语音识别测试系统");
GUI_ClrArea(&(Label[G_prc]));
GUI_DispStr(&(Label[G_prc]),"模板训练");
GUI_ClrArea(&(Label[G_recg]));
GUI_DispStr(&(Label[G_recg]),"语音识别");
GUI_ClrArea(&(Label[G_designer]));
GUI_DispStr(&(Label[G_designer]),"设计者:宋健");
}
void record(void)
{
delay_ms(atap_len_t); //延时,避免点击屏幕发出的噪声
TIM_Cmd(TIM1, ENABLE); //开启定时器,开始信号采集
GUI_ClrArea(&(Label[G_ctrl])); //显示操作提示
GUI_DispStr(&(Label[G_ctrl]),"录音中");
//开始说话之前,录制一小段背景声音,用以实现背景噪声自适应
delay_ms(atap_len_t);
//提示开始说话
set_label_backclor(&(Label[G_spk]), spk_clor);
//等待缓冲区数据更新完毕
while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET);
//数据采集结束,关闭定时器
TIM_Cmd(TIM1, DISABLE);
//清数据传输完成标志,以备下次使用
DMA_ClearFlag(DMA1_FLAG_TC1);
//提示开始处理采集到的数据
set_label_backclor(&(Label[G_spk]), prc_clor);
}
void disp_mdl_prc(void)
{
u16 i;
GUI_ClrArea(&Screen);
set_label_backclor(&(Label[G_cap]), BRED);
GUI_DispStr(&(Label[G_cap]),"开始训练");
for(i=G_comm_fst;i<=G_comm_lst;i++)
{
disp_comm(i);
}
GUI_ClrArea(&(Label[G_return]));
GUI_DispStr(&(Label[G_return]),"返回");
}
u8 save_mdl(u16 *v_dat, u32 addr)
{
noise_atap(v_dat,atap_len,&atap_arg);
VAD(v_dat, VcBuf_Len, valid_voice, &atap_arg);
if(valid_voice[0].end==((void *)0))
{
return VAD_fail;
}
get_mfcc(&(valid_voice[0]),&ftr,&atap_arg);
if(ftr.frm_num==0)
{
return MFCC_fail;
}
return save_ftr_mdl(&ftr, addr);
}
void prc(void)
{
u32 i;
u8 prc_start=0;
u8 comm=G_comm_fst;
u8 prc_count=0;
u32 addr;
//v_ftr_tag *sav_ftr;
disp_mdl_prc();
set_comm_backclor(comm,sel_clor);
while(1)
{
wait_touch();
if(touch_area(&(Label[G_return])))
{
Label[G_cap].BackColor=GREEN;
Label[comm].BackColor=dis_sel_clor;
disp_home();
return;
}
else if(touch_area(&(Label[G_cap])))
{
delay_ms(150);
if(prc_start==0)
{
GUI_ClrArea(&(Label[G_cap]));
GUI_DispStr(&(Label[G_cap]),"停止训练");
prc_start=1;
GUI_ClrArea(&(Label[G_ctrl]));
GUI_DispStr(&(Label[G_ctrl]),"开始");
GUI_ClrArea(&(Label[G_spk]));
GUI_ClrArea(&(Label[G_count]));
GUI_DispStr(&(Label[G_count]),"已训练0次");
}
else
{
GUI_ClrArea(&(Label[G_cap]));
GUI_DispStr(&(Label[G_cap]),"开始训练");
prc_start=0;
prc_count=0;
GUI_HideArea(&(Label[G_ctrl]));
GUI_HideArea(&(Label[G_spk]));
GUI_HideArea(&(Label[G_stus]));
GUI_HideArea(&(Label[G_count]));
}
}
else if((touch_area(&(Label[G_ctrl])))&&(prc_start==1))
{
record();
GUI_ClrArea(&(Label[G_ctrl]));
GUI_DispStr(&(Label[G_ctrl]),"提取中");
addr=ftr_start_addr+(comm-G_comm_fst)*size_per_comm+prc_count*size_per_ftr;
if(save_mdl(VcBuf, addr)==save_ok)
{
prc_count++;
GUI_ClrArea(&(Label[G_count]));
GUI_printf(&(Label[G_count]),"已训练%d次",prc_count);
if(prc_count==ftr_per_comm)
{
prc_count=0;
}
GUI_ClrArea(&(Label[G_stus]));
GUI_DispStr(&(Label[G_stus]),"语音有效");
/*
sav_ftr=(v_ftr_tag *)addr;
USART1_printf("mask=%d ",sav_ftr->save_sign);
USART1_printf("frm_num=%d",sav_ftr->frm_num);
for(i=0;i<((sav_ftr->frm_num)*mfcc_num);i++)
{
USART1_printf("%d,",sav_ftr->mfcc_dat[i]);
}
*/
}
else
{
GUI_ClrArea(&(Label[G_stus]));
GUI_DispStr(&(Label[G_stus]),"语音无效");
}
GUI_ClrArea(&(Label[G_ctrl]));
GUI_DispStr(&(Label[G_ctrl]),"开始");
}
else if(prc_start==0)
{
for(i=G_comm_fst;i<=G_comm_lst;i++)
{
if(touch_area(&(Label[i])))
{
set_comm_backclor(comm,dis_sel_clor);
comm=i;
set_comm_backclor(comm,sel_clor);
break;
}
}
}
}
}
u8* spch_recg(u16 *v_dat, u32 *mtch_dis)
{
u16 i;
u32 ftr_addr;
u32 min_dis;
u16 min_comm;
u32 cur_dis;
v_ftr_tag *ftr_mdl;
noise_atap(v_dat, atap_len, &atap_arg);
VAD(v_dat, VcBuf_Len, valid_voice, &atap_arg);
if(valid_voice[0].end==((void *)0))
{
*mtch_dis=dis_err;
USART1_printf("VAD fail ");
return (void *)0;
}
get_mfcc(&(valid_voice[0]),&ftr,&atap_arg);
if(ftr.frm_num==0)
{
*mtch_dis=dis_err;
USART1_printf("MFCC fail ");
return (void *)0;
}
i=0;
min_comm=0;
min_dis=dis_max;
for(ftr_addr=ftr_start_addr; ftr_addr<ftr_end_addr; ftr_addr+=size_per_ftr)
{
ftr_mdl=(v_ftr_tag*)ftr_addr;
//USART1_printf("save_mask=%d ",ftr_mdl->save_sign);
cur_dis=((ftr_mdl->save_sign)==save_mask)?dtw(&ftr,ftr_mdl):dis_err;
//USART1_printf("cur_dis=%d ",cur_dis);
if(cur_dis<min_dis)
{
min_dis=cur_dis;
min_comm=i;
}
i++;
}
min_comm/=ftr_per_comm;
//USART1_printf("recg end ");
*mtch_dis=min_dis;
return (commstr[min_comm].str);
}
void disp_recg(void)
{
GUI_ClrArea(&Screen);
GUI_ClrArea(&(Label[G_cap]));
GUI_DispStr(&(Label[G_cap]),"语音识别");
GUI_ClrArea(&(Label[G_ctrl]));
GUI_DispStr(&(Label[G_ctrl]),"开始");
GUI_ClrArea(&(Label[G_spk]));
GUI_ClrArea(&(Label[G_return]));
GUI_DispStr(&(Label[G_return]),"返回");
}
void recg(void)
{
u8 *res;
u32 dis;
u32 recg_count=0;
disp_recg();
while(1)
{
wait_touch();
if(touch_area(&(Label[G_return])))
{
disp_home();
return;
}
else if(touch_area(&(Label[G_ctrl])))
{
record();
GUI_ClrArea(&(Label[G_ctrl]));
GUI_DispStr(&(Label[G_ctrl]),"识别中");
res=spch_recg(VcBuf, &dis);
if(dis!=dis_err)
{
recg_count++;
GUI_ClrArea(&(Label[G_recg_res]));
GUI_printf(&(Label[G_recg_res]),"识别结果:%s",(s8 *)res);
GUI_ClrArea(&(Label[G_mtch_dis]));
GUI_printf(&(Label[G_mtch_dis]),"匹配距离:%d",dis);
GUI_ClrArea(&(Label[G_stus]));
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
stm32-speech-recognition-master.7z
(1.39 MB, 下载次数: 4)
2019-11-28 00:56 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1