Подписка

добавить на Яндекс

Наши проекты

Delphi+Google

Google API

Google API в Delphi - проект с открытым исходным кодом.

Chrono

Chrono

Хронометр - программа для ведения списка задач.

ODFProc

ODFProc

ODFProc - работа с документами OpenOffice в Lazarus и FreePascal.

Поддержка блога

А тут я коплю на лицензию Delphi XE на iPad =).
Сумма пожертвования не фиксирована.

Публикации

Год назад

Случайный пост

Последние

Сообщения форума

Комментарии

Социальные сети

Google

Facebook

Twitter

Опрос

Вы сейчас или в ближайшем обозримом будущем планируете разрабатывать кроссплатформенное приложение с использованием Firemonkey?



Loading ... Loading ...

Блоги и сообщества

Статьи по Delphi DelphiFeeds.ru - Все Delphi-блоги Рунета Сообщество умных людей VR-Online.RU Бесплатный журнал для программистов и всех, кто интересуется IT Статьи и уроки по Delphi Новостной блог о высоких технологиях
Система Orphus
Опубликовал Vlad 26 марта 2010 в 19:22.
Категории: Основы Delphi.


Смотрели старые фильмы про хакеров? Там обычно молодой, но бородатый человек сидит за своим компьютером и разговаривает с ним, отдает голосовые команды, а компьютер, как прилежный слуга, отвечает хозяину, иногда сообщает о каком-либо событии и т.д. Думаете это сказка? Совсем нет. Несмотря на то, что в настоящее время синтез и распознавание речи можно отнести лишь к развивающимся направлениям в программировании, тем не менее это направление есть и оно постоянно развивается и совершенствуется. Конечно, на данный момент очень сложно создать такую систему управления компьютером, которая распознавала бы тысячи команд, отданных миллионами различных голосов и при этом выполняла бы эти команды. Но, тем не менее, в нашем распоряжении есть 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 (жесты). Вполне возможно, что это связано с большими сложностями в плане создания различных движков, "обучения" компьютера распознавать искаженную речь, например, когда гнусавит или "проглатывает" отдельные слоги, но, тем не менее и эту технологию с определенными ограничениями можно использовать в своих проектах, делая приложения более привлекательными для пользователей.

Понравилась статья? Тогда:
Делись! Загружай! Плюсуй!
   Отправить PDF на   
Читай ещё статьи на WebDelphi.ru

Комментарии (37)

WP_Cloudy
  • Алексей пишет:

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

  • Vlad пишет:

    при импорте SAPI галка напротив Generate Wrapper стояла? Как вариант — подбрось в папку к проекту ‘SpeechLib_TLB.dcu. То что расписано в посте работает без всяких заморочек с package.

  • Алексей пишет:

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

  • Алексей пишет:

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

  • Vlad пишет:

    Посмотри разработки L&H, вроде бы у них были наработки по русским движкам речи. Бесплатные.

  • Алексей (Минск) пишет:

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

  • Алексей пишет:

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

  • Vlad пишет:

    Новые видимо только за бабло….Но лучше уж старенький бесплатный двиг для пробы сил, чем новый и за деньги, который в итоге может не потребоваться.

  • Алексей (Минск) пишет:
  • Алексей пишет:

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

  • Алексей пишет:

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

  • Vlad пишет:

    ID голоса надо знать.

  • Алексей пишет:

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

    так нет ошибки и нет голоса:


    Diktor: TSpVoice;
    ....
    var zzz:ISpeechObjectTokens;
    begin
    zzz:=Diktor.GetVoices('', '');
    //Diktor.Voice:=zzz.Item(1);
    Diktor.Speak('Поехали', SVSFDefault);
    end;

    так нет ошибки и голоса тоже:


    Diktor: TSpVoice;
    ....
    var zzz:ISpeechObjectTokens;
    begin
    zzz:=Diktor.GetVoices('', '');
    Diktor.Voice:=zzz.Item(1);
    //Diktor.Speak('Поехали', SVSFDefault);
    end;

    так еть ошибка и нет голоса:


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

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

  • Алексей пишет:

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

  • ziz пишет:

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

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

  • Vlad пишет:

    Так вы хотя б по F7 строку с ошибкой найдите. Без неё могу только констатировать факт — где-то идёт деление на ноль.

  • ziz пишет:

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

  • Vlad пишет:

    Давайте завтра встретимся. У меня щас аська не стоит — после установки Win7 так и не сподобился её установить :) Как поставлю аську — стукну.

  • ziz пишет:

    хорошо, жду)

  • ziz пишет:

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

  • Vlad пишет:

    Уже в аську стукнул. Сорри, но ВКонтактом не пользуюсь…бесит он меня :)

  • Дмитрий пишет:

    Попробовал сделать все тоже самое(самый первый пример с едитом и кнопкой)(среда 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;

  • Vlad пишет:

    Флаг 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 — внимания не обращать, это я тестил.

  • Dmitry пишет:

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

  • I_am_a_Human пишет:

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

  • Vlad пишет:

    Так в чем проблема? Пишите gpIVTxt.Speak(PWideChar(Edit1.Text),SVSFlagsAsync,Pool);

  • I_am_a_Human пишет:

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

  • I_am_a_Human пишет:

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

  • Vlad пишет:

    ну я вообще это писал будучи на Delphi 2010. Может и вам стоит обновиться?

  • I_am_a_Human пишет:

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

  • Vlad пишет:

    А какой головой движок используете и, главное, под какой ОС работаете? Я под XP сижу сейчас — могу проверить ваш код — кидайте на мыло vlad383@mail.ru И, кстати, очень странно, что ваша версия Delphi не хочет делать враппер…это функция тянется с версии эдак седьмой или даже ещё с более ранней. Мож вы что-то не так делаете?

  • Sergey пишет:

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

  • Алексей пишет:

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

  • Sergey пишет:

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

Ваш ответ

Внимание: Все комментарии модерируются, и это может вызвать задержку их публикации. Отправлять комментарий заново не требуется.

Пожалуйста, заключайте исходный код в тэги [code][/code].
Если код большой, то воспользуйтесь Вставкой кода на отдельной странице и оставьте в комментарии ссылку на исходник

   


батарея htc desire --|--. купить муген пауер 3600mah аккумулятор Xperia X10