VR
Virtual Reality On-line   ActiveX
Новости   |     Журнал    |    Хаkер   |     Магазин   |   Проекты
[   Вход    ]
[Kарта сайтa]
[ Download  ]
[  Конкурс  ]
[  Анекдоты ]
[  Ссылки   ]
[  Реклама  ]
[ Почтальон ]
[ О проекте ]






TopList
ActiveX
Microsoft Speech-To-Text
:

Сегодня мы будем учится правильно разговаривать. Точнее сказать, мы научим компьютер произносить напечатанный текст и в этом нам поможет Microsoft Speech-To-Text. Если у тебя его нет, то придётся поискать на сервере Microsoft (точное расположение не помню). Все необходимые файлы занимают 10 мегов, так что придётся немного попотеть. А если ты счастливый обладатель моего диска, то ты сможешь найти эту библиотеку на нём.
Logo
Рис 1. Импорт ActiveX

После инсталляции всего пакета, ты должен запустить Delphi. Теперь выбери “Import ActiveX Control” из меню “Component” . Перед тобой откроется окно, как на рис 1. В верхнем списке найди строку Microsoft Direct Text-to-Speech (Version 1.0). На рис 1 эта строка выделена синим цветом. После этого можно жать пимпу Install.

Перед тобой откроется окно как на рис 2 и сообщение «Package XXXXX.bpl will be rebuilt. Continue?». Смело жми “Yes”, и новый компонент установится в системе.

Если всё прошло нормально, а проблем не должно быть, то на закладке ActiveX должен появится компонент DirectSS в виде иконки с губами. Вот именно с этим компонентом мы и будем сегодня играть.

Самый простейший способ заставить говорить нашего друга (я имею ввиду компьютер), это установить компонент DirectSS на форму, поставить кнопку и по её событию написать DirectSS1.Speak(‘Hallo’). Но это не то, что нам надо. Мы должны выжать всё возможное, ну или хотя бы самое интересное.
Logo
Рис 2. Установка

На рисунке 3. ты можешь видеть результат сегодняшней деятельности, а исходники как всегда в конце.

Я расположил на форме:

  • TbitBtn - кнопка
  • Tpanel – просто для красоты
  • Tedit – для ввода текста, который будем проговаривать
  • TdirectSS – объект-болтун
  • TcomboBox – для выбора драйвера
  • TtrackBar – для установки тона

Для нашего примера нужно подключить в раздел USES ComObj и ActiveX. Это из стандартных объектов. Помимо этого, нам понадобится speech.pas, который тоже надо подключить в раздел uses. Этот файл ты можешь скачать вместе с исходниками.
Logo
Рис 3. Форма

Раздел private моей формы выглядит так:

  private
    { Private declarations }
    FITTSEnum:ITTSEnum;
    FITTSCentral:ITTSCentral;
    FIAMD:IAudioMultimediaDevice;
    PModeInfo:PTTSModeInfo;
    FTTSBufNotifySink:ITTSBufNotifySink;
    FITTSAttributes:ITTSAttributes;

Как всегда начнём рассмотрение примера с функции FormShow:

var
 ModeInfo: TTSModeInfo;
 EngineCount: Integer;
Begin
 //Создаю FITTSEnum. Который понадобится для перечисления всех 
 //возможных драйверов
 CoCreateInstance(CLSID_TTSEnumerator, Nil, CLSCTX_ALL, 
   IID_ITTSEnum, FITTSEnum);
//Сбрасываю счётчик в 0
 FITTSEnum.Reset;
//Выюираю первый драйвер и получаю общее количество драйверов
 FITTSEnum.Next(1, ModeInfo, @EngineCount);
//Запускаю цикл получения остальных драйверов
 while EngineCount > 0 do
  begin
    //Добавляю первый полученный драйвер в ComboBox1
   ComboBox1.Items.Add(String(ModeInfo.szModeName));
    //Получаю следующий
   FITTSEnum.Next(1, ModeInfo, @EngineCount);
  end;
//Устанавливаю Максимум и Минимум для TrackBar1.
 TrackBar1.Max:=DirectSS1.MaxPitch;
 TrackBar1.Min:=DirectSS1.MinPitch;
end;

Теперь об установке драйвера. Она происходит автоматически после выбора любого драйвера из списка ComboBox. По его событию OnChange происходит:

var 
 Index, EngineCount: Integer;
  ModeInfo: TTSModeInfo;
Begin
//Если в ComboBox1 ничего не выбрано, то выходим нафиг. 
 if ComboBox1.Text='' then exit;

//Инициализация звука.
 CoCreateInstance(CLSID_MMAudioDest, nil, CLSCTX_ALL, 
            IID_IAudioMultiMediaDevice, FIAMD);

//Определяем, какой драйвер выбран.
 Index := ComboBox1.Items.IndexOf(ComboBox1.Text);

 Try
 // Сбрасываем FITTSEnum
  FITTSEnum.Reset;
//Выбираем новый драйвер
  FITTSEnum.Skip(Index);
  FITTSEnum.Next(1, ModeInfo, @EngineCount);

//Устанавливаем атрибуты базара.
  if Assigned(PModeInfo) then Dispose(PModeInfo);
   New(PModeInfo);
  PModeInfo^ := ModeInfo;

  FITTSEnum.Select(PModeInfo^.gModeID, FITTSCentral, FIAMD);
  FITTSCentral.QueryInterface(IID_ITTSAttributes, 
       FITTSAttributes);
except
 end;

И наконец сама болтовня. По нажатию кнопки я намулевал:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 SData : TSData;
Begin
//Устанавливаю тон
 FITTSCentral.Inject(PChar('\Pit=' + IntToStr(TrackBar1.Position) + '\'));

//Передаю текст, который надо произнести в FITTSCentral.
 SData.dwSize := Length(Edit1.Text) + 1;
 SData.pData := PChar(Edit1.Text);
 FITTSCentral.TextData (CHARSET_TEXT, 0,
     SData, Pointer(FTTSBufNotifySink), IID_ITTSBufNotifySink);
// DirectSS1.Speak(Edit1.Text);
end;

Вот и всё. Запускай пример, выбирай драйвер и жми кнопку. Ты можешь изменить текст в Edit1 и прослушать его. Попробуй поиграть с TtrackBar. После изменения его позиции, текст тоже меняется.

Всё!!!

 Исходники примера забирай здесь


Copyright©: Horrific aka Флёнов Михаил
Design by FMk group©