A Portál leírása

1. 1 A rendszer komponensei

1.2 VilágHalló kliens

Az alkalmazás platform független, JRE 1.4 környezetben fut. Futtatásához ez a Java futtató környezet szükséges. A program installálására és a verziók követésére a Java WebStart alkalmazás-menedzser rendszert használjuk. A WebStart alkalmazás szintén installálandó a kliens gépen. A WebStart JNLP protokollt használ a kliens alkalmazásnak a VilágHalló szerverről való letöltésére és a verziók ellenőrzésére, automatikus frissítésére.

A kliens program fő feladata könyvek ill. hosszabb szövegek felolvasása. Két módon használható:

Elindítható a kliens számítógépen. Ekkor a felhasználói felület kereső és tallózó funkcióival választható ki a felolvasni kívánt könyv, ill. ennek valamely részlete, vagy folytatható a felolvasás a felhasználó által korábban letett könyvjelzők valamelyikétől.

Indítható a program egy web oldalon elhelyezett link segítségével, mely a VilágHalló szerver által már feldolgozott könyvre való hivatkozást tartalmaz. Ekkor a VilágHalló kliens automatikusan elindul a felhasználó számítógépén és elkezdi felolvasni a linkben hivatkozott szöveget.

A VilágHalló kliens felhasználói felülete konfigurálható a felhasználók igényeinek megfelelően. A konfigurálással a megjelenés (színek, betűméret, stb.), a felolvasás módja (részletesség, sebesség, szintetizátor) és a vezérlés (billentyűkombinációk) állítható be.

Az alkalmazás menüstruktúráját az A. Melléklet tartalmazza.

1.3 VilágHalló szerver

Komponesek

Web szerver

Apache, Tomcat web és alkalmazás szerverek gondoskodnak a VilágHalló szerver oldali komponenseinek futtatásáról és weben keresztüli elérhetőségéről.

ContentServlet

A kliens programokat kiszolgáló egység. A felhasználók nyilvántartását, beléptetését, a könyvjelzők kezelését, a könyvek adatbázisában való keresést végzi és közvetít a hangszerver és a kliens között.

JNLPServlet

A kliens alkalmazás letöltését és frissítését végzi, valamint a gondoskodik az alkalmazásnak a hívási paraméterekkel történő indításáról.

TTS szerver

Egyszerű TCP protokollon keresztül teszi elérhetővé a MS Speech API-n keresztül plug-in-elt text-to-speech motort a ContentServlet számára.

1.4 Nyelvi elemző

1.4.1 A felolvasható szövegek gyűjteménye

A VilágHalló rendszernek "saját gyűjteménye" van a felolvasható szövegekből. Az ide bekerülő szövegeket, könyveket egy előkészítő program dolgozza fel. Ez az előkészítés teszi lehetővé a felhasználók számára a könyvek keresését és a szövegben való navigálást valamint az értelmezett felolvasást.

1.4.2 Előkészítő rendszer

Az előkészítést egy speciális alrendszer végzi. Az alrendszer feladatai:

2. Világhalló protokoljai

2.1 A hang-szöveg protokoll

A Világhalló a hang generálását végző text-to-speech motorokat a saját TTS illesztőjén keresztül tudja a felolvasandó szövegek hangjának generálására használni. A TTS illesztő az MS Speech API - t (Microsoft Speech Application Programming Interface) támogató motorokat képes kezelni.

Az illesztést a tts package Tts osztálya és a hozzátartozó Windows-specifikus wvtts.dll implementálja.

A különböző TTS motorok által generált hang és maga a szöveg a tts, tts.control, tts.client, tts.protocol, tts.server és tts.util Java package-ekben implementált protokolon jut el a felhasználóhoz.

2.2 Adatformátum

A protokol adatformátuma a tts.protocol package osztályaiban definiált.

A protokol nyev- és platform-független: a protokolt definiáló osztályok szerializálása (azaz hálózatra, file-ba vagy bármilyen más külső szállító rétegre történő írása és olvasása) nyelv- és platform független standard szerint történik.

