Wstęp
Typowa aplikacja
głosowa
Poniższy rysunek przedstawia typową strukturę aplikacji głosowej:
Użytkownik łączy się z aplikacją (usługą) wybierając odpowiedni numer
telefonu. Interpreter kontekstu VXML
wykrywa rozmówcę, pobiera
początkowy dokument VXML i odbiera telefon. Interpreter VXML
rozpoczyna wykonanie dokumentu VXML.
Pod kontrolą dokumentu, interpreter może wykonywać następujące
zadania:
1)
wysyłanie do użytkownika podpowiedzi głosowych, wiadomości lub
innych materiałów audio (jak muzyka i efekty dźwiękowe);
2) przyjmowanie
wejść numerycznych, które wprowadza użytkownik
za pomocą klawiatury telefonu tonowego (sygnały DTMF);
3)
przyjmowanie wejść głosowych i rozpoznawanie słów;
4) przyjmowanie i rejestrowanie
wejść głosowych (bez rozpoznawania
słów);
5)
przesyłanie informacji użytkownika na strony sieciowe lub inne
serwery internetowe;
6) otrzymywanie informacji z Internetu i przekazywanie jej do
użytkownika.
Dodatkowo
dokumenty VXML mogą wykonywać typowe funkcje
programowania, jak operacje arytmetyczne i logiczne czy operacje na
tekście.
S
esja użytkownika nie musi być prostą sekwencją, która przebiega w ten
sam sposób za każdym razem – dokument VXML może zawierać
instr
ukcje „if-then-else” i inne złożone struktury.
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.
Wykorzystując VXML jako „front - end” aplikacji webowej, minimalizuje
się ilość wymaganego kodowania VXML. 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).
Dokumenty VXML składają się z prostego tekstu, można go tworzyć i
edyt
ować za pomocą edytora tekstowego, jak Notepad dla Windows.
Testowanie aplikacji odbywa się przez połączenie z odpowiednim
numerem telefonicznym
i interakcję z nią.
Podstawy VXML
Przykład prostego dokumentu VXML:
<?xml version="1.0"?>
1
<!DOCTYPE vxml PUBLIC "-//BeVocal Inc//VoiceXML 2.0//EN"
"http://cafe.bevocal.com/libraries/dtd/vxml2-0-bevocal.dtd">
2
<vxml version="2.0"
xmlns="http://www.w3.org/2001/vxml"
xml:lang="en-US">
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
Scenariusz:
1) wypowiedzenie polecenia dla
użytkownika:
"Please choose News,
Weather, or Sports”
;
2) przyj
ęcie odpowiedzi użytkownika;
3) przekazanie tej odpowiedzi do innego dokumentu
– tutaj do skryptu
o nazwie
selekt.jsp
, który przypuszczalnie dostarczy usługi, którą
wybrał użytkownik.
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 umożliwia
interakcję z użytkownikiem.
Formularz zwykle zawiera pola
field
, które przyjmują informacje od
użytkownika (tutaj: linie 5-12), pole ma przypisaną zmienną o nazwie
selection,
w której przechowuje wypowiedź 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.
Kolejny element to gramatyka
<grammar> -
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 zmien
nej 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, dokument odpowiada wynikiem operacji.
Interakcja realizowana jest za pomocą formularza z trzema polami,
dodano elementy
umożliwiające udzielenie pomocy i wyczyszczenie
całego formularza.
Inicjacja
dokumentu za
pomocą
standardowych
elementów
<?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>
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 akty
wną 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
<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>
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);
<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>
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).
<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"/>
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.
Deklaracja (inna niż dla pola) zmiennej, która
może przechowywać liczby, tekst i in. - tutaj
będzie to wynik obliczeń
<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>
Pole
o nazwie „b” zachowuje drugą liczbę.
Tag <fielled> wybiera operację do
wykonania, wykonuje obliczenia i ogłasza
wynik rozmówcy.
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 po
czą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>.