VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 操纵Agent
发表评论(0)作者:Shannon Lake, 平台:VB6.0+Win98, 阅读:10528, 日期:2002-02-09
Microsoft Agents 介绍

这一天终于到来了。你现在可以逐字地告诉你的计算机运行一个报告,阅读一封信或者播放一首歌曲。本文将介绍如何利用Agent的文字到语言的转换功能。你将学会如何扩展VBA使其包括ActiveX,如何编写一个调用Agent来大声朗读活动Word文档的应用程序。

与包括Microsoft Office Assistant 在内的任何前辈都不相同,Microsoft Agent 1.5使用多个角色--Genie, Merlin, 和 Robby(见图1)--来提供人/机接口。每个角色都经过三维处理,并具有一套独特的卡通制作。



图1 Microsoft Agent 角色:Genie, Merlin和 Robby


安装

不过,为了充分利用Agent,你需要做一些准备工作。你必下载和安装一些组件。它们均可以在http://www.microsoft.com/workshop/prog/agent提供。利用这些组件,可以下载这个压缩的可执行文件,并运行它以实现安装。这些组件包括:

Microsoft Agent Control

Microsoft Command and Control 语音工具

Lernout & Hauspie TruVoice文字到语音转换工具

然后下载如下文件并将其放在\Program Files\Microsoft Agent\Characters目录之中。


genie.acs

merlin.acs

robby.acs

你还应该下载Agent文档资料。至少,你将需要Programming the Microsoft Agent Control, Programming the Microsoft Agent Server Interface, 以及用于每个角色的资料,例如用于Robby Character的Microsoft Agent Animations。为了口述命令,你还需要一个声卡和一个话筒。

Agent的 第一个使命:仅仅露一面

在第一个项目中,我们将编写一个测试过程来证实Agent极其组件已被正确安装。第一次,我们不要求太多的东西;仅仅需要Agent露一面说几句话即可。我们将使用Genie来测试运行。

首先启动Microsoft Word 97,通过按住AL!(或选择Tools | Macro | Visual Basic Editor)来激活Visual Basic Editor。下一步,单击Project Explorer,或按Cr。该操作将为你提供一个列表,里面包含了你已经打开的所有项目。请选中Normal项目(关于Normal的更为详细的信息,请参阅第5页的"Normal模板")。

创建表单。通过从Project Explorer或菜单中选择Insert | UserForm来插入一个表单。通过在Properties窗口中改变如下属性来修改UserFform(为了显示Properties窗口,可能需要按4键)。

Caption: Agent Control Form
Width: 100
Height: 85

在表单上放置两个CommandButtons。然后将它们的Caption属性改为Start Agent和Stop Agent,以便它们可以在图2中出现。


(如果您的浏览器不支持inline frames,请点击这里在单独的页面观看此图)
图2 在Visual Basic IDE中创建第一个示范:在UserForm.上放置两个按钮

控制和引用。对于每个新项目,向DLL和OCX添加包含有过程、方法和你正在引用的其他代码的引用是十分重要的。选中Tools | References来激活References对话框。向下滚动,并选中Microsoft Agent Control 1.5。

下一步,确认Toolbox已通过单击或从View | Toolbox菜单中选中而激活。通过选中Tools | Additional Controls来激活Additional Controls对话框;找到阅读Microsoft Agent Control 1.5的行,并单击它的复选框。完成之后,你将看到Agent图标位于Toolbox的下半部分(见图3)。


(如果您的浏览器不支持inline frames,请点击这里在单独的页面观看此图)

图3 显示Toolbox的Visual Basic IDE;Agent图标已被添加到Toolbox.

下一步,我们要编写可以使Genie出现和消失的子程序。首先请单击顶部标签为Start Agent的按钮。你将看到Visual Basic IDE已经启动了CommandButton1_Click子程序。向顶部滚动,输入如下的语句:

Const DATAPATH = _
"C:\Program Files\Microsoft Agent\Characters\genie.acs"

Dim Genie As IAgentCtlCharacter
Dim SpeakString As String
图4中列出了全部的代码。这些语句声明了必要的变量和常量。Microsoft建议在所列出的目录中安装Agent角色文件(ACS文件),但你也可以将它们放在其他地方--只要你为DATAPATH常量输入了正确的路径即可。

Option Explicit
Const DATAPATH = _
"C:\Program Files\Microsoft Agent\Characters\genie.acs"
Dim Genie As IAgentCtlCharacter
Private Sub UserForm_Activate()
Agent1.Characters.Load "Genie", DATAPATH
Set Genie = Agent1.Characters("Genie")
End Sub

Private Sub CommandButton1_Click()
Genie.Show
Genie.MoveTo 100, 100
Genie.Speak "My name is Genie. Your wish is my command."
End Sub

Private Sub CommandButton2_Click()
Genie.MoveTo 350, 250
Genie.Hide
End Sub

Private Sub UserForm_Deactivate()
Set Genie = Nothing
End Sub

图4 本代码阐述了基本的Genie控制

当UserForm被激活的时候,可以创建如下将被执行的代码:
Private Sub UserForm_Activate()

