Ako sme už spomenuli vyššie, VoiceXML umožňuje doručiť obsah používateľovi dvoma spôsobmi. Môžeme použiť rečovú syntézu alebo prednahraté audio súbory. Na tento účel nám slúži dvojica VoiceXML tagov:
<prompt> tag, ktorý umožňuje syntetizovať text
a
<audio> tag, ktorý umožňuje prehrávať audio súbory
Prakticky každý text, ktorý sa vyskytne vo VoiceXML dokumente je považovaný za text, ktorý má byť syntetizovaný pomocou TTS systému. Použitie <prompt>
tagu ale umožňuje syntetizovať reč a pridávať extra atribúty pre jej úpravu.
Najjednoduchším príkladom použitia prompt elementu je:
<prompt> Toto sa povie </prompt>
Jazyk VoiceXML umožňuje obohatiť <prompt>
element o nasledujúce základné atribúty:
Príklad použitia cond atribútu:
Príklad 1
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0">
<var name="hour" expr="11">
<form id="moj_prvy_dialog">
<block>
<prompt cond="hour<10"> Dobré ráno. </prompt>
<prompt cond="hour>10 && hour<17"> Dobrý deň. </prompt>
<prompt cond="hour>17"> Dobrý večer. </prompt>
</block>
</form>
</vxml>
V predchádzajúcom príklade môžeme vidieť tri <prompt>
elementy, pričom každý z nich obsahuje podmienku definovanú pomocou cond atribútu. Podmienky testujú premennú hour, ktorá obsahuje informáciu o aktuálnej dennej hodine. Podľa toho, koľko je aktuálne hodín, systém prehrá jeden z pozdravov.
Príklad použitia timeout a bargein atribútov: Príklad 2
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0">
<form id="moj_prvy_dialog">
<field name="moja_spz">
<grammar src="spz.grxml" type="XML"/>
<prompt bargein="true" timeout="7"> Teraz zadajte štátnu poznávaciu značku vášho vozidla. </prompt>
<filled>
<prompt> Poznávacia značka vášho vozidla je <value expr="moja_spz"/>. </prompt>.
</filled>
</field>
</form>
</vxml>
Uvedený príklad už zobrazuje VoiceXML kód aplikácie, ktorá umožňuje naozajstný dialóg, kde sa už aj používateľ dostane k slovu. Interakcia na základe predchádzajúceho VoiceXML kódu, môže vyzerať napríklad takto:
S: Teraz zadajte štátnu poznávaciu značku vášho vozidla.
U: KE325SK
S: Poznávacia značka vášho vozidla je KE325SK.
Ako si môžete všimnúť, príklad obsahuje nové elementy, s ktorými sme sa zatiaľ nestretli: <field>
, <grammar>
a <filled>
. Tieto elementy sú základnými stavebnými prvkami foriem a podrobne sa im budeme venovať neskôr. Všimnime si bližšie jednotlivé <prompt>
elementy:
<prompt bargein="true" timeout="7"> Teraz zadajte štátnu poznávaciu značku vášho vozidla. </prompt>
V prípade tejto výzvy, je atribút bargein nastavený na hodnotu true, čo znamená, že táto výzva môže byť prerušená používateľom skôr, ako sa ukončí jej prehrávanie. Táto funkcionalita umožňuje výrazne skrátiť trvanie dialógu pri opakovanom používaní služby skúsenými používateľmi.
Ďalším atribútom je timeout, ktorý sme nastavili na 7 sekúnd. Jedná sa o interval, počas ktorého musí používateľ zareagovať na otázku systému. Ak tento interval vyprší bez toho, aby používateľ reagoval, systém "vyhlási" tzv. noinput udalosť. Udalostiam vo VoiceXML jazyku sa budeme venovať samostatne neskôr.
Na prehrávanie prednahratých audio súborov VoiceXML ponúka <audio>
element. Formát podporovaných súborov je aplikačne-špecifický, čo znamená, že rôzne VoiceXML platformy podporujú rôzne audio formáty.
Nasledujúci VoiceXML kód ukazuje príklad použitia <audio>
elementu:
Príklad 3
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0">
<form id="moj_prvy_dialog">
<block>
<audio src="welcome.wav" caching="fast" fetchhint="prefetch"/>
</block>
</form>
</vxml>
V tomto prípade sa namiesto pozdravu z nášho Hello World! príkladu prehrá nahrávka welcome.wav.
<audio>
element má tieto atribúty:
Doteraz, s vínimkou predposledného príkladu, boli všetky naše VoiceXML kódy napísané tak, že hovoriť mohol iba systém. Používateľ sa k slovu veľmi nedostal. Teraz sa naučíme, ako umožniť prehovoriť aj používateľovi, ako zachytiť tento vstup a ako ho spracovať.
Zachytiť vstup od používateľa je možné pomocou "dialógov", ktoré sú realizované cez formy (<form>
element) alebo cez špeciálne formy realizujúce výber z definovanej ponuky (<menu>
element). Formy sú základné stavebné prvky dialógov. Aby formy mohli realizovať dialóg, musia obsahovať tzv. "vstupné položky" (input items):
<field>
, umožňuje získať rečový vstup od používateľa.<subdialog>
, umožňuje volať iný dialóg (formu) pre získanie vstupu od používateľa.<object>
, umožňuje volať platformovo-špecifické funkcionality<record>
, umožňuje nahrať rečový vstup používateľa do audio súboru<transfer>
, umožňuje presmerovať hovor k inému účastníkovi, napr. pre spojenie so živým operátorom.Formy tiež môžu obsahovať tzv. "riadiace elementy" (control items), ktoré sa odlišujú od vstupných elementov tým, že neumožňujú získavať vstup od používateľa. Ich úlohou je realizovať nejaký "vykonávateľný obsah" (executable content), ktorý realizuje logiku a algoritmy potrebné pre beh aplikácie (napr. <block>
element).
Pre potreby získania vstupu od používateľa sa najčastejšie používa vstupný element <field>
. Najjednoduchší príklad použitia tohto elementu môžeme ilustrovať nasledujúcim príkladom:
Príklad 4
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0">
<form id="moj_druhy_dialog">
<field name="navod">
<prompt> Želáte si vypočuť návod? </prompt>
<grammar root="main">
<rule id="main" scope="public">
<one-of>
<item>áno</item>
<item>nie</item>
</one-of>
</rule>
</grammar>
<filled>
<if cond="navod=='áno'">
<goto next="navod.vxml"/>
</if>
</filled>
</field>
</form>
</vxml>
Príklad 4 ukazuje VoiceXML kód "mikro-dialógu", kde sa systém pýta používateľa, či si želá vypočuť návod. Ak používateľ povie "áno", systém ho presmeruje do VoiceXML skriptu "navod.vxml", ktorý zabezpečí prehratie návodu.
Ako je možné si všimnúť, vstupný element <field>
pozostáva z troch základných častí:
<prompt>
elementom<grammar>
elementom<filled>
, ktorý je vykonaný po tom, čo sa získa vstup od používateľa.Mechanizmus spracovania tohto poľa je nasledovný. Po prehraní výzvy používateľovi sa aktivuje rečová gramatika, ktorá je v tomto prípade realizovaná ako tzv. "vstavaná", nakoľko je priamo súčasťou VoiceXML kódu. Rečová gramatiku tu vymedzuje možný používateľský vstup iba na alternatívne slová "áno" a "nie".
Pre porozumenie toho, ako sa ďalej pracuje so získaným vstupom od používateľa je potrebné vysvetliť pojem tzv. "premennej poľa" (field variable). Premenná poľa je povinne definovaná premenná, ktorá sa vytvorí pre každé vstupné pole s názvom definovaným v jeho name atribúte. V našom príklade 4 dochádza k vytvoreniu premennej poľa na štvrtom riadku:
<field name="navod">
Takto vytvorená premenná slúži na uloženie získaného vstupu od používateľa. To znamená, že výsledok rozpoznávania reči, sa uloží do tejto premennej, čo umožňuje túto informáciu následne spracovať v elemente <filled>
:
<filled>
<if cond="navod=='áno'">
<goto next="navod.vxml"/>
</if>
</filled>
V našom príklade, sme premennú navod testovali podmienke elementu <if>
a na základe tejto podmienky sme nasmerovali dialóg k prehratiu návodu, ktorý sa nachádza v súbore navod.vxml. Na presun do iného dokumentu sme použili element <goto>
, ktorý si predstavíme neskôr.
Nie len vstupné polia majú asociované premenné, ale taktiež každý element, ktorý označujeme ako formovú položku (Form item). Táto "povinnosť" súvisí s druhou veľmi dôležitou funkciou premenných formových položiek (Form item variables), nakoľko tieto slúžia ako tzv. "guard conditions" alebo "dohliadacie podmienky". V princípe táto funkcionalita zabezpečuje dohľad nad tým, či daná položka formy už bola prehliadaná, resp. či môže byť prehliadaná (interpretovaná). Dohliadacie podmienky sú základným mechanizmom tzv. formového interpretačného algoritmu (Form Interpretation Algorithm), ktorý riadi vykonávanie <form>
elementov. Tento mechanizmus funguje nasledovne: Každá položka formy (element, ktorý je priamym potomkom formy) má definovanú premennú, ktorej názov je špecifikovaný name atribútom daného elementu. Pri vytvorení týchto premenných, ich defaultná hodnota je nastavená na undefined. Teda sú prázdne, bez hodnoty. V prípade vstupných polí, sú ich premenné naplnené vstupom od používateľa (napr. výsledkom rozpoznávania reči). V prípade ostatných formových položiek, premennej môže byť hodnota priradená jej vykonaním, resp. priradením hodnoty, ktoré definuje vývojár rečovéj aplikácie. Mechanizmus tzv. dohliadacej podmienky funguje tak, že pre rozhodnutie o vykonaní danej položky testuje, či jej premenná má alebo nemá priradenú hodnotu. Ak daná premenná nemá priradenú hodnotu, daná položka formy (element) sa vykoná (a jej premenná sa naplní). Ak táto premenná má hodnotu, tak daný element sa preskočí.
Príklad 4 predstavuje najčastejší spôsob použitia vstupného poľa <field>
, avšak existujú aj ďalšie variácie najmä čo sa týka realizácie gramatiky. Rečové gramatiky sa častejšie definujú v ich explicitnej forme, teda ako externé gramatiky, ktoré sú definované v samostatných súboroch. Tvorbe a spracovaniu rečových gramatík podľa W3C špecifikácie SRGS sa budeme venovať na nasledujúcom cvičení.
Úloha 3. Napíšte jednoduchú VoiceXML aplikáciu s jednou formou, ktorá pozostáva z jedného vstupného poľa <field>
, ktorá sa spýta používateľa ako sa má. Ak má užívateľ zlú náladu, pokúste sa mu ju vylepšiť.