Поговори со мной Windows Phone

от автора

Пока еще Cortana не стала доступной для русскоговорящих пользователей Windows Phone 8.1, а это ожидается скоро, я предлагаю вам самим сделать веселое апрельское приложение, с помощью которого можно будет поговорить с телефоном, покомандовать им, а может быть и поиграть.

На деле это, оказывается, довольно просто.

В качестве примера предлагаю сделать детское приложение, которое тренирует в устном счете до 10-ти. Приложение будем писать на XAML/C#

Создаем приложение для Windows Phone — тип проекта Blank App (Windows Phone).

Все разрешения, которые необходимо добавить в манифест – это разрешение на использование микрофона. Никакие другие разрешения не нужны! Открываем файл Package.appxmanifest, заходим на закладку «Capabilities» в англоязычной Visual Studio или «Возможности» в русскоязычной и смело ставим галочку рядом со словом микрофон.

Создадим довольно простой XAML код:

    <StackPanel Orientation="Vertical" VerticalAlignment="Center">         <TextBlock FontSize="48" x:Name="txtPrimer" HorizontalAlignment="Center" TextWrapping="Wrap"></TextBlock>         <Button x:Name="btnOtvet" Click="btnOtvet_Click" HorizontalAlignment="Center">Задать задачку!</Button>         <MediaElement x:Name="mediaEl" />     </StackPanel> 

Здесь у нас есть TextBlock для отображения текста примера, кнопка для запуска игры и MediaElement, который обычно используется для воспроизведения аудио/видео, а в нашем случае он будет «произносить» фразы.
Получим что-то вот такое:

В C# code behind ( файл MainPage.xaml.cs ) к пространствам имен, которые имеются в приложении по умолчанию, добавляем еще пространства:

using Windows.Media.SpeechSynthesis; using Windows.Media.SpeechRecognition; 

Как вы могли заметить в XAML коде у нас объявлено событие нажатия на кнопку. В результате действия срабатывает метод btnOtvet_Click. Одного этого метода нам будет вполне достаточно.

Первой строчкой метода заблокируем кнопку (чтобы пользователь не мог вызвать метод еще раз до завершения выполнения текущего вызова).

Объявим переменную для распознавания голоса:

SpeechRecognizer speechRecognizer = null;   

Далее нам необходимо совершить проверку установлен ли у пользователя русский язык:

  try             {                 Windows.Globalization.Language lan = new Windows.Globalization.Language("ru-RU");                 speechRecognizer = new SpeechRecognizer(lan);             }   catch             {                 // отображаем сообщение и не продолжаем выполнение кода                 txtPrimer.Text = "У вас отсутствует русский язык. Установите язык в настройках";                 return;             } 

Здесь видно, что в случае если при создании экземпляра SpeechRecognizer с русским языком в качестве параметра произойдет ошибка, то в текстовом поле будет выведено сообщение и далее выполнение кода продолжено не будет.

Следующий кусок кода инициализирует массив значениями от 0 до 10-ти, после чего генерирует 2 случайных числа в промежутке от 0 до 5-ти. Эти числа выводятся в текстовом поле в качестве примера со знаком + между ними.

Создаем экземпляр SpeechRecognitionListConstraint, передав ему наш массив чисел в качестве параметра. Наш «голосовой движок» сможет распознать именно эти слова. Добавляем эти слова в SpeechRecognizer вызвав .CompileConstraintsAsync()
Задаем опции графического интерфейса UIOptions — то каким образом будет запрошен голосовой ответ.

            string[] chisla = { "ноль", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять", "десять" };              Random rnd = new Random();             int number1 = rnd.Next(0, 6);             int number2 = rnd.Next(0, 6);             int result = number1 + number2;              txtPrimer.Text = number1 + "+" + number2;              var listConstraint = new SpeechRecognitionListConstraint(chisla, "числа");             speechRecognizer.Constraints.Add(listConstraint);              // компилируем наши слова             await speechRecognizer.CompileConstraintsAsync();              speechRecognizer.UIOptions.ExampleText = @"Сколько будет " + number1 + "+" + number2;             speechRecognizer.UIOptions.AudiblePrompt = "Скажите ответ";             speechRecognizer.UIOptions.IsReadBackEnabled = false; // не нужно повторять распознанное слово             speechRecognizer.UIOptions.ShowConfirmation = false; // и подтверждение нам не нужно показывать 

Настройки UIOptions отвечают за отображение такого вот окошка:

Теперь распознаем сказанное слово:

            SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();             // если была отмена, то не продолжаем дальше             if (speechRecognitionResult.Confidence == SpeechRecognitionConfidence.Rejected)             {                 return;               }             string TextToSay=""; // используем этот текст далее             if (speechRecognitionResult.Text == chisla[result]) // проверяем правильное ли число было сказано             {                 TextToSay = "Молодец!";             }             else             {                 TextToSay = "Ошибочка";             } 

Если не хочется показывать окошко, для которого мы задавали внешний вид ранее, то можно в первой строчке использовать RecognizeAsync() вместо RecognizeWithUIAsync().

После того, как мы, молодцы такие, распознали текст и получили в переменную TextToSay значение «Молодец!» в случае верного ответа и «Ошибочка» в случае ошибочного произнесем голосом этот результат. Вставляю сразу весь код воспроизведения (не такой он уж и большой):

 SpeechSynthesizer synth = new SpeechSynthesizer();  VoiceInformation ruVoice = null;  SpeechSynthesisStream stream=null;             try             {                 ruVoice = (from voice in Windows.Media.SpeechSynthesis.SpeechSynthesizer.AllVoices                            where voice.Language == "ru-RU"                            select voice).First();             }             catch { }                  if (ruVoice != null)                 {                         synth.Voice = ruVoice;                         stream = await synth.SynthesizeTextToStreamAsync(TextToSay);                 }                 mediaEl.SetSource(stream, stream.ContentType);                 mediaEl.Play(); 

Что здесь делаем? Объявляем и инициализируем объекты самого класса синтезатора речи, информации голоса и потока в который мы запишем нашу фразу. Далее запросом Linq из всех установленных голосов выбираем именно русский (можно еще и именно женский выбрать или мужской). В случае, если голос найден, присваиваем его нашему синтезатору речи и создаем поток из нашего текста («Молодец» или «Ошибочка»). Помните у нас в XAML коде был элемент для воспроизведения медиа с именем mediaEl? Вот ему мы задаем в качестве источника наш поток и запускаем воспроизведение. Отмечу, что синтез речи одинаков со «взрослой» полной Windows 8.1 для ПК и планшетов, то есть, при создании универсального приложения код может быть общим.

Все, что остается сделать, это «отморозить» нашу кнопку:

btnOtvet.IsEnabled = true; 

На этом наш метод, да и весь код программы завершен. Остается протестировать в действии.


На фото – процесс тестирования приложения на Lumia 1020

Украшаем приложение веселой картинкой, выкладываем в Store, показываем друзьям, прикалываемся.

Исходный код приложения считалки-говорилки можно скачать по ссылке.

ссылка на оригинал статьи http://habrahabr.ru/post/254865/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *