⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 凌阳单片机多命令语音识别程序,完成分时训练,存储语音特征模型(最多5次,第5次后自动覆盖最开始的特征模型).
💻 C
字号:
#include"spce061a.h"
#include"bsrSD.h"
#include"s480.h"
#define uchar unsigned char
#define uint unsigned int
//----------------------------------------------------------------------------
//-- 该程序是特定人辨识的一个范例:
//--
//-- 在程序中我们通过三条语句的训练演示特定人连续音识别,其中第一条语句为触发命令。
//-- 
//-- 在程序一开始为训练名称,即触发命令,然后提示训练两条命令,训练完毕开始辨识当识别
//出触发名称后,发布命令则会听到应答,具体命令如下:
//****************训练******************************************
//    提示音                          输入语音
//--------------------------------------------------------
//"请输入触发名称"                    "警卫"
//"请输入第一条命令"                    "开枪"
//"请输入第二条命令"                    "你在干什么?"
//"请再说一遍"(以上提示音每说完一遍出现此命令)
//"没有听到任何声音"(当没有检测到声音时出现此命令)
//"两次输入名称不相同"(当两次输入的名称不同时出现此命令)
//"两次输入命令不相同"(当两次输入的命令有差异时出现此命令)
//"准备就绪,请开始辨识"(以上三条语句全部训练成功时,进入识别)
//*****************识别*****************************************
//     发布命令                           应答	
//---------------------------------------------------------
//"警卫"                                "在"/"长官"
//"开枪"                                "枪声"
//"你在干什么?"                        "我在巡逻"/"我在休息"/"我在等人"

//注意:在每次提示音结束后2-3秒再输入命令或当上次应答结束2-3秒后再发布命令
#define NAME_ID 		0x100
#define RSP_INTR		0
#define RSP_NAME		1
#define RSP_FIRE		2
#define RSP_GUARD		3
#define RSP_AGAIN		4
#define RSP_NOVOICE		5
#define RSP_NAMEDIFF	6
#define RSP_CMDDIFF		7
#define RSP_STAR		8
#define RSP_MASTER		9
#define RSP_HERE		10
#define kai_deng	    11
#define RSP_NOISY		12
#define guan_deng		13

extern unsigned int IsFirstDownLoad(void);
extern void TrainThreeCommand(void);
extern void SaveThreeCommand(void);
extern void ImportFlopCommand(unsigned int Command_ID);
extern void ImportSunCommand(unsigned int Name_ID);
extern void F_FlashWrite1Word(unsigned int,unsigned int);
extern void PlayRespond(int Result);
extern void F_FlashErase(int);
extern void F_FlashWrite1Word(unsigned int,unsigned int);
void key_ctrl(void);
void led_off(void);         uchar led_flag; 
void led_on(void);
void varbile_exprot(void);
void varbile_inprot(void);
void IOA_init(void);
void IOB_init(void);
int TrainWord(int WordID, int RespondID);

extern uint Rec_fma_hao;
extern uint Command_ID;

int Frist_flag;
int gActivated = 0;	//用于检测是否有触发命令,当有识别出语句为触发名称则该位置1 
uchar key_state=0x00ff,key_value=0,led_flag=0;
					 
int gTriggerRespond[] = {RSP_MASTER, RSP_HERE, RSP_MASTER};//第一条命令应答
int PlayFlag = 0;

