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

📄 main.c

📁 使用凌阳单片机的多命令语音识别范例
💻 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();							
	}
}

⌨️ 快捷键说明

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