Спонсор: Intel
Северный (Арктический) федеральный университет им. М.В. Ломоносова
Опубликован: 23.10.2013 | Доступ: свободный | Студентов: 1451 / 463 | Длительность: 09:26:00
Специальности: Программист
Лекция 4:

Распознавание речи в Intel Perceptual Computing SDK

Модуль распознавания речи Intel Perceptual Computing SDK: основные возможности

Модуль распознавания речи Intel Perceptual Computing SDK поддерживает режим голосового управления и режим диктанта, в том и в другом случае предполагается распознавание речи. В режиме голосового управления приложение предопределяет список команд, модуль SDK распознает речь, основываясь только на этом списке, и выполняет соответствующее действие. В режиме диктанта SDK модуль распознает "на слух" короткие предложения (<30 секунд), результат работы модуля этом режиме – предложение наиболее похожее на то, которое было продиктовано.

Для попыток реализации полноценного общения с компьютером модуль распознавания речи обладает способностью распознавать печатный текст и озвучивать его.

В настоящее время модуль распознавания речи поддерживает английский, немецкий, французский, испанский, китайский, португальский, японский языки, разработчики планируют добавлять возможность работы с другими языками, в том числе и с русским.

Модуль распознавания речи основан на Nuance* Dragon Assistant: Nuance* Voice Command and Controlраспознавание в пределах списка предопределенных команд; Nuance* Voice Dictation – распознавание коротких предложений (<30 секунд); Nuance* Voice Synthesis – озвучивание печатного текста (короткие предложения).

Разработчикам, включающим в свои приложения возможности распознавания речи, голосовых команд и синтеза речи, необходимо иметь в виду, что на системе, в которой будет исполняться приложение, должен быть установлен Nuance* Dragon Assistant Core, который содержит процессор (движок) распознавания речи и языковой пакет. Кроме того, необходимо помнить о том, что включение Nuance* Dragon Assistant Core ограничивается только целями разработки (как описано в EULA) и не позволяет разработчикам распространять приложение для внешнего пользования.

В качестве требований к аппаратному обеспечению, необходимому для работы приложений, которые используют модуль распознавания речи SDK, можно указать обязательное наличие микрофона, лучше, хотя не обязательно, если это будут двунаправленные микрофоны, такие как, например, микрофоны камеры Creative* Interactive Gesture Camera.

