Сегодня мы будем учится правильно разговаривать. Точнее сказать, мы научим компьютер произносить напечатанный текст и в этом нам поможет Microsoft Speech-To-Text. Если у тебя его нет, то придётся поискать на сервере Microsoft (точное расположение не помню). Все необходимые файлы занимают 10 мегов, так что придётся немного попотеть. А если ты счастливый обладатель моего диска, то ты сможешь найти эту библиотеку на нём.
Рис 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’). Но это не то, что нам надо. Мы должны выжать всё возможное, ну или хотя бы самое интересное.
Рис 2. Установка
На рисунке 3. ты можешь видеть результат сегодняшней деятельности, а исходники как всегда в конце.
Я расположил на форме:
TbitBtn - кнопка
Tpanel – просто для красоты
Tedit – для ввода текста, который будем проговаривать
TdirectSS – объект-болтун
TcomboBox – для выбора драйвера
TtrackBar – для установки тона
Для нашего примера нужно подключить в раздел USES ComObj и ActiveX. Это из стандартных объектов. Помимо этого, нам понадобится speech.pas, который тоже надо подключить в раздел uses. Этот файл ты можешь скачать вместе с исходниками.
Как всегда начнём рассмотрение примера с функции 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. После изменения его позиции, текст тоже меняется.