Proč je potřeba Speech Dispatcher?
Když jsme chtěli vyvíjet programy pro slepé a zrakově postižené, opakovaně jsme narazili na problém, jak do nich implementovat řečový výstup. Jednou z aplikací, které již řečový výstup poskytovaly, byl Emacspeak. Ten podporoval celou sadu různých řečových zařízení, nicméně podpora pro tato zařízení do něj byla příliš zadrátována, než aby ji bylo možno použít jinde. Pak tu byl také Speakup, avšak jeho podpora zařízení byla zadrátovaná zase do jádra a vázaná na tu konkrétní aplikaci. Řečovou syntézu ještě používá i několik dalších programů, ale většinou jsou vázány na jeden konkrétní syntetizér.
Také jsme narazili na problém, jak synchronizovat výstup zpráv, protože na obrazovce se často dělo více, než dokázal jednokanálový řečový výstup pojmout, což se muselo všude ošklivě ošetřovat posíláním příkazů stop na syntetizér. Přes veškerou snahu však uživatel stejně často potřebnou hlášku neslyšel, protože se místo ní začala říkat nějaká jiná, méně podstatná.
Proto jsme se rozhodli tuto funkcionalitu do aplikací již dále nedrátovat a raději nejprve poskytnout samostatnou vrstvu, která by se o syntézu starala.
Jak funguje Speech Dispatcher?
Speech Dispatcher je implementován jako démon, který poslouchá na TCP/IP socketu a vyřizuje požadavky jednoho či více klientů. Mezi takové požadavky může patřit přeříkání zprávy, změna parametrů hlasu, vyvolání zvukové ikony (obecné události, která může být mapována i na .wav soubor), požadavek na přeříkání starší zprávy a tak podobně. Speech Dispatcher poté požadavek zpracuje a ve vhodnou chvíli předá příslušnému výstupnímu modulu pro konkrétní syntetizér.
Speech Synthesis Independent Protocol (SSIP), jak jsme jej nazvali, přiřazuje všem typickým funkcím syntetizérů symbolická jména, a tak se klientská aplikace vůbec nemusí starat o to, s jakým syntetizérem a jakou konfigurací si ji uživatel spustí.
Komunikace přes SSIP může vypadat třeba takto:
SET SELF CLIENT_NAME joe:vi:default 208 OK CLIENT NAME SET SET SELF RATE 20 203 OK RATE SET SET SELF VOICE MALE2 209 OK VOICE SET SET SELF PRIORITY MESSAGE 202 OK PRIORITY SET SOUND_ICON new-mail 225 OK MESSAGE QUEUED SPEAK 230 OK RECEIVING DATA Hello, I'm a Speech Dispatcher communication example! How are you? . 225 OK MESSAGE QUEUED SET SELF PRIORITY NOTIFICATION SPEAK 230 OK RECEIVING DATA This is a less interesting message. .
Jak si možná pozorní čtenáři všimli, klient v ukázkovém spojení nejprve nastavuje prioritu zprávy a až poté zasílá její text. S využitím modelu priorit zpráv, jak jsme jej vytvořili, se klientský program téměř nemusí starat o interakci mezi současně vznikajícími zprávami pomocí zasílání nějakého stop. Postačí, pokud klient zprávám přiděluje jednu z pěti pevně definovaných priorit, a o jejich vzájemné „pozabíjení“ nebo zase „přebití“ se postará Speech Dispatcher tak, aby byla říkána v každém okamžiku pouze jedna zpráva, a to ta pokud možno nejdůležitější. Například text „This is a less interesting message.“ v uvedeném příkladu se řekne pouze tehdy, pokud mezitím již byla přeříkána předchozí zpráva vyšší priority.
Priority zpráv bychom mohli shrnout do tří základních skupin:
- important: Řeknou se za jakýchkoliv okolností a mají přednost před všemi ostatními. Pokud je jich více, řeknou se postupně.
- message, text: Řeknou se vždy, pokud nepřijde priorita important. Když jich přijde více, message se řeknou postupně, zatímco z text se přeříká pouze ta nejnovější.
- progress, notification: Většinou jsou potlačeny a ke slovu se dostanou pouze tehdy, když není k přeříkávání nic podstatnějšího. V prioritě progress je navíc ale považována poslední přijatá hláška za důležitou v tom, že jí je přiřazena vyšší priorita (uživatel tak třeba neslyšel všechny detaily o tom, jak probíhá nějaký proces, ale určitě se něco dozví, až bude proces dokončen).
(toto je pouze schematický popis, podrobný popis vizdokumentace)
Výstupní moduly a klientské knihovny
Jako backend pro Speech Dispatcher slouží výstupní moduly, které se starají o komunikaci s konkrétními syntetizéry. Veškerá specifická komunikace s tím či oním syntetizérem je odsunuta až na samý konec. Mimo čistého designu a oproštění aplikací od potřeby podporovat různá zařízení jsme tím také dosáhli toho, že můžeme ve výstupních modulech emulovat určité funkce, které některé syntetizéry nepodporují (například stopování či pauzu). V součastnosti je podporován Festival, svobodný velmi kvalitní a rozšiřitelný Text-to-Speech systém podporující několik jazyků (včetně češtiny),Flite, lehká a rychlá verze Festivalu, která však zatím pracuje pouze s angličtinou, a Epos, jednoduchá česká a slovenská syntéza. Pokud Festival některý z jazyků nepodporuje, lze s ním použít také volně dostupné hlasy syntetizéru MBROLA, nicméně ten není svobodným software.
Jako frontend pro Speech Dispatcher vystupují klientské knihovny, které obalují zasílání SSIP příkazů do jednoduše použitelných funkcí daného programovacího jazyka. V součastnosti je k dispozici knihovna pro C/C++ a pro Emacs Lisp (součást speechd-el).
Programátor v C tak již konečně může pro svou aplikaci používat jednoduché funkce jako například:
int spd_open(char* client_name, char* connection_name, char* user_name);
int spd_sayf(int connection, SPDPriority priority, char* format, ...);
int spd_wchar(int connection, SPDPriority priority, wchar_t wcharacter);
int spd_set_punctuation(int connection, SPDPunctuation type);
Obdobné je to v Emacs Lispu.
Co to je speechd-el?
speechd-el je aplikace, která využívá Speech Dispatcher k tomu, aby poskytla řečový výstup uživatelům Emacsu. Je zaměřená především na nevidomé uživatele, pro které je nějaká forma řečového výstupu nutností, ale může být užitečná i vidícím lidem. speechd-el dovoluje uživateli pracovat s Emacsem, aniž by se díval na obrazovku.
Narozdíl od Emacspeaku, což je jiná aplikace pro řečový výstup Emacsu, poskytuje speechd-el automatické mluvení všech zpráv a akcí založené na modelu priorit a navíc používá strategii automatické identifikace akcí Emacsu bez nutnosti psát zvláštní kód pro každou emacsovou knihovnu a samovolně nemění standardní chování Emacsu způsobem, jaký si uživatel nežádal.
Tato malá, ale výkonná aplikace se snaží do Emacsu přidat možnost řečového výstupu a poskytnout uživateli co nejvíce možností k přizpůsobení konfigurace. Je to příležitost pro zkušenější uživatele, kteří ale nejsou programátory, aby si upravili mluvení v Emacsu podle svých potřeb, a tímto způsobem mohou pokročilejší uživatelé pomáhat jiným méně zkušeným. Díky rozšiřitelnosti Emacsu není nutná jeho modifikace, pouze se doinstalují příslušné elispové knihovny.
Jelikož speechd-el spoléhá v zajištění všech výstupních funkcí na Speech Dispatcher, lze jej v součastnosti používat pouze se softwarovou syntézou přes Festival a Flite. Na druhé straně softwarová syntéza je právě ta věc, se kterou se mnoho současných uživatelů Emacsu potýká a která jim v dostatečně jednoduché a funkční podobě chybí.
Shrnutí
Doufáme, že Speech Dispatcher vyplní mezeru v designu aplikací, které chtějí poskytnout uživateli řečovou syntézu, a především, že tvorbu a život takových aplikací usnadní tak, aby jich v budoucnu mohlo vznikat více a měly více uživatelů.
speechd-el by měl pomoci těm, kteří chtějí či potřebují využívat řečovou syntézu v praktickém životě, především na softwarových syntetizátorech, a preferují vlastní uzpůsobení si aplikace před rozsáhlými předdefinovanými volbami, kterým je obtížné se vyhnout nebo je změnit.
Jsme přesvědčeni, že speechd-el je praktickým důkazem toho, že cesta, kterou razíme, je schůdná.
Linky
Autor článku je spoluautorem projektu Speech Dispatcher, dalšími vývojáři jsou Jan Buchal, Tomáš Cerha a Milan Zamazal.