www.pudn.com > 3yuyinshibie.rar > snoopy.c


//-----------------This is the main program of Snoopy project--------------------------- 
//--Copyright(C) 2001, Cyberon Corp. 
//该程序是非特定人语音识别程序,原来在SPCE500A下运行,能识别并应答16个命令,存储空间为128K字节。 
//我们将其进行了修改,使其能在SPCE061A下运行,由于存储空间为32K字,只能识别并应答9个命令。 
//在这个例程当中,我们示范了如何使用语音识别引擎对8个已经经过训练的命令进行识别。 
//第一个命令 "Snoopy",可以作为使能命令,也就是说使用者只能在该命令之后发出其他命令。 
//例如,用户只有在发出 "Snoopy"命令并且听到响应"Snoopy here"之后才能继续下达其他命令 
//如"How are you", "I love you",等等。 
//当"Snoopy"命令响应之后,程序将等待8秒钟,如果没有其他命令发出, 
//系统将跳回到第0组,并且再次等待触发命令"Snoopy"。当用户的命令无法被识别时, 
//程序将响应为"Execuse me?", "I can't hear you!"或 "Say again!"这时用户可以再一次下达语音命令。 
//  	        Snoopy Group 		Response phrase 
// ------------------------------------------------------------------------ 
// 		Snoopy			Snoopy here 
//		How are you		I'm fine! 
//		I love you		I love you too! 
//		Goto sleep		ZZZzzzzz....(Snore) 
// 		Let's play		Snoopy loves to play! 
//		Sing a song		lala..la... 
//		Merry Christmas		Merry Christmas! 
//		Happy new year		Happy New Year! 
 
#include "bsr.h" 
#define P_IOB_Data				(volatile unsigned int *)0x7005   
#define P_IOB_Buffer			(volatile unsigned int *)0x7006    
#define P_IOB_Dir				(volatile unsigned int *)0x7007    
#define P_IOB_Attrib			(volatile unsigned int *)0x7008  
//...............available commands......................... 
#define SNOOPY			1 
#define WHAT			0 
#define EXCUSEME		9	 
 
void PlayRespond(int Result) 
{ 
	BSR_StopRecognizer();//停止识别,进入响应部分 
	SACM_A2000_Initial();//初始化语音播放 
	 
	if (Result>5) Result-=1;//跳过第5个命令(该命令训练失效 
	 
	if (Result>9) Result=9;//当反应的结果数超过所知结果时,停止在提问状态。 
	SACM_A2000_Play(Result);//播放对应的语音响应 
	while(SACM_A2000_Status() != 0) 
	{ 
		Clear_WatchDog(); 
		SACM_A2000_ServiceLoop(); 
	} 
	SACM_A2000_Stop();//停止播放 
	BSR_InitRecognizer();//启动语音识别 
} 
 
int gActivated = 0; 
			//这个变量用来确定系统是否已经被触发,当被触发时,该变量为1. 
 
int gWhatCount = 0;	 
			//用来计量系统已经存在几个"What?" 响应.如果响应多于3个,系统将对"What?" 响应 
			//进行屏蔽,直到有一个系统能够识别的命令为止.这可以防止噪音的干扰. 
	 
 
extern void InitIO(void); 
 
int main() 
{ 
	int res,score,unknown=0; 
	int TimeCount = 0; 
 
	InitIO(); 
	BSR_SelectGroup(0);		//找到第一个语音命令组 
	BSR_InitRecognizer();		//初始化语音识别器 
	PlayRespond(1);			//播放"Snoopy is here" 
	BSR_EnableCPUIndicator();	//启动实时监控 
	while(1) 
	{ 
		res = BSR_GetResult();//获得识别结果 
		if(res!=0 && res!=-1) 
		{ 
			if(res == -2) 
			{	//当语音被拒绝识别时,res为-2.通过获得识别码判断是否为一个命令. 
				score = BSR_GetRecognizerScore(); 
 
				if(score >= -60) 
				{ 
				//判断已经出现几个不可识别的命令 
					if(gWhatCount < 3) 
					{ 
      					Clear_WatchDog(); 
      					gWhatCount ++; 
      					PlayRespond(EXCUSEME); 
      					unknown ++;                               
      					if(unknown >= 3) unknown = 0; 
					    TimeCount = 0;		// Reset TimeCount 
     				} 
				} 
			} 
			else 
			{ 
				gWhatCount = 0;//清除无法识别命令记数器 
				if(gActivated) 
				{    
					switch(res) 
		   { 
			case 3: 									 
			*P_IOB_Data=0xc200; 
			break; 
			case 4: 									 
		    *P_IOB_Data=0x8200; 
			break; 
			case 5: 									 
		    *P_IOB_Data=0x4200; 
			break;		 
			case 7:  
		   *P_IOB_Data=0x0200;									 
		 	break; 
			} 
	     
		 
					PlayRespond(res); 
					*P_IOB_Data=0x0000; 
				} 
				else 
				{ 
					if(res == SNOOPY)//触发命令,激活系统 
					{ 
						PlayRespond(res); 
						gActivated = 1; 
					} 
				} 
				TimeCount = 0;		// Reset TimeCount 
			} 
		} 
		else if (gActivated) 
		{ 
			if (++TimeCount > 500)	//如果在触发命令之后8秒之内并没有一个 
									//有效命令出现,则进入休眠状态 
			{		 
								PlayRespond(WHAT); 
				TimeCount = 0; 
				gActivated = 0; 
			} 
		} 
	} 
}