📄 voicedial.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 + -