📄 m74.htm
字号:
<html>
<head>
<title>VB教程</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<p align="center"><script src="../../1.js"></script></a>
<body bgcolor="#ffffff" leftmargin="5" topmargin="1" marginheight="5" marginwidth="5">
<div align=center>
<table border=0 cellpadding=0 cellspacing=0 width=680 align="center">
<tbody>
<tr>
<td bgcolor=#000000 height=9>
<div align=center class=H1> <font color="#FFFFFF">用VB5.0调用Microsoft Agent控件与电脑交谈</font> </font> </font></div>
</td>
</tr>
<tr valign=top>
<td class=H1 height=76>
<p align="left"> <br>
</font> Microsoft
Agent 控 件 比Office 97 中 的 助 手 更 进 了 一 步, 它 提 供 的 动 画 人 物 不 仅 有 生 动、 有
趣 的 动 作, 而 且 还 能 通 过 声 卡、 麦 克 风 与 用 户 进 行 交 谈, 这 些 功 能 使 计 算 机 更 具 人
性 魅 力, 其 应 用 前 途 相 当 广 泛。Microsoft Agent 控 件 的 内 部 机 制 很 复 杂, 但 用VB
来 操 纵 它 却 是 异 乎 寻 常 的 方 便, 本 文 将 介 绍VB 5.0 调 用Microsoft Agent 控 件 的
基 本 方 法。 </span></font></p>
<h3> <font color="#000000">1. 安 装Microsoft Agent
控 件</font></span></h3>
(1) 首 先 要 安 装Microsoft
Agent 的 核 心 组 件 msagent.exe </font> </span>
<p> (2) 接 着 要 安 装Lernout
& Hauspie TruVoice Text-to-Speech Engine( 完 成 从 文 字 合 成 语 音 的 工
作) cgram.exe。 </font></span>
<p> (3) 最 后 要 安 装 Microsoft
Command and Control Speech Engine( 提 供 语 音 识 别 功 能) Actcnc.exe。 </font></span>
<p> (4) 另 外 还 需 要Agnet
动 画 人 物 数 据 文 件, 在 本 文 中 使 用 了Genie.acs、Robby.acs 两 个 文 件。 </font></span>
<p> 上 述 文 件 均 可 从 http://www.microsoft.com/workshop/prog/agent
下 载。 </font></span>
<h3> <font color="#000000">2. Microsoft Agent 控
件 的 初 始 化</font></span></h3>
先 把Microsoft Agent 控 件
添 加 到VB 的 控 制 工 具 条 上, 并 在 用 户 的Form 上 绘 制 该 控 件( 在 下 述 例 子 中, 其Name 属
性 设 为MyAgent)。 下 面 的 代 码 调 用IAgentCtlCharacters::Load() 方 法 装 入 一 个 动
画 人 物 的 数 据, 调 用IAgentCtlCharacter::Show()/Hide() 方 法 来 显 示/ 隐 藏 动 画 人
物。 </font> </span>
<pre> <font color="#000000">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
</font></span></pre>
<h3> <font color="#000000">3. Microsoft Agent 控
件 的 动 画 编 程</font></span></h3>
每 个 动 画 人 物 都 有 自 己 特
定 的 动 作, 例 如Genie 有 听、 看、 读、 写、 发 怒、 感 谢 等 数 十 种 动 画 形 态。 可 以 调 用IAgentCtlCharacter::play()
方 法 来 设 置 动 画 动 作。 为 了 在 多 个 动 画 人 物 之 间 协 调 它 们 的 动 作, 比 如 让Robby 等 待Genie
的 某 个 动 作 执 行 完 毕 后, 方 才 做 另 外 一 个 动 作, 这 时 可 采 用IAgentCtlCharacter::Wait()
方 法 来 实 现 同 步。 在 数 十 种 动 画 动 作 中 有 一 类 比 较 特 殊( 动 作 名 以"ing" 为 后 缀, 如"Searching"),
一 旦 执 行 便 循 环 播 放 一 段 动 画, 只 有 调 用IAgentCtlCharacter::Interrupt() 方 法
才 能 终 止。 示 例 代 码 如 下: </font> </span>
<pre>
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
</font></span></pre>
<h3> <font color="#000000">4. Microsoft Agent 控
件 的 语 音 合 成 功 能</font></span></h3>
Microsoft Agent 控 件 支
持 英 语 的 语 音 合 成 功 能, 只 需 输 入 句 子 的 文 字, 便 会 生 成 该 句 子 的 语 音 信 号 并 通 过
声 卡、 音 箱 播 放 出 来。 语 音 合 成 功 能 通 过 调 用IAgentCtlCharacter::Speak() 方 法 来
实 现。 输 出 中 文 时 不 能 用 上 述 方 法, 只 能 用WAV 文 件 代 替, 给Speak() 方 法 的 第 一 个 参
数 传 递 文 字 气 球 中 包 含 的 文 字, 给 第 二 个 参 数 传 递 一 个WAV 文 件 路 径。 同 样 为 同 步 多
个 动 画 人 物 的 语 音 输 出 也 必 须 使 用IAgentCtlCharacter::Wait() 方 法。 目 前Microsoft
Agent 控 件 还 不 支 持 多 个 人 物 的 声 音 混 合 效 果。 具 体 实 现 代 码 如 下: </font> </span>
<br>
Private Sub Command2_Click()<br>
<br>
Genie.MoveTo 100, 200<br>
<br>
Genie.Show<br>
<br>
Genie.Play "Greet"<br>
<br>
<br>
<br>
' Speak() 方 法 的 第 一 个 参 数 即 为 需 进 行<br>
<br>
语 音 合 成 的 句 子 文 字<br>
<br>
Genie.Speak "I am Genie, your most humble and loyal servant."<br>
<br>
Genie.Speak "Where is Robby?"<br>
<br>
Set GenieRequest1 = Genie.Play("LookLeft")<br>
<br>
' 等Genie 的"LookLeft" 执 行 以 后, 再 执 行Robby 的 动 作<br>
<br>
Robby.Wait GenieRequest1<br>
<br>
Robby.MoveTo 250, 200<br>
<br>
Robby.Show<br>
<br>
Robby.Play "Greet"<br>
<br>
Robby.Speak "Sorry for the delay."<br>
<br>
Set RobbyRequest1 = <br>
<br>
Robby.Speak("Traffic is really busy today on the Information Superhighway.")<br>
<br>
<br>
<br>
' 等Robby 讲 完 了,Genie 再 讲<br>
<br>
Genie.Wait RobbyRequest1<br>
<br>
Genie.Play "LookLeftReturn"<br>
<br>
Genie.Speak "Welcome to the release of Microsoft Agent,<br>
<br>
the new ActiveX technology that supports interactive characters"<br>
<br>
' 输 出 中 文 语 音,<br>
<br>
" 欢 迎 光 临" 的 中 文 语 音 包 含 在welcome.wav 中<br>
<br>
Genie.Speak " 欢 迎 光 临", "c:\welcome.wav"<br>
<br>
Genie.Hide<br>
<br>
Robby.Hide<br>
<br>
End Sub<br>
<br>
</font></span> <font color="#000000">5. Microsoft
Agent 控 件 的 语 音 识 别 功 能</font></span>
Microsoft Agent 控 件 具 有 语 音 识 别 能 力, 用 户 可 以 向 动 画 人 物 发 出 语 音 命 令( 同
时 按 住Scroll Lock 键)。Microsoft Agent 控 件 为 每 个Agent 动 画 人 物 提 供 一 个 特 殊
物 命 令 窗 口, 用 以 显 示 该 动 画 人 物 能 够 接 受 的 所 有 语 音 命 令。 该 命 令 窗 口 中 的 命 令
不 能 用 鼠 标 或 键 盘 来 选 取, 只 能 通 过 语 音。 可 以 用IAgentComands::Add() 方 法 来 为
命 令 窗 口 添 加 自 定 义 命 令。 第 一 个 参 数 是 命 令 的 标 识 符ID, 第 二 个 参 数 是 该 命 令 在
命 令 窗 口 中 的 显 示 标 签, 第 三 个 参 数 是 该 命 令 对 应 的 语 音 识 别 句 子。 当 用 户 通 过 麦
克 风 向 动 画 人 物 发 出 命 令 时 会 激 发IAgent 的Command 事 件, 可 以 编 写 一 个 接 收Command
事 件 的 过 程 来 完 成 与 语 音 命 令 相 对 应 的 任 务。 </font> </span> <br>
Private Sub Command3_Click()<br>
<br>
Static initialized As Boolean<br>
<br>
<br>
<br>
' 添 加 自 定 义 命 令<br>
<br>
If Not initialized Then<br>
<br>
Genie.Commands.Add "Word", "Run Word", "word", True, True<br>
<br>
Genie.Commands.Add "Time", "What time is it?", "What time is it?", True,
True<br>
<br>
Genie.Commands.Add "Bigger", "Bigger", "Bigger", True, True<br>
<br>
Genie.Commands.Add "Smaller", "Smaller", "Smaller", True, True<br>
<br>
initialized = True<br>
<br>
End If<br>
<br>
Genie.Show<br>
<br>
Genie.Speak "Can I help you?"<br>
<br>
End Sub<br>
<br>
<br>
<br>
Private Sub MyAgent_Command(ByVal UserInput As Object)<br>
<br>
Select Case UserInput.Name<br>
<br>
Case "Time"<br>
<br>
' 当 听 到"What time is it?" 后 回 答 当 前 时 间<br>
<br>
Genie.Speak "The time is " & Time<br>
<br>
Case "Word"<br>
<br>
' 当 听 到"word" 后, 便 运 行MS Word<br>
<br>
Genie.Speak "Yes,sir!"<br>
<br>
Shell "d:\winword\winword.exe", vbNormalFocus<br>
<br>
Case "Bigger"<br>
<br>
' 当 听 到"bigger" 后,Genie 会 放 大<br>
<br>
Genie.Width = Genie.Width * 1.5<br>
<br>
Genie.Height = Genie.Height * 1.5<br>
<br>
Case "Smaller"<br>
<br>
' 当 听 到"samller" 后,Genie 会 缩 小<br>
<br>
Genie.Width = Genie.Width / 1.5<br>
<br>
Genie.Height = Genie.Height / 1.5<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -