Agent插件浅析

发表于:2007-07-02来源:作者:点击数: 标签:
Agent插件浅析 使用过office xp、金山毒霸和瑞星杀毒软件的朋友,一定会对程序中的人性化的动画角色留下深刻印象,这完全归功于微软推出的Agent(代理)技术,Agent采用COM技术,使用ActiveX控件方式,支持现在流行的各种开发工具,不仅可以实现文本的朗读,
Agent插件浅析
      使用过office xp、金山毒霸和瑞星杀毒软件的朋友,一定会对程序中的人性化的动画角色留下深刻印象,这完全归功于微软推出的Agent(“代理”)技术,Agent采用COM技术,使用ActiveX控件方式,支持现在流行的各种开发工具,不仅可以实现文本的朗读,而且可识别用户的语音命令,在应用程序和HTML文件中得到广泛的使用。
下面我们以PowerBuilder 8.0为开发工具来编制一个小实用程序,一步步说明其实现方法:
第一步从Inte.net网上下载Agent插件,并安装在计算机上,这是开发的前期准备工作:
这些插件来源于微软公司的相关网站,下载的网址为:http://www.microsoft.com/msagent/downloads/user.asp,连接使用该网页:
1、首先单击“Download the Microsoft Agent core componts(395kbs exe)”下载并安装Agent的核心组件,其文件名为“Msagent.exe"。
2、其次单击(先选择"Simplified Chinese (127kb exe)”)下载并安装语言组件,其文件名为“AgtX0804.exe"。
3、其次单击(先选择"Lernout & Hauspie TruVoice TTS engine - American English(1Mb exe)”)下载并安装TTS引擎,其文件名为“tv_enua.exe",要实现语音朗读,必须安装,当前版本支持英语。
4、再其次单击(先选择"Doadload the Microsoft Speech Recognition Engine(6Mb exe)”)下载并安装语音识别引擎,其文件名为“Actcnc.exe",要实现语音命令识别,必须安装,当前版本支持英语。
5、最后单击“Download selected character"下载安装要用到的动画角色文件,在这里我们下载微软公司网站所提供的动画角色文件,主要包括Genie(妖怪、鬼)、Robby(机器人)、Merlin、Peedy(睡衣)共四种动画角色,它们不但有丰富的行为动作,而且具有语言功能,其对应的文件名分别为Genie.acs、Robby.acs、Merlin.acs、Peedy.acs。这些Agent角色的常用动画动作,通常用含有相同意义的英文单词字符来标识,如下表所示,以下所述编程实例即演示它们分别所产生的动作效果。
常量   相关动作
Acknowledge  显示承认、答谢的动作
Alert   显示警告的动作
Announce                  显示宣布、通告的工作
Blink   显示眨眼的动作
Decline                  显示摇头拒绝的动作
DoMagic1、DoMagic2                 显示指挥演奏的动作
Confused                  显示迷惑的动作
Congratulate  显示祝贺的动作
DontRecognize  显示无法识别的动作
Explain                  显示解释的动作
GesttureDown  显示向下方向的手势动作
GesttureLeft  显示向左方向的手势动作
GesttureRight  显示向右方向的手势动作
GesttureUp                  显示向上方向的手势动作
GetAttention  显示立正的动作
GetAttentionContinued                显示继续立正的动作
GetAttentionReturn                 显示继续立正的动作
Greet   显示问候的动作
Hearing_1  
Hearing_2                  显示左右聆听的动作
Hearing_3
Hide   隐藏动画角色
Idle1_1                 显示舒展的动作
Idle1_2                 显示向左倾的动作
Idle1_3                 显示向右倾的动作
Idle1_4                 显示向后倾的动作
Idle1_5                 显示向前倾的动作
Idle2_1                 显示带耳机听音乐的动作
Idle2_2                 显示吃饼干的动作
Idle3_1                 显示带耳机听音乐的动作
Idle3_2                 显示瞌睡的动作
Idle3_3                 显示带耳机听音乐的动作
LookDown  显示向下查看的动作
LookDownBlink  显示向下眨眼的动作
LookDownLeft  显示向左下方查看的动作
LookDownLeftBlink 显示向左下方眨眼的动作
LookDownLeftReturn 显示回返向左下方查看的动作
LookDownRight  显示向右下方查看的动作
LookDownRightBlink 显示向右下方眨眼的动作
LookDownRightReturn 显示回返向右下方查看的动作
LookDownReturn 显示回返向下方查看的动作
LookLeft  显示向左方查看的动作
LookLeftBlink  显示向左方眨眼的动作
LookLeftReturn 显示回返向左方查看的动作
LookRight  显示向右方查看的动作
LookRightBlink 显示向右方眨眼的动作
LookRightReturn 显示回返向右方查看的动作
LookUp   显示向上查看的动作
LookUpBlink  显示向上眨眼的动作
LookUpLeft  显示向左上方查看的动作
LookUpLeftBlink 显示向左上方眨眼的动作
LookUpLeftReturn 显示回返向左上方查看的动作
LookUpRight  显示向右上方查看的动作
LookUpRightBlink 显示向右上方眨眼的动作
LookUpRightReturn 显示回返向右上方查看的动作
LookUpReturn  显示回返向上方查看的动作
MoveDown  显示向下移动的动作
MoveLeft  显示向左移动的动作
MoveRight  显示向右移动的动作
MoveUp   显示向上移动的动作
Pleaseed  显示愉快的动作
Process  显示处理工作的动作
Processing  显示正在处理工作的动作
Read   显示阅读的动作
Readcontinued  显示继续阅读的动作
Reading  显示正在阅读的动作
ReadReturn  显示停止阅读的动作
Sad   显示悲伤的动作
Search   显示查找的动作
Searching  显示正在查找的动作
Show   显示动画角色
StartListening 显示开始聆听的动作
StopListening  显示停止聆听的动作
Suggest  显示建议的动作
Surprised  显示惊讶的表情
Think   显示思考的表情
Thinking  显示正在思考的表情
Uncertain  显示不确定的动作
Wave   显示致意的动作
Write   显示写的动作
Writecontinued 显示继续写的动作
Writing  显示正在写的动作
WritReturn  显示停止写的动作
当然,我们也可以从http://www.microsoft.com/msagent/downloads/developer.asp网页单击“Download the
Microsoft Agent Character Editor(1Mb exe)”和“Download the Microsoft Agent Linguistic Information
Sound  Editing Tool(6.2Mb exe)”下载制作工具,亲自制作自己所钟爱的动画角色形象。
第二步设计应用程序
    在PowerBuilder中提供了OLE控件,以便PowerBuilder应用程序能够使用其它开发工具编写的COM组件和ActiveX控件
在使用相关的COM组件和ActiveX控件先,须注册相关的COM组件和ActiveX控件,在PowerBuilder注册控件,可以在PowerBulider
开发环境中,插入OLE控件时,选择Regisiter New进行注册。
    Agent控件的主要属性如下表:
属性    用途
Charactors    用于设置与控件相关联的动画角色文件
Connected   用于判别控件是否与Agent服务器相连接
LanguageID   用于设置Agent所使用的语言,目前仅可设置为十六进制的“409”,即“&H409”
    Agent控件的主要方法如下表:
方法    用途
Load    用于初始化Agent控件,并加载动画角色数据文件
UnLoad    用于卸载动画角色数据文件
Show    用于显示的Agent动画角色,并可通过参数控制动画角色的显示速度
Hide    用于隐藏的Agent动画角色,并可通过参数控制动画角色的隐藏速度
StopAll   用于停止动画角色的所有动作
Stop    用于停止动画角色的当前动作
MoveTo    用于移动动画角色,可通过参数来设置移动的坐标和移动的速度
Interrupt   用于中断动画角色的动画,在执行一些有持续性的动画动作时,如不
    中断该动作即执行下一个动作,会产生异常现象
Wait    用于在多个动画角色间实现相互之间的动作协调
Play    用于执行指定的动画动作,可通过参数来设置动画类型
Speak    用于通过语音合成引擎,实现英语的语音合成输出功能,即只需要输入
    英文字符串,Agent即可通过声音输出设备“说话”
    Agent控件的主要事件如下表
事件    用途
Show    在Agent动画角色显示时触发,可利用该事件将程序的主界面隐藏
Hide    在Agent动画角色隐藏时触发,可利用该事件将程序的主界面重新显示
在PowerBuilder中实现的步骤如下
1、新建myexample.pbw的工作区;
2、新建myexample.pbt的应用目标,PowerBuilder会自动建立一个pbl库文件以便存放相关的PowerBuilder对象,并建立一个myexample
应用程序对象;
3、新建窗口对象w_example,并在其上放置控件如下表:
控件    控件名称
listbox   lb_1
commandbutton   cb_1
commandbutton   cb_2
ole control   ole_1(并插入对应的Agent ActiveX控件)
4、新建菜单对象m_file,并添加相关菜单项如下表:
菜单名    菜单文本  菜单脚本
m_file    文件(&F)   
 m_fileopen  打开(&O)  parentwindow.triggerevent("ue_fileopen")
 m_bar1   -
       m_fileexit  退出(&E)  parentwindow.triggerevent("ue_fileexit")
5、将窗口对象w_example的menuid属性设置为m_file
6、定义窗口w_example的实例变量如下:
privite:
boolean ib_flag
string is_animationname
7、编写窗口w_example相关事件脚本:
open事件脚本如下:
long result,ll
if fileexists(GetCurrentDirectory ( )+"\peedy.acs")=false then
   result=messagebox("提示“,"在程序当前目录下没有动画角色文件",stop!)
   ib_flag=false
   close(this)
else
   ib_flag=true
   ole_1. O B J E C T.characters.load("CharacterID",GetCurrentDirectory ( )+"\peedy.acs")
   ole_1. O B J E C T.characters("CharacterID").languageID=1033
   ole_1. O B J E C T.characters("CharacterID").moveto(20,20)
   ole_1. O B J E C T.characters("CharacterID").show()
   ole_1. O B J E C T.characters("CharacterID").play("Wave")
   ole_1. O B J E C T.characters("CharacterID").speak("Hello,Welcome to use The Character Animation Previewer Programm!")
   ole_1. O B J E C T.characters("CharacterID").play("Reading")
   lb_1.reset()
   for ll=1 to upperbound(ole_1. O B J E C T.characters("CharacterID").animationnames)
        lb_1.additem(ole_1. O B J E C T.characters("CharacterID").animationnames[ll])
   next
   lb_1.selectitem(1)
close事件脚本如下:
if ib_flag=true then
   ole_1. O B J E C T.characters("CharacterID").hide()
   ole_1. O B J E C T.characters.unload("CharacterID")
end if
自定义事件ue_fileopen的脚本如下:
string docname, named
integer value
value = GetFileOpenName("选择动画角色文件",docname, named, "acs", "动画角色文件(*.acs),*.acs" )
IF value = 1 THEN
   ole_1. O B J E C T.characters.unload("CharacterID")
   ole_1. O B J E C T.characters.load("CharacterID",docname)
   ole_1. O B J E C T.characters("CharacterID").languageID=1033
   ole_1. O B J E C T.characters("CharacterID").moveto(20,20)
   ole_1. O B J E C T.characters("CharacterID").show()
   ole_1. O B J E C T.characters("CharacterID").speak("Hello!")
   ole_1. O B J E C T.characters("CharacterID").play("congratulate")
   ole_1. O B J E C T.characters("CharacterID").play("Wave")
   cb_1.enabled=false  
   lb_1.reset()
   for ll=1 to upperbound(ole_1. O B J E C T.characters("CharacterID").animationnames)
        lb_1.additem(ole_1. O B J E C T.characters("CharacterID").animationnames[ll])
   next
   lb_1.selectitem(1)
   ole_1. O B J E C T.characters("CharacterID").moveto(0,0)
   lb_1.setfocus()
end if
自定义事件ue_fileexit的脚本如下:
close(this)
lb_1的clicked事件脚本如下:
cb_1.enabled=true
lb_1的doubleclicked事件脚本如下:
cb_1.triggerevent("clicked")
lb_1的getfocus事件如下:
cb_1.default=true
cb_1的clicked事件脚本如下:
ole_1. O B J E C T.characters("CharacterID").stop
this.title="演示动画角色动作:"+lb_1.SelectedItem ( )
ole_1. O B J E C T.characters("CharacterID").play(lb_1.selecteditem())
cb_2的clicked事件脚本如下:
ole_1. O B J E C T.characters("CharacterID").stop()
8、编写application对象open事件脚本如下:
open(w_example)

原文转自:http://www.ltesting.net