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

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

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

with one comment

Последняя, но немаловажная часть Speech API – распознавание речи. Тут 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>

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

SpeechRecognizerInformation info = null;

if ((from item in InstalledSpeechRecognizers.All
     where item.Language.Contains("ru")
     select item).Count() > 0)
{
    info = (from item in InstalledSpeechRecognizers.All
            where item.Language.Contains("ru")
            select item).First();
}

 

Как только мы убедились в том, что язык существует и доступен, можно переходить к инициализации объектов по распознаванию речи. Windows Phone 8 предлагает два класса, которые могут реализовать сколь угодно сложные сценарии, это SpeechRecognizerUI и SpeechRecognizer. Первый класс представляет собой готовое решение, поддерживающее стандартное диалоговое окно и возможности по его модификации. Однако, если Вы хотите разработать свой собственный интерфейс, то тут может быть полезен второй класс, который берет на себя лишь функцию распознавания речи. Создание объектов обеих классов не вызывает затруднений. Тут просто нужно помнить о том, что SpeechRecognizerUI является контейнером для SpeechRecognizer, поэтому доступ к свойствам механизма распознавания в случае доступен SpeechRecognizer напрямую, а в случае SpeechRecognizerUI нужно пользоваться свойством Recognizer.

SpeechRecognizer reco = new SpeechRecognizer();
reco.SetRecognizer(info);

SpeechRecognizerUI recoUI = new SpeechRecognizerUI();
recoUI.Recognizer.SetRecognizer(info);

 

Код выше не только создает объекты, но и задает выбранный нами язык.

Теперь поговорим немного о настройках самих объектов. Тут оба имеют свойство Settings, но в случае со SpeechRecognizer это доступ к настройкам самого механизма распознавания, а в случае со SpeechRecognizerUI – доступ к настройкам диалогового окна. В любом случае настройки достаточно простые. Если говорить о настройках стандартного диалогового окна, то тут следующие свойства:

· ExampleText – строка текста, которая задает пример того, что может сказать пользователь;

· ListenText – строка текста, задающая заголовок стандартного окна по распознаванию речи;

· ReadoutEnabled – позволяет определить, нужно ли зачитывать пользователю распознанный текст;

· ShowConfirmation – позволяет определить, нужно ли отображать подтверждение о том, что текст распознан (или нет), или это будет брать на себя само приложение.

В случае с объектом типа SpeachRecognizer, тут есть следующие свойства:

· BabbleTimeout – свойство задает время, которое пользователь может болтатьJ;

· EndSilenceTimeout – задает время, которое будет затрачено на распознавание речи после окончания монолога пользователя;

· InitialSilenceTimeout – задает время ожидания начала монолога пользователя.

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

Наконец, чтобы приступить к распознаванию, нужно определиться со списком доступных слов. Тут есть три варианта:

· Положится на тот словарь, который идет в стандартной поставке;

· Задать свой словарь с помощью простого списка;

· Использовать Speech Recognition Grammar Specification (SRGS), чтобы задать словарь в виде XML документа.

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

В любом случае, или день был неудачный, или мое устройство содержит не совсем правильный build, или не реализован этот функционал, но для русского языка стандартный словарь работать отказался. Как только будет «магазинное» устройство на руках, я попробую еще раз, но на данном этапе будем считать, что словарь может и отсутствовать. При этом, код выдает ошибку с бессмысленным исключением о том, что await метод как-то не так себя ведет. С английским языком все работает хорошо. В любом случае, если Вы хотите рассчитывать на стандартный словарь, то код должен выглядеть как-то так:

SpeechRecognitionUIResult recoResult = await recoUI.RecognizeWithUIAsync(); 

 

Если необходимо использовать механизм поиска в Web, то тут на одну строчку кода больше:

recoUI.Recognizer.Grammars.AddGrammarFromPredefinedType(
    "searchKey",SpeechPredefinedGrammar.WebSearch);

SpeechRecognitionUIResult recoResult = await recoUI.RecognizeWithUIAsync();

 

Как видно из кода, для вызова диалога по распознаванию речи используется метод RecognizeWithUIAsync. В случае использование класса SpeechRecognizer, используется метод RecognizeAsync. В качестве возвращаемого значения используется класс SpeechRecognitionUIResult (или SpeechRecognitionResult), откуда можно выбрать сам текст, который был распознан и его рейтинг (насколько верно был распознан текст в рамках текущего словаря). Рейтинг текста может быть одним из значений перечислимого типа SpeechRecognitionConfidence и принимать одно из четырех значений: High, Low, Medium и Rejected.

Наибольший интерес представляет возможность задания собственного словаря (особенно в свете того, что у меня русский словарь п умолчанию не работаетJ). Задания собственного словаря позволит улучшить точность распознавания в рамках Вашей предметной области. Кроме того, если словарь у Вас находится локально, то это позволит увеличить и скорость распознавания.

Для задания своего словаря используется коллекция Grammars объекта типа SpeechRecognizer. Поскольку Grammars коллекция, то способна содержать сразу набор словарей, но это могут быть словари на основе списка слов или на основе SRGS. Нельзя мешать собственный словари и словарь по умолчанию. Чтобы задать словарь в виде списка, достаточно использовать конструкцию наподобие этой:

reco.Grammars.AddGrammarFromList("myGr1",
    new List<String>() { "апельсин","яблоко","банан"});

 

Если словарь задается с помощью XML, то тут используется метод AddGrammarFromUri:

reco.Grammars.AddGrammarFromUri("myDict",
    new Uri("ms-appx:///myDict.grxml",UriKind.Absolute));

 

При этом ссылка может указывать как на ресурсы пакета, так и на файл, расположенный в сети. Во втором случае метод эффективно использовать вместе с методом PreloadGrammarsAsync, чтобы предварительно подгрузить словарь из сети.

Вот собственно и все, что нужно знать о распознавании речи в Windows Phone 8.

Реклама

Written by Sergiy Baydachnyy

04.01.2013 в 12:41

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

Tagged with

Один ответ

Subscribe to comments with RSS.

  1. Здравствйте, Сергей. Сколько искал — все не могу найти, можно ли каким-либо способом добиться от SpeechRecognizer’а получения аудиопотока не от основного микрофона телефона, а от bluetooth гарнитуры?

    Alexander Razbakov

    11.10.2013 at 21:39


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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s

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