Технологии распознавания речи в Delphi с использованием Microsoft Speech API

Другое   21 Сентябрь 2010  Автор статьи: admin 

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

Мы разберем установку Microsoft Speech API и необходимых компонентов (все это прилагается к мануалу). Таким образом, я гарантирую Вам, что этот мануал действительно поможет ПОЛНОСТЬЮ разобраться с поставленной задачей. Также прилагается исходный код программы, который мы подробно разберем. На сайте cybern.ru вы найдете много полезных материалов по программированию на Delphi, поэтому рекомендую Вам зарегистрироваться на нем.

Ну а теперь давайте приступим к установке Microsoft Speech API (далее SAPI) и необходимых компонентов для Delphi . В нашем случае будет использоваться Delphi 7, но вы можете использовать и другие версии Delphi, т.к. все действия установки и работы с SAPI аналогичны.  Итак, приступим.

Установка

Сначала установим SAPI. Для этого откройте файл “sapi.exe”, который Вы скачали вместе с этим документом. Должно открыться это окно:

Нажмите кнопку “Yes”. Далее откроется окно:

Немного подождем. Откроется окно:

Нажимаем “OK”.

Далее везде нажимаем “OK” и начинается копирование файлов:

Копирование файлов может занять несколько минут. Когда текущий процесс завершится, откроется окно:

Нажав “OK”, вам предложат перезагрузиться. Нажмите “Да” (“Yes”), чтобы перезагрузить систему и завершить установку SAPI.

Установив SAPI, приступим к установке компонента в Delphi. Запустите Delphi. В нем откройте “Component -> Import ActiveX Control”. Откроется окно:

В списке ActiveX компонентов выберите “Microsoft Direct Speech Recognition”.

В пункте “Palette page” выберете “Standard”, чтобы компонент появился во вкладке Standard.

Проинсталлируйте компонент, нажав на кнопку “Install..”.

Должен появиться компонент  TDirectSR:

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

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

C:\Program Files\Microsoft Speech SDK\Misc\micwiz.exe

В ходе этого процесса, движок изучит особенности вашего произношения и запомнит их, что в дальнейшем улучшит качество распознавания во много раз.

Разработка программы

Откройте ваш Delphi и создайте новый проект. Создайте компонент DirectSR1. Он должен выглядеть так:

Далее на форме создаем следующие компоненты:

  • EnginesList: TComboBox
  • Button1: TButton
  • ProgressBar1: TProgressBar
  • Label1: TLabel

Выглядеть это может примерно так:

Теперь нам надо изменить свойства компонентов:

  • ProgressBar1: Параметру Max присвоить “MaxWord” (без кавычек)
  • Button1: Caption присвоить “Слушать” (без кавычек)
  • Label1: Caption присвоить “Нажмите ‘Слушать’ ”

Создайте обработчик OnCreate у Form1:

procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
for i:=1 to DirectSR1.CountEngines do
EnginesList.Items.Add(DirectSR1.ModeName(i));
EnginesList.ItemIndex:=0;
end;

В этой процедуре мы получаем список всех движков распознавания речи и выводим их в EnginesList при запуске программы.

Теперь создайте обработчик OnChange у EnginesList:

procedure TForm1.EnginesListChange(Sender: TObject);
begin
DirectSR1.Select(EnginesList.ItemIndex+1)
end;

Эта процедура отвечает за изменение движка у DirectSR1 при выборе его в EnginesList.

Создайте  обработчик OnCreate у Button1:

procedure TForm1.Button1Click(Sender: TObject);
begin
DirectSR1.Initialized:=1;
DirectSR1.Select(EnginesList.ItemIndex+1);
DirectSR1.GrammarFromFile('Grammar.txt');
DirectSR1.Activate;
Label1.Caption:='Слушаю';
end;

Давайте разберемся с тем, что такое файл ‘Grammar.txt’.

Этот файл содержит в себе список слов и фраз, которые вам надо распознать. Этот список задается при помощи простого кода, который по своему синтаксису напоминает ini файл. Например:

[Grammar]
LangID=1033
Type=cfg
[Start]
Start = Save file
Start = Open dialog
Start = Close [opt] program

Разберемся с синтаксисом файла ‘Grammar.txt’.

Первые три строки содержат в себе описание библиотеки слов. Разбираться в них не надо и изменять тоже. Оставьте их такими.

[Start] – это пометка начала списка слов.  Далее каждая строка, входящая в список с именем Start, начинается с “Start = ”. После указывается само слово или фраза (На английском языке!).

[opt] означает что следующее слово произносить не обязательно, т.е. получится два варианта:

Предположим у нас есть: Start = Close [opt] program

Тогда может получиться “Close program”, но может и просто “Close”.

О структуре файла “Grammar.txt” мы поговорили поверхностно. Более сложные примеры вы сможете найти в папке “C:\Program Files\Microsoft Speech SDK\SR”.

В нашей с Вами программе мы будем использовать следующий файл “Grammar.txt”:

[Grammar]
LangID=1033
Type=cfg
[Start]
Start = Color
Start = Save file
Start = Open dialog
Start = Close [opt] program

Создайте его в папке с нашей программой и назовите “Grammar.txt”.

Теперь давайте научимся обрабатывать этот файл. Для этого создайте обработчик OnPhraseFinish у компонента DirectSR1:

procedure TForm1.DirectSR1PhraseFinish(Sender: TObject; flags, beginhi,
beginlo, endhi, endlo: Integer; const Phrase, parsed: WideString;
results: Integer);
begin
ShowMessage(Phrase);
If (Phrase=’Close’)or(Phrase=’Close program’) then close;
end;

Если фраза была полностью произнесена и распознана, то срабатывает обработчик OnPhraseFinish.

В нем в константу Phrase заносится текстовое значение произнесенной фразы, т.е. то текстовое значение из файла “Grammar.txt”, которое наиболее схоже с произнесенной фразой.

В качестве наглядного примера мы выводим значение Phrase в текстовом сообщении на экран.

После этого мы сверяем, что было произнесено с “Close” и “Close program”  и если одно из них совпадает, то закрываем программу.

Теперь хотелось бы для удобства добавить измеритель громкости. Для этого создадим обработчик OnVUMeter у компонента DirectSR1:

procedure TForm1.DirectSR1VUMeter(Sender: TObject; beginhi, beginlo,
level: Integer);
begin
ProgressBar1.Position:=level;
end;

Теперь при прослушивании мы видим уровень громкости нашего голоса, что дает нам знать о том, что идет прослушивание.

Вот мы и написали простую программу, способную распознавать наши голосовые команды.

Если у вас Windows Vista или более новые версии Windows,  то запускать программу рекомендую от имени администратора.

К этому мануалу прилагается исходник программы, которая получилась у меня, и которая очень четко и адекватно распознает голос. Эту программу можно улучшать бесконечно: можно добавить другие команды, можно создать компьютерного “друга”, с которым можно поболтать. Для того, чтобы научить компьютер разговаривать на русском или английском языке, можно использовать компонент DirectSS, но об этом вы скоро сможете прочитать на сайте http://cybern.ru. Или еще вы можете управлять внешними устройствами при помощи голоса через компьютер, например включать и выключать свет в вашей комнате. Вас еще ждет очень много интересных и познавательных уроков, поэтому добавьте мой блог в закладки и переодически проверяйте его, т.к. практически каждый день здесь появляются интересные статьи и уроки.

Вы сможете задать вопрос, если у вас что-то не получится. Ну а на этом у меня все, надеюсь, что эта статья оказалась для вас полезной.

Скачать все необходимое можно по ссылке:

Скачать Исходник+ Microsoft Speech API


  • NFedya

    Подскажите пожалуйста почему не получается изменить свойство?
    ProgressBar1: Параметру Max присвоить “MaxWord” (без кавычек)
    слова вообще не пренимает

    • http://cybern.ru/ Cyberexpert

      Присвойте это значение программно.

    • http://cybern.ru/ Cyberexpert

      Присвойте это значение программно.

  • Natalia

    Скажите пожалуйтса, почему возникает ошибка «Отказано в доступе»?

    • http://cybern.ru/ Cyberexpert

      Если вы работаете в Windows Vista/7/8, то запускайте полученный exe «от имени администратора».
      Если не поможет, значит проблема кроется в SAPI. Попробуйте его переустановить.

  • Marat

    Отличная статья!! А такой вопрос. В SAPI можно сделать так чтоб не выполнялась проверка в текстовом файле, а просто сказаное заносилось в текстовую переменную?

    • http://cybern.ru/ Cyberexpert

      Этот текстовый файл обязателен, т.к. в нем вы указываете все возможные варианты распознаваемых слов. Представьте сколько разных слов и словоформ было бы, если бы программа пыталась распознать из всех существующих и возможных… Много :) Работа с такой ограниченной базой значительно облегчает и ускоряет процесс распознавания, т.к. базу слов и словоформ задаете вы в этом файле.

  • Lupper

    Вот скачал исходник все установил по инструкции, запускаю программу и она распознает только слово color даже если говарю чтото другое всеравно color с чем это может быть связано ?

    • http://cybern.ru/ Cyberexpert

      Скорее всего проблема с SAPI. Попробуйте его переустановить. Еще проблема, вероятно, кроется в вашем микрофоне.

  • Shania

    Подскажите пожалуйста, почему выходит ошибка «Отказано в доступе» при нажатии кнопки Слушать? У меня виста..

    • http://cybern.ru/ Cyberexpert

      В Delphi скомпилируйте программу без запуска (Ctrl+F9), затем найдите exe файл программы в проводнике и запустите его от имени администратора.

  • Shania

    Подскажите пожалуйста, почему выходит ошибка «Отказано в доступе» при нажатии кнопки Слушать? У меня виста..

    • http://cybern.ru/ Cyberexpert

      В Delphi скомпилируйте программу без запуска (Ctrl+F9), затем найдите exe файл программы в проводнике и запустите его от имени администратора.

  • bark

    Доброго времени суток ,народ!!Не подскажите как Sapi научить русскому?

  • Sin

    «Еще можно реализовать распознавание русских слов сравнением с эталонами без использования Microsoft SAPI.» Вот это было бы не плохо если бы ты статью написал и расписал. Именно про сравнения эталонов wav файлов.

  • Андрей

    согласен c bark-ом. вроде обещали еще и про распознавание русской речи написать

  • Вася

    Progressbar не реагирует вообще! Хотя компиляцию все прошло, но не распознает речь!(

    procedure TForm1.DirectSR1VUMeter(ASender: TObject; beginhi, beginlo,
    level: Integer);
    begin
    ProgressBar1.Position:=level;
    end;

    где ошибка не пойму(

  • Вася

    могу выложить листинг если дадите мыло№ Помогите!

  • Илья

    А что по поводу распознавания русской речи?

  • Marat

    Отличная статья!! А такой вопрос. В SAPI можно сделать так чтоб не выполнялась проверка в текстовом файле, а просто сказаное заносилось в текстовую переменную?

  • http://cybern.ru/ Cyberexpert

    Этот текстовый файл обязателен, т.к. в нем вы указываете все возможные варианты распознаваемых слов. Представьте сколько разных слов и словоформ было бы, если бы программа пыталась распознать из всех существующих и возможных… Много :) Работа с такой ограниченной базой значительно облегчает и ускоряет процесс распознавания, т.к. базу слов и словоформ задаете вы в этом файле.

  • bark

    Доброго времени суток ,народ!!Не подскажите как Sapi научить русскому?

Научиться программировать

  • на Delphi

  • на Java

  • на C++