华科学院本科毕业设计(论文)
开始 初始化 已经训练过 N 训练小车 Y 转载语音模型 保存训练结果 进入识别模式 语言识别与执行 N 重新训练 Y 清模型存储区 等待复位 图 4.1 系统总体程序流程图
语音识别小车的主程序流程如图4.1所示,分为四大部分:初始化部分、训练部分、识别部分、重训操作。
初始化部分:初始化操作将 IOB8~IOB11 设置为输出端,用以控制电机。必要时还要有对应的输入端设置和PWM 端口设置等。
训练部分:训练部分完成的工作就是建立语音模型。程序一开始判断小车是否被训练过,如果没有训练过则要求对其进行训练,并且会在训练成功之后将训练的模型存储到FLASH,在以后使用时不需要重新训练;如果已经训练过会把存储在FLASH 中的模型调出
- 27 -
康虹:基于单片机的语言控制小车设计
来装载到辨识器中。
识别部分:在识别环节当中,如果辨识结果是名字,停止当前的动作并进入待命 状态,然后等待动作命令。如果辨识结果为动作指令小车会语音告知相应动作并执行该动作,在运动过程中可以通过呼叫小车的名字使小车停下来。
重训操作:考虑到有重新训练的需求,设置了重新训练的按键(61 板的KEY3) ,循环扫描该按键,一旦检测到此键按下,则将擦除训练标志位(0xe000 单元) ,并等待复位。复位后,程序重新执行,当检测到训练标志位为0xffff时会要求重新对其进行训练。
下面详细介绍以上提到的子程序。
4.2 系统各分支设计
4.2.1训练子程序
当程序检测到训练标志位BS_Flag内容为0xffff,就会要求操作者对它进行训练操作,训练操作的过程如图 4.2所示:训练采用两次训练获取结果的方式,以训练名字为例:小车首先会提示:给我取个名字吧, 这时你可以告诉它一个名字 (比如Jack) ; 然后它会提示: 请再说一遍, 这时再次告诉它名字 (Jack) ,如果两次的声音差别不大,小车就能够成功的建立模型,名称训练成功;如果没能够成功的建立模型,小车会告知失败的原因并要求重新训练。成功训练名称后会给出下一条待训练指令提示音:前进,参照名称训练方式训练前进指令。依次训练小车的名称—前进指令—倒车指令—左转指令—右转指令,全部训练成功子程序返回,训练结束。
开始训练
训练名称训练左转指令
NN名称训练成功左转训练成功
YY训练前进指令训练右转指令前进训练成功YNN右转训练成功Y
训练倒车指令训练成功提示- 28 - N倒车训练成功Y训练结束华科学院本科毕业设计(论文)
图4.2训练流程图
void TrainSD() {
while(TrainWord(NAME_ID,S_NAME) != 0) ;
//训练名称
//训练第1个动作 //训练第2个动作 //训练第3个动作
while(TrainWord(COMMAND_GO_ID,S_ACT1) != 0) ; while(TrainWord(COMMAND_BACK_ID,S_ACT2) != 0) ; while(TrainWord(COMMAND_LEFT_ID,S_ACT3) != 0) ;
while(TrainWord(COMMAND_RIGHT_ID,S_ACT4) != 0) ; //训练第4个动作 }
4.2.2语音识别子程序
语音识别流程如图 4.3所示:首先获取辨识器的辨识结果,判断是否有语音触发,如果有语音触发则会返回识别结果的ID号,ID号对应名称或者对应不同的动作。如果ID号为名称,则结束运动(如果当前在运动状态) ,进入待命状态,等待下一次的指令触发;如果 ID 号为动作,则语音告知将要执行的动作,并执行该动作。注:语音识别程序在语音中断函数中进行。
- 29 -
康虹:基于单片机的语言控制小车设计
语音识别 语音触发 Y N 前进指令 倒车指令 左转指令 右转指令 名字 前进 倒车 左转 右转 停车命令 返回 图4.3语音识别部分流程图
void BSR(void) {
int Result;
//辨识结果寄存
Result = BSR_GetResult(); if(Result>0) {
//获得识别结果
//有语音触发?
*P_IOB_Data=0x0000; //临时停车 switch(Result) {
case NAME_ID: //识别出名称命令
Stop(); break;
//停车待命
case COMMAND_GO_ID: //识别出第一条命令
GoAhead(); break;
//执行动作一:直走
case COMMAND_BACK_ID://识别出第二条命令
BackUp();
//执行动作二:倒车
- 30 -
华科学院本科毕业设计(论文)
} }
break;
//识别出第三条命令 //执行动作三:左转
case COMMAND_LEFT_ID:
TurnLeft(); break;
case COMMAND_RIGHT_ID: //识别出第四条命令
TurnRight(); break;
//执行动作四:右转
default: }
break;
4.2.3动作子程序
动作子程序包括:前进、倒车、左拐、右拐、停车子程序。
前进:由小车的结构原理和驱动电路分析知:只要IOB8 为高电平,IOB9,IOB10,IOB11 全部为低电平即可实现小车的前进。前进子程序包括语音提示、置端口数据、启动定时器操作。
倒车:由小车的结构原理分析和驱动电路分析知:只要IOB9 为高电平,IOB8,IOB10,IOB11全部为低电平即可实现小车的倒退。倒退子程序包括语音提示、置端口数据、启动定时器操作。
左转:由小车的结构原理分析和驱动电路分析知:小车左转需要两个条件:1.前轮左偏2.后轮前进,这时对应的 I/O 状态为:IOB8、IOB10 为高电平,IOB9、IOB11 为低电平。左转子程序包括语音提示、置端口数据、启动定时器操作。
右转:由小车的结构原理分析和驱动电路分析知:小车右转需要两个条件:1.前轮右偏2.后轮前进,这时对应的 I/O 状态为:IOB8、IOB11 为高电平,IOB9、IOB10 为低电平。右转子程序包括语音提示、置端口数据、启动定时器操作。
注:在转弯之前首先让前轮朝目标方向的反方向偏转,然后再让前轮朝目标方向偏转,这样前轮的摆动范围更大,惯性更大,摆幅也最大,能更好实现转弯。
void GoAhead() {
- 31 -
//前进