Блог Сергея Байдачного

Мой блог о технологиях

Распознавание и обработка речи (часть 1)

2 комментария

 

Я всегда скептически относился к голосовым возможностям устройств. Я просто не верил в том, что они могут достаточно хорошо работать, чтобы удовлетворить мои потребности. При этом, проводя много времени за рулем мне всегда не хватало возможности быстрого набора номера из моей адресной книги в несколько сотен контактов или быстрого запуска каких-то приложений. Ведь вход в меню, поиск по нескольким символам и выбор действия, требуют многих нажатий на экране и крайне нежелательны во время движения. Сейчас я понимаю, что излишний скептицизм мне успел здорово навредить, ведь функционал, позволяющий выполнять голосовой набор номера или запустить отдельное приложение был еще в Windows Phone 7. Нужно было только попробовать. А вот попробовав, мне уже сложно отказаться от этой возможности, ведь несмотря на то, что контакты и приложения в моем устройстве используют как латиницу, так и кириллицу, все работает просто замечательно.

Если Вы еще не пробовали голосовые возможности, то сделайте это, но прежде проверьте настройки Вашего устройства. Для этого перейдите в раздел Settings (Настройки) -> Speech (Голосовые функции) и выберите язык голосовых функций и другие параметры:

image

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

Параметр Play audio confirmation позволяет включить или выключить оповещения о действие, которое сейчас выполняется. Так, после отправки голосовой команды у пользователя есть пару секунд перед тем, как действие будет выполнено. За это время можно успеть отменить операцию, нажав кнопку Cancel.

image

Подобное поведение необходимо, если все же голос был распознан неверно, а звонить в 3 часа ночи своему начальнику Вы все же не хотели. Голосовое оповещение о действии позволяет не смотреть на экран каждый раз, когда пользователь отправляет команду, а послушать о текущем действии и, в случае необходимости, отменить его.

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

Последний параметр Enable Speech Recognition Service позволяет включить возможности распознавания голоса в приложениях. Тут ситуация, аналогичная определению местоположения – пользователь может запретить функции распознавания голоса в приложениях. Включая эту функциональность пользователь соглашается с тем, что Microsoft может собирать информацию о запросах пользователя для улучшения словаря и других функций распознавания.

Наконец, когда все настройки сделаны, можно попытаться отправить команду устройству. Для этого на пару секунд следует зажать аппаратную кнопку Start на лицевой панели телефона, что приведет к вызову диалогового окна, позволяющего слушать пользователя и распознавать команды:

image

Тут можно сказать одну из стандартных команд, таких как «Позвонить….», «Запустить…» или вызвать одну из команд, которые декларируют другие приложения. Чтобы увидеть все команды нажмите на вопросительный знак в вернем правом углу окна или произнесите «Что я могу сказать».

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

Голосовые команды

Любое приложение, которое присутствует на телефоне пользователя, может быть запущено с помощью голосовой команды «Запустить <имя приложения>». Но тут есть несколько нюансов. Во-первых, имя приложения может быть плохо читаемым или слишком сложным для произношения. Во-вторых, стандартная команда позволяет запустить приложение без каких-либо параметров. Поэтому, одной из первых задач, актуальной для многих приложений, является необходимость определения команд, которые можно использовать для запуска приложения.

Итак, чтобы определить свои команды для приложения, первым делом нужно задекларировать несколько возможностей, это ID_CAP_NETWORKING, ID_CAP_MICROPHONE, ID_CAP_SPEECH_RECOGNITION:

<Capabilities>
  <Capability Name="ID_CAP_NETWORKING" />
  <Capability Name="ID_CAP_MICROPHONE" />
  <Capability Name="ID_CAP_SPEECH_RECOGNITION" />
</Capabilities>

 

Данные возможности можно задекларировать и в графическом редакторе манифеста. Первая декларация необходима для передачи данных по сети в службу Microsoft для оптимизации службы поиска (не уверен, что тут это используется, но…), вторая – для реализации доступа к микрофону и третья – для активации механизма распознавания голоса.

Включив все необходимые возможности, переходим к описанию команд. Это можно сделать в XML файле. Чтобы не искать структуру этого файла в документации, достаточно воспользоваться готовым шаблонов в Visual Studio. Просто создайте новый элемент на основе шаблона Voice Command Definition:

image

