MASARYKOVA UNIVERZITA
FAKULTA INFORMATIKY
Webové rozhraní pro interpret JVoiceXML
BAKALÁŘSKÁ PRÁCE
Marek Pivoda
Brno 2012
ii
Prohlášení
Prohlašuji, že tato práce je mým původním autorským dílem, které jsem vypracoval samostatně.
Všechny zdroje, prameny a literaturu, které jsem při vypracování používal nebo z nich čerpal, v práci
řádně cituji s uvedením úplného odkazu na příslušný zdroj.
Vedoucí práce: Mgr. Luděk Bártek, Ph.D.
iii
Poděkování
Za námět práce, cenné rady při její realizaci, bych rád poděkoval vedoucímu této bakalářské práce
Mgr. Luďku Bartkovi, Ph.D.
iv
Shrnutí
Jádrem této práce je volně dostupný VoiceXML interpret JVoiceXML, který je napsán v jazyce Java.
Výstupem této práce je návrh a implementace rozšiřujícího modulu interpreta pro komunikaci přes
webové rozhraní textovou formou. Takto vytvořený modul s pomocí protokolu HTTP komunikuje
s rozhraním.
v
Klíčová slova
VoiceXML, interpret, JVoiceXML, Java, servlet, JavaScript, Json
vi
Obsah
1 Úvod................................................................................................................................................ 1
2 Jazyk VoiceXML ............................................................................................................................ 2
2.1 Historie.................................................................................................................................... 2
2.2 Architektura............................................................................................................................. 2
2.3 VoiceXML interprety.............................................................................................................. 3
3 JVoiceXML..................................................................................................................................... 4
3.1 Architektura............................................................................................................................. 4
3.2 Pomocné technologie .............................................................................................................. 5
3.2.1 Java.................................................................................................................................. 5
3.2.2 Apache Ant...................................................................................................................... 5
3.2.3 Apache Log4j .................................................................................................................. 5
3.2.4 Servlet kontejner ............................................................................................................. 6
4 Analýza problému ........................................................................................................................... 7
5 Návrh řešení .................................................................................................................................... 9
5.1 Textová implementace JVoiceXML ....................................................................................... 9
5.1.1 Třída TextServer ............................................................................................................. 9
5.1.2 Rozhraní TextListener..................................................................................................... 9
5.1.3 Rozhraní Session........................................................................................................... 10
5.2 Návrh modulu........................................................................................................................ 10
5.3 Návrh webového rozhraní ..................................................................................................... 11
5.4 Komunikace .......................................................................................................................... 11
6 Implementace ................................................................................................................................ 13
6.1 Vývojové prostředí................................................................................................................ 13
6.2 Textový modul ...................................................................................................................... 13
6.2.1 Funkcionalita................................................................................................................. 13
6.2.2 Třída ModuleChat ......................................................................................................... 14
6.2.3 Třída TextClient............................................................................................................ 16
6.3 Webové rozhraní ................................................................................................................... 17
6.3.1 Funkcionalita................................................................................................................. 17
6.3.2 Odesílání dat.................................................................................................................. 17
6.3.3 Načítání výstupů............................................................................................................ 18
7 Závěr ............................................................................................................................................. 19
1
1 Úvod
V posledních letech je stále populárnější používání hlasových služeb k obsluze zařízení. Již zcela
běžné se stalo hlasové ovládání u mobilních zařízení. VoiceXML [1] je jeden z několika jazyků, který
nabízí rozsáhlé možnosti pro interakci mezi člověkem a počítačem. Využívá k tomu uspořádané
VoiceXML dokumenty, které tvoří dialogové aplikace, které umožňují řízenou komunikaci
s počítačem. Pro spuštění dialogových aplikací je potřeba interprety VoiceXML. Jeden z volně
dostupných je JVoiceXML [2], kterému je věnována tato práce. Interpret je napsán v jazyce Java [3],
který umožňuje interpret škálovat a tak pohodlně rozšiřovat o nové moduly.
V této práci se zaměříme na komunikaci v textové formě přes webové rozhraní. Jelikož
potřebný modul interpretu chybí, je cílem práce takový modul navrhnout a sestrojit. Komunikačním
protokolem bude HTTP protokol [4], který nabízí přirozený způsob komunikace pro webové rozhraní.
Řešení vyžaduje, aby výsledný modul byl dostupný přes internet a současně úzce komunikoval se
samotným interpretem. Webové rozhraní bude sloužit jako vstupní bod pro uživatele ke komunikaci
s interpretem.
2
2 Jazyk VoiceXML
VoiceXML (Voice eXtensible Markup Language) je značkovací jazyk pro návrh dialogů, který
vychází ze syntaxe XML (eXtensible Markup Language) [5]. Tento jazyk slouží pro návrh hlasových
dialogů, které umožňují rozpoznávání lidské řeči a následně i vytvoření syntetizované řeči jako jeden
z možných výstupů. VoiceXML také navíc dokáže přijímat DTMF (Dual-tone multi-frequency
signaling) [6] vstupy z telefonních zařízení. Hlavním cílem jazyka je umožnit komunikaci mezi
člověkem a počítačem lidskou řečí a zpřístupnit webový obsah do dialogových systémů. V současné
době má jeho vývoj pod kontrolou konsorcium W3C [7] jako projekt Voice Browser [8].
2.1 Historie
Vývoj jazyka VoiceXML začal již v roce 1995, kdy společnost AT&T vytvořila projekt s názvem
Phone Markup Language (PML). V této době se však existovala i řada dalších projektů zabývajících
se vývojem jazyka na návrh dialogů, například společnost IBM vyvíjela SpeechML [9], Motorola
VoxML [10] a HP TalkML [11]. Proto byl v roce 1998 sjednocen vývoj jazyka pod jeden projekt
VoiceXML Forum [12], který měl za úkol vytvořit jednotný standard. První verze VoiceXML 1.0
vyšla v roce 2000 a stala se základem pro nový mezinárodní standard W3C, jejímž výsledkem je
VoiceXML verze 2.0.
2.2 Architektura
Dialogové aplikace umožňují přístup k informacím dvěma způsoby. První možností je klasický přístup
přes protokol HTTP (HyperText Transfer Protocol) a webovou stránku. Druhou variantou je připojení
pomocí telefonního zařízení, které naváže telefonní spojení s VoiceXML serverem. Součásti
VoiceXML Serveru je VoiceXML interpret (VoiceXML browser) s nástroji na rozpoznávání řeči a
syntézu řeči (text-to-speech).
Další součásti modelu je dokumentový server, který je většinou nezávislý na zbytku systému a
přístup k jeho obsahu se proto provádí pomocí HTTP požadavků. Dokumentový server spravuje
servisní logiku a podle probíhající komunikace může generovat dynamické webové stránky. Jako
dokumentový server může být použit HTTP server. Celá architektura sytému je znázorněna na
obrázku 2.1 [13].
VoiceXML nabízí několik málo základních principů, které umožňují zjednodušit samotný vývoj:
Minimalizuje komunikaci mezi klientem a serverem
Režie serveru je oddělena od uživatelského kódu
Programátor nemusí řešit nízko-úrovňové programování a podporu platformy
Přenositelnost napříč všemi platformami
Poskytuje silné nástroje s jednoduchým použitím
3
Obrázek 2.1: Schéma architektury VoiceXML
2.3 VoiceXML interprety
Pro zpracování VoiceXML dokumentu je zapotřebí VoiceXML interpret, který dokáže zprostředkovat
komunikaci mezi člověkem a počítačem. Tento interpret bývá ve většině případů připojen k veřejné
telefonní síti. Pomocí modulu pro rozpoznávání řeči je pak následně umožněno zpracování a
vyhodnocení audio vstupu. Uživateli je kromě hlasové komunikace umožněno využít klávesnici na
telefonu metodou DTMF.
Na trhu existuje několik VoiceXML interpretů, mezi nimiž jsou cenové rozdíly podle
distribuční licence. Liší se však často i podporou operačního systému, nebo programovacím jazykem,
ve kterém je interpret napsaný. Komerční interprety poskytují komplexnější řešení a rozsáhlejší
podporu standardu VoiceXML 2.0. Interprety s otevřenou licencí nemusí mít vždy úplnou podporu
standardu, za to však nabízí možnost si libovolně nedostatky sám naprogramovat. Příkladem
komerčního řešení je např. Voxeo ProphecyI [14], k volně dostupným interpretům patří např. Open
VXI VoiceXML Interpreter [15] napsaný v C/C++, nebo JVoiceXML napsaný v Javě. V této práci se
budeme zabývat interpretem JVoiceXML.
4
3 JVoiceXML
JVoiceXML je volný VoiceXML interpret napsaný v jazyce Java, jenž podporuje standardy
VoiceXML 2.0 a jeho rozšíření VoiceXML 2.1. Je navržen pro vytváření hlasových dialogů, včetně
syntézy řeči, digitalizace zvuku, rozpoznávání řeči a jeho nahrávání. Mimo jiné zvládá práci s telefony
pomocí DTMF vstupů a tvorbu VoiceXML dokumentů. Využívá GNU library general public licenci
[16], která poskytuje možnost bezplatného použití JVoiceXML knihovny v komerčních projektech.
Všechny zdroje jsou volně dostupné na serveru SourceForge.net.
3.1 Architektura
JVoiceXML je napsán v objektově orientovaném jazyce Java, díky němuž je JVoiceXML na
platformě nezávislý. Pro zajištění chodu JVoiceXML je zapotřebí dokumentového serveru.
Jako dokumentový server je běžně využíván web server, pro ukládání VoiceXML dokumentů je však
možné použit i servlet [17] kontejnery. Dokumenty bývají přístupné přes HTTP nebo jiné typy
protokolů. JVoiceXML běží jako samostatný server. Funguje jako hlavní komponenta, která obsahuje
interpret, získává data z dokumentového serveru a vytváří sezení s klientskými aplikacemi. Při
instalaci je možné vybrat z několika platforem lišících se podporou vstupu a výstupu. Pro
rozpoznávání řeči a její syntézu slouží platforma JSAPI (Java Speech API) [18], pro ovládání
telefonních hovorů pak platforma JTAPI (Java Telephony API) [19], a pro komunikaci textovou
formou platforma textová.
Poslední komponentu architektury tvoří klientská aplikace, která k JVoiceXML přistupuje
pomocí JNDI (Java Naming and Directory Interface) [20] a RMI (Remote Method Invocation) [21], a
díky čemuž dokáže aplikace vzdáleně volat Java třídy interpreta a jeho metody. Viz obrázek 2.1 [22].
Obrázek 2.1: Základní architektura JVoiceXML
5
3.2 Pomocné technologie
Největší výhodou JVoiceXML je otevřená licence LGPL, pod kterou je program distribuován, což je
dáno především použitím volně dostupných softwarů a technologií. Kromě programovacího jazyku
Java jsou využívány např. programy Ant, Log4j a servlet kontejner.
3.2.1 Java
JVoiceXML je naprogramovaný v objektově orientovaném jazyce Java. To umožňuje jednoduché
dělení celého programu na moduly, a tím i snadné rozšíření o případné další moduly. Modul je tvořen
jednou a více třídami, které využívají základní metody z jádra JVoiceXML. Pokud se uživatel
rozhodne pro vývoj, potřebuje Java EE 6 SDK (Software Development Kit) verze 6.
3.2.2 Apache Ant
Apache Ant je pomocný nástroj pro vývojáře v jazyce Java používaný zejména ve větších projektech
s více než jedním programátorem. Ant bývá používán k automatizaci některých činností, jako jsou
např. kompilace programu, testování a vytvoření balíku pro distribuci, apod. Skripty jsou napsány ve
formátu XML. Za vývojem stojí organizace Apache Software Foundation [23]. Doporučená verze
k JVoiceXML je alespoň 1.7.0. Většina Java IDE (Integrated Development Environment) již má
podporu pro Ant.
3.2.3 Apache Log4j
Apache Log4j je pokročilý logovací nástroj pro jazyk Java. V současnosti je vyvíjen organizací
Apache Software Foundation [24] pod otevřenou licencí Apache License 2.0. Log4j nabízí rozsáhlou
podporu pro zaznamenávání běhu programu s pomocí několika úrovní zpráv. Viz tabulka 3.1.
V JVoiceXML je použita verze 1.2.15.
6
Úroveň Popis
OFF Nejvyšší možná úroveň, vypíná logování.
FATAL
Závažné chyby, které způsobí předčasné ukončení programu. Očekává se, že budou
zobrazeny na konzole.
ERROR
Jiné běhové chyby nebo neočekávané výjimky. Očekává se, že budou ihned zobrazeny na
konzole.
WARN
Použití nechváleného API, jiné nežádoucí nebo neočekávané běhové situace, které nemusí
být nutně špatné. Očekává se, že budou ihned zobrazeny na konzole.
INFO
Zajímavé běhové události (start/konec). Očekává se, že budou ihned zobrazeny na konzole,
proto pouze stručná zpráva.
DEBUG Detailní informace o chodu systému. Očekává se, že budou zapisovány pouze do logů.
TRACE Bližší informace. Očekává se, že budou zapsány pouze do logů, od verze 1.2.12.
Tabulka 3.1: Seznam úrovní logů
3.2.4 Servlet kontejner
K plnému nasazení JVoiceXML je potřeba servlet kontejneru, který může sloužit jako dokumentový
server. Servlet kontejner podporuje Java API javax.servlet. V současnosti existuje celá řada volně
dostupný servletů. Asi nejvíce rozšířený a také pro JVoiceXML doporučený je Apache Tomcat [25]
vyvíjený organizací Apache Software Foundation. Mezi další volně dostupné servlety patří GlassFish
[26], JBoss Application Server [27], Jetty [28] aj. Jelikož mezi servlety nejsou výraznější rozdíly, je
výběr servletu k JVoiceXML čistě na vývojáři. V této práci jsme zvolili servlet Jetty.
7
4 Analýza problému
Výsledek této práce má JVoiceXML rozšířit o možnost komunikovat s uživatelem přes jednoduché
webové rozhraní. Z důvodu zobrazení vstupů uživatele a výstupů interpreta v textové formě byla
použita textová platforma JVoiceXML. Vstupní a výstupní webové rozhraní by mělo uživateli
nabídnout několik základních funkci k obsluze, a také zpracovávat vstupní a výstupní textové řetězce
do odpovídajícího formátu tak, aby vznikl pomyslný vzhled chatu mezi uživatelem a počítačem.
Každá zpráva by měla být označena jménem odesílatele. Uživatelské požadavky jsou poté přes
webové rozhraní posílány na jednoduchý server. Využití webového rozhraní je znázorněno na obrázku
4.1.
Obrázek 4.1: Diagram užití I/O rozhraní
Vstupní/výstupní webové rozhraní nabízí uživateli dvě varianty zvolení dokumentu. První varianta
uživateli umožňuje vybrat dokument přes protokol HTTP. Druhou variantou je načtení dokumentu
z lokálního úložiště interpreta. Rozhraní musí vytvořit seznam dostupných dokumentů. Uživatel dále
může spustit interpretaci daného dokumentu a také jí následně ukončit. Během interpretace dokumentu
rozhraní zobrazuje chronologicky vstupy a výstupy. Uživatel má možnost vkládat vstupy a odesílat je.
Na straně druhé je jednoduchý chat modul umístěn mezi webové rozhraní a interpret a
zastupuje funkci jednoduchého serveru a rozšiřujícího modulu pro JVoiceXML. Chat modul zajišťuje
spojení mezi rozhraním a textovou platformou JVoiceXML a jako server musí přijímat a rozpoznávat
8
HTTP požadavky od webového rozhraní a následně na ně adekvátně reagovat. Současně však musí
obsluhovat připojení k interpretu, vytvořit, udržet a zrušit sezení s interpretem, odesílat uživatelské
vstupy interpretu a opačným směrem posílat odpovědi interpreta. Hlavní požadavky na modul jsou
zachyceny na obrázku 4.2. Celé řešení pracuje na principech klient-server.
Obrázek 4.2: Diagram užití modul chat
9
5 Návrh řešení
V této kapitole se podrobněji zaměříme na problematiku textové implementace JVoiceXML a návrhu
jeho webového rozhraní z pohledu použitých technologií. Celý návrh je následně doplněn diagramem
tříd.
5.1 Textová implementace JVoiceXML
Textová implementace JVoiceXML je ukrytá v API org.jvoicexml.implementation.text. Třináct tříd
v ní obsažených poskytuje dostatečný prostor pro vývojáře. V této práci nás zajímají hlavně třídy
z podbalíku org.jvoicexml.implementation.text, který obsahuje čtyři třídy a jedno rozhraní.
5.1.1 Třída TextServer
Třída TextServer slouží jako rozhraní pro připojení k interpretu JVoiceXML textovou formou. Třída
funguje jako socket server implementující rozhraní Runnable. K serveru se následně připojují textoví
klienti, v našem případě chat modul. Připojený textový klient je pak schopen číst výstupy od interpreta
a odesílat zpět odpovědi. Textový klient je definován rozhraním TextListener. Třída TextServer je
schopna registrovat a následně obsluhovat až 28 textových klientů. Díky třídě Thread, kterou
TextServer rozšiřuje, dokáže server zpracovávat požadavky paralelně.
Po spuštění si server ukládá své posluchače pomocí metody addTextListener(TextListener).
Pro odeslání uživatelského vstupu na interpret slouží metoda sendInput(String). Činnost serveru se
ukončí metodou stopServer().
5.1.2 Rozhraní TextListener
Předepsané rozhraní TextListener nabízí celkem pět veřejných metod, které musí každý textový klient
libovolně implementovat. Těchto pět základních metod zajišťují jednotné ovládání s TextServerem, viz
tabulka 5.1.
Mezi nejdůležitější metody patří outputSsml(org.jvoicexml.xml.ssml.SsmlDocument) a
outputText(String), které mají obsluhovat příjem výstupů od interpreta. Metoda outputSsml pracuje
se souborem typu SSML (Speech Synthesis Markup Language) [29], často používaný pro tvorbu audio
knih. Vhodnější metoda pro tuto práci je outputText, která využívá pouze textové řetězce. Další zbylé
metody se týkají navázání spojení se serverem.
10
návratový typ metoda
void connected(InetSocketAddress)
void outputSsml(org.jvoicexml.xml.ssml.SsmlDocument)
void outputText(String)
void started()
void disconnected()
Tabulka 5.1: Seznam metod rozhrani TextListener
5.1.3 Rozhraní Session
Rozhraní Session je umístěné v balíku org.jvoicexml. Definuje sedm základních funkcí pro vytvoření
sezení mezi interpretem a klientem. Vzdálený klient spouští komunikaci a sezení s interpretem pomocí
metody call(URI), během níž se načte kořenový dokument a začne jeho interpretace. Další důležitou
funkcí je hangup(), která slouží k ukončení sezení, a metoda waitSessionEnd(), která čeká na konec
sezení. Tyto tři nejdůležitější metody jsou použity ve třídě TextClient.
5.2 Návrh modulu
Výsledný modul musí umět simulovat server pro komunikaci s webovým rozhraním a současně
navázat spojení s TextServerem, proto je nezbytná implementace rozhraní TextListener.
Z těchto důvodu byly vytvořeny dvě třídy, každá třída funkcionálně jednoznačná. Třída
ModuleChat představuje servlet, umístěn v kontejneru Jetty. Rozšiřuje třídu HttpServlet, obsluhuje
HTTP požadavky a jejich odpovědi metodou doPost. Současně uchovává všechny zprávy celé
komunikace a postupně je vypisuje.
Třída TextClient zastupuje textového klienta, která má na starost připojení k TextServeru.
Implementuje třídu TextListener. Nejdůležitější metody jsou outputSsml a outputText pro získávání
výstupu od interpreta, dále pak metoda sendInput pro posílání uživatelského vstupu interpretu. Metoda
execute spouští interpretaci daného dokumentu. O samotné připojení k TextServeru se starají metody
started a disconnected. Na obrázku 5.2 je znázorněn diagram tříd.
11
Obrázek 5.2: Diagram tříd
5.3 Návrh webového rozhraní
Druhou částí aplikace je webové rozhraní sloužící jako vstupní uživatelské rozhraní, pomocí něhož
bude uživatel přistupovat k obsluze JVoiceXML. Uživatelské rozhraní je spustitelné v libovolném
webovém prohlížeči. K sestrojení uživatelského rozhraní byly použity běžné webové technologie jako
HTML (Hyper Text Markup Language) [30], CSS (Cascading Style Sheets) [31] a AJAX
(Asynchronous Javascript And Xml) [32].
Layout celého rozhraní tvoří vstupní a výstupní prvky. Největší část tvoří výstupní textové
pole umístěné v horní polovině rozhraní. Do pole se vypisují komunikace mezi interpretem a
uživatelem. Výstupní pole má fixní rozměry a v případě většího obsahu se vytvoří vertikální rolovací
lišta. Ve spodní polovině rozhraní jsou umístěny vstupní prvky, vstupní textové pole pro zadávání
uživatelských vstupů a ovládací tlačítka, např. pro odesílání.
5.4 Komunikace
V této podkapitole jsou popsány některé vztahy při komunikaci modulu. Detailnější popis zahrnující
danou implementaci je v 5. Kapitole.
Uživatelské rozhraní reprezentuje HTML stránka, proto veškerá komunikace s modulem je
zastoupena protokolem HTTP, který poskytuje pro HTML nativní nástroj. Přímo pro odesílání dat
z rozhraní je využita metoda POST, a to zejména pro potřebu posílání většího množství dat, než by
bylo vhodné pro metodu GET. Současně je potřeba posílat různé HTTP požadavky, které musí být
následně na straně serveru identifikovány a dále zpracovány, požadavek na spuštění interpretace,
požadavek na ukončení interpretace, zasílání uživatelských odpovědí a požadavky na získávání dat od
interpreta.
12
Na straně serveru je vytvořeno spojení s interpretem. Při startu serveru třída ModuleChat
vytváří novou instanci třídy TextClient. Následně pří obdržení spouštěcího HTTP požadavku třída
ModuleChat volá metodu call(URI) třídy TextClient, a tím spouští interpretaci daného VoiceXML
dokumentu.
Třída TextClient komunikuje s třídou TextServer pomocí předem definovaného rozhraní
TextListener. Třída TextClient vytváří instanci třídy TextServer na daném portu a je pak následně
přidána jako její posluchač. TextClient posílá výstupy interpretu pomocí metody sendInput(String).
Odpovědi interpreta jsou metodami outputText() a outputSsml() posílány třídě ModuleChat.
Komunikace mezi třídou TextServer a interpretem je součásti textové implementace
JVoiceXML a proto v této práci není dále rozebírána.
Obrázek 5.3: Schéma komunikace
13
6 Implementace
Tato kapitola je věnována implementaci výsledného řešení, jehož součásti je textový modul a vstupní
rozhraní. Detailněji jsou zde popsány struktury tříd a důležitých metod. První polovina kapitoly je
věnována řešení textového modulu, který rozšiřuje interpret. V druhé části kapitoly je pak nastíněno
chování webového rozhraní, sloužící jako vstupní rozhraní pro textový modul.
6.1 Vývojové prostředí
Textový modul byl vyvíjen jako rozšiřující modul k interpretu JVoiceXML, který umožní
komunikovat textovou formou přes webové rozhraní. Jako testovací verze interpreta byla použita
poslední dostupná verze 0.7.4.GA, jež je k dispozici ke stažení na serveru sourceforge.net. K napsání
textového modulu byl použit jazyk Java vycházející z požadavku interpreta, který je také napsán ve
stejném programovacím jazyce. Jako vývojové prostředí k Javě bylo použito NetBeans [33]. Dále byl
použit program ANT, který byl součásti NetBeans, k vytváření WAR souborů. Celé řešení pak bylo
testováno na servlet kontejnerech Jetty a Apache Tomcat.
6.2 Textový modul
Textový modul slouží jako server spouštěn na servlet kontejneru, který obsluhuje HTTP požadavky od
webového rozhraní a současně navazuje spojení s interpretem, přijímá výstupní data od interpreta a
posílá vstupní data. Textový modul se skládá z 2 tříd ModuleChat a TextClient. Třída ModuleChat
rozšiřuje třídu HttpServlet z balíku javax.servlet.http a slouží jako server. Druhá třída TextClient
zastupuje posluchače k třídě TextServer, která je součásti textové platformy interpreta. TextClient
implementuje rozhraní TextListener.
6.2.1 Funkcionalita
Textový modul je spuštěn na Java servletu, od webového rozhraní přijímá především POST
požadavky, které jsou rozlišeny na 4 typy. Pro výměnu dat je zvolen datový formát JSON (JavaScript
Object Notation), který je platformě nezávislý a oproti XML může být úspornější [34]. Každý typ
požadavku je odlišený klíčem type. Pro hodnotu klíče type byla vybrána číselná hodnota, např. ‘type‘:
0.
První požadavek je typu FILE, jeho úkolem je zjistit a vypsat obsah složky file, která slouží
jako úložiště pro vxml dokumenty.
Další požadavek je START, slouží k zahájení interpretace, součásti požadavku je adresa na
kořenový vxml dokument dialogové aplikace. Tato URL se pak stává parametrem funkce execute,
která je součásti vytvořené instance třídy TextClient. Metoda execute vytvoří spojení s TextServerem a
získá výstup od interpreta.
Třetí požadavek je typu UPDATE. Po obdržení požadavku modul porovná počet všech
uložených zpráv s počtem již odeslaných zpráv na rozhraní. V případě, že počty zpráv nesedí, modul
14
odešle neodeslané zprávy na rozhraní. Požadavek UPDATE je automaticky posílán v intervalu
několika sekund.
Čtvrtý požadavek je typu SEND, pomocí něhož rozhraní posílá uživatelské vstupy interpretu.
Modul obdrží výstup v textové podobě, který metodou sendInput odesílá interpretovi. Následně pak
výstup upraví do odpovídajícího tvaru, přidá jméno odesílatele (User) a uloží do seznamu
listOfMessages.
Poslední požadavek STOP signalizuje ukončení interpretace od uživatele. Modul zruší sezení
s interpretem a vymaže všechny uložené zprávy. Tabulka 6.1 znázorňuje číselné rozložení požadavků.
Podrobnější popis reakcí na HTTP požadavky u metody doPost.
Typ požadavku Číselná hodnota function
FILE 0
START 1
UPDATE 2
SEND 3
STOP 4
Tabulka 6.1: Přehled typů požadavků
6.2.2 Třída ModuleChat
Třída ModuleChat je hlavní třídou celého modulu, slouží jako spojovací uzel mezi webovým
rozhraním a třídou TextClient. Pomocí třídy HttpServlet, kterou rozšiřuje, plní funkci servletu. Třída je
inicializována při startu kontejneru Jetty metodou init(). Po startu je třída připravena přijímat HTTP
požadavky od rozhraní, především pak požadavky odeslané metodou POST. O třídění a zpracování
POST požadavků se stará metoda doPost(), která je součásti třídy HTTPServlet. V doručených
požadavcích jsou data distribuované ve formátu JSON , pro jejich zpracování potřebuje třída externí
knihovnu třetí strany. Existuje několik Java knihoven pro zpracování JSON, v této práci jsme použili
volně dostupnou knihovnu JSON.simple [35]. Mezi další Java knihovny patří GSON [36], JsonLib [37]
a FlexJson [38], aj.
Dále má třída tři důležité parametry – numOfMessages, listOfMessages a textClient. Parametr
NumOfMesages reprezentuje číselnou hodnotu typu int, která uchovává počet zpráv vypsaných na
webovém rozhraní. Druhý důležitý parametr je textClient jenž uchovává odkaz na instanci třídy
TextClient. Třetí parametr listOfMessages zastupuje seznam všech doručených zpráv od uživatele a
interpreta. Zprávy jsou uložené jako typ String. Typ seznamu byl zvolen jako ArrayList a to pro své
výhody, možnost přístupu k libovolnému prvku seznamu v konstantním čase O(1) a dynamické
zvyšování kapacity seznamu. Každá zpráva v seznamu je uložena ve tvaru UserZpráva nebo SystemZpráva, podle toho
kdo jí poslal.
15
Metoda doPost
Metoda doPost řídí celý běh textového modulu a proto je nejdůležitější metodou. Metoda přijímá
HTTP požadavky odeslané metodou POST, podle jejichž typu se pak určuje chování modulu. Metoda
je rozdělena na pět větví podle typu požadavků, větvení se provádí pomocí příkazu SWITCH. Třídění
požadavků se provádí podle jeho typu, který je reprezentován číselným indexem. Typ HTTP odpovědí
vytvořených metodou je nastaven na application/json;charset=UTF-8.
Pro vytvoření odpovědi ve formátu JSON byla použita třída JSONObject z balíku
org.json.simple.JSONObject, následně pak byly vytvořeny dvojice klíč : hodnota. Takto hotový objekt
byl pak převeden na řetězec pomocí metody toJSONString(), která zajistila zachování validity
formátu.
V případě požadavku typu FILE, byl vytvořen JSONObject s názvy všech vxml souborů
vypsaných do seznamu pod klíč file. Požadavek typu START vrací jako odpověď vybraný vxml
dokument, který slouží jako root dokument dialogové aplikaci. Odpověď pro požadavek typu
UPDATE obsahuje dva klíče, text a num. Pod klíč num je uchován počet celkem odeslaných zpráv na
rozhraní. Klíč text reprezentuje nové zprávy pro rozhraní. V případě existence nových zpráv je
vytvořen z nich seznam, v opačném případě je hodnota false.
Větev pro požadavek typu SEND rozlišuje požadavky na běžné uživatelské vstupy a na název
spouštěcího vxml dokumentu. Pokud příchozí zpráva obsahuje název vstupního vxml dokumentu,
V případě vxml souboru je jeho adresa uložena metodou setURI. Jako odpověď pro všechny
požadavky vrací počet uložených zpráv.
Poslední větev zpracovává požadavek typu STOP, ten vrací jako odpověď řetězec finished
interpreting. Tabulka 6.1 obsahuje ukázky odpovědí pro některé typy požadavků.
16
Typ požadavku Odpověď
FILE
{
"file":[
"input.vxml",
"kopie.vxml"
]
}
START
{
"url":"http://localhost:8080/ModuleChat/file/input.vxml"
}
UPDATE
(nová zpráva)
{
"text":[
"User<\/span>hello world!"
],
"num":1
}
UPDATE
(žádná zpráva)
{
"text":false,
"num":1
}
Tabulka 6.1: Přehled HTTP odpovědí
6.2.3 Třída TextClient
Textová platforma interpreta je implementována pomocí třídy TextServer, která vytváří prostředníka
mezi interpretem a klientem, posluchačem. Aby bylo možné navázat bezproblémové spojení
s interpretem, resp. s TextServerem, musela být vytvořena třída TextClient. Pro dodržení kompatibility
s interpretem musí každý klient implementovat rozhraní TextListener z knihovny JVoiceXML
z podbalíku org.jvoicexml.implementation.text a rozšiřuje třídu Thread. Po startu modulu je vytvořena
instance třídy, odkaz na ní je uložen do parametru třídou ModuleChat, spouští se pro vytvoření nového
sezeni s interpretem. Při tvorbě sezení je uložen objekt typu TextServer z balíku
org.jvoicexml.client.text do parametru textServer. Samotné sezení s interpretem je uložené do
parametru session typu Session z balíku org.jvoicexml. Parametr connected typu boolean udává, jestli
je klient připojen k interpretu.
Metoda outputText
Hlavní metoda pro příjem výstupů od interpreta, jako parametr metody je textový řetězec typu String.
Metoda k výstupu přidává řetězec System. Následně je takto vytvořený
řetězec vložen na konec seznamu listOfMessages ve třídě ModuleChat. Metodu outputText využívá i
metoda outputSsml.
17
Metoda execute
Metoda execute spouští interpretaci vxml dokumentu. Jako první nastaví vlastnosti pro připojení
pomocí RMI (Remote Method Invocation), následně pomocí metody lookup(“JVoiceXml“)
z balíku java.rmi.Naming získá klient vzdálené rozhraní typu Remote z balíku java.rmi.Remote, které
musí následně přetypovat na JVoiceXml. Nakonec metoda vytvoří instanci TextServeru a samotné
sezení mezi ním. Struktura metody execute vychází z uživatelské příručky JVoiceXML.
6.3 Webové rozhraní
Webové rozhraní má za úkol umožnit uživateli připojení k interpretu a obsluhu interpretace
dokumentu. Rozhraní se připojuje k textovému modulu pomocí HTTP protokolu, pomocí něhož
odesílá požadavky metodou POST. Pro přenos dat byl vybrán formát JSON a to zejména pro
kombinaci s AJAXem. Rozhraní funguje jako HTML stránka, která obsahuje ovládací prvky, na které
jsou navázány události řízené pomocí JavaScriptu. Webové rozhraní je uloženo na lokální adrese
http://localhost:8080/ModuleChat/. Kromě html stránky je součásti rozhraní CSS soubor style.css,
který má na starost formátování prvků na stránce. A soubor chat.js ve formátu JavaScript, který
obsahuje pro větší přehlednost hlavní funkce rozhraní.
6.3.1 Funkcionalita
Navržené webové rozhraní poskytuje možnost uživateli se připojit k interpretovi a vytvořit vzájemnou
komunikaci pomoci vkládání textových vstupů. Rozhraní je vytvořeno pomocí webových technologií,
jako jsou HTML, CSS, JavaScript s použitím frameworku jQuery [5.3]. Uživatel přistupuje k rozhraní
pomocí webového prohlížeče, komunikace s interpretem je prováděna pomoci protokolu HTTP.
Výstupy všech komunikujících stran jsou vypsány v horní části stránky. Vkládání vstupů od uživatele
je prováděno pomocí formuláře, který je tvořen textovým polem. Uživatel má k dispozici čtyři tlačítka
– Send, Select file, Start a Stop.
Zahájení činnosti rozhraní je přes tlačítko Select file, to vyvolá vypsání na výstup všech
možných vstupních vxml dokumentů a uživatel je vyzván, aby zadal název jednoho z dokumentů.
Samotné zahájení interpretace vybraného dokumentu se provádí pomocí tlačítka Start. Poté je již
rozhraní připravené přijímat a odesílat vstupy. Ukončení interpretace se uskuteční tlačítkem Stop, kdy
je odesílání vstupů a jejich vypisování zablokováno. Interpretace se pak znovu spouští přes výběr
nového dokumentu, tlačítko Select file. Odesílání vstupu z textového pole je přes tlačítko Send nebo
klávesu ENTER, bez nutnosti znovu načtení stránky. Volání funkcí je omezeno pravdivostní hodnotou
instanse, která funguje jako přepínač, její hodnotu může změnit jen funkce selectFile a StopChat.
6.3.2 Odesílání dat
Pro zadávání textových vstupu slouží textové pole ve spodní části stránky. Samotné odesílání je
aktivováno tlačítkem Send nebo klávesou Enter. Textové vstup je omezen na rozsah 100 znaků.
Na samotné psaní vstupu jsou vázány jQuery funkce keydown a keyup. Funkce Keydown kontroluje
počet zadaných znaky, v případě překročení limitu se text automaticky ořízne. Funkce keyup
odchytává zmáčknutí klávesnice Enter, jejiž keycode je 13, způsobí zavolání funkce sendChat.
18
Funkce sendChat vytváří HTTP požadavek pomocí metody jQuery.ajax [39]. Požadavek
obsahuje parametry message, nickname a type. Parametr message reprezentuje text vstupu, nickname
uchovává jméno odesílatele a type je index funkce, podle které bude třída ModuleChat třídit.
6.3.3 Načítání výstupů
Načítání všech výstupů od interpreta a od uživatele obstarává funkce updateChat. Funkce je spouštěna
v intervalech po 15 sekundách. Jako první jí volá funkce selectFile, která má na starost vypisování
dostupných vxml dokumentů. Při každém zavolání funkce vytvoří HTTP požadavek obsahující
identifikační číslo type a číselnou hodnotou state, která udává počet zobrazených zpráv na rozhraní.
V případě existence nových zpráv na modulu, jsou obratem nové zprávy odeslány jako HTTP
odpověď ve formátu JSON. Následně je pak funkce updateChat postupně vypíše na výstup.
19
7 Závěr
Práce měla za cíl navrhnout a implementovat textový modul pro JVoiceXML, který měl interpret
rozšířit o možnost komunikovat přes webové rozhraní. A současně vytvořit pro něj toto webové
rozhraní. V úvodní části práce jsou popsány bližší informace o VoiceXML a JVoiceXML a dalších
potřebných technologií. Následuje analýza problému textového modulu a jeho návrh. Poslední část je
věnována samotné implementaci. Výsledný textový modul musí zvládat komunikovat s rozhraním a
současně s interpretem. První část úkolu, komunikace s rozhraním se víceméně podařila úspěšně.
V druhé části se však již nepodařilo navázat spojení s interpretem, třída TextClient nedokázala
vytvořit sezení s třídou TextServer.
20
Literatura
[1] VoiceXML – Voice eXtensible Markup Language. http://en.wikipedia.org/wiki/VoiceXML.
[2] JVoiceXML – The Open Source VoiceXML Interpreter. http://jvoicexml.sourceforge.net/.
[3] ORACLE. Java – Object Oriented Programming Language.
http://www.oracle.com/technetwork/java/index.html
[4] W3C. HTTP – Hypertext Transfer Protocol. http://www.w3.org/Protocols/.
[5] W3C. XML – eXtensible Markup Language. http://www.w3.org/XML/.
[6] DTMF – Dual Tone Multi Frequency Signaling.
http://nemesis.lonestar.org/reference/telecom/signaling/dtmf.html.
[7] W3C – World Wide Web Consortium. http://www.w3.org/.
[8] W3C. Voice Browser. http://www.w3.org/Voice/
[9] IBM. SpeechML. http://xml.coverpages.org/speechML.html.
[10] Motorola. VoxML. http://xml.coverpages.org/voxML.html
[11] W3C. TalkML. http://www.w3.org/Voice/TalkML/
[12] VoiceXML Forum. http://www.voicexml.org/
[13] Components of a VoiceXML Application. http://www.scis.ulster.ac.uk/~kevin/top_voi2.html.
[14] Voxeo Corporation. VoiceCenter IVR.
http://www.voxeo.com/products/voicexml-ivr-platform.jsp.
[15] Vocalocity. OpenVXI. http://sourceforge.net/projects/openvxi/.
[16] GNU. GNU Library general public licence.
http://www.opensource.org/licenses/lgpl-license.php.
[17] ORACLE. Java Servlet. http://www.oracle.com/technetwork/java/javaee/servlet/index.html.
[18] SUN. JSAPI – Java Speech API. http://java.sun.com/products/java-media/speech/.
21
[19] SUN. JTAPI – Java Telephony API. http://java.sun.com/products/jtapi/.
[20] SUN. JNDI – Java Naming Directory Interface. http://java.sun.com/products/jndi/.
[21] Oracle Technology Network. RMI – Remote Method Invocation.
http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136424.html.
[22] Schnelle-Walka, Dirk. JVoiceXML 0.7.4.1.GAUser Guide.
http://garr.dl.sourceforge.net/project/jvoicexml/userguide/0.7.4.1.GA/jvxml-userguide-0.7.4.1.GA.pdf
[23] Apache Ant. Apache Software Foundation. http://ant.apache.org.
[24] Apache Log4j. Apache Software Foundation. http://logging.apache.org/log4j/.
[25] Apache Tomcat. Apache Software Foundation . http://tomcat.apache.org/
[26] GlassFish Application Server. http://glassfish.java.net/
[27] JBoss Application Server. http://www.jboss.org/jbossas
[28] Jetty Webserver. http://www.eclipse.org/jetty/
[29] W3C. Speech Synthesis Markup Language. http://www.w3.org/TR/speech-synthesis/.
[30] W3C. Hyper Text Markup Language. http://www.w3.org/TR/1999/REC-html401-19991224/.
[31] W3C. Cascading Style Sheets. http://www.w3.org/TR/CSS2/.
[32] Asynchronous Javascript And Xml. http://www.adaptivepath.com/ideas/ajax-new-approach-
web-applications.
[33] NetBeans IDE. http://netbeans.org/.
[34] JavaScript Object Notation. http://www.json.org/.
[35] JSONLib java library. http://json-lib.sourceforge.net/.
[36] GSON java library. http://code.google.com/p/google-gson/.
[37] JSON.simple java library. http://code.google.com/p/json-simple/.
[38] FlexJson java library. http://flexjson.sourceforge.net/.
[39] jQuery API. Method jQuery.ajax. http://api.jquery.com/jQuery.ajax/.