微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > 基于语音识别技术的声控鼠标光标设计

基于语音识别技术的声控鼠标光标设计

时间:07-13 来源:3721RD 点击:

1 概述

电脑语音技术经过多年发展已经取得了巨大进步, 目前已经有一些产品和项目让人们有机会和计算机进行语音交互工作, 例如IBM公司的Viavoice 系列软件以及微软的新的Office 产品都有实用的语音功能, 可以进行语音听写录入文字等工作, 还出现了一些基于语音技术的应用系统。

语音技术特别是语音识别技术的发展, 使人们可能实现用语音控制电脑, 这对于世界上众多不能方便使用传统的鼠标及键盘的伤残人士有重大的意义; 另外在一些场合不方便操作电脑但又必须使用的情况下同样很有意义, 比如驾驶的同时查询电子地图。目前要真正控制一台图形界面的电脑, 必须做到使用语音控制也能像使用键盘和鼠标那样输入数据以及控制光标。因此一种有效的语音控制光标程序, 也就是可以定位在屏幕的任意位置, 并且可以模拟单击、双击拖拽等各种鼠标动作的语音控制程序, 对于实现语音控制电脑将是一个很有意义的工具。

本文利用微软的Speech SDK 5.1 免费的语音识别引擎和模拟鼠标技术, 用Delphi7.0 实现了一个语音控制鼠标应用程序, 可以实现语音控制鼠标移动、停止、单击等动作达到控制屏幕光标的作用, 并对语音控制鼠标程序中的延迟问题进行了分析, 提出并实现了一种改进方法。

  2 基于语音识别的光标控制类型

目前有两种语音控制鼠标的模式: 一种是目标导向光标控制和方向导向光标控制[n].对于前者, 用户需要用语音给出具体目标名称或者位置, 比如图标、菜单, 或者屏幕区域名称, 然后给出执行的命令如"单击"等, 这种方式对于单个软件还是有效的, 但是当目标增加的时候用户需要记忆很多目标的名称, 还可能出现同名称目标的情况, 因此工作中的错误率会增加。另一种方向导向光标控制又分为非连续控制和连续控制两种, 对于非连续的情况用户要同时说明方向和距离, 如命令"左8 厘米", 那么光标就向左移动8厘米; 而对于连续的情况用户先说明方向如"向左",光标就向左移动, 直到用户再说"停止", 光标才停止运动。

本文讨论的声控光标是属于方向导向中的连续控制, 这种鼠标控制和日常的使用习惯比较一致, 用户使用起来比较适应。

  3 实现

本文语音控制光标程序的语音控制是采用微软的Speech SDK 5.1 的语音识别引擎及其API 接口, 这是一个免费的开发包, 并且可以用它开发具有中文语音功能的软件。语音识别引擎通常可以分为两种工作方式, 一种就是命令控制(Command and Control) 方式, 这个方式下语音识别引擎可以识别简短的语音命令, 以便执行相应的程序; 另外一种是连续听写方式,这个模式下语音识别引擎要识别连续的语音, 这种功能实现起来比语音控制更复杂, 因为语音听写过程中需要对上下文以及相同相似发音的词语进行分析、作出判断, 而在命令控制语音方式中不需要作上下文分析。本文采用的是命令控制方式, 因为实现语音控制鼠标只需要对有限的几个简短的命令进行识别, 如"左"、"右"、"停"等。图1 是语音控制鼠标程序的结构图。

图1 语音控制鼠标程序结构

  该应用程序主要包括两个部分: 第一部分语音控制应用主程序部分, 主要调用语音识别引擎识别用户的语音命令。

这部分程序主要完成几件工作:

①导入辞书文法文件(XML 格式, 其中定义感兴趣的语音命令) , 完成对语音识别引擎接口的初始化工作, 激活语音识别引擎;②接收语音识别引擎的识别结果, 根据识别结果调用相应的鼠标控制程序。

下面的语法文件中定义了方向命令和鼠标事件命令的语法规则:

<GRAMMAR LANGID="804">
<DEFINE>
<ID NAME="RID_start" VAL="1"/>
<ID NAME="PID_colour" VAL="2"/>
<ID NAME="PID_colourvalue" VAL="3"/>
</DEFINE>
<! - - Rule definiTIons - - >
<RULE NAME="start" ID="RID_start" TOPLEVEL="ACTIVE">
<RULEREF NAME="colour" PROPNAME="colour"PROPID="PID_colour" />
</RULE>
<RULE NAME="colour" >
<L PROPNAME="colourvalue" PROPID="PID_
colourvalue">
<P VAL="1">上</P>
<P VAL="2">下</P>
<P VAL="3">左</P>
<p VAL="4">右</p>
<p VAL="5">停止</p>
<P VAL="6">单击</P>
<P VAL="7">双击</P>
<p VAL="8">关闭</p>
</L>
</RULE>
</GRAMMAR>

在程序运行的时候, 一旦有上述语法文件中定义的命令被成功识别, 则在程序的onRecgnition 响应函数中可以查询出识别的返回值是1~8 中的某个值, 根据不同的返回值就可以调用鼠标控制程序进行鼠标的某个方向的移动或者点击等事件的模拟控制。

第二部分鼠标控制程序, 就是调用程序模拟控制鼠标移动或单击等各种鼠标事件。这一部分主要是利用Windows API 函数模拟鼠标事件实现对鼠标光标的控制。

模拟鼠标移动可以通过循环调用Windows API函数SetcursorPos(x1,y1)来实现, 在循环中控制x1 和y1 的变化就可以实现任何方向的鼠标移动。在程序中模拟鼠标移动需要用到多线程控制, 否则鼠标移动过程中无法随时停止或者让他转向。以下是移动线程中的移动控制代码:

for I := 1 to 500 do
begin
if bstop=1 then break;
//遇到停止命令时停止光标移动
case Dr of
//根据参数Dr 决定光标运行方向
1: x1:=x1+n1; //右移
2: x1:=x1- n1; //左移
3: y1:=y1+n1; //下移
4: y1:=y1- n1; //上移
end;
windows.SetcursorPos(x1,y1);
end;

鼠标的另一类控制程序是模拟鼠标单击双击等鼠标事件, 主要是在程序中利用mouse_event 函数对鼠标事件进行模拟。程序中以下代码模拟了鼠标左键单击:
windows.mouse_event (MOUSEEVENTF_LEFTDOWN,0,0,0,0);
// 左键按下
windows.mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
// 左键抬起
图2 是一个理想情况下用本文程序实现语音控制鼠标的例子。光标初始位置在屏幕左下方, 目标矩形在屏幕右上区, 首先用户对麦克风发出"右"的命令, 光标就向右移动; 当光标到达目标下方的时候用户说"上"命令, 光标就改向上移动( 或者先说"停"命令, 光标停止) ; 当光标到达目标矩形, 用户说"停"命令, 光标停止, 最后用户说"单击", 程序模拟鼠标左键单击事件, 相当于目标矩形被单击。

图2 一个语音控制鼠标工作的例子

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top