www.pudn.com > 多命令语音识别范例.rar > main.c


//======================================================================= 
// 
//The information contained herein is the exclusive property of 
//Sunplus Technology Co. And shall not be distributed, reproduced, 
//or disclosed in whole in part without prior written permission. 
// 
//      (C) COPYRIGHT 2001   SUNPLUS TECHNOLOGY CO. 
//                  ALL RIGHTS RESERVED 
// 
//The entire notice above must be reproduced on all authorized copies. 
// 
//====================================================================== 
//*****************************************************************// 
//  工程名称:   Recognise_SD.scs 
//  作    者:    huali     
//  联系方式:   huali@sunnorth.com.cn 
//  适应芯片:    SPCE061A 
//  功能描述:    实现特定人识别 
//			     可以用61板来完成: 
//				1、KEY1--训练命令 
//				2、KEY2--识别 
//				3、KEY3--将训练的命令存在外扩的flas4096中 
//				最多可以识别25条命令其中5条为触发命令,该程序只做了10条命令 
//				的识别,用户自己也可以扩展 
//	硬件连接:flas SPR4096和SPCE061A的连接请参考网站SPR4096的应用,按键分别 
//				连接的是IOA0(KEY1)、IOA1(KEY2)和IOA2(KEY3) 
//	日期:2003/9/4 
//			      
//  涉及的库:	 
//				(a) C-Lib:  CMacro.lib 
//            	(b) Recogition-Lib:  bsrv222SDL.lib 
//				(c)	voic-Lib:sacmv26e.lib 
//  组成文件: 
//    			 main.c/ISR.asm/system.asm/hardware.asm/key.asm  
//     			 s480.h/bsrsd.h/hardware.inc 
//  完成日期:    2003-09-04 
//*****************************************************************// 
 
#include "bsrsd.h" 
 
#define NAME_ID 			0x100 
#define COMMAND_ONE_ID 		0x101 
#define COMMAND_TWO_ID 		0x102 
#define COMMAND_THREE_ID 	0x103 
#define COMMAND_FOUR_ID 	0x104 
 
#define C_Commond_Start		0 
#define	C_GroupOne_Start	600 
#define	C_GroupTwo_Start	1600 
 
#define C_PageOne		0 
#define C_PagTwo		1 
 
#define Recognise		1 
#define Train			2 
#define NO_Re_Tr		0 
#define C_Recognise		1 
//***************************全程变量******************************// 
void g_Recognise(void); 
void Add_Group(void); 
void Export_Group(void); 
void Add_Commond_Group(void); 
void Export_Commond_Group(void); 
 
extern 	void ClearWatchDog(); 
extern  unsigned int BSR_SDModel[100]; 
 
unsigned int Key; 
unsigned int commandID; 
unsigned int res,Ret; 
unsigned int timeCnt=0; 
unsigned int g_status; 
unsigned int k,i,j; 
 
unsigned int g_Ret; 
unsigned int uiflag=0; 
unsigned int g_Commond_Train=0; 
unsigned int g_Commond_ImportGroupNum=0; 
unsigned int g_Commond_EmportGroupNum=0; 
unsigned long int ulAddr=0; 
unsigned int gActivated = 0;	//该变量用于检测是否有触发命令,当有识别出语句 
                    			//为触发名称则该位置1                     
 
//***************语音播放******************************************// 
//函数:PlayRespond(int Result) 
//描述:识别或提示音的播放 
//参数:语音播放序号 
//返回:无 
//*****************************************************************// 
void PlayRespond(int Result) 
{ 
	BSR_StopRecognizer(); 
	SACM_S480_Initial(1); 
	SACM_S480_Play(Result, 3, 3); 
	while((SACM_S480_Status()&0x0001) != 0) 
	{ 
		SACM_S480_ServiceLoop(); 
	ClearWatchDog(); 
	} 
	SACM_S480_Stop(); 
	BSR_InitRecognizer(BSR_MIC); 
//	BSR_EnableCPUIndicator();	 
} 
 
