V rámci W3C Speech Interface Framework (SIF), ktorého hlavnou súčasťou je jazyk VoiceXML vznikli ďalšie jazyky, ktoré defakto tvoria podporu pre tvorbu rečových interakcií medzi človekom a strojom. Za druhý najvýznamnejší "štandard" z tejto skupiny je možné považovať špecifikáciu pre zápis rečových gramatík označovanú ako W3C SRGS - Speech Recognition Grammar Specification (SRGS). SRGS definuje jazyk, ktorý umožňuje zapisovať kontextovo-nezávislé deterministické gramatiky pre rečový vstup od používateľa a tiež vstup vo forme DTMF voľby.
V marci 2004 bola sfinalizovaná prvá verzia W3C odporúčania - SRGS 1.0, ktorá bola akceptovaná ako štandard pre zápis deterministických rečových gramatík. Rečové gramatiky vo VoiceXML aplikáciach sa riadia práve týmto štandardom, ktorý definuje dve formy zápisu gramatík - XML formu a ABNF (Augmented Backus-Naur form) formu.
Hlavnou výhodou gramatík podľa SRGS odporúčania, v porovnaní s inými formami zápisu, je ich veľmi dobrá čitateľnosť tak pre človeka ako aj pre počítačové systémy. Sila SRGS odporúčania spočíva tiež v kooperácií s ostatnými W3C SIF odporúčaniami, najmä s odporúčaním pre sémantickú interpretáciu (SISR - Semantic Intepretation for Speech Recognition). Pridaním sémantických značiek podľa SISR odporúčania, je možné realizovať proces sémantickej interpretácie veľmi efektívne priamo na základe rečovej gramatiky. W3C SRGS forma zápisu gramatík sa stala široko akceptovaným štandardom, čo dosvečuje veľké množstvo platforiem a systémov, ktoré podporujú takéto gramatiky.
Účelom tohto cvičenia je naučiť sa vytvárať rečové gramatiky podľa tohto štandardu.
SRGS špecifikácia definuje dve formy zápisu gramatík, a to XML a ABNF. Formát XML je webovým štandardom pre reprezentáciu štruktúrovaných dát a je to prehľadnejšia, ale rozsiahlejšia forma zápisu ako ABNF. Ich funkcia je rovnaká, ale líšia sa formou zápisu jednotlivých elementov.
Pri používaní formy XML sa ich názvy dávajú medzi znaky < a > ako napríklad
Forma zápisu ABNF používa špeciálne znaky na určenie toho, v akom elemente sa vnútro nachádza. Medzi tieto špeciálne znaky patrí napríklad $, |, {}, [], ( ).
V prevažnej väčšine prípadov preferujeme XML formu zápisu gramatík a preto budeme prednostne používať túto formu.
Pre skonštruovanie rečovej gramatiky je potrebné poznať význam základných SRGS elementov, preto si ich v skratke predstavíme.
Prvou vecou pri konštrukcii gramatiky je vytvorenie samotnej kostry súbory gramatiky. Gramatika pozostáva z hlavičky a tela.
Gramatiky začínajú deklaráciou vo svojom prvom riadku, kde sa deklaruje forma gramatiky a tiež spôsob kódovania znakov encoding. Pre formu ABNF môže mať tento riadok podobu:
# ABNF 1.0 ISO-8859-1;
a pre formu XML je možná podoba nasledovná:
<?xml version="1.0" encoding="ISO-8859-1"?>
Verzia gramatiky je vždy nastavená na 1.0 pre gramatiky zapísané podľa špecifikácie SRGS 1.0. Atribút encoding definuje kódovanie textu používané v danej gramatike.
Za deklaráciou hlavičky nasleduje určenie ďalších informácií o gramatike. Vo forme XML sú tieto informácie deklarované atribútmi elementu grammar a vo forme ABNF sa tieto informácie zapisujú do riadkov pod deklaráciou formy gramatiky. Tieto informácie môžu byť nasledovné:
forma ABNF : language, mode, root, tag-format, base
forma XML: xmlns, xsi:schemaLocation, version, xml:lang, mode, root, tag-format, xml:base
Súbor pre rečovú gramatiku v XML forme SRGS špecifikácie, ktorý obsahuje iba hlavičku dokumentu bude vyzerať nasledovne:
Príklad 1
<?xml version="1.0" encoding="UTF-8"?>
<grammar root="main" version="1.0" xml:lang="en">
...
</grammar>
<rule>
element je možné považovať za základný stavebný prvok každej gramatiky, ktorý reprezentuje tzv. "pravidlo gramatiky". Rečová gramatika pozostáva vždy najmenej z jedného pravidla (<rule>
elementu). Takmer všetky ostatné elementy jazyka SRGS sú potomkami elementu <rule>
(sú v ňom vnorené) .
Element rule zoskupuje ostatné elementy s podobnými vlastnosťami výrazu, a tak reprezentuje ucelené pravidlo gramatiky. To umožňuje tiež vytvárať stromové štruktúry dokumentu.
Rule element môže mať nasledujúce atribúty: id a scope.
<ruleref>
alebo cez atribút root
elementu <grammar>
. Jednoduchá rečová gramatika, ktorá obsahuje iba jedno pravidlo s názvom main bude vyzerať nasledovne:
Príklad 2
<?xml version="1.0" encoding="UTF-8"?>
<grammar root="main" version="1.0" xml:lang="en">
<rule id="main">
...
</rule>
</grammar>
Zatiaľ je táto gramatika nepoužiteľná, nakoľko jej jediné pravidlo je prázdne. Poďme sa pozrieť na elementy, ktoré nám pomôžu napísať použiteľné gramatiky.
Pre pochopenie základov rečových gramatík je potrebné porozumieť pojmu tokén.
Tokén je časť gramatiky, ktorá definuje slová a iné entity, ktoré môžu byť vyslovené.
Povedané odborne: Pre rozpoznávanie reči, tokén je ortografickou entitou jazyka. Tokén teda môže byť každý reťazec znakov, ktorý môže byť rozpoznávačom reči konvertovaný do fonetickej podoby a teda môže byť rozpoznaný.
Tokén je teda reprezentáciou toho čo môže byť rozpoznané. Na najnižšej úrovni, účelom rečovej gramatiky je reprezentovať všetky prípustné tokény, ktoré môžu byť rozpoznané a ich štrutkúru.
Token môže byť reprezentovaný v SRGS gramatikách viacerými spôsobmi:
<token> toto je token </token>
<item>
elementu (<item> toto je token </item>
Tokén "áno" podľa predchádzajúceho zoznamu môže byť reprezentovaný nasledovne:
<token> áno </token>
<item> áno </item>
<item>
element teda umožňuje zápis tokénu, navyše, ale jehou hlavnou úlohou je pridanie atribútov a ďalších možností, ktoré bližšie špecifikujú daný tokén, resp. umožňujú jeho komplexnejšiu štruktúru.
Element <item>
môže okrem textu obsahovať aj iné elementy, a taktiež zabezpečovať opakovateľnosť svojho obsahu. Elementy, ktoré sa môžu vo vnútri <item>
elementu vyskytnúť sú rovnaké, aké môže obsahovať element rule.
xml:lang, weight, repeat-prob
.Atribút repeat môže mať tri podoby: n, n-, n-m, kde n a m musia byť nula alebo kladné celé číslo. V prvom prípade sa určí, že vnútro elementu sa musí vo výraze užívateľa vyskytnúť n krát, v druhom prípade sa musí vnútro opakovať minimálne n krát a tretí prípad je ohraničením minimálneho (n) a maximálneho (m) počtu opakovaní. Ak sa tento atribút neuvedie, použije sa predvolená hodnota, ktorá je 0-1 a hovorí o tom, že sa token vnútri elementu sa môže vysloviť raz alebo ani raz.
Na vysvetlenie tohto atribútu uvedieme viacero príkladov:
Príklad 3
<rule id="help">
<item repeat=”0-1”> prosím </item>
pomoc
</rule>
Fragment gramatiky zapísany v Príklade 3 umožní používateľovi povedať buď "prosím pomoc" alebo iba "pomoc".
Príklad 4
<rule id="help">
<item repeat=”0-”> prosím </item>
pomoc
</rule>
Fragment gramatiky zapísany v Príklade 4 umožní používateľovi povedať výrazy: "pomoc", "prosím pomoc", "prosím prosím pomoc", "prosím prosím prosím ... pomoc", kde slovíčko "prosím" môže byť použité neobmedzený počet krát.
Príklad 5
<rule id="help">
<item repeat=”1-”> prosím </item>
<token> pomoc </token>
</rule>
Fragment gramatiky zapísany v Príklade 5 umožní používateľovi povedať výrazy: "prosím pomoc", "prosím prosím pomoc", "prosím prosím prosím ... pomoc", kde slovíčko "prosím" môže byť použité neobmedzený počet krát. V porovnaní s Príkladom 4 však musí byť použíté minimálne raz.
Príklad 6
<rule id="help">
<item repeat=”1-2”> prosím </item>
<item> pomoc <item>
</rule>
Fragment gramatiky zapísany v Príklade 6 umožní používateľovi povedať výrazy: "prosím pomoc" alebo "prosím prosím pomoc".
Poznámka: V predchádzajúcich príkladoch si môžete všimnúť použitie rôznych foriem zápisu tokénu "pomoc", pričom jeho význam zostáva nezmenený.
Ako napovedá samotný názov elementu, <one-of>
slúži na výber z viacerých možností, presnejšie je to výber z viacerých <item>
elementov. <one-of>
element môže obsahovať jediný atribút xml:lang na definovanie jazyka danej časti gramatiky.
Príklad 7 ilustruje použitie <one-of>
elementu v gramatike na výber dňa v týždni, kde používateľ môže povedať práve jeden deň z týždňa.
Príklad 7
<?xml version="1.0" encoding="UTF-8"?>
<grammar root="main" version="1.0" xml:lang="sk">
<rule id="main">
<one-of>
<item> pondelok </item>
<item> utorok </item>
<item> streda </item>
<item> štvrtok </item>
<item> piatok </item>
<item> sobota </item>
<item> nedeľa </item>
<item> dnes </item>
<item> zajtra </item>
<item> pozajtra </item>
<item> včera </item>
<item> predvčerom </item>
</one-of>
</rule>
</grammar>
Dôležitosť <one-of>
spočíva v tom, že prakticky všetky gramatiky umožňujú výber z viacerých možných rečových vyjadrení, ktoré môžu byť ďalej rôzne štruktúrované.
Úloha 1: Vytvorte rečovú gramatiku, ktorá umožní používateľovi povedať jednu z číslic od 0 po 9.
Rečové gramatiky podľa W3C SRGS odporúčania môžu pozostávať z viac ako jedného pravidla (rule). Použitie viacerých pravidiel umožňuje vytvárať viac štruktúrované gramatiky a tiež združovať viacero výrazov pod jeden sémantický výsledok (viď ďalšia podkapitola).
<ruleref>
element slúži na odkazovanie sa na iné gramatické pravidlo resp. na gramatiku z iného súboru.
Najdôležitejším atribútom <ruleref>
elementu je uri atribút, ktorý obsahuje názov referovaného pravidla, resp. cestu k súboru referovanej gramatiky. Na nasledujúcih príkladoch vysvetlíme spôsob odkazovania sa:
Príklad 8
<ruleref uri="#rulename"/>
Príklad 8 umožňuje volanie pravidla gramatiky s názvom rulename. Rulename je názov pravidla, ktorý je vždy daný jeho id atribútom.
Príklad 9
<ruleref uri="grammarURI"/>
Príklad 9 umožňuje volanie gramatiky zapísané v samostatnom súbore, ktorý je identifikovaný pomocou grammarURI. Ak sa daná gramatika nachádza v tom istom priečinku ako "volaná" gramatika, grammarURI je potom názov súboru s volanou gramatikou, napr.:
<ruleref uri="digits.grxml"/>
Príklad 10
<ruleref uri="grammarURI#rulename"/>
Pri odkazovaní sa na inú gramatiku, je možné z nej použiť iba konkrétne pravidlo (rule). V tomto prípade sa použije zápis uvedený v príklade 10.
Príklad 11
<ruleref special="NULL"/>
<ruleref special="VOID"/>
<ruleref special="GARBAGE"/>
Príklad 11 je príkladom volania tzv. "špeciálnych pravidiel". W3C SRGS odporúčanie definuje tieto tri špeciálne pravidlá (special rules), ktoré je možné použiť pomocou <ruleref>
elementu:
Napriek tomu, že sme si popísali používanie <ruleref>
elementu pre volanie iných pravidiel a gramatík, ako aj špeciálnych pravidiel, stále sme ho nevideli v širších súvislostiach, teda použité v ucelenej gramatike. Jeho použitie si ilustrujeme na príklade 12, ktorý zobrazuje tzv. "yes-no" gramatiku (gramatika, ktorá umožňuje používateľovi vyjadriť súhlas resp. nesúhlas):
Príklad 12 Yes-no gramatika
<?xml version="1.0" encoding="UTF-8"?>
<grammar root="main" version="1.0" xml:lang="en">
<meta name="description" content="yes/no grammar"/>
<meta name="author" content="OptimSys, s.r.o., Czech Republic (http://www.optimsys.cz)"/>
<meta name="copyright" content="free for any purpose"/>
<rule id="main" scope="public">
<one-of>
<item> <ruleref uri="#yes"/> </item>
<item> <ruleref uri="#no"/> </item>
</one-of>
</rule>
<rule id="yes">
<one-of>
<item>yes</item>
<item>yeah</item>
<item>yep</item>
<item>sure</item>
</one-of>
</rule>
<rule id="no">
<one-of>
<item>no</item>
<item>not</item>
<item>nope</item>
</one-of>
</rule>
</grammar>
Gramatika, ktorú uvádzame v príklade 12 bola vytvorená tvorcami systému OptimTalk. Ako je možné si všimnúť v úvode gramatiky, tá môže, podobne ako aj VoiceXML dokumenty obsahovať <meta>
elementy, ktoré popisujú atribúty daného súboru, akými sú autor, copyright alebo popis súboru.
Predložená gramatika ďalej pozostáva z troch pravidiel - main, yes a no. Pravidlo main má veľmi trefný názov :), nakoľko sa jedná o hlavné pravidlo gramatiky. To že je to tak, vieme nie podľa jeho názvu (id atribútu), ale podľa toho, že je definovaná v <grammar>
elemente ako tzv. "root rule" (viď root atribút elementu <grammar>
). Je teda zrejmé, že interpretácia gramatiky začne týmto hlavným pravidlom.
Pravidlo main má jednoduchú štruktúru. Pomocou <one-of>
elementu definuje, že používateľ môže povedať slová, ktoré zodpovedajú jednému z dvoch "referovaných" pravidiel - pravidlu yes alebo pravidlu no.
Pravidlo yes (rule s id yes) má rovnakú štruktúru ako hlavné pravidlo. Používa <one-of>
element na to, aby si používateľ mohol vybrať z viacerých možností - tokénov, ktoré vyjadrujú súhlas používateľa. Rovnako je to v prípade pravidla no, ktoré obsahuje alternatívne výrazy na vyjadrenie nesúhlasu.
Aj keď táto gramatika už vyzerá pomerne použiteľne, napriek tomu, v prípade jej použitia vo VoiceXML aplikácií, by nám spôsobila malú komplikáciu v podobe nutnosti testovať všetky možné výrazy, z tejto gramatiky samostatne. Našťastie, tvorcovia W3C Speech Interface Framework-u mysleli aj na to a preto vytvorili samostatný "štandard" pre tzv. interpretáciu významu, ktorý si predstavíme v nasledujúcej časti.