Голосова підтримка в XML: Частина 4. Розробляємо програму для голосового пошуку в Web за допомогою VoiceXML (исходники), Різне, Програмування, статті

Введення


В наші дні пошук в Інтернет є абсолютною необхідністю, і дуже багато сервісів надає можливості для пошуку інформації, в тому числі і в Web. Все більше компаній розміщують інформацію про себе в Web, а так же інтегрують інформацію, доступну через Web з даними, які історично призначалися виключно для внутрішнього використання. Одним із прикладів є злиття довідників компаній з географічними даними, що робить можливим пошук підприємств, розташованих в тому чи іншому районі.


Подібного роду інформацію можна легко представляти в VoiceXML для виконання голосових запитів і прослуховування результатів пошуку. У даній статті ми створимо додаток для подібного голосового пошуку. Крім того, ми розглянемо такі питання:



Про цієї серії


Аудіо та, зокрема, голосові сервіси стають все більш популярні в Інтернет. Як приклади можуть служити всілякі музичні ресурси, а також Web-трансляції, доступні в онлайн. Статті нашої серії розповідають про способи поєднання голосових технологій і XML при розробці таких програм, як:



Процес пошуку в Web


Пошуковий інтерфейс включає в себе просте меню, що пропонує вибрати один з двох варіантів пошуку: пошуку в Web або в довіднику. В останньому випадку від користувача потрібно задати не тільки ключові слова, а й місце розташування, для якого буде здійснюватися пошук. В цілому послідовність дій представлена ​​на малюнку 1.


Рисунок 1. Алгоритм програми для пошуку в Web

Питання створення простих голосових меню були розглянуті в попередніх частинах серії, так що ми не будемо зупинятися на них в даній статті.


Додаток буде підтримувати безліч ключових слів для пошуку, які будуть розпізнаватися відповідно до граматичними правилами VoiceXML. Голосовий висновок цих правил буде здійснюватися спеціальним класом VoiceXML, також є частиною нашого застосування.


Опис граматичних правил введення


В попередній статті, Присвяченої голосової роботі з блогами, ми вже згадували, що на даний момент не існує зручного транскрипт-сервісу, що дозволяє надиктовувати довільний текст і автоматично переводить його в текстовий формат. Замість цього доводиться заздалегідь задавати набір слів і фраз, які додаток буде очікувати від користувача. Завдяки цьому розпізнавання голосу працює з меншою кількістю помилок.


Як правило, якщо додаток очікує від користувача введення якої-небудь конкретної фрази, наприклад, “I am sad”, то її можна явно описати в граматиці: (eye am sad).


Для пошуку в Web необхідна велика гнучкість при розпізнаванні користувача введення. Сприймати довільний текст додаток як і раніше не зможе, але буде задавати список ключових слів для пошуку таким чином, що користувач зможе їх повторювати в довільній кількості.


Для цього достатньо об’єднати список слів в групу, а потім створити правило, розпізнає одне або більше слово з групи. Наприклад, припустимо, треба розпізнавати слова “java”, “apple” або “windows” в довільному порядку і кількості. Для цього створюється таке правило: Terms [ (java) (apple) (windows) ].


Для розпізнавання довільних комбінацій цих слів нам необхідно наступне правило: .Phrase +Terms.


Таким чином, користувач може вводити будь-яке слово групи, а також повторювати його довільну кількість разів у будь-яких комбінаціях з іншими словами з тієї ж групи. Наприклад, будуть коректно розпізнаватися фрази “java apple” і “java apple windows”.


Зрозуміло, саме по собі подібне правило марно, тому що те ж саме можна зробити і іншими способами. Проте в нього можна додати інші ключові слова, які відповідають за логічне зв’язування і дозволяють краще контролювати коректність введення. Наприклад, можна перетворити наше правило в такий вигляд: Terms [ (java) (apple) (windows) (and) (or) ].


Тепер система зможе розпізнавати такі комбінації, як “java and apple”, “java and windows” або навіть “java and apple or windows”.


Далі, використовуючи подібні правила, ми створимо систему, здатну розпізнавати практично довільні варіанти введення. Крім самих правил нам ще знадобиться стандартний клас для генерування фрагментів VXML.


Створення класу, що відповідає за генерування VXML


Ми створимо узагальнений клас, який буде відповідати за генерування як окремих елементів, так і цілих фрагментів VXML відповідно до заздалегідь визначеним форматом. Цей клас суттєво спростить формування VXML в нашому додатку, а в поєднанні з гнучкими граматичними правилами дозволить легко сприймати і обробляти користувача введення.


