Введение в естественно-интуитивное взаимодействие с компьютером

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

Показывать лекцию целиком

Введение

Презентацию к лекции можно скачать здесь.

"Люди при общении друг с другом не ограничены каким-то одним интерфейсом: мы пишем, говорим, жестикулируем… Компьютеры также должны поддерживать разные способы коммуникаций" (Дэвид Перлмуттер, старший вице-президент 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)

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

Можно выделить два основных направления использования голосовых интерфейсов:

  • задачи, в которых главным образом требуется распознавание речи:
  • простые команды и управление;
  • простой ввод данных (по телефону);
  • диктант;
  • задачи, в которых кроме распознавания речи требуется понимание текста (интерактивный разговор):
  • информационные киоски;
  • диалоговая обработка запросов;
  • интеллектуальные агенты.
  • Основные сложности, возникающие при автоматическом распознавании речи:

  • эффект коартикуляции; (в естественной речи звуки не имеют четких границ, в связи с этим очень сложно определить, где кончается одна фонема и начинается другая, фонемы речи переходят друг в друга плавно и звуковое окружение сильно искажает форму фонемы)(м.б. интересно почитать: [http://lingold.ru/effekt-koartikulyaczii-v-recheobrazovanii, http://habrahabr.ru/post/105512/])
  • необходимость настраивать систему автоматического распознавания речи на каждого оратора отдельно, при этом могут возникать проблемы разнообразия диалектов, а также сложности распознавания речи лиц, говорящих на иностранном языке;
  • свободная речь: присутствие в речи слов-паразитов и слов, не включенных в словарь;
  • необходимость создания модели естественного языка (м.б. интересно почитать: [http://www.textologia.ru/yazikoznanie/teoria-yazikoznania/metod/matematicheskoe-modelirovanie-yazika/1500/?q=641n=1500]);
  • устойчивость к шумам.
  • Возможности систем автоматического распознавания речи характеризуются следующими параметрами:

  • режим речи: может варьироваться от раздельного произношения слов до непрерывной речи;
  • стиль речи: варьируется от чтения текста до спонтанной речи;
  • подстройка: зависимость от оратора – пользователь до работы с системой должен предоставить образцы своей речи для настройки, с другой стороны независимость от оратора не предполагает никаких настроек до использования системы;
  • словарь: набор слов может варьироваться от небольшого объема (< 20 слов) до огромного (> 50000 слов), чем больше словарь или чем больше в нем схожих по звучанию слов, тем сложнее процесс распознавания речи;
  • языковая модель: используется в случае, когда речь представлена в виде последовательности слов, самая простая языковая модель может быть определена как сеть с конечным числом состояний, более сложная, но при этом более близкая к естественному языку модель, описывается в терминах контекстно-зависимых грамматик;
  • перплексивность (степень неопределенности вероятностной модели): популярная мера сложности задачи, объединяющая размер словаря и языковую модель;
  • наконец, существует ряд внешних параметров, которые могут повлиять на производительность системы автоматического распознавания речи, включая характеристики шума окружающей среды, а также размещение и характеристики микрофона.
  • На рис 6.2 представлены основные компоненты системы распознавания речи. Сначала оцифрованный речевой сигнал разбивается на множество фрагментов фиксированного размера, примерно по 10-20 мс каждый. Для каждого фрагмента подбирается наиболее подходящее слово, в процессе подбора учитываются ограничения, накладываемые акустической, лексической и языковой моделями. Для определения (уточнения) значений параметров моделей в процессе распознавания используются обучающие данные.

    (рис 6.2) Основные компоненты системы автоматического распознавания речи (Источник: MIT 6.345 Automatic Speech Recognition)

    Модуль распознавания речи 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();
       }
       ...
    };
    

    По желанию можно переопределить функцию 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 модуль синтезирует каждое предложение независимо и параллельно если позволяет реализация.

    Контрольные вопросы:

  • Как выглядит схема речевого взаимодействия человека и компьютера? На каком этапе может быть использован пакет Intel Perceptual Computing SDK?
  • Подумайте, как могут выглядеть основные направления использования голосовых интерфейсов.
  • Какие сложности возникают в процессе автоматического распознавания речи?
  • По каким признакам, характеризующим основные возможности, можно классифицировать системы автоматического распознавания речи?
  • Каковы основные компоненты любой системы автоматического распознавания речи?
  • Каковы особенности и возможности модуля распознавания речи Intel Perceptual Computing SDK?
  • Что необходимо иметь в виду разработчику использующему модуль распознавания речи?
  • Каковы особенности программирования распознавания речи с использованием класса UtilPipeline и без него?
  • Каковы особенности программирования голосового управления?
  • Каковы особенности программирования синтеза речи?
  • Вернуться к учебному плану