вторник, 4 ноября 2014 г.

Интерактивный голосовой автопереводчик. Описание API вызова библиотеки SpeechTranslateSpeech.DLL

Данная библиотека (далее DLL) предназначена для голосового интерактивного перевода речевых фраз и предложений OFFTIME или REALTIME в автоматическом режиме, по задаваемым пользователем пороговому уровню, языку оригинала, языку перевода и задержке отслеживания окончания фразы (триггера "тишины"). Функционал интерактивного перевода включает: авто-отслеживание голоса, распознавание, перевод и озвучивание на языке перевода. Расширенная версия библиотеки позволяет перенаправлять речевой аудиопоток на заданное аудиоустройство, которое является входом по-умолчанию для VoIP-приложения. Для реализации данного режима потребуется с помощью VAC (Virtual Audio Cable) создать следующую цепочку: голосовой переводчик/виртуальный выход/виртуальный вход/VoIP-приложение. Два таких голосовых переводчика, установленных у двоих разноязычных абонентов, позволяют общаться им друг с другом на своих родных языках в псевдо- REALTIME.



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

Таблица расшифровок параметров экспортируемой процедуры OFFTIME-распознавания Recognize_Flac():

 

Таблица расшифровок параметров экспортируемой процедуры REALTIME-распознавания Recognize():



Таблица расшифровок параметров экспортируемой процедуры Start():


Таблица расшифровок параметров экспортируемой процедуры Set_Thresholdlevel_Delayoff_Ruen():

 

Таблица расшифровок параметров экспортируемой функции Get_SoundLevel():


Пример динамического подключения (Delphi 6/7/2006/2009/2010/TDL/XE5-7):
var

  get_soundlevel: function: integer; stdcall;        // текущий уровень громкости
  recognize     : procedure(var
                            full_answer_google,          // полная строка ответа от сервиса
                            recognize_flag,                 // признак распознавания
                            recognize_text: pansichar;  // распознанный текст
                            var
                            recognize_accuracy: integer // достоверность распознавания, %
                            ); stdcall;
  recognize_flac: procedure(filename,                 // путь-имя файла для распознавания
                            myLang,                         // язык распознавания
                            toLang: pansichar;            // язык перевода
                            var
                            full_answer_google,          // полная строка ответа от сервиса
                            recognize_flag,                 // признак распознавания
                            recognize_text: pansichar;  // распознанный текст
                            var
                            recognize_accuracy: integer // достоверность распознавания, %
                            ); stdcall;
  start         : procedure(threshold_level,            // уровень порога срабатывания, %
                            delay_off:                         // задержка отключения, мс
                            integer;
                            myLang,                         // язык распознавания
                            toLang:                          // язык перевода
                            pansichar); stdcall;
  stop          : procedure; stdcall;
  set_thresholdlevel_delayoff_ruen: procedure(threshold_level, // уровень порога срабатывания, %
                                              delay_off:       // задержка отключения, мс
                                              integer;
                                              myLang,          // язык распознавания
                                              toLang:          // язык перевода
                                              pansichar); stdcall;


  LibHandle: THandle;


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

{ инициализация }
begin
 LibHandle:= LoadLibrary('test\SpeechTranslateSpeech.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_flac:= LinkProc('recognize_flac');
 end;

 start(100 - tr.Position, 1000, 'ru', 'de');
...

{ деинициализация }
begin
 stop;
 FreeLibrary(LibHandle)
...

{ примеры вызова }

// распознать OFFTIME из файла FLAC
var full_answer_google,          // полная строка ответа от сервиса
    recognize_flag,              // признак распознавания
    recognize_text: pansichar;   // распознанный текст
    recognize_accuracy: integer; // достоверность распознавания, %
begin
 memo1.Clear;

 recognize_flac('audio.flac',
                'ru',
                'it',
                full_answer_google,
                recognize_flag,
                recognize_text,
                recognize_accuracy);

 // результаты
 memo1.Lines.Add(recognize_flag);
 memo1.Lines.Add('Текст: ' + recognize_text);
 memo1.Lines.Add(format('Достоверность: %d', [recognize_accuracy]) + '%');
 memo1.Lines.Add('');
 memo1.Lines.Add(full_answer_google);
...

// визуализация текущего уровня REALTIME (по таймеру или в потоке)
var temp: integer;
    full_answer_google,          // полная строка ответа от сервиса
    recognize_flag,              // признак распознавания
    recognize_text: pansichar;   // распознанный текст
    recognize_accuracy: integer; // достоверность распознавания, %
begin
 temp:= get_soundlevel;
 panel2.Height:= panel1.Height * temp div 100;
 label1.Caption:= format('%d', [temp]) + '%';

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

  full_answer_google:= '';
  recognize(full_answer_google,
            recognize_flag,
            recognize_text,
            recognize_accuracy);

  // результаты
  memo1.Lines.Add(recognize_flag);
  memo1.Lines.Add('Текст: ' + recognize_text);
  memo1.Lines.Add(format('Достоверность: %d', [recognize_accuracy]) + '%');
  memo1.Lines.Add('');
  memo1.Lines.Add(full_answer_google);
 end;
...

// задание параметров задержки и порога REALTIME
set_thresholdlevel_delayoff_ruen(20 {%}, 1000 {мс}, 'ru', 'it')
...
Пример инициализации из под VBS (автораспознавание на русском, перевод на итальянский и речевой синтез на итальянском):
' RunSpeechTranslateSpeech.VBS
' Запуск интерактивного переводчика
' Разработчик: Бадло Сергей Григорьевич
' H-page: http://raxp.radioliga.com
' Ограничения: Win OS 32 bit
' регистрируем COM объект DynamicWrapperX в тихом режиме
Dim WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run ("regsvr32.exe dynwrapx.dll /s"),3, true

' создаем объект DynamicWrapperX
Set Wrap = CreateObject("DynamicWrapperX")
Wrap.Register "SpeechTranslateSpeech.dll", "start", "i=llss", "f=s", "r=s"

' инициализация голосового перевода
res = Wrap.start(20, 1000, "ru", "it")

' бесконечный цикл
Do
WScript.Sleep 1000 'кол-во миллисекунд
Loop

ПОРЯДОК ИСПОЛЬЗОВАНИЯ
  1. Для распознавания OFFTIME речевого фрагмента в формате FLAC используйте процедуру Recognize_Flac().
  2. Процедуры инициализации Start() и завершения Stop (без параметров) вызываются однократно в начале и окончании использования.
  3. Процедура Set_Thresholdlevel_Delayoff_Ruen() предназначена для изменения параметров (порогового уровня срабатывания триггера тишины, интервала отслеживания окончания фразы, языка распознавания и перевода-озвучивания) REALTIME.
  4. Процедура Recognize() вернет результаты распознавания отслеживаемой фразы по срабатыванию триггера тишины.
  5. На Windows Vista/7/8/8.1 (32/64 bit) запускать 'regdynwrapx.bat' правой кнопкой мыши от имени Администратора.
  6. В случае недействительности текущего Google API-ключа доступа следует установить новый перед вызовом процедуры инициализации потока Start().

3 комментария:

  1. В связи с нововведениями Google библиотека обновлена.

    ОтветитьУдалить
  2. В связи с изменениями Google TTS API произведено обновление библиотеки 'SpeechTranslateSpeech.DLL'. Ссылка для скачивания прежняя.

    ОтветитьУдалить
  3. Прошло два года с момента создания моего переводчика с голоса в голос, в Skype появился синхронный переводчик - Skype Translator )

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

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