В результате будет создан вот такой файл, который мы рассмотрим сейчас детально:

<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.0">
  <CommandSet xml:lang="en-US">
    <CommandPrefix>Contoso Rodeo</CommandPrefix>
    <Example> play a new game </Example>

    <Command Name="PlayGame">
      <Example> play a new game </Example>
      <ListenFor> [and] play [a] new game </ListenFor>
      <ListenFor> [and] start [a] new game </ListenFor>
      <Feedback> Starting a new game... </Feedback>
      <Navigate />
    </Command>

    <Command Name="PlayLevel">
      <Example> replay level two </Example>
      <ListenFor> replay level {number} </ListenFor>
      <Feedback> Going to level {number}... </Feedback>
      <Navigate />
    </Command>

    <Command Name="PlayUnknownLevel">
      <Example> replay level two </Example>
      <ListenFor> [and] replay level {*} </ListenFor>
      <Feedback> Unknown level; going to level selection... </Feedback>
      <Navigate Target="LevelSelect.xaml" />
    </Command>

    <PhraseList Label="number">
      <Item> one </Item>
      <Item> two </Item>
      <Item> three </Item>
    </PhraseList>

  </CommandSet>
</VoiceCommands>

 

Тут все команды разбиты на множества, описывающиеся с помощью элемента CommandSet. Как Вы видите, атрибутом CommandSet является xml:lang, который определяет язык данного множества команд. Если Вы пишите интернациональное приложение, то наверняка включите поддержку для нескольких языков, перечислив для каждого из них свое множество команд.

Следующий важный элемент, это CommandPrefix, который задает команду для запуска приложения. Обычно тут указывается произносимое для пользователя имя приложения, но фактически это аналог команды, которая заменяет стандартную «Запустить <имя приложения>».

Все элементы Example внутри файла носят информативный характер и отображаются пользователю в подсказке или окне помощи.

Наконец, чтобы передать приложению параметры в XML задается набор элементов типа Command. Именно эти элементы расширяют стандартную команду, описанную в CommandPrefix и позволяют пользователю перевести приложение в нужное ему состояние. Например, если Вы пишите приложение для отображения телепрограммы, то его можно запустить по команде «Телепрограмма» или «Телепрограмма на Первом», чтобы открыть список каналов или программу для конкретного канала. Тут три основных элемента, это ListenFor, Feedback и Navigate.

Первый элемент задает часть фразы, которая приводит к выполнению этой команды. Поскольку одну и ту же команду можно произнести по разному, то в одной команде может быть несколько ListenFor элементов, а части фраз, которых может не быть в команде (все зависит от стиля пользователя), размещают в квадратные скобки. Например, можно сказать «Телепрограмма на Первый» или «Телепрограмма сегодня на Первый» или «Телепрограмма Первый» (можно еще и со склонениями играться).

Элемент Feedback задает ту информацию, которая будет отображаться пользователю при выполнении распознанной команды. Наконец, элемент Navigate позволяет задать альтернативную точку входа приложения в отличии от той, которая прописана в манифесте. Обычно этот элемент остается пустым, но возможность есть.

Если вернуться к той же телепрограмме, то каналов, которые поддерживает приложение, может быть достаточно много. Естественно, что в данном случае логично задать какой-то шаблон. Для этого используются фигурные скобки, в которых содержится имя списка с возможным набором слов, подставляемых в шаблон. В файле по умолчанию это шаблон name, описываемый элементом PhraseList, со списком уровней. В случае с телепрограммой, это будет список каналов. В фигурных скобках можно указывать и звездочку {*}, что означает подстановку любой фразы. Обычно {*} используют в команде, которая идет следом за командой, ссылающейся на PhraseList, чтобы обеспечить реакцию приложения в ответ на команду, которая не описывается в предопределенном списке.

Элемент PhraseList еще интересен тем, что его не имеет смысл задавать заранее (если у Вас много фраз), а можно заполнить динамически.

Давайте рассмотрим пример на основе приложения для отображения Телепрограммы. Вот как может выглядеть XML файл:

<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.0">
  <CommandSet xml:lang="ru-RU" Name="ru-RU">
    <CommandPrefix>Телепрограмма</CommandPrefix>
    <Example>Телепрограмма</Example>

    <Command Name="ChannelsComm">
      <Example>на Первый</Example>
      <ListenFor> [сегодня] [на] {channels} </ListenFor>
      <Feedback> Телепрограмма на {channels} открывается... </Feedback>
      <Navigate />
    </Command>

    <PhraseList Label="channels">
      <Item>Первый</Item>
    </PhraseList>

  </CommandSet>
