Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:

Error. Page cannot be displayed. Please contact your service provider for more details. (18)


Использование Microsoft Agent

Поиск:
Введение
Иногда хочется сделать свои приложения более красивыми, интерактивными, т.е. добавить в них дополнительные и необычные возможности. Неужели компания Microsoft не сделала, для разработчиков никаких подобных средств? Сделала и очень даже неплохое, называется эта технология Microsoft Agent. Microsoft Agent - сервис, который позволяет использовать интерактивных анимированных персонажей для улучшения интерфейса ваших приложений. Разработчики могут использовать эти персонажи как интерактивных помощников в своих программах, примером такого персонажа является всем известная скрепка в пакете Microsoft Office. Агенты могут также внедряться в ваши Веб-страницы.
И естественно было бы совсем неправильно, если бы такое хорошее средство обошло стороной программистов использующих Delphi. Но благодаря тому, что в Delphi имеется прекрасные возможности работы с COM технологиями, использование агентов в Delphi превращается в приятное развлечение.
Microsoft Agent позволяет разработчикам и Web-дизайнерам использовать новую форму взаимодействия с пользователями, основанную на принципах социального общения. В дополнение к поддержке обычного способа ввода информации с помощью клавиатуры и мыши Microsoft Agent предлагает поддержку распознавания голосовой информации (на основе Microsoft Speech Application Programming Interface, SAPI 4.0), позволяя управлять приложениями на уровне голосовых команд. Персонажи могут воспроизводить синтезированную речь (text-to-speech, TTS), аудиофрагменты или текст в специальном окне.
Программный интерфейс Microsoft Agent позволяет управлять воспроизведением персонажей, вводом и выводом информации. Персонажи отображаются в собственных окнах, что делает интерфейс более удобным и гибким. В состав Microsoft Agent входит компонент ActiveX, доступный из любых языков программирования и средств разработки, поддерживающих технологию COM, а также из скриптовых языков VBScript и JavaScript.
Для начала работы с агентами, вам естественно нужно установить MS Agent (Microsoft Agent входит в состав операционной системы WINDOWS 2000 и выше). Для установки Microsoft Agent в Microsoft Windows 98 и Windows NT 4.0 требуется загрузить соответствующее программное обеспечение с Web-узла фирмы Microsoft : MSagent, также для работы понадобится какой-нибудь характер (Microsoft свободно распостаняет 4). Один из характеров вы можете найти в папке msagent/chars в каталоге Windows. Все характеры имеют расширение .acs, так что вы можете пробежаться поиском, наверняка найдете еще парочку (особенно, если у вас установлен пакет MS Office). Так же в Интернете существуют целые галереи агентов:
msagentring.org
rohitab.com


Объектная модельMicrosoft Agent 2.0
Для программного управления Microsoft Agent в распоряжение программистов предоставляется объектная модель, которая доступна как из скриптовых языков (для управления Microsoft Agent из HTML-документов), так и из языков программирования, поддерживающих COM-технологии.
В центре объектной модели располагается невидимый пользователям объект Agent, а также объект Request. Персонажи представлены коллекцией Character, доступные команды — коллекцией Command, а специальное окно для вывода информации — объектом Balloon. Также объект Agent включает объекты SpeechInput, CommandsWindow, AudioOutput и PropertySheet. Давайте кратко рассмотрим свойства, методы и события основных объектов объектной модели Microsoft Agent.

Объект Request
Объект Request используется для получения информации о состоянии выполнения методов Get, Hide, Interrupt, Load, MoveTo, Play, Show, Speak и Wait. Чтобы узнать статус метода, необходимо получить доступ к специальной переменной:
var Rq;
Rq = Char.Get “Animation”, “Sad”

Объект Request имеет три метода:
Status Возвращает целочисленный статус команды, находящейся в очереди
number Возвращает код ошибки
description Возвращает строку с описанием ошибки

