среда, 29 января 2014 г.

Описание API вызова библиотеки YandexSpeechRecognizeAPI.DLL

Данная библиотека (далее DLL) для работы с сервисом Yandex SpeechKit через POST-запросы в ОС NT/2000/2003/XP/7/8 предназначена для распознавания русской речи REALTIME и голосового поиска в автоматическом режиме (по задаваемому пользователем пороговому уровню, языку и задержке отслеживания окончания фразы - триггера "тишины"), а также из аудиофайлов формата WAV PCM/MP3 и речевого синтеза из задаваемого пользователем текста.





Cистемные требования и зависимости:
  1. Win32/64 (NT/2003/XP/7/8).
  2. Требуется наличие Интернет-канала.
  3. ssleay32.dll + libeay32.dll для работы с OpenSSL.
  4. lame_enc.dll для потоковой записи в MP3 (c целью снижения объема данных).
DLL предоставляет универсальный доступ для других приложений вне зависимости от языка в среде Win32/64 bit. Для использования DLL в своих проектах соблюдайте соглашение об stdcall-вызовах. Тип соглашения о вызове объявляется после прототипа функции, будь то объявление функционального типа или же объявление функции.

Таблица расшифровок параметров экспортируемой процедуры активации голосового поиска 'setvoicesearch()':
 Параметр Функционал Тип переменной
 =========================================
 onoff [in] голосовой поиск при распознавании Boolean 



Пример динамического подключения (Delphi 6/7/2006/2009/2010/TDL/XE5-7):
var totransplay     : function(txt: pansichar): pansichar; stdcall; // Text to TTS
    get_soundlevel  : function: integer; stdcall;                   // текущий уровень громкости
    setvoicesearch: procedure(onoff: boolean); stdcall;             // активация голосового поиска
    recognize       : function: pansichar; stdcall;
    recognize_wavmp3: function(filename,                            // путь-имя файла для распознавания
                               ruen: pansichar                      // язык распознавания
                               ): pansichar; stdcall;
    start           : procedure(threshold_level,                    // уровень порога срабатывания, %
                            delay_off:                              // задержка отключения, мс
                            integer;
                            ruen:                                   // язык распознавания
                            pansichar); stdcall;
    stop            : procedure; stdcall;
    setkey          : procedure(key: pansichar); stdcall;
    set_thresholdlevel_delayoff_ruen: procedure(threshold_level,    // уровень порога срабатывания, %
                                                delay_off:          // задержка отключения, мс
                                                integer;
                                                ruen:               // язык распознавания
                                                pansichar); stdcall;
    LibHandle: THandle;


function LinkProc(ProcName: string): Pointer;
begin
 result:= GetProcAddress(LibHandle, PChar(ProcName))
end;


{ Инициализация }
procedure TForm1.FormCreate(Sender: TObject);
begin
 LibHandle:= LoadLibrary('test\YandexSpeechRecognizeAPI.dll');

 if LibHandle <> 0 then begin
  // старт модуля
  start:= LinkProc('start');
  // стоп модуля
  stop := LinkProc('stop');
  // задание порога, времени задержки и языка распознавания REALTIME
  set_thresholdlevel_delayoff_ruen:= LinkProc('set_thresholdlevel_delayoff_ruen');
  // получение уровня сигнала REALTIME
  get_soundlevel:= LinkProc('get_soundlevel');
  // получение результатов распознавания REALTIME
  recognize     := LinkProc('recognize');
  // получение результатов распознавания OFFTIME (из файла)
  recognize_wavmp3:= LinkProc('recognize_wavmp3');
  // установка нового ключа доступа
  setkey:= LinkProc('setkey');

  // активация голосового поиска
  setvoicesearch:= LinkProc('setvoicesearch');
  CheckBox2.OnClick(nil);

  // тут установка вашего ключа (ОБЯЗАТЕЛЬНО!!!)
  setkey('бла-бла-бла');
  // стартуем поток автораспознавания и триггер тишины
  start(100 - tr.Position, 1000, 'ru_RU');

  // синтезатор голоса от YANDEX
  // не нуждается в установке API-ключа и использования процедур 'start()/stop()'
  totransplay:= LinkProc('totransplay');
 end;
...


{ Деинициализация }
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 if LibHandle <> 0 then begin
  stop;
  FreeLibrary(LibHandle);
 end;
...


{ Получение файла речевого синтеза и воспроизведение }
if LibHandle <> 0 then
 totransplay(pansichar(edit2.text))
...


{ Распознать OFFTIME из файла WAV/MP3 }
if LibHandle <> 0 then
 memo1.Lines.Add(recognize_wavmp3('audio.mp3' {'audio.wav'}, 'ru_RU'));
...


{ Визуализация текущего уровня REALTIME }
procedure TForm1.Timer1Timer(Sender: TObject);
var temp: integer;
begin
 temp:= get_soundlevel;
 panel2.Height:= panel1.Height * temp div 100;
 GroupBox1.Caption:= ' TTS to Text (' + format('%d', [temp]) + '%) ';

 // распознать REALTIME по превышению порога с задержкой
 inc(gl_inc);
 if gl_inc > 1000 div timer1.Interval then begin
  gl_inc:= 0;
  memo1.Clear;
  // результаты
  memo1.Lines.Add(recognize);
 end;