</VoiceCommands>

 

Как Вы видите, тут указана поддержка русского языка, а приложению назначается более пристойное имя чем в оригинале (у меня это PhoneApp 9J). Теперь приложение можно запустить, сказав «Запустить Телепрограмма» или «Телепрограмма на Первый» и т. д. Но, прежде чем это начнет работать, необходимо инициализировать этот файл. Это можно сделать при первом запуске приложения с помощью класса VoiceCommandService, который содержит метод InstallCommandSetsFromFileAsync, позволяющем инициализировать команды из XML. Вот как может выглядеть метод, выполняющий инициализацию:

private async void InitVoiceCommands()
{
    if (VoiceCommandService.InstalledCommandSets.Count == 0)
    {
        await VoiceCommandService.InstallCommandSetsFromFileAsync(
           new Uri("ms-appx:///MyVoiceCommand.xml"));
    }
}

 

Тут я также проверил, не были ли инициализированы команды ранее, чтобы не выполнять лишнюю работу во время второго и последующих запусков приложения. Метод можно вызвать из InitializePhoneApplication, который в свою очередь вызывается из конструктора класса App в файле App.xaml.cs.

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

Чтобы заполнить коллекцию фраз можно воспользоваться следующим куском кода:

await VoiceCommandService.InstalledCommandSets["ru-RU"].UpdatePhraseListAsync(
      "channels", new List<string>() { "Первый", "Новый", "Интер" });

 

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

Наконец, подготовительная работа закончена, осталось дождаться команды пользователя и верно ее обработать. Но тут уже все просто. Достаточно описать метод OnNavigatedTo на тех страницах, куда ведут Ваши команды и использовать класс NavigationService для получения строки запроса (QueryString).

image

Как видно из рисунка выше (я поставил точку останова при отладке в методе OnNavigatedTo), в случае запуска приложения с помощью одной из команд, QueryString содержит несколько параметров. Обязательным является voiceCommandName, который содержит имя команды. Параметр reco содержит текст, который был распознан при отправке команды пользователю на основе заданного шаблона, а параметр channels содержит фразу. Этих данных вполне хватит, чтобы принять решение о дальнейшем поведении приложения.

Реклама

Written by Sergiy Baydachnyy

18.12.2012 в 17:57

Опубликовано в Windows Phone

Tagged with

комментария 2

Subscribe to comments with RSS.

  1. Спасибо! Открыли для меня новую функцию возможность)

    Arthur Lazarev

    18.12.2012 at 20:16

  2. Быстро и бесплатно найти партнеров по бизнесу и новых клиентов для Вашей фирмы!

    Предлагаем базы данных фирм России, Украины, Белоруссии и Казахстана по СИМВОЛИЧЕСКИМ ЦЕНАМ!

    Для заказа баз данных фирм писать ТОЛЬКО на эту почту: baza-gorodov(собака)yandex.ru

    БАЗЫ ВСЕГДА ТОЛЬКО ЧТО СОБРАННЫЕ — ВСЕГДА НОВЫЕ !!!

    Спектр применения баз фирм очень широк:

    1. Вы можете использовать их для обзвона потенциальных клиентов
    2. для рассылки писем по email
    3. для смс — рассылки
    4. Для почтовой рассылки на юридические адреса фирм
    5. Для поиска партнеров и новых клиентов в социальных сетях на страничках фирм
    6. Для написания Вашего предложения на сайтах фирм и т.д.

    Стоимость базы фирм 1 города — от 700 до 1200 рублей! По стране 1 вид деятельности — 2000 рублей!

    Все данные юрлиц содержат подробную информацию, разбитую по разделам, подразделам и рубрикам!

    В базах есть (формат Ексель): страна, регион, населенный пункт, адрес, телефон, email, сайт, город, (разделы и рубрики для выбора по фильтру),
    а так же странички или группы соцсетей фирм: ВК, Твиттер, Фейсбук, ОД

    Для заказа баз данных фирм писать ТОЛЬКО на эту почту: baza-gorodov(собака)yandex.ru

    Измайлов Антон

    15.03.2016 at 05:50


Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: