Голосовая поддержка в XML: Часть 4. Разрабатываем приложение для голосового поиска в Web с помощью VoiceXML (исходники)Источник: IBM developerWorks Россия Мартин Браун
ВведениеВ наши дни поиск в Интернет является абсолютной необходимостью, и великое множество сервисов предоставляет возможности для поиска информации, в том числе и в Web. Все больше компаний размещают информацию о себе в Web, а так же интегрируют информацию, доступную через Web с данными, которые исторически предназначались исключительно для внутреннего использования. Одним из примеров является слияние справочников компаний с географическими данными, делающее возможным поиск предприятий, расположенных в том или ином районе. Подобного рода информацию можно легко представлять в VoiceXML для выполнения голосовых запросов и прослушивания результатов поиска. В данной статье мы создадим приложение для подобного голосового поиска. Кроме того, мы рассмотрим следующие вопросы:
Об этой серииАудио и, в частности, голосовые сервисы становятся все более популярны в Интернет. В качестве примеров могут служить всевозможные музыкальные ресурсы, а также Web-трансляции, доступные в онлайн. Статьи нашей серии рассказывают о способах совмещения голосовых технологий и XML при разработке таких приложений, как:
Процесс поиска в WebПоисковый интерфейс включает в себя простое меню, предлагающее выбрать один из двух вариантов поиска : поиска в Web или в справочнике. В последнем случае от пользователя требуется задать не только ключевые слова, но и местоположение, для которого будет осуществляться поиск. В целом последовательность действий представлена на рисунке 1. Рисунок 1. Алгоритм приложения для поиска в Web Вопросы создания простых голосовых меню были рассмотрены в предыдущих частях серии, так что мы не будем останавливаться на них в данной статье. Приложение будет поддерживать множество ключевых слов для поиска, которые будут распознаваться в соответствии с грамматическими правилами VoiceXML. Голосовой вывод этих правил будет осуществляться специальным классом VoiceXML, также являющимся частью нашего приложения. Описание грамматических правил вводаВ предыдущей статье, посвященной голосовой работе с блогами, мы уже упоминали, что на данный момент не существует удобного транскрипт-сервиса, позволяющего надиктовывать произвольный текст и автоматически переводящего его в текстовый формат. Вместо этого приходится заранее задавать набор слов и фраз, которые приложение будет ожидать от пользователя. Благодаря этому распознавание голоса работает с меньшим количеством ошибок. Как правило, если приложение ожидает от пользователя ввода какой-либо конкретной фразы, например, "I am sad", то ее можно явно описать в грамматике: Для поиска в Web необходима большая гибкость при распознавании пользовательского ввода. Воспринимать произвольный текст приложение по-прежнему не сможет, но будет задавать список ключевых слов для поиска таким образом, что пользователь сможет их повторять в произвольном количестве. Для этого достаточно объединить список слов в группу, а затем создать правило, распознающее одно или более слово из группы. Например, допустим, надо распознавать слова "java", "apple" или "windows" в произвольном порядке и количестве. Для этого создается следующее правило: Для распознавания произвольных комбинаций этих слов нам необходимо следующее правило: Таким образом, пользователь может вводить любое слово группы, а также повторять его произвольное количество раз в любых комбинациях с другими словами из той же группы. Например, будут корректно распознаваться фразы "java apple" и "java apple windows". Разумеется, само по себе подобное правило бесполезно, т.к. то же самое можно сделать и другими способами. Однако в него можно добавить другие ключевые слова, отвечающие за логическое связывание и позволяющие лучше контролировать корректность ввода. Например, можно преобразовать наше правило в следующий вид: Теперь система сможет распознавать такие комбинации, как "java and apple", "java and windows" или даже "java and apple or windows". Далее, используя подобные правила, мы создадим систему, способную распознавать практически произвольные варианты ввода. Кроме самих правил нам еще понадобится стандартный класс для генерирования фрагментов VXML. Создание класса, отвечающего за генерирование VXMLМы создадим обобщенный класс, который будет отвечать за генерирование как отдельных элементов, так и целых фрагментов VXML в соответствии с заранее определенным форматом. Этот класс существенно упростит формирование VXML в нашем приложении, а в сочетании с гибкими грамматическими правилами позволит легко воспринимать и обрабатывать пользовательский ввод. В будущем вы сможете адаптировать класс Класс предоставляет следующую информацию и методы:
Полный код класса приведен в листинге 1. Листинг 1. Класс для формирования VXML-вывода
Используя данный класс, вы легко можете формировать VXML-формы для получения голосовой информации от пользователя. Использование класса для формирования голосовых интерфейсовОдним из вариантов использования данного класса может быть генерирование VXML-документа для ввода параметров при поиске по местонахождению. Пример показан в листинге 2. Листинг 2. Формирование простой VXML-формы
Сгенерированный документ VXML приведен в листинге 3.
Основным преимуществом такого подхода к генерации VXML является то, что для изменения или дополнения списка поддерживаемых ключевых слов и городов требуется всего лишь изменить соответствующий строковый массив. Конечно списки для выбора ключевых слов - это не совсем произвольный текст, но, тем не менее, добавив достаточное количество терминов, можно поддерживать большое количество вариантов для поиска. Использование поискового интерфейса YahooИспользуя поисковый интерфейс Yahoo, можно осуществлять поиск информации в практически всех базах данных Yahoo. Этот интерфейс предоставляет удобные методы для формирования различных параметров поиска, а также получать подробные результаты. Перед тем как начать использовать поисковую систему Yahoo, необходимо зарегистрировать специальный API-ключ. После этого можно скачать SDK для поиска в Yahoo, представляющий собой библиотеку Java™ в виде файла JAR, который содержит все, что необходимо для взаимодействия с поисковым интерфейсом Yahoo. JAR-файл Yahoo необходимо включить в classpath при компиляции программы, использующей этот API: Теперь можно написать простую поисковую функцию, принимающую на вход параметр поиска и генерирующую VXML-фрагмент, перечисляющий найденные результаты. Поиск в WebДля запуска поиска в Web необходимо создать экземпляр класса Для выполнения запроса к поисковому сервису необходимо создать объект класса В ответ на клиентский запрос к поисковому сервису, Yahoo вернет объект типа Листинг 4. Поиск в Web с помощью программного интерфейса Yahoo
Код в листинге 4 выводит один блок "prompt", содержащий обобщенные результаты поиска, например, общее число совпадений, а также один блок на каждую страницу, найденную в базе данных Yahoo для поиска в Web. Фрагмент VXML, содержащий результаты поиска, показан в листинге 5. Листинг 5. Результаты поиска в VXML
Зачастую голосовой браузер смешно озвучивает результаты поиска, в частности, при попытке угадать тип озвучиваемых данных. Например, строка 'WORLDOFBRITNEY.COM' будет озвучена просто как последовательность букв ('W','O', 'R',...), т.к. браузер считает, что это аббревиатура. В общем случае, данные озвучиваются в соответствии с их типом по мнению голосового браузера. Например, число совпадений будет корректно произнесено, как "семьдесят три миллиона, шестьсот тысяч". К сожалению, точно также будет произнесено и число в заголовке страницы "WoBPictures.com". Поиск в справочнике Yahoo!LocalПри использовании поисковой системы Yahoo для местного поиска требуются два параметра: строка и место поиска. Место может задаваться несколькими способами, поэтому метод, вызываемый для запуска локального поиска, выглядит несколько сложнее, чем в случае использования интерфейса для поиска в Web. Таким образом, в случае поиска в Yahoo!Local, приложение будет ожидать от пользователя ввода как ключевых слов, так и места, по которому будет осуществляться поиск. Все необходимые параметры будут вводиться голосом через страницу VoiceXML, после чего будет отправлен запрос к поисковому сервису Yahoo. В целом последовательность действий будет иметь следующий вид:
После создания объекта типа SearchClient все остальные действия, а именно: получение и разбор результатов запроса - выполняются точно так же, как и в случае поиска в Web. Пример выполнения поиска в Yahoo!Local показан в листинге 6. Листинг 6. Запуск поиска в Yahoo!Local и вывод результатов в виде VoiceXML
Необходимо отметить, что данный класс автоматически заменяет символы амперсанда (&) на слово "and". Большинство VoiceXML-систем корректно работают с символами, требующими преобразования в escape-последовательности в XML/HTML (в частности, & должен превращаться в ∧), но есть и такие, которые отвергают подобные символы, т.к. формально они нарушают корректность VXML-документа с точки зрения спецификации XML. Поэтому необходимо быть внимательным и строго соблюдать формат XML. В данном случае мы произведем необходимые замены с помощью регулярного выражения. Кроме этого, заметим, что в данном примере номера телефонов выводятся сразу следом за наименованием найденной компании. Многие голосовые браузеры корректно распознают, что данная цифровая последовательность представляет собой телефонный номер и, благодаря этому, произносят цифры по отдельности, вместо, например, "девятьсот" или "шестьсот шесть". Выше было приведено множество примеров полных VXML-документов. Теперь рассмотрим отдельные фрагменты вывода, а именно блоки, описывающие результаты поиска (см. листинг 7). Листинг 7. Пример полученных результатов поиска
Произношение подобного текста будет далеко от идеала. Например, "Htg" в названии компании "Vanhook Plumbing and Htg." будет произнесено по буквам, т.к. скорее всего голосовой браузер не распознает, что данное слово является сокращением от "heating" (отопление). ЗаключениеВ статье рассматривалось использование поискового интерфейса Yahoo Search API для выполнения поиска как в Web (базе данных Web-страниц от Yahoo), так и в справочнике компаний (Yahoo!Local). Результаты поиска выводились в виде документа в формате VXML. В итоге получилась система, предоставляющая голосовые сервисы для поиска компаний, например, можно позвонить и запросить список 10 лучших водопроводных компаний Нью-Йорка или же первые 10 сайтов, в которых встречаются слова "java" и "apple". Ключевой здесь является гибкая поддержка различных вариантов голосового ввода, позволяющая делать запросы по отдельным словам, фразам или же комбинировать их в произвольном порядке для получения максимально точных результатов поиска. Кроме этого мы рассмотрели общий метод генерирования VXML-содержимого, который может использоваться в любой стандартной VoiceXML-системе, предоставляющей возможности голосового выбора. Надеюсь, что, читая статьи этой серии, вы заложили необходимый фундамент для разработки собственных приложений VoiceXML. |