精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VB和Basic>>〓〓....周边技巧....〓〓>>关于Microsoft agent的几个问题?Help?

主题:关于Microsoft agent的几个问题?Help?
发信人: sealink()
整理人: fishy(2000-05-07 13:36:03), 站内信件
一点收集的资料,不知是否有用?
VC中使用MS Agent

闻怡洋 EMail: [email protected] homepage: http://vchelp.163.net

Microsoft Agent 控件比Office 97中的助手更进了一步,它提供的动画人物不仅
有生动、有趣的动作,而 且还能通过声卡、麦克风与用户进行交谈,这些功能使
计算机更具人性魅力,其应用前途相当广泛。这中新的技术方式更改了以前面最
多是面对操作提示,或是使用向导的枯燥、无味的交互方式。让使用者在工作之
余也能体会到一些乐趣。还有一点就是该开发控件是由MS免费提供,你所需要的
就是下载一个AgentCtrl的安装软件,然后再下载自己感兴趣的Agent文件(ACS),
在使用时可以通过AgentCtrl调入不同的Agent文件来使用不同的角色,而操作不
同的Agent都使用相同的代码,是不是很方便和高效。 

一般来讲Agent控件都需要支持一些固定的动作,如:说,看,移动,隐藏等,同
时还可支持一些不定的动作,如:魔术师Merlin可以执行的动作有,DoMagic1,
DoMagic2,Think,Greet等,还有一些循环动作:Hearing_1,Hearing_2等。就
是这些动作让Agent看起来更加可爱,而且能给使用者带来乐趣。 

不幸的是,在VC中使用Agent却是一件让人伤脑筋的事,因为在使用了Insert Ac
tiveX Control后,VC会产生多个C++类,其中繁多的接口定义会让人有写摸不着
头脑。出与这个原因我使用VB开发了一个易于被VC使用的OCX控件,通过该控件V
C开发人员可以方便的使用MS Agent所提供的功能。下面列出该OCX支持的方法:
 名称 参数 说明 
Load LPCSTR 指明Agent文件的路径 装入MS Agent 
Unload n/a 清除已经装载的Agent 
Show BOOL true:显示 false:隐藏 是否显示Agent 
Speak LPCSTR 所说的话 朗读 
Play LPCSTR 动作名称 执行动作 
MoveTo int ,int x,y坐标 移动到某位置 
GestureAt int ,int x,y坐标 朝某方向做手势 
StopAll n/a 停止当前动作 


使用方法:在编辑对话框时按下右键,选择插入ActiveX Control,选择插入vch
elpMsAgentWrap。然后对该控件生成一个具体的变量(m_agent),这时VC会生成相
应的文件,该文件定义了新的类。类中的成员函数已经在上面列出了。下面的代
码就是调用这些功能命令Agent执行相应的动作。 

装入Agent
CString szP("C:\\WINDOWS\\MSAGENT\\CHARS\\merlin.acs");
m_agent.LoadChar(szP);

执行动作
m_agent.Speak("hello , this is a demo !");
m_agent.MoveTo(m_x,m_y);
错误处理
TRY
{
m_agent.Play("DoMagic4");//执行一个不存在的动作
}
CATCH(CException, e)
{
char szBuf[100];
e->GetErrorMessage(szBuf,100);
strcat(szBuf,"\n - caught error");
AfxMessageBox(szBuf);
e->Delete();
}
END_CATCH


下载VC Demo代码和OCX控件 163 169



 

用VB5.0 调 用Microsoft Agent 控 件 与 电 脑 交 谈 
---- Microsoft Agent 控 件 比Office 97 中 的 助 手 更 进 了 一 步, 它
 提 供 的 动 画 人 物 不 仅 有 生 动、 有 趣 的 动 作, 而 且 还 能 通
 过 声 卡、 麦 克 风 与 用 户 进 行 交 谈, 这 些 功 能 使 计 算 机 更
 具 人 性 魅 力, 其 应 用 前 途 相 当 广 泛。Microsoft Agent 控 件 的
 内 部 机 制 很 复 杂, 但 用VB 来 操 纵 它 却 是 异 乎 寻 常 的 方 便
, 本 文 将 介 绍VB 5.0 调 用Microsoft Agent 控 件 的 基 本 方 法。 

1. 安 装Microsoft Agent 控 件
---- (1) 首 先 要 安 装Microsoft Agent 的 核 心 组 件 msagent.exe 

