Упражнение 1. Голосовые команды

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

Задание 1. Изменение файла манифеста приложения

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

  1. Откройте Visual Studio 2012
  2. Перейдите в папку EX1\Begin.
  3. Откройте решение ContosoBookbook.sln.
  4. Перейдите в Visual Studio Solution Explorer (Обозреватель решений Visual Studio), а затем в папку Properties (Свойства) и выберите файл WMAppManifest.xml.
  5. Откроется Windows Phone Manifest Designer (Конструктор манифеста Windows Phone). Если открылась другая страница (XML Editor или Binary Editor), щелкните правой кнопкой файл WMAppManifest.xml и выберите Open with… (Открыть с помощью).

    Рис. 1.
    Выбор команды Open with… (Открыть с помощью)

  6. В диалоговом окне Open with…. выберите Windows Phone Manifest Designer:

    Рис. 2.
    Выбор Windows Phone Manifest Designer

  7. В Windows Phone Manifest Designer перейдите на вкладку Capabilities (Функции).
  8. Установите флажок «ID_CAP_SPEECH_RECOGNITION».

    Рис. 3.
    Как объявить функцию распознавания голоса

    Примечание.

    Ту же операцию можно выполнить, открыв файл манифеста в режиме редактирования XML. Найдите раздел Capabilities и добавьте в него следующий элемент XML:
    <Capability Name="ID_CAP_SPEECH_RECOGNITION"/>

    Задание 2. Объявление поддержки голосовых команд

    В этом задании мы объявим поддержку голосовых команд нашим приложением с помощью XML-файла определений.

    1. Добавьте в проект новый элемент.
    2. Выберите тип элемента XML File (XML-файл).

      Рис. 4.
      Создание нового XML-файла

    3. Назовите новый элемент SupportedVoiceCommands.xml и щелкните Add (Добавить).
    4. Откройте созданный XML-файл и добавьте следующее содержимое:

     

<VoiceCommandsxmlns="https://schemas.microsoft.com/voicecommands/1.0"> <CommandSetxml:lang="en-us"> <CommandPrefix>Contoso Cookbook</CommandPrefix> <Example>Show recipes for (Country Name)</Example> <CommandName="Start"> <Example>Show recipes</Example> <ListenFor>Show recipes </ListenFor> <Feedback>Showing recipescollection</Feedback> <NavigateTarget="MainPage.xaml"/> </Command> <CommandName="ShowRecipes"> <Example>Show Chinese recipes</Example> <ListenFor>Show [me] [a] {groupName} recipes</ListenFor> <Feedback>Showinga {groupName} recipes</Feedback> <NavigateTarget="GroupDetailPage.xaml"/> </Command> <PhraseListLabel="groupName"> <Item>Chinese</Item> <Item>French</Item> <Item>German</Item> <Item>Indian</Item> <Item>Italian </Item> <Item>Mexican </Item> </PhraseList> </CommandSet> </VoiceCommands>

Предыдущий фрагмент XML определяет набор команд для американского варианта английского языка, который содержит две команды. Каждая команда объявляет текст, произносимый для ее выполнения в XML-элементе ListenFor. Элемент ListenTo поддерживает необязательные компоненты (указываются в квадратных скобках «[]») и обязательные (указываются в фигурных скобках «{}»). Приложение получает эти параметры как часть строки запроса навигации и может использовать их, чтобы выводить сообщения при переходе пользователя на определенную страницу или выполнении определенных действий.

Примечание.

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

Объявление команды должно также содержать пример фразы, которая отображается для пользователя (в элементе Example), сообщение системы о том, что команда распознана правильно (элемент Feedback) и URI-адрес приложения, которое должно использоваться после успешного распознавания (в атрибуте Target элемента Navigate). Обратите внимание, что все фразы, адресуемые приложению Contoso Cookbook, должны иметь префикс Contoso Cookbook. Это результат использования XML-элемента CommandPrefix в предыдущем объявлении.

Теперь приложение Contoso Cookbook поддерживает активацию с помощью фразы («Contoso Cookbook — Show recipes»), которая открывает главную страницу приложения. Кроме того, при произнесении фразы «Contoso Cookbook Show Indian recipes» («Contoso Cookbook показать рецепты индийской кухни») выполняется переход на внутреннюю страницу приложения с указанной группой рецептов.

Задание 3. Регистрация голосовых команд

