发信人: sealink() 
整理人: fishy(2000-05-07 13:35:57), 站内信件
 | 
 
 
一点收集的资料,不知是否有用?
 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]
  | 
 
 
 |