该系统无需对现有电器进行大规模的改动,即可与之连接,实现语音控制。
本系统实现的功能包括三个部分,第一部分是用语音控制开关控制房间里的照明灯;第二部分是用语音控制开关控制电风扇;第三部分是用语音控制电调调频收音机的选台。
为了顺利地实现这三个功能,我们先来学习一下已有范例,大家可以从常用应用程序表中方便地查找到“特定人辨识的一个范例”,为了说明方便,我们拷贝了主程序中的注释,请大家仔细阅读一下:
//工程名称:Guard_sD.spj//功能描述:该程序是:
//在程序中我们通过三条语句的训练演示特定人连续音识别,其中第一条语句为,/触发命令。在程序一开始为训练名称,即触发命令,然后提示训练两条命令,/训练完毕开始辨识。当识别出触发名称后,发布命令则会听到应答,具体命令//如下:
\\ *********训练*******************//提示音 输入语音\\……一……一一……一一∥“请输入触发名称” “警卫”
//“请输入第一条命令” “开枪”
\\“请输入第二条命令” “你在干什么?”
//“请再说一遍”(以上提示音每说完一遍出现此命令)//“没有听到任何声音”(当没有检测到声音时出现此命令)//“两次输入名称不相同”(当两次输入的名称不同时出现此命令)//“两次输入命令不相同”(当两次输入的命令有差异时出现此命令)。 \\“准备就绪,请开始辨识”(以上三条语句全部训练成功时,进入识别)\\********识别***************//发布命令 应答\\……一……一……一一//“警卫” “在”/“长官”
∥“开枪” “枪声”
\\“你在于什么?” “我在巡逻”/“我在休息”/“我在等人”
//注意:在每次提示音结束后2—3秒再输人命令或当上次应答结束2~3秒后再发布命令。
大家可能已经注意到,训练中的提示音内容和识别中的应答内容,应是事先录入并压缩好的语音资源文件。输入语音的内容是从61A板上麦克风录入的。我们可以运行一下这个程序,感觉一下它的执行效果,体会一下语音识别的魅力。
在我们将要实现的这个系统中,需要从单片机I/O口输出开关量和脉冲量,关于单片机I/O口的使用,我们可以查看教科书有关SPCE061A硬件系统中的I/O端口控制器设置部分。为了更有利于系统功能的实现,我们选用了配套光盘中的另一个工程项目,这个工程项目使用的是特定语者辨识sD(SpeakerDependent),SD即语音样板由单个人训练,识别训练某人的语音命令,而他人的命令识别率较低的一种语音识别模式。并且该项目中使用了lOB口作为输出端口,有着便利的使用价值,我们同样拷贝了主程序中注释说明部分,为我们要完成的工程项目做借鉴。
\\***********训练***********************\ \提示音 输入语音//……一……一…//“请输入触发名称” “警卫”
//“请输入第一条命令” “红灯亮”
//“请输入第二条命令” “红灯灭”
//“请输入第三条命令” “绿灯亮”
\\“请输入第四条命令” “绿灯灭”
∥“请再说一遍”(以上提示音每说完一遍出现此命令)//“没有听到任何声音”(当没有检测到声音时出现此命令)//“两次输入名称不相同”(当两次输入的名称不同时出现此命令)//“两次输入命令不相同”(当两次输入的命令有差异时出现此命令)//“准备就绪,请开始辨识”(以上五条语句全部训练成功时,进入识别)\\*********识别*************\\发布命令 应答//一一一…一……一一∥“警卫” “在”
\\“红灯亮” IOBO口灯被点亮//“红灯灭” IOBO口灯被熄灭//“绿灯亮” IOBl口灯被点亮//“绿灯灭” IOBl口灯被熄灭∥注意:在每次提示音结束后2~3秒再输入命令或当上次应答结束2~3秒后再发布命令。
将其中的部分语音资源文件按我们的系统需求做一些代换,然后进行同样方式的训练。本系统共包括十多个语音资源,整个语音信号经SACM_S480压缩算法压缩只占有13.2K存储空间,SPCE061A单片机具有32K闪存,使用内部flash即可满足要求。
语音资源文件的制作与替换我们不再重复叙述,大家可以参考前几篇《初学凌阳单片机》文章,具体实施功能描述如下:
首先进行触发命令训练。当听到“请输入声控家电名称”提示音时,对此系统进行触发命令训练。当听到“请输入第一个命令”时,训练开灯功能。当听到“请输入第二个命令”时,训练开电扇功能。当听到“请输入第三个命令”时,训练电调调频收音机调台功能。当听到“请输入第四个命令”时,训练关闭功能。完成训练后,首先下达触发命令,系统如果成功识别出指令,会发出提示音“主人,我在”,然后再下达相应的其它命令。原有控制驱动电路原理图如图1所示。
现在要驱动的不是发光二极管,而是诸如控制各种家电的继电器驱动电路。继电器驱动电路的设计如图2所示。由于单片机I/O口提供的电流太小,不能直接驱动继电器。
在这里采用三极管8050来提供一个开关电路,实现I/O口对继电器的驱动,用二极管1N4007去除继电器释放时线圈中产生的反向电流,以保护三极管8050。
当IOB口输出高电平并保持时,三极管8050导通,继电器吸合,被控家用电器220V交流电源被接通,家用电器开始工作。
当IOB口输出低电平并保持时,三极管8050截止,继电器释放,被控家用电器220V交流电源被断开,家用电器停止工作。当IOB口输出高电平,保持很短时间,然后将IOB口置为低电平并保持,在IOB口就形成了一个高电平窄脉冲,它控制三极管8050导通后又截止,继电器吸合后又释放,这样继电器的输出端接在电调收音机搜索(SCAN)按键的两端,就替代了手动按键选台的作用。可具体将各IOB口分别定义为:IOB0口控制照明灯;IOBl口控制电风扇;IOB2口控制电调收音机搜索(SCAN)按键。
在配套光盘中我们把“电子竞赛\基础篇\语音功能\语音辨识\guardSD”目录下的代码略做修改即可完成我们所需要的功能。打开guardSD.spj文件,在“source files”中找到“。lnitlO.
asm”文件,把B口设置为同向输出低电平。在定义的LED_RED_0N()函数中,把r1=0xfffe改为rl=0x0001;在定义的LED_RED_0FF()中把rl=0xffff改为rl=0x0002;在定义的LED_GRE_ON()中,把r1=0xfffd改为r1=0xx0004;在定义的LED_GRE_OFF()中,把r1=0xffff改为r1=Ox0008。
在“sourcefiles'‘中找到”main.c'’文件,在“LED_GRE_oN()”
后面增加如下代码,用于产生脉冲。
for(k=0;k<50000;k++){ClearWatchDogO;}
LED GRE oFF;程序流程图见图3。为了更好地实现语音辨识,具有语音辨识的系统要求使用环境不能过于嘈杂。
本系统的应用领域极其广泛。系统虽然只具有三项控制功能,但只要按相同的方法稍加改动,就可以实现其它多种电器设备的控制,如电视机的开关、电视机的选台、音量调节等其它全部操作。也就是说,只要被控电器设备及其部件,是受开关量控制或者是受脉冲量控制的,我们都可以采用同样的方法,大家在各类电子竞赛中,只需动脑筋想出奇妙的被控对象来,就可以灵活应用这一程序,取得好成绩。文章结束时我们再给大家一点小小的启示:现在许多学校都有电化教学教室,老师们事先用PowerPoint做好了教学幻灯片,在上课时使用电脑和投影仪播放幻灯片,每播放下一张幻灯片时,都需要去点击一下鼠标左键,你能否使用上述控制方法,应用语音辨识技术,实现这一控制功能?