//***************训练命令******************************************// 
//函数:TrainWord(int WordID, int RespondID) 
//描述:命令的训练 
//参数:int WordID:ID序号;int RespondID:语音播放序号 
//返回: 
//		0:训练成功; 
//		-1:没有检测到声音; 
//		-2:重新训练; 
//		-3:环境太吵; 
//		-4:buffer满; 
//		-5:两次训练内容不同; 
//		-6:ID超出范围; 
//*****************************************************************// 
int TrainWord(int WordID, int RespondID) 
{ 
	PlayRespond(RespondID); 
	while(1) 
	{ 
		res = BSR_Train(WordID,BSR_TRAIN_TWICE); 
		if(res == 0) 
			break; 
		switch(res) 
		{ 
			case -1: 									//没有检测出声音 
				PlayRespond(10); 
				return -1; 
			case -2: 									//需要重新训练一遍 
				PlayRespond(9); 
				break; 
			case -3: 									//环境太吵 
				PlayRespond(11); 
				return -1;		 
			case -4: 									//数据库满 
			 	return -1; 
			case -5: 									//检测出声音不同 
				if(WordID == NAME_ID)	PlayRespond(11);//两次输入名称不同 
				else					PlayRespond(11);//两次输入命令不同 
				return -1; 
			case -6: 									//序号错误 
				return -1; 
		} 
	} 
	return 0; 
} 
//*****************************************************************// 
//  文件名称:   main.c 
//  描    述:  主程序通过三个按键来分别控制:命令的训练、命令存入flash 
//				和从flash中读出命令进行识别 
//  完成日期:   2003/09/04 
//*****************************************************************// 
int main() 
{ 
	System_Initial(); 
	while(1) 
	{ 
		Key = SP_GetCh();											//获取键值 
		switch(Key) 
		{ 
				case 0x0001:										//Train					 
					g_Commond_Train++;				 
					BSR_DeleteSDGroup(0);							//初始化存储器RAM 
					PlayRespond(0);															    												 
					while(TrainWord(NAME_ID,0) != 0) ;										 
					while(TrainWord(COMMAND_ONE_ID,16) != 0) ; 
					while(TrainWord(COMMAND_TWO_ID,17) != 0) ;							 
					if(g_Commond_Train!=1) 
					{ 
						while(TrainWord(COMMAND_THREE_ID,18) != 0) ; 
						while(TrainWord(COMMAND_FOUR_ID,19) != 0) ; 
					}									 
					break; 
				case 0x0002:											 
					Add_Commond_Group();							//从flash中读出三条命令的数据加入RAM																					 
					g_status=C_Recognise;					 
					BSR_InitRecognizer(BSR_MIC);		    		//识别初始化 
				//	BSR_EnableCPUIndicator(); 
					PlayRespond(15);			    				//语音播放"教您学英语"				 
					g_Recognise(); 
					break;					 
				case 0x0004:										//将训练好的命令存入flash					 
					g_Commond_EmportGroupNum++; 
					if(g_Commond_EmportGroupNum==1) 
					{ 
						SP_SIOSectorErase(C_PageOne);				//擦除flash的第一页	 
						ulAddr=C_Commond_Start;					 
						Export_Commond_Group();						//将训练的三条命令写入flash 
					} 
					else 
					{ 
						if(g_Commond_EmportGroupNum==2) 
						{	 
							SP_SIOSectorErase(C_PagTwo);			//擦除flash第二页 
							ulAddr=C_GroupOne_Start; 
						}						 
						else 
						if(g_Commond_EmportGroupNum==3) 
							ulAddr=C_GroupTwo_Start;						 
						Export_Group(); 
						 
					}			    				 
					break;					 
				default: 
					break;		 
		}					  
		System_ServiceLoop(); 
	} 
} 
//***************识别命令******************************************// 
//函数:TrainWord(int WordID, int RespondID) 
//描述:识别分两组,分别由两条命令来控制。首先程序会先调入第一组命令 
//		根据这两条命令再分别识别5条命令 
//涉及到的函数:BSR_GetResult()--该函数主要用来进行识别的 
//参数:无 
//返回:无 
//*****************************************************************// 
void g_Recognise() 
{ 
	while(g_status == C_Recognise) 
	{ 
		res = BSR_GetResult();									//识别 
		if(res > 0)									 
		{ 
			if(gActivated) 
			{ 
				timeCnt = 0; 
				switch(res) 
				{ 
					case NAME_ID: 
						PlayRespond(14);						//语音播放"yea" 						 
						break; 
					case COMMAND_ONE_ID:							 
						PlayRespond(12);						//语音播放"汉语"														 
						gActivated = 0; 
						uiflag=1; 
						BSR_StopRecognizer();					//停止识别												 
						ulAddr=C_GroupOne_Start;																					 
						Add_Group();							//将第一组5条命令加入RAM  
						BSR_InitRecognizer(BSR_MIC);			//识别初始化 
					//	BSR_EnableCPUIndicator(); 
						while(uiflag) 
						{ 
							res = BSR_GetResult();				//识别 
							switch(res) 
							{ 
								case NAME_ID: 
									PlayRespond(14);			//语音播放"yea"										 
									Add_Commond_Group();		//重新将三条命令加入RAM 
									uiflag=0; 
									BSR_InitRecognizer(BSR_MIC);//识别初始化	 
								//	BSR_EnableCPUIndicator();						 
									break; 
								case COMMAND_ONE_ID: 
									PlayRespond(1);				//"圣诞快乐"							 
									break; 
								case COMMAND_TWO_ID: 
									PlayRespond(2);				//"新年快乐"					 
									break; 
								case COMMAND_THREE_ID: 
									PlayRespond(3);				//"生日快乐"							 
									break; 
								case COMMAND_FOUR_ID: 
									PlayRespond(4);				//快乐每一天							 
									break; 
							} 
						} 
						break; 
					case COMMAND_TWO_ID:							 
						PlayRespond(13);						//语音播放"英语"													 
						gActivated = 0; 
						uiflag=1; 
						BSR_StopRecognizer();					//停止识别										 
						ulAddr=C_GroupTwo_Start; 
						Add_Group();							//将第二组5条命令加入RAM  
						BSR_InitRecognizer(BSR_MIC);			//识别初始化	 
					//	BSR_EnableCPUIndicator();							 
						while(uiflag) 
						{ 
							res = BSR_GetResult();				//识别 
							switch(res) 
							{ 
								case NAME_ID: 
									PlayRespond(14);			//语音播放"yea"								 
									Add_Commond_Group();		//重新将三条命令加入RAM 
									uiflag=0; 
									BSR_InitRecognizer(BSR_MIC);//识别初始化 
								//	BSR_EnableCPUIndicator();							 
									break; 
								case COMMAND_ONE_ID: 
									PlayRespond(5);				//"merry christmas"					 
									break; 
								case COMMAND_TWO_ID: 
									PlayRespond(6);				//"Happy new year"					 
									break; 
								case COMMAND_THREE_ID: 
									PlayRespond(7);				//"Happy birthDay"					 
									break; 
								case COMMAND_FOUR_ID: 
									PlayRespond(8);				//"Happy everyday"					 
									break; 
							} 
						} 
						break; 
				}									 
			} 
			else 
			{ 
				if(res == NAME_ID) 
				{ 
					PlayRespond(14); 
					gActivated = 1; 
					timeCnt = 0; 
				} 
			}	 
		}//end of (res > 0) 
		else if (gActivated) 
		{ 
			if (++timeCnt > 450)								//超出时间 
			{ 
				PlayRespond(10); 								//在规定的时间内没有识别到声音					 
				gActivated = 0; 
				timeCnt = 0; 
			} 
		}			 
	} 
}			 
//***************将训练好的三条命令存入flash***********************// 
//函数:Export_Commond_Group() 
//描述:将训练好的三条命令存入flash 
//参数:无 
//返回:无 
//*****************************************************************// 
void Export_Commond_Group() 
{ 
	for(commandID=0x100;commandID<0x103;commandID++) 
	{ 
		g_Ret=BSR_ExportSDWord(commandID);						//将训练好的命令存入BSR_SDModel[]buffer中 
		while(g_Ret!=0) 
		g_Ret=BSR_ExportSDWord(commandID);						//Export faild		 
		for(i=0;i<100;i++) 
		{ 
			SP_SIOSendAWord(ulAddr,BSR_SDModel[i]); 
			ulAddr+=2;													 
		}	 
	} 
} 
 
//**********************将训练好的5条命令存入flash*****************// 
//函数:Export_Group() 
//描述:将训练好的5条命令存入flash 
//参数:无 
//返回:无 
//*****************************************************************// 
void Export_Group() 
{ 
	for(commandID=0x100;commandID<0x105;commandID++) 
	{ 
		g_Ret=BSR_ExportSDWord(commandID); 
		while(g_Ret!=0) 
		g_Ret=BSR_ExportSDWord(commandID);//		 
		for(i=0;i<100;i++) 
		{ 
			SP_SIOSendAWord(ulAddr,BSR_SDModel[i]); 
			ulAddr+=2;												 
		}	 
	} 
} 
 
//**********************从flash中取出三组数据存入SRAM中***************// 
//函数:Add_Commond_Group() 
//描述:从flash中取出三组数据存入SRAM中 
//参数:无 
//返回:无 
//********************************************************************// 
void Add_Commond_Group() 
{ 
	BSR_DeleteSDGroup(0); 
	ulAddr=C_Commond_Start;																					 
	for(j=0;j<3;j++) 
	{ 
		for(k=0;k<100;k++) 
		{ 
			Ret=SP_SIOReadAWord(ulAddr);							 
			BSR_SDModel[k]=Ret;								//将flash中读到的数据存入BSR_SDModel[]buffer中		 
			ulAddr+=2;													 
		}					 
		g_Ret=BSR_ImportSDWord();							//将buffer BSR_SDModel[]中的数存入RAM中 
		while(g_Ret!=0) 
		g_Ret=BSR_ImportSDWord();							 
	} 
} 
 
//**********************从flash中取出5组数据存入RAM*************// 
//函数:Add_Group() 
//描述:从flash中取出5组数据存入RAM 
//参数:无 
//返回:无 
//*****************************************************************// 
void Add_Group() 
{ 
	BSR_DeleteSDGroup(0);				 
	for(j=0;j<5;j++) 
	{ 
		for(k=0;k<100;k++) 
		{ 
			Ret=SP_SIOReadAWord(ulAddr);							 
			BSR_SDModel[k]=Ret;				 
			ulAddr+=2;													 
		}					 
		g_Ret=BSR_ImportSDWord(); 
		while(g_Ret!=0) 
		g_Ret=BSR_ImportSDWord();							 
	} 
}