У майбутньому ви зможете адаптувати клас WebSearchVXML для багатьох інших VXML-додатків. Це буде нескладно зробити, завдяки простим методам, що надаються класом для генерування VXML-фрагментів, необхідних для того чи іншого додатка. У базовій версії класу згенеровані фрагменти записуються в стандартний потік виводу (за допомогою методу System.out.println()), Але це поведінка можна легко пристосувати під потреби, наприклад, Web-додатки, якому потрібно створювати динамічні елементи VoiceXML.


Клас надає наступну інформацію і методи:



Повний код класу приведений в лістингу 1.


Лістинг 1. Клас для формування VXML-виводу





public class WebSearchVXML {
String webterms[] = { “java”,
“apple”,
“windows”,
“britney spears”,
“lindsey lohan”};
String localterms[] = { “plumber”,
“restaurant”,
“electrician”,
“supermarket”};
String cities [] = {“Лондон”, “Ноттінгем”, “Манчестер”, “Йорк”,};
PrintStream out = System.out;
public void WebSearchVXML() {
}
private void OutputGSLTerms(String[] terms) {
this.out.println(“<grammar type=”text/gsl”>” +
“<![CDATA[
” +
“.Phrase +Terms
” +
“Terms [ “);
for(int i=0;i<terms.length;i++) {
this.out.println(“(” + terms[i] + “)”);
}
this.out.println(“]
” +
“]]>” +
“</grammar>”);
}
private void OutputOptionTerms(String[] terms) {
for(int i=0;i<terms.length;i++) {
this.out.println(“<option>” + terms[i] + “</option>”);
}
}
public void VXMLPrompt(String prompt) {
this.out.println(“<prompt>” + prompt + “</prompt>”);
}
public void VXMLTerms(String fieldname,
String prompt,
String [] terms) {
this.out.println(“<field name=”” + fieldname + “”>”);
VXMLPrompt(prompt);
OutputGSLTerms(terms);
this.out.println(“</field>”);
}
public void VXMLOptions(String fieldname,
String prompt,
String [] terms) {
this.out.println(“<field name=”” + fieldname + “”>”);
VXMLPrompt(prompt);
OutputOptionTerms(terms);
this.out.println(“</field>”);
}
public void VXMLHeader() {
this.out.println(“<?xml version=”1.0″ encoding=”UTF-8″?>”);
this.out.println(“<vxml version=”2.1″>”);
}
public void VXMLFooter() {
this.out.println(“</vxml>”);
}
}

Використовуючи даний клас, ви легко можете формувати VXML-форми для отримання голосової інформації від користувача.


Використання класу для формування голосових інтерфейсів


Одним з варіантів використання даного класу може бути генерування VXML-документа для введення параметрів при пошуку за місцезнаходженням. Приклад показаний в лістингу 2.


Лістинг 2. Формування простий VXML-форми





WebSearchVXML search = new WebSearchVXML();
search.VXMLHeader();
System.out.println(“<form>”);
System.out.println(“<block>”); search.VXMLPrompt (“Вас вітає сервіс для пошуку в Інтернет”);
System.out.println(“</block>”);
search.VXMLTerms(“phrase”, “Введіть фразу для пошуку в Web за ключовими словами”,
search.webterms);
search.VXMLOptions(“location”, “Виберіть місто для обмеження результатів пошуку”,
search.cities);
System.out.println(“<filled><submit name=”/VXMLSearch/search”
namelist=”phrase location”>”);
System.out.println(“</form>”);
search.VXMLFooter();

Згенерований документ VXML приведений в лістингу 3.


Лістинг 3: Документ VXML





<?xml version=”1.0″ encoding=”UTF-8″?>
<vxml version=”2.1″>
<form>
<block> Вас вітає сервіс для пошуку в Інтернет
</block>
<field name=”phrase”> Введіть фразу для пошуку в Web за ключовими словами
<grammar type=”text/gsl”><![CDATA[
.Phrase +Terms
Terms [
(java)
(apple)
(windows)
(britney spears)
(lindsey lohan)
]
]]></grammar>
</field>
<field name=”location”> Виберіть місто для обмеження результатів пошуку

Основною перевагою такого підходу до генерації VXML є те, що для зміни або доповнення списку підтримуваних ключових слів і міст потрібно всього лише змінити відповідний рядковий масив.


