уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Смотрели старые фильмы про хакеров? Там обычно молодой, но бородатый человек сидит за своим компьютером и разговаривает с ним, отдает голосовые команды, а компьютер, как прилежный слуга, отвечает хозяину, иногда сообщает о каком-либо событии и т.д. Думаете это сказка? Совсем нет. Несмотря на то, что в настоящее время синтез и распознавание речи можно отнести лишь к развивающимся направлениям в программировании, тем не менее это направление есть и оно постоянно развивается и совершенствуется. Конечно, на данный момент очень сложно создать такую систему управления компьютером, которая распознавала бы тысячи команд, отданных миллионами различных голосов и при этом выполняла бы эти команды. Но, тем не менее, в нашем распоряжении есть Speech API — набор интерфейсов для работы с речью. И с помощью SAPI можно научить компьютер разговаривать.

Так как в настоящее время я работаю в Windows 7, то, к сожалению в этой версии ОС оставили всего один синтезатор речи — Anna (по-моему в XP синтезаторов было 2 или 3). Но, зато используется последний пакет речевых функций — Microsoft Speech API v.5.4. Разговаривает наша Аня на чистом английском и русский язык для неё чужд. Первым делом, чтобы воспользоваться SAPI нам необходимо импортировать в Delphi библиотеку типов. Для этого открываем Delphi IDE, выбираем в главном меню «Component — Import Component» в открывшемся окне выбираем «Import Type Library» и жмем «Next»:

Теперь находим в списке «Microsoft Speech Object Library», выбираем её, жмем «Next»

В новом окне ставим галку напротив «Generate Component Wrappers» и жмем «Finish»:

Теперь у нас есть заголовочный файл для работы с SAPI 5.4. и можно приступать к работе.
Создадим простенькое приложение, с помощью которого наша Anna будет нам читать английские сказки на сон грядущий. В качестве текста будем передавать в синтезатор сначала простую строку, а потом попробуем добавить статью из какого-нибудь файла.
Создаем новое приложение и укладываем на главную форму 1 компонент Edit и 1 кнопку Button:

Для того, чтобы перечести текст в голос нам потребуется всего один интерфейс — ISpVoice. Напишем такой обработчик onClick у кнопки:

procedure TForm1.Button1Click(Sender: TObject);
var gpIVTxt: ISpVoice;
     Pool: LongWord;
begin
  gpIVTxt:=CoSpVoice.Create as ISpVoice;
  gpIVTxt.Speak(PChar(Edit1.Text),SVSFDefault,Pool);
end;

Можете запустить программу, написать в Edit «Hello», нажать кнопку и послушать как с Вами поздоровается Ваш собственный компьютер.
В этой процедуре мы получили ссылку на интерфейс ISpVoice и воспользовались методом Speak. У метода три параметра:

function Speak(pwcs: PWideChar; dwFlags: LongWord; out pulStreamNumber: LongWord): HResult;

pwcs — указатель на строку, которую необходимо перевести в голос;
dwFlags — флаги, используемые в синтезе речи.
pulStreamNumber — номер выходного голосового потока.
Если указано, что метод должен работать асинхронно, то если вы зададите два больших фрагмента для чтения, вначале будет воспроизведен первый фрагмент, а второй будет поставлен в очередь на воспроизведение.
Следует обратить внимание на то, какие значения может принимать параметр dwFlags:

SVSFDefault = $00000000;//синхронная работа, поток воспроизведения не очищается пока весь текст не воспроизведен
SVSFlagsAsync = $00000001;//работать асинхронно
SVSFPurgeBeforeSpeak = $00000002;//прерывает текущее воспроизведение для того, чтобы запустить воспроизведение заданного текста
SVSFIsFilename = $00000004;//переданная строка представляет собой имя файла, содержимое которого необходимо воспроизвести
SVSFIsXML = $00000008;//текст содержащий XML-разметку
SVSFIsNotXML = $00000010;//запрещает проводить анализ текста на предмет содержания в нем XML-тегов

Есть и другие флаги, но для нашего примера этих будет вполне достаточно. Теперь попробуем «скормить» нашей Аннушке в качестве параметра в Speak имя файла. Дописываем onClick:

procedure TForm1.Button1Click(Sender: TObject);
var gpIVTxt: ISpVoice;
     Pool: LongWord;
