background image

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.  

background image

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. 

 

background image

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ą. 

background image

Podstawy VXML 
 
Przykład prostego dokumentu VXML: 
 

<?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"> 

 

 

<form> 

<field name="selection"> 

<prompt> 

Please choose News, Weather, or Sports. 

</prompt> 

<grammar type="application/x-nuance-gsl"> 

[ 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. 

 

background image

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. 
 

background image

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. 
 

background image

 
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. 

background image

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

 

background image

 <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); 

background image

<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). 

   

background image

<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ń 

background image

<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>.