Объект Agent
Данный объект является родительским объектом для всех остальных объектов Microsoft Agent. Объект Agent представляет собой сервер и поддерживает свойства и события
Объект Agent также имеет один метод — showDefaultCharacterProperties, с помощью которого можно отобразить на экране панель настройки свойств Microsoft Agent по умолчанию.

Объект Characters
Данный объект наиболее важен при управлении отдельным персонажем и содержит все необходимые для этого методы и события. Так как Microsoft Agent позволяет одновременно использовать несколько персонажей, данный объект представляет собой коллекцию, к которой можно обращаться либо напрямую, либо через объект Character.
Для того чтобы иметь доступ к объекту Characters, мы должны указать идентификатор персонажа. Так как мы часто используем методы и свойства именно этого объекта, имеет смысл сохранить идентификатор персонажа в переменной:
Код
Char = agent.characters.character('Genie')


Объект Commands
С помощью этого объекта мы можем задавать собственные команды, которые появляются в локальном меню персонажа, вызываемом по нажатию правой кнопки мыши. Данный объект, как и объект Characters, представляет собой коллекцию, поэтому обращение к нему осуществляется следующим образом:
Код
myCmd:=   Agent.Characters.Character('Genie').Commands.Command('myCmd');


Объект Balloon
Данный объект служит для задания характеристик специального окна, в котором происходит вывод текстовой информации.

Подключение компонента ActiveX
Работу с любым компонентом ActiveX мы начинаем с включения его в палитру компонентов. Для этого выполняем команду Component | Import ActiveX Control. В списке доступных компонентов выбираем Microsoft Agent Control 2.0 (компонент реализован в библиотеке AGENTCTL.DLL) и нажимаем кнопку Install.
После того как компонент будет установлен, он станет доступным в палитре компонентов на вкладке ActiveX как компонент Agent.
Размещение компонента в форме приводит к тому, что у нас появляется объект Agent1 типа TAgent.
Код
type
   TForm1 = class(TForm)
     Agent1: TAgent;
   private
     { Private declarations }
   public
     { Public declarations }
   end;


Теперь можно приступать к программированию. Начнем с загрузки персонажей.
Код
var
   Char    : IAgentCtlCharacterEx;

Agent1.Characters.Load('Char', 'peedy.acs');
Char := Agent1.Characters.Character('Char') as  IAgentCtlCharacterEx;


После этого мы можем вызывать методы и выполнять команды, поддерживаемые тем или иным персонажем.
Код
Char.Show;
Char.Think('Полезная мысль...');
Char.Play('Greet');
и так далее...

Получение списка команд
Существует три способа получения списка команд, поддерживаемых тем или иным персонажем. Первый, самый очевидный, — обращение к соответствующей документации, где теоретически должны быть описаны все команды и действия, выполняемые по этим командам. Но это, как ни странно, может оказаться не самым удобным решением. Поэтому я и предлагаю второй способ, который, может быть, чуть сложнее первого, но зато гарантирует, что мы всегда будем иметь список команд, актуальных для данного персонажа. Данный способ базируется на использовании COM-интерфейса IAgentCtlAnimationNames.
Интерфейс IAgentCtlAnimationNames возвращается через значение свойства AnimationNames основного интерфейса COM-объекта Microsoft Agent (IAgentCtlCharacterEx) и имеет всего лишь одно свойство — Enum типа IUnknown. Вероятнее всего, Enum — это указатель на один из интерфейсов IEnumXXX, который, используется для перебора каких-либо элементов коллекции. Остается только подобрать соответствующий интерфейс. Стандартная документация не предлагает никакого решения этой проблемы, поэтому подходящий интерфейс подбирается экспериментально, благо интерфейсов типа IEnumXXX не так много. Подходящим для нашей задачи оказался интерфейс IEnumVariant. Таким образом, код для получения списка команд, поддерживаемых тем или иным персонажем, может выглядеть так:
Код
var
   ANames : IAgentCtlAnimationNames;
   Enum : IEnumVariant;
   V : OLEVariant;
   Fetched : LongInt;
   S : TStringList;
   ...
procedure TForm1.UpdateCommandsList;
begin
{ Очистить список }
   S.Clear;
{ Получить интерфейс IAgentCtrlAnimationNames }
   ANames := Char.AnimationNames;
{ и интерфейс для перебора }
   Enum := ANames.Enum as IEnumVariant;
{ Перебрать все команды }
  Fetched := $ff;
  Repeat
   Enum.Next(1, V, @Fetched);
   If VarToStr(V) <> ‘’ Then
    S.Add(V);
  Until Fetched = 0;
{ Сохранить в списке }
  ListBox1.Items := S;
end;

Тем же, кому не хочется что-то писать, я могу предложить третий вариант – это скачать программу Agent Viewer (710 КВ), распространяемую Microsoft специально для получения списка возможных анимаций.
После того как мы получили список команд, поддерживаемых персонажем, мы, естественно, можем их использовать. Знание этого списка освобождает нас от необходимости проверять, поддерживается ли та или иная команда — в списке будут только те команды, которые «актуальны» для загруженного персонажа.

Локальное меню
Мы можем задавать собственные команды, доступные через локальное меню, вызываемое нажатием правой кнопки мыши по агенту. Сначала задаем команду:
Код
Char.Commands.Add('Test', '&Test', 1, 1, True);
Char.Commands.Add('Demo', '&Demo', 1, 1, True);

а затем в обработчике события OnCommand описываем выполняемые ими действия:
Код
procedure TForm1.Agent1Command(Sender: TObject;
   const UserInput: IDispatch);
var
   Cmd : IAgentCtlUserInput;
begin
   Cmd := UserInput as IAgentCtlUserInput;
   If Cmd.Name = 'Test' Then
   Char.Think('Вызвали команду Test');
  If Cmd.Name = 'Demo' Then
   Char.Think('Вызвали команду Demo');
end;

В данном примере мы вызываем метод Think, с помощью которого выводится соответствующее сообщение.


Использование «закладок»
Microsoft Agent поддерживает механизм «закладок», с помощью которого можно вставить в выводимый текст указание на необходимость активизации какой-либо команды. Для этого задаем «закладку»:
Код
procedure TForm1.Button2Click(Sender: TObject);
begin
   Char.Speak('Пример использования \mrk=255\ закладки', '');
end;
а затем в обработчике события OnBookmark выполняем необходимые действия:
procedure TForm1.Agent1Bookmark(Sender: TObject; BookmarkID: Integer);
begin
  If BookmarkID = 255 Then
  ShowMessage('Закладка!');
end;



По рекомендации Алекса добавляю статью еще одной возможностью агентов, а именно: произношение речи;


Речь агента
У технологии Microsoft Agent есть еще одна очень интересная возможность, а именно произношение (чтение) агентом текста. Для того, чтобы персонаж прочитал текст, нужно применить к нему метод speak. Чтение текста будет производиться через движок установленный по умолчанию. Если движок не установлен, то текст будет только выводится в специальное окошко (balloon).

Если все подготовительные операции были выполнены правильно, фраза, которая передана методу в качестве аргумента, будет не только отображена на экране, но и синхронно произнесена персонажем. Если вы поэкспериментируете с озвучанием различных персонажей, то наверняка обратите внимание, что все они немного отличаются друг от друга манерой разговора. Это еще одно достоинство технологии Microsoft Agent.

Для начало нужно, что бы наш агент был загружен методом Load:
Код
var
  Char    : IAgentCtlCharacterEx;

Agent1.Characters.Load('Char', 'peedy.acs');
Char := Agent1.Characters.Character('Char') as  IAgentCtlCharacterEx;

ну и конечно, что бы он отображался
Код
Char.Show;

Как уже отмечалось выше, для произношения речи используется метод speak, т.е.
Код
Char.Speak('Hello','');

Но тут одно НО. Если у вас не установлен речевой движок SpeachAPI, то агент у вас не заговорит. Скачать движок можно по ссылке: SpeachAPI
Для того, что бы ваш агент умел разговаривать по-русски, нужно скачать еще вот это: lhttsrur.exe

Но это еще не все. Для того, что бы добавить эмоций в речь агента, можно воспользоваться специальными тегами. В Microsoft Agent доступны все теги, принятые в SAPI, — они и позволяют сделать речь естественной. Тегов сравнительно немного, и запомнить их пара пустяков:
Emp — ударение на произносимом слове. Выделяемое речью слово должно следовать сразу за тегом;

Chr — Устанавливает тип голоса ("Normal" - нормальный голос, "Monotone" - монотонный, "Whisper" - шепот). Пример: '\Chr="Whisper"\Hello'
Ctx — Устанавливает тип содержимого читаемой строки ("Address" - Адрес и/или телефонный номер, "E-mail" - мыло, "Unknown" - неопределенный тип). Пример '\Ctx="E-mail"\asd@mail.ru'
Lst — Повторить последнее сказанное выражение;
Pau — пауза в речи (миллисекунды);
Pit — высоты звучания голоса в Гц;
Spd — средняя скорость речи (слов в минуту);
Vol — средняя громкость звука.

Хотел бы по-подробнее остановится на теге Ctx. Он предназначен для управления параметрами нормализации текста. TTS-модуль должен преобразовать текст в последовательность слов для синтезатора речи. На этом этапе ему важно понимать, в каком контексте используются слова. Иными словами, TTS-модуль должен знать тематику сообщения. К примеру, получив на вход строку вида «X-Originating-IP: [65. 169.241.134]», речевой движок должен воспринять ее как служебную часть заголовка электронного письма, которая никогда не читается пользователями и поэтому вообще не должна быть озвучена. Для этих целей были разработаны специальные режимы работы TTS-модулей: "E-mail" и "Address". Причем один из них предназначен для работы с электронной почтой, а другой — для корректного озвучания адресов и телефонов. Оба этих режима имеют много общего в работе. Например, всегда распознаются предложения, написанные латинским алфавитом, — они воспринимаются как английская речь. Это очень удобно — без переключения языков в тексте можно использовать иностранные термины. Различия же в работе проще всего продемонстрировать на одном примере. Так, сочетание знаков ;-) в режиме "Unknown" воспринимается как бессмысленное и поэтому пропускается. В режиме "E-mail" оно интерпретируется как средство выражения эмоций автора текста — смайлик. Такой смайлик обозначает дружескую усмешку, поэтому на этапе нормализации он будет преобразован в набор из трех слов: «хи-хи-хи». Синтезатор речи произнесет эти слова, в результате мы услышим хихиканье агента.

Для управления речью агентов в состав SAPI входит еще несколько свойств, например Pitch (определяет высоту голоса) и Speed (определяет скорость речи). Свойства Pitch и Speed доступны только для чтения. Используемые по умолчанию характеристики голоса диктора меняются тегами Pit и Spd. Их следует только добавить в команду, например:
Код
Char.Speak('Привет! \spd= 150\\pit=230\Я очень рад всех вас видеть','');

Вот некоторые правила синтаксиса для речевых тегов:
- Все теги начинаются и заканчиваются символом наклонной черты влево (\).
- Отдельный бэкслэш не допускается в пределах тэга. Чтобы включить бэкслэш в текстовый параметр тэга, используйте двойную наклонную черту влево (\\).
- Теги воспринимаются без учета регистра. Например, \Spd=100\ - тот же самый что и \SPD=100\.
- Теги пробеловосприимчивы, то есть не допускают в себе лишних пробелов. Например, \Rst\ - не тот же самый что и \ Rst \

Как правило, размещать теги можно в произвольное место фразы, их действие начинается со следующего слова. Однако действуют теги только в пределах одного вызова метода Speak.
Более подробно о тегах и изменении интонации речи у агентов можно прочесть на subritto.h1.ru

В завершение мне хочется рассказать еще об одном способе озвучания агентов. Он очень прост. Запишите сообщение, которое должен произнести персонаж, в звуковой файл. В методе Speak напишите текст сообщения, а затем укажите название и путь к файлу Hello.Wav:
Код
Char.Speak('Привет! Я очень рад всех вас видеть.', 'Hello.Wav');



Заключение
В заключение хотелось бы привести пример работы с агентом. Создайте новый проект, киньте компонент агента, вставьте приведенный ниже код и наслаждайтесь как ваш агент бегает по экрану.
Код
unit Unit1;
  interface
  uses
    Windows, Messages, SysUtils, Classes, Graphics, Forms,
    AgentObjects_TLB, Controls, OleCtrls ;
  type
    TForm1 = class(TForm)
     Agent1: TAgent;
     procedure FormCreate(Sender: TObject);
     private
     { Private declarations }
     procedure WaitFor(Request:IAgentCtlRequest);
     public
     { Public declarations }
     end;
  var
    Form1: TForm1;

  implementation
  {$R *.DFM}
  var
    Character:IAgentCtlCharacter;
    Request: IAgentCtlRequest;
  Const
    AGENT ='nn';
    AGENTPATH = 'D:\Chars\nn.acs'; // здесь нужно прописать путь где находится ваш агент

  procedure TForm1.WaitFor(Request:IAgentCtlRequest);
  var
    Status:LongInt;
  begin
    repeat
      Application.ProcessMessages;
      Status := Request.Get_Status;
    until (Status <> 2) and (Status <> 4);
  end;

  procedure TForm1.FormCreate(Sender: TObject);
  begin
    Agent1.Connected:=true;
    Request:=Agent1.Characters.Load(Agent,AgentPath);
    Character:=Agent1.Characters.Character(Agent);
    Request := Character.MoveTo(640,365, 0);
    Request := Character.Show(False); 
    WaitFor(Request);
    Request := Character.Speak('Привет',EmptyParam);
    Request := Character.Play('Greet');
    Request := Character.MoveTo(0,365, 1500);
    Request := Character.Play('Announce');
    Request := Character.MoveTo(0,0, 1500);
    Request := Character.Play('Suggest');
    Request := Character.MoveTo(300,300, 1500);
    Request := Character.MoveTo(100,300, 1500);
    Request := Character.GestureAt(800,300);
    end;
  end.

Анимации используемые в примере поддерживаются как правило всеми агентами, если у вас возникнут проблемы с выполнением данного кода, просто удалите строчку, на которую ругается компилятор.

В этой статье я рассмотрел технологию Microsoft Agent 2.0, с помощью которой можно создавать социальные, ориентированные на определенные группы пользователей интерфейсы с поддержкой стандартного и речевого ввода. Microsoft Agent стала технологией, интегрированной уже в Microsoft Windows 2000 и Microsoft Office 2000.
В версии Microsoft Agent 3.0 будет реализована более динамичная анимационная модель, расширена поддержка речевого ввода и, возможно, добавлены дополнительные сервисы.
За последний год Microsoft активно старалась привлечь внимание разработчиков к технологии Microsoft Agent. Вот только несколько фактов, подтверждающих это:
• Microsoft неоднократно показывала использование персонажа Peedy (Кеша) и возможностей распознавания голосового ввода в Outlook.
• Microsoft Agent включен в состав MSDN и Platform SDK.
• Поддержка Microsoft Agent включена в Visual Studio 6.0.
• Поддержка Microsoft Agent включена в Office 2000 developer Edition.
• Эта технология напрямую используется в Office 2000 и выше, и включена в состав ядра Windows 2000.
Технология Microsoft Agent уже используется на ряде коммерческих и любительских Web-узлов, в образовательных программах, в интрасетях и т.п.
В заключение отмечу, что в состав Microsoft Agent SDK входят две программы — Microsоft Agent Character Editor для разработки собственных персонажей и Microsoft Linguistic Information Sound Editing Tool для создания файлов с речевой информацией.
Автор: Poseidon






Просмотров: 10524

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную