:: Главная :: Проекты :: MSAgent :: Музыка :: Гостевая :: Форум ::

Главная

О сайте

Гостевая книга
Форум

Проекты

О разделе

Animals v1.7.2r2
ReadIt v1.2
LittleHelper
EasyTester v1.3
EasyTester v2.0

MS Agent

Отступление

MSAgent в Delphi
MSAgent+MSBalloon
Новый DlgBalloon
SpeechAPI в Delphi

MSAgent и SAPI

Speech API часть2
- Работа с тегами
- Атрибуты голоса
- Диалоги
Синтез речи в файл
Обзор говорящих программ
Насосная станция

Музыка

Моя музыка

Альфред Шнитке
Музыка А. Шнитке

Голосование
Применяете ли вы технологию SpeechAPI в своих приложениях?
Да, применяю
Хочу применять
Лишняя функция

Поиграть с MSA

Персонаж:

Позиция:
X: Y:
 
Величина:

%

Поговорить:
Примечание: Поиграть с персонажем можно только, если у вас установлен MSAgent v2.0, а проговорить при установленных голосовых функций. Все компоненты можно скачать тут.

Подписка
Ваш e-mail:
Раздел:
 

Speech API и MS Agent

Вот мы и написали простейшую программу для чтения текстов. Теперь давайте заставим MS Agent'а говорить используя движки синтеза речи. Это намного легче , чем просто предложить поболтать Delphi.

Продолжим совершенствовать проект AgentTest, который мы создавали, когда знакомились с MS Agent'ом(статью увидеть здесь).

Как вы уже знаете, для того, чтобы персонаж прочитал текст, нужно применить к нему метод speak . Чтение текста будет производиться через движок установленный по умолчанию. Для того чтобы изменить речевой синтезатор через который вы желаете осуществить чтение, надо изменить всего один "проперти" у персонажа. Это TTSModeID, а меняется он методом Set_TTSModeID. Поэтому в разделе private понадобятся всего лишь одна новая переменная, та с помощью которой мы станем перебирать речевые движки и узнавать их параметры:

private
  ...
  aTTSEnum: ITTSEnum;
   {Интерфейс для перебора движков}

В обработке события создания формы добавим код сканирования речевых синтезаторов. Конечная процедура примет вид:

procedure TForm1.FormCreate(Sender: TObject);
var
NumFound : DWord;
ModeInfo : TTSModeInfo;
begin
Agent1.Characters.Load('MyAgent', 'Genie.acs');
Chars:= Agent1.Characters.Character('MyAgent') as IAgentCtlCharacterEx;
ShowAgentAnim; //Создание списка анимаций персонажа
Req:=Chars.Show(0);
CoCreateInstance(CLSID_TTSEnumerator, Nil, CLSCTX_ALL,IID_ITTSEnum, aTTSEnum); aTTSEnum.Reset; aTTSEnum.Next(1, ModeInfo, @NumFound); While NumFound > 0 do begin ComboBox1.Items.Add(String(ModeInfo.szModeName)); aTTSEnum.Next(1, ModeInfo, @NumFound); end; end;

Процедуру изменения движка по выбору его в ComboBox'е тоже измените, только в другую сторону - после чего она уменьшится почти в два раза:

procedure TForm1.ComboBox1Change(Sender: TObject);
var
NumFound: DWord;
ModeInfo: TTSModeInfo;{Для хранения информации о текущем движке}
begin
try
CoCreateInstance(CLSID_TTSEnumerator, Nil, CLSCTX_ALL, IID_ITTSEnum, aTTSEnum);
aTTSEnum.Reset;
{Перескакиваем на нужный движок}
Form1.aTTSEnum.skip(ComboBox1.ItemIndex);
aTTSEnum.Next(1, ModeInfo, @NumFound);
{Изменяем речевой синтезатор у персонажа}
Chars.Set_TTSModeID(GUIDToString(ModeInfo.gModeID));
except
end;
end;

В последней строчке используется еще одна интересная функция GUIDToString ! Дело в том, что в метод Set_TTSModeID нужно передать идентификатор интерфейса движка, то есть GUID(Globally Unique IDenifier). Но его надо передавать не в родном его типе(т.е. в TGUID), а в WideString. Поэтому приходится пользоваться функцией из ComObj.pas. Кстати есть и обратная функция StringToGUID(const S: string): TGUID; это я так, на всякий случай...

Вот и все! Теперь персонаж будет читать текст методом speak через выбранный движок!

Полный исходный текст программы вы найдете в конце страницы! А пока все! Пишите и рассказывайте о своих XPрементах над мэ-сэ агентом и Speech API.

Скачать абгрейденный AgentTest(~216Кб)

 


 

 
   
Rambler's Top100
1:1:233 - 1:2249
© Copyright 2002-2004; Denis Butorin