Звичайно списки для вибору ключових слів – це не зовсім довільний текст, але, тим не менш, додавши достатня кількість термінів, можна підтримувати велику кількість варіантів для пошуку.


Використання пошукового інтерфейсу Yahoo


Використовуючи пошуковий інтерфейс Yahoo, можна здійснювати пошук інформації в практично всіх базах даних Yahoo. Цей інтерфейс надає зручні методи для формування різних параметрів пошуку, а також отримувати детальні результати.


Перед тим як почати використовувати пошукову систему Yahoo, необхідно зареєструвати спеціальний API-ключ. Після цього можна завантажити SDK для пошуку в Yahoo, що представляє собою бібліотеку Java ™ у вигляді файлу JAR, який містить все, що необхідно для взаємодії з пошуковим інтерфейсом Yahoo.


JAR-файл Yahoo необхідно включити в classpath при компіляції програми, що використовує цей API: $ javac -cp yahoo_search-2.0.2.jar LocalSearch.java.


Тепер можна написати просту пошукову функцію, приймаючу на вхід параметр пошуку та генеруючу VXML-фрагмент, перераховують знайдені результати.


Пошук в Web


Для запуску пошуку в Web необхідно створити екземпляр класу SearchClient(), Використовуючи ключ API, отриманий при реєстрації в Yahoo. Створений таким чином клієнтський об’єкт буде відповідати за виконання пошуку, причому будь-якого типу.


Для виконання запиту до пошукового сервісу необхідно створити об’єкт класу WebSearchRequest() і передати йому рядок, задану параметри пошуку.


У відповідь на клієнтський запит до пошукового сервісу, Yahoo поверне об’єкт типу WebSearchResults, Що містить як узагальнену інформацію про самому запиті, так і масив результатів. Кожен результат являє собою об’єкт, що містить заголовок сторінки, URL та іншу інформацію, в більшості своїй марну для VoiceXML-додатки. Повністю послідовність дій показана в лістингу 4.


Лістинг 4. Пошук в Web за допомогою програмного інтерфейсу Yahoo





public static void DoSearch(String term) {
SearchClient client = new SearchClient(“INSERTKEY”);
WebSearchRequest request = new WebSearchRequest(term);
try {
WebSearchResults results = client.webSearch(request);
System.out.println (“ Знайдено” +
results.getTotalResultsAvailable() + “Збігів для фрази” +
term + “. Перші” +
results.getTotalResultsReturned() + “Результатів такі: “);
for (int i = 0; i < results.listResults().length; i++) {
WebSearchResult result = results.listResults()[i];
System.out.println(“<block><prompt>” +
result.getTitle() +
“.<break/>” +
“</prompt></block>”);
}
}
catch (Exception e) {
System.err.println(“An error occurred”);
}
}

Код в лістингу 4 виводить один блок “prompt”, що містить узагальнені результати пошуку, наприклад, загальне число збігів, а також один блок на кожну сторінку, знайдену в базі даних Yahoo для пошуку в Web.


Фрагмент VXML, що містить результати пошуку, показаний в лістингу 5.


Лістинг 5. Результати пошуку в VXML





<?xml version=”1.0″ encoding=”UTF-8″?>
<vxml version=”2.1″>
<form>
<block><prompt> Знайдено 73600000 збігів для фрази “britney spears”. Перші 10 результатів такі:
</prompt></block>
<block><prompt>Britney Spears – The Official
Site.<break/></prompt></block>
<block><prompt>WORLDOFBRITNEY.COM.<break/>
</prompt></block>
<block><prompt>Britney Spears – britney.com – Jive
Records.<break/></prompt></block>
<block><prompt>Britney Spears Zone / Britney Divorce, Pregnant,
Baby Pictures, Pics &
News.<break/></prompt></block>
<block><prompt>britneyspears.org.<break/></prompt></block>
<block><prompt>WoBPictures.com [100030013].<break/>
</prompt></block>
<block><prompt>Britney Spears – Wikipedia, the free
encyclopedia.<break/></prompt></block>
<block><prompt>Britney Spears / Music Artist / Videos, News, Photos &
Ringtones / MTV.<break/></prompt></block>
<block><prompt>Britney Spears.<break/></prompt></block>
<block><prompt>Britney Spears – Yahoo! Music.<break/>
</prompt></block>
<disconnect/>
</form>
</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





public static void DoSearch (String term,String location) {
SearchClient client = new SearchClient(“INSERTKEY”);
LocalSearchRequest request = new LocalSearchRequest();
request.setLocation(location);
request.setQuery(term);
try {
LocalSearchResults results = client.localSearch(request);
System.out.println (“ Знайдено” +
results.getTotalResultsAvailable() + “Збігів для фрази” +
term + ” in ” + location + “. Перші” +
results.getTotalResultsReturned() + “Результатів такі: “);
for (int i = 0; i < results.listResults().length; i++) {
LocalSearchResult result = results.listResults()[i];
Pattern pattern = Pattern.compile(“&”);
Matcher matcher = pattern.matcher(result.getTitle());
System.out.println(“<block><prompt>” +
matcher.replaceAll(“and”) + “. Телефон:” +
result.getPhone() +
“</prompt></block>”);
}
}
catch (Exception e) {
System.err.println(“Error calling Yahoo! Search Service: ” +
e.toString());
}
}

Необхідно зазначити, що даний клас автоматично замінює символи амперсанда (&) на слово “and”. Більшість VoiceXML-систем коректно працюють з символами, які вимагають перетворення в escape-послідовності в XML / HTML (зокрема, & повинен перетворюватися в ∧), але є й такі, які відкидають подібні символи, т.к. формально вони порушують коректність VXML-документа з точки зору специфікації XML. Тому необхідно бути уважним і строго дотримуватися формат XML. В даному випадку ми зробимо необхідні заміни з допомогою регулярного виразу.


Крім цього, зазначимо, що в даному прикладі номера телефонів виводяться відразу слідом за найменуванням знайденої компанії. Багато голосові браузери коректно розпізнають, що дана цифрова послідовність являє собою телефонний номер і, завдяки цьому, вимовляють цифри окремо, замість, наприклад, “Дев’ятсот” або “Шістсот шість”.


Вище було наведено безліч прикладів повних VXML-документів. Тепер розглянемо окремі фрагменти виведення, а саме блоки, що описують результати пошуку (див. лістинг 7).


Лістинг 7. Приклад отриманих результатів пошуку




                   Знайдено 14 збігів для фрази “plumber” в Нью-Йорк.
Detailing the top 10 results.</prompt></block>
<block><prompt>State Plumbing Inspector.<break/> Телефон: (606) 862-1297
<block><prompt>Hibbitts Brothers Wholesale.<break/> Телефон: (606) 864-2256
<block><prompt>State Plumbing Inspector Paul Ray.<break/> Телефон: (606) 862-1297
<block><prompt>Willard Neeley Plumbing and Htg.<break/> Телефон: (606) 864-6203
<block><prompt>Vanhook Plumbing Htg and Cooling.<break/>
Phone number: (606) 862-8228</prompt></block>
<block><prompt>Rooter Man of South Eastern Ky.<break/> Телефон: (606) 878-1339
<block><prompt>Kettry Roaden Plumbing.<break/> Телефон: (606) 528-3396
<block><prompt>Prestige Marble.<break/> Телефон: (606) 523-9186
<block><prompt>Herb King Plumbing.<break/> Телефон: (606) 364-4534
<block><prompt>AAA Plumbing.<break/> Телефон: (606) 528-0705

Вимова подібного тексту буде далеко від ідеалу. Наприклад, “Htg” в назві компанії “Vanhook Plumbing and Htg.” буде виголошено по буквах, тому що швидше за все голосової браузер не розпізнає, що дане слово є скороченням від “heating” (опалення).


Висновок


У статті розглядалося використання пошукового інтерфейсу Yahoo Search API для виконання пошуку як в Web (базі даних Web-сторінок від Yahoo), так і в довіднику компаній (Yahoo! Local). Результати пошуку виводилися у вигляді документа у форматі VXML. В результаті вийшла система, що надає голосові сервіси для пошуку компаній, наприклад, можна зателефонувати і запитати список 10 кращих водопровідних компаній Нью-Йорка або ж перші 10 сайтів, у яких зустрічаються слова “java” і “apple”. Ключовий тут є гнучка підтримка різних варіантів голосового введення, що дозволяє робити запити щодо окремих словами, фразам або ж комбінувати їх у довільному порядку для отримання максимально точних результатів пошуку.


Крім цього ми розглянули загальний метод генерування VXML-вмісту, який може використовуватися в будь-якої стандартної VoiceXML-системі, яка надає можливості голосового вибору.


Сподіваюся, що, читаючи матеріали цієї серії, ви заклали необхідний фундамент для розробки власних додатків VoiceXML.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*