int main()
{
	int res, timeCnt=0, random_no=0;
	uchar Flop_flag=1;
//	Frist_flag=IsFirstDownLoad();	//is frist download :yes   train and save command
	varbile_exprot();
	if(Frist_flag!=0xaaaa)
	{
		Rec_fma_hao=0;		//已经保存的命令条数
		Command_ID=0;		//已训练条数
		Frist_flag=0;		//有无训练命令的标志
		varbile_inprot();
	}
    IOA_init();
	if(Frist_flag!=0xaaaa)									 //	 no    improt command from flash
	{
writeflash:
		TrainThreeCommand();
		SaveThreeCommand();
		Frist_flag=0xaaaa;
		varbile_inprot();
		ImportFlopCommand(Command_ID);
	}
	else
	{
		ImportFlopCommand(Command_ID);
	}
		//..........开始识别命令.........................
	BSR_InitRecognizer(BSR_MIC);		    		//辨识器初始化
	BSR_EnableCPUIndicator();
	PlayRespond(RSP_STAR);			    			// 播放开始辨识的提示音
	
	while(1)
	{
		random_no ++;
		if(random_no >= 3) random_no = 0;
		*(unsigned int *)0x7012 = 1;				//clear the watch dog
		key_ctrl();
		if(key_value==1)
		{	
			key_value=0;								//key control whether need command train
			BSR_StopRecognizer();
			goto writeflash;
		}
		if(key_value==2)                           // mannul control the led on or off;
		{
			key_value=0;
			if(led_flag)
				led_off();
			else
				led_on();
		}
		res = BSR_GetResult();
		if(res > 0)							//识别出命令
		{
			if(Flop_flag)
			{
				timeCnt = 0;
				switch(res)
				{
				case 0x100:
					PlayRespond(gTriggerRespond[random_no]);
					ImportSunCommand(0);
					Flop_flag=0;
					gActivated=1;
					break;
				case 0x101:
					PlayRespond(gTriggerRespond[random_no]);
					ImportSunCommand(1);
					Flop_flag=0;
					gActivated=1;
					break;
				case 0x102:
					PlayRespond(gTriggerRespond[random_no]);
					ImportSunCommand(2);
					Flop_flag=0;
					gActivated=1;
					break;
				case 0x103:
					PlayRespond(gTriggerRespond[random_no]);
					ImportSunCommand(3);
					Flop_flag=0;
					gActivated=1;
					break;
				case 0x104:
					PlayRespond(gTriggerRespond[random_no]);
					ImportSunCommand(4);
					Flop_flag=0;
					gActivated=1;
					break;	
			     }
			}
			else
			{
				if(gActivated==1)
				{
						timeCnt = 0;
					switch(res)
					{
					case 0x100:
						PlayRespond(gTriggerRespond[random_no]);
						gActivated=1;
						break;
					case 0x101:
						PlayRespond(kai_deng);
						led_on();
						break;
					case 0x102:
						PlayRespond(guan_deng);	
						led_off();
						break;
					}
			   }	
			}				
		}
		else if (gActivated)
		{
			if (++timeCnt > 450)			//超出定时
			{   
				Flop_flag=1;
				PlayRespond(RSP_NOVOICE); 	//在设定时间内没有检测出声音
				ImportFlopCommand(Command_ID);					
				gActivated = 0;
				timeCnt = 0;
			}
		}
	}
}
void key_ctrl(void)
{
	int key_num=0x0000;
	key_state=key_state<<1;
	IOA_init();
	key_num=*P_IOA_Data;
	if((key_num&0x0003)!=0x0000)
	{
		if((key_state&0x00ff)==0x0080)
		{
			key_state=0x00ff;
			key_num=*P_IOA_Data;
			switch((key_num&0x0003))
			{
				case 0x0001:
				key_value=1;
				while(key_num!=0x0000)
				{
					key_num=*P_IOA_Data;
					key_num&=0x0003;
				}
				break;
				case 0x0002:
				key_value=2;
				while(key_num!=0x0000)
				{
					key_num=*P_IOA_Data;
					key_num&=0x0003;
				}
				break;
				case 0x0003:
				Rec_fma_hao=0;		//已经保存的命令条数
				Command_ID=0;		//已训练条数
				Frist_flag=0;		//有无训练命令的标志
				key_value=1;
				while(key_num!=0x0000)
				{
					key_num=*P_IOA_Data;
					key_num&=0x0003;
				}
				break;	
			}
		}
	}
	else
	key_state=key_state|1;
}
void IOB_init(void)
{
	*P_IOB_Dir=0x0020;
	*P_IOB_Attrib=0x0020;
	*P_IOB_Data=0x0020;
}
void led_on(void)
{
	IOB_init();
	*P_IOB_Data=0x0000;
	led_flag=1;
}
void led_off(void)
{
	IOB_init();
	*P_IOB_Data=0x0020;
	led_flag=0;
}
void varbile_inprot(void)
{
	F_FlashErase(0xF100);
	F_FlashWrite1Word(0xf100,Frist_flag);//first_flag
	F_FlashWrite1Word(0xf101,Rec_fma_hao);
	F_FlashWrite1Word(0xf102,Command_ID);
}
void varbile_exprot(void)
{
	unsigned int *p;	
	p = (unsigned int *)0xf100;
	Frist_flag= *p;
	p++;
	Rec_fma_hao= *p;
	p++;
	Command_ID= *p;
}
int TrainWord(int WordID, int RespondID)//命令训练
{
	int res;
	PlayRespond(RespondID);
	while(1)
	{
		res = BSR_Train(WordID,BSR_TRAIN_TWICE);
		if(res == 0) break;
		switch(res)
		{
		case -1: 									//没有检测出声音
			PlayRespond(RSP_NOVOICE);
			return -1;
		case -2: 									//需要重新训练一遍
			PlayRespond(RSP_AGAIN);
			break;
		case -3: 									//环境太吵
			PlayRespond(RSP_NOISY);
			return -1;		
		case -4: 									//数据库满
		 	return -1;
		case -5: 									//检测出声音不同
			if(WordID == NAME_ID)	PlayRespond(RSP_NAMEDIFF);//两次输入名称不同
			else					PlayRespond(RSP_CMDDIFF);//两次输入命令不同
			return -1;
		case -6: 									//序号错误
			return -1;
		}
	}
	return 0;
}
void IOA_init(void)
{	
	*P_IOA_Dir=0x0000;
	*P_IOA_Attrib=0x0000;
	*P_IOA_Data=0x0000;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -