Пока еще 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/
Добавить комментарий