|
|
|||||||||||||||||||||||||||||
|
Голосовая поддержка в XML: Часть 1. Разрабатываем программу прослушивания RSS-каналов (исходники)Источник: IBM developerWorks Россия Мартин Браун
ВведениеЭту статью будет полезно прочитать всем интересующимся преимуществами использования голосовых программ для чтения RSS-лент. К тому же вы познакомитесь с основами VoiceXML и форматом RSS XML. Но главное, вы научитесь:
Об этой серииАудио и, в частности, голосовые сервисы становятся все более популярны в Интернет. В качестве примеров могут служить всевозможные музыкальные ресурсы, а также Web-трансляции, доступные в онлайн. Статьи нашей серии рассказывают о способах совмещения голосовых технологий и XML при разработке таких приложений, как:
Основы VoiceXMLVoiceXML - это общее название для голосовых данных XML, в то время как сам файловый формат называется VXML. VXML особенно полезен при использовании совместно с браузером VoiceXML, преобразующим содержимое файла в речь (так называемое Text-To-Speech или TTS-преобразование), а также способным воспринимать голосовые команды (т.е. имеющим функцию распознавания голоса). В листинге 1 показан базовый формат файла VXML. Листинг 1. Базовый формат файлов VXML
Далее можно добавлять элементы, предоставлять возможность выбора информации и разбивать ее на блоки. Данные для TTS размещаются внутри тега
Если в ответ на голосовые запросы ожидается какое-либо действие пользователя, то в элементах Все эти методы будут продемонстрированы как в данной статьей, так и в последующих статьях серии. Для запуска примеров к статье вам понадобится доступ к хостингу для размещения файлов VXML, а также браузер VoiceXML с функциями TTS и распознавания речи. Как правило, подобные компоненты доступны через различного рода телефонные линии. Например, Voxeo предоставляет голосовой браузер, а также все необходимые сервисы, в частности, возможность дозваниваться до ваших приложений со стационарных телефонов, используя специальный пин-код. Это осуществляется через специальный VoIP-сервис на основе протокола SIP (Session Initiation Protocol) или же просто через Skype. Формат файлов RSSRSS (Really Simple Syndication) - это основанная на XML технология, предназначенная для публикации информации, часто используемой в блогах и подобных сайтах. Формат RSS позволяет легко создавать списки статей или других информационных блоков. Информацию, поступающую по нескольким каналам RSS можно агрегировать, в результате получается отформатированный список статей, историй и т.д. вместе с заголовком и соответствующим URL, кратким содержанием, а также классификаторами для каждой из составных частей. Кроме этого RSS-лента содержит информацию для классифицирования всего канала как единого целого. RSS - это всего лишь один из многих XML-форматов для объединения данных из различных источников. Несмотря на то, что базовая структура файла RSS достаточно проста, она может восприниматься на первый взгляд с трудом, поэтому в листинге 3 представлен несколько упрощенный вариант. Листинг 3. Пример структуры RSS
Заголовочная секция содержит общую информацию о ленте, как, например, название блога (MCslp) или же общее описание материала ("Новости из конторы Мартина Брауна"). Также в листинге 3 представлена дополнительная информация о ленте, такая как дата публикации, соответствующая дате генерации в случае динамических RSS-каналов. Кроме этого присутствует отдельный блок, описывающий каждую статью в ленте. В подобных блоках содержится заголовок статьи, краткая резюмирующая информация, а также более детальная (или даже полная) версия материала. Последнее возможно при условии поддержки со стороны RSS-канала. Формат статьи представлен в листинге 4. Листинг 4. Элемент RSS-ленты в XML
Если информация представляется в формате VoiceXML, то некоторые из этих элементов могут игнорироваться. Существуют определенные ограничения на информацию, предназначенную для голосового произношения. Например, названия категорий, глобальные идентификаторы Основной интерес представляют такие составляющие ленты, как заголовок всего канала, а также название и описание для каждой из статей. Рассмотрим очень простой способ преобразования файла RSS в VoiceXML. Применение простого XSL-преобразованияОдин из простейших способов преобразования XML-файла RSS в формат VXML заключается в использовании шаблона XSL. Правда, в некоторых случаях это может оказаться непростым занятием, особенно из-за ограниченных и несколько запутанных методов для выборки элементов и логического ветвления в XSL. Но в целом это неплохой вариант для быстрого решения проблемы. В листинге 5 показана простая таблица стилей XSL, преобразующая элементы title и description исходного файла RSS в формат VXML. В результате заголовки и содержимое каждой из статей RSS-ленты могут быть озвучены. Листинг 5. Таблица стилей XSL для преобразования RSS в VXML
Шаблон XSL обрабатывает все статьи в RSS-ленте, используя для их выборки выражения XPath. Затем значения элементов title и description (заголовка и содержимого соответственно) помещаются в блоки prompt, разделяемые блоками break. Последние используются в VoiceXML для вставки пауз в вывод TTS. Применить XSL-преобразование к XML-документу RSS можно с помощью утилиты xsltproc. Результат преобразования новостной ленты BBC показан в листинге 6. Листинг 6. Создание файла VXML с помощью таблицы стилей XSL
Как видно из листинга, каждой статье RSS-ленты соответствует отдельный блок с заголовком, паузой и кратким содержанием. Далее сгенерированный VXML-документ можно загрузить в голосовой браузер и прослушать. Но сам по себе этот результат не особенно применим на практике, т.к. кроме этого необходимо автоматически загружать и преобразовывать содержимое RSS-ленты. Другими словами, надо подумать, как динамически предоставлять всю необходимую информацию в VoiceXML. Процесс преобразования RSS в VoiceXMLОдна из проблем при использовании XSL - это простота и, как следствие, ограниченность этого подхода, причем как в смысле способов создания файла VXML, так и в смысле его содержимого. Для решения этой проблемы можно использовать языки программирования, например, Java или Python, позволяющие выполнять более сложные преобразования. Прежде чем начать, представим себе логику работы простого RSS-браузера, как показано на рисунке 1. Рисунок 1. Логика работы приложения для преобразования RSS в VXML Принцип работы следующий: после получения входящего звонка, звонящему предоставляется выбор из доступных RSS-каналов. Как только он выбрал канал, его содержимое обрабатывается и создается список заголовков всех статей в ленте. Таким образом абонент может выбрать и прослушать интересующие его статьи. Вначале происходит обработка RSS-ленты и формирование файла VXML для прочтения вслух статей и создания основного набора информации для озвучивания. Преобразование RSS в VoiceXML с помощью PerlСуществует множество Perl-модулей для обработки новостных лент, наиболее удобным из которых является Для разбора содержимого необходимо создать объект типа Остальная информация о ленте, включая заголовок, может быть получена через этот объект верхнего уровня. Например, заголовок получается следующим образом: Доступ непосредственно к статьям ленты осуществляется в два этапа: сначала необходимо получить список статей с помощью метода В листинге 7 показано, как можно составить список новостей для данной ленты. Листинг 7. Пример создания файла VXML из RSS-ленты с помощью Perl
Скрипт в листинге 7 состоит из двух основных частей. Сначала скрипт получает на вход содержимое ленты и создает блоки prompt на каждый новостной заголовок, сохраняя вывод в строковой переменной. Затем сформированная строка целиком записывается в файл VXML. Скрипт перебирает все новости в ленте и добавляет в выходной файл заголовки, разделенные короткими паузами. Конечно для этой задачи можно было использовать полнофункциональный генератор XML, но поскольку файл имеет достаточно простую структуру, то достаточно простых операторов вывода для добавления в него информации. Отметьте, что на данном этапе RSS-лента создана вручную, а результаты преобразования выдаются в стандартный поток вывода. Таким образом, если требуется создать выходной файл, то в него надо просто перенаправить стандартный вывод. Полученный файл VXML представлен в листинге 8 (файл сокращен в интересах экономии места). Листинг 8. Пример VXML-файла, сгенерированного автоматически из RSS-ленты
Если загрузить этот файл в подходящий сервис VoiceXML и позвонить, то в ответ можно услышать список новостей, полученных непосредственно из ленты RSS. Пока что можно только прослушать список заголовков новостей. Конечно, было бы желательно кроме заголовков иметь возможность послушать и подробности выбранных новостей. Добавление возможности выбора новостейЧтобы добавить возможности выбора новостей и прослушивания их кратких версий (summary), необходимо предусмотреть несколько дополнительных действий на этапе создания файла VXML, а именно:
Реализовать первое действие достаточно просто: все что требуется - это присвоить уникальный номер каждой новости и выводить его рядом с заголовком. Кроме этого, необходимо, чтобы пронумерованные заголовки точно соответствовали содержанию новостей, выдаваемым по запросу пользователя. Для этого будут использоваться две временных строковых переменных: одна будет хранить номер выбранной новости, а другая - текст, который будет озвучен для пользователя. Для получения и обработки ввода с клавиатуры можно использовать специальный элемент field, предусмотренный в VXML: В этом случае система будет ожидать числового ввода от пользователя. После этого произойдет разбор числового блока в VXML, и полученное число будет использовано для выбора нужной новости. Затем краткое содержание новости будет произнесено вслух голосовым сервисом. Разбор числового значения происходит следующим образом: все цифры числа последовательно вводятся в виде сигналов DTMF (Dual Tone Multi-Frequency), а затем помещаются в специальную переменную: Таким образом, можно получать и обрабатывать многозначные числа, хотя в нашем примере пользователь сможет выбирать только из шести последних новостей. Как только цифры введены, можно использовать обычный блок условного перехода ( Полный вариант скрипта (вновь на Perl) показан в листинге 9. Листинг 9. Полный текст скрипта на Perl
Сгенерированный файл VXML представлен в листинге 10. Кроме самих новостей, в файле показано, как обрабатывается входной параметр для выбора из списка, а также как выдаются подсказки пользователю, облегчающие работу с системой. Листинг 10. Реализация функции выбора новостей с помощью VXML
Загрузив этот файл в VoiceXML-браузер, вы сможете не только слушать заголовки новостей, но и выбрать ту, которую вы хотите прослушать более подробно. Кроме этого, после прослушивания существует возможность выбора другой новости. За это отвечает последний блок в файле (см. листинг 11). Листинг 11. Запрос на выбор следующей новости
Необходимо очищать переменную, хранящую предыдущее значение пользовательского ввода, иначе следующий выбор будет некорректным. Несмотря на то, что RSS-лента загружается динамически, скрипт по-прежнему генерирует статический файл VXML, содержащий новости для прослушивания. Для полной интерактивности необходимо создавать его на лету. Создание VoiceXML из RSS-лент с помощью сервлетов JavaДо этого момента возможности выбора новостей были ограничены статическим файлом VXML. Для подлинной интерактивности, он должен генерироваться скриптом динамически по запросу пользователя. Т.к. большинство голосовых браузеров обращаются к VXML-файлам по URL, все что нужно - это разработать CGI или какое либо еще Web-приложение для их создания на лету. Это можно реализовать с помощью Perl-скриптов, представленных на листингах 7 и 9, но необходимо позаботиться о формировании корректного заголовка HTTP-ответа (text/xml) перед выводом самого файла VXML. Все что нужно - это добавить две строчки в начало скрипта, как показано в листинге 12. Листинг 12. Формирование HTTP-заголовка в Perl-скрипте
С помощью этих инструкций импортируется специальная библиотека CGI, отвечающая за формирование заголовков HTTP. Остальное же содержимое вывода - это все тот же файл VXML, что и ранее. На основе тех же принципов можно создавать VXML и на других языках программирования. В частности, в листинге 13 показан Java-сервлет, генерирующий такой же документ VXML, как и первый Perl-скрипт (см. листинг 7). Сервлет использует библиотеки Rome и JDOM для разбора RSS-ленты и создания требуемого VXML-файла. Листинг 13. Создание голосовых RSS-лент c помощью VXML и JSP
Основные шаги по разбору ленты и генерации VXML остались точно такими же, как и в случае скриптов Perl. Вместо использования одного статического VXML-файла, происходит обращение к RSS-ленте и создание VXML при запросе пользователя. Далее этот сервлет вместе с необходимыми JAR-файлами для JDOM и Rome, можно развернуть в контейнере JSP, например в Apache Tomcat, и использовать его как основу вашего будущего VXML-приложения. Динамическая генерация различных VXML-файловКроме озвучивания какой либо конкретной RSS-ленты, можно предоставлять пользователю список новостных каналов для прослушивания. Это также дает возможность добавить интерактивности приложению, а именно, выбирать, какой скрипт и откуда вызывать при выборе той или иной новости пользователем. Для начала надо создать список RSS-лент, доступных для озвучивания. В нашем примере используется обыкновенный массив, но в принципе эта информация может загружаться из некой базы данных. Далее для каждой ленты извлекается ее название и описание, создается необходимый пронумерованный список, после чего скрипт ждет выбора пользователя. Однако в этом случае, после получения от пользователя конкретного числа, скрипт вызывает внешний обработчик по URL (в данном случае, самого себя), передавая номер новостной ленты в качестве аргумента. На конечном этапе можно вызвать дополнительную функцию, выдающую список новостей конкретной ленты и позволяющую выбрать одну из них. В листинге 14 представлен полный код CGI-скрипта на Perl, выполняющего вышеперечисленные действия.
В примере подразумевается, что один параметр используется как для вывода всего списка лент, так и для выбора конкретной ленты из списка. В случае использования базы данных, скорее всего, потребуется присваивать уникальный идентификатор каждой ленте и использовать его для выбора. Но общий принцип остается неизменным. Кстати говоря, необходимого результата можно достичь используя только VXML. В VXML можно добавлять различные блоки form, а затем использовать их для вывода нужных лент. Но на практике создавать VXML-файлы большого размера, как правило, не стоит, гораздо лучше использовать скрипты для быстрой генерации небольших объемов VXML-данных на лету. Используя такую динамическую генерацию VXML, следует позаботиться о том, чтобы она не замедляла работу приложения. Например, вышеприведенный скрипт непосредственно обращается к каждой новостной ленте, что может занимать значительное время. Используя базу данных, можно загружать и выводить заголовок и краткое описания лент намного быстрее. Кроме этого, имейте в виду, что в случае динамической генерации могут потребоваться дополнительные усилия по обработке возможных ошибок. Например, в нашем случае если какая-либо из лент недоступна, то скрипт выведет пустой список новостей, в то время как сообщение типа: "Извините, сервис в настоящее время недоступен" было бы значительно информативнее для пользователя при возникновении такой ситуации. ЗаключениеВ данной статье были рассмотрены различные подходы к генерированию документов VXML, необходимых для прослушивания RSS-лент. Мы начали с простого варианта на основе XSL, а затем перешли к более гибким решениям, использующим скрипты Perl и сервлеты Java. Сами по себе скрипты достаточно примитивны. Вся мощь заключается в сгенерированном VXML-содержимом, а также в голосовом браузере, использующем VXML для предоставления голосового интерфейса. Кроме этого, в статье рассказывалось как обеспечивать определенный уровень интерактивности, используя VXML совместно с динамическими скриптами. Все это позволяет относительно легко разрабатывать достаточно сложные голосовые приложения. Оставайтесь с нами, и во второй части мы разработаем календарь с голосовой поддержкой. Файлы для загрузки
|
|