引言
本系统以SPCE061A单片机为控制核心,通过采集操作员的声音信号,配合无线控制模块、光电寻迹模块,设计了一个能够完成多种复杂动作的语音控制智能手系统。它可以替代人工完成多种任务,应用前景广阔。
1 系统方案设计
本设计由微控制器SPCE061A、电源模块、电机模块、语音模块、无线控制模块、光电寻迹模块等部分组成。系统结构框图如图1所示。
图1 系统结构框图
系统以SPCE061A单片机为控制核心。SPCE061A通过小型麦克风采集声音信号,并将声音信号与事先训练好的存储于Flash中的语音库进行特征对比,从而实现语音命令的识别。根据识别出的命令,SPCE061A控制智能手作出相应的动作。
智能手执行的动作由4个直流减速电机来控制。电机驱动芯片采用L298N,两块L298N控制4个电机的转向。电机1通过SPCE061A的IOB0、IOB1引脚控制智能手向上和向下;电机2通过IOB2、IOB3控制智能手向左和向右;电机3通过IOB4、IOB5控制智能手升高和降低;电机4通过IOB6、IOB7控制智能手转向A区或者B区。智能手通过光电寻迹模块判断A区和B区的位置。设计中还加入了无线控制功能,用来代替部分语音命令。当按下发射端的K1键时,智能手转向A区;按下K2键时,智能手转向B区。
2 系统硬件设计
2.1 微控制器模块
SPCE061A主要包括输入/输出端口、定时器/计数器、数/模转换、模/数转换、串行设备输入/输出、通用异步串行接口、低电压监测和复位等部分,并且内置在线仿真电路ICE接口。其CPU最高时钟可以达到49 MHz,在处理复杂的数字信号方面可以与专用DSP芯片相媲美,但价格却非常低廉。SPCE061A支持10个中断向量及十多个中断源,适合应用于对中断处理能力要求较高的实时语音信号处理场景中。其还具备8通道10位ADC输入功能,内置的具有自动增益控制的麦克风输入功能,双通道10位DAC音频输出功能及A、B两个I/O口输入/输出功能,为语音处理带来了极大便利。图2为SPCE061A内部结构图。
图2 SPCE061A内部结构图
2.2 语音模块
凌阳的 SPCE061A是 16位单片机,最高时钟频率可达49 MHz,具有很强的实时信息处理能力,这些无疑为语音的采集、辨识、合成及播放提供了条件。SPCE061A内部含有语音识别相关的函数,通过在程序中调用相关API函数,即可完成语音采集、语音播放及语音识别等任务。
2.2.1 语音播放
与SPCE061A高度集成的61板上有两对语音输出接口:一个是耳机插孔,连接耳机;另一个是外接喇叭的两针插针。语音信号由DAC 输出引脚21 或22 输出后经语音集成放大器SPY0030 放大,然后输出。SPY0030 是凌阳自产芯片, 功能类似于LM386, 但是比LM386音质好。它可以工作在2.4~6.0 V范围内, 最大输出功率可达700 mW。
凌阳压缩算法中,SACM_A2000、SACM_S480、SACM_S240主要用来放音,可用于语音提示,而 DVR则用来录放音。本设计采用S480算法,该压缩算法压缩比为80:3,存储容量大,音质介于 A2000和 S240之间,适用于语音播放。图3为S480算法播放语音流程图。
图3 S480算法播放语音流程图
2.2.2 语音采集
语音信号经过麦克风转换成电信号,输入到SPCE061A内置的自动增益放大器。SPCE061A内部带有自动增益控制电路AGC,能够随时跟踪、监视前置放大器输出的音频信号电平,并对电平信号进行动态调节,以便使进入A/D的信号保持在最佳电平。系统采集到的声音信号是模拟信号,需要通过模数转换器转换成数字信号存储在SPCE061A的片内Flash中。
2.2.3 语音辨识
语音识别的过程可归结为模式识别与匹配。通过对语音信号进行预处理和分析可以抽取出语音特征信息,建立一个特征模型;在匹配阶段,单片机对采集到的语音样本提取特征信息并与系统中存放的特征模型进行比较,根据一定的算法和策略,找出最优的与待辨识语音匹配度最高的模块,并输出识别结果。图4表示语音识别系统的基本流程。
图4 语音识别系统基本流程
2.3 电机模块
为了能够方便控制直流减速电机的正反转,设计采用电机驱动芯片L298N。L298N为15引脚的单块集成电路,内部包含4通道逻辑驱动电路。L298N无需隔离电路,可以直接分别驱动两个直流减速电机的正转与反转。根据L298N芯片的特点以及SPCE061A的引脚特性,本方案将SPCE061A的IOB0~IOB7作为输出口,分别与两块L298N芯片的IN1~IN4相接。L298N的VS、VSS分别接+12 V、+5 V电源,输出口OUT1~OUT4接两个直流减速电机。PWM调制端口接SPCE061A的IOB8脚,通过IOB8引脚输出的PWM波来调节电机转速。L298N电机驱动原理图如图5所示。
图5 L298N电机驱动原理图
2.4 光电寻迹模块
本设计光电寻迹模块采用RPR220反射型光电对管。RPR220是一种一体化反射型光电探测器,其发射器是一个砷化镓红外发光二极管,而接收器是一个高灵敏度、硅平面光电三极管。通过红外敏感端对不同颜色的感光能力的不同,RPR220光电对管检测到黑白颜色时输出的电压不同。将光电对管输出的电压送入比较器进行处理,从而实现当光电对管遇到黑线时,比较器输出高电平,而遇到白线时输出低电平。本方案使用的比较器是LM339N。电路原理图如图6所示。
图6 光电寻迹模块原理图
将LM339N的数据输出端接IOA0引脚,当碰到黑线时,LM339N的输出跳变为高电平,SPCE061A根据设定的算法作出相应动作。
2.5 无线控制模块
无线控制模块由编解码模块和无线传输模块组成。无线传输模块的数据传输采用FSK-2A型高频无线数据发射模块。该模块工作电压为9~12 V,采用SAW稳频,发射功率大,空旷地发射距离可达1 km,性价比高。
编解码模块选用PT2262/PT2272编解码芯片组。
本设计中,PT2272解码芯片的D0和D1两个引脚与SPCE061A的IOA8和IOA9连接。PT2262编码芯片发送0x01和0x02两个编码信号,PT2272负责解码这两个信号。SPCE061A根据收到的信号依照设定的算法控制电机执行动作。
3 系统软件设计
本设计采用C语言和汇编语言混合编程。其中,C语言作为主程序编程,可以充分利用C语言简单易懂的优点来控制其他模块。设计实现程序均在凌阳公司提供的u′nSP集成开发环境中开发完成。软件设计采用模块化程序结构,主要包括初始化程序、系统主程序、语音识别子程序、智能手动作执行子程序等。系统的软件设计流程如图7所示。
图7 系统软件设计流程图
程序的初始化部分完成语音训练以及辨识器、I/O口的初始化,部分代码如下:
unsigned int uiFlagFirst;//是否为第一次下载
unsigned int uiRes;//识别结果
unsigned int uiActivated;//是否处于待命状态
unsigned int uiTimerCount;//时间是否超时
unsigned int uiBS_Team;
//标识现在是第几组命令在内存当中
unsigned int uiKey;//存储键盘值,按下将重新训练
RobotSystemInit();
uiActivated = 0;
uiFlagFirst = IsFirstDownLoad();//是否为第一次下载程序
if(uiFlagFirst == 1){
FormatFlash();//格式化需要存储命令的存储器
TrainFiveCommand();//训练需要的5条命令(一组)
SaveFiveCommand(0xf700);//存储5条命令
PlaySnd(OK);//播放“收到”,表示一组命令存储结束
TrainFiveCommand(); //训练第二组命令
SaveFiveCommand(0xf900);
PlaySnd(OK);
TrainFiveCommand();//训练第三组命令
SaveFiveCommand(0xfb00);
PlaySnd(OK);
uiFlagFirst = 0xaaaa; //标志已训练过
F_FlashWrite1Word(0xfd00,0xaaaa); //置标志位寄存器
}
ImportFiveCommand(0xf700);//将第一组命令存到内存当中
uiBS_Team = 0;
*P_IOA_Dir=0x0;//设置IOA口为带下拉电阻的输入引脚
*P_IOA_Data=0x0;
*P_IOA_Attrib=0x0;
PlaySnd(RSP_STAR);//开始识别命令
*P_Watchdog_Clear=0x0001;
Loop:
BSR_InitRecognizer(BSR_MIC);//辨识器初始化
BSR_EnableCPUIndicator();//启动实时监控
while(1){}//进入语音识别的循环中
3.1 语音训练
在以后的语音识别过程中,如果已经训练过,会把存储在 Flash中的语音模型调出来装载到辨识器中使用。本设计使用的语音命令结构图如图8所示。
图8 语音命令结构图
3.2 语音识别
辨识器初始化时,先将第一组命令存储在要被调用的内存当中。在识别环节当中,如果辨识结果是触发名称,辅助手将进入待命状态,并播放声音告知收到,然后等待识别下一级动作命令。如果辨识出动作指令,辅助手会语音告知并执行相应动作。注意,每次进行每条语音识别,都必须先使用触发名称进行状态激活。语音识别流程图略——编者注。
3.3 重新训练
考虑到有重新训练的需求,设置了重新训练的按键,即61板上的KEY3键。SPCE061A控制器一旦检测到此键按下,则将擦除训练标志位,并等待复位。复位后,程序进入初始化阶段,当检测到训练标志位为 0xffff时,会要求重新对其进行训练。
3.4 无线控制模块
通过两个按键K1、K2,无线控制模块发射端可以向接收端发送控制信号,SPCE061A根据接收端收到的控制信号执行相应动作。
执行动作略——编者注。
4 系统测试与分析
通过多次的修改与调度,智能手能够很好地满足预定的设计要求。在最后阶段对智能手做了语音识别的准确度测试,结果如表1所列。每次测试前都要进行语音训练,以提高结果的可信度。
表1 语音识别测试
我们还测试了光电寻迹模块与无线控制模块的工作情况,结果略——编者注。
数据表明,智能手可以较准确地识别语音命令,光电寻迹模块与无线控制模块工作也较为稳定。
结语
本文基于SPCE061A设计了语音控制的智能手系统,系统测试结果表明,智能手能够较准确地完成语音命令的识别并执行相应动作,各个模块工作稳定,达到了设计目的。