Смотрели старые фильмы про хакеров? Там обычно молодой, но бородатый человек сидит за своим компьютером и разговаривает с ним, отдает голосовые команды, а компьютер, как прилежный слуга, отвечает хозяину, иногда сообщает о каком-либо событии и т.д. Думаете это сказка? Совсем нет. Несмотря на то, что в настоящее время синтез и распознавание речи можно отнести лишь к развивающимся направлениям в программировании, тем не менее это направление есть и оно постоянно развивается и совершенствуется. Конечно, на данный момент очень сложно создать такую систему управления компьютером, которая распознавала бы тысячи команд, отданных миллионами различных голосов и при этом выполняла бы эти команды. Но, тем не менее, в нашем распоряжении есть 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 (жесты). Вполне возможно, что это связано с большими сложностями в плане создания различных движков, «обучения» компьютера распознавать искаженную речь, например, когда гнусавит или «проглатывает» отдельные слоги, но, тем не менее и эту технологию с определенными ограничениями можно использовать в своих проектах, делая приложения более привлекательными для пользователей.
Пытался проделать такую же вещь с созданием элементарного приложения с текстовым полем и кнопкой. Компонент Microsoft Speach установил. Но я не знаю как использовать его в своём приложении. Добавлении в uses «SpeechLib_TLB» возникает ошибка «File not found: ‘SpeechLib_TLB.dcu'». Ну это понятно, эта библиотека со скрытым исходным кодом наверное. Добавляю тогда package с этой библиотекой в run-time библиотеки (в настройках проекта). Приложение вообще только запускается и сразу закрывается….
Что делать?)
при импорте SAPI галка напротив Generate Wrapper стояла? Как вариант — подбрось в папку к проекту ‘SpeechLib_TLB.dcu. То что расписано в посте работает без всяких заморочек с package.
стояла галка. нашёл-таки эту dcu и прописал путь в Library к ней и заработало :)
эх вот если бы ещё русским голосом… :)
Посмотри разработки L&H, вроде бы у них были наработки по русским движкам речи. Бесплатные.
Есть и бесплатные
программа Говорилка по-моему на сайте есть движки
там движки от L&H…..очень старые
Новые видимо только за бабло….Но лучше уж старенький бесплатный двиг для пробы сил, чем новый и за деньги, который в итоге может не потребоваться.
Бесплатные движки
http://www.vector-ski.ru/vecs/govorilka/download.htm#engines
Govorilka Версия : 2.22 (+ Acapela 5.1)
http://letitbit.net/download/6906.e6ee8f9d8c35b807b05e09b18/Govorilka222.rar.html
http://extabit.com/file/28drz0yql3xqn
нашёл классный русский голос) но он платный. торенты рулят :)
а где можно задать какой голос, установленный в системе, использовать? если их 2…
ID голоса надо знать.
узнаю необходимый мне 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]
причём с английским голосом от microsoft всё ок
всё решилось, поставил флаг SVSFlagsAsync
после того как выбираю в компонентах speech
нажимаю далее
потом у меня есть выбор между
create unit
install to new package
unstall to exiting
add to project
я пробовал добавить в проект, вроде всё норм работает, но если запускаю не из среды разработки, то пишет ошибку devide by zero
я на 0 не делил нигде, только то что в статьи скопировал)
и при нажатии на кнопку всегда такая ошибка!!!помогите)
Так вы хотя б по F7 строку с ошибкой найдите. Без неё могу только констатировать факт — где-то идёт деление на ноль.
так программа из среды запускаеться, и работает корректно
553529621
мой icq
не могли бы помочь ?)
Давайте завтра встретимся. У меня щас аська не стоит — после установки Win7 так и не сподобился её установить :) Как поставлю аську — стукну.
хорошо, жду)
http://vkontakte.ru/ziztracer
лучше сюда напиши
Уже в аську стукнул. Сорри, но ВКонтактом не пользуюсь…бесит он меня :)
Попробовал сделать все тоже самое(самый первый пример с едитом и кнопкой)(среда 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;
Флаг SVSDefoult не пробовали ставить? У меня голосовой движок, который стоит в Win7 по умолчанию только с этим флагом разговаривает
Пробовал, тоже не хочет работать.
ниже привожу весь, код. Может надо подключить какой движок дополнительно? или какие еще махинации хитрые провести?:)
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.
на Dictor и zzz — внимания не обращать, это я тестил.
Было ранее «если запускаю не из среды разработки, то пишет ошибку devide by zero»
Такое же исключение. Интересно, нашли из-за чего это происходит?
Уважаемые программисты!
Очень интересная статья, все сделала как написано.Но к сожалению компилятор выдает следующее
[Error] Unit1.pas(32): E2010 Incompatible types: ‘Char’ and ‘WideChar’
в строке gpIVTxt.Speak(PChar(Edit1.Text),SVSFlagsAsync,Pool);
Запускала в Delphi 2005, OS Vista.
А так же пункта Generate Component Wrappers не было в мастере установки.
Подскажите пожалуйста,как устранить эту проблему
Так в чем проблема? Пишите gpIVTxt.Speak(PWideChar(Edit1.Text),SVSFlagsAsync,Pool);
Спасибо! Компилляцию прошел.Но звука нет.
Пишет Thread Exit: Thread ID 4716. Process Project1.exe(4812)
Заговорила! Но как-то через раз…
ну я вообще это писал будучи на Delphi 2010. Может и вам стоит обновиться?
У меня есть и 2007, но там почему то нет в Component=>Import Component…
Не могли бы Вы подсказать,пожалуйста, почему выговаривает только числа или буквы, длина которых не более одного символа? т.е. 7 говорит, а 77 -молчит.
Как это исправить?
То же и со словами: h -говорит, hello -молчит?
А какой головой движок используете и, главное, под какой ОС работаете? Я под XP сижу сейчас — могу проверить ваш код — кидайте на мыло vlad383@mail.ru И, кстати, очень странно, что ваша версия Delphi не хочет делать враппер…это функция тянется с версии эдак седьмой или даже ещё с более ранней. Мож вы что-то не так делаете?
Доброго времени суток.
У меня RadStudio 2010.
В среде ошибок не выдаёт, при запуске вне среды пишет Floating point division by zero.
Если нашли решение, подскажите пожалуйста.
Судя по всему в момент компиляции что то не подключается.
Sergey смотри комменты
Спасибо.
В ассинхронном воспроизведении — сработало.
Всем привет. Скинте пожалуйста исходник программы. Я пишу а он выдает ошибки. не могу понять в чем причина
[…] так давно (26 марта 2010 года) я рассказывал Вам о том, как применить технологию Text-To-Speech (чтение текста […]
а где скачать SAPI 5.4