Голосовая поддержка в XML: Часть 2. разрабатываем календарь с голосовыми функциями (исходники)Источник: IBM developerWorks Россия Мартин Браун
ВведениеЕсли хорошая программа-календарь нужна практически каждому, то почему бы не добавить в нее голосовые функции? С помощью VoiceXML мы разработаем календарь, которым можно будет управлять голосом. В процессе создания календаря вы научитесь:
Об этой серииАудио и, в частности, голосовые сервисы становятся все более популярны в Интернет. В качестве примеров могут служить всевозможные музыкальные ресурсы, а также Web-трансляции, доступные в онлайн. Статьи нашей серии рассказывают о способах совмещения голосовых технологий и XML при разработке таких приложений, как:
Логика работы календаряАлгоритм работы нашего будущего календаря можно представить в виде очень простой схемы. Для начала будет достаточно всего двух пунктов выбора в меню:
Для удобства можно добавить еще третью возможность, которая даже не потребует специальной обработки: как только пользователь произнесет "finish" (закончить), программа завершит голосовое соединение. Схема работы программы приведена на рисунке 1. Рисунок. Главное меню календаря Как видно из рисунка 1, логика работы достаточно проста. Если пользователь произносит "diary" (дневник), управление передается приложению, которое выведет список встреч на сегодня. Если же сказать "appointment" (встреча), то управление получит другое приложение, которое будет ожидать голосового ввода. Вся информация в календаре будет сохраняться в виде XML-документа, а следовательно, будет необходимо динамически преобразовывать XML-данные в формат VXML. Ввод данных при добавлении новой встречи, а именно: тип встречи, день, месяц и год, можно будет осуществлять непосредственно в виде VXML. При этом потребуется специальный компонент для сохранения вводимой информации. Схема работы этого компонента также проста. Все что от него требуется - это получить дату и время добавляемой встречи от пользователя. Ввод может быть как речевым, так и в виде сигналов DTFM (Dual Tone Multi-Frequency). Подробности приведены на рисунке 2. Рисунок 2. Ввод новой записи в календарь Далее рассмотрим реализацию всей системы. Главное меню календаряТочкой входа в программу является главное меню, представляющее собой несложный VXML-файл, в котором перечислены основные пункты выбора. Подобный выбор можно реализовать несколькими способами, но в данном случае используется VXML-тег "option", позволяющий сохранить слово, вводимое с помощью голоса или DTFM-сигналов с телефонной клавиатуры в соответствующем поле. Таким образом, пользователь может произнести голосовую команду, либо ввести ее с клавиатуры. В качестве подсказки ему необходим список доступных пунктов меню. Для озвучивания вариантов выбора служит тег "prompt". Обработка ввода команды от пользователя осуществляется с помощью блока VXML-файл, описываюший главное меню, приведен в листинге 1. Листинг 1. Главное меню календаря в VXML
На данном этапе можно особенно не заботиться идентификацией пользователя, однако в реальной системе необходимо предусмотреть некий механизм аутентификации, запрашивающий уникальный номер или имя пользователя, а также пароль или пин-код для проверки его личности. Затем в процессе работы приложения идентификатор пользователя можно будет пересылать между VoiceXML и различными служебными скриптами. К тому же уникальный идентификатор позволит легко загружать информацию напрямую из базы данных в случае, если таковая используется в качестве хранилища расписания. В нашем же примере вся информация будет сохраняться в виде XML-документа. Отложив пока соображения по поводу идентификации пользователя, обратим внимание на файл VXML, служащий для добавления новой записи в расписание. Добавление записи в расписаниеДля добавления новой записи нужно сначала получить всю необходимую информацию от пользователя, а именно: тип записи, ее время и дату. Как и ранее, эти данные могут вводиться множеством различных способов, но как минимум в случае первых пяти атрибутов (день, месяц, год, часы и минуты) придется иметь дело с числами. У тега "field" предусмотрен атрибут Учтите, что вводятся именно цифры, а не числа, поэтому пользователь должен произносить каждую цифру по отдельности. Это может показаться немного неудобным, но зато гарантирует, что информация будет введена корректно. Это особенно актуально при вводе года, потому как зачастую он может быть произнесен различными способами. Ввод всех пяти числовых атрибутов производится примерно одинаково, как показано в листинге 2. В каждом случае система сначала проговорит текст-инструкцию, содержащуюся в элементе prompt, а затем будет ожидать ввода данных перед тем, как перейти в следующему полю. Большинство браузеров VoiceXML позволяют автоматически повторить инструкцию, если введенные данные не соответствуют ожидаемому типу данных. Листинг 2. Получение входных данных
Далее необходимо определить список поддерживаемых типов встреч, который будет использоваться голосовым браузером при распознавании речевого ввода от пользователя. Грамматические правила могут задаваться в нескольких различных форматах, в частности, в текстовом или в виде отдельного XML-фрагмента. При использовании текстового формата правила помещаются в VXML-файл в виде блока CDATA. Формат позволяет опеределить список распознаваемых слов, а также правила их интерпретации и представления в виде строк при сохранении в полях документа VXML. Например, если при обработке голосового ввода требуется распознавать слово "meeting" (встреча), а затем сохранять значение "meeting" в поле "TypeOfMeeting", то можно использовать следующую конструкцию: Можно добавлять и другие значения в список поддерживаемых слов, например, dentist, doctor или party (см. листинг 3). Листинг 3. Грамматические правила для типа записи в календаре
Обратите внимание, что в листинге 3 задаются как сами значения, так и наименования полей в VXML для их сохранения. Блок "filled" вызывается сразу после того, как пользователь ввел значения всех полей в VXML. В нашем приложении этот блок будет использоваться для голосового подтверждения ввода параметров встречи. Указание типа данных зачастую помогает модулю TTS (text-to-speech) голосового браузера правильно озвучивать значение того или иного поля. Например, дата, записанная в виде строки "17/5/2007" будет произнесена как "семнадцать-слэш-пять-слэш-две-тысячи-семь", что лишено всякого смысла. Если же модуль TTS поймет, что строка представляет собой дату, то он может проговорить ее как "семнадцатое мая две тысячи седьмого года". Тег Аналогичную конструкцию можно использовать для произношения времени. Например, строка "11:30" будет произнесена как "пол-двенадцатого", а не просто как последовательность чисел. Фрагмент VXML, демонстрирующий использование блока filled c элементами say-as, показан в листинге 4. Листинг 4. Голосовое подтверждение введенных данных
Далее введенные пользователем данные необходимо передать соответствующему скрипту для их дальнейшей обработки. В нашем случае этот скрипт добавит новую запись в XML-файл, в котором хранится полный список запланированных встреч. Для передачи данных из полей VXML-документа обрабатывающим скриптам служит тег Затем голосовой браузер сформирует стандартную строку http-запроса в виде списка пар "поле=значение", из которой можно извлекать значения параметров c помощью стандартных методов, другими словами, точно так же, как и в случае отправки обычной Web-формы со страницы HTML. В листинге 5 показан фрагмент VXML, вызывающий скрипт для сохранения новой записи в расписании и передающий ему значения соответствующих полей в VXML. Листинг 5. Передача значений полей VXML-документа во внешний скрипт
Голосовой интерфейс нашего VoiceXML-приложения можно еще немного улучшить. Например, можно усовершенствовать грамматические правила для ввода дат таким образом, чтобы пользователь мог произносить название месяца. Новое правило приведено в листинге 6. Листинг 6. Грамматические правила для ввода месяца
Также можно возвращать пользователя к главному меню после сохранения новой записи. Кроме того, валидацию данных лучше производить в самом скрипте, например, сравнивая значения введенных полей со списком разрешенных значений. Все эти действия должны быть такими же функциями скрипта, как и само сохранение новой записи. Сохранение записиВстречи, добавляемые в расписание, будут сохраняться специальным скриптом в виде XML. Скрипт получает из формы VoiceXML данные, переданные ему в виде стандартного запроса HTTP. В нашем примере скрипт будет написан на Perl, а существующий XML-файл с расписанием будет загружаться с помощью модуля Формат XML-файла показан в листинге 7. Листинг 7. Пример хранения запланированной встречи в XML
Вся информация о добавляемой записи заключена в атрибутах тега "meeting", что упрощает добавление и изменение данных. Чтобы исключить вероятность добавления некорректной информации в XML, скрипт проверяет наличие всех необходимых параметров и устанавливает соответствующий флаг в переменной ok . Кроме этого, можно дополнительно проверить корректность введенной даты, попробовав преобразовать ее в объект типа Полный текст скрипта показан в листинге 8. Листинг 8. Сохранение новой встречи в файле XML
Нам понадобится еще один скрипт для считывания информации из XML-файла, содержащего расписание, и озвучивания текущего списка встреч. Вывод текущего расписанияДанный скрипт считывает содержимое файла diary.xml и создает VXML-фрагмент для голосового вывода списка запланированных встреч. Сам скрипт очень прост и не содержит ничего, кроме кода генерирования VXML, который вы уже видели ранее. После вывода последней записи пользователь перенаправляется к главному меню. Полный текст скрипта приведен в листинге 9. Листинг 9. Преобразование текущего расписания в формат VXML
Пример вывода в формате VXML показан в листинге 10. Листинг 10. Пример расписания в формате VXML
Этот скрипт можно сильно усовершенствовать в следующей версии приложения. В частности, можно добавить дополнительное меню, позволяющее пользователю выбрать временной интервал для вывода расписания. Например, можно будет обрабатывать следующие голосовые команды:
Все эти возможности легко реализуются на основе принципов и методов, описанных в данной статье. ЗаключениеВ статье была представлена расширенная схема взаимодействия между приложение VoiceXML и скриптами, выполняющими служебные функции. Ключевым моментом в этом взаимодействии является тег "submit", позволяющий передавать данные из VXML в скрипт аналогично тому, как вызываются любые Web-скрипты. Подобный подход к обмену информацией открывает широкие возможности по связыванию ваших приложений с обычными и голосовыми браузерами или интерфейсами. Оставайтесь с нами, и в третьей части мы рассмотрим разработку простого приложения, принимающего на вход Voice-XML-данные и сохраняющего их в вашем онлайн-блоге. Кроме того, мы покажем, как использовать VoiceXML для работы с так называемыми "tweets" - записями популярного блог-сервиса Twitter. |