现在我们通知Agent对象将Genie 角色加载到它的Characters集合之中,这样我们就可以访问它了:
Agent1.Characters.Load "Genie", DATAPATH

下一步,使用Set语句来简化后面的代码:
Set Genie = Agent1.Characters("Genie")

这不是必需的,但以后的语句需要精心编制。例如,需要如下语句来显示Agent:
Agent1.Characters("Genie").Show

这样则更加直接:
Genie.Show

下一行为SpeakString变量赋了一个值。在本例中,我们通知Microsoft Agent介绍它自己,然后为语音识别输入做准备(在本例中,我们不为该部分编写代码)。
SpeakString = "My name is Genie. Your wish is my command."

让我们通过调用Genie并让它朗读SpeakString的值来完成代码。我们将编写CommandButton1_Click子程序来完成该项任务。Show是用来让用户可以看见Genie的命令,Speak将触发Microsoft的文字到语音转换工具朗读在它前面的文字。

Private Sub CommandButton1_Click()
Genie.Show
Genie.Speak SpeakString
End Sub
CommandButton2_Click子程序将把Genie隐藏起来。

Private Sub CommandButton2_Click()
Genie.Hide
End Sub

最后,完成之后,我们必须通过使用如下语句来销毁Agent对象:

Private Sub UserForm_Deactivate()
Set Genie = Nothing
End Sub

现在你就可以准备启动Agent了。通过单击Run按钮,或按5键来测试一下,看看你的计算机是否已被正确设置了。该操作将激活这个表单,Agent服务器将在加载表单的时候初始化,在用户退出表单的时候销毁。当按下Start Agent按钮的时候,Genie将出现并说:"My name is Genie. Your wish is my command."(如图5所示)。它将在按下Stop Agent的时候消失。


(如果您的浏览器不支持inline frames,请点击这里在单独的页面观看此图)

图5 示范应用程序在运行:Genie出现了

因为我们正在从模型对话框中操作Agent,所以这种实现并不是非常现实的,尽管它完全可用于示范或开发。下一步,我们将做一些更加有用的工作;我们将把Agent融入Word 97,并让Robby为我们朗读。

Agent'的第二个使命:为我朗读

目标是在Word 97中放置一个按钮,当按下它的时候,将调用将要大声朗读活动文档的Agent--这是从另一个侧面了解你的作品的好方法。

让我们从字符路径常量的声明开始:
Const ROBBYPATH = _
"C:\Program Files\Microsoft Agent\Characters\robby.acs"

用于Agent 和角色的变量为:
Dim MSAgent As Agent
Dim Char As Object

像以前一样,然后我们使用New关键字来创建一个Agent对象:
Set MSAgent = New Agent

在创建完Agent对象之后,我们必须启动Agent ActiveX服务器。为了实现这一点,我们将Agent对象的Connected属性设置为True:
MSAgent.Connected = True

然后,我们加载字符并将它分配给Object变量:
MSAgent.Characters.Load "Robby", ROBBYPATH
Set Char = MSAgent.Characters("Robby")

准备工作就做完了。现在该轮到我们的Agent表现了。

He walk…
控制Agent的屏幕行为是很简单的。大部分操作可以通过使用Character对象的Play函数来实现。Play函数有一个参数--一个由Animation字符串组成的字符串。例如,如下语句将导致Robby 挥手致意:
Char.Play "Wave"

而如下语句将导致他向右移动(Robby使用一个黑色背包移动):
Char.Play "MoveRight"

图6列出了一个用于Robby的Animation字符串的小子集,而图7到11则显示了其中的几个。正如你所看到的,Robby可以做很多动作。可提供的Animation字符串随角色的不同而不同,因此你需要获得有关每个你想使用的角色的资料。例如,在用于Robby 的Microsoft Agent Animations中,Robby有94个Animation字符串。

Animation描述

Acknowledge Nods head
Alert Straightens and raises eyebrows
Announce Prints output and reads
Blink Blinks eyes
Declines Raises hands and shakes head
DontRecognise Holds hand to ear
GestureLeft Gestures to the left
GestureRight Gestures to the right
GetAttention Raises and shakes arms
GlanceLeft Looks left briefly
GlanceRight Looks right briefly
Hear_1 Turns head left
Idle2_1 Crosses arms
Idle2_2 Removes head and makes adjustment
LookLeft Looks to the left
MoveUp Flies up
Processing Presses buttons in looping animation
Reading Reads in looping animation
Sad Makes sad expression
Searching Looks through toolbox in looping animation
Think Tilts head and scratches
Wave Waves
Write Takes out clipboard, writes and looks up

图6 为Robby角色选择Animation字符串的子集:共有94个

不过,使用Play,Robby将保留在相同的屏幕位置里。为了实际上在屏幕周围移动Agent,你可以使用Character对象的MoveTo过程,该过程有两个参数--x和 y屏幕坐标。下面是一个例子:
Char.MoveTo 200, 300

如果你想让角色仍然移动到屏幕之上,可以在调用Show之后使用MoveTo;在第一次引用时,如果你想让角色出现在特定的位置,可以在调用Show之前使用MoveTo来放置Agent。既然我们已经知道如何创建Agent手势以及如何移动它,那么就让我们使Robby说话吧。



