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

Разработка приложения c использованием модуля распознавания голоса пакета Intel Perceptual Computing SDK

< Лекция 4 || Самостоятельная работа 3: 12 || Лекция 5 >

Разработка приложений

Для работы приложений, распознающих речь, необходимо наличие микрофона, лучше, если это будут микрофоны камеры Creative Interactive Gesture Camera. Если камеры нет, необходимо убедиться в том, что микрофон используемого компьютера: во-первых, в наличии, во-вторых, включен, в-третьих, работает.

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

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

Первый способ предполагает использование класса UtilPipeline, приложение, реализующее программирование распознавания речи с использованием этого класса, предложено в примере 2 "Распознавание речи в Intel Perceptual Computing SDK" (Лекция 6 - Модуль распознавания речи Intel Perceptual Computing SDK).

Задание 1: Создайте проект в Visual Studio, настройте его на использование Intel Perceptual Computing SDK, скопируйте код из примера 2, запустите приложение.

Второй способ не предполагает использования класса UtilPipeline, реализует более сложный в программировании, но при этом более тонко настраиваемый путь. Приложение, реализующее этот способ, предложено в примере 3 "Распознавание речи в Intel Perceptual Computing SDK" .

Задание 2: Создайте проект в Visual Studio, настройте его на использование Intel Perceptual Computing SDK, скопируйте код из примера 3, запустите приложение.

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

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

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

L"One", L"Two", L"Three"

(можно любые другие)

Тип вектора std::vector<std::wstring>.

Задание 3: создайте приложение, реализующее командный режим, за основу можно взять приложение из задания 1. Приложение должно распознавать команду из списка команд и выполнять соответствующее распознанной команде действие. Действия определяются на усмотрение разработчика, простейший пример, который при распознавании команды всего лишь печатает на консоль ее имя приведено в примере 1 приложения к лабораторной работе.

В случае программирования без использования класса UtilPipeline. Список команд определяется в процессе инициализации грамматики (описан в лекции).

Задание 4: создайте приложение, реализующее командный режим, за основу можно взять приложение из задания 2. Приложение должно распознавать команду из списка команд и выполнять соответствующее распознанной команде действие. Действия определяются на усмотрение разработчика, простейший пример, который при распознавании команды всего лишь печатает на консоль ее номер в списке приведено в примере 2 приложения к лабораторной работе.

Задание 5: найдите в папке $(PCSDK)/sample приложение voice_recognition, ознакомьтесь с его кодом и посмотрите на результаты работы.

3. Cинтез речи.

Задание 6: найдите в папке $(PCSDK)/sample приложение voice_synthesis, ознакомьтесь с его кодом и посмотрите на результаты работы.

4. Предлагаются проекты для самостоятельной разработки:

Задание 7: Объединение распознавания речи и синтеза речи. Разработайте приложение "Эхо", которое распознает речь в режиме диктанта, а потом результаты распознавания озвучивает.

Задание 8: Объединение распознавания жестов и синтеза речи. Разработайте приложение "Сурдоперевод", необходимо назначить жестам буквы (слова, фразы), распознать жесты, получить текст и озвучить его.

Приложение:

#include "stdafx.h" 
#include "util_pipeline.h" 

// массив команд
static std::wstring comms[3]={L"One",L"Two",L"Three"};
 
//объявление вектора, который будет передаваться в функцию //SetVoiceCommands
static std::vector<std::wstring> commands;

class MyPipeline: public UtilPipeline { 
public: 
MyPipeline(PXCSession *session=0):UtilPipeline(session) { 
  EnableVoiceRecognition(); 
  SetVoiceCommands(commands); 
} 

virtual void PXCAPI OnRecognized(PXCVoiceRecognition::Recognition *data) 
{ 
  //печать распознанной команды
  wprintf_s(L"Recognized<%s>\n", commands[data->label].c_str()); 
} 

// функция, печатающая заданный список команд
void printCmds(){
  for (int i=0;i<(int)m_cmds.size();i++) {
    wprintf_s(L"%s ",m_cmds[i].c_str());
  }
/*
  std::vector<std::wstring>::iterator 
    the_iterator = m_cmds.begin();
  while (the_iterator != m_cmds.end()) {
    wprintf_s(L"%d ",*the_iterator);
  }
*/
}
};

int _tmain(int argc, _TCHAR* argv[]) { 
    //создание вектора, содержащего список команд
    for(int i=0;i<3;i++){
     commands.push_back(comms[i]);
    }
    MyPipeline pp; 
    pp.printCmds();
    pp.LoopFrames(); 
    return 0; 
}
Листинг 1. Программирование командного режима распознавания речи с использованием класса UtilPipeline
#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: <%d>", data->label);   
    }
};

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->CreateGrammar(&gid);
  vrec->AddGrammar(gid,1,L"One");
  vrec->AddGrammar(gid,2,L"Two");
  vrec->AddGrammar(gid,3,L"Three");
  vrec->SetGrammar(gid);

  vrec->SubscribeRecognition(0, new MyHandler); 
  
  //Цикл обработки данных модуля распознавания речи
  PXCSmartPtr<PXCAudio> sample;
  PXCSmartSPArray sps(2);
  for(;;) {
   // Get samples from input device and pass to the module
 capture.ReadStreamAsync(sample.ReleaseRef(),sps.ReleaseRef(0));
   vrec->ProcessAudioAsync(sample,sps.ReleaseRef(1));
   sps.SynchronizeEx();
  }
   return 0;

}
Листинг 2. Программирование командного режима распознавания речи без использования класса UtilPipeline
< Лекция 4 || Самостоятельная работа 3: 12 || Лекция 5 >
Гульзия Калымова
Гульзия Калымова
Александр Радченко
Александр Радченко