Презентацию к лекции можно скачать здесь.
"Люди при общении друг с другом не ограничены каким-то одним интерфейсом: мы пишем, говорим, жестикулируем… Компьютеры также должны поддерживать разные способы коммуникаций" (Дэвид Перлмуттер, старший вице-президент Intel). Это заявление прозвучало на открытии ежегодного форума для разработчиков Intel Developer Forum в сентябре 2012 года. Тогда же представители Intel показали ноутбук с тестовой версией системы распознавания речи Dragon от одного из лидеров этого рынка – компании Nuance. В ходе демонстрации программа безошибочно распознавала короткие запросы на естественном английском языке, выполняя поиск в Google, запуская проигрывание музыки определенного жанра (по нечеткому запросу вроде "включи мне какой-нибудь рок"), публикуя сообщение в сервисе микроблогов Twitter – и все это без прикосновения пользователя к клавиатуре.
В октябре 2012 года корпорация Intel выпустила тестовую версию бесплатного пакета для разработчиков программ с перцептивными интерфейсами – Intel Perceptual Computing SDK, упрощающего и ускоряющего процесс создания подобных приложений.
Схему речевого взаимодействия человека и компьютера можно изобразить следующим образом – рис 6.1.
Голосовые интерфейсы хорошо подходят для управления информацией и доступа к ней, в случае сложно организованного и открытого информационного пространства, пользователи которого не имеют серьезной подготовки в области взаимодействия с компьютерами. Зачастую взаимодействие с информационной средой возможно только по телефону, в этом случае без голосового управления не обойтись. Использование речевого управления не требует специальной подготовки пользователя и позволяет освободить руки и глаза во время взаимодействия с компьютером.
(рис 6.1) Схема речевого взаимодействия (Источник: MIT 6.345 Automatic Speech Recognition)
Для реализации голосовых интерфейсов используются автоматические системы распознавания речи, такие системы переводят речь, передаваемую по каналам ввода, в текст. В зависимости от целей взаимодействия распознанный текст может являться требуемым результатом, а может служить входной информацией для систем обработки и понимания текстов на естественном языке.
Можно выделить два основных направления использования голосовых интерфейсов:
Основные сложности, возникающие при автоматическом распознавании речи:
Возможности систем автоматического распознавания речи характеризуются следующими параметрами:
На рис 6.2 представлены основные компоненты системы распознавания речи. Сначала оцифрованный речевой сигнал разбивается на множество фрагментов фиксированного размера, примерно по 10-20 мс каждый. Для каждого фрагмента подбирается наиболее подходящее слово, в процессе подбора учитываются ограничения, накладываемые акустической, лексической и языковой моделями. Для определения (уточнения) значений параметров моделей в процессе распознавания используются обучающие данные.
(рис 6.2) Основные компоненты системы автоматического распознавания речи (Источник: MIT 6.345 Automatic Speech Recognition)
Модуль распознавания речи 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. Данный класс обеспечивает простой интерфейс к алгоритмам распознавания жестов, мимики и голоса.
Пример 6.1 демонстрирует создание экземпляра модуля распознавания речи, класс MyVoicePipeline является наследником класса UtilPipeline и в своем конструкторе вызывает функцию EnableVoiceRecognition(), которая открывает приложению возможность распознавания речи.
class MyVoicePipeline: public UtilPipeline {
public:
MyVoicePipeline(PXCSession *session):UtilPipeline(session) {
EnableVoiceRecognition();
}
...
};
По желанию можно переопределить функцию 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;
}
В данном примере переопределенная функция 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;
}
В режиме голосового управления приложение предопределяет список команд, модуль SDK распознает речь, основываясь только на этом списке, и выполняет соответствующее действие.
В случае программирования распознавания речи с помощью класса UtilPipeline используется функция SetVoiceCommands, которая в качестве параметра принимает набор команд, размещенный в переменной типа: std::vector<std::wstring>, поэтому необходимо озаботиться созданием такой переменной перед вызовом функции SetVoiceCommands.
В случае программирования распознавания речи без использования класса UtilPipeline, необходимо сконфигурировать ненулевую грамматику, например, это можно сделать так:
pxcUID gid; rec->CreateGrammar(gid); rec->AddGrammar(gid,1,L"One"); rec->AddGrammar(gid,2,L"Two"); rec->AddGrammar(gid,3,L"Three"); rec->SetGrammar(gid);
После того как список команд задан, можно определить действие, которое должно выполнить приложение в ответ на полученную команду, после успешного распознавания, разумеется.
Процесс программирования синтеза речи предполагает создание экземпляра модуля синтеза речи и передачи данных в него, при разработке приложения можно выделить следующие этапы (начало очень похоже на программирование распознавания речи):
Создание сессии: SDK сессия – ключевой объект любого приложения, использующего SDK, и должен создаваться в первую очередь. Для создания сессии необходимо вызвать функцию PXCSession_Create.
PXCSmartPtr<PXCSession> session; PXCSession_Create(session);
Определение реализации модуля: в приложении используется функция PXCSession::CreateImpl для создания экземпляра интерфейса модуля синтеза речи PXCVoiceSynthesis:
PXCVoiceSynthesis *tts=0; session->CreateImpl<PXCVoiceSynthesis>(tts);
Инициализация модуля: для инициализации модуля используются две функции QueryProfile и SetProfile. Первая функция возвращает доступные конфигурации. Вторая устанавливает текущую активную конфигурацию.
PXCVoiceSynthesis::ProfileInfo profile; tts->QueryProfile(0, profile); tts->SetProfile(profile);
Цикл обработки данных: приложение использует функцию QueueSentence для создания очереди предложений для синтеза, вызывает функцию ProcessAudioAsync для создания аудио буфера, который содержит синтезированную речь и передачи содержимого буфера на любое аудио устройство вывода:
pxcUID sid;
tts->QueueSentence(L"Speak this",10,sid);
PXCSmartPtr<PXCAudio> sample;
PXCSmartSP sp;
for (;;) {
pxcStatus sts=tts-> ProcessAudioAsync(sid,sample,sp);
if (sts<PXC_STATUS_NO_ERROR) break;
sp->Synchronize();
// передать участок синтезированной речи на устройство вывода
}
Приложение может создавать очередь и синтезировать множество предложений. Функция QueueSentence возвращает идентификатор предложения в очереди, который может быть использован приложением в функции ProcessAudioAsync. SDK модуль синтезирует каждое предложение независимо и параллельно если позволяет реализация.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.