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

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

时间:07-02 来源:现代计算机 点击:

<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 一个语音控制鼠标工作的例子

  4 语音控制鼠标的缺陷

  虽然几个简单的语音命令, 可以控制鼠标移动到屏幕的任何位置, 并可以根据语音命令模拟单击、双击等各种鼠标事件, 但是实际使用中还存在缺陷。

  对于大的目标而言, 这种语音控制鼠标控制没有什么问题, 如果目标区域比较小, 将会增加使用者的难度, 比如当光标移动到矩形时喊"停", 光标会继续移动一小段才停, 这时光标可能已经越过了目标矩形。这种情况和语音识控制中存在的延时有关, 每次用户发出语音命令到命令被执行都有一个过程, 首先使用者说出语音命令是需要时间的, 而且语速快的人和语速慢的人说同样的命令花的时间不同; 另外语音识别引擎成功识别一个语音命令也需要一个时间。所以语音控制鼠标在控制过程中必然存在延时。因此从开始发出语音命令到动作被执行, 光标必然会有位置的误差: △S=V×△t ( △S 为位置误差, V 为鼠标移动速度, △t 为说话和识别造成的延时)。

  Sear 等人曾经研究用一个虚拟鼠标机制来解决延时误差问题, 即在真实的鼠标移动前虚设一个鼠标, 当假鼠标到达目标时发出语音命令, 执行的时候真鼠标正好到达目标处。但是他们的试验结果并不理想。因为每个人说话的习惯和速度是不一样的, 而且不同的状态下的语速也不同, 因此延时△t 不是一定的, 所以每次的位置误差△S 也不尽相同, 而一种固定距离的先导虚拟鼠标并不能取得很好的效果。

  5 一种改进方法

  影响位置控制效果的因素和目标的大小、移动速度和延时有关。能够改变的是速度控制, 所以本文采取一种方案改进位置控制精度。改进后的语音控制鼠标每次的位置误差△S 明显减小, 在目标较小的情况下, 位置控制精度得到提高。

  改进方法是在程序中增加对鼠标的速度控制: 在目标较小的情况下, 光标先以正常速度V1 移动, 到达目标附近时先进行减速控制, 用语音命令"慢"来控制鼠标减低移动速度到V2( 实际设计中V2=1/3 V1) ,到达目标后再用语音命令"停"停止鼠标移动, 图3 反映了这个过程中光标速度的变化。这样在延时时间不变, 由于光标移动速度V 降低很多, 由△S=V×△t 知道位置误差△S 也减小很多。

  

图3 速度可控制的

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

网站地图

Top