end;


{ Задание параметров задержки и порога REALTIME }
set_thresholdlevel_delayoff_ruen(100 - tr.Position, 1000, 'ru_RU');

{ Активация/деактивация голосовго поиска в браузере по-умолчанию }
setvoicesearch(CheckBox2.Checked)
...

Пример вызова и использования голосового поиска из VBS-скрипта:
' подключаем голосовое сопровождение
' при надоедливости голоса speakon = false
Dim Speak
speakon = true ' разрешаем голосовое сопровождение
Set Speak = CreateObject("sapi.spvoice")

' создаем объект DynamicWrapperX
Set Wrap = CreateObject("DynamicWrapperX.2")

' подключаем библиотеки
Wrap.Register "user32.dll", "GetAsyncKeyState", "i=l", "f=s", "r=l"
Wrap.Register "YandexSpeechRecognizeAPI.dll", "start", "i=lls", "f=s", "r=s"
Wrap.Register "YandexSpeechRecognizeAPI.dll", "setvoicesearch", "i=b", "f=s", "r=s"
Wrap.setvoicesearch true
Wrap.start 10, 1000, "ru_RU"

' Информируем пользователя о начале работы
if (speakon = true) then
Speak.Speak "Готов к голосовому поиску."
End if

Do While Wrap.GetAsyncKeyState(27) = "0"
WScript.Sleep 1000 'кол-во миллисекунд
Loop ' завершение цикла

' озвучиваем
if (speakon = true) then
 Speak.Speak "Программа завершена."
End if

ПОРЯДОК ИСПОЛЬЗОВАНИЯ и ОГРАНИЧЕНИЯ
  1. Под Windows 7/8 любой битности (32/64) проведите запуск скрипта 'adminregOS32-64.bat' правой кнопкой мыши от имени Администратора.
  2. Для распознавания OFFTIME речевого фрагмента в аудиофайле формата WAV PCM/MP3 используйте процедуру 'recognize_wavmp3()'.
  3. Для максимального качества распознавания рекомендуется использовать аудиосигнал WAV PCM c дискретизацией 16 кГц и разрядностью 16 бит. Однако следует учитывать, что сервис не принимает файлы более 1 МБ.
  4. Процедуры инициализации потока 'start()' и завершения 'stop()' (без параметров) вызываются однократно в начале и по окончании отслеживания.
  5. Процедура 'set_Thresholdlevel_Delayoff_Ruen()' предназначена для изменения параметров - порогового уровня срабатывания триггера тишины, интервала отслеживания окончания фразы и языка) REALTIME.
  6. Процедура 'recognize()' вернет один или несколько вариантов распознавания отслеживаемой фразы по срабатыванию триггера тишины, отделенных символами переноса CRLF.
  7. Заданный в библиотеке API-ключ доступа к сервису Yandex SpeechKit является тестовым на ограниченное количество запросов в сутки (до 10-ти) и временным (месяц с момента компиляции). Пожалуйста, используйте свой API-ключ, получить который вы можете в кабинете разработчика https://developer.tech.yandex.ru, согласно правил сервиса. Для установки своего API-ключа используйте процедуру 'setkey()' перед вызовом процедуры инициализации потока 'start()'.
  8. Сервис Yandex SpeechKit понимает только русский и турецкий языки (в планах английский).
  9. Процедура речевого синтеза 'totransplay()' автономна и не требует ввода API-ключа, поэтому для ее использования подключать процедуры запуска/останова потока автораспознавания 'start()/stop()' нет необходимости.
  10. Процедура 'setvoicesearch' запускает поиск в Интернете по распознанной фразе, используя установленный по-умолчанию браузер для отображения результатов.

5 комментариев:

  1. Здравствуйте. Заинтересовался проектом яндекса, но с сетевой частью у меня проблемы (ошибка за ошибкой, "bad request"). Осталась ли у вас ваша разработка? Скачать файл не удается, хост не пускает.

    ОтветитьУдалить
    Ответы
    1. Здравствуйте, Unknown.
      Дополнительная ссылка для скачивания библиотеки YandexSpeechRecognizeAPI - https://yadi.sk/d/Y-dfWap4pirmK

      Удалить
    2. Спасибо вам огромное! Всё прекрасно работает! =)
      Если сделаю задуманный проект в целях обучения, то обязательно укажу вас в благодарностях.
      В первый раз я пробовал Microsoft Speech, но не смог найти русскоязычного движка для распознавания. На английском он работал на ура. Было даже немного удобнее, т.к. список слов можно было редактировать в реальном времени. В общем, вы единственный кто подогнал yandexSpeech под objectPascal, по крайней мере публично)

      Удалить
    3. beskorGames, рад был помочь )

      Удалить
  2. Yandex SpeechKit теперь поддерживает - английский, украинский, турецкий и русский языки.

    ОтветитьУдалить

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.