A tömörített hangot a tts.protocol.Wave objektumok sorozata szállítja.

A Wave objektumok a tömörített hang mellett az arra vonatkozó ún. bookmark-okat is tartalmazzák.

A bookmark-ok különböző specializáció (StartMark, Endmark, DoneMark, WordMark, FaceMark) teszik lehetővé a felhasználói (kliens) oldalon a hang és a szöveg szinkronizációját és a szöveg szerinti navigációt. Minden bookmark megjelöli, hogy a hang melyik, byte-ban mért pozíciójára vonatkozik.

StartMark jelzi egy, a motorral egyben kimondatott szövegrészlet - tipikusan mondat - kezdetét. A StartMark hordozza magát a szöveget is.

EndMark jelzi az utolsó StartMark-beli szöveg hangjának végét.

WordMark-ok jelzik a szöveg egyes szavainak kezdetét a hangban.

A FaceMark és DoneMark objektumok a protokol kontrol-adatait csomagolják.

2.3 Kontrol

A kliens és a szerver közötti hang-szöveg adatfolyam vezérlését közvetík a FaceMark-ok és DoneMark-ok.

A klienst a DoneMark megjelenése értesíti arról, hogy a szöveg kimondása befejeződött; az a Wave objektum szállította az utolsó hangdarabot, amelyben a DoneMark megjelent.

A FaceMark-ok jelzik azokat a pontokat, ahol a hang generálását újra lehet kérni úgy, hogy az ugyanazt eredményezze, mint az eredeti generálás. A kliens akkor használja a FaceMark-ot, amikor

akár hálózati hiba miatt vagy
azért, mert úgy ítélte meg, hogy egyelőre elég hangadatot kapott a szervertől és azt már lejátszotta,

a szervertől az éppen hallgatott szöveg folytatását kéri. Az kliensnél játszott és a szervertől a legkésőbbi megérkezett FaceMark-ra kapott hangadatok pontos illesztését végzi a tts.client.WaveStream osztály.

A FaceMark-okat a szerver helyezi el bizonyos Wave objektumokon; a jelenlegi implementáció a mondatok elejét jelöli meg FaceMark-okkal. Ennek az az oka, hogy az ismert text-to-speech motorok szintetizálási egysége a mondat.

2.4 A szöveg protokol

A Világhalló a szerveren tárolt szövegek felolvasására képes. A szövegek nyelvi előfeldolgozás után kerülnek a Világhalló adatbázisába. A nyelvi feldolgozás eredményeként a szövegről ismertté válik a

a szöveg szerkezete aszerint, hogy a szöveget milyen formában kapja a szerver (TEI XML, HTML vagy egyszerű text)
a szöveg mondat-szerkezete
és a kivételesen ejtendő szavak kiejtésmódja.

A strukturális és nyelvi elemzésre és az elemzés eredményének tárolására és további felhasználására a GATE keretrendszert használjuk. Az ún. annotációkat, amik a szöveg-elemzés eredményét hordozzák úgy, hogy csak utalnak a szöveg megfelelő helyére, de nem módosítják azt, SQL adatbázisban tároljuk.

A strukturális elemzés az Empolis Kft. Által kidolgozott, a TEI standardot követő XML formátumú tagolást értelmezve térképezi fel a szövegek szerkezeti vázát.

A GATE nyílt forráskódú, Java-ban implementált keretet definiál a számítógépes nyelvészeti eljárásokra. Az egyszerű tokenizálástól (a szöveg szavakra bontása) a szótövelésen és mondatelemzésen keresztül az ontológia alapú szövegértelmezésig követi és modellezi a nyelvi elemzés állomásait. A GATE-et a többi ismert, nagy nyelvészeti rendszerrel - mint a READ5 vagy a SNOMED - szemben a világos fogalomalkotás és nem utolsósorban a platform-független és rugalmas Java implementáció teszi vonzóvá.

A Világhalló támasztotta speciális igények miatt szükséges volt a GATE néhány részének továbbfejlesztése is. Ebben a keretben oldottuk meg a speciális szavak kiejtését és azt a keretet, ami lehetővé teszi a text-to-speech motorok aprólékos paraméterezését. Mivel a Viághalló-ban alkalmazott Profivox verzió sajnos nem támogatja ezeket a beállításokat, a text-to-speech konfigurálás nem jelenik meg az alkalmazásban

Az elemzés lépései:

Strukturális elemzés - a TEI XML alapján tartalomjegyzék, fejezetek, bekezdések, versek, versszakok, stb. határait határozza meg és annotációként tárolja.

Tokenizálás - definiálható nyelvtan és ún. szabad token-osztályok alapján megállapítja a szóhatárokat. Ezt szintén a szöveg egy annotációjaként kezeli.

Szótövelés - a tokenizálás által létrehozott szavak töveit határozza meg nyelvtan és szótárak segítségével. Az így készült annotáció az alapja a kivételszavak kezelésének.

Kivételszavak kiejtése - a szó nyelvétől és a text-to-speech rendszertől függő módon meghatározza az idegen szó kiejtését. A szöveg itt kettéválik egy megjelenítendő és egy felolvasandó változatra, mely utóbbi a kivételek kiejtését tartalmazza.

Mondatokra bontás - az előző elemzések eredményeit és további szabályokat felhasználva megállapítja a mondathatárokat és annotációként tárolja az eredményt. Ez teszi lehetővé a text-to-speech rendszer meghajtását. A generált szöveg intonációja ui. csak teljes mondatok generálásakor helyes.

A felhasználónál megjelenik a szöveg szerkezete és lehetővé válik szerkezeten történő navigálás (fejezet, versszak, stb. szerint). A szerver a szöveget mondatonként szintetizáltatja a kiválasztott text-to-speech motorral és ennek eredményét a korábban leírt hang-szöveg protokolon juttatja el a felhasználóhoz. Így a felhasználó mondatonként is közlekedhet a szövegben.

A rendszer architektúrája

Melléklet - VilágHalló kliens menü

<?xml version="1.0" encoding="iso-8859-2"?>
<main>
<menu name="reading" inMenu="Y">
<menu name="browse" inMenu="Y">
<menuitem name="titles" type="function" open="getTitleInitials" inMenu="Y">
</menuitem>
<menuitem name="authors" type="function" open="getAuthorInitials" inMenu="Y">
</menuitem>
<menuitem name="topics" type="function" open="getTopics" inMenu="Y">
</menuitem>
<menuitem name="keywords" type="function" open="getKwordInitials" inMenu="Y">
</menuitem>
<menuitem name="languages" type="function" open="getLanguages" inMenu="Y">
</menuitem>
</menu>
<menu name="search" inMenu="Y">
<menuitem name="title" type="dialog" open="searchBooks" inMenu="Y">
</menuitem>
<menuitem name="author" type="dialog" open="searchAuthorBooks" inMenu="Y">
</menuitem>
</menu>
<menuitem name="bookmarks" type="function" open="getBookmarks" inMenu="Y">
</menuitem>
</menu>
<menu name="identify" inMenu="Y">
<menuitem name="login" type="dialog" open="login" inMenu="Y">
</menuitem>
<menuitem name="register" type="dialog" open="register" inMenu="Y">
</menuitem>
</menu>
<menu name="setting">


<menuitem name="usageMode" type="dialog" open="Setting" inMenu="N"></menuitem>
<menuitem name="lookout" type="dialog" open="Setting" inMenu="N"></menuitem>
<menuitem name="voice" type="dialog" open="Setting" inMenu="N"></menuitem>
<menuitem name="keys" type="dialog" open="Setting" inMenu="N"></menuitem>
</menu>
<menu name="help">
<menuitem type="function" name="help1" icon="help.gif" inMenu="Y" inToolBar="Y">
</menuitem>
<separator inToolBar="Y"></separator>
<menuitem type="function" name="about" icon="middle.gif" inMenu="Y" inToolBar="Y">
</menuitem>
</menu>
</main>