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

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

Archive for Январь 2013

Курс: Разработка приложений для Windows 8 и Windows Phone (часть 3)

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

Продолжаем наши лекции по разработке приложений для Windows 8 и Windows Phone.

Ссылки на регистрацию тут:

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032543432&Culture=UK-UA

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032543433&Culture=UK-UA

 

Ну а запись предыдущих лекций тут:

http://sdrv.ms/SkOnmN

Реклама

Written by Sergiy Baydachnyy

25.01.2013 at 16:06

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

Tagged with ,

Запись курсов по Windows 8 и Windows Phone

leave a comment »

В понедельник пройдет вторая лекция по разработке приложений для Windows Phone (а во вторник – Windows 8), а пока предлагаю Вам записи первой лекции. Тут же будут и все последующие:

http://sdrv.ms/SkOnmN

Written by Sergiy Baydachnyy

20.01.2013 at 09:37

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

Tagged with ,

Курс: Разработка приложений для Windows 8 и Windows Phone (часть 2)

leave a comment »

Written by Sergiy Baydachnyy

16.01.2013 at 09:30

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

Кто такая Бреус Ирина Павловна? (часть 2)

with one comment

Поскольку народ требует окончания истории Кто такая Бреус Ирина Павловна?, то решил написать продолжение.

Итак, 25 декабря все закончилось обращением в приемную губернатора, а утром 26го я немного был занят (ждал новую мебель), поэтому не смог пообщаться с чиновниками напрямую. Но как только мебель закончили собирать и я немного освободился, то тут же переключился на чиновников.

Первым делом я начал звонить в приемную губернатору и пытаться выяснить, как там обстоит дело с моим обращением. И вот тут меня ждал первый облом: выяснилось, что живые люди в приемной губернатора работают только с письменными обращениями граждан, а куда деваются электронные, они не знают…J! То есть номер есть, а чего с ним делать и где проверять статус – непонятно. Видимо реализация PR активности о системе электронного документооборота в Днепропетровске подразумевала только наличие красивого сайта без какой-либо обратной связи. «Схавал» народ и хорошо. Самое интересное было потом. На мой вопрос: «Где Вы физически находитесь? Я сейчас приеду и сделаю письменное обращение», девушка немного перепугалась и издала несколько странных звуков, перешивая их фразами типа «сегодня?», «нет, не нужно» и др. Иными словами, несмотря на рабочий день, я ощутил, что застолье в разгаре. Это еще сильнее укрепило мое желание поехать в приемную, чтобы разобраться с тем, что же происходит там в рабочее время, оплачиваемое с моих налогов, о чем я и сообщил.

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

clip_image002clip_image004

clip_image006

Уж не знаю, кто из исполнительной власти принял участие в вызове машины, но моему счастью не было границ.

Далее было все просто, 10 минут работы и г…. пошло в нужном направлении. Еще 10 минут бригада рассказывала об их нелегкой жизни, о том, что они месяцами не выезжают на адреса, так как одна машина на город и т. д. Ну и сообщили о том, что проблема устранена временно, так как скоро забьется все снова. Поэтому завтра приедет специально обученная бригада, которая будет чистить люки.

Не знаю, кто их прижал, но в 10 утра 27го у меня была бригада, которая пошла чистить люкиJ В отличии от первое команды, ребята работали часа 3, вытянув грузовик г… из одного люка, потом из другого. Специально обученный человек наблюдал и контролировал весь процесс, а когда выяснилось, что вода из второго люка плохо уходит в третий, то тут же была вызвана «гидра» (приехавшая минут за 10!), которая устранила и эту проблему. Потом еще чистка и, внимание, бетонная крышка на мой люк во дворе. Вот такое вот чудо!

Теперь нужно заняться вывозом мусора и уборкой территории:

clip_image008

Значит нам дорога в ЖЭК.

P.S. Самое странное, что в подобных ситуациях народ тупо сидит и ничего не делает. Нас прижало, а мы приспособимся….

Written by Sergiy Baydachnyy

04.01.2013 at 13:19

Опубликовано в О жизни

Tagged with

Распознавание и обработка речи (часть 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 at 12:41

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

Tagged with