Wstęp
Typowa aplikacja głosowa
Poniższy diagram przedstawia typową strukturę aplikacji głosowej:
Użytkownik łączy się z aplikacją (usługą) wybierając odpowiedni numer telefonu. Interpreter VXML odbiera telefon i rozpoczyna wykonanie dokumentu VXML.
Pod kontrolą dokumentu, interpreter może wykonywać następujące zadania:
wysyłanie do użytkownika podpowiedzi głosowych, wiadomości lub innych materiałów audio (jak muzyka i efekty dźwiękowe);
przyjmowanie wejść numerycznych, które wprowadza użytkownik za pomocą sygnałów DTMF (telefon tonowy);
przyjmowanie wejść głosowych i rozpoznawanie słów;
przyjmowanie i nagrywanie wejść głosowych (bez rozpoznawania słów);
przesyłanie informacji użytkownika na strony sieciowe lub inne serwery internetowe;
otrzymywanie informacji z Internetu i przekazywanie jej do użytkownika.
Dodatkowo dokumenty VXML mogą wykonywać typowe funkcje programowania: operacje arytmetyczne i logiczne, operacje na tekście.
Sesja użytkownika nie musi być prostą sekwencją, która przebiega w ten sam sposób za każdym razem - dokument VXML może zawierać instrukcje „if-then-else” i inne złożone struktury.
Wykorzystując VXML jako „front - end” aplikacji webowej, minimalizuje się ilość wymaganego kodowania VXML.
Dokumenty VXML składają się z prostego tekstu, można go tworzyć i edytować za pomocą edytora tekstowego, jak Notepad dla Windows.
Kompletna aplikacja VXML zwykle wymaga jakiś zasobów poza serwerem - hostem aplikacji VXML:
może potrzebować strony sieciowej lub innego serwera, który umożliwia przyjmowanie i przetwarzanie informacji od użytkownika i wysyłanie do niego odpowiedzi.
Pozostała cześć aplikacji może wykorzystywać dobrze znane protokoły, jak HTTP i CGI, dla których dostępne są inne, odpowiednie narzędzia programowe.
Dokumenty VXML i inne związane z nimi pliki mogą być przechowywane na hoście portalu głosowego lub na własnym serwerze (z określonym URI).
Testowanie aplikacji odbywa się przez połączenie z odpowiednim numerem telefonicznym i interakcję z nią.
Podstawy VXML
Scenariusz:
wypowiedzenie prośby do użytkownika: "Please choose News, Weather, or Sports”;
przyjęcie odpowiedzi użytkownika;
przekazanie tej odpowiedzi do innego dokumentu - w rzeczywistości do skryptu serwera o nazwie selekt.jsp, który przypuszczalnie dostarczy usługi, którą wybrał użytkownik.
Przykład prostego dokumentu VXML:
<?xml version="1.0"?> |
1 |
<!DOCTYPE vxml PUBLIC "-//BeVocal Inc//VoiceXML 2.0//EN" |
2 |
|
|
<vxml version="2.0" |
3 |
|
|
<form> |
4 |
<field name="selection"> |
5 |
<prompt> |
6 |
Please choose News, Weather, or Sports. |
7 |
</prompt> |
8 |
<grammar type="application/x-nuance-gsl"> |
9 |
[ news weather sports ] |
10 |
</grammar> |
11 |
</field> |
12 |
<block> |
13 |
<submit next="select.jsp"/> |
14 |
</block> |
15 |
</form> |
16 |
</vxml> |
17 |
W dokumencie są znaczniki (tagi) - słowa kluczowe lub wyrażenia otoczone nawiasami kątowymi (z wyjątkiem linii 7 i 10).
Tag może mieć atrybuty wewnątrz nawiasów kątowych.
Każdy atrybut składa się z nazwy i wartości oddzielonych znakiem „=”, wartość musi być zamknięta w cudzysłowie (np. atrybut w linii 3 version, czy w linii 5 atrybut name).
Tagi występują:
w parach (wtedy nazywają się kontenerami - zawierają tag początkowy, atrybuty, treść: tekst lub inne tagi oraz tag końcowy)
lub pojedynczo (nazywają się autonomicznymi lub pustymi - nie zawierają treści i innych tagów, ale mogą mieć atrybuty - linia 14).
Stosuje się pojęcie element, które oznacza albo tag pusty albo tag kontener.
Jeżeli element zawiera inny element - mówi się o rodzicu i dziecku.
Nagłówek - linie1,2,3 wymagane na początku wszystkich dokumentów VXML.
Po nagłówku - główna część dokumentu VXML, zwykle zawiera przynajmniej tag <form>, definiujący formularz, który może wejść w interakcję z użytkownikiem.
Formularz zwykle zawiera pola field, które przyjmują informacje od użytkownika (tutaj: linie 5-12, pole z przypisaną zmienną o nazwie selection, w której przechowuje wybór użytkownika).
Wewnątrz pola jest element <prompt>, zawierający prosty tekst, który interpreter odczyta za pomocą TTS i prześle do użytkownika. Zamiast TTS można zastosować tag <audio>, aby odtworzyć wcześniej nagrane pliki audio.
Po elemencie <prompt> jest element <grammar>, który definiuje trzy odpowiedzi, które interpreter przyjmie dla tego pola. Inne postaci gramatyki są możliwe. Gramatyki definiują słowa wypowiadane lub sekwencje cyfr (w postaci kodów DTMF) lub jedne i drugie.
Po wysłaniu podpowiedzi do użytkownika, interpreter czeka na odpowiedź użytkownika i próbuje ją dopasować do gramatyki. Gdy dopasuje, interpreter przypisuje zmiennej selection tę odpowiedź - jest ona dostępna w pozostałej części formularza.
Element <block> kończący formularz zawiera tag <submit>, który przekazuje sterowanie do submit.jsp, podając wartość zmiennej selection do skryptu.
Przykładowy dialog
Dokument VXML realizuje funkcje kalkulatora: użytkownik nazywa operację (add, subtract, multiply lub divide), następnie wypowiada dwie liczby, skrypt odpowiada wynikiem operacji.
Interakcja realizowana jest za pomocą formularza z trzema polami, dodano elementy umożliwiające udzielenie pomocy i wyczyszczenie całego formularza.
<?xml version="1.0" ?>
<!DOCTYPE vxml
PUBLIC "-//BeVocal Inc//VoiceXML 2.0//EN"
"http://cafe.bevocal.com/libraries/dtd/vxml2-0-bevocal.dtd">
<vxml version="2.0"
xmlns="http://www.w3.org/2001/vxml"
xml:lang="en-US">
<!--
<meta name="maintainer" content="you@yourcompany.com"/>
-->
<link maxage="0" next="http://yourcompany.com/this.vxml">
<grammar type="application/x-nuance-gsl">
[
(bevocal reload)
(dtmf-star dtmf-star dtmf-star)
]
</grammar>
</link>
<noinput>
I'm sorry. I didn't hear anything.
<reprompt/>
</noinput>
<nomatch>
I didn't get that.
<reprompt/>
</nomatch>
<property name="universals" value="all" />
<help>
I'm sorry. There's no help available here.
</help>
<form>
<block>
This is the BeVocal calculator.
</block>
<field name="op">
<prompt>
Choose add, subtract, multiply, or divide.
</prompt>
<grammar type="application/x-nuance-gsl">
[add subtract multiply divide]
</grammar>
<help>
Please say what you want to do. <reprompt/>
</help>
<filled>
<prompt>
Okay, let's <value expr="op"/> two numbers.
</prompt>
</filled>
</field>
<field name="a" type="number">
<prompt>
Whats the first number?
</prompt>
<help>
Please say a number.
This number will be used as the first operand.
</help>
<filled>
<prompt> <value expr="a"/> </prompt>
</filled>
</field>
<var name="result"/>
<field name="b" type="number">
<prompt> And the second number? </prompt>
<help>
Please say a number.
This number will be used as the second operand.
</help>
<filled>
<prompt> <value expr="b"/> Okay. </prompt>
<if cond="op=='add'">
<assign name="result" expr="Number(a) + Number(b)"/>
<prompt>
<value expr="a"/> plus <value expr="b"/>
equals <value expr="result"/>
</prompt>
<elseif cond="op=='subtract'"/>
<assign name="result" expr="a - b"/>
<prompt>
<value expr="a"/> minus <value expr="b"/>
equals <value expr="result"/>
</prompt>
<elseif cond="op=='multiply'"/>
<assign name="result" expr="a * b"/>
<prompt>
<value expr="a"/> times <value expr="b"/>
equals <value expr="result"/>
</prompt>
<else/>
<assign name="result" expr="a / b"/>
<prompt>
<value expr="a"/> divided by <value expr="b"/>
equals <value expr="result"/>
</prompt>
</if>
</filled>
</field>
<clear/>
</form>
</vxml>
13
Inicjacja dokumentu za pomocą standardowych elementów
tag <meta> z atrybutem name o wartości maintainer, pomocny przy śledzeniu aktywności dokumentu: interpreter VXML wyśle pod wskazany adres e-mail wiadomość (z logiem rozmowy w postaci pliku XML) przy każdym jego uruchomieniu
Kod pomocny przy uruchamianiu dokumentu: przeładowanie i restart dokumentu bez przerywania rozmowy;
- tag <link> jest jak hiperlink, definiuje zawsze aktywną w dokumencie opcję;
- atrybut next określa URI uruchamianego dokumentu, gdy link jest aktywny;
- aktywowanie link za pomocą słów „BeVocal reload” lub trzykrotnego przyciśnięcia „*” w telefonie;
- atrybut maxage=0 zapewnia pobranie najnowszej wersji pliku
Kod zarządzania zdarzeniami: tagi dostarczają pomocy i reagują na błędy wejścia użytkownika:
- <noinput >, gdy rozmówca nie dostarczył wejścia (słów lub kodów DTMF);
- <reprompt/> spowoduje powtórzenie ostatniego prompt;
- <nomatch>, gdy wejście rozmówcy jest nierozpoznane;
- <property> VXML ma mały zbiór dostępnych w całym dokumencie predefiniowanych uniwersalnych komend, włączanych za pomocą tego tagu (tutaj jest to pomoc: element <help> określa co robić, gdy rozmówca poprosi o pomoc);
Formularz steruje dialogiem.
Tag <block>:
- zawiera sekcję wykonywanych treści, które nie wymagają interakcji z użytkownikiem, np. logikę programu jak w przykładzie ze wstępu (tutaj: wiadomość otwierającą bez oczekiwanej reakcji rozmówcy);
- gdy zawiera tylko tekst - interpreter traktuje go jak tekst w prompt, czyli zatrudnia TTS;
Tag <field> zawiera prompty dla TTS, gramatyki wykorzystywane przez ASR i opis akcji wykonywanych po rozpoznaniu:
- polu przypisana jest zmienna o nazwie „op”, która może być używana w wyrażeniach;
- tag <prompt> podpowiada, co może powiedzieć rozmówca;
- tag <grammar> określa, czego oczekuje się od rozmówcy - jedno, dowolne z 4 słów jest dopuszczalną wartością dla pola op;
- tag <help> określa treść wiadomości, którą rozmówca usłyszy, gdy poprosi o pomoc w tym miejscu; tag <reprompt> spowoduje powtórzenie promta dla tego pola; można stosować również tagi <noinput> i <nomatch>;
- tag <filled> określa działania po dostarczeniu przez rozmówcę prawidłowego wejścia: tutaj potwierdza wybór rozmówcy (za pomocą tagu <value> z atrybutem expr).
Pole o nazwie „a” (zachowuje pierwszą liczbę) posiada atrybut type o wartości number (typ liczbowy) - to oznacza, że nie trzeba definiować gramatyki (VXML ma gramatyki wbudowane dla m. in. zmiennych liczbowych).
Tag <help> nie posiada tagu <reprompt> - nie ma powtórzenia promta dla tego pola.
Pole o nazwie „b” zachowuje drugą liczbę.
Tag <fielled> wybiera operację do wykonania, wykonuje obliczenia i ogłasza wynik rozmówcy.
Deklaracja (inna niż dla pola) zmiennej, która może przechowywać liczby, tekst i in. - tutaj będzie to wynik obliczeń
Tag <if> umożliwia podjęcie decyzji, jego atrybut cond określa warunek: jeśli jest „prawda” kod po <if> będzie wykonany; jeśli jest „fałsz” interpreter opuści kod aż do tagu <else>, <elseif> lub zamykającego </if>.
Tutaj budujemy sekwencję wyborów:
- jeśli warunek op=='add' jest „prawda” interpreter wykona tag <assign>, który:
- obliczy wyrażenie Number(a) + Number(b) i przypisze wynik zmiennej result, określonej atrybutem name tego tagu (nie można zapisać a+b ponieważ symbol + oznacza konkatenację łańcuchów, a także dodawanie);
- wykona <prompt>, który ogłosi wynik;
- podobnie dla odejmowania i mnożenia - warunek rozpoczyna się od elseif, można zapisać wyrażenie jako a-b oraz a*b (symbole „-” i „*” maja tylko jedno znaczenie);
- ostatni warunek zaczyna się od else: wyklucza się wszystkie pozostałe warunki, pozostało tylko dzielenie;
- if kończy tag zamykający </if>.
Tag <clear> stosuje się do przywrócenia stanu początkowego formularza: zeruje wartości wszystkich pól - to spowoduje wykonanie formularza od początku przy ponownym uruchomieniu kalkulatora.
Można zerować tylko niektóre pola umieszczając odpowiednio tag <clear>.