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

📄 voicedial.c

📁 利用61板、SPR模组、SPLC501液晶模组和4×4键盘建立手机通讯录模型
💻 C
字号:
//======================================================
// 文件名称:	VoiceDial.c
// 功能描述:	语音识别程序
// 维护记录:	2006-09-20	v1.0
//======================================================

#include "..\include\bsrSD.h"
#include "..\include\PhoneBook.h"
#include "..\include\Flash.h"
#include "..\include\SPLC501User.h"
#include "..\include\LCD_Chinese.h"
#include "..\include\CommonFunc.h"

//========================================================================
//	语法格式:	unsigned int Voice_Train_SubRoutine(PHONEBOOK *p_PB_Item)
//	实现功能:	对语音拨号条目进行训练(私有函数,被Voice_Train()函数调用)
//	参数:		p_PB_Item		待训练条目指针
//	返回值:	语音拨号项目索引号(0~4),若训练失败则返回0xffff
//========================================================================
unsigned int Voice_Train_SubRoutine(PHONEBOOK *p_PB_Item)
{
	unsigned int TrainResult, i, VoiceIdx;
	
	for(i=0; i<PB_MAX_VOICE; i++)
	{
		if(p_PB_Idx->Voice_PBAddr[i]==NULL)break;
	}
	VoiceIdx = i;
	
	LCD501_ClrScreen(0);
	LCD501_SetPos(0,0);
	LCD501_Print("◆ ");
	LCD501_PrintPacked(p_PB_Item->Name);
	LCD501_SetPos(8,48);
	LCD501_Print("请输入语音命令");
	
	BSR_DeleteSDGroup(0);				//初始化RAM
	BSR_InitRecognizer(BSR_MIC);		//初始化识别器
		
	while(1)
	{
		TrainResult = BSR_Train(0x100+VoiceIdx,BSR_TRAIN_TWICE);
									//训练2次,获得训练结果
		switch(TrainResult)
		{
		case 0:							//训练成功			
			break;
		case -1:						//没有检测出声音
			LCD501_ClrScreen(0);
			LCD501_SetPos(0,48);
			LCD501_Print("没有检测到声音!");
			DelayMS(600);
			break;
		case -2: 						//需要训练第二次
			LCD501_SetPos(8,48);
			LCD501_Print("请重复输入命令");
			break;
		case -3:						//环境太吵
			LCD501_SetPos(8,48);
			LCD501_Print("环境噪音太大!");
			DelayMS(600);
			break;
		case -4:						//数据库满
			break;
		case -5: 			            //检测出声音不同
			LCD501_ClrScreen(0);
			LCD501_SetPos(0,48);
			LCD501_Print("两次声音差别过大");
			DelayMS(600);
			break;
		case -6: 			            //序号错误
			break;
		default:
			break;
		}
		if(TrainResult==0)
		{
			BSR_ExportSDWord(0x100+i);
			Flash_Modify(PB_VMODEL_SA+i*PB_VMODEL_SIZE,BSR_SDModel,PB_VMODEL_SIZE);
			break;
		}
		else if(TrainResult!=-2)
		{
			VoiceIdx = 0xffff;
			break;
		}
	}
	return VoiceIdx;	
}

//========================================================================
//	语法格式:	unsigned int Voice_Train(PHONEBOOK *p_PB_Item)
//	实现功能:	对语音拨号条目进行训练
//	参数:		p_PB_Item		待训练条目指针
//	返回值:	语音拨号项目索引号(0~4),若训练失败则返回0xffff
//========================================================================
unsigned int Voice_Train(PHONEBOOK *p_PB_Item)
{
	unsigned int Flag_Temp, KeyCode;
	unsigned int VoiceIdx;
	
	LCD501_ClrScreen(0);

	Flag_Temp = 1;
	while(Flag_Temp!=0)
	{
		if(Flag_Temp==1)
		{
			LCD501_ClrScreen(0);
			LCD501_SetPos(0,0);
			LCD501_Print("◆ ");
			LCD501_PrintPacked(p_PB_Item->Name);
			LCD501_SetPos(0,32);
			LCD501_Print("设定为语音拨号?    1-是  2-否");
			Flag_Temp = 2;
		}
		KeyCode = Key_GetCh();
		switch(KeyCode)
		{
		case '1':
			VoiceIdx = Voice_Train_SubRoutine(p_PB_Item);
			if(VoiceIdx==0xffff)
				Flag_Temp = 1;
			else
				Flag_Temp = 0;
			break;
		case '2': case 'n': case '*':
			VoiceIdx = 0xffff;
			Flag_Temp = 0;
			break;
		default:
			break;
		}
	}
	return VoiceIdx;	
}

//========================================================================
//	语法格式:	PHONEBOOK *Voice_Recognize(void)
//	实现功能:	执行语音识别,获取识别到的通讯录条目(私有函数)
//	参数:		无
//	返回值:	识别出的通讯录条目,如果识别失败则返回NULL
//========================================================================
#define VOICE_WAIT_TIME		3		//单位:秒
PHONEBOOK *Voice_Recognize(void)
{
	PHONEBOOK *p_PB_Item;
	unsigned int *p_VModel, i, j, VoiceIdx;
	
	LCD501_ClrScreen(0);

	if(p_PB_Idx->Voice_Num==0)
	{
		LCD501_SetPos(0, 48);
		LCD501_Print("没有语音拨号条目");
		DelayMS(600);
		return NULL;
	}
	
	LCD501_SetPos(8,48);
	LCD501_Print("请输入语音命令");
	
	BSR_DeleteSDGroup(0);				//初始化RAM
	for(i=0; i<PB_MAX_VOICE; i++)
	{
		if(p_PB_Idx->Voice_PBAddr[i]!=NULL)
		{
			p_VModel = (unsigned int*)PB_VMODEL_SA;
			p_VModel += PB_VMODEL_SIZE * i;
			for(j=0; j<100; j++)
				BSR_SDModel[j] = *p_VModel++;
			BSR_ImportSDWord(0x0100+i);
		}
	}
	BSR_InitRecognizer(BSR_MIC);		//初始化识别器	
	i = 0;
	while(1)
	{
		VoiceIdx = BSR_GetResult();
		if(VoiceIdx>=0x100 && VoiceIdx<0x100+PB_MAX_VOICE)
		{
			p_PB_Item = p_PB_Idx->Voice_PBAddr[VoiceIdx-0x100];
			break;
		}
		i++;
		if(i>VOICE_WAIT_TIME*1000/16)	// 识别超时则返回
		{
			LCD501_ClrScreen(0);
			LCD501_SetPos(16, 48);
			LCD501_Print("识别失败!");
			DelayMS(600);
			p_PB_Item = NULL;
			break;
		}
	}
	return p_PB_Item;
}

//========================================================================
//	语法格式:	void Voice_Dial(void)
//	实现功能:	语音拨号用户函数
//	参数:		无
//	返回值:	无
//========================================================================
void Voice_Dial(void)
{
	PHONEBOOK *p_PB_Item;
	
	p_PB_Item = Voice_Recognize();
	if(p_PB_Item!=NULL)
	{
		PB_Detail(p_PB_Item);
	}
}

⌨️ 快捷键说明

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