Wstęp

Typowa aplikacja głosowa

Poniższy diagram przedstawia typową strukturę aplikacji głosowej:

0x01 graphic

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:

  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ą sygnałów DTMF (telefon tonowy);

  3. przyjmowanie wejść głosowych i rozpoznawanie słów;

  4. przyjmowanie i nagrywanie 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: 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:

  1. wypowiedzenie prośby do użytkownika: "Please choose News, Weather, or Sports”;

  2. przyjęcie odpowiedzi użytkownika;

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

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

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

0x08 graphic

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

0x08 graphic
xml:lang="en-US">

<!--

<meta name="maintainer" content="you@yourcompany.com"/>

-->

0x08 graphic
<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>

0x08 graphic
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>

0x08 graphic
<block>

This is the BeVocal calculator.

</block>

0x08 graphic

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

0x08 graphic
<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>

0x08 graphic

<var name="result"/>

<field name="b" type="number">

0x08 graphic
<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)"/>

0x08 graphic
<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>

0x08 graphic

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