Служба Voice Command доступна приложениям через класс VoiceCommandService. Его статический метод InstallCommandSetsFromFileAsync позволяет загружать в приложение специальный набор голосовых команд из XML-файла, например созданного в ходе предыдущего задания. Службу нужно инициализировать только один раз (при запуске приложения), поэтому мы добавим ее в класс App.

  1. Откройте файл App.xaml.cs.
  2. В начало файла добавьте объявление using.
using Windows.Phone.Speech.VoiceCommands; using Windows.Phone.Speech.Recognition;

3. Добавьте следующий метод в класс App:

async private static void InitializeVoiceCommands() { var filename = "SupportedVoiceCommands.xml"; try { var location = Package.Current.InstalledLocation.Path; var fileUriString = String.Format("file://{0}/{1}", location, filename); await VoiceCommandService.InstallCommandSetsFromFileAsync(new Uri(fileUriString)); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); } }

Предыдущий код регистрирует голосовые команды, поддерживаемые приложением Contoso Cookbook, в службе Voice Command системы.

4. Откройте конструктор и добавьте в начало следующую строку:
/// <summary> /// Constructor for the Application object. /// </summary> public App() { InitializeVoiceCommands();

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

5. Найдите файл RecipeDataSource.cs в папке DataModel.

6. Добавьте в класс RecipeDataSource следующий метод:

public RecipeDataGroup FindGroupByName(string groupName) { return (from g in ItemGroups where g.Title == groupName select g).SingleOrDefault(); }

Наконец, нам нужно изменить метод OnNavigatedTo на странице GroupDetailPage.xaml: он должен поддерживать параметр groupName, добавляемый в строку запроса механизмом голосовых команд. Помните, что когда пользователь произнесет «Show Indian recipes» («Показать рецепты индийской кухни»), механизм голосовых команд перейдет к следующему URI: GroupDetailPage.xaml?groupName=Indian.

7. Откройте файл GroupDetailPage.xaml.cs.

8. Замените метод OnNavigatedTo следующим кодом:

protected async override void OnNavigatedTo(NavigationEventArgs e) { if (!App.Recipes.IsLoaded) await App.Recipes.LoadLocalDataAsync(); if (NavigationContext.QueryString.ContainsKey("groupName")) { string groupName = NavigationContext.QueryString["groupName"]; group = App.Recipes.FindGroupByName(groupName); pivot.DataContext = group; } else { string UniqueId = NavigationContext.QueryString["ID"]; group = App.Recipes.FindGroup(UniqueId); pivot.DataContext = group; } SetPinBar(); //Update main tile with recently visited group Features.Tile.UpdateMainTile(group); base.OnNavigatedTo(e); }

Примечание.

Имя параметра строки запроса (в предыдущем фрагменте кода — groupName) будет тем же самым, что и параметр в фигурных скобках в файле определения Voice Command. Имя чувствительно к регистру.

Задание 4. Тестирование поддержки голосовых команд

Теперь включена поддержка приложением основных голосовых команд. В этом задании мы протестируем приложение: запустим его и выполним нескольких голосовых команд.

  1. Скомпилируйте, разверните и запустите приложение.
  2. Нажмите и удерживайте кнопку   Start (Пуск) до тех пор, пока на дисплее не появится надпись Listening… (Слушаю…).

    Рис. 5.
    Активация голосовой команды — экран «Слушаю...»

  3. Коснитесь знака вопроса в верхнем правом углу экрана, чтобы ознакомиться со списком общих фраз, которые можно использовать.

    Рис. 6.
    Справка по общим голосовым командам

    Мы хотим использовать общие фразы, указанные в нашем приложении. Поэтому нажмите общий элемент Apps (Программы) и найдите программу Contoso Cookbook:

    Рис. 7.
    Справка по голосовым командам данного приложения

  4. Коснитесь элемента Speak (Говорите) и произнесите «Contoso Cookbook show recipes» («Contoso Cookbook показать рецепты»).
  5. Убедитесь, что открылась главная страница приложения Contoso Cookbook. Если система не поняла вашу команду, попробуйте еще раз.

    Рис. 8.
    Проверка голосовых команд

  6. Перейдите на начальный экран.
  7. Нажмите и удерживайте кнопку Start (Пуск) до тех пор, пока на дисплее не появится надпись Listening... (Слушаю…).
  8. Скажите: «Contoso Cookbook show me Italian recipes» («Contoso Cookbook, покажи мне итальянские рецепты»). Убедитесь, что приложение открывает страницу с рецептами итальянской кухни.

    Рис. 9.
    Проверка голосовых команд

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

    Рис. 10.
    Неуверенно распознанные голосовые команды

    Предыдущая | Следующая