图7 Animation "Wave": Robby说喂



图8 Animation "MoveRight": Robby向右飞



图9 Animation "Idle2_2": Robby做了一个内部调整



图10 Animation "Searching": Robby奇妙地通过了它的工具栏



图11 Animation "Reading ": Robby向我们朗读

He Talks...
让Robby说话也是很简单的;只需使用Character对象的Speak函数即可。Speak函数有一个参数--将要朗读的文字。文字可以有几种形式,包括文字串、文本文件或URL。在我们的例子中,我们想让Agent朗读一个Word文档,因此我们使用如下的语句:
Char.Speak ActiveDocument.Content

如果你做过任何Word 97 VBA编程,那么就会明白ActiveDocument.Content指的是ActiveDocument属性的Content属性,换句话说,就是当前选定的Word文档的主体文字。这条语句将导致Robby在文字气球中显示相关的文字的同时,大声朗读文档。多棒啊!
这条独立的语句是可以工作的,但是我们可以做得更好。步骤如下:

Char.Play "Read"
Char.Speak ActiveDocument.Content
Char.Play "Readreturn"

这几条语句将导致Robby从它的胸部打印出一些输出,在完成之后释放文档,以及在实际朗读之前开始阅读。"ReadReturn" Animation将导致Robby返回,在阅读之后停在中间位置。许多动画都与"...Return"动画相关联,因此可以做到动作之间的平滑转换。

现在,让我们将所学到的东西融合在一起,为Robby将要完成的一个短的动作序列编写脚本。我们将把它放在一个脚本之中,以便可以从Word 97中调用它,如图12所示。

Option Explicit

Const ROBBYPATH =
"C:\Program Files\Microsoft Agent\Characters\robby.acs"

Dim MSAgent As Agent
Dim Char As Object

Sub Speak()

Set MSAgent = New Agent
MSAgent.Connected = True
MSAgent.Characters.Load "Robby", ROBBYPATH

Set Char = MSAgent.Characters("Robby")
With Char
.Top = 125
.Left = 185
.Show
.Play "Greet"
.Play "GreetReturn"
.MoveTo 600, 400
.Play "Read"
.Speak ActiveDocument.Content
.Play "ReadReturn"
.Play "Idle2_2"
.Play "Wave"
.Play "WaveReturn"
.Hide
End With

End Sub

图12 VBA代码让Robby在屏幕上特定的坐标位置出现,挥手致意说喂,飞向屏幕的右下角,朗读活动的Word 97文档,完成调整,挥手致意说再见,和消失。

下一步,我们必须在Word中做一点工作。

He Crawls on His Belly Like a Reptile
为了将新的宏与自定义的工具栏关联起来,请选择View | Toolbars | Customize来显示Customize对话框。单击New按钮。为新工具栏取名为"Agent",使其可以提供给Normal.dot。这个工具栏现在就可以使用了。在Customize对话框中,单击Commands页并选中Macros。 Normal.NewMacros.Speak宏现在就应该可以使用了;将它拖向工具栏,然后在I光出现之后释放它。右击该按钮,将它的名字改为"Read",如果你喜欢的话,还可以为它提供一个图标。

通过返回到Customize对话框并再次选中该对象可以从菜单中调用新宏。这次,将它拖向Tools菜单(但不让它走)。这个菜单将打开并滚向底部。当你在自己希望的位置看到I光线之后,释放按钮。可以按照与以前相同的方式改变菜单项的属性--通过右击。

结论

我们已经介绍了Microsoft Agent的基础知识,并且列出了你探索Agent的潜力所需要的软件和硬件。然后我们继续利用Agent的语音功能来实现一个有用的Word宏来大声朗读文档。

记住Agent可以作为ActiveX提供也是十分重要的。这就意味着它可以使Web站点更加充满活力。例如,你可以访问位于http://www.argolink.com/agent/merlinscorner/druidxicon.html (见图13)的Argo Technologie的Web站点。你还可以从Microsoft的 Agent页(当你探索Microsoft Agents的时候,将对这个页面十分熟悉)链向它和其他启用了Agent的站点。

图13 你可以在Argo Technologies站点的Web上看到Microsoft Agent在运行

图14 了解这个站点;正在用有价值的工具和信息加载

本文仅仅涉及到了一些表面的知识。Microsoft Agent是一项主要的技术(光Programming the Microsoft Agent Control文档就有75页!),因此在熟练之前,你将需要花上一段时间。好消息是,你将体会到很多乐趣。
本文中所引用的文件可以从Informant Web站点下载,网址为:http://www.informant.com/mod/modnewupl.htm.:文件名为 MOD9801SL.ZIP。

Shannon M. Lake, Sr., CET, NCT, 和 MCP是OMNIFORCE Group的CEO,该组织是一个国际远程通信和软件工程咨询组织,其重点是设计和精炼公司的新的和现有的信息、软件、远程通信和/或数据通信系统。Shannon目前正在开发一个新的操作系统。可以通过lake@omniforce.com, http://www.omniforce.com/lake, 或 (800) 367-9946与他联系。