Настройка Intel Perceptual Computing SDK для использования с openFrameworks приложениями
Программирование
Разработаем программу, которая:
- отображает фигуру (например, круг) в окне openFramework;
- позволяет с помощью голосовых команд: "up", "down", "right", "left" двигать фигуру в соответствующем направлении.
Пустой проект MyExample содержит три файла: testApp.h, testApp.cpp, main.cpp
Файл main.cpp выполняет запуск приложения и его лучше не менять.
Файл testApp.h содержит объявления необходимых переменных, классов и функций. В этот файл необходимо внести изменения.
Подключим заголовочный файл:
#include "util_pipeline.h"
Добавим в класс testApp объявления методов:
void exit(); void OnVoiceRecognized(PXCVoiceRecognition::Recognition *data);
Дополнительно к классу testApp объявим класс VoiceReco, этот класс является наследником класса UtilPipeline, необходим для взаимодействия с модулем распознавания речи Perceptual Computing SDK:
class VoiceReco; ... class VoiceReco : public UtilPipeline{ private: testApp *of; public: void SetOFApp(testApp *app){ of = app; } void PXCAPI OnRecognized(PXCVoiceRecognition::Recognition *data){ of->OnVoiceRecognized(data); } };
добавить поле
protected: VoiceReco *pipeline;
в класс testApp.
После всех изменений файл testApp.h будет выглядеть следующим образом:
#pragma once #include "ofMain.h" #include "util_pipeline.h" class VoiceReco; class testApp : public ofBaseApp{ public: void setup(); void update(); void draw(); void exit(); void OnVoiceRecognized(PXCVoiceRecognition::Recognition *data); protected: VoiceReco *pipeline; }; class VoiceReco : public UtilPipeline{ private: testApp *of; public: void SetOFApp(testApp *app){ of = app; } void PXCAPI OnRecognized(PXCVoiceRecognition::Recognition *data){ of->OnVoiceRecognized(data); } };
Файл testApp.cpp содержит описание основных функций, чтобы получить требуемую программу в него необходимо внести изменения:
Подключим заголовочный файл:
#include "util_pipeline.h"
Объявим две переменные, которые будут отвечать за положение фигуры на экране, для фигуры круг, положение определяют координаты центра:
int centerX; int centerY;
Напишем реализацию необходимых функций:
Функция setup() вызывается в самом начале жизненного цикла приложения, до появления окна программы, в этой функции обычно задаются все необходимые начальные значения и запускается функция Init() для инициализации конвейера.
void testApp::setup(){ centerX=150; centerY=150; ofSetWindowShape(640,480); ofSetLogLevel(OF_LOG_NOTICE); // создаем список команд, которые будет выполнять приложение vector>lt;wstring> commands; commands.push_back(L>quot;up>quot;); commands.push_back(L>quot;down>quot;); commands.push_back(L>quot;right>quot;); commands.push_back(L>quot;left>quot;); // запускаем PCSDK распознавание речи pipeline = new VoiceReco(); pipeline->SetOFApp(this); // this will allow us to call pipeline->EnableVoiceRecognition(); pipeline->SetVoiceCommands(commands); pipeline->Init(); }
Функции update() и draw() запускаются после функции setup() и выполняются по очереди в цикле, пока программа не закончит работу. По умолчанию эти функции вызываются настолько быстро, насколько позволяет компьютер. Функция update() используется для обновления состояния программы, т.е. изменения значений переменных, функция draw() рисует объекты в окне приложения.
void testApp::update(){ // захватывает аудио и позволяет SDK инициировать событие OnRecognized if(pipeline->AcquireFrame(false)) { pipeline->ReleaseFrame(); } } void testApp::draw(){ //рисование фигуры ofCircle(сenterX,сenterY,25); }
В классе testApp объявлена функция OnVoiceRecognized, в которую в качестве параметра передается переменная типа PXCVoiceRecognition::Recognition, в этой переменной хранится вся информация о захваченной и распознанной речи.
data->label - содержит номер распознанной команды в заданном списке команд
void testApp::OnVoiceRecognized(PXCVoiceRecognition::Recognition *data) { wcout<<data->dictation<<endl; if (data->label==0) { сenterY=сenterY-10; if (сenterY<0) сenterY=ofGetWindowHeight()-25; } if (data->label==1) { сenterY=сenterY+10; if (сenterY>ofGetWindowHeight()) сenterY=25; } if (data->label==2) { сenterX=сenterX+10; if (сenterX>ofGetWindowWidth()) сenterX=25; } if (data->label==3) { сenterX=сenterX-10; if (сenterX<0) сenterX=ofGetWindowWidth()-25; } }
В классе testApp объявлена функция exit, которая определяет действия выполняемые при завершении работы приложения, вызовем функцию Close для закрытия конвейера и освобождения всех ресурсов.
void testApp::exit(){ pipeline->Close(); }
После определения всех вышеперечисленных функций в файле testApp.cpp, можно собрать и запустить приложение. После запуска можно увидеть следующую картинку. Не очень эффектно, но пока нас интересуют простые возможности.
Теперь можно командовать, результаты работы можно увидеть на рисунке 8, кружок передвинулся, в консоли напечатаны голосовые команды, которые распознало и выполнило приложение.
Для ознакомления с основами работы в openFrameworks с нуля хорошо подходит tutorial, размещенный по ссылке: http://www.openframeworks.cc/tutorials/
Набор простых примеров, демонстрирующих возможности Intel Perceptual Computing SDK и взаимодействие с игровыми процессорами и наборами базовых средств разработки: https://github.com/IntelPerceptual/