---- (2) 接 着 要 安 装Lernout & Hauspie TruVoice Text-to-Speech Engin
e( 完 成 从 文 字 合 成 语 音 的 工 作) cgram.exe。 

---- (3) 最 后 要 安 装 Microsoft Command and Control Speech Engine( 提
 供 语 音 识 别 功 能) Actcnc.exe。 

---- (4) 另 外 还 需 要Agnet 动 画 人 物 数 据 文 件, 在 本 文 中 使 
用 了Genie.acs、Robby.acs 两 个 文 件。 

---- 上 述 文 件 均 可 从 http://www.microsoft.com/workshop/prog/agent
 下 载。 

2. Microsoft Agent 控 件 的 初 始 化
---- 先 把Microsoft Agent 控 件 添 加 到VB 的 控 制 工 具 条 上, 并 在
 用 户 的Form 上 绘 制 该 控 件( 在 下 述 例 子 中, 其Name 属 性 设 为
MyAgent)。 下 面 的 代 码 调 用IAgentCtlCharacters::Load() 方 法 装 入
 一 个 动 画 人 物 的 数 据, 调 用IAgentCtlCharacter::Show()/Hide() 方
 法 来 显 示/ 隐 藏 动 画 人 物。 

Const DATAPATH = "c:\"

Dim Genie As IAgentCtlCharacter
Dim Robby As IAgentCtlCharacter
Dim GenieRequest1, GenieRequest2 As IAgentCtlRequest
Dim RobbyRequest1 As IAgentCtlRequest

Private Sub Form_Load()
    ' 装 入 动 画 人 物 数 据, 其 中 第 一 个 参 数 为CharacterID
    MyAgent.Characters.Load "Genie", DATAPATH & "Genie.acs"
    MyAgent.Characters.Load "Robby", DATAPATH & "Robby.acs"

    ' 获 取 与CharacterID 相 对 应 的IAgentCtlCharacter 变 量
    Set Genie = MyAgent.Characters("Genie")
    Set Robby = MyAgent.Characters("Robby")

    ' 显 示/ 隐 藏 动 画 人 物
    Genie.Show
    Genie.Hide
End Sub
3. Microsoft Agent 控 件 的 动 画 编 程
---- 每 个 动 画 人 物 都 有 自 己 特 定 的 动 作, 例 如Genie 有 听、
 看、 读、 写、 发 怒、 感 谢 等 数 十 种 动 画 形 态。 可 以 调 用IAg
entCtlCharacter::play() 方 法 来 设 置 动 画 动 作。 为 了 在 多 个 动
 画 人 物 之 间 协 调 它 们 的 动 作, 比 如 让Robby 等 待Genie 的 某 
个 动 作 执 行 完 毕 后, 方 才 做 另 外 一 个 动 作, 这 时 可 采 用I
AgentCtlCharacter::Wait() 方 法 来 实 现 同 步。 在 数 十 种 动 画 动 
作 中 有 一 类 比 较 特 殊( 动 作 名 以"ing" 为 后 缀, 如"Searching")
, 一 旦 执 行 便 循 环 播 放 一 段 动 画, 只 有 调 用IAgentCtlCharac
ter::Interrupt() 方 法 才 能 终 止。 示 例 代 码 如 下: 

Private Sub Command1_Click()
    Genie.Show

    ' 执 行 名 为"Suggest" 的 动 作
    Genie.Play "Suggest"
' 把Genie 移 动 到 座 标(200,200) 处,
 用GenieRequest1 来 标 识 该 动 作 请 求
    Set GenieRequest1 = Genie.MoveTo(200, 200)
' 执 行 名 为"Searching" 的 循 环 动 画 动 作,
 用GenieRequest2 来 标 识 该 动 作 请 求

    Set GenieRequest2 = Genie.Play("Searching")

    ' Robby 等 待Genie 的MoveTo 方 法 执 行 完 毕, 方 才 显 示
    Robby.Wait GenieRequest1
    Robby.Show
    Robby.Play "Suggest"
    Robby.Play "read"
    Robby.Play "Congratulate"

    ' 由Robby 来 终 止Genie 的 循 环 动 画 动 作
    Robby.Interrupt GenieRequest2
    Genie.Play "write"
    Genie.Hide
    Robby.Hide
