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

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

Archive for the ‘Windows Phone’ Category

Запись курсов по 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 »

Ссылки на вторую часть наших онйлайн лекций:

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

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

Written by Sergiy Baydachnyy

16.01.2013 at 09:30

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

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

Зачем участвовать в конкурсе, если в Украине нет магазина для Windows Phone

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

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

Совсем недавно мы объявили о конкурсе Windows Phone для украинских разработчиков и студентов http://wp8.promorc.com. Чтобы принимать участие в конкурсе, нужно быть гражданином Украины и опубликовать приложение с украинского аккаунта.

Сразу же после этого, на меня посыпался град писем о том, что смысла в этом нет, так как украинцы все еще не могут зарабатывать деньги в Windows Phone Store.

Коллеги, давайте разберемся, кто, зачем и почему:

1. Вы являетесь украинским мега разработчиком для Windows Phone и пишите классные приложения? Тогда Вам немедленно нужно написать мне и мы подумаем о том, как делать совместные промо Ваших приложений. У нас есть некоторые возможности и мы очень хотим, чтобы Вы заработали много денег, неважно под каким аккаунтом. Ведь это самый хороший PR платформе. Подозреваю, что на этом этапе у Вас и телефон есть и Вы уже думаете о том, как заработать первый миллион.

2. Вы только думаете разрабатывать для платформы Windows Phone, являясь разработчиком на других платформах или студентом? Тут я могу рассмотреть свой пример. Последние несколько месяцев я хватался за несколько пилотов на Windows 8, преследуя одну цель «Получить хороший опыт в разработке Windows 8 приложений». Причем в этих приложениях нет и упоминания обо мне, но, глядя на свое первое приложение для Windows 8 я прихожу в ужас и тайно мечтаю его переписатьJ Вы же не думаете, что полистав книгу о Windows Phone тут же заработаете миллион? Нужен опыт и дополнительный пинок, чтобы ускорить процесс. Ведь если писать что-то для себя и без временных целей, то можно и за жизнь не успеть Hello World написать. Вот конкурс и является тем волшебным пинком, который позволит Вам собраться и что-то начать делать.

3. Вы хотите узнать roadmap платформы для украинских разработчиков? Коллеги, когда у меня будет информация о доступности платного стора для телефонов, то я ее не буду скрывать перед Вами. Но не думайте, что я в комментариях раскрою Вам какой-то волшебный секрет.

4. Вы просто хотите попиз… (то есть, Вам скучно и одиноко и очень нужно с кем-то поговорить)? Тепаете на itc.ua открываете любую новость об устройствах и начинаете рассказывать, почему Windows Phone лучшая в мире платформа. Там живет такое количество троллей, что скучно Вам не будет! А у меня и без этого голова забита разной фигней.

Written by Sergiy Baydachnyy

25.12.2012 at 09:35

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

Tagged with

Бесплатные курсы по Windows Phone и Windows 8 для студентов

with one comment

Чтобы стимулировать украинских студентов создавать больше приложений и принимать участие в Imagine Cup 2013, мы решили запустить серию онлайн курсов по самым последним технологиям. Лично я буду читать Windows Phone и Windows 8.

Вот ссылки на регистрационную форму для первых лекций:

Разработка приложений для Windows Phone (8 января)

Разработка приложения для Windows 8 (10 января)

Для организации лекций будем использовать Lync.

Written by Sergiy Baydachnyy

24.12.2012 at 18:36

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

Tagged with ,

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

leave a comment »

Преобразование текста в речь

Еще одна, не менее интересная задача, это преобразование текста в человеческую речь. Чтобы реализовать подобный функционал в приложении первым делом нужно определить возможность ID_CAP_SPEECH_RECOGNITION в манифесте приложения:

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

 

Теперь можно переходить к синтезу голоса. Для этого воспользуемся пространством имен Windows.Phone.Speech.Synthesis, которое содержит всего несколько полезных классов:

· InstalledVoices – этот класс содержит всего два свойства (All и Default) и позволяет предоставить информацию об установленных языках на телефоне пользователя. Тут программист может проверить, есть ли требуемый язык и подобрать тот, который подходит для данной ситуации, в противном случае система возьмет язык по умолчанию;

· VoiceInformation – этот класс содержит информацию о голосе. Тут содержится язык, пол синтезатора (как ни странно звучит). Используется совместно с InstalledVoices при обращении к свойству Default или переборе всей коллекции доступных языков в All. Сам по себе объект класса создать нельзя;

· SpeechSynthesizer – вот это и есть самый интересный класс, который выполняет преобразование текста в речь.

Фактически, чтобы преобразовать текст в речь, достаточно создать объект класса SpeechSynthesizer и вызвать метод SpeakTextAsync. Как видно из названия метода, он является асинхронным и поддерживает подход вызова через async/await. Естественно, чтобы вызвать метод, желательно проверить наличие нужного Вам языка, а еще лучше, установить его в качестве текущего с помощью метода SetVoice. Код ниже проверяет наличие русского языка, а в случае его присутствия, произносит фразу фразу «Привет», используя женский и мужской голос последовательно:

if ((from a in InstalledVoices.All 
     where a.Language.Contains("ru") 
     select a).Count() > 0)
{
    SpeechSynthesizer sr = new SpeechSynthesizer();
    sr.SetVoice((from a in InstalledVoices.All 
                 where a.Language.Contains("ru") 
                 select a).First());
    await sr.SpeakTextAsync("Привет");
    sr.SetVoice((from a in InstalledVoices.All 
                 where a.Language.Contains("ru") 
                 select a).Last());
    await sr.SpeakTextAsync("Привет");
}

 

Естественно, что преобразование текста в речь на основе простого текста не очень интересно, так как часто нужно использовать женский и мужской голос в одном абзаце, использовать разные языки, отправлять приложению событие при завершении произнесения части фразы и др. Все это можно делать, если использовать не простой текст, а набор инструкций, описанных с помощью специального языка Speech Synthesis Markup Language (SSML). Традиционно SSML базируется на XML и поддерживается в классе SpeechSynthesizer двумя методами: SpeakSsmlAsync и SpeakSsmlFromUriAsync. Первый метод принимает в качестве параметров строку, содержащую SSML, а второй – путь к файлу с соответствующими инструкциями.

Рассмотрим все элементы, из которых может состоять SSML документ:

· audio – позволяет вставить заранее подготовленный аудио файл. Это позволяет снабдить монолог дополнительными аудио эффектами. В качестве атрибута используется src – путь к файлу;

· break – позволяет задавать паузу. Для этого используется атрибут duration, который задает паузу в секундах или миллисекундах или атрибут strength, принимающий одно из предопределенных значений;

· emphasis – теоретически этот элемент должен позволять произносить текст с разным уровнем интонации, но это в Windows Phone 8 пока не реализовано;

· lexicon – этот элемент позволяет задать разработчику собственный лексикон, базируясь на специально созданной для этого спецификации Pronunciation Lexicon Specification (PLS). Это необходимо для сложных приложений, где необходимо четко задать набор слов и правильное их произношение;

· mark – позволяет задать метку, используя атрибут name. При достижении метки в приложении генерируется событие BookmarkReached. Это позволяет легко синхронизировать речь с происходящим на экране.

· p и s – позволяют задать параграф или высказывание. Элементы не обязательные, но имеют важный атрибут xml:lang, который позволяет переустановить язык;

· phoneme – с помощью этого элемента можно задать специальное произношение для заданной группы символов. Очень часто это касается имен;

· prosody – содержит много атрибутов, но пока поддерживается только volume, который позволяет задать громкость от 0 до 100;

· sayas – позволяет задать произношения для дат, времени, числительных и др. Очень полезный элемент, учитывая то, что те же даты пишутся по разному;

· speak – задает коневой элемент для всего SSML документа;

· sub – позволяет задать развернутое написание для аббревиатур;

· voice – позволяет задать голос, указав мужской или женский, язык и другие параметры.

Если Вы создаете файл с расширением ssml, то Visual Studio автоматически включает систему IntelliSense, что очень удобно. Пример простого ssml файла:

<speak version="1.0" 
       xmlns="http://www.w3.org/2001/10/synthesis" 
       xml:lang="ru-RU">
  <s xml:lang="ru">Чтобы сказать добрый день по английски, произнесите</s>
  <s xml:lang="en">Good morning</s>
</speak>

 

Код, который может открыть этот файл может выглядеть вот так:

SpeechSynthesizer sr = new SpeechSynthesizer();
string path = Package.Current.InstalledLocation.Path + "\\text.ssml";
Uri url = new Uri(path, UriKind.Absolute);
await sr.SpeakSsmlFromUriAsync(url);

 

Не забудьте проверить, что в свойствах файла указано Build Action = Content. По умолчанию это не происходит и Вы получите исключение о том, что файл не найден.

Written by Sergiy Baydachnyy

20.12.2012 at 22:03

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

Tagged with

Конкурс для Windows Phone разработчиков в Украине

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

Вспомнил, что не писал о таком замечательном конкурсе: http://wp8.promorc.com, который мы сейчас проводим для всех разработчиков и студентов в Украине.

На конкурсе 4 номинации:

· Лучшее приложение (тут все, что угодно – бизнес, социалка и др.)

· Лучшая игра

· Лучшее студенческое приложение (чтобы дать возможность студентам получить приз с хорошим приложением, если их вытеснят разработчики из первых двух номинаций.)

· Лучшее приложение для Windows Phone 8 (тут речь идет о приложениях, которые утилизируют новые возможности платформы. Чем лучше и полезней эта утилизация, тем лучше для конкурса)

Ограничения: только жители Украины, приложение должно быть опубликовано с украинского аккаунта (смысл делать метрики другой стране?) и приложение должно быть опубликовано в ходе конкурса (нас интересует что-то новенькое).

До конца конкурса осталось еще 54 дня. Поэтому время еще есть.

Written by Sergiy Baydachnyy

20.12.2012 at 12:54

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

Tagged with ,