begin
  if OpenDialog1.Execute then
    Edit1.Text:=OpenDialog1.FileName;
  gpIVTxt:=CoSpVoice.Create as ISpVoice;
  gpIVTxt.Speak(PChar(Edit1.Text),SVSFIsFilename,Pool);
end;

Теперь создайте файл, содержащий какой-либо английский текст и укажите его в программе. После нажатия на кнопку голос Anna воспроизведет содержимое всего файла и при этом, кстати, учтет все знаки препинания.
Вот простой, я бы даже сказал элементарный, способ работы с SAPI в Delphi. Если Вам необходимо воспроизвести русскую речь, то предварительно необходимо обзавестись соответствующим движком, установив его себе на комп. Ещё года два-три назад, когда я только знакомился с этой технологией была компания L&H, выпускающая различные бесплатные движки для синтеза речи на различных языках, в том числе и на русском.
Ну и в качестве заключения скажу, что сегодня речевые технологии представляют собой ещё большую «экзотику», чем те же Gestures (жесты). Вполне возможно, что это связано с большими сложностями в плане создания различных движков, «обучения» компьютера распознавать искаженную речь, например, когда гнусавит или «проглатывает» отдельные слоги, но, тем не менее и эту технологию с определенными ограничениями можно использовать в своих проектах, делая приложения более привлекательными для пользователей.

2.7 3 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
40 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Алексей
Алексей
29/03/2010 11:17

Пытался проделать такую же вещь с созданием элементарного приложения с текстовым полем и кнопкой. Компонент Microsoft Speach установил. Но я не знаю как использовать его в своём приложении. Добавлении в uses «SpeechLib_TLB» возникает ошибка «File not found: ‘SpeechLib_TLB.dcu'». Ну это понятно, эта библиотека со скрытым исходным кодом наверное. Добавляю тогда package с этой библиотекой в run-time библиотеки (в настройках проекта). Приложение вообще только запускается и сразу закрывается….
Что делать?)

Алексей
Алексей
29/03/2010 11:58

стояла галка. нашёл-таки эту dcu и прописал путь в Library к ней и заработало :)

Алексей
Алексей
29/03/2010 12:44

эх вот если бы ещё русским голосом… :)

Алексей (Минск)
Алексей (Минск)
29/03/2010 18:08

Есть и бесплатные
программа Говорилка по-моему на сайте есть движки

Алексей
Алексей
30/03/2010 08:53

там движки от L&H…..очень старые

Алексей (Минск)
Алексей (Минск)
30/03/2010 11:48
Алексей
Алексей
30/03/2010 13:42

нашёл классный русский голос) но он платный. торенты рулят :)

Алексей
Алексей
30/03/2010 13:50

а где можно задать какой голос, установленный в системе, использовать? если их 2…

Алексей
Алексей
30/03/2010 14:12

узнаю необходимый мне ID голоса. Пишу «проговорить», но возникает ошибка «Floating point devision by zero».

так нет ошибки и нет голоса:[code]
Diktor: TSpVoice;
....
var zzz:ISpeechObjectTokens;
begin
zzz:=Diktor.GetVoices('', '');
//Diktor.Voice:=zzz.Item(1);
Diktor.Speak('Поехали', SVSFDefault);
end;
[/code]

так нет ошибки и голоса тоже:[code]
Diktor: TSpVoice;
....
var zzz:ISpeechObjectTokens;
begin
zzz:=Diktor.GetVoices('', '');
Diktor.Voice:=zzz.Item(1);
//Diktor.Speak('Поехали', SVSFDefault);
end;
[/code]

так еть ошибка и нет голоса:[code]
Diktor: TSpVoice;
....
var zzz:ISpeechObjectTokens;
begin
zzz:=Diktor.GetVoices('', '');
Diktor.Voice:=zzz.Item(1);
Diktor.Speak('Поехали', SVSFDefault); //ошибка тут возникает
end;
[/code]

Алексей
Алексей
30/03/2010 14:17

причём с английским голосом от microsoft всё ок

Алексей
Алексей
30/03/2010 15:08

всё решилось, поставил флаг SVSFlagsAsync

ziz
ziz
02/05/2010 13:23

после того как выбираю в компонентах speech
нажимаю далее
потом у меня есть выбор между
create unit
install to new package
unstall to exiting
add to project

я пробовал добавить в проект, вроде всё норм работает, но если запускаю не из среды разработки, то пишет ошибку devide by zero
я на 0 не делил нигде, только то что в статьи скопировал)
и при нажатии на кнопку всегда такая ошибка!!!помогите)

ziz
ziz
02/05/2010 16:57

так программа из среды запускаеться, и работает корректно
553529621
мой icq
не могли бы помочь ?)

ziz
ziz
03/05/2010 07:28

хорошо, жду)

ziz
ziz
03/05/2010 14:00

http://vkontakte.ru/ziztracer
лучше сюда напиши

Дмитрий
Дмитрий
19/05/2010 12:37

Попробовал сделать все тоже самое(самый первый пример с едитом и кнопкой)(среда win7 + delphi7)
Добавил необходимую библиотеку типов.
Запускается на ура, вот только при нажатии на кнопку — из динамиков грустное молчание.
Не могли бы подсказать в чем может быть причина? может кто сталкивался уже? ошибок не вылетает. При дебаге — все отрабатывает. Но разговаривать не хочет. Попробовал поиграть с dwFlags но тоже безрезультатно, попытка воспроизвести на WinXP + Delphi7 — тоже ноль.
Код ниже, если необходимо

procedure TForm1.Button2Click(Sender: TObject);
var gpIVTxt: ISpVoice;
Pool: LongWord;
begin
gpIVTxt:=CoSpVoice.Create as ISpVoice;
gpIVTxt.Speak(‘hello’,SVSFlagsAsync,Pool);
end;

Дмитрий
Дмитрий
19/05/2010 13:11

Пробовал, тоже не хочет работать.
ниже привожу весь, код. Может надо подключить какой движок дополнительно? или какие еще махинации хитрые провести?:)

unit MainUnit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SpeechLib_TLB, COMObj;

type
TForm1 = class(TForm)
Button2: TButton;
procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
var gpIVTxt: ISpVoice;
Pool: LongWord;
zzz:ISpeechObjectTokens;
Diktor: TSpVoice;
begin
gpIVTxt:=CoSpVoice.Create as ISpVoice;
gpIVTxt.Speak(‘hello’,SVSFDefault,Pool);
end;

end.

Дмитрий
Дмитрий
19/05/2010 13:12

на Dictor и zzz — внимания не обращать, это я тестил.

Dmitry
07/09/2010 15:42

Было ранее «если запускаю не из среды разработки, то пишет ошибку devide by zero»
Такое же исключение. Интересно, нашли из-за чего это происходит?

I_am_a_Human
I_am_a_Human
01/10/2010 22:39

Уважаемые программисты!
Очень интересная статья, все сделала как написано.Но к сожалению компилятор выдает следующее
[Error] Unit1.pas(32): E2010 Incompatible types: ‘Char’ and ‘WideChar’
в строке gpIVTxt.Speak(PChar(Edit1.Text),SVSFlagsAsync,Pool);
Запускала в Delphi 2005, OS Vista.
А так же пункта Generate Component Wrappers не было в мастере установки.
Подскажите пожалуйста,как устранить эту проблему

I_am_a_Human
I_am_a_Human
01/10/2010 23:01

Спасибо! Компилляцию прошел.Но звука нет.
Пишет Thread Exit: Thread ID 4716. Process Project1.exe(4812)

I_am_a_Human
I_am_a_Human
01/10/2010 23:36

Заговорила! Но как-то через раз…

I_am_a_Human
I_am_a_Human
02/10/2010 00:08

У меня есть и 2007, но там почему то нет в Component=>Import Component…
Не могли бы Вы подсказать,пожалуйста, почему выговаривает только числа или буквы, длина которых не более одного символа? т.е. 7 говорит, а 77 -молчит.
Как это исправить?
То же и со словами: h -говорит, hello -молчит?

Sergey
Sergey
10/11/2010 12:31

Доброго времени суток.
У меня RadStudio 2010.
В среде ошибок не выдаёт, при запуске вне среды пишет Floating point division by zero.
Если нашли решение, подскажите пожалуйста.
Судя по всему в момент компиляции что то не подключается.

Алексей
Алексей
10/11/2010 16:37

Sergey смотри комменты

Sergey
Sergey
10/11/2010 23:39

Спасибо.
В ассинхронном воспроизведении — сработало.

Денис
Денис
26/04/2013 20:28

Всем привет. Скинте пожалуйста исходник программы. Я пишу а он выдает ошибки. не могу понять в чем причина

trackback

[…] так давно (26 марта 2010 года) я рассказывал Вам о том, как применить технологию Text-To-Speech (чтение текста […]

кирилл мизгирёв

а где скачать SAPI 5.4