End Sub
4. Microsoft Agent 控 件 的 语 音 合 成 功 能
---- Microsoft Agent 控 件 支 持 英 语 的 语 音 合 成 功 能, 只 需 输
 入 句 子 的 文 字, 便 会 生 成 该 句 子 的 语 音 信 号 并 通 过 声 卡
、 音 箱 播 放 出 来。 语 音 合 成 功 能 通 过 调 用IAgentCtlCharacter
::Speak() 方 法 来 实 现。 输 出 中 文 时 不 能 用 上 述 方 法, 只 能 用WAV 文
 件 代 替, 给Speak() 方 法 的 第 一 个 参 数 传 递 文 字 气 球 中 包 
含 的 文 字, 给 第 二 个 参 数 传 递 一 个WAV 文 件 路 径。 同 样 为 
同 步 多 个 动 画 人 物 的 语 音 输 出 也 必 须 使 用IAgentCtlCharacte
r::Wait() 方 法。 目 前Microsoft Agent 控 件 还 不 支 持 多 个 人 物 的
 声 音 混 合 效 果。 具 体 实 现 代 码 如 下: 

Private Sub Command2_Click()
    Genie.MoveTo 100, 200
    Genie.Show
    Genie.Play "Greet"

' Speak() 方 法 的 第 一 个 参 数 即 为 需 进 行
 语 音 合 成 的 句 子 文 字
    Genie.Speak "I am Genie, your most humble and loyal servant."
    Genie.Speak "Where is Robby?"
    Set GenieRequest1 = Genie.Play("LookLeft")
    ' 等Genie 的"LookLeft" 执 行 以 后, 再 执 行Robby 的 动 作
    Robby.Wait GenieRequest1
    Robby.MoveTo 250, 200
    Robby.Show
    Robby.Play "Greet"
    Robby.Speak "Sorry for the delay."
Set RobbyRequest1 = 
Robby.Speak("Traffic is really busy today on the  Information Superhig
hway.")

    ' 等Robby 讲 完 了,Genie 再 讲
    Genie.Wait RobbyRequest1
    Genie.Play "LookLeftReturn"
Genie.Speak "Welcome to the release of  Microsoft Agent,
 the new ActiveX   technology that supports interactive characters"
' 输 出 中 文 语 音,
" 欢 迎 光 临" 的 中 文 语 音 包 含 在welcome.wav 中
    Genie.Speak " 欢 迎 光 临", "c:\welcome.wav"
    Genie.Hide
    Robby.Hide
End Sub
5. Microsoft Agent 控 件 的 语 音 识 别 功 能
---- Microsoft Agent 控 件 具 有 语 音 识 别 能 力, 用 户 可 以 向 动
 画 人 物 发 出 语 音 命 令( 同 时 按 住Scroll Lock 键)。Microsoft Age
nt 控 件 为 每 个Agent 动 画 人 物 提 供 一 个 特 殊 物 命 令 窗 口, 
用 以 显 示 该 动 画 人 物 能 够 接 受 的 所 有 语 音 命 令。 该 命 令
 窗 口 中 的 命 令 不 能 用 鼠 标 或 键 盘 来 选 取, 只 能 通 过 语 音
。 可 以 用IAgentComands::Add() 方 法 来 为 命 令 窗 口 添 加 自 定 义
 命 令。 第 一 个 参 数 是 命 令 的 标 识 符ID, 第 二 个 参 数 是 该 
命 令 在 命 令 窗 口 中 的 显 示 标 签, 第 三 个 参 数 是 该 命 令 对
 应 的 语 音 识 别 句 子。 当 用 户 通 过 麦 克 风 向 动 画 人 物 发 出
 命 令 时 会 激 发IAgent 的Command 事 件, 可 以 编 写 一 个 接 收Comm
and 事 件 的 过 程 来 完 成 与 语 音 命 令 相 对 应 的 任 务。 

Private Sub Command3_Click()
    Static initialized As Boolean

    ' 添 加 自 定 义 命 令
    If Not initialized Then
        Genie.Commands.Add "Word", "Run Word", "word", True, True
        Genie.Commands.Add "Time", "What time is it?", "What time is i
t?", True, True
        Genie.Commands.Add "Bigger", "Bigger", "Bigger", True, True
        Genie.Commands.Add "Smaller", "Smaller", "Smaller", True, True

        initialized = True
    End If
    Genie.Show
    Genie.Speak "Can I help you?"
End Sub

Private Sub MyAgent_Command(ByVal UserInput As Object)
    Select Case UserInput.Name
        Case "Time"
            ' 当 听 到"What time is it?" 后 回 答 当 前 时 间
            Genie.Speak "The time is " & Time
        Case "Word"
            ' 当 听 到"word" 后, 便 运 行MS Word
            Genie.Speak "Yes,sir!"
            Shell "d:\winword\winword.exe", vbNormalFocus
        Case "Bigger"
            ' 当 听 到"bigger" 后,Genie 会 放 大
            Genie.Width = Genie.Width * 1.5
            Genie.Height = Genie.Height * 1.5
        Case "Smaller"
            ' 当 听 到"samller" 后,Genie 会 缩 小
            Genie.Width = Genie.Width / 1.5
            Genie.Height = Genie.Height / 1.5
    End Select
End Sub

/*////////////////////////////////////////////////////////////////////
*/
/* 附 完 整 源 程 序 agent.frm                */
VERSION 5.00
Object = "{F5BE8BC2-7DE6-11D0-91FE-00C04FD701A5}
#1.5#0"; "AGENTCTL.DLL"
Begin VB.Form Form1
   Caption         =   "Form1"
   ClientHeight    =   3195
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   4680
   LinkTopic       =   "Form1"
   ScaleHeight     =   3195
   ScaleWidth      =   4680
   StartUpPosition =   3  'Windows Default
   Begin VB.CommandButton Command3
      Caption         =   "Command3"
      Height          =   615
      Left            =   2880
      TabIndex        =   2
      Top             =   360
      Width           =   1095
   End
   Begin VB.CommandButton Command2
      Caption         =   "Command2"
      Height          =   615
      Left            =   1320
      TabIndex        =   1
      Top             =   360
      Width           =   1095
   End
   Begin VB.CommandButton Command1
      Caption         =   "Command1"
      Height          =   615
      Left            =   120
      TabIndex        =   0
      Top             =   360
      Width           =   855
   End
   Begin AgentObjectsCtl.Agent MyAgent
      Left            =   360
      Top             =   2520
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False

Option Explicit

Const DATAPATH = "c:\"

Dim Genie As IAgentCtlCharacter
Dim Robby As IAgentCtlCharacter
Dim GenieRequest1, GenieRequest2 As IAgentCtlRequest
Dim RobbyRequest1 As IAgentCtlRequest

Private Sub Command1_Click()
    Genie.Show
    Genie.Play "Suggest"
    Set GenieRequest1 = Genie.MoveTo(200, 200)
    Set GenieRequest2 = Genie.Play("Searching")
    Robby.Wait GenieRequest1
    Robby.Show
    Robby.Play "Suggest"
    Robby.Play "read"
    Robby.Play "Congratulate"
    Robby.Interrupt GenieRequest2
    Genie.Play "write"
    Genie.Hide
    Robby.Hide
End Sub

Private Sub Command2_Click()
    Genie.MoveTo 100, 200
    Genie.Show
    Genie.Play "Greet"
    Genie.Speak "I am Genie, your most humble and loyal servant."
    Genie.Speak "Where is Robby?"
    Set GenieRequest1 = Genie.Play("LookLeft")
    Robby.Wait GenieRequest1
    Robby.MoveTo 250, 200
    Robby.Show
    Robby.Play "Greet"
    Robby.Speak "Sorry for the delay."
Set RobbyRequest1 = Robby.Speak
("Traffic is really busy today on the Information Superhighway.")
    Genie.Wait RobbyRequest1
    Genie.Play "LookLeftReturn"
    Genie.Speak "Welcome to the release of Microsoft Agent, the new
ActiveX technology that supports interactive characters"
    Genie.Speak " 欢 迎 光 临", "c:\welcome.wav"
    Genie.Hide
    Robby.Hide
End Sub

Private Sub Command3_Click()
    Static initialized As Boolean

    If Not initialized Then
        Genie.Commands.Add "Word", "Run Word", "word", True, True
        Genie.Commands.Add "Time", "What time is it?", "What time is i
t?", True, True
        Genie.Commands.Add "Bigger", "Bigger", "Bigger", True, True
        Genie.Commands.Add "Smaller", "Smaller", "Smaller", True, True

        initialized = True
    End If

    Genie.Show
    Genie.Speak "Can I help you?"
End Sub

Private Sub Form_Load()
    MyAgent.Characters.Load "Genie", DATAPATH & "Genie.acs"
    MyAgent.Characters.Load "Robby", DATAPATH & "Robby.acs"
    Set Genie = MyAgent.Characters("Genie")
    Set Robby = MyAgent.Characters("Robby")
    Genie.Show
    Genie.Hide
End Sub


Private Sub MyAgent_Command(ByVal UserInput As Object)
    Select Case UserInput.Name
        Case "Time"
            Genie.Speak "The time is " & Time
        Case "Word"
            Genie.Speak "Yes,sir!"
            Shell "d:\winword\winword.exe", vbNormalFocus
        Case "Bigger"
            Genie.Width = Genie.Width * 1.5
            Genie.Height = Genie.Height * 1.5
        Case "Smaller"
            Genie.Width = Genie.Width / 1.5
            Genie.Height = Genie.Height / 1.5
    End Select
End Sub
 
魔法师默林  Merlin.acs 的动作控制命令简介(有一部份可以使用到其它人物中
) 

Acknowiedge     答谢               Alert               握双拳警惕
Explain         解说               GetAttention        敲击屏幕注意 
LookLeftBlink   向左眨眼           LookRight           向右看
Searching       搜索               StarListening       注意听  
 
Announce        吹喇吧进行宣布     Blink               眨眼
GlanceDown      向下扫视           GlanceLeft          向左扫视
LookRightBlink  向右眨眼           LookUp              向上看
StopListening   停止听             Suggest             暗示

Confused        烦恼的             Congratulate        祝贺
GlanceRight     向右扫视           GlanceUp            向上扫视
LookUpBlink     向上眨眼           Pleased             高兴
Surprised       惊讶               Think               摸胡子

Decline         拒绝               DoMagic1            魔法一
Greet           问候               LookDown            向下看
Processing      处理               Read                写一次
Uncertain       不确定             Wave                致意

DoMagic2        魔法二             DontRecognize       笠耳听
LookDownBlink   向下眨眼           LookLeft            向左看
Reading         反复写             Sad                 忧愁
Write           写一次             Writing             反复写

AgentDiplay(id,filename,x,y,sound) 
    该函数表示在指定的位置显示由参数id指定的动画人物,其中参数Sound决定
了显示时是否具有声音效果(Sound=1则有,否则无)。 
例子:AgentDiplay("merlin",fileocation^"merlin.acs",0,0,1) 
AgentGesture(id,x,y) 
    该函数表示在指定的位置播放由参数id指定的动画人物姿态。 
例子:AgentGesture("merlin",300,300) 
AgentHide(id) 
    该函数表示隐藏由参数id指定的动画人物。 
例子:AgentHide("merlin") 
AgentMove(id,x,y) 
    该函数表示移动由参数id指定的动画人物到指定的位置。 
例子:AgentMove("merlin",200,200) 
AgentPlay(id,animation) 
    该函数表示播放由参数id、animation指定的动画形态,merlic有听、看、读
、写、发怒、感谢等数十种动画形态如上表动作命令所示。 
例子:AgentPlay("merlin","Congratulate") 
AgentRemove(id) 
    该函数表示屏幕上清除由参数id指定的动画人物。 
例子:AgentRemove("merlin") 
AgentShowPropertySheet() 
    该函数显示Microsoft Agent的属性 
例子:AgentShowPropertySheet() 
AgentSoundEffects(id,boolean) 
    该函数设置参数id指定的动画人物有无声音音效果。其功能与AgentDisplay
(id,filename,x,y,sound)中的sound一样。 
例子:AgentSoundEffects("merlin",false) 
AgentSpeak(id,text,wavefile) 
    该函数表示由id指定的动画人物,可支持英语的语音合成功能,通过参数te
xt输入句子的文字,便会生成该句子的语音信号并通过声卡、音箱播放出来。输
出中文时不能用上述方法,只能用WAV文件代替,给该函数的text参数传递文字气
球中包含的文字,给wavefile参数传递一个WAV文件路径。但是注意的是wavefil
e参数只能在16位以上的声卡上正常工作。使用自动生成语音功能要求安装文本—
—声音合成 Cgram.exe。 
例子:AgentSpeak("merlin","你好!","d:\\download\\hello.wav") 
AgentStopAll(id) 
    该函数表示停止由id指定的动画人物的所有动作。 
例子:AgentStopAll("merlin") 


--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 210.75.34.187]

[关闭][返回]