Подробнее об аппаратных и программных требованиях, а также о возможности использования модуля распознавания речи в коммерческих приложениях можно прочитать здесь [http://software.intel.com/en-us/articles/perc-faq#].

Программирование распознавания речи, класс UtilPipeline

Самый простой способ программирования распознавания речи заключается в использовании класса UtilPipeline. Данный класс обеспечивает простой интерфейс к алгоритмам распознавания жестов, мимики и голоса.

Пример 6.1 демонстрирует создание экземпляра модуля распознавания речи, класс MyVoicePipeline является наследником класса UtilPipeline и в своем конструкторе вызывает функцию EnableVoiceRecognition(), которая открывает приложению возможность распознавания речи.

class MyVoicePipeline: public UtilPipeline {
public:
   MyVoicePipeline(PXCSession *session):UtilPipeline(session) {
       EnableVoiceRecognition();
   }
   ...
};
6.1. Создание экземпляра модуля распознавания речи

По желанию можно переопределить функцию OnVoiceRecognitionSetup для тонкой настройки параметров при инициализации модуля. В приложении необходимо переопределить функцию OnRecognized для получения событий распознавания, а также можно переопределить функцию OnAlert для получения сигналов предупреждения.

Пример 6.2 демонстрирует законченное приложение, которое распознает текст в режиме диктанта и печатает то, что удалось распознать.

#include "stdafx.h"
#include "util_pipeline.h"
class MyVoicePipeline: public UtilPipeline {
	public:
		MyVoicePipeline(PXCSession *session=0):UtilPipeline(session) {
			EnableVoiceRecognition();
		}
		virtual void PXCAPI 
			OnRecognized(PXCVoiceRecognition::Recognition *data) {
				wprintf_s(L"Recognized<%s>\n",data->dictation);
			}
};
int _tmain(int argc, _TCHAR* argv[]) {
	MyVoicePipeline pp;
	pp.LoopFrames();
	return 0;
}
6.2. Простое приложение распознавания речи в режиме диктанта с использованием класса UtilPipeline

В данном примере переопределенная функция OnRecognized печатает результаты распознавания. После создания экземпляра класса MyVoicePipeline вызывается функция LoopFrames, которая инициализирует конвейер распознавания речи и направляет данные с входного устройства (микрофон компьютера или камеры) в модуль распознавания речи.

Процесс программирования распознавания речи

Рассмотрим другой способ программирования распознавания речи. Порядок работы в этом случае состоит из нескольких этапов:

Создание сессии: SDK сессия – ключевой объект любого приложения, использующего SDK, и должен создаваться в первую очередь. Для создания сессии необходимо вызвать функцию PXCSession_Create.

PXCSmartPtr<PXCSession> session; 
PXCSession_Create(&session);

Задание реализации модуля: для создания экземпляра модуля используется функция PXCSession::CreateImpl<Y>(&y) при этом создается экземпляр интерфейса Y и присваивается переменной y. В нашем случае для создания реализации модуля распознавания речи PXCVoiceRecognition, достаточно написать следующие две строки кода:

PXCVoiceRecognition *vrec=0;
session->CreateImpl<PXCVoiceRecognition>(&vrec);

Инициализация модуля: для инициализации модуля используются две функции QueryProfile и SetProfile. Первая функция возвращает доступные конфигурации. Вторая устанавливает текущую активную конфигурацию. В представленном ниже коде приложение запрашивает первую доступную конфигурацию, использует ее для определения входного устройства, которое может предоставлять данные, и инициализирует модуль в соответствии с конфигурацией. Заметим, что требования входного модуля определяются как часть ProfileInfo структуры. Класс UtilCapture определяет входное устройство, которое согласуется с требованиями данных модуля.

PXCVoiceRecognition::ProfileInfo pinfo;
vrec->QueryProfile(0,&pinfo);
UtilCapture capture(&session);
capture.LocateStreams(&pinfo.inputs);
vrec->SetProfile(&pinfo);

Инициализация грамматики: для поддержки возможности диктанта приложение вызывает функцию SetGrammar с параметром gid==0, которая устанавливает модуль распознавания речи в режим диктанта. Для поддержки голосового управления приложение создает один или более грамматических контекстов следующим образом:

  • Функция CreateGrammar создает пустую грамматику и возвращает идентификатор.
  • Приложение может вызвать функцию AddGrammar много раз для добавления слов в грамматику.

Приложение использует функцию SetGrammar для активации грамматического контекста. Приложение может активировать любую скомпилированную грамматику много раз. Приведенный ниже код конфигурирует список слов "One", "Two" и "Three".

pxcUID gid;
vrec->CreateGrammar(&gid);
vrec->AddGrammar(gid,1,L"One");
vrec->AddGrammar(gid,2,L"Two");
vrec->AddGrammar(gid,3,L"Three");
vrec->SetGrammar(gid);

Обработка событий: приложение реализует обработчик событий Handler и отслеживает появление события распознавания, используя функцию SubcribeRecognition,

class MyHandler: public   
	PXCVoiceRecognition::Recognition::Handler {
		public:
		virtual void PXCAPI       
	OnRecognized(PXCVoiceRecognition::Recognition *data) 
	{
		// обработка распознавания данных
	}
};
...
vrec->SubscribeRecognition(0,new MyHandler);

SDK модуль распознавания вызывает функцию-обработчик события на каждое успешное событие распознавания. Так как распознавание речи требует времени (в среднем 1-2 секунды на слово или 10-15 секунд на предложение в зависимости от скорости речи), во время обработки участков речевого потока сообщения о событиях появляются асинхронно. Приложение должно поддерживать жизненный цикл функции-обработчика до тех пор, пока приложение не удалит экземпляр SDK модуля.

При желании приложение может реализовывать обработчик аварийных событий Alert::Handler и отслеживать появление любых аварийных событий.

Цикл обработки данных: в цикле приложение проходит по участкам речевого потока с входного устройства для модуля распознавания речи, вызывает функцию ProcessAudioAsync для передачи участков речи, следующий код демонстрирует этот процесс:

PXCSmartPtr<PXCAudio> sample;
PXCSmartSPArray sps(2);
for (;;) {
//получить участки речи с входного устройства и передать 
в модуль capture.ReadStreamAsync(sample.ReleaseRef(),sps.ReleaseRef(0));
vrec->ProcessAudioAsync(sample,sps.ReleaseRef(1));
sps.SynchronizeEx();
}

Приложение может вызвать функцию ProcessAudioAsync с NULL указателем для остановки аудио обработки. Для возобновления выполнения программы просто перезапустите передачу участков речи.

Собрав все части описанного процесса программирования распознавания речи, получим приложение, представленное в примере 6.3.

#include "stdafx.h"
#include "pxcvoice.h"
#include "util_capture_file.h"

// обработчик событий распознавания
class MyHandler : public 
PXCVoiceRecognition::Recognition::Handler{
public:
  virtual void PXCAPI 
OnRecognized(PXCVoiceRecognition::Recognition *data) {
    wprintf_s(L"\nRecognized: <%s>, data->dictation);   
  }
};

int wmain(int argc, wchar_t* argv[]){

  //создание сессии
  PXCSmartPtr<PXCSession> session; 
  PXCSession_Create(&session);

  //задание реализации модуля
  PXCVoiceRecognition *vrec=0;
  session->CreateImpl<PXCVoiceRecognition>(&vrec);

  //инициализация модуля
  PXCVoiceRecognition::ProfileInfo pinfo;
  vrec->QueryProfile(0,&pinfo);
  UtilCapture capture(session);
  capture.LocateStreams(&pinfo.inputs);
  vrec->SetProfile(&pinfo);

  //инициализация грамматики
  pxcUID gid = 0;
  vrec->SetGrammar(gid);

vrec->SubscribeRecognition(0, new MyHandler);

  //Цикл обработки данных модуля распознавания речи
  PXCSmartPtr<PXCAudio> sample;
  PXCSmartSPArray sps(2);
  for (;;) {
capture.ReadStreamAsync(sample.ReleaseRef(),sps.ReleaseRef(0));
   vrec->ProcessAudioAsync(sample,sps.ReleaseRef(1));
   sps.SynchronizeEx();
  }
  return 0;
}
6.3. Простое приложение распознавания речи в режиме диктанта
Гульзия Калымова
Гульзия Калымова
Александр Радченко
Александр Радченко