65.9K
CodeProject 正在变化。 阅读更多。
Home

创建酷炫的 Agent 用户界面

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (12投票s)

2001年5月23日

4分钟阅读

viewsIcon

258063

downloadIcon

3202

本文介绍了如何使用 Microsoft Agent 创建显示角色的用户界面,类似于 Office 2000 中的 Office 助手。

目录

概述

Microsoft Office 2000 使用动画角色,称为 Office 助手,来帮助用户并提供协助。通过 Microsoft Agent,您可以将此类角色添加到您自己的应用程序中。您甚至可以使用 Office 助手本身,例如 The Genius 或 F1。专为 Agent 设计的角色可以执行多种任务,除了显示各种动画外,还可以进行语音合成和识别。

要求

要能够使用此技术,您必须拥有

  1. Microsoft Agent 核心组件。
  2. Microsoft Agent 角色 – Genie、Merlin、Robby 和 Peedy。
  3. 至少针对美国英语的 Lernout and Hauspie 文本转语音引擎。
  4. Microsoft Speech API 4.0a 运行时。
  5. Microsoft 语音识别引擎。

所有这些组件都可以在 http://microsoft.com/msagent/downloads.htm 找到。此外,要使用 Microsoft Office 角色,您必须拥有 Office 2000。Office 97 角色与 Agent 不兼容。

将 Microsoft Agent 与 .NET Framework 结合使用

Microsoft Agent 作为 ActiveX 控件 DLL 提供。要在 .NET 中使用它,您可以使用 .NET Framework SDK 附带的 AxImp.exe 工具。创建一个您想保留导入库的文件夹,然后使用命令

aximp %systemroot%\msagent\agentctl.dll

下载中包含的 makefile 会为您完成此操作。此命令应创建两个文件:AxAgentObjects.dll 和 AgentObjects.dll。现在您可以准备在 .NET 中使用 Agent 了。

编程代理

Agent 编程很容易,因为它完全依赖于 COM,我们不必处理 PInvoke 或其他类似的东西。使用 Agent 的第一步是将 AxAgentObjects.dll 中的 Agent ActiveX 控件添加到您的项目中。将其放在窗体上的任何位置;运行时它是不可见的。接下来,您应该在类中添加一个类型为 AgentObjects.IAgentCtlCharacterEx(来自 AgentObjects.dll)的成员变量。您应该将 AgentObjects 命名空间导入到您的应用程序中;这会简化许多任务。本质上,您至少必须

  1. 加载您想要的字符,并提供一个描述性名称来引用它。在 Hello World 示例中,这通过以下行实现:AxAgent.Characters.Load("Genie", (object)"GENIE.ACS");
  2. 将您的字符变量设置为您刚刚加载的字符。在 Hello World 示例中,这通过以下行实现:Character = AxAgent.Characters["Genie"];
  3. 设置要使用的正确语言Character.LanguageID = 0x409;将语言设置为美国英语。
  4. 显示角色Character.Show(null);

这些步骤将简单地加载并显示角色。

Hello World 示例

必需的 Hello World 示例需要 Genie 角色。该示例只是加载角色并显示他。您还可以让他说些什么。要让角色说话,请调用角色的 speak 方法,如下所示:

      if(TextToSpeak.Text.Length == 0)  // Don't speak a zero-length
        return;                         // string.
      
      //Make the character speak.
      Character.Speak(TextToSpeak.Text, null);

如您所见,使用 Agent 非常简单。

使用语音识别

与 Office 助手不同,您可以让 Agent 角色说话,还可以响应语音命令。您添加的任何命令也将可以在角色的上下文菜单中找到。默认情况下,只有当您按住滚动锁定键时,语音识别才会被启用。您只需要向角色对象的 Commands 集合添加新命令。然后,您必须为 Agent 控件的 Command 事件添加一个事件处理程序。一个装箱的 IAgentCtlUserInput 对象作为参数提供给事件处理程序。您可以通过 IAgentCtlUserInput 对象的 Name 属性访问识别出的命令。

交互式 Hello World 示例

交互式 Hello World 示例演示了基本的语音识别以及播放动画。首先,加载并初始化控件和角色(Robby),然后添加两个命令:

    protected void LoadButton_Click(object sender, System.EventArgs e)
    {
      // Load the Robby character.
      AxAgent.Characters.Load("Robby", (object)"ROBBY.ACS");
      Character = AxAgent.Characters["Robby"];
      StatusLabel.Text = Character.Name + " loaded.";
      // Set the language to US English.
      Character.LanguageID = 0x409;
      
      // Display the character.
      Character.Show(null);
      
      LoadButton.Enabled = false;
      
      // Display name for the commands.
      Character.Commands.Caption = "Hello World";
      
      Character.Commands.Add("Hello",  // Command name
        (object)"Say Hello",  // Display name
        (object)"([say](hello | hi) | good (day | morning | evening))", // SR String
        (object)true,  // Enabled
        (object)true);  // Visible
      
      Character.Commands.Add("Goodbye",  // Command name
        (object)"Goodbye",  // Display name
        (object)"(bye | goodbye | exit | close | quit)", // SR String
        (object)true,  // Enabled
        (object)true);  // Visible
      
      PromptLabel.Visible = true;
    }

语音识别字符串提供了用户可以说的几个选项;例如,说“goodbye”、“bye”和“close”具有相同的效果。在所有情况下,命令名称都会传递给事件处理程序,因此您不必考虑识别出的字符串的各种变化。在事件处理程序中,会进行一个命令测试:

    protected void AxAgent_Command(object sender, AxAgentObjects._AgentEvents_CommandEvent e)
    {
      IAgentCtlUserInput ui;
      ui = (IAgentCtlUserInput)e.userInput;
      if(ui.Name == "Hello")
      {
        Character.Speak((object)"Hello. My name is Robby." +
          " Pleased to meet you.", null);
        
        PromptLabel.Text = "Say goodbye to dismiss Robby.";
      }
      if(ui.Name == "Goodbye")
      {
        Character.Speak((object)"It was nice talking to" +
          " you. Goodbye.", null);
        
        Character.Play("Wave");
        Character.Play("Hide");
      }
    }

使用 character 对象的方法 play 来播放动画。

AgentDemo 应用程序

如果您查看 Microsoft Agent 网站,您会看到一个枚举角色中所有动画的 Visual Basic 示例。AgentDemo 应用程序也做同样的事情,只是用 C# 语言。您可以加载所有 Agent 和 Microsoft Office 角色并查看动画列表。这是截图(加载了 Office 2000 F1 角色):

这个应用程序现在有点冗余,因为 Microsoft 随 Beta 2 提供了类似的示例。我只是将我为 Beta 1 所做的转换成了 Beta 2 代码。

关于您的应用程序的说明

许多人认为 Office 助手很烦人。您必须注意不要让您的角色令人烦恼,而是要乐于助人,并始终提供一个易于访问的选项来关闭它们。

历史

2002年3月15日 - 更新了源文件。

© . All rights reserved.