发信人: 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]
|
|