|
|
|||||||||||||||||||||||||||||
|
Голосовая поддержка в XML: Часть 3. Разрабатываем голосовое приложение для работы с блогами (исходники)Источник: IBM developerWorks Россия Мартин Браун
ВведениеВсе больше и больше людей в последнее время увлекаются ведением онлайн-дневников (блогов), чтобы публично выражать свое мнение и попросту заявлять о себе. Почему бы не использовать VoiceXML для нормального голосового общения со своим блогом, в том числе и Twitter? Читая нашу статью, вы научитесь этому и многим другим вещам, таким как:
Об этой серииАудио и, в частности, голосовые сервисы становятся все более популярны в Интернет. В качестве примеров могут служить всевозможные музыкальные ресурсы, а также Web-трансляции, доступные в онлайн. Статьи нашей серии рассказывают о способах совмещения голосовых технологий и XML при разработке таких приложений, как:
Ведение блогаНет ничего хуже для заядлого блоггера, чем не иметь возможности сделать очередную запись в своем блоге. К счастью, использование VoiceXML помогает существенно облегчить эту проблему. В частности, можно разработать VoiceXML приложение с голосовыми функциями, позволяющими добавлять записи в блог, просто позвонив по телефону. К сожалению, существующие на текущий момент VoiceXML-платформы не позволяют надиктовывать произвольный текст для отправки в блог. Тем не менее, с помощью VoiceXML можно делать записи в блоге, выбирая из списка стандартных сообщений. Чтобы реализовать эту идею, нам потребуется Java™-сервлет, который будет генерировать VXML-фрагмент, а также обрабатывать входные данные, формируя из них записи, которые затем будут отправляться в блог. На первом этапе нас не будут интересовать вопросы выбора блога и аутентификации пользователя по причинам, которые станут ясны позднее, когда мы начнем рассматривать интерфейс для удаленной работы с блогами. В целом процесс голосовой работы с блогом будет выглядеть следующим образом:
Графически процесс работы изображен на рисунке 1. Рисунок 1. Принцип голосовой работы с блогами Прежде чем мы перейдем к VXML, необходимо обратить внимание на интерфейс для работы с удаленным блог-сервисом. Интерфейс для работы с блогамиСуществует несколько способов для отправки сообщений в удаленные блоги, но большинство сервисов поддерживают интерфейсы MetaWeblog/MovableType или Blogger API на основе стандартного протокола XML-RPC (XML Remote Procedure Call). Интерфейсы очень похожи, но MetaWeblog/MovableType был разработан с учетом недостатков Blogger API, а поэтому более удобен на практике. Перед тем как заняться отправкой новой записи в блог, необходимо выполнить определенные подготовительные действия, которые позволят в будущем выполнять вызовы через XML-RPC. Для работы с большинством блог-сервисов необходимы следующие данные:
Кроме этого, необходим еще идентификатор блога. Он всегда равен единице для сайтов и сервисов (например, WordPress), на которых размещен только один блог. Но если на сервере располагаются несколько блогов, как, скажем, в случае MovableType, b2evolution или блогов, являющихся частью крупной системы управления контентом, то для обращения к ним нужно использовать уникальный идентификатор. Очевидно, что передача всех вышеперечисленных данных через голосовой интерфейс VoiceXML сопряжена с определенными проблемами. Однако, можно разработать расширенный сервис, позволяющий пользователям авторизовываться, вводя только числа, а затем загружающий всю необходимую информацию непосредственно из учетной записи. Для решения проблемы соединения с блогом, мы создадим класс-обертку над XML-RPC-соединением, выполняющую две важные функции:
Таким образом, экземпляр класса-обертки будет в основном отвечать за подготовку ключевых параметров, а также за создание объекта XML-RPC, необходимого для обмена данными с блог-сервисом. Чтобы упростить разработку, можно использовать Apache-библиотеку XML-RPC. В листинге 1 приведена центральная часть класса Листинг 1. Конструктор класса
Из листинга 1 видно, как создается экземпляр класса Теперь создадим сам объект типа Листинг 2. Создание экземпляра
Кроме непосредственно самого сообщения, пользователь должен еще выбрать категорию из списка доступных категорий для данного блога. Для этого необходимо получить и предоставить этот список пользователю. Получение списка категорийДля получения списка категорий, используемых для записей в данном блоге, существует функция Возвращаемые функцией данные имеют более сложную структуру. Они представляют собой массив хэш-таблиц, каждая из которых содержит идентификатор категории, ее имя, URL блога, в котором используется категория, а так же URL RSS-канала для данной категории. Пример хэш-таблицы, описывающей конкретную категорию, приведен в таблице 1. Таблица 1. Структура хэш-таблицы, содержащей данные категории
Все, что нам нужно из этих данных - это идентификатор и имя категории ( В целом, процесс будет выглядеть следующим образом: сначала посылается запрос к сервису блогов, который, в свою очередь, возвращает список категорий. Затем для каждой категории извлекаются ее идентификатор и имя, и помещаются в хэш-таблицу (экземпляр Java-класса Hashtable). Последняя будет использоваться в VoiceXML-части приложения для формирования списка категорий. Метод Листинг 3. Получение и сохранение списка категорий блога в хэш-таблице
С помощью полученной хэш-таблицы сервлет будет создавать список категорий, доступных для выбора пользователем. Отправка сообщения в блогПроцесс отправки сообщения состоит из ряда шагов, особенно если оно относится к нескольким категориям. Некоторые блог-сервисы обрабатывают всю отправляемую информацию за один шаг, другие же требуют присваивать категории после отправки сообщения. По этой причине лучше выполнять следующую последовательность действий:
Последовательность XML-RPC-вызовов к удаленному сервису блогов показана в листинге 4. Необходимо отметить, что, как и в случае категорий, формат данных несколько сложнее, чем просто список аргументов. В частности, необходимо создать хэш-таблицу, содержащую информацию о добавляемом сообщении. Еще одна хэш-таблица требуется для списка категорий, которая затем передается в качестве элемента массива в метод, присваивающий сообщению категории. Структура получается аналогичной той, что возвращается методом Листинг 4. Публикация сообщения в блоге
Непосредственная публикация сообщения осуществляется вызовом метода
Теперь, когда разработан механизм отправки сообщений и есть класс, его реализующий, остается только написать сервлет-обертку на Java, в чьи обязанности будет входить генерирование VXML и обработка входных данных, необходимых для создания сообщения. Размышления над правилами вводаПеред тем, как заняться генерированием VXML-документов, стоит обратить внимание на некоторые правила, регулирующие ввод данных от пользователя. Грамматика для проверки ввода описывается ниже с помощью круглых и квадратных скобок. Как вы помните, пользователь не может диктовать произвольный текст, вместо этого он выбирает из списка стандартных фраз, используемых для создания новых сообщений. В таблице 2 приведены наиболее часто используемые операторы.
Разумеется, составлять корректные фразы можно, комбинируя различные варианты с помощью операторов конкатенации и дизьюнкции. Для нашего приложения мы будем использовать грамматические правила, приведенные в листинге 5. Листинг 5. Пример грамматических правил, опеределяющих допустимые сообщений блога
Первым делом отметим слово "eye" в том месте, где должно было быть "I". Дело в том, что большинство VoiceXML-систем не могут различить разницу в произношении слова и единичной буквы, а некоторые и вовсе не воспринимают слова, состоящие менее чем из двух символов. В этом случае приходится заменять их на схожие по звучанию многобуквенные слова и использовать предопределенные значения полей VXML для сохранения того, что на самом деле должно было быть введено. Далее мы просто приведем список фраз для выбора, каждая из которых является корректной, исходя из грамматики в листинге 5:
Теперь обратимся к VXML, который мы будет использовать для получения голосовых данных от пользователя. Основной фрагмент VXMLОсновная часть VXML-документа приведена в листинге 6. Листинг 6. Фрагмент XVML, определяющий основные голосовые действия
Характерный пример общения с пользователем с помощью данного VXML приведен в листинге 7. Листинг 7. Пример голосового общения
Это сообщение должно формироваться динамически. Затем к нему будет добавлен список категорий из тех, что были созданы для данного блога. Вывод списка категорийДля голосового вывода списка категорий используется тег prompt, который вставляется в сгенерированный в сервлете VXML. Для получения голосового ввода от пользователя можно использовать теги Листинг 8. Вывод списка категорий
Полученный фрагмент VXML вместе с обрамляющим тегом field показан в листинге 9. Листинг 9. Сгенерированный фрагмент VXML
Теперь все готово к обработке голосового ввода от пользователя. Обработка ввода и отправка сообщенияС помощью тега "submit" данные из полей VXML-документа передаются в удаленное приложение в виде HTTP-строки с параметрами. Этот тег находится внутри блока "filled" как показано в листинге 10.
Все, что нужно для формирования и отправки сообщения - это разобрать строку с параметрами и передать все данные сообщения в метод Листинг 11. Получение данных и отправка сообщения в блог
Теперь вы можете добавлять записи в свой блог, находясь в любой точке земного шара. Все что нужно - это продиктовать по телефону сообщение, свое местонахождение и выбрать желаемую категорию. Теперь посмотрим, как можно добавить голосовые функции к сервису мини-блогов Twitter. Twitter - это сервис Web 2.0, который привлекает к себе все более пристальное внимание. Он позволяет поддерживать связь с друзьями не только через Web, но и с помощью мобильного телефона и программ для общения (instant messengers). При этом ваши друзья также не теряют вас из виду. Идея заключается в том, что вы посылаете короткие текстовые сообщения (до 140 символов), говоря, где вы находитесь и чем занимаетесь в текущий момент времени. Изначально Twitter задумывался именно как коротких статусных сообщений, но со временем превратился в вариант мини-блога. Его можно использовать для кратких замечаний, которые затем можно разослать друзьям.
Есть ли у этого сервиса что-то общее с голосовыми блогами? Ответ: всё! Но помните, что поскольку в данный момент нельзя делать произвольные голосовые записи в блогах, вам придется ограничиться выбором из списка коротких сообщений. Этого вполне достаточно для путешествующего пользователя Twitter. Вы можете предопределить список наиболее часто используемых вами сообщений или даже предоставить Web-интерфейс, через который другие пользователи могут добавлять свои сообщения. За исключением того, что Twitter не поддерживает XML-RPC, весь процесс остался неизменным по сравнению с обычными блог-сервисами. Вместо XML-RPC Twitter-сообщения (или "tweets") добавляются через HTTP-запросы типа POST (см. листинг 12). Листинг 12. Добавления сообщения в Twitter через HTTP POST
Код класса Отличительной особенностью POST-запроса в данном примере является то, что параметры, например, В зависимости от того, отправляете вы запрос к update.xml или update.json, вы можете получить ответ от сервиса в определенном формате. Его можно проанализировать в случае необходимости, но для работы с блогом он не важен. Разумеется, потребуется аутентификация: вы же не хотите, чтобы любой желающий получил доступ к вашей учетной записи в Twitter. За это отвечает класс Сам класс Листинг 13. Аутентификация пользователя на сервере
Возвращаемый этим методом объект можно сохранить в объекте класса Authenticator и использовать в Java-сервлете в момент возникновения необходимости в аутентификации. Как результат - вы можете отправлять tweets когда захотите. ЗаключениеВ статье рассказывалось, как создать приложение, использующее VoiceXML для голосового создания и отправки сообщение в блог. К сожалению, полноценный речевой разбор пока не поддерживается достаточно широко, поэтому приходится ограничиваться выбором простых фраз в соответствии с заданными грамматическими правилами. Впрочем, подобный метод отлично работает в случае Twitter. Кроме этого, при отправке сообщений на Twitter можно задавать свое текущее местоположение. В итоге получилось приложение, выполненное в виде сервлета на Java, которое генерирует VXML-данные для общения с пользователем, а также обрабатывает речевой ввод для последующей отправки сообщения в блог. Оставайтесь с нами, и в четвертой части серии мы создадим приложение, принимающее на вход VoiceXML и выполняющее как Web, так и локальные запросы через поисковый интерфейс Yahoo Search API. Файлы для загрузки
|
|