speech-dispatcher-0.9.1/ 0000755 0001750 0001750 00000000000 13465234514 012124 5 0000000 0000000 speech-dispatcher-0.9.1/.version 0000644 0001750 0001750 00000000006 13465234514 013526 0000000 0000000 0.9.1
speech-dispatcher-0.9.1/.tarball-version 0000644 0001750 0001750 00000000006 13465234514 015145 0000000 0000000 0.9.1
speech-dispatcher-0.9.1/doc/ 0000755 0001750 0001750 00000000000 13465234514 012671 5 0000000 0000000 speech-dispatcher-0.9.1/doc/speech-dispatcher-cs.info 0000644 0001750 0001750 00000233722 13465234513 017474 0000000 0000000 This is speech-dispatcher-cs.info, produced by makeinfo version 6.5 from
speech-dispatcher-cs.texi.
INFO-DIR-SECTION Sound
INFO-DIR-SECTION Development
START-INFO-DIR-ENTRY
* Speech Dispatcher cs: (speechd-cs). Speech Dispatcher (in Czech).
END-INFO-DIR-ENTRY
File: speech-dispatcher-cs.info, Node: Top, Next: Úvod, Prev: (dir), Up: (dir)
Tento manuál se vzathuje ke Speech Dispatcher, verze 0.9.1. Jedná se
však pouze o uživatelskou část dokumentace a upozorňujeme, že tento
překlad již není aktuální! Poskytujeme jej s tím, že možná bude
užitečný a to zejména v sekcích, které popisují obecné koncepty a
myšlenky projektu, a to těm, kteří si nemohou přečíst anglickou
dokumentaci. Nikdo by nicméně neměl spoléhat na technické detaily zde
uvedené, protože mnoho věcí je již dnes jinak.
Copyright (C) 2001, 2002, 2003 Brailcom, o.p.s.
Dáváme povolení kopírovat, distribuovat a/nebo modifikovate tento
dokument pod podmínkami GNU Free Documentation License, Verze 1.2
nebo jakékoliv novější verze vydané Free Software Foundation; bez
jakýchkoliv Invariant Sections (neměnných sekcí), bez Front-Cover
Texts (texty na přední straně obálky) a bez Back-Cover Texts (texty
na zadní straně obálky). Kopie této licence je přiložena v sekci
nazvané ,,GNU Free Documentation License".
* Menu:
* Úvod:: Co to je Speech Dispatcher
* Uživatelská dokumentace:: Používání, konfigurace
* GNU General Public License:: Podmínky kopírování Speech Dispatcher
* GNU Free Documentation License:: Podmínky kopírování tohoto manuálu
* Index of Concepts::
File: speech-dispatcher-cs.info, Node: Úvod, Next: Uživatelská dokumentace, Prev: Top, Up: Top
1 Úvod
******
* Menu:
* Motivace:: Proč Speech Dispatcher?
* Základní design:: Jak to pracuje?
* Přehled základních rysů:: Co všechno umí?
* Současný stav:: Jaký je současný stav?
File: speech-dispatcher-cs.info, Node: Motivace, Next: Základní design, Prev: Úvod, Up: Úvod
1.1 Motivace
============
Projekt Speech Dispatcher se snaží poskytnout na zařízení nezávislou
vrstvu pro řečovou syntézu. Měl by poskytovat jednoduché rozhraní pro
klientské aplikace (aplikace, které chtějí mluvit), stejně jako pro
ovladače konkrétních zařízení (různé řečové syntetizéry).
Vysoce kvalitní řečová syntéza je tu již dlouho a nyní je použitelná
i pro běžné uživatele na jejich domácích počítačích. Občas to přichází
jako nutnost, občas je to jen dobrá vlastnost, aby některé programy
poskytovaly řečový výstup. Pro syntézu hlasu je tu široké pole využití
od výukového software až po specializované systémy, jako jsou například
nemocnice či laboratoře. Pro zrakově postižené uživatele je to jedna ze
dvou základních cest, jak získat výstup z počítače (tou druhou je
Braillský řádek).
Existují různé řečové syntetizéry s různými schopnostmi. Některé z
nich jsou hardwarové, některé softwarové. Některé jsou svobodným
software a jsou volně dostupné na internetu. Programátoři to mají
opravdu těžké, když chtějí své programy rozmluvit, protože potřebují
nejprve najít nějaký vhodný syntetizér (dlouhé hodiny experimentování a
tak dále) a potom jej potřebují nějak zprovoznit s jejich programem.
Často musí psát pro tyto programy či hardwarová zařízení vlastní
ovladače a dělají to znovu a znovu. Snadno si lze představit, že se to
celé zhroutí když nevinný uživatel spustí dva programy najednou. Kdyby
přesto nastartovaly oba, budou křičet jeden přes druhého.
Tím je pro programátory velmi obtížné implementovat do svých programů
podporu řečové syntézy (pro nevidomé uživatele, nebo prostě pro lepší
uživatelské rozhraní) a je to jeden z důvodů, proč pořád ještě plně
nevyužíváme toho, co řečová syntéza nabízí.
V ideálním světě by programátoři mohli pro řečovou syntézu používat
podobné příkazy, jako to dělají pro textový výstup na obrazovku (printf,
puts, ...). V ideálním světě by existovalo nějaké speech_printf(),
které by se staralo o to, aby byla zpráva přemluvena ve správný čas bez
přerušování ostatních. Programátor by se tak nemusel starat o to, jak
je přesně komunikace s řečovým syntetizérem implementována. V ideálním
světě by byl v každé GNU/Linuxové distribuci nějaký řečový syntetizér a
nějaké rozhraní starající se o aplikace, které chtějí mluvit, dovolující
uživatelům nastavit si parametry řeči a poskytující nějaké jednoduché
rozhraní (jako speech_printf()) pomocí nějaké sdílené knihovny pro
programátory. Bude to jěště dlouhá cesta než se nám podaří dosáhnout
tohoto stavu věcí, ale se Speech Dispatcherem děláme první krůčky...
File: speech-dispatcher-cs.info, Node: Základní design, Next: Přehled základních rysů, Prev: Motivace, Up: Úvod
1.2 Základní design
===================
V komunikaci mezi všemi různými aplikacemi a syntetizéry je obrovský
nepořádek. Proto jsme chtěli, aby byl Speech Dispatcher vrstva
oddělující aplikace a syntetizéry tak, aby se aplikace nemusely starat o
syntetizéry a syntetizéry se nemusely starat o interakci s aplikacemi.
Rozhodli jsme se implementovat Speech Dispatcher jako server, který
přijímá od aplikací příkazy přes protokol nazvaný 'SSIP', zpracovává je
a, pokud je to nutné, zavolá příslušnou funkci daného výstupního modulu,
který pak komunikuje s některým z různých syntetizátorů.
Každý klient (aplikace, která chce mluvit) otevře socketové spojení
na Speech Dispatcher a volá funkce jako say(), stop(), pause()
poskytované knihovnou implementující tento protokol. Tato sdílená
knihovna je stále na straně klienta a posílá Speech Dispatcheru SSIP
příkazy přes otevřený socket. Když příkazy dorazí do Dispatchera, ten
je zpracuje, přečte text, který by měl být přeříkán a vloží jej do
fronty podle jeho priority. Potom se rozhodne kdy, s jakými parametry
(nastavovanými klientským programem i uživatelem) a na jakém syntetizéru
zprávu nechá přemluvit. Tyto požadavky na mluvení jsou pak zpracovávány
výstupními moduly (pluginy) pro různé hardwarové a softwarové
syntetizéry a přeříkány nahlas.
[image src="figures/architecture.png" alt="Architektura Speech Dispatchera" text=" applications protocol output modules
interface Speech Dispatcher core synthesizers
.-----------------------.
|Emacspeak| :s l: < > | Speech Dispatcher | :m : |Apollo|
:h i: | - configuration | :o : |Festival|
|Speakup| :a b: | - synchronization | :d A: |Flite|
:r r: | - sound icons | :u P: .
|User center| :e a:
| - history | :l I: .
. :d r: < > | - punctuation, ... | :e : .
. : y: < > | [||| priority queues] | : : .
. : : < > | | : : .
`-----------------------'" ]
Detailní popis programování klientů i serveru je k dispozici v
anglickém manuálu.
File: speech-dispatcher-cs.info, Node: Přehled základních rysů, Next: Současný stav, Prev: Základní design, Up: Úvod
1.3 Přehled základních rysů
===========================
Speech Dispatcher z pohledu uživatele:
* snadná konfigurace různých mluvících aplikací, centrální správa
* možnost volně rozhodovat, jaká aplikace bude mluvit s jakým
syntetizérem
* méně času věnovaného konfiguraci a ladění různých aplikací
využívajících syntézu
* historie zpráv pro zrakově postižené uživatele
Speech Dispatcher z pohledu programátora aplikace:
* snadná cesta, jak aplikaci rozmluvit
* jednotné rozhraní k různým syntetizérům
* synchronizace zpráv na vyšší úrovni (kategorizace pomocí priorit)
* možnost nemuset se starat o konfiguraci parametrů hlasu
File: speech-dispatcher-cs.info, Node: Současný stav, Prev: Přehled základních rysů, Up: Úvod
1.4 Současný stav
=================
TODO:
File: speech-dispatcher-cs.info, Node: Uživatelská dokumentace, Next: GNU General Public License, Prev: Úvod, Up: Top
2 Uživatelská dokumentace
*************************
* Menu:
* Základní funkce:: Detailnější popis všech základních funkcí
* Spouštění:: Volby příkazové řádky
* Konfigurace:: Jak zkonfigurovat Speech Dispatcher
File: speech-dispatcher-cs.info, Node: Základní funkce, Next: Spouštění, Prev: Uživatelská dokumentace, Up: Uživatelská dokumentace
2.1 Základní funkce
===================
V této sekci je detailnější popis základních funkcí Speech Dispatcheru.
* Menu:
* Model priorit zpráv:: Zpracování současně příchozích zpráv
* Historie zpráv:: Ukládání zpráv pro pozdější nahlédnutí
* Více výstupních modulů:: Interakce s různými syntetizéry
* Autentifikace uživatelů:: Autentifikace pro přístup k historii
File: speech-dispatcher-cs.info, Node: Model priorit zpráv, Next: Historie zpráv, Prev: Základní funkce, Up: Základní funkce
2.1.1 Model priorit zpráv
-------------------------
Speech Dispatcher nemůže syntetizovat všechny zprávy, které do něj
přichází z prostého důvodu, že zprávy přicházejí obyčejně rychleji, než
je syntetický hlas dokáže číst. Na obrazovce monitoru je v porovnání s
jednokanálovým řečovým výstupem relativně hodně místa. Z toho důvodu
používáme systém několika priorit zaměřených na různé typy zpráv.
Myšlenka je taková, že úlohou programátora klientské aplikace bude
pouze určit pro každou zprávu určitou prioritu odpovídající typu dané
zprávy. Veškerá synchronizace a přepínání mezi těmito zprávami (které
mohou pocházet od různých klientů) potom bude zajištěno aplikováním
určitých pravidel ve Speech Dispatcheru.
* Menu:
* Typy priorit::
* Diagram priorit::
* Příklady využití priorit::
File: speech-dispatcher-cs.info, Node: Typy priorit, Next: Diagram priorit, Prev: Model priorit zpráv, Up: Model priorit zpráv
2.1.1.1 Priority Categories
...........................
Speech Dispatcher poskytuje systém pěti priorit. Každá zpráva obsahuje
buď explicitní informaci o prioritě, nebo jí je přiřazena výchozí
priorita.
Prosím podívejte se také na přiložený diagram (dole).
Priorita 'important'
....................
Tato zpráva bude přeříkána okamžitě, jak dorazí do serveru. Není nikdy
přerušena. Když server obdrží současně několik různých zpráv této
priority, ty jsou uloženy a přeříkány v pořadí, ve kterém přišly.
Když přijde nová zpráva priority 'important' a zrovna se říká nějaká
jiná zpráva, tato jiná zpráva je zahozena. Další zprávy nižších priorit
jsou buď pozdrženy (priorita 'message' a 'text') než již nečekají na
přeříkání žádné zprávy priority 'important', nebo jsou zahozeny
(priority 'notification' a 'progress').
Tyto zprávy by měly být tak krátké, jak je to jen možné, a měly by
být používány pouze zřídka, protože blokují výstup všech ostatních
zpráv.
Priorita 'message'
..................
Tato zpráva bude přeříkána, pokud již ve frontě nečeká žádná jiná zpráva
priority 'important' nebo 'message'. V opačném případě je tato zpráva
pozdržena dokud nebudou všechny přeříkány. To znamená, že priorita
'message' nezastavuje sama sebe. Když ve frontě čekají zprávy priorit
'notification' nebo 'progress' nebo 'text' když přijde zpráva priority
'message', jsou zahozeny.
Priorita 'text'
...............
Tato zpráva bude přeříkána, když ve frontě nečeká žádná zpráva priority
'important' nebo 'message'. Pokud čeká, tato nová zpráva je pozdržena
dokud nebudou předchozí zprávy přeříkány.
Priorita text přerqušuje sama sebe. To znamená, že když přijde
několik zpráv priority text, ty nejsou přeříkány v pořadí, ve kterém
přišly, ale bude vyřčena pouze poslední z nich a ostatní jsou přerušeny
a zahozeny.
Pokud jsou ve frontě zprávy priorit 'notification' nebo 'progress'
nebo se právě přeříkávají, jsou zahozeny.
Priorita 'notification'
.......................
Toto je zpráva nízké priority. Pokud ve frontě čekají zprávy priorit
'important', 'messages', 'text' nebo 'progress' nebo jsou právě
přeříkávány, tato nová zpráva priority 'notification' je zrušena.
Tato priorita přerušuje sama sebe, takže když přijde najednou více
zpráv s prioritou 'notification', přeříká se pouze poslední z nich.
Priority 'progress'
...................
Toto je speciální priorita pro zprávy, které přicházejí krátce po sobě a
nesou informaci o nějaké probíhající činnosti (např. 'Dokončeno 45%').
Kdyby nové zprávy přerušovaly ostatní (viz. priorita Notification),
uživatel by nemusel slyšet ani jednu zprávu do konce.
Tato priorita se chová stejně jako 'notification' s výjimkou dvou
věcí.
* Zprávy této priority nepřerušují jedna druhou. Místo toho, pokud
je zrovna přeříkávána jiná zpráva této priority, nově příchozí
zpráva je zahozena.
* Speech Dispatcher se snaží detekovat poslední zprávu v sérii
příchozích zpráv a zaručit její přeříkání (pro uživatele je
důležité slyšet zprávu 'Completed 100%', aby věděl, že proces již
skončil). Vždy, když ve frontě již nečeká žádná nová zpráva této
priority a poslední příchozí zpráva ještě nebyla přeříkána, je její
přeříkání vynuceno s prioritou 'message'.
File: speech-dispatcher-cs.info, Node: Diagram priorit, Next: Příklady využití priorit, Prev: Typy priorit, Up: Model priorit zpráv
2.1.1.2 Diagram priorit
.......................
[image src="figures/priorities.png" alt="Speech Dispatcher architecture" text=" ___________
| IMPORTANT |
`-----------'
.
/ \\
/ |p| \\
. . . . . . . |r| . . . . . . . . .
. message ----> |i| <---- text .
. . |o| . .
. progress ----> |r| <---- notification .
. . |i| . .
. . |t| . .
. . . . . . . |y| . . . . . . . . .
doesn't interrupt interrupts itself
itself
" ]
File: speech-dispatcher-cs.info, Node: Příklady využití priorit, Prev: Diagram priorit, Up: Model priorit zpráv
2.1.1.3 Příklady využití priorit
................................
Příklady použití priority 'important' jsou:
* chybové hlášky
* velmi důležité zprávy
* ...
Příklady použití priority 'message' jsou:
* běžné zprávy programu
* varování
* ...
Příklady použití priority 'text' jsou:
* text, na kterém uživatel pracuje
* předčítaný text
* položky menu
* ...
Příklady použití priority 'notification' jsou:
* méně důležité informace
* písmenka při vkládání
* run-time nápověda
* ...
Příklady použití priority 'progress' jsou:
* "dokončeno 15%", "dokončeno 16%", "dokončeno 17%"
* "Načítám zvuky", "Načítám grafiku", "Načítám ai", ...
File: speech-dispatcher-cs.info, Node: Historie zpráv, Next: Více výstupních modulů, Prev: Model priorit zpráv, Up: Základní funkce
2.1.2 Historie zpráv
--------------------
Pro nevidomé a zrakově postižené je dobrou vlastností, pokud mají
možnost nějakým jednoduchým klientem procházet historii vyslovených
zpráv.
Některé méně důležité zprávy jsou přijmuty Speech Dispatcherem bez
toho, aby byly přeříkány, protože jsou potlačeny důležitějšími
informacemi. To je nedělitelná vlastnost každého řečového rozhraní,
protože není možné podat v řečovém výstupu tolik informací, kolik se
jich vejde na obrazovku. To je jeden z hlavních důvodů, proč je výhodné
udržovat historii přijatých zpráv, aby se mohl uživatel podívat, zda mu
neušlo něco důležitého.
* Menu:
* Přístupová práva:: Přístupová práva k historii zpráv
File: speech-dispatcher-cs.info, Node: Přístupová práva, Prev: Historie zpráv, Up: Historie zpráv
2.1.2.1 Access Rights
.....................
Aby bylo ochráněno soukromí uživatelů, Speech Dispatcher omezuje přístup
k historii na určitou podmnožinu přijatých zpráv. Platí následující
pravidla:
* Všechny zprávy přijaté od určitého klientského spojení jsou tomuto
spojení přístupny i v historii.
* Všechny zprávy odeslané určitým uživatelem jsou tomuto uživateli
přístupny i v historii.
* Všechny zprávy zaslané uživatelem 'speechd' jsou přístupny všem
uživatelům na daném systému, pod kterým běží Speech Dispatcher ve
skupině 'speechd'.
* Žádné další zprávy nejsou přístupné.
Dvě zprávy jsou považovány za identické jestliže jejich spojení
pocházejí z toho samého počítače, uživatelská jména jsou stejná a jejich
identita může být ověřena, jak je popsáno v *note Autentifikace
uživatelů::. Pokud nemůže být uživatelova identita ověřena, tento
uživatel je považován za jiného než všichni připojení nebo dříve
připojení uživatelé.
File: speech-dispatcher-cs.info, Node: Více výstupních modulů, Next: Autentifikace uživatelů, Prev: Historie zpráv, Up: Základní funkce
2.1.3 Více výstupních modulů
----------------------------
Speech Dispatcher podporuje souběžné používání více výstupních modulů.
Pokud tyto moduly poskytují dobrou synchronizaci, lze je při čtení zpráv
kombinovat. Pokud např. modul1 mluví anglicky a česky, zatímco modul2
mluví pouze německy, tak pokud přijde nějaká zpráva v němčině, použije
se modul2, zatímco pro ostatní jazyky se použije modul1. Na druhé
straně jazyk není jediným kritériem pro takové rozhodnutí. Přesná
pravidla pro výběr výstupího modulu mohou být ovlivněna v konfiguračním
souboru 'speechd.conf'.
File: speech-dispatcher-cs.info, Node: Autentifikace uživatelů, Prev: Více výstupních modulů, Up: Základní funkce
2.1.4 Autentifikace uživatelů
-----------------------------
NOTE: Na implementaci této vlastnosti se pracuje, ale současná verze ji
nepodporuje.
Speech Dispatcher neposkytuje žádný explicitní autentifikační
mechanismus. K ověření identity uživatlů používáme Identification
Protocol definovaný v RFC 1413.
V konfiguraci je možné specifikovat mapování uživatelů. To umožňuje
jednat s určitými uživateli jako s jedním a přidělit jim stejná práva
(např. procházet jejich *note Historie zpráv::).
File: speech-dispatcher-cs.info, Node: Spouštění, Next: Konfigurace, Prev: Základní funkce, Up: Uživatelská dokumentace
2.2 Invoking
============
2.2.1 Potřebná privilegia
-------------------------
Speech Dispatcher může být obecně spouštěn pod obyčejným uživatelem.
Snažili jsme se jej zabezpečit, jak jen to bylo možné, ale nejsme
odborníky na počítačovou bezpečnost a kód může obsahovat nebezpečné
chyby. Nedoporučujeme jej spouštět jako root nebo pod jiným vysoce
privilegovaným uživatelem.
Jediná omezení jsou tyto:
* Speech Dispatcher vytváří PID file standardně ve
'/var/run/speech-dispatcher.pid', takže '/var/run/' musí být danému
uživateli přístupné k zápisu. To může být změněno nastavením volby
'pidpath' při volání skriptu './configure' při kompilaci.
* Když je zapnuto logování, výchozí cesta, kam Speech Dispatcher
zapisuje svůj log, je '/var/log/speech-dispatcher.log'. To ale
může být kdykoliv přenastaveno v hlavním konfiguračním souboru.
2.2.2 Volby příkazové řádky
---------------------------
Speech Dispatcher může být spuštěn s těmito volbami:
'speech-dispatcher [-{d|s}] [-l {1|2|3|4|5}] [-p=port] | [-v] | [-h]'
'-d or --run-daemon'
Spustí program jako démona (běží v pozadí, odpojí se od terminálu,
atd.) Toto je výchozí chování.
'-s or --run-single'
Spustí program jako běžnou aplikaci běžící na popředí.
'-l level or --log-level=level'
Vybere požadovaný logovací úroveň. Logovací úroveň je číslo mezi 0
a 5 (0 znamená neloguj nic, 5 znamená zapisuj téměř vše včetně
zpracovávaného textu.) Standardní je 3. *Note Úrovně logování::.
Logovací úroveň 5 by neměla být používána k jiným účelům, než pro
hledání chyb a to pouze krátkodobě. Logy, které produkuje mohou
narůst do obrovské velikosti a obsahují text čtený uživateli
nezávisle na různých přístupových právech, jak platí pro historii.
Spouštět server s touto úrovní logování tedy může snadno vést k
narušení soukromí.
'-p or --port'
Zadá port, na kterém by měl server čekat na klienty. Výchozí je
6560.
'-v or --version'
Vypíše informace o verzi Speech Dispatchera. Také oznámí základní
informace o copyrightu.
'-h or --help'
Vypíše nápovědu o volbách příkazové řádky, upozornění o copyrightu
a emailovou adresu pro zasílání oznámení o chybách.
File: speech-dispatcher-cs.info, Node: Konfigurace, Prev: Spouštění, Up: Uživatelská dokumentace
2.3 konfigurace
===============
Speech Dispatcher může být konfigurován na několika různých úrovních.
Jedna z nich je nastavování globálních parametrů přes serverový
konfigurační soubor. Je zde i podpora pro konfiguraci specifickou pro
určité klienty.
Některé aplikace mají vlastní mechanismus nastavování voleb
souvisejících s řečovou syntézou. Pro detaily o těchto nastaveních se
prosím podívejte do dokumentace daného programu.
Následující kapitoly se zabývají pouze konfigurací na straně serveru
přes konfigurační soubor.
* Menu:
* Syntaxe konfiguračního souboru::
* Volby v konfiguraci::
* Nastavení výstupních modulů::
* Úrovně logování::
File: speech-dispatcher-cs.info, Node: Syntaxe konfiguračního souboru, Next: Volby v konfiguraci, Prev: Konfigurace, Up: Konfigurace
2.3.1 Syntaxe konfiguračního souboru
------------------------------------
Pro načítání configurace založené na textových souborech používáme
knihovnu DotConf, takže bude syntaxe nejspíš mnoha uživatelům povědomá.
Každá z řetězcových konstant, pokud není uvedeno jinak, by měla být
zakódována v UTF-8. Jména voleb nepoužívají jiné znaky než standardní
ASCII sadu omezenou na znaky ('a', 'b', ...), pomlčky ('-') a podtržítka
'_'.
Komentáře a dočasně neaktivní volby začínají znakem '#'. Pokud
chcete takovu volbu zapnout, stačí smazat znak komentáře a nastavit
volbu na požadovanou hodnotu.
# toto je komentar
# InactiveOption "tato volba je zatim vypla komentarem"
Řetězce jsou uzavřeny v uvozovkách.
LogFile "/var/log/speech-dispatcher.log"
Čísla jsou zapsána bez uvozovek.
Port 6560
Přepínače používají On (zapnuto) a Off (vypnuto).
Debug Off
File: speech-dispatcher-cs.info, Node: Volby v konfiguraci, Next: Nastavení výstupních modulů, Prev: Syntaxe konfiguračního souboru, Up: Konfigurace
2.3.2 Configuration options
---------------------------
Všechny dostupné volby jsou zdokumentovány přímo v konfiguračním souboru
a jsou k nim uvedeny i příklady. Většina voleb je nastavena na výchozí
hodnotu a zakomentována. Pokud je chcete změnit, postačí modifikovat
jejich hodnotu a smazat symbol komentáře '#'.
File: speech-dispatcher-cs.info, Node: Nastavení výstupních modulů, Next: Úrovně logování, Prev: Volby v konfiguraci, Up: Konfigurace
2.3.3 Output Modules Configuration
----------------------------------
Každý uživatel by si měl zapnout ve své konfiguraci alespoň jeden
výstupní modul, pokud chce, aby Speech Dispatcher produkoval nějaký
zvukový výstup. Když není načten žádný výstupní modul, Speech
Dispatcher sice nastartuje, bude komunikovat s klienty a logovat zprávy
do historie, ale nebude produkovat žádný zvuk.
Každý výstupní modul je třeba do Speech Dispatchera natáhnout jednou
řádkou "AddModule" v 'etc/speechd.conf'. Navíc, každý výstupní modul má
přiřazen vlastní konfigurační soubor.
* Menu:
* Natahování modulů ve speechd.conf::
* Konfigurační soubory výstupních modulů::
* Konfigurace generického výstupního modulu::
File: speech-dispatcher-cs.info, Node: Natahování modulů ve speechd.conf, Next: Konfigurační soubory výstupních modulů, Prev: Nastavení výstupních modulů, Up: Nastavení výstupních modulů
2.3.3.1 Natahování modulů ve speechd.conf
.........................................
Každý modul, který by se měl spustit při startu Speech Dispatchera, musí
být natažen příkazem 'AddModule' v konfiguraci. Všimněte si, že lze
natáhnout jeden binární modul vícekrát s různými konfiguračními soubory
a pod jinými jmény. To je užitečné hlavně pro natahování generických
výstupních modulů. *Note Konfigurace generického výstupního modulu::.
AddModule "MODULE_NAME" "MODULE_BINARY" "MODULE_CONFIG"
MODULE_NAME je jméno daného výstupního modulu.
MODULE_BINARY je jméno binárního spustitelného souboru tohoto
výstupního modulu. To může být buď cesta absolutní nebo relativní k
'bin/speechd-modules/'.
MODULE_CONFIG je soubor s konfigurací pro tento konkrétní výstupní
modul. Cesta může být absolutní i relativní k
'etc/speech-dispatcher/modules/'. Tento parametr je volitelný (není
třeba jej uvádět).
File: speech-dispatcher-cs.info, Node: Konfigurační soubory výstupních modulů, Next: Konfigurace generického výstupního modulu, Prev: Natahování modulů ve speechd.conf, Up: Nastavení výstupních modulů
2.3.3.2 Konfigurační soubory výstupních modulů
..............................................
Každý výstupní modul je odlišný a proto má odlišné volby v konfiguraci.
Prosím prostudujte si komentáře v daném konfiguračním souboru. Zde je
popsáno pouze několik voleb, které jsou pro některé výstupní moduly
společné.
'AddVoice "LANGUAGE" "SYMBOLICNAME" "NAME"'
Každý výstupní modul poskytuje nějaké hlasy a někdy dokonce
podporuje různé jazyky. Z toho důvodu byl zaveden společný
mechanismus, kterým můžou být tyto hlasy definovány v konfiguraci.
Žádný modul ovšem není povinen tuto volbu používat. Některé
syntetizátory, např. Festival, podporují symbolická jména SSIP
přímo, takže konfigurace konkrétních hlasů se provádí v
syntetizátoru samotném.
Každému definovanému hlasu odpovídá přesně jedna řádka 'AddVoice'.
LANGUAGE je ISO kód jazyka tohoto hlasu (en, cs, de, ...)
SYMBOLICNAME je symbolické jméno, pod kterým chcete, aby byl tento
hlas dostupný. *Note Standardní hlasy::, pro seznam symbolických
jmen, která můžete použít.
NAME je jméno specifické pro daný výstupní modul. Prosím podívejte
se na komentáře v příslušném konfiguračním souboru v sekci
AddModule pro detailnější informace.
Např. definice, kterou v součastnosti používáme pro Epos (generic)
vypadá takto:
AddVoice "cs" "male1" "kadlec"
AddVoice "sk" "male1" "bob"
'ModuleDelimiters "DELIMITERS", ModuleMaxChunkLength LENGTH'
Často se výstupní modul nesnaží vysyntetizovat celý příchozí text
najednou, ale místo toho jej nejprve rozřeže na menší kousky (věty,
části vět) a ty potom postupně odesílá na syntézu. Tento přístup,
využívaný některými výstupními moduly, je mnohem rychlejší, ale na
druhé straně zase limituje schopnost syntetizéru poskytnout dobrou
intonaci.
Z toho důvodu máte obyčejně možnost zkonfigurovat si na jakých
znacích (DELIMITERS) by se měl text rozdělit na menší části (pokud
jsou následovány nějakým whitespace znakem). Druhá volba (LENGTH)
udává, po kolika znacích by se měl text násilně rozdělit, pokud
nebyl nalezen žádný delimiter.
Pokud tato dvě pravidla zpřísníte, dostanete lepší rychlost, ale
vzdáte se určité části kvality intonace. Takže například pro
pomalejší počítače doporučujeme do DELIMITERS vložit i čárku (,),
aby byl text rozdělen i na částech věty, zatímco na rychlejších
počítačích je lepší tam čárku nedávat, takže do syntetizéru vždy
dorazí celá souvětí.
To samé platí o 'MaxChunkLength'. Pro rychlejší počítače je lepší
nastavit větší hodnotu.
Například výchozí hodnoty ve výstupním modulu pro Festival jsou:
FestivalMaxChunkLength 300
FestivalDelimiters ".?!;,:"
Výstupní modul se může také rozhodnout dělit věty na delimiters
pouze pokud ty jsou následovány mezerou. Takže například
"file123.tmp" by rozděleno nebylo, ale věta "The horse raced around
the fence, that was lately painted green, fell." by rozdělena byla
(to je mimochodem velmi zajímavá věta).
File: speech-dispatcher-cs.info, Node: Konfigurace generického výstupního modulu, Prev: Konfigurační soubory výstupních modulů, Up: Nastavení výstupních modulů
2.3.3.3 Konfigurace generického výstupního modulu
.................................................
Generický výstupní modul uživatelům dovoluje jednoduše si napsat vlastní
jednoduchý výstupní modul pro syntetizéry, které mají rozhraní ve formě
jednoduchého řádkového klienta, pouze modifikací konfiguračního souboru.
Tímto způsobem nemusí psát žádný specifický kód v C a uživatelé si mohou
přidávat podporu pro výstupní zařízení i když neumí programovat. *Note
AddModule::.
Klíčová část každého generického výstupního modulu je definice
řetězce, který se má spouštět.
-- Konfigurace generického modulu: GenericExecuteSynth
"EXECUTION_STRING"
'execution_string' je příkaz, který by měl být zavolán v shellu,
když je potřeba něco říct. Ve skutečnosti to může být více jak
jeden příkaz, dohromady zřetězené operátorem '&&'. Když bude
výstupní modul chtít přeříkávání zprávy zastavit, zašle těmto
procesům signál KILL, takže je důležité, aby použité příkazy po
obdržení KILL okamžitě přestaly mluvit. (Na většině GNU/Linuxových
systémů má tuto vlastnost utilita 'play')
V 'execution_string' můžete využít těchto proměnných, které budou
nahrazeny pořadovanými hodnotami, než bude příkaz vykonán.
* '$DATA' Text, který by měl být přeříkán. Znaky řetězce, které
by nějak interferovali se zpracováním v bashi budou
automaticky nahrazeny odpovídajícími escape sekvencemi. Asi
bude ale nutné uvést kolem této proměnné uvozovky (např.
takto: '\"$DATA\"').
* '$LANG' Identifikační řetězec jazyka (ten je definován pomocí
GenericLanguage).
* '$VOICE' Identifikační řetězec hlasu (ten je definován pomocí
AddVoice).
* '$PITCH' Požadovaná výška hlasu (desetinné číslo definované v
GenericPitchAdd a v GenericPitchMultiply)
* '$RATE' Požadovaná rychlost hlasu (desetinné číslo definované
v GenericRateAdd a v GenericRateMultiply)
Tady je příklad z 'etc/speech-dispatcher/modules/epos-generic.conf'
GenericExecuteSynth \
"epos-say -o --language $LANG --voice $VOICE --init_f $PITCH --init_t $RATE \
\"$DATA\" | sed -e s+unknown.*$++ >/tmp/epos-said.wav && play /tmp/epos-said.wav >/dev/null"
-- Konfigurace generického modulu: AddVoice "LANGUAGE" "SYMBOLICNAME"
"NAME"
*Note AddVoice::.
-- Konfigurace generického modulu: GenericLanguage "iso-code"
"string-subst"
Definuje, jaký řetězec 'string-subst' by měl být nahrazen za
'$LANG' pro daný 'iso-code' ISO kód jazyka.
Opět příklad z Epos generic:
GenericLanguage "en" "english"
GenericLanguage "cs" "czech"
GenericLanguage "sk" "slovak"
-- Konfigurace generického modulu: GenericRateAdd NUM
-- Konfigurace generického modulu: GenericRateMultiply NUM
-- Konfigurace generického modulu: GenericPitchAdd NUM
-- Konfigurace generického modulu: GenericPitchMultiply NUM
Tyto parametry nastavují konverzi pro výpočet rychlosti a výšky.
('$RATE' a '$PITCH').
Výsledná rychlost (nebo výška) je dána následujícím vzorcem:
(speechd_rate * GenericRateMultiply) + GenericRateAdd
kde speechd_rate je hodnota mezi -100 (nejnižší) a +100 (nejvyšší).
Je třeba definovat nějakou rozumnou konverzi pro daný syntetizér.
(Hodnoty v GenericNěcoMultiply jsou vynásobeny stem, protože
stávající verze DotConfu nepodporuje desetinná čísla. Můžete tedy
psát 0.85 jako 85 atd.)
File: speech-dispatcher-cs.info, Node: Úrovně logování, Prev: Nastavení výstupních modulů, Up: Konfigurace
2.3.4 Úrovně logování
---------------------
Ve Speech Dispatcheru je 6 různých úrovní logování. 0 znamená žádné
logování, zatímco 5 znamená vypisovat téměř všechny dostupné informace.
* Úroveň 0
* Žádné informace
* Úroveň 1
* Informace o startu a vypínání.
* Úroveň 2
* Informace o chybách, které nastaly.
* Alokace a uvolňování zdrojů při startu a při exitu.
* Úroveň 3
* Informace o přijímání/odepírání/zavírání klientských spojení.
* Informace o neplatných SSIP příkazech od klientů.
* Úroveň 4
* Je vypisován každý přijatý příkaz
* Informace o zpracovávání vstupu
* Informace o ukládání zpráv do front
* Informace o fungování historie, zvukových ikon, atd.
facilities.
* Informace o práci vlákna speak()
* Úroveň 5 (Ta slouží pouze pro ladící účely a může vypisovat opravdu
*mnoho* dat. Používejte opatrně.)
* Všechna obdržená data jsou vypisována (zprávy od klientů)
* Ladící informace.
Appendix A Standardní hlasy
***************************
'MALE1'
'MALE2'
'MALE3'
'FEMALE1'
'FEMALE2'
'FEMALE3'
'CHILD_MALE'
'CHILD_FEMALE'
Skutečná dostupnost těchto hlasů není zaručena, ale příkaz 'SET SELF
VOICE' musí akceptovat jakýkoliv z nich. Pokud není daný hlas dostupný,
je mapován na jiný hlas výstupním modulem.
File: speech-dispatcher-cs.info, Node: GNU General Public License, Next: GNU Free Documentation License, Prev: Uživatelská dokumentace, Up: Top
Appendix B GNU General Public License
*************************************
Version 2, June 1991
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
========
The licenses for most software are designed to take away your freedom to
share and change it. By contrast, the GNU General Public License is
intended to guarantee your freedom to share and change free software--to
make sure the software is free for all its users. This General Public
License applies to most of the Free Software Foundation's software and
to any other program whose authors commit to using it. (Some other Free
Software Foundation software is covered by the GNU Lesser General Public
License instead.) You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it if
you want it, that you can change the software or use pieces of it in new
free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software,
and (2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
===============================================================
0. This License applies to any program or other work which contains a
notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program",
below, refers to any such program or work, and a "work based on the
Program" means either the Program or any derivative work under
copyright law: that is to say, a work containing the Program or a
portion of it, either verbatim or with modifications and/or
translated into another language. (Hereinafter, translation is
included without limitation in the term "modification".) Each
licensee is addressed as "you".
Activities other than copying, distribution and modification are
not covered by this License; they are outside its scope. The act
of running the Program is not restricted, and the output from the
Program is covered only if its contents constitute a work based on
the Program (independent of having been made by running the
Program). Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's source
code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any
warranty; and give any other recipients of the Program a copy of
this License along with the Program.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange
for a fee.
2. You may modify your copy or copies of the Program or any portion of
it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a. You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b. You must cause any work that you distribute or publish, that
in whole or in part contains or is derived from the Program or
any part thereof, to be licensed as a whole at no charge to
all third parties under the terms of this License.
c. If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display
an announcement including an appropriate copyright notice and
a notice that there is no warranty (or else, saying that you
provide a warranty) and that users may redistribute the
program under these conditions, and telling the user how to
view a copy of this License. (Exception: if the Program
itself is interactive but does not normally print such an
announcement, your work based on the Program is not required
to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the
Program, and can be reasonably considered independent and separate
works in themselves, then this License, and its terms, do not apply
to those sections when you distribute them as separate works. But
when you distribute the same sections as part of a whole which is a
work based on the Program, the distribution of the whole must be on
the terms of this License, whose permissions for other licensees
extend to the entire whole, and thus to each and every part
regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or
contest your rights to work written entirely by you; rather, the
intent is to exercise the right to control the distribution of
derivative or collective works based on the Program.
In addition, mere aggregation of another work not based on the
Program with the Program (or with a work based on the Program) on a
volume of a storage or distribution medium does not bring the other
work under the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms
of Sections 1 and 2 above provided that you also do one of the
following:
a. Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of
Sections 1 and 2 above on a medium customarily used for
software interchange; or,
b. Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange; or,
c. Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with
such an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete
source code means all the source code for all modules it contains,
plus any associated interface definition files, plus the scripts
used to control compilation and installation of the executable.
However, as a special exception, the source code distributed need
not include anything that is normally distributed (in either source
or binary form) with the major components (compiler, kernel, and so
on) of the operating system on which the executable runs, unless
that component itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this
License. However, parties who have received copies, or rights,
from you under this License will not have their licenses terminated
so long as such parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify
or distribute the Program or its derivative works. These actions
are prohibited by law if you do not accept this License.
Therefore, by modifying or distributing the Program (or any work
based on the Program), you indicate your acceptance of this License
to do so, and all its terms and conditions for copying,
distributing or modifying the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject
to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted
herein. You are not responsible for enforcing compliance by third
parties to this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent
issues), conditions are imposed on you (whether by court order,
agreement or otherwise) that contradict the conditions of this
License, they do not excuse you from the conditions of this
License. If you cannot distribute so as to satisfy simultaneously
your obligations under this License and any other pertinent
obligations, then as a consequence you may not distribute the
Program at all. For example, if a patent license would not permit
royalty-free redistribution of the Program by all those who receive
copies directly or indirectly through you, then the only way you
could satisfy both it and this License would be to refrain entirely
from distribution of the Program.
If any portion of this section is held invalid or unenforceable
under any particular circumstance, the balance of the section is
intended to apply and the section as a whole is intended to apply
in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of
any such claims; this section has the sole purpose of protecting
the integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is
willing to distribute software through any other system and a
licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed
to be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces,
the original copyright holder who places the Program under this
License may add an explicit geographical distribution limitation
excluding those countries, so that distribution is permitted only
in or among countries not thus excluded. In such case, this
License incorporates the limitation as if written in the body of
this License.
9. The Free Software Foundation may publish revised and/or new
versions of the General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies a version number of this License which applies to
it and "any later version", you have the option of following the
terms and conditions either of that version or of any later version
published by the Free Software Foundation. If the Program does not
specify a version number of this License, you may choose any
version ever published by the Free Software Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the
author to ask for permission. For software which is copyrighted by
the Free Software Foundation, write to the Free Software
Foundation; we sometimes make exceptions for this. Our decision
will be guided by the two goals of preserving the free status of
all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS
AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR
OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY
OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
=======================================================
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES.
Copyright (C) YYYY NAME OF AUTHOR
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
Also add information on how to contact you by electronic and paper
mail.
If the program is interactive, make it output a short notice like
this when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) YEAR NAME OF AUTHOR
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands 'show w' and 'show c' should show the
appropriate parts of the General Public License. Of course, the
commands you use may be called something other than 'show w' and 'show
c'; they could even be mouse-clicks or menu items--whatever suits your
program.
You should also get your employer (if you work as a programmer) or
your school, if any, to sign a "copyright disclaimer" for the program,
if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
SIGNATURE OF TY COON, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your
program into proprietary programs. If your program is a subroutine
library, you may consider it more useful to permit linking proprietary
applications with the library. If this is what you want to do, use the
GNU Lesser General Public License instead of this License.
File: speech-dispatcher-cs.info, Node: GNU Free Documentation License, Next: Index of Concepts, Prev: GNU General Public License, Up: Top
Appendix C GNU Free Documentation License
*****************************************
Version 1.2, November 2002
Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
0. PREAMBLE
The purpose of this License is to make a manual, textbook, or other
functional and useful document "free" in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or
noncommercially. Secondarily, this License preserves for the
author and publisher a way to get credit for their work, while not
being considered responsible for modifications made by others.
This License is a kind of "copyleft", which means that derivative
works of the document must themselves be free in the same sense.
It complements the GNU General Public License, which is a copyleft
license designed for free software.
We have designed this License in order to use it for manuals for
free software, because free software needs free documentation: a
free program should come with manuals providing the same freedoms
that the software does. But this License is not limited to
software manuals; it can be used for any textual work, regardless
of subject matter or whether it is published as a printed book. We
recommend this License principally for works whose purpose is
instruction or reference.
1. APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work, in any medium,
that contains a notice placed by the copyright holder saying it can
be distributed under the terms of this License. Such a notice
grants a world-wide, royalty-free license, unlimited in duration,
to use that work under the conditions stated herein. The
"Document", below, refers to any such manual or work. Any member
of the public is a licensee, and is addressed as "you". You accept
the license if you copy, modify or distribute the work in a way
requiring permission under copyright law.
A "Modified Version" of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.
A "Secondary Section" is a named appendix or a front-matter section
of the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall
subject (or to related matters) and contains nothing that could
fall directly within that overall subject. (Thus, if the Document
is in part a textbook of mathematics, a Secondary Section may not
explain any mathematics.) The relationship could be a matter of
historical connection with the subject or with related matters, or
of legal, commercial, philosophical, ethical or political position
regarding them.
The "Invariant Sections" are certain Secondary Sections whose
titles are designated, as being those of Invariant Sections, in the
notice that says that the Document is released under this License.
If a section does not fit the above definition of Secondary then it
is not allowed to be designated as Invariant. The Document may
contain zero Invariant Sections. If the Document does not identify
any Invariant Sections then there are none.
The "Cover Texts" are certain short passages of text that are
listed, as Front-Cover Texts or Back-Cover Texts, in the notice
that says that the Document is released under this License. A
Front-Cover Text may be at most 5 words, and a Back-Cover Text may
be at most 25 words.
A "Transparent" copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed
of pixels) generic paint programs or (for drawings) some widely
available drawing editor, and that is suitable for input to text
formatters or for automatic translation to a variety of formats
suitable for input to text formatters. A copy made in an otherwise
Transparent file format whose markup, or absence of markup, has
been arranged to thwart or discourage subsequent modification by
readers is not Transparent. An image format is not Transparent if
used for any substantial amount of text. A copy that is not
"Transparent" is called "Opaque".
Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format,
SGML or XML using a publicly available DTD, and standard-conforming
simple HTML, PostScript or PDF designed for human modification.
Examples of transparent image formats include PNG, XCF and JPG.
Opaque formats include proprietary formats that can be read and
edited only by proprietary word processors, SGML or XML for which
the DTD and/or processing tools are not generally available, and
the machine-generated HTML, PostScript or PDF produced by some word
processors for output purposes only.
The "Title Page" means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the
material this License requires to appear in the title page. For
works in formats which do not have any title page as such, "Title
Page" means the text near the most prominent appearance of the
work's title, preceding the beginning of the body of the text.
A section "Entitled XYZ" means a named subunit of the Document
whose title either is precisely XYZ or contains XYZ in parentheses
following text that translates XYZ in another language. (Here XYZ
stands for a specific section name mentioned below, such as
"Acknowledgements", "Dedications", "Endorsements", or "History".)
To "Preserve the Title" of such a section when you modify the
Document means that it remains a section "Entitled XYZ" according
to this definition.
The Document may include Warranty Disclaimers next to the notice
which states that this License applies to the Document. These
Warranty Disclaimers are considered to be included by reference in
this License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and
has no effect on the meaning of this License.
2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License
applies to the Document are reproduced in all copies, and that you
add no other conditions whatsoever to those of this License. You
may not use technical measures to obstruct or control the reading
or further copying of the copies you make or distribute. However,
you may accept compensation in exchange for copies. If you
distribute a large enough number of copies you must also follow the
conditions in section 3.
You may also lend copies, under the same conditions stated above,
and you may publicly display copies.
3. COPYING IN QUANTITY
If you publish printed copies (or copies in media that commonly
have printed covers) of the Document, numbering more than 100, and
the Document's license notice requires Cover Texts, you must
enclose the copies in covers that carry, clearly and legibly, all
these Cover Texts: Front-Cover Texts on the front cover, and
Back-Cover Texts on the back cover. Both covers must also clearly
and legibly identify you as the publisher of these copies. The
front cover must present the full title with all words of the title
equally prominent and visible. You may add other material on the
covers in addition. Copying with changes limited to the covers, as
long as they preserve the title of the Document and satisfy these
conditions, can be treated as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto
adjacent pages.
If you publish or distribute Opaque copies of the Document
numbering more than 100, you must either include a machine-readable
Transparent copy along with each Opaque copy, or state in or with
each Opaque copy a computer-network location from which the general
network-using public has access to download using public-standard
network protocols a complete Transparent copy of the Document, free
of added material. If you use the latter option, you must take
reasonably prudent steps, when you begin distribution of Opaque
copies in quantity, to ensure that this Transparent copy will
remain thus accessible at the stated location until at least one
year after the last time you distribute an Opaque copy (directly or
through your agents or retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of
the Document well before redistributing any large number of copies,
to give them a chance to provide you with an updated version of the
Document.
4. MODIFICATIONS
You may copy and distribute a Modified Version of the Document
under the conditions of sections 2 and 3 above, provided that you
release the Modified Version under precisely this License, with the
Modified Version filling the role of the Document, thus licensing
distribution and modification of the Modified Version to whoever
possesses a copy of it. In addition, you must do these things in
the Modified Version:
A. Use in the Title Page (and on the covers, if any) a title
distinct from that of the Document, and from those of previous
versions (which should, if there were any, be listed in the
History section of the Document). You may use the same title
as a previous version if the original publisher of that
version gives permission.
B. List on the Title Page, as authors, one or more persons or
entities responsible for authorship of the modifications in
the Modified Version, together with at least five of the
principal authors of the Document (all of its principal
authors, if it has fewer than five), unless they release you
from this requirement.
C. State on the Title page the name of the publisher of the
Modified Version, as the publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.
F. Include, immediately after the copyright notices, a license
notice giving the public permission to use the Modified
Version under the terms of this License, in the form shown in
the Addendum below.
G. Preserve in that license notice the full lists of Invariant
Sections and required Cover Texts given in the Document's
license notice.
H. Include an unaltered copy of this License.
I. Preserve the section Entitled "History", Preserve its Title,
and add to it an item stating at least the title, year, new
authors, and publisher of the Modified Version as given on the
Title Page. If there is no section Entitled "History" in the
Document, create one stating the title, year, authors, and
publisher of the Document as given on its Title Page, then add
an item describing the Modified Version as stated in the
previous sentence.
J. Preserve the network location, if any, given in the Document
for public access to a Transparent copy of the Document, and
likewise the network locations given in the Document for
previous versions it was based on. These may be placed in the
"History" section. You may omit a network location for a work
that was published at least four years before the Document
itself, or if the original publisher of the version it refers
to gives permission.
K. For any section Entitled "Acknowledgements" or "Dedications",
Preserve the Title of the section, and preserve in the section
all the substance and tone of each of the contributor
acknowledgements and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document, unaltered
in their text and in their titles. Section numbers or the
equivalent are not considered part of the section titles.
M. Delete any section Entitled "Endorsements". Such a section
may not be included in the Modified Version.
N. Do not retitle any existing section to be Entitled
"Endorsements" or to conflict in title with any Invariant
Section.
O. Preserve any Warranty Disclaimers.
If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no
material copied from the Document, you may at your option designate
some or all of these sections as invariant. To do this, add their
titles to the list of Invariant Sections in the Modified Version's
license notice. These titles must be distinct from any other
section titles.
You may add a section Entitled "Endorsements", provided it contains
nothing but endorsements of your Modified Version by various
parties--for example, statements of peer review or that the text
has been approved by an organization as the authoritative
definition of a standard.
You may add a passage of up to five words as a Front-Cover Text,
and a passage of up to 25 words as a Back-Cover Text, to the end of
the list of Cover Texts in the Modified Version. Only one passage
of Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity. If the Document
already includes a cover text for the same cover, previously added
by you or by arrangement made by the same entity you are acting on
behalf of, you may not add another; but you may replace the old
one, on explicit permission from the previous publisher that added
the old one.
The author(s) and publisher(s) of the Document do not by this
License give permission to use their names for publicity for or to
assert or imply endorsement of any Modified Version.
5. COMBINING DOCUMENTS
You may combine the Document with other documents released under
this License, under the terms defined in section 4 above for
modified versions, provided that you include in the combination all
of the Invariant Sections of all of the original documents,
unmodified, and list them all as Invariant Sections of your
combined work in its license notice, and that you preserve all
their Warranty Disclaimers.
The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy. If there are multiple Invariant Sections with the same name
but different contents, make the title of each such section unique
by adding at the end of it, in parentheses, the name of the
original author or publisher of that section if known, or else a
unique number. Make the same adjustment to the section titles in
the list of Invariant Sections in the license notice of the
combined work.
In the combination, you must combine any sections Entitled
"History" in the various original documents, forming one section
Entitled "History"; likewise combine any sections Entitled
"Acknowledgements", and any sections Entitled "Dedications". You
must delete all sections Entitled "Endorsements."
6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other
documents released under this License, and replace the individual
copies of this License in the various documents with a single copy
that is included in the collection, provided that you follow the
rules of this License for verbatim copying of each of the documents
in all other respects.
You may extract a single document from such a collection, and
distribute it individually under this License, provided you insert
a copy of this License into the extracted document, and follow this
License in all other respects regarding verbatim copying of that
document.
7. AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other
separate and independent documents or works, in or on a volume of a
storage or distribution medium, is called an "aggregate" if the
copyright resulting from the compilation is not used to limit the
legal rights of the compilation's users beyond what the individual
works permit. When the Document is included in an aggregate, this
License does not apply to the other works in the aggregate which
are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half
of the entire aggregate, the Document's Cover Texts may be placed
on covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic
form. Otherwise they must appear on printed covers that bracket
the whole aggregate.
8. TRANSLATION
Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section
4. Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also
include the original English version of this License and the
original versions of those notices and disclaimers. In case of a
disagreement between the translation and the original version of
this License or a notice or disclaimer, the original version will
prevail.
If a section in the Document is Entitled "Acknowledgements",
"Dedications", or "History", the requirement (section 4) to
Preserve its Title (section 1) will typically require changing the
actual title.
9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document
except as expressly provided for under this License. Any other
attempt to copy, modify, sublicense or distribute the Document is
void, and will automatically terminate your rights under this
License. However, parties who have received copies, or rights,
from you under this License will not have their licenses terminated
so long as such parties remain in full compliance.
10. FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions of
the GNU Free Documentation License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns. See
.
Each version of the License is given a distinguishing version
number. If the Document specifies that a particular numbered
version of this License "or any later version" applies to it, you
have the option of following the terms and conditions either of
that specified version or of any later version that has been
published (not as a draft) by the Free Software Foundation. If the
Document does not specify a version number of this License, you may
choose any version ever published (not as a draft) by the Free
Software Foundation.
C.1 ADDENDUM: How to use this License for your documents
========================================================
To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and license
notices just after the title page:
Copyright (C) YEAR YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the section entitled ``GNU
Free Documentation License''.
If you have Invariant Sections, Front-Cover Texts and Back-Cover
Texts, replace the "with...Texts." line with this:
with the Invariant Sections being LIST THEIR TITLES, with
the Front-Cover Texts being LIST, and with the Back-Cover Texts
being LIST.
If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.
If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of free
software license, such as the GNU General Public License, to permit
their use in free software.
File: speech-dispatcher-cs.info, Node: Index of Concepts, Prev: GNU Free Documentation License, Up: Top
Index of Concepts
*****************
[index ]
* Menu:
* access rights: Přístupová práva. (line 6)
* AddVoice: Konfigurace generického výstupního modulu.
(line 49)
* Design: Základní design. (line 6)
* FDL, GNU Free Documentation License: GNU Free Documentation License.
(line 7)
* Filosofie: Motivace. (line 6)
* GenericExecuteSynth: Konfigurace generického výstupního modulu.
(line 16)
* GenericLanguage: Konfigurace generického výstupního modulu.
(line 53)
* GenericPitchAdd: Konfigurace generického výstupního modulu.
(line 66)
* GenericPitchMultiply: Konfigurace generického výstupního modulu.
(line 67)
* GenericRateAdd: Konfigurace generického výstupního modulu.
(line 64)
* GenericRateMultiply: Konfigurace generického výstupního modulu.
(line 65)
* GPL, GNU General Public License: GNU General Public License.
(line 7)
* history: Historie zpráv. (line 6)
* Hlavní myšlenky, Motivace: Motivace. (line 6)
* identd: Autentifikace uživatelů.
(line 6)
* Identification Protocol: Autentifikace uživatelů.
(line 6)
* konfigurace: Konfigurace. (line 6)
* mapování uživatlů: Autentifikace uživatelů.
(line 13)
* Ostatní programy: Současný stav. (line 6)
* Priorita important: Typy priorit. (line 15)
* Priorita message: Typy priorit. (line 32)
* Priorita notification: Typy priorit. (line 57)
* Priorita text: Typy priorit. (line 42)
* priority: Model priorit zpráv. (line 6)
* RFC 1413: Autentifikace uživatelů.
(line 6)
* speechd skupina: Přístupová práva. (line 16)
* speechd uživatel: Přístupová práva. (line 16)
* syntetizátory: Více výstupních modulů.
(line 6)
* Syntetizéry: Současný stav. (line 6)
* tail recursion: Index of Concepts. (line 6)
* výstupní modul: Více výstupních modulů.
(line 6)
Tag Table:
Node: Top266
Node: Úvod1622
Node: Motivace1956
Node: Základní design4651
Node: Přehled základních rysů7023
Node: Současný stav7815
Node: Uživatelská dokumentace7959
Node: Základní funkce8343
Node: Model priorit zpráv8879
Node: Typy priorit9809
Node: Diagram priorit13229
Node: Příklady využití priorit14153
Node: Historie zpráv14969
Node: Přístupová práva15810
Node: Více výstupních modulů16888
Node: Autentifikace uživatelů17608
Node: Spouštění18233
Node: Konfigurace20618
Node: Syntaxe konfiguračního souboru21380
Node: Volby v konfiguraci22415
Node: Nastavení výstupních modulů22890
Node: Natahování modulů ve speechd.conf23740
Ref: AddModule24019
Node: Konfigurační soubory výstupních modulů24853
Ref: AddVoice25422
Node: Konfigurace generického výstupního modulu28266
Node: Úrovně logování31984
Ref: Standardní hlasy33193
Node: GNU General Public License33465
Node: GNU Free Documentation License52766
Node: Index of Concepts75229
End Tag Table
Local Variables:
coding: iso-8859-2
End:
speech-dispatcher-0.9.1/doc/spd-say.info 0000644 0001750 0001750 00000013506 13465234513 015052 0000000 0000000 This is spd-say.info, produced by makeinfo version 6.5 from
spd-say.texi.
INFO-DIR-SECTION Sound
START-INFO-DIR-ENTRY
* Say for Speech Dispatcher: (spd-say). Say.
END-INFO-DIR-ENTRY
File: spd-say.info, Node: Top, Prev: (dir), Up: (dir)
This manual documents Say for Speech Dispatcher, version 0.4.
Copyright (C) 2001, 2002, 2003, 2006 Brailcom, o.p.s.
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License,
Version 1.2 or any later version published by the Free Software
Foundation; with no Invariant Sections, no Front-Cover Texts, and
no Back-Cover Texts. A copy of the license is included in the
section entitled "GNU Free Documentation License".
1 General
*********
'spd-say' is a very simple client for Speech Dispatcher that takes some
text from the command line and some simple parameters and passes them to
Speech Dispatcher for synthesis. The resulting synthesized speech is
then played on your speakers. It can also be used for stopping and
cancelling speech on Speech Dispatcher.
Usage: 'spd-say [options] ["some text"]'
'-r or --rate'
Set the rate of the speech (between -100 and +100, default see
below).
'-p or --pitch'
Set the pitch of the speech (between -100 and +100, default see
below).
'-R or --pitch-range'
Set the pitch range of the speech (between -100 and +100, default
see below).
'-i or --volume'
Set the volume (intensity) of the speech (between -100 and +100,
default see below).
'-o or --output-module'
Set the output module. Default see below.
'-O or --list-output-modules'
List the output modules that are available with the current server.
'-I or --sound-icon'
Play the sound icon.
'-l or --language'
Set the language. The parameter is an iso language code, like 'en'
or 'cs'. Default see below.
'-t or --voice-type'
Set the preferred voice type (male1, male2, male3, female1,
female2, female3, child_male, child_female).
'-L or --list-synthesis-voices'
List the "synthesis voices" supported by an output module. If no
-o option is supplied, -L displays the synthesis voices provided by
the default output module. Otherwise, it displays the synthesis
voices provided by the chosen module.
'-y or --synthesis-voice'
Set the synthesis voice. The synthesis voice is an attribute of
the chosen synthesizer. Most users will probably not wish to set
it, but this setting is provided for completeness.
'-m or --punctuation-mode'
Set the punctuation mode (none, some, all). Default see below.
'-s or --spelling'
Spell the message.
'-x or --ssml'
Set SSML mode on (default: off). The text contains SSML markup.
'-e or --pipe-mode'
Set pipe mode on (default: off). Reads text from stdin, writes to
stdout, and also sends to Speech Dispatcher.
'-w or --wait'
Wait till the end of speaking the message. In this mode, spd-say
returns only after the message is fully spoken on the speakers or
after it gets discarded.
'-S or --stop'
Stop the previous message in Speech Dispatcher (regardless of the
client who sent it and it's priority) before saying the specified
message. If no message is specified, it just performs the stop
function.
'-C or --cancel'
Similar to '-S', but it stops (cancels) all the messages in all the
queues in Speech Dispatcher. Use this for total stop of speech.
'-v or --version'
Print version and copyright info.
'-h or --help'
Print a short help message.
Defaults for rate, pitch, and volume are determined by 'DefaultRate',
'DefaultPitch', and 'DefaultVolume' settings in the 'speechd.conf' file.
Factory defaults are 0, 0, and 100 respectively.
The default language code is determined by the 'DefaultLanguage'
setting in the 'speechd.conf' file. Factory default is 'en' (English).
The default output module is determined by the
'LanguageDefaultModule' setting in the 'speechd.conf' file. Factory
default is 'flite'.
The default punctuation mode is determined by the
'DefaultPunctuationMode' setting in the 'speechd.conf' file. Factory
default is 'none'.
2 Pipe Mode
***********
In pipe mode (option '--pipe-mode' or '-e'), spd-say reads text from
stdin, writes to stdout, and also sends the text to Speech Dispatcher.
Example:
$ cat README | spd-say -e
If a line begins with the characters _!-!_, the line is sent to
Speech Dispatcher as a SSIP command. Example:
$ spd-say --pipe-mode
The quality of mercy is not strained.
!-!SET SELF VOICE FEMALE1
It droppeth as the gentle rain from heaven
Upon the place beneath: it is twice blest;
!-!SET SELF RATE 50
It blesseth him that gives and him that takes.
^D
Note that each line of input is individually sent to Speech
Dispatcher, therefore in the example above, the word _heaven_ is taken
as the end of a sentence. It should be possible to use other text
filtering utilities, such as 'tr' or 'fmt' to compensate. For example,
the following command would clean up most cases:
$ cat INSTALL | fmt -u -w 1500 | spd-say -e
If the text itself contains _!-!_, just make sure it is not at the
start of the line to prevent it from being interpreted as a SSIP
command. The following sed command will do the job:
$ cat myfile | sed -e 's/^!-!/ !-!/g' - | spd-say -e
The input is sent to Speech Dispatcher as fast as it will accept and
queue it. To wait for each line to be spoken, use the '--wait' or '-w'
option. Example:
$ spd-say --pipe-mode -w
This line is spoken and processing waits for speaking to finish
before this line is sent to Speech Dispatcher.
^D
You can abort a long speech narative with the '--cancel' or '-C'
option.
$ spd-say -C
Tag Table:
Node: Top190
End Tag Table
speech-dispatcher-0.9.1/doc/speech-dispatcher.info 0000644 0001750 0001750 00000655757 13465234513 017111 0000000 0000000 This is speech-dispatcher.info, produced by makeinfo version 6.5 from
speech-dispatcher.texi.
INFO-DIR-SECTION Sound
INFO-DIR-SECTION Development
START-INFO-DIR-ENTRY
* Speech Dispatcher: (speech-dispatcher). Speech Dispatcher.
END-INFO-DIR-ENTRY
File: speech-dispatcher.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir)
This manual documents Speech Dispatcher, version 0.9.1.
Copyright (C) 2001, 2002, 2003, 2006 Brailcom, o.p.s.
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License,
Version 1.2 or any later version published by the Free Software
Foundation; with no Invariant Sections, with no Front-Cover Texts
and no Back-Cover Texts. A copy of the license is included in the
section entitled "GNU Free Documentation License."
You can also (at your option) distribute this manual under the GNU
General Public License:
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
A copy of the license is included in the section entitled "GNU
General Public License"
* Menu:
* Introduction:: What is Speech Dispatcher.
* User's Documentation:: Usage, Configuration...
* Technical Specifications::
* Client Programming:: Documentation for application developers.
* Server Programming:: Documentation for project contributors.
* Download and Contact:: How to get Speech Dispatcher and how to contact us
* Reporting Bugs:: How to report a bug
* How You Can Help:: What is needed
* Appendices::
* GNU General Public License:: Copying conditions for Speech Dispatcher
* GNU Free Documentation License:: Copying conditions for this manual
* Index of Concepts::
File: speech-dispatcher.info, Node: Introduction, Next: User's Documentation, Prev: Top, Up: Top
1 Introduction
**************
* Menu:
* Motivation:: Why Speech Dispatcher?
* Basic Design:: How does it work?
* Features Overview:: What are the assets?
* Current State:: What is done?
File: speech-dispatcher.info, Node: Motivation, Next: Basic Design, Prev: Introduction, Up: Introduction
1.1 Motivation
==============
Speech Dispatcher is a device independent layer for speech synthesis
that provides a common easy to use interface for both client
applications (programs that want to speak) and for software synthesizers
(programs actually able to convert text to speech).
High quality speech synthesis is now commonly available both as
propriatary and Free Software solutions. It has a wide field of
possible uses from educational software to specialized systems, e.g. in
hospitals or laboratories. It is also a key compensation tool for the
visually impaired users. For them, it is one of the two possible ways
of getting output from a computer (the second one being a Braille
display).
The various speech synthesizers are quite different, both in their
interfaces and capabilities. Thus a general common interface is needed
so that the client application programmers have an easy way to use
software speech synthesis and don't have to care about peculiar details
of the various synthesizers.
The absence of such a common and standardized interface and thus the
difficulty for programmers to use software speech synthesis has been a
major reason why the potential of speech synthesis technology is still
not fully expoited.
Ideally, there would be little distinction for applications whether
they output messages on the screen or via speech. Speech Dispatcher can
be compared to what a GUI toolkit is for the graphical interface. Not
only does it provide an easy to use interface, some kind of theming and
configuration mechanisms, but also it takes care of some of the issues
inherent with this particular mode of output, such as the need for
speech message serialization and interaction with the audio subsystem.
File: speech-dispatcher.info, Node: Basic Design, Next: Features Overview, Prev: Motivation, Up: Introduction
1.2 Design
==========
Current Design
==============
The communication between all applications and synthesizers, when
implemented directly, is a mess. For this purpose, we wanted Speech
Dispatcher to be a layer separating applications and synthesizers so
that applications wouldn't have to care about synthesizers and
synthesizers wouldn't have to care about interaction with applications.
We decided we would implement Speech Dispatcher as a server receiving
commands from applications over a protocol called 'SSIP', parsing them
if needed, and calling the appropriate functions of output modules
communicating with the different synthesizers. These output modules are
implemented as plug-ins, so that the user can just load a new module if
he wants to use a new synthesizer.
Each client (application that wants to speak) opens a socket
connection to Speech Dispatcher and calls functions like say(), stop(),
and pause() provided by a library implementing the protocol. This
shared library is still on the client side and sends Speech Dispatcher
SSIP commands over the socket. When the messages arrive at Speech
Dispatcher, it parses them, reads the text that should be said and puts
it in one of several queues according to the priority of the message and
other criteria. It then decides when, with which parameters (set up by
the client and the user), and on which synthesizer it will say the
message. These requests are handled by the output plug-ins (output
modules) for different hardware and software synthesizers and then said
aloud.
[image src="figures/architecture.png" alt="Speech Dispatcher architecture" text=" applications protocol output modules
interface Speech Dispatcher core synthesizers
.-----------------------.
|Emacspeak| :s l: < > | Speech Dispatcher | :m : |Apollo|
:h i: | - configuration | :o : |Festival|
|Speakup| :a b: | - synchronization | :d A: |Flite|
:r r: | - sound icons | :u P: .
|User center| :e a:
| - history | :l I: .
. :d r: < > | - punctuation, ... | :e : .
. : y: < > | [||| priority queues] | : : .
. : : < > | | : : .
`-----------------------'" ]
See also the detailed description *note Client Programming::
interfaces, and *note Server Programming:: documentation.
Future Design
=============
Speech Dispatcher currently mixes two important features: common
low-level interface to multiple speech synthesizers and message
management (including priorities and history). This became even more
evident when we started thinking about handling messages intended for
output on braille devices. Such messages of course need to be
synchronized with speech messages and there is little reason why the
accessibility tools should send the same message twice for these two
different kinds of output used by blind people (often simultaneously).
Outside the world of accessibility, applications also want to either
have full control over the sound (bypass prioritisation) or to only
retrieve the synthesized data, but not play them immediatelly.
We want to eventually split Speech Dispatcher into two independent
components: one providing a low-level interface to speech synthesis
drivers, which we now call TTS API Provider and is already largely
implemented in the Free(b)Soft project, and the second doing message
managemenet, called Message Dispatcher. This will allow Message
Dispatcher to also output on Braille as well as to use the TTS API
Provider separately.
From implementation point of view, an opportunity for new design
based on our previous experiences allowed us to remove several
bottlenecks for speed (responsiveness), ease of use and ease of
implementation of extensions (particularly output modules for new
synthesizers). From the architecture point of view and possibilities
for new developments, we are entirely convinced that both the new design
in general and the inner design of the new components is much better.
While a good API and its implementation for Braille are already
existent in the form of BrlAPI, the API for speech is now under
developement. Please see another architecture diagram showing how we
imagine Message Dispatcher in the future.
[image src="figures/architecture-future.png" alt="Speech Dispatcher architecture" ]
References:
File: speech-dispatcher.info, Node: Features Overview, Next: Current State, Prev: Basic Design, Up: Introduction
1.3 Features Overview
=====================
Speech Dispatcher from user's point of view:
* ability to freely combine applications with your favorite
synthesizer
* message synchronization and coordination
* less time devoted to configuration of applications
Speech Dispatcher from application programmers's point of view:
* easy way to make your applications speak
* common interface to different synthesizers
* higher level synchronization of messages (priorities)
* no need to take care about configuration of voice(s)
File: speech-dispatcher.info, Node: Current State, Prev: Features Overview, Up: Introduction
1.4 Current State
=================
In this version, most of the features of Speech Dispatcher are
implemented and we believe it is now useful for applications as a device
independent Text-to-Speech layer and an accessibility message
coordination layer.
Currently, one of the most advanced applications that works with
Speech Dispatcher is 'speechd-el'. This is a client for Emacs, targeted
primarily for blind people. It is similar to Emacspeak, however the two
take a bit different approach and serve different user needs. You can
find speechd-el on . speechd-el
provides speech output when using nearly any GNU/Linux text interface,
like editing text, reading email, browsing the web, etc.
Orca, the primary screen reader for the Gnome Desktop, supports
Speech Dispatcher directly since its version 2.19.0. See
for more information.
We also provide a shared C library, a Python library, a Java, Guile
and a Common Lisp libraries that implement the SSIP functions of Speech
Dispatcher in higher level interfaces. Writing client applications in
these languages should be quite easy.
On the synthesis side, there is good support for Festival, eSpeak,
Flite, Cicero, IBM TTS, MBROLA, Epos, Dectalk software, Cepstral Swift
and others. See *Note Supported Modules::.
We decided not to interface the simple hardware speech devices as
they don't support synchronization and therefore cause serious problems
when handling multiple messages. Also they are not extensible, they are
usually expensive and often hard to support. Today's computers are fast
enough to perform software speech synthesis and Festival is a great
example.
File: speech-dispatcher.info, Node: User's Documentation, Next: Technical Specifications, Prev: Introduction, Up: Top
2 User's Documentation
**********************
* Menu:
* Installation:: How to get it installed in the best way.
* Running:: The different ways to start it.
* Troubleshooting:: What to do if something doesn't work...
* Configuration:: How to configure Speech Dispatcher.
* Tools:: What tools come with Speech Dispatcher.
* Synthesis Output Modules:: Drivers for different synthesizers.
* Security:: Security mechanisms and restrictions.
File: speech-dispatcher.info, Node: Installation, Next: Running, Prev: User's Documentation, Up: User's Documentation
2.1 Installation
================
This part only deals with the general aspects of installing Speech
Dispatcher. If you are compiling from source code (distribution tarball
or git), please refer to the file 'INSTALL' in your source tree.
2.1.1 The requirements
----------------------
You will need these components to run Speech Dispatcher:
* glib 2.0 ()
* libdotconf 1.3 ()
* pthreads
We recommend to also install these packages:
* Festival ()
* festival-freebsoft-utils 0.3+
()
* Sound icons library
()
2.1.2 Recommended installation procedure
----------------------------------------
* Install your software synthesizer
Although we highly recommend to use Festival for its excellent
extensibility, good quality voices, good responsiveness and best
support in Speech Dispatcher, you might want to start with eSpeak,
a lightweight multi-lingual feature-complete synthesizer, to get
all the key components working and perhaps only then switch to
Festival. Installation of eSpeak should be easier and the default
configuration of Speech Dispatcher is set up for eSpeak for this
reason.
You can of course also start with Epos or any other supported
synthesizer.
* Make sure your synthesizer works
There is usually a way to test if the installation of your speech
synthesizer works. For eSpeak run 'espeak "test"', for Flite run
'flite -t "Hello!"' and hear the speech. For Festival run
'festival' and type in
(SayText "Hello!")
(quit)
* Install Speech Dispatcher
Install the packages for Speech Dispatcher from your distribution
or download the source tarball (or git) from
and follow the instructions in
the file 'INSTALL' in the source tree.
* Configure Speech Dispatcher
You can skip this step in most cases. If you however want to setup
your own configuration of the Dispatchers default values, the
easiest way to do so is through the 'spd-conf' configuration
script. It will guide you through the basic configuration. It
will also subsequently perform some diagnostics tests and offer
some limited help with troubleshooting. Just execute
spd-conf
under an ordinary user or system user like 'speech-dispatcher'
depending on whether you like to setup Speech Dispatcher as user or
system service respectively. You might also want to explore the
offered options or run some of its subsystems manually, type
'spd-conf -h' for help.
If you do not want to use this script, it doesn't work in your case
or it doesn't provide enough configuration flexibility, please
continue as described below and/or in *Note Running Under Ordinary
Users::.
* Test Speech Dispatcher
The simplest way to test Speech Dispatcher is through 'spd-conf -d'
or through the 'spd-say' tool.
Example:
spd-conf -d
spd-say "Hello!"
spd-say -l cs -r 90 "Ahoj"
If you don't hear anything, please *Note Troubleshooting::.
2.1.3 How to use eSpeak NG or eSpeak with MBROLA
------------------------------------------------
Please follow the guidelines at
(resp. ) for installing
eSpeak NG (resp. eSpeak) with a set of MBROLA voices that you want to
use.
Check the 'modules/espeak-ng-mbrola-generic.conf' (resp.
'modules/espeak-mbrola-generic.conf') configuration files for the
'AddVoice' lines. If a line for any of the voices you have installed
(and it is supported by your version of eSpeak NG (resp. eSpeak), e.g.
'ls /usr/share/espeak-ng-data/voices/mb/mb-*' (resp. 'ls
/usr/share/espeak-data/voices/mb/mb-*')) is not contained here, please
add it. Check if 'GenericExecuteString' contains the correct name of
your mbrola binary and correct path to its voice database.
Restart speech-dispatcher and in your client, select
'espeak-ng-mbrola-generic' (resp. 'espeak-mbrola-generic') as your
output module, or test it with the following command
spd-say -o espeak-ng-mbrola-generic -l cs Testing
(resp.
spd-say -o espeak-mbrola-generic -l cs Testing
)
File: speech-dispatcher.info, Node: Running, Next: Troubleshooting, Prev: Installation, Up: User's Documentation
2.2 Running
===========
Speech Dispatcher is normally executed on a per-user basis. This
provides more flexibility in user configuration, access rights and is
essential in any environment where multiple people use the computer at
the same time. It used to be possible to run Speech Dispatcher as a
system service under a special user (and still is, with some
limitations), but this mode of execution is strongly discouraged.
* Menu:
* Running Under Ordinary Users::
* Running in a Custom Setup::
* Setting Communication Method::
File: speech-dispatcher.info, Node: Running Under Ordinary Users, Next: Running in a Custom Setup, Prev: Running, Up: Running
2.2.1 Running Under Ordinary Users
----------------------------------
No special provisions need to be done to run Speech Dispatcher under the
current user. The Speech Dispatcher process will use (or create) a
'~/.cache/speech-dispatcher/' directory for its purposes (logging,
pidfile).
Optionally, a user can place his own configuration file in
'~/.config/speech-dispatcher/speechd.conf' and it will be automatically
loaded by Speech Dispatcher. The preferred way to do so is via the
'spd-conf' configuration command. If this user configuration file is
not found, Speech Dispatcher will simply use the system wide
configuration file (e.g. in '/etc/speech-dispatcher/speechd.conf').
# speech-dispatcher
# spd-say test
File: speech-dispatcher.info, Node: Running in a Custom Setup, Next: Setting Communication Method, Prev: Running Under Ordinary Users, Up: Running
2.2.2 Running in a Custom Setup
-------------------------------
Speech Dispatcher can be run in any other setup of executing users, port
numbers and system paths as well. The path to configuration, pidfile
and logfiles can be specified separately via compilation flags,
configuration file options or command line options in this ascending
order of their priority.
This way can also be used to start Speech Dispatcher as a system wide
service from /etc/init.d/ , although this approach is now discouraged.
File: speech-dispatcher.info, Node: Setting Communication Method, Prev: Running in a Custom Setup, Up: Running
2.2.3 Setting Communication Method
----------------------------------
Currently, two different methods are supported for communication between
the server and its clients.
For local communication, it's preferred to use _Unix sockets_, where
the communication takes place over a Unix socket with its driving file
located by default in the user's runtime directory as
'XDG_RUNTIME_DIR/speech-dispatcher/speechd.sock'. In this way, there
can be no conflict between different user sessions using different
Speech Dispatchers in the same system. By default, permissions are set
in such a way, that only the same user who started the server can access
it, and communication is hidden to all other users.
The other supported mechanism is _Inet sockets_. The server will
thus run on a given port, which can be made accessible either localy or
to other machines on the network as well. This is very useful in a
network setup. Be however aware that while using Inet sockets, both
parties (server and clients) must first agree on the communication port
number to use, which can create a lot of confusion in a setup where
multiple instances of the server serve multiple different users. Also,
since there is currently no authentication mechanism, during Inet socket
communication, the server will make no distinction between the different
users connecting to it. The default port is 6560 as set in the server
configuration.
Client applications will respect the _SPEECHD_ADDRESS_ environment
variable. The method (''unix_socket'' or ''inet_socket'') is optionally
followed by it's parameters separated by a colon. For an exact
description, please *Note Address specification::.
An example of launching Speech Dispatcher using unix_sockets for
communication on a non-standard destination and subsequently using
spd-say to speak a message:
killall -u `whoami` speech-dispatcher
speech-dispatcher -c unix_socket -S /tmp/my.sock
SPEECHD_ADDRESS=unix_socket:/tmp/my.sock spd-say "test"
File: speech-dispatcher.info, Node: Troubleshooting, Next: Configuration, Prev: Running, Up: User's Documentation
2.3 Troubleshooting
===================
If you are experiencing problems when running Speech Dispatcher, please:
* Use 'spd-conf' to run diagnostics:
spd-conf -d
* Check the appropriate logfile in
'~/.cache/speech-dispatcher/log/speech-dispatcher.log' for user
Speech Dispatcher or in
'/var/log/speech-dispatcher/speech-dispatcher.log'. Look for lines
containing the string 'ERROR' and their surrounding contents. If
you hear no speech, restart Speech Dispatcher and look near the end
of the log file - before any attempts for synthesis of any message.
Usually, if something goes wrong with the initialization of the
output modules, a textual description of the problem and a
suggested solution can be found in the log file.
* If this doesn't reveal the problem, please run
spd-conf -D
Which will genereate a very detailed logfile archive which you can
examine yourself or send to us with a request for help.
* You can also try to say some message directly through the utility
'spd-say'.
Example:
spd-say "Hello, does it work?"
spd-say --language=cs --rate=20 "Everything ok?"
* Check if your configuration files (speechd.conf, modules/*.conf)
are correct (some uninstalled synthesizer specified as the default,
wrong values for default voice parameters etc.)
* There is a know problem in some versions of Festival. Please make
sure that Festival server_access_list configuration variable and
your /etc/hosts.conf are set properly. server_access_list must
contain the symbolic name of your machine and this name must be
defined in /etc/hosts.conf and point to your IP address. You can
test if this is set correctly by trying to connect to the port
Festival server is running on via an ordinary telnet (by default
like this: 'telnet localhost 1314'). If you are not rejected, it
works.
File: speech-dispatcher.info, Node: Configuration, Next: Tools, Prev: Troubleshooting, Up: User's Documentation
2.4 Configuration
=================
Speech Dispatcher can be configured on several different levels. You
can configure the global settings through the server configuration file,
which can be placed either in the Speech Dispatcher default
configuration system path like /etc/speech-dispatcher/ or in your home
directory in '~/.config/speech-dispatcher/'. There is also support for
per-client configuration, this is, specifying different default values
for different client applications.
Furthermore, applications often come with their own means of
configuring speech related settings. Please see the documentation of
your application for details about application specific configuration.
* Menu:
* Configuration file syntax:: Basic rules.
* Configuration options:: What to configure.
* Audio Output Configuration:: How to switch to ALSA, Pulse...
* Client Specific Configuration:: Specific default values for applications.
* Output Modules Configuration:: Adding and customizing output modules.
* Log Levels:: Description of log levels.
File: speech-dispatcher.info, Node: Configuration file syntax, Next: Configuration options, Prev: Configuration, Up: Configuration
2.4.1 Configuration file syntax
-------------------------------
We use the DotConf library to read a permanent text-file based
configuration, so the syntax might be familiar to many users.
Each of the string constants, if not otherwise stated differently,
should be encoded in UTF-8. The option names use only the standard
ASCII charset restricted to upper- and lowercase characters ('a', 'b'),
dashes ('-') and underscores '_'.
Comments and temporarily inactive options begin with '#'. If such an
option should be turned on, just remove the comment character and set it
to the desired value.
# this is a comment
# InactiveOption "this option is turned off"
Strings are enclosed in doublequotes.
LogFile "/var/log/speech-dispatcher.log"
Numbers are written without any quotes.
Port 6560
Boolean values use On (for true) and Off (for false).
Debug Off
File: speech-dispatcher.info, Node: Configuration options, Next: Audio Output Configuration, Prev: Configuration file syntax, Up: Configuration
2.4.2 Configuration options
---------------------------
All available options are documented directly in the file and examples
are provided. Most of the options are set to their default value and
commented out. If you want to change them, just change the value and
remove the comment symbol '#'.
File: speech-dispatcher.info, Node: Audio Output Configuration, Next: Client Specific Configuration, Prev: Configuration options, Up: Configuration
2.4.3 Audio Output Configuration
--------------------------------
Audio output method (ALSA, Pulse etc.) can be configured centrally from
the main configuration file 'speechd.conf'. The option
'AudioOutputMethod' selects the desired audio method and further options
labeled as 'AudioALSA...' or 'AudioPulse...' provide a more detailed
configuration of the given audio output method.
It is possible to use a list of preferred audio output methods, in
which case each output module attempts to use the first availble in the
given order.
The example below prefers Pulse Audio, but will use ALSA if unable to
connect to Pulse:
AudioOutputMethod "pulse,alsa"
Please note however that some more simple output modules or
synthesizers, like the generic output module, do not respect these
settings and use their own means of audio output which can't be
influenced this way. On the other hand, the fallback dummy output
module tries to use any available means of audio output to deliver its
error message.
File: speech-dispatcher.info, Node: Client Specific Configuration, Next: Output Modules Configuration, Prev: Audio Output Configuration, Up: Configuration
2.4.4 Client Specific Configuration
-----------------------------------
It is possible to automatically set different default values of speech
parameters (e.g. rate, volume, punctuation, default voice...) for
different applications that connect to Speech Dispatcher. This is
especially useful for simple applications that have no parameter setting
capabilities themselves or they don't support a parameter setting you
wish to change (e.g. language).
Using the commands 'BeginClient "IDENTIFICATION"' and 'EndClient' it
is possible to open and close a section of parameter settings that only
affects those client applications that identify themselves to Speech
Dispatcher under the specific identification code which is matched
against the string 'IDENTIFICATION'. It is possible to use wildcards
('*' matches any number of characters and '?' matches exactly one
character) in the string 'IDENTIFICATION'.
The identification code normally consists of 3 parts:
'user:application:connection'. 'user' is the username of the one who
started the application, 'application' is the name of the application
(usually the name of the binary for it) and 'connection' is a name for
the connection (one application might use more connections for different
purposes).
An example is provided in '/etc/speech-dispatcher/speechd.conf' (see
the line 'Include "clients/emacs.conf"' and
'/etc/speech-dispatcher/clients/emacs.conf'.
File: speech-dispatcher.info, Node: Output Modules Configuration, Next: Log Levels, Prev: Client Specific Configuration, Up: Configuration
2.4.5 Output Modules Configuration
----------------------------------
Each user should turn on at least one output module in his
configuration, if he wants Speech Dispatcher to produce any sound
output. If no output module is loaded, Speech Dispatcher will start,
log messages into history and communicate with clients, but no sound is
produced.
Each output module has an "AddModule" line in
'speech-dispatcher/speechd.conf'. Additionally, each output module can
have its own configuration file.
The audio output is handled by the output modules themselves, so this
can be switched in their own configuration files under
'etc/speech-dispatcher/modules/'.
* Menu:
* Loading Modules in speechd.conf::
* Configuration files of output modules::
* Configuration of the Generic Output Module::
File: speech-dispatcher.info, Node: Loading Modules in speechd.conf, Next: Configuration files of output modules, Prev: Output Modules Configuration, Up: Output Modules Configuration
2.4.5.1 Loading Modules in speechd.conf
.......................................
Each module that should be run when Speech Dispatcher starts must be
loaded by the 'AddModule' command in the configuration. Note that you
can load one binary module multiple times under different names with
different configurations. This is especially useful for loading the
generic output module. *Note Configuration of the Generic Output
Module::.
AddModule "MODULE_NAME" "MODULE_BINARY" "MODULE_CONFIG"
MODULE_NAME is the name of the output module.
MODULE_BINARY is the name of the binary executable of this output
module. It can be either absolute or relative to
'bin/speechd-modules/'.
MODULE_CONFIG is the file where the configuration for this output
module is stored. It can be either absolute or relative to
'etc/speech-dispatcher/modules/'. This parameter is optional.
File: speech-dispatcher.info, Node: Configuration files of output modules, Next: Configuration of the Generic Output Module, Prev: Loading Modules in speechd.conf, Up: Output Modules Configuration
2.4.5.2 Configuration Files of Output Modules
.............................................
Each output module is different and therefore has different
configuration options. Please look at the comments in its configuration
file for a detailed description. However, there are several options
which are common for some output modules. Here is a short overview of
them.
* AddVoice "LANGUAGE" "SYMBOLICNAME" "NAME"
Each output module provides some voices and sometimes it even
supports different languages. For this reason, there is a common
mechanism for specifying these in the configuration, although no
module is obligated to use it. Some synthesizers, e.g. Festival,
support the SSIP symbolic names directly, so the particular
configuration of these voices is done in the synthesizer itself.
For each voice, there is exactly one 'AddVoice' line.
LANGUAGE is the ISO language code of the language of this voice.
SYMBOLICNAME is a symbolic name under which you wish this voice to
be available. See *note Standard Voices: (ssip)Top. for the list
of names you can use.
NAME is a name specific for the given output module. Please see
the comments in the configuration file under the appropriate
AddModule section for more info.
For example our current definition of voices for Epos (file
'/etc/speech-dispatcher/modules/generic-epos.conf' looks like this:
AddVoice "cs" "male1" "kadlec"
AddVoice "sk" "male1" "bob"
* ModuleDelimiters "DELIMITERS", ModuleMaxChunkLength LENGTH
Normally, the output module doesn't try to synthesize all incoming
text at once, but instead it cuts it into smaller chunks
(sentences, parts of sentences) and then synthesizes them one by
one. This second approach, used by some output modules, is much
faster, however it limits the ability of the output module to
provide good intonation.
NOTE: The Festival module does not use ModuleDelimiters and
ModuleMaxChunkLength.
For this reason, you can configure at which characters (DELIMITERS)
the text should be cut into smaller blocks or after how many
characters (LENGTH) it should be cut, if there is no DELIMITER
found.
Making the two rules more strict, you will get better speed but
give away some quality of intonation. So for example for slower
computers, we recommend to include comma (,) in DELIMITERS so that
sentences are cut into phrases, while for faster computers, it's
preferable not to include comma and synthesize the whole compound
sentence.
The same applies to 'MaxChunkLength', it's better to set higher
values for faster computers.
For example, curently the default for Flite is
FestivalMaxChunkLength 500
FestivalDelimiters ".?!;"
The output module may also decide to cut sentences on delimiters
only if they are followed by a space. This way for example
"file123.tmp" would not be cut in two parts, but "The horse raced
around the fence, that was lately painted green, fell." would be.
(This is an interesting sentence, by the way.)
File: speech-dispatcher.info, Node: Configuration of the Generic Output Module, Prev: Configuration files of output modules, Up: Output Modules Configuration
2.4.5.3 Configuration files of the Generic Output Module
........................................................
The generic output module allows you to easily write your own output
module for synthesizers that have a simple command line interface by
modifying the configuration file. This way, users can add support for
their device even if they don't know how to program. *Note AddModule::.
The core part of a generic output module is the command execution
line.
-- Generic Module Configuration: GenericExecuteSynth "EXECUTION_STRING"
'execution_string' is the command that should be executed in a
shell when it's desired to say something. In fact, it can be
multiple commands concatenated by the '&&' operator. To stop
saying the message, the output module will send a KILL signal to
the process group, so it's important that it immediately stops
speaking after the processes are killed. (On most GNU/Linux
system, the 'play' utility has this property).
In the execution string, you can use the following variables, which
will be substituted by the desired values before executing the
command.
* '$DATA' The text data that should be said. The string's
characters that would interfere with bash processing are
already escaped. However, it may be necessary to put double
quotes around it (like this: '\"$DATA\"').
* '$LANG' The language identification string (it's defined by
GenericLanguage).
* '$VOICE' The voice identification string (it's defined by
AddVoice).
* '$PITCH' The desired pitch (a float number defined in
GenericPitchAdd and GenericPitchMultiply).
* '$PITCH_RANGE' The desired pitch range (a float number defined
in GenericPitchRangeAdd and GenericPitchRangeMultiply).
* '$RATE' The desired rate or speed (a float number defined in
GenericRateAdd and GenericRateMultiply)
Here is an example from
'etc/speech-dispatcher/modules/epos-generic.conf'
GenericExecuteSynth \
"epos-say -o --language $LANG --voice $VOICE --init_f $PITCH --init_t $RATE \
\"$DATA\" | sed -e s+unknown.*$++ >/tmp/epos-said.wav && play /tmp/epos-said.wav >/dev/null"
-- GenericModuleConfiguration: AddVoice "LANGUAGE" "SYMBOLICNAME"
"NAME"
*Note AddVoice::.
-- GenericModuleConfiguration: GenericLanguage "iso-code"
"string-subst"
Defines which string 'string-subst' should be substituted for
'$LANG' given an 'iso-code' language code.
Another example from Epos generic:
GenericLanguage "en" "english"
GenericLanguage "cs" "czech"
GenericLanguage "sk" "slovak"
-- GenericModuleConfiguration: GenericRateAdd NUM
-- GenericModuleConfiguration: GenericRateMultiply NUM
-- GenericModuleConfiguration: GenericPitchAdd NUM
-- GenericModuleConfiguration: GenericPitchMultiply NUM
-- GenericModuleConfiguration: GenericPitchRangeAdd NUM
-- GenericModuleConfiguration: GenericPitchRangeMultiply NUM
These parameters set rate and pitch conversion to compute the value
of '$RATE', '$PITCH' and '$PITCH_RANGE'.
The resulting rate (or pitch) is calculated using the following
formula:
(speechd_rate * GenericRateMultiply) + GenericRateAdd
where speechd_rate is a value between -100 (lowest) and +100
(highest) Some meaningful conversion for the specific
text-to-speech system used must by defined.
(The values in GenericSthMultiply are multiplied by 100 because
DotConf currently doesn't support floats. So you can write 0.85 as
85 and so on.)
File: speech-dispatcher.info, Node: Log Levels, Prev: Output Modules Configuration, Up: Configuration
2.4.6 Log Levels
----------------
There are 6 different verbosity levels of Speech Dispatcher logging. 0
means no logging, while 5 means that nearly all the information about
Speech Dispatcher's operation is logged.
* Level 0
* No information.
* Level 1
* Information about loading and exiting.
* Level 2
* Information about errors that occurred.
* Allocating and freeing resources on start and exit.
* Level 3
* Information about accepting/rejecting/closing clients'
connections.
* Information about invalid client commands.
* Level 4
* Every received command is output.
* Information preceding the command output.
* Information about queueing/allocating messages.
* Information about the history, sound icons and other
facilities.
* Information about the work of the speak() thread.
* Level 5 (This is only for debugging purposes and will output *a
lot* of data. Use with caution.)
* Received data (messages etc.) is output.
* Debugging information.
File: speech-dispatcher.info, Node: Tools, Next: Synthesis Output Modules, Prev: Configuration, Up: User's Documentation
2.5 Tools
=========
Several small tools are distributed together with Speech Dispatcher.
'spd-say' is a small client that allows you to send messages to Speech
Dispatcher in an easy way and have them spoken, or cancel speech from
other applications.
* Menu:
* spd-say:: Say a given text or cancel messages in Dispatcher.
* spd-conf:: Configuration, diagnostics and troubleshooting tool
* spd-send:: Direct SSIP communication from command line.
File: speech-dispatcher.info, Node: spd-say, Next: spd-conf, Prev: Tools, Up: Tools
2.5.1 spd-say
-------------
spd-say is documented in its own manual. *Note (spd-say)Top::.
File: speech-dispatcher.info, Node: spd-conf, Next: spd-send, Prev: spd-say, Up: Tools
2.5.2 spd-conf
--------------
spd-conf is a tool for creating basic configuration, initial setup of
some basic settings (output module, audio method), diagnostics and
automated debugging with a possibility to send the debugging output to
the developers with a request for help.
The available command options are self-documented through 'spd-say
-h'. In any working mode, the tool asks the user about future actions
and preferred configuration of the basic options.
Most useful ways of execution are:
* 'spd-conf' Create new configuration and setup basic settings
according to user answers. Run diagnostics and if some problems
occur, run debugging and offer to send a request for help to the
developers.
* 'spd-conf -d' Run diagnostics of problems.
* 'spd-conf -D' Run debugging and offer to send a request for help to
the developers.
File: speech-dispatcher.info, Node: spd-send, Prev: spd-conf, Up: Tools
2.5.3 spd-send
--------------
spd-send is a small client/server application that allows you to
establish a connection to Speech Dispatcher and then use a simple
command line tool to send and receive SSIP protocol communication.
Please see 'src/c/clients/spd-say/README' in the Speech Dispatcher's
source tree for more information.
File: speech-dispatcher.info, Node: Synthesis Output Modules, Next: Security, Prev: Tools, Up: User's Documentation
2.6 Synthesis Output Modules
============================
Speech Dispatcher supports concurrent use of multiple output modules.
If the output modules provide good synchronization, you can combine them
when reading messages. For example if module1 can speak English and
Czech while module2 speaks only German, the idea is that if there is
some message in German, module2 is used, while module1 is used for the
other languages. However the language is not the only criteria for the
decision. The rules for selection of an output module can be influenced
through the configuration file 'speech-dispatcher/speechd.conf'.
* Menu:
* Provided Functionality:: Some synthesizers don't support the full set of SSIP features.
File: speech-dispatcher.info, Node: Provided Functionality, Prev: Synthesis Output Modules, Up: Synthesis Output Modules
2.6.1 Provided functionality
----------------------------
Please note that some output modules don't support the full Speech
Dispatcher functionality (e.g. spelling mode, sound icons). If there
is no easy way around the missing functionality, we don't try to emulate
it in some complicated way and rather try to encourage the developers of
that particular synthesizer to add that functionality. We are actively
working on adding the missing parts to Festival, so Festival supports
nearly all of the features of Speech Dispatcher and we encourage you to
use it. Much progress has also been done with eSpeak.
* Menu:
* Supported Modules::
File: speech-dispatcher.info, Node: Supported Modules, Prev: Provided Functionality, Up: Provided Functionality
2.6.1.1 Supported Modules
.........................
* Festival Festival is a free software multi-language Text-to-Speech
synthesis system that is very flexible and extensible using the
Scheme scripting language. Currently, it supports high quality
synthesis for several languages, and on today's computers it runs
reasonably fast. If you are not sure which one to use and your
language is supported by Festival, we advise you to use it. See
.
* eSpeak eSpeak is a newer very lightweight free software engine with
a broad range of supported languages and a good quality of voice at
high rates. See .
* Flite Flite (Festival Light) is a lightweight free software TTS
synthesizer intended to run on systems with limited resources. At
this time, it has only one English voice and porting voices from
Festival looks rather difficult. With the caching mechanism
provided by Speech Dispatcher, Festival is faster than Flite in
most situations. See .
* Generic The Generic module can be used with any synthesizer that
can be managed by a simple command line application. *Note
Configuration of the Generic Output Module::, for more details
about how to use it. However, it provides only very rudimentary
support of speaking.
* Pico The SVOX Pico engine is a software speech synthesizer for
German, English (GB and US), Spanish, French and Italian. SVOX
produces clear and distinct speech output made possible by the use
of Hidden Markov Model (HMM) algorithms. See
. Pico
documentation can be found at
It includes three manuals: -
SVOX_Pico_Lingware.pdf - SVOX_Pico_Manual.pdf -
SVOX_Pico_architecture_and_design.pdf
File: speech-dispatcher.info, Node: Security, Prev: Synthesis Output Modules, Up: User's Documentation
2.7 Security
============
Speech Dispatcher doesn't implement any special authentication
mechanisms but uses the standard system mechanisms to regulate access.
If the default 'unix_socket' communication mechanism is used, only
the user who starts the server can connect to it due to imposed
restrictions on the unix socket file permissions.
In case of the 'inet_socket' communication mechanism, where clients
connect to Speech Dispatcher on a specified port, theoretically everyone
could connect to it. The access is by default restricted only for
connections originating on the same machine, which can be changed via
the LocalhostAccessOnly option in the server configuration file. In
such a case, the user is reponsible to set appropriate security
restrictions on the access to the given port on his machine from the
outside network using a firewall or similar mechanism.
File: speech-dispatcher.info, Node: Technical Specifications, Next: Client Programming, Prev: User's Documentation, Up: Top
3 Technical Specifications
**************************
* Menu:
* Communication mechanisms::
* Address specification::
* Actions performed on startup::
* Accepted signals::
File: speech-dispatcher.info, Node: Communication mechanisms, Next: Address specification, Prev: Technical Specifications, Up: Technical Specifications
3.1 Communication mechanisms
============================
Speech Dispatcher supports two communicatino mechanisms: UNIX-style and
Inet sockets, which are refered as 'unix-socket' and 'inet-socket'
respectively. The communication mechanism is decided on startup and
cannot be changed at runtime. Unix sockets are now the default and
preferred variant for local communication, Inet sockets are necessary
for communication over network.
The mechanism for the decision of which method to use is as follows
in this order of precedence: command-line option, configuration option,
the default value 'unix-socket'.
_Unix sockets_ are associated with a file in the filesystem. By
default, this file is placed in the user's runtime directory (as
determined by the value of the XDG_RUNTIME_DIR environment variable and
the system configuration for the given user). It's default name is
constructed as 'XDG_RUNTIME_DIR/speech-dispatcher/speechd.sock'. The
access permissions for this file are set to 600 so that it's restricted
to read/write by the current user.
As such, access is handled properly and there are no conflicts
between the different instances of Speech Dispatcher run by the
different users.
Client applications and libraries are supposed to independently
replicate the process of construction of the socket path and connect to
it, thus establishing a common communication channel in the default
setup.
It should be however possible in the client libraries and is possible
in the server, to define a custom file as a socket name if needed.
Client libraries should respect the SPEECHD_ADDRESS environment
variable.
_Inet sockets_ are based on communication over a given port on the
given host, two variables which must be previously agreed between the
server and client before a connection can be established. The only
implicit security restriction is the server configuration option which
can allow or disallow access from machines other than localhost.
By convention, the clients should use host and port given by one of
the following sources in the following order of precedence: its own
configuration, value of the SPEECHD_ADDRESS environment variable and the
default pair (localhost, 6560).
*Note Setting Communication Method::.
File: speech-dispatcher.info, Node: Address specification, Next: Actions performed on startup, Prev: Communication mechanisms, Up: Technical Specifications
3.2 Address specification
=========================
Speech Dispatcher provies several methods of communication and can be
used both locally and over network. *Note Communication mechanisms::.
Client applications and interface libraries need to recognize an
address, which specifies how and where to contact the appropriate
server.
Address specification consits from the method and one or more of its
parameters, each item separated by a colon:
method:parameter1:parameter2
The method is either 'unix_socket' or 'inet_socket'. Parameters are
optional. If not used in the address line, their default value will be
used.
Two forms are currently recognized:
unix_socket:full/path/to/socket
inet_socket:host_ip:port
Examples of valid address lines are:
unix_socket
unix_socket:/tmp/test.sock
inet_socket
inet_socket:192.168.0.34
inet_socket:192.168.0.34:6563
Clients implement different mechanisms how the user can set the
address. Clients should respect the SPEECHD_ADDRESS environment
variable *Note Setting Communication Method::, unless the user
ovverrides its value by settins in the client application itself.
Clients should fallback to the default address, if neither the
environment variable or their specific configuration is set.
The default communication address currently is:
unix_socket:/$XDG_RUNTIME_DIR/speech-dispatcher/speechd.sock
where '~' stands for the path to the users home directory.
File: speech-dispatcher.info, Node: Actions performed on startup, Next: Accepted signals, Prev: Address specification, Up: Technical Specifications
3.3 Actions performed on startup
================================
What follows is an overview of the actions the server takes on startup
in this order:
* Initialize logging stage 1
Set loglevel to 1 and log destination to stderr (logfile is not
ready yet).
* Parse command line options
Read preferred communication method, destinations for logfile and
pidfile
* Establish the '~/.config/speech-dispatcher/' and
'~/.cache/speech-dispatcher/' directories
If pid and conf paths were not given as command line options, the
server will place them in '~/.config/speech-dispatcher/' and
'~/.cache/speech-dispatcher/' by default. If they are not
specified AND the current user doesn't have a system home
directory, the server will fail startup.
The configuration file is pointed to
'~/.config/speech-dispatcher/speechd.conf' if it exists, otherwise
to '/etc/speech-dispatcher/speechd.conf' or a similar system
location according to compile options. One of these files must
exists, otherwise Speech Dispatcher will not know where to find its
output modules.
* Create pid file
Check the pid file in the determined location. If an instance of
the server is already running, log an error message and exit with
error code 1, otherwise create and lock a new pid file.
* Check for autospawning enabled
If the server is started with -spawn, check whether autospawn is
not disabled in the configuration (DisableAutoSpawn config option
in speechd.conf). If it is disabled, log an error message and exit
with error code 1.
* Install signal handlers
* Create unix or inet sockets and start listening
* Initialize Speech Dispatcher
Read the configuration files, setup some lateral threads, start and
initialize output modules. Reinitialize logging (stage 2) into the
final logfile destination (as determined by the command line
option, the configuration option and the default location in this
order of precedence).
After this step, Speech Dispatcher is ready to accept new
connections.
* Daemonize the process
Fork the process, disconnect from standard input and outputs,
disconnect from parent process etc. as prescribed by the POSIX
standards.
* Initialize the speaking lateral thread
Initialize the second main thread which will process the speech
request from the queues and pass them onto the Speech Dispatcher
modules.
* Start accepting new connections from clients
Start listening for new connections from clients and processing
them in a loop.
File: speech-dispatcher.info, Node: Accepted signals, Prev: Actions performed on startup, Up: Technical Specifications
3.4 Accepted signals
====================
* SIGINT
Terminate the server
* SIGHUP
Reload configuration from config files but do not restart modules
* SIGUSR1
Reload dead output modules (modules which were previously working
but crashed during runtime and marked as dead)
* SIGPIPE
Ignored
File: speech-dispatcher.info, Node: Client Programming, Next: Server Programming, Prev: Technical Specifications, Up: Top
4 Client Programming
********************
Clients communicate with Speech Dispatcher via the Speech Synthesis
Internet Protocol (SSIP) *Note (ssip)Top::. The protocol is the actual
interface to Speech Dispatcher.
Usually you don't need to use SSIP directly. You can use one of the
supplied libraries, which wrap the SSIP interface. This is the
recommended way of communicating with Speech Dispatcher. We try so
support as many programming environments as possible. This manual
(except SSIP) contains documentation for the C and Python libraries,
however there are also other libraries developed as external projects.
Please contact us for information about current external client
libraries.
* Menu:
* C API:: Shared library for C/C++
* Python API:: Python module.
* Guile API::
* Common Lisp API::
* Autospawning:: How server is started from clients
File: speech-dispatcher.info, Node: C API, Next: Python API, Prev: Client Programming, Up: Client Programming
4.1 C API
=========
* Menu:
* Initializing and Terminating in C::
* Speech Synthesis Commands in C::
* Speech output control commands in C::
* Characters and Keys in C::
* Sound Icons in C::
* Parameter Setting Commands in C::
* Other Functions in C::
* Information Retrieval Commands in C::
* Event Notification and Index Marking in C::
* History Commands in C::
* Direct SSIP Communication in C::
File: speech-dispatcher.info, Node: Initializing and Terminating in C, Next: Speech Synthesis Commands in C, Prev: C API, Up: C API
4.1.1 Initializing and Terminating
----------------------------------
-- C API function: SPDConnection* spd_open(char* client_name, char*
connection_name, char* user_name, SPDConnectionMode
connection_mode)
Opens a new connection to Speech Dispatcher and returns a socket
file descriptor you will use to communicate with Speech Dispatcher.
The socket file descriptor is a parameter used in all the other
functions. It now uses local communication via inet sockets. See
'spd_open2' for more details.
The three parameters 'client_name', 'connection_name' and
'username' are there only for informational and navigational
purposes, they don't affect any settings or behavior of any
functions. The authentication mechanism has nothing to do with
'username'. These parameters are important for the user when he
wants to set some parameters for a given session, when he wants to
browse through history, etc. The parameter 'connection_mode'
specifies how this connection should be handled internally and if
event notifications and index marking capabilities will be
available.
'client_name' is the name of the client that opens the connection.
Normally, it should be the name of the executable, for example
"lynx", "emacs", "bash", or "gcc". It can be left as NULL.
'connection_name' determines the particular use of that connection.
If you use only one connection in your program, this should be set
to "main" (passing a NULL pointer has the same effect). If you use
two or more connections in your program, their 'client_name's
should be the same, but 'connection_name's should differ. For
example: "buffer", "command_line", "text", "menu".
'username' should be set to the name of the user. Normally, you
should get this string from the system. If set to NULL, libspeechd
will try to determine it automatically by g_get_user_name().
'connection_mode' has two possible values: 'SPD_MODE_SINGLE' and
'SPD_MODE_THREADED'. If the parameter is set to
'SPD_MODE_THREADED', then 'spd_open()' will open an additional
thread in your program which will handle asynchronous SSIP replies
and will allow you to use callbacks for event notifications and
index marking, allowing you to keep track of the progress of
speaking the messages. However, you must be aware that your
program is now multi-threaded and care must be taken when
using/handling signals. If 'SPD_MODE_SINGLE' is chosen, the
library won't execute any additional threads and SSIP will run only
as a synchronous protocol, therefore event notifications and index
marking won't be available.
It returns a newly allocated SPDConnection* structure on success,
or 'NULL' on error.
Each connection you open should be closed by spd_close() before the
end of the program, so that the associated connection descriptor is
closed, threads are terminated and memory is freed.
-- C API function: SPDConnection* spd_open2(char* client_name, char*
connection_name, char* user_name, SPDConnectionMode
connection_mode, SPDConnectionMethod method, int autospawn)
Opens a new connection to Speech Dispatcher and returns a socket
file descriptor. This function is the same as 'spd_open' except
that it gives more control of the communication method and
autospawn functionality as described below.
'method' is either 'SPD_METHOD_UNIX_SOCKET' or
'SPD_METHOD_INET_SOCKET'. By default, unix socket communication
should be preferred, but inet sockets are necessary for
cross-network communication.
'autospawn' is a boolean flag specifying whether the function
should try to autospawn (autostart) the Speech Dispatcher server
process if it is not running already. This is set to 1 by default,
so this function should normally not fail even if the server is not
yet running.
-- C API function: void spd_close(SPDConnection *connection)
Closes a Speech Dispatcher socket connection, terminates associated
threads (if necessary) and frees the memory allocated by
spd_open(). You should close every connection before the end of
your program.
'connection' is the SPDConnection connection obtained by
spd_open().
File: speech-dispatcher.info, Node: Speech Synthesis Commands in C, Next: Speech output control commands in C, Prev: Initializing and Terminating in C, Up: C API
4.1.2 Speech Synthesis Commands
-------------------------------
-- Variable: C API type SPDPriority
'SPDPriority' is an enum type that represents the possible
priorities that can be assigned to a message.
typedef enum{
SPD_IMPORTANT = 1,
SPD_MESSAGE = 2,
SPD_TEXT = 3,
SPD_NOTIFICATION = 4,
SPD_PROGRESS = 5
}SPDPriority;
*Note Message Priority Model: (ssip)Top.
-- C API function: int spd_say(SPDConnection* connection, SPDPriority
priority, char* text);
Sends a message to Speech Dispatcher. If this message isn't
blocked by some message of higher priority and this CONNECTION
isn't paused, it will be synthesized directly on one of the output
devices. Otherwise, the message will be discarded or delayed
according to its priority.
'connection' is the SPDConnection* connection created by
spd_open().
'priority' is the desired priority for this message. *Note Message
Priority Model: (ssip)Top.
'text' is a null terminated string containing text you want sent to
synthesis. It must be encoded in UTF-8. Note that this doesn't
have to be what you will finally hear. It can be affected by
different settings, such as spelling, punctuation, text
substitution etc.
It returns a positive unique message identification number on
success, -1 otherwise. This message identification number can be
saved and used for the purpose of event notification callbacks or
history handling.
-- C API function: int spd_sayf(SPDConnection* connection, SPDPriority
priority, char* format, ...);
Similar to 'spd_say()', simulates the behavior of printf().
'format' is a string containing text and formatting of the
parameters, such as "%d", "%s" etc. It must be encoded in UTF-8.
'...' is an arbitrary number of arguments.
All other parameters are the same as for spd_say().
For example:
spd_sayf(conn, SPD_TEXT, "Hello %s, how are you?", username);
spd_sayf(conn, SPD_IMPORTANT, "Fatal error on [%s:%d]", filename, line);
But be careful with unicode! For example this doesn't work:
spd_sayf(conn, SPD_NOTIFY, ``Pressed key is %c.'', key);
Why? Because you are supposing that key is a char, but that will
fail with languages using multibyte charsets. The proper solution
is:
spd_sayf(conn, SPD_NOTIFY, ``Pressed key is %s'', key);
where key is an encoded string.
It returns a positive unique message identification number on
success, -1 otherwise. This message identification number can be
saved and used for the purpose of event notification callbacks or
history handling.
File: speech-dispatcher.info, Node: Speech output control commands in C, Next: Characters and Keys in C, Prev: Speech Synthesis Commands in C, Up: C API
4.1.3 Speech Output Control Commands
------------------------------------
Stop Commands
.............
-- C API function: int spd_stop(SPDConnection* connection);
Stops the message currently being spoken on a given connection. If
there is no message being spoken, does nothing. (It doesn't touch
the messages waiting in queues). This is intended for stops
executed by the user, not for automatic stops (because
automatically you can't control how many messages are still waiting
in queues on the server).
'connection' is the SPDConnection* connection created by
spd_open().
It returns 0 on success, -1 otherwise.
-- C API function: int spd_stop_all(SPDConnection* connection);
The same as spd_stop(), but it stops every message being said,
without distinguishing where it came from.
It returns 0 on success, -1 if some of the stops failed.
-- C API function: int spd_stop_uid(SPDConnection* connection, int
target_uid);
The same as spd_stop() except that it stops a client client
different from the calling one. You must specify this client in
'target_uid'.
'target_uid' is the unique ID of the connection you want to execute
stop() on. It can be obtained from spd_history_get_client_list().
*Note History Commands in C::.
It returns 0 on success, -1 otherwise.
Cancel Commands
...............
-- C API function: int spd_cancel(SPDConnection* connection);
Stops the currently spoken message from this connection (if there
is any) and discards all the queued messages from this connection.
This is probably what you want to do, when you call spd_cancel()
automatically in your program.
-- C API function: int spd_cancel_all(SPDConnection* connection);
The same as spd_cancel(), but it cancels every message without
distinguishing where it came from.
It returns 0 on success, -1 if some of the stops failed.
-- C API function: int spd_cancel_uid(SPDConnection* connection, int
target_uid);
The same as spd_cancel() except that it executes cancel for some
other client than the calling one. You must specify this client in
'target_uid'.
'target_uid' is the unique ID of the connection you want to execute
cancel() on. It can be obtained from
spd_history_get_client_list(). *Note History Commands in C::.
It returns 0 on success, -1 otherwise.
Pause Commands
..............
-- C API function: int spd_pause(SPDConnection* connection);
Pauses all messages received from the given connection. No
messages except for priority 'notification' and 'progress' are
thrown away, they are all waiting in a separate queue for resume().
Upon resume(), the message that was being said at the moment
pause() was received will be continued from the place where it was
paused.
It returns immediately. However, that doesn't mean that the speech
output will stop immediately. Instead, it can continue speaking
the message for a while until a place where the position in the
text can be determined exactly is reached. This is necessary to be
able to provide 'resume' without gaps and overlapping.
When pause is on for the given client, all newly received messages
are also queued and waiting for resume().
It returns 0 on success, -1 if something failed.
-- C API function: int spd_pause_all(SPDConnection* connection);
The same as spd_pause(), but it pauses every message, without
distinguishing where it came from.
It returns 0 on success, -1 if some of the pauses failed.
-- C API function: int spd_pause_uid(SPDConnection* connection, int
target_uid);
The same as spd_pause() except that it executes pause for a client
different from the calling one. You must specify the client in
'target_uid'.
'target_uid' is the unique ID of the connection you want to pause.
It can be obtained from spd_history_get_client_list(). *Note
History Commands in C::.
It returns 0 on success, -1 otherwise.
Resume Commands
...............
-- C API function: int spd_resume(SPDConnection* connection);
Resumes all paused messages from the given connection. The rest of
the message that was being said at the moment pause() was received
will be said and all the other messages are queued for synthesis
again.
'connection' is the SPDConnection* connection created by
spd_open().
It returns 0 on success, -1 otherwise.
-- C API function: int spd_resume_all(SPDConnection* connection);
The same as spd_resume(), but it resumes every paused message,
without distinguishing where it came from.
It returns 0 on success, -1 if some of the pauses failed.
-- C API function: int spd_resume_uid(SPDConnection* connection, int
target_uid);
The same as spd_resume() except that it executes resume for a
client different from the calling one. You must specify the client
in 'target_uid'.
'target_uid' is the unique ID of the connection you want to resume.
It can be obtained from spd_history_get_client_list(). *Note
History Commands in C::.
It returns 0 on success, -1 otherwise.
File: speech-dispatcher.info, Node: Characters and Keys in C, Next: Sound Icons in C, Prev: Speech output control commands in C, Up: C API
4.1.4 Characters and Keys
-------------------------
-- C API function: int spd_char(SPDConnection* connection, SPDPriority
priority, char* character);
Says a character according to user settings for characters. For
example, this can be used for speaking letters under the cursor.
'connection' is the SPDConnection* connection created by
spd_open().
'priority' is the desired priority for this message. *Note Message
Priority Model: (ssip)Top.
'character' is a NULL terminated string of chars containing one
UTF-8 character. If it contains more characters, only the first
one is processed.
It returns 0 on success, -1 otherwise.
-- C API function: int spd_wchar(SPDConnection* connection, SPDPriority
priority, wchar_t wcharacter);
The same as spd_char(), but it takes a wchar_t variable as its
argument.
It returns 0 on success, -1 otherwise.
-- C API function: int spd_key(SPDConnection* connection, SPDPriority
priority, char* key_name);
Says a key according to user settings for keys.
'connection' is the SPDConnection* connection created by
spd_open().
'priority' is the desired priority for this message. *Note Message
Priority Model: (ssip)Top.
'key_name' is the name of the key in a special format. *Note
Speech Synthesis and Sound Output Commands: (ssip)Top, (KEY, the
corresponding SSIP command) for description of the format of
'key_name'
It returns 0 on success, -1 otherwise.
File: speech-dispatcher.info, Node: Sound Icons in C, Next: Parameter Setting Commands in C, Prev: Characters and Keys in C, Up: C API
4.1.5 Sound Icons
-----------------
-- C API function: int spd_sound_icon(SPDConnection* connection,
SPDPriority priority, char* icon_name);
Sends a sound icon ICON_NAME. These are symbolic names that are
mapped to a sound or to a text string (in the particular language)
according to Speech Dispatcher tables and user settings. Each
program can also define its own icons.
'connection' is the SPDConnection* connection created by
spd_open().
'priority' is the desired priority for this message. *Note Message
Priority Model: (ssip)Top.
'icon_name' is the name of the icon. It can't contain spaces,
instead use underscores ('_'). Icon names starting with an
underscore are considered internal and shouldn't be used.
File: speech-dispatcher.info, Node: Parameter Setting Commands in C, Next: Other Functions in C, Prev: Sound Icons in C, Up: C API
4.1.6 Parameter Settings Commands
---------------------------------
The following parameter setting commands are available. For
configuration and history clients there are also functions for setting
the value for some other connection and for all connections. They are
listed separately below.
Please see *note Parameter Setting Commands: (ssip)Top. for a general
description of what they mean.
-- C API function: int spd_set_data_mode(SPDConnection *connection,
SPDDataMode mode)
Set Speech Dispatcher data mode. Currently, plain text and SSML
are supported. SSML is especially useful if you want to use index
marks or include changes of voice parameters in the text.
'mode' is the requested data mode: 'SPD_DATA_TEXT' or
'SPD_DATA_SSML'.
-- C API function: int spd_set_language(SPDConnection* connection,
char* language);
Sets the language that should be used for synthesis.
'connection' is the SPDConnection* connection created by
spd_open().
'language' is the language code as defined in RFC 1766 ("cs", "en",
...).
-- C API function: int spd_set_output_module(SPDConnection* connection,
char* output_module);
Sets the output module that should be used for synthesis. The
parameter of this command should always be entered by the user in
some way and not hardcoded anywhere in the code as the available
synthesizers and their registration names may vary from machine to
machine.
'connection' is the SPDConnection* connection created by
spd_open().
'output_module' is the output module name under which the module
was loaded into Speech Dispatcher in its configuration ("flite",
"festival", "epos-generic"... )
-- C API function: char* spd_get_output_module(SPDConnection*
connection);
Gets the current output module in use for synthesis.
'connection' is the SPDConnection* connection created by
spd_open().
It returns the output module name under which the module was loaded
into Speech Dispatcher in its configuration ("flite", "festival",
"espeak"... )
-- C API function: int spd_set_punctuation(SPDConnection* connection,
SPDPunctuation type);
Set punctuation mode to the given value. 'all' means speak all
punctuation characters, 'none' menas speak no punctuation
characters, 'some' means speak only punctuation characters given in
the server configuration or defined by the client's last
spd_set_punctuation_important().
'connection' is the SPDConnection* connection created by
spd_open().
'type' is one of the following values: 'SPD_PUNCT_ALL',
'SPD_PUNCT_NONE', 'SPD_PUNCT_SOME'.
It returns 0 on success, -1 otherwise.
-- C API function: int spd_set_spelling(SPDConnection* connection,
SPDSpelling type);
Switches spelling mode on and off. If set to on, all incoming
messages from this particular connection will be processed
according to appropriate spelling tables (see
spd_set_spelling_table()).
'connection' is the SPDConnection* connection created by
spd_open().
'type' is one of the following values: 'SPD_SPELL_ON',
'SPD_SPELL_OFF'.
-- C API function: int spd_set_voice_type(SPDConnection* connection,
SPDVoiceType voice);
Set a preferred symbolic voice.
'connection' is the SPDConnection* connection created by
spd_open().
'voice' is one of the following values: 'SPD_MALE1', 'SPD_MALE2',
'SPD_MALE3', 'SPD_FEMALE1', 'SPD_FEMALE2', 'SPD_FEMALE3',
'SPD_CHILD_MALE', 'SPD_CHILD_FEMALE'.
-- C API function: int spd_set_synthesis_voice(SPDConnection*
connection, char* voice_name);
Set the speech synthesizer voice to use. Please note that
synthesis voices are an attribute of the synthesizer, so this
setting only takes effect until the output module in use is changed
(via 'spd_set_output_module()' or via 'spd_set_language').
'connection' is the SPDConnection* connection created by
spd_open().
'voice_name' is any of the voice name values retrieved by *Note
spd_list_synthesis_voices::.
-- C API function: int spd_set_voice_rate(SPDConnection* connection,
int rate);
Set voice speaking rate.
'connection' is the SPDConnection* connection created by
spd_open().
'rate' is a number between -100 and +100 which means the slowest
and the fastest speech rate respectively.
-- C API function: int spd_get_voice_rate(SPDConnection* connection);
Get voice speaking rate.
'connection' is the SPDConnection* connection created by
spd_open().
It returns the current voice rate.
-- C API function: int spd_set_voice_pitch(SPDConnection* connection,
int pitch);
Set voice pitch.
'connection' is the SPDConnection* connection created by
spd_open().
'pitch' is a number between -100 and +100, which means the lowest
and the highest pitch respectively.
-- C API function: int spd_get_voice_pitch(SPDConnection* connection);
Get voice pitch.
'connection' is the SPDConnection* connection created by
spd_open().
It returns the current voice pitch.
-- C API function: int spd_set_voice_pitch_range(SPDConnection*
connection, int pitch_range);
Set voice pitch range.
'connection' is the SPDConnection* connection created by
spd_open().
'pitch_range' is a number between -100 and +100, which means the
lowest and the highest pitch range respectively.
-- C API function: int spd_set_volume(SPDConnection* connection, int
volume);
Set the volume of the voice and sounds produced by Speech
Dispatcher's output modules.
'connection' is the SPDConnection* connection created by
spd_open().
'volume' is a number between -100 and +100 which means the lowest
and the loudest voice respectively.
-- C API function: int spd_get_volume(SPDConnection* connection);
Get the volume of the voice and sounds produced by Speech
Dispatcher's output modules.
'connection' is the SPDConnection* connection created by
spd_open().
It returns the current volume.
File: speech-dispatcher.info, Node: Other Functions in C, Next: Information Retrieval Commands in C, Prev: Parameter Setting Commands in C, Up: C API
4.1.7 Other Functions
---------------------
File: speech-dispatcher.info, Node: Information Retrieval Commands in C, Next: Event Notification and Index Marking in C, Prev: Other Functions in C, Up: C API
4.1.8 Information Retrieval Commands
------------------------------------
-- C API function: char** spd_list_modules(SPDConnection* connection)
Returns a null-terminated array of identification names of the
available output modules. You can subsequently set the desired
output module with *Note spd_set_output_module::. In case of
error, the return value is a NULL pointer.
'connection' is the SPDConnection* connection created by
spd_open().
-- C API function: char** spd_list_voices(SPDConnection* connection)
Returns a null-terminated array of identification names of the
symbolic voices. You can subsequently set the desired voice with
*Note spd_set_voice_type::.
Please note that this is a fixed list independent of the
synthesizer in use. The given voices can be mapped to specific
synthesizer voices according to user wish or may, for example, all
be mapped to the same voice. To choose directly from the raw list
of voices as implemented in the synthesizer, *Note
spd_list_synthesis_voices::.
In case of error, the return value is a NULL pointer.
'connection' is the SPDConnection* connection created by
spd_open().
-- C API function: char** spd_list_synthesis_voices(SPDConnection*
connection)
Returns a null-terminated array of identification names of
'SPDVoice*' structures describing the available voices as given by
the synthesizer. You can subsequently set the desired voice with
'spd_set_synthesis_voice()'.
typedef struct{
char *name; /* Name of the voice (id) */
char *language; /* 2-letter ISO language code */
char *variant; /* a not-well defined string describing dialect etc. */
}SPDVoice;
Please note that the list returned is specific to each synthesizer
in use (so when you switch to another output module, you must also
retrieve a new list). If you want instead to use symbolic voice
names which are independent of the synthesizer in use, *Note
spd_list_voices::.
In case of error, the return value is a NULL pointer.
'connection' is the SPDConnection* connection created by
spd_open().
File: speech-dispatcher.info, Node: Event Notification and Index Marking in C, Next: History Commands in C, Prev: Information Retrieval Commands in C, Up: C API
4.1.9 Event Notification and Index Marking in C
-----------------------------------------------
When the SSIP connection is run in asynchronous mode, it is possible to
register callbacks for all the SSIP event notifications and index mark
notifications, as defined in *note (ssip)Message Event Notification and
Index Marking::
-- Variable: C API type SPDNotification
'SPDNotification' is an enum type that represents the possible base
notification types that can be assigned to a message.
typedef enum{
SPD_BEGIN = 1,
SPD_END = 2,
SPD_INDEX_MARKS = 4,
SPD_CANCEL = 8,
SPD_PAUSE = 16,
SPD_RESUME = 32
}SPDNotification;
There are currently two types of callbacks in the C API.
-- Variable: C API type SPDCallback
'void (*SPDCallback)(size_t msg_id, size_t client_id,
SPDNotificationType state);'
This one is used for notifications about the events: 'BEGIN',
'END', 'PAUSE' and 'RESUME'. When the callback is called, it
provides three parameters for the event.
'msg_id' unique identification number of the message the
notification is about.
'client_id' specifies the unique identification number of the
client who sent the message. This is usually the same connection
as the connection which registered this callback, and therefore
uninteresting. However, in some special cases it might be useful
to register this callback for other SSIP connections, or register
the same callback for several connections originating from the same
application.
'state' is the 'SPD_Notification' type of this notification. *Note
SPDNotification::.
-- Variable: C API type SPDCallbackIM
'void (*SPDCallbackIM)(size_t msg_id, size_t client_id,
SPDNotificationType state, char *index_mark);'
'SPDCallbackIM' is used for notifications about index marks that
have been reached in the message. (A way to specify index marks is
e.g. through the SSML element in ssml mode.)
The syntax and meaning of these parameters are the same as for
*note SPDCallback:: except for the additional parameter
'index_mark'.
'index_mark' is a NULL terminated string associated with the index
mark. Please note that this string is specified by client
application and therefore it needn't be unique.
One or more callbacks can be supplied for a given 'SPDConnection*'
connection by assigning the values of pointers to the appropriate
functions to the following connection members:
SPDCallback callback_begin;
SPDCallback callback_end;
SPDCallback callback_cancel;
SPDCallback callback_pause;
SPDCallback callback_resume;
SPDCallbackIM callback_im;
There are three settings commands which will turn notifications on
and off for the current SSIP connection and cause the callbacks to be
called when the event is registered by Speech Dispatcher.
-- C API function: int spd_set_notification_on(SPDConnection*
connection, SPDNotification notification);
-- C API function: int spd_set_notification_off(SPDConnection*
connection, SPDNotification notification);
-- C API function: int spd_set_notification(SPDConnection* connection,
SPDNotification notification, const char* state);
These functions will set the notification specified by the
parameter 'notification' on or off (or to the given value)
respectively. Note that it is only safe to call these functions
after the appropriate callback functions have been set in the
'SPDCallback' structure. Doing otherwise is not considered an
error, but the application might miss some events due to callback
functions not being executed (e.g. the client might receive an
'END' event without receiving the corresponding 'BEGIN' event in
advance.
'connection' is the SPDConnection* connection created by
spd_open().
'notification' is the requested type of notifications that should
be reported by SSIP. *Note SPDNotification::. Note that also '|'
combinations are possible, as illustrated in the example below.
'state' must be either the string "on" or "off", for switching the
given notification on or off.
The following example shows how to use callbacks for the simple
purpose of playing a message and waiting until its end. (Please note
that checks of return values in this example as well as other code not
directly related to index marking, have been removed for the purpose of
clarity.)
#include
sem_t semaphore;
/* Callback for Speech Dispatcher notifications */
void end_of_speech(size_t msg_id, size_t client_id, SPDNotificationType type)
{
/* We don't check msg_id here since we will only send one
message. */
/* Callbacks are running in a separate thread, so let the
(sleeping) main thread know about the event and wake it up. */
sem_post(&semaphore);
}
int
main(int argc, char **argv)
{
SPDConnection *conn;
sem_init(&semaphore, 0, 0);
/* Open Speech Dispatcher connection in THREADED mode. */
conn = spd_open("say","main", NULL, SPD_MODE_THREADED);
/* Set callback handler for 'end' and 'cancel' events. */
conn->callback_end = con->callback_cancel = end_of_speech;
/* Ask Speech Dispatcher to notify us about these events. */
spd_set_notification_on(conn, SPD_END);
spd_set_notification_on(conn, SPD_CANCEL);
/* Say our message. */
spd_sayf(conn, SPD_MESSAGE, (char*) argv[1]);
/* Wait for 'end' or 'cancel' of the sent message.
By SSIP specifications, we are guaranteed to get
one of these two eventually. */
sem_wait(&semaphore);
return 0;
}
File: speech-dispatcher.info, Node: History Commands in C, Next: Direct SSIP Communication in C, Prev: Event Notification and Index Marking in C, Up: C API
4.1.10 History Commands
-----------------------
File: speech-dispatcher.info, Node: Direct SSIP Communication in C, Prev: History Commands in C, Up: C API
4.1.11 Direct SSIP Communication in C
-------------------------------------
It might happen that you want to use some SSIP function that is not
available through a library or you may want to use an available function
in a different manner. (If you think there is something missing in a
library or you have some useful comment on the available functions,
please let us know.) For this purpose, there are a few functions that
will allow you to send arbitrary SSIP commands on your connection and
read the replies.
-- C API function: int spd_execute_command(SPDConnection* connection,
char *command);
You can send an arbitrary SSIP command specified in the parameter
'command'.
If the command is successful, the function returns a 0. If there
is no such command or the command failed for some reason, it
returns -1.
'connection' is the SPDConnection* connection created by
spd_open().
'command' is a null terminated string containing a full SSIP
command without the terminating sequence '\r\n'.
For example:
spd_execute_command(fd, "SET SELF RATE 60");
spd_execute_command(fd, "SOUND_ICON bell");
It's not possible to use this function for compound commands like
'SPEAK' where you are receiving more than one reply. If this is
your case, please see 'spd_send_data()'.
-- C API function: char* spd_send_data(SPDConnection* connection, const
char *message, int wfr);
You can send an arbitrary SSIP string specified in the parameter
'message' and, if specified, wait for the reply. The string can be
any SSIP command, but it can also be textual data or a command
parameter.
If 'wfr' (wait for reply) is set to SPD_WAIT_REPLY, you will
receive the reply string as the return value. If wfr is set to
SPD_NO_REPLY, the return value is a NULL pointer. If wfr is set to
SPD_WAIT_REPLY, you should always free the returned string.
'connection' is the SPDConnection* connection created by
spd_open().
'message' is a null terminated string containing a full SSIP
string. If this is a complete SSIP command, it must include the
full terminating sequence '\r\n'.
'wfr' is either SPD_WAIT_REPLY (integer value of 1) or SPD_NO_REPLY
(0). This specifies if you expect to get a reply on the sent data
according to SSIP. For example, if you are sending ordinary text
inside a 'SPEAK' command, you don't expect to get a reply, but you
expect a reply after sending the final sequence '\r\n.\r\n'.
For example (simplified by not checking and freeing the returned
strings):
spd_send_data(conn, "SPEAK", SPD_WAIT_REPLY);
spd_send_data(conn, "Hello world!\n", SPD_NO_REPLY);
spd_send_data(conn, "How are you today?!", SPD_NO_REPLY);
spd_send_data(conn, "\r\n.\r\n.", SPD_WAIT_REPLY);
File: speech-dispatcher.info, Node: Python API, Next: Guile API, Prev: C API, Up: Client Programming
4.2 Python API
==============
There is a full Python API available in 'src/python/speechd/' in the
source tree. Please see the Python docstrings for full reference about
the available objects and methods.
Simple Python client:
import speechd
client = speechd.SSIPClient('test')
client.set_output_module('festival')
client.set_language('en')
client.set_punctuation(speechd.PunctuationMode.SOME)
client.speak("Hello World!")
client.close()
The Python API respects the environment variables SPEECHD_ADDRESS it
the communication address is not specified explicitly (see 'SSIPClient'
constructor arguments).
Implementation of callbacks within the Python API tries to hide the
low level details of SSIP callback handling and provide a convenient
Pythonic interface. You just pass a callable object (function) to the
'speak()' method and this function will be called whenever an event
occurs for the corresponding message.
Callback example:
import speechd, time
called = []
client = speechd.SSIPClient('callback-test')
client.speak("Hi!", callback=lambda cb_type: called.append(cb_type))
time.sleep(2) # Wait for the events to happen.
print "Called callbacks:", called
client.close()
Real-world callback functions will most often need some sort of
context information to be able to distinguish for which message the
callback was called. This can be simply done in Python. The following
example uses the actual message text as the context information within
the callback function.
Callback context example:
import speechd, time
class CallbackExample(object):
def __init__(self):
self._client = speechd.SSIPClient('callback-test')
def speak(self, text):
def callback(callback_type):
if callback_type == speechd.CallbackType.BEGIN:
print "Speech started:", text
elif callback_type == speechd.CallbackType.END:
print "Speech completed:", text
elif callback_type == speechd.CallbackType.CANCEL:
print "Speech interupted:", text
self._client.speak(text, callback=callback,
event_types=(speechd.CallbackType.BEGIN,
speechd.CallbackType.CANCEL,
speechd.CallbackType.END))
def go(self):
self.speak("Hi!")
self.speak("How are you?")
time.sleep(4) # Wait for the events to happen.
self._client.close()
CallbackExample().go()
_Important notice:_ The callback is called in Speech Dispatcher
listener thread. No subsequent Speech Dispatcher interaction is allowed
from within the callback invocation. If you need to do something more
complicated, do it in another thread to prevent deadlocks in SSIP
communication.
File: speech-dispatcher.info, Node: Guile API, Next: Common Lisp API, Prev: Python API, Up: Client Programming
4.3 Guile API
=============
The Guile API can be found 'src/guile/' in the source tree, however it's
still considered to be at the experimental stage. Please read
'src/guile/README'.
File: speech-dispatcher.info, Node: Common Lisp API, Next: Autospawning, Prev: Guile API, Up: Client Programming
4.4 Common Lisp API
===================
The Common Lisp API can be found 'src/cl/' in the source tree, however
it's still considered to be at the experimental stage. Please read
'src/cl/README'.
File: speech-dispatcher.info, Node: Autospawning, Prev: Common Lisp API, Up: Client Programming
4.5 Autospawning
================
It is suggested that client libraries offer an autospawn functionality
to automatically start the server process when connecting locally and if
it is not already running. E.g. if the client application starts and
Speech Dispatcher is not running already, the client will start Speech
Dispatcher.
The library API should provide a possibility to turn this
functionality off, but we suggest to set the default behavior to
autospawn.
Autospawn is performed by executing Speech Dispatcher with the -spawn
parameter under the same user and permissions as the client process:
speech-dispatcher --spawn
With the '--spawn' parameter, the process will start and return with
an exit code of 0 only if a) it is not already running (pidfile check)
b) the server doesn't have autospawn disabled in its configuration c) no
other error preventing the start occurs. Otherwise, Speech Dispatcher
is not started and the error code of 1 is returned.
The client library should redirect its stdout and stderr outputs
either to nowhere or to its logging system. It should subsequently
completely detach from the newly spawned process.
Due to a bug in Speech Dispatcher, it is currently necessary to
include a wait statement after the autospawn for about 0.5 seconds
before attempting a connection.
Please see how autospawn is implemented in the C API and in the
Python API for an example.
File: speech-dispatcher.info, Node: Server Programming, Next: Download and Contact, Prev: Client Programming, Up: Top
5 Server Programming
********************
* Menu:
* Server Core:: Internal structure and functionality overview.
* Output Modules:: Plugins for various speech synthesizers.
File: speech-dispatcher.info, Node: Server Core, Next: Output Modules, Prev: Server Programming, Up: Server Programming
5.1 Server Core
===============
The main documentation for the server core is the code itself. This
section is only a general introduction intended to give you some basic
information and hints where to look for things. If you are going to
make some modifications in the server core, we will be happy if you get
in touch with us on .
The server core is composed of two main parts, each of them
implemented in a separate thread. The _server part_ handles the
communication with clients and, with the desired configuration options,
stores the messages in the priority queue. The _speaking part_ takes
care of communicating with the output modules, pulls messages out of the
priority queue at the correct time and sends them to the appropriate
synthesizer.
Synchronization between these two parts is done by thread mutexes.
Additionally, synchronization of the speaking part from both sides
(server part, output modules) is done via a SYSV/IPC semaphore.
Server part
-----------
After switching to the daemon mode (if required), it reads configuration
files and initializes the speaking part. Then it opens the socket and
waits for incoming data. This is implemented mainly in
'src/server/speechd.c' and 'src/server/server.c'.
There are three types of events: new client connects to speechd, old
client disconnects, or a client sends some data. In the third case, the
data is passed to the 'parse()' function defined in
'src/server/parse.c'.
If the incoming data is a new message, it's stored in a queue
according to its priority. If it is SSIP commands, it's handled by the
appropriate handlers. Handling of the 'SET' family of commands can be
found in 'src/server/set.c' and 'HISTORY' commands are processed in
'src/server/history.c'.
All reply messages of SSIP are defined in 'src/server/msg.h'.
Speaking part
-------------
This thread, the function 'speak()' defined in 'src/server/speaking.c',
is created from the server part process shortly after initialization.
Then it enters an infinite loop and waits on a SYSV/IPC semaphore until
one of the following actions happen:
* The server adds a new message to the queue of messages waiting to
be said.
* The currently active output module signals that the message that
was being spoken is done.
* Pause or resume is requested.
After handling the rest of the priority interaction (like actions
needed to repeat the last priority progress message) it decides which
action should be performed. Usually it's picking up a message from the
queue and sending it to the desired output module (synthesizer), but
sometimes it's handling the pause or resume requests, and sometimes it's
doing nothing.
As said before, this is the part of Speech Dispatcher that talks to
the output modules. It does so by using the output interface defined in
'src/server/output.c'.
File: speech-dispatcher.info, Node: Output Modules, Prev: Server Core, Up: Server Programming
5.2 Output Modules
==================
* Menu:
* Basic Structure:: The definition of an output module.
* Communication Protocol for Output Modules::
* How to Write New Output Module:: How to include support for new synthesizers
* The Skeleton of an Output Module::
* Output Module Functions::
* Module Utils Functions and Macros::
* Index Marks in Output Modules::
File: speech-dispatcher.info, Node: Basic Structure, Next: Communication Protocol for Output Modules, Prev: Output Modules, Up: Output Modules
5.2.1 Basic Structure
---------------------
Speech Dispatcher output modules are independent applications that,
using a simple common communication protocol, read commands from
standard input and then output replies on standard output, communicating
the requests to the particular software or hardware synthesizer.
Everything the output module writes on standard output or reads from
standard input should conform to the specifications of the communication
protocol. Additionally, standard error output is used for logging of
the modules.
Output module binaries are usually located in 'bin/speechd-modules/'
and are loaded automatically when Speech Dispatcher starts, according to
configuration. Their standard input/output/error output is redirected
to a pipe to Speech Dispatcher and this way both sides can communicate.
When the modules start, they are passed the name of a configuration
file that should be used for this particular output module.
Each output module is started by Speech Dispatcher as:
my_module "configfile"
where 'configfile' is the full path to the desired configuration file
that the output module should parse.
File: speech-dispatcher.info, Node: Communication Protocol for Output Modules, Next: How to Write New Output Module, Prev: Basic Structure, Up: Output Modules
5.2.2 Communication Protocol for Output Modules
-----------------------------------------------
The protocol by which the output modules communicate on standard
input/output is based on *note SSIP: (ssip)Top, although it is highly
simplified and a little bit modified for the different purpose here.
Another difference is that event notification is obligatory in modules
communication, while in SSIP, this is an optional feature. This is
because Speech Dispatcher has to know all the events happening in the
output modules for the purpose of synchronization of various messages.
Since it's very similar to SSIP, *note General Rules: (ssip)Top, for
a general description of what the protocol looks like. One of the
exceptions is that since the output modules communicate on standard
input/output, we use only 'LF' as the line separator.
The return values are:
* 2xx OK
* 3xx CLIENT ERROR or BAD SYNTAX or INVALID VALUE
* 4xx OUTPUT MODULE ERROR or INTERNAL ERROR
* 700 EVENT INDEX MARK
* 701 EVENT BEGIN
* 702 EVENT END
* 703 EVENT STOP
* 704 EVENT PAUSE
'SPEAK'
Start receiving a text message in the SSML format and synthesize
it. After sending a reply to the command, output module waits for
the text of the message. The text can spread over any number of
lines and is finished by an end of line marker followed by the line
containing the single character '.' (dot). Thus the complete
character sequence closing the input text is 'LF . LF'. If any
line within the sent text contains only a dot, an extra dot should
be prepended before it.
During reception of the text message, output module doesn't send a
response to the particular lines sent. The response line is sent
only immediately after the 'SPEAK' command and after receiving the
closing dot line. This doesn't provide any means of
synchronization, instead, event notification is used for this
purpose.
There is no explicit upper limit on the size of the text.
If the 'SPEAK' command is received while the output module is
already speaking, it is considered an error.
Example:
SPEAK
202 OK SEND DATA
Hello, GNU!
.
200 OK SPEAKING
After receiving the full text (or the first part of it), the output
module is supposed to start synthesizing it and take care of
delivering it to an audio device. When (or just before) the first
synthesized samples are delivered to the audio and start playing,
the output module must send the 'BEGIN' event over the
communication socket to Speech Dispatcher, *Note Events
notification and index marking::. After the audio stops playing,
the event 'STOP', 'PAUSE' or 'END' must be delivered to Speech
Dispatcher. Additionally, if supported by the given synthesizer,
the output module can issue events associated with the included
SSML index marks when they are reached in the audio output.
'CHAR'
Synthesize a character. If the synthesizer supports a different
behavior for the event of "character", this should be used.
It works like the command 'SPEAK' above, except that the argument
has to be exactly one line long. It contains the UTF-8 form of
exactly one character.
'KEY'
Synthesize a key name. If the synthesizer supports a different
behavior for the event of "key name", this should be used.
It works like the command 'SPEAK' above, except that the argument
has to be exactly one line long. *Note SSIP KEY: (ssip)Top, for
the description of the allowed arguments.
'SOUND_ICON'
Produce a sound icon. According to the configuration of the
particular synthesizer, this can produce either a sound (e.g.
.wav) or synthesize some text.
It works like the command 'SPEAK' above, except that the argument
has to be exactly one line long. It contains the symbolic name of
the icon that should be said. *Note SSIP SOUND_ICON: (ssip)Top,
for more detailed description of the sound icons mechanism.
'STOP'
Immediately stop speaking on the output device and cancel
synthesizing the current message so that the output module is
prepared to receive a new message. If there is currently no
message being synthesized, it is not considered an error to call
'STOP' anyway.
This command is asynchronous. The output module is not supposed to
send any reply (not even error reply).
It should return immediately, although stopping the synthesizer may
require a little bit more time. The module must issue one of the
events 'STOPPED' or 'END' when the module is finally stopped.
'END' is issued when the playing stopped by itself before the
module could terminate it or if the architecture of the output
module doesn't allow it to decide, otherwise 'STOPPED' should be
used.
STOP
'PAUSE'
Stop speaking the current message at a place where we can exactly
determine the position (preferably after a '__spd_' index mark).
This doesn't have to be immediate and can be delayed even for a few
seconds. (Knowing the position exactly is important so that we can
later continue the message without gaps or overlapping.) It
doesn't do anything else (like storing the message etc.).
This command is asynchronous. The output module is not supposed to
send any reply (not even error reply).
For example:
PAUSE
'SET'
Set one of several speech parameters for the future messages.
Each of the parameters is written on a single line in the form
name=value
where 'value' can be either a number or a string, depending upon
the name of the parameter.
The 'SET' environment is terminated by a dot on a single line.
Thus the complete character sequence closing the input text is 'LF
. LF'
During reception of the settings, output module doesn't send any
response to the particular lines sent. The response line is sent
only immediately after the 'SET' command and after receiving the
closing dot line.
The available parameters that accept numerical values are 'rate',
'pitch' and 'pitch_range'.
The available parameters that accept string values are
'punctuation_mode', 'spelling_mode', 'cap_let_recogn', 'voice', and
'language'. The arguments are the same as for the corresponding
SSIP commands, except that they are written with small letters.
*Note Parameter Setting Commands: (ssip)Top. The conversion
between these string values and the corresponding C enum variables
can be easily done using 'src/common/fdsetconv.c'.
Not all of these parameters must be set and the value of the string
arguments can also be 'NULL'. If some of the parameters aren't
set, the output module should use its default.
It's not necessary to set these parameters on the synthesizer right
away, instead, it can be postponed until some message to be spoken
arrives.
Here is an example:
SET
203 OK RECEIVING SETTINGS
rate=20
pitch=-10
pitch_range=50
punctuation_mode=all
spelling_mode=on
punctuation_some=NULL
.
203 OK SETTINGS RECEIVED
'AUDIO'
Audio has exactly the same structure as 'SET', but is transmitted
only once immediatelly after 'INIT' to transmit the requested audio
parameters and tell the output module to open the audio device.
'QUIT'
Terminates the output module. It should send the response,
deallocate all the resources, close all descriptors, terminate all
child processes etc. Then the output module should exit itself.
QUIT
210 OK QUIT
5.2.2.1 Events notification and index marking
.............................................
Each output module must take care of sending asynchronous notifications
whenever the synthesizer (or the module) starts or stops output audio on
the speakers. Additionally, whenever possible, the output module should
report back to Speech Dispatcher index marks found in the incoming SSML
text whenever they are reached while speaking. See SSML specifications
for more details about the 'mark' element
Event and index mark notifications are reported by simply writing
them to the standard output. An event notification must never get in
between synchronous commands (those which require a reply) and their
reply. Before Speech Dispatcher sends any new requests (like 'SET',
'SPEAK' etc.) it waits for the previous request to be terminated by the
output module by signalling 'STOP', 'END' or 'PAUSE' index marks. So
the only thing the output module must ensure in order to satisfy this
requirement is that it doesn't send any index marks until it
acknowledges the receival of the new message via '200 OK SPEAKING'. It
must also ensure that index marks written to the pipe are well ordered -
of course it doesn't make any sense and it is an error to send any index
marks after 'STOP', 'END' or 'PAUSE' is sent.
'BEGIN'
This event must be issued whenever the module starts to speak the
given message. If this is not possible, it can issue it when it
starts to synthesize the message or when it receives the message.
It is prepended by the code '701' and takes the form
701 BEGIN
'END'
This event must be issued whenever the module terminates speaking
the given message because it reached its end. If this is not
possible, it can issue this event when it is ready to receive a new
message after speaking the previous message.
Each 'END' must always be preceeded (possibly not directly) by a
'BEGIN'.
It is prepended by the code '702' and takes the form
702 END
'STOP'
This event should be issued whenever the module terminates speaking
the given message without reaching its end (as a consequence of
receiving the STOP command or because of some error) not because of
a 'PAUSE' command. When the synthesizer in use doesn't allow the
module to decide, the event 'END' can be used instead.
Each 'STOP' must always be preceeded (possibly not directly) by a
'BEGIN'.
It is prepended by the code '703' and takes the form
703 STOP
'PAUSE'
This event should be issued whenever the module terminates speaking
the given message without reaching its end because of receiving the
'PAUSE' command.
Each 'PAUSE' must always be preceeded (possibly not directly) by a
'BEGIN'.
It is prepended by the code '704' and takes the form
704 PAUSE
'INDEX MARK'
This event should be issued by the output module (if supported)
whenever an index mark (SSML tag '') is passed while
speaking a message. It is preceeded by the code '700' and takes
the form
700-name
700 INDEX MARK
where 'name' is the value of the SSML attribute 'name' in the tag
''.
File: speech-dispatcher.info, Node: How to Write New Output Module, Next: The Skeleton of an Output Module, Prev: Communication Protocol for Output Modules, Up: Output Modules
5.2.3 How to Write New Output Module
------------------------------------
If you want to write your own output module, there are basically two
ways to do it. Either you can program it all yourself, which is fine as
long as you stick to the definition of an output module and its
communication protocol, or you can use our 'module_*.c' tools. If you
use these tools, you will only have to write the core functions like
module_speak() and module_stop etc. and you will not have to worry
about the communication protocol and other formal things that are common
for all modules. Here is how you can do it using the provided tools.
We will recommend here a basic structure of the code for an output
module you should follow, although it's perfectly ok to establish your
own if you have reasons to do so, if all the necessary functions and
data are defined somewhere in the file. For this purpose, we will use
examples from the output module for Flite (Festival Lite), so it's
recommended to keep looking at 'flite.c' for reference.
A few rules you should respect:
* The 'module_*.c' files should be included at the specified place
and in the specified order, because they include directly some
pieces of the code and won't work in other places.
* If one or more new threads are used in the output module, they must
block all signals.
* On module_close(), all lateral threads and processes should be
terminated, all memory freed. Don't assume module_close() is
always called before exit() and the sources will be freed
automatically.
* We will be happy if all the copyrights are assigned to Brailcom,
o.p.s. in order for us to be in a better legal position against
possible intruders.
File: speech-dispatcher.info, Node: The Skeleton of an Output Module, Next: Output Module Functions, Prev: How to Write New Output Module, Up: Output Modules
5.2.4 The Skeleton of an Output Module
--------------------------------------
Each output module should include 'module_utils.h' where the
SPDMsgSettings structure is defined to be able to handle the different
speech synthesis settings. This file also provides tools which help
with writing output modules and making the code simpler.
#include "module_utils.h"
If your plugin needs the audio tools (if you take care of the output
to the soundcard instead of the synthesizer), you also have to include
'spd_audio.h'
#include "spd_audio.h"
The definition of macros 'MODULE_NAME' and 'MODULE_VERSION' should
follow:
#define MODULE_NAME "flite"
#define MODULE_VERSION "0.1"
If you want to use the 'DBG(message)' macro from 'module_utils.c' to
print out debugging messages, you should insert these two lines.
(Please don't use printf for debugging, this doesn't work with multiple
processes!) (You will later have to actually start debugging in
'module_init()')
DECLARE_DEBUG();
You don't have to define the prototypes of the core functions like
module_speak() and module_stop(), these are already defined in
'module_utils.h'
Optionally, if your output module requires some special
configuration, apart from defining voices and configuring debugging
(they are handled differently, see below), you can declare the requested
option here. It will expand into a dotconf callback and declaration of
the variable.
(You will later have to actually register these options for Speech
Dispatcher in 'module_load()')
There are currently 4 types of possible configuration options:
* 'MOD_OPTION_1_INT(name); /* Set up `int name' */'
* 'MOD_OPTION_1_STR(name); /* Set up `char* name' */'
* 'MOD_OPTION_2(name); /* Set up `char *name[2]' */'
* 'MOD_OPTION_{2,3}_HT(name); /* Set up a hash table */'
*Note Output Modules Configuration::.
For example Flite uses 2 options:
MOD_OPTION_1_INT(FliteMaxChunkLength);
MOD_OPTION_1_STR(FliteDelimiters);
Every output module is started in 2 phases: _loading_ and
_initialization_.
The goal of loading is to initialize empty structures for storing
settings and declare the DotConf callbacks for parsing configuration
files. In the second phase, initialization, all the configuration has
been read and the output module can accomplish the rest (check if the
synthesizer works, set up threads etc.).
You should start with the definition of 'module_load()'.
int
module_load(void)
{
Then you should initialize the settings tables. These are defined in
'module_utils.h' and will be used to store the settings received by the
'SET' command.
INIT_SETTINGS_TABLES();
Also, define the configuration callbacks for debugging if you use the
'DBG()' macro.
REGISTER_DEBUG();
Now you can finally register the options for the configuration file
parsing. Just use these macros:
* MOD_OPTION_1_INT_REG(name, default); /* for integer parameters */
* MOD_OPTION_1_STR_REG(name, default); /* for string parameters */
* MOD_OPTION_MORE_REG(name); /* for an array of strings */
* MOD_OPTION_HT_REG(name); /* for hash tables */
Again, an example from Flite:
MOD_OPTION_1_INT_REG(FliteMaxChunkLength, 300);
MOD_OPTION_1_STR_REG(FliteDelimiters, ".");
If you want to enable the mechanism for setting voices through
AddVoice, use this function (for an example see 'generic.c'):
Example from Festival:
module_register_settings_voices();
*Note Output Modules Configuration::.
If everything went correctly, the function should return 0, otherwise
-1.
return 0;
}
The second phase of starting an output module is handled by:
int
module_init(void)
{
If you use the DBG() macro, you should init debugging on the start of
this function. From that moment on, you can use DBG(). Apart from
that, the body of this function is entirely up to you. You should do
all the necessary initialization of the particular synthesizer. All
declared configuration variables and configuration hash tables, together
with the definition of voices, are filled with their values (either
default or read from configuration), so you can use them already.
INIT_DEBUG();
DBG("FliteMaxChunkLength = %d\n", FliteMaxChunkLength);
DBG("FliteDelimiters = %s\n", FliteDelimiters);
This function should return 0 if the module was initialized
successfully, or -1 if some failure was encountered. In this case, you
should clean up everything, cancel threads, deallocate memory etc.; no
more functions of this output module will be touched (except for other
tries to load and initialize the module).
Example from Flite:
/* Init flite and register a new voice */
flite_init();
flite_voice = register_cmu_us_kal();
if (flite_voice == NULL){
DBG("Couldn't register the basic kal voice.\n");
return -1;
}
[...]
The third part is opening the audio. This is commanded by the
'AUDIO' protocol command. If the synthesizer is able to retrieve audio
data, it is desirable to open the 'spd_audio' output according to the
requested parameters and then use this method for audio output. Audio
initialization can be done as follows:
int
module_audio_init(char **status_info){
DBG("Opening audio");
return module_audio_init_spd(status_info);
}
If it is impossible to retrieve audio from the synthesizer and the
synthesizer itself is used for playback, than the module must still
contain this function, but it should just return 0 and do nothing.
Now you have to define all the synthesis control functions
'module_speak', 'module_stop' etc. See *note Output Module Functions::.
At the end, this simple include provides the main() function and all
the functionality related to being an output module of Speech Dispatcher
(parsing argv[] parameters, communicating on stdin/stdout, ...). It's
recommended to study this file carefully and try to understand what
exactly it does, as it will be part of the source code of your output
module.
#include "module_main.c"
If it doesn't work, it's most likely not your fault. Complain! This
manual is not complete and the instructions in this sections aren't
either. Get in touch with us and together we can figure out what's
wrong, fix it and then warn others in this manual.
File: speech-dispatcher.info, Node: Output Module Functions, Next: Module Utils Functions and Macros, Prev: The Skeleton of an Output Module, Up: Output Modules
5.2.5 Output Module Functions
-----------------------------
-- Output Module Functions: int module_speak (char *data, size_t bytes,
EMessageType msgtype)
This is the function where the actual speech output is produced.
It is called every time Speech Dispatcher decides to send a message
to synthesis. The data of length BYTES are passed in a NULL
terminated string DATA. The argument MSGTYPE defines what type of
message it is (different types should be handled differently, if
the synthesizer supports it).
Each output module should take care of setting the output device to
the parameters from msg_settings (defined in module_utils.h) (See
SPDMsgSettings in 'module_utils.h'). However, it is not an error
if some of these values are ignored. At least rate, pitch and
language should be set correctly.
Speed and pitch are values between -100 and 100 included. 0 is the
default value that represents normal speech flow. So -100 is the
slowest (or lowest) and +100 is the fastest (or highest) speech.
The language parameter is given as a null-terminated string
containing the name of the language according to RFC 1766 (en, cs,
fr, ...). If the requested language is not supported by this
synthesizer, it's ok to abort and return 0, because that's an error
in user settings.
An easy way to set the parameters is using the UPDATE_PARAMETER()
and UPDATE_STRING_PARAMETER() macros. *Note Module Utils Functions
and Macros::.
Example from festival:
UPDATE_STRING_PARAMETER(language, festival_set_language);
UPDATE_PARAMETER(voice, festival_set_voice);
UPDATE_PARAMETER(rate, festival_set_rate);
UPDATE_PARAMETER(pitch, festival_set_pitch);
UPDATE_PARAMETER(punctuation_mode, festival_set_punctuation_mode);
UPDATE_PARAMETER(cap_let_recogn, festival_set_cap_let_recogn);
This function should return 0 if it fails and 1 if the delivery to
the synthesizer is successful. It should return immediately,
because otherwise, it would block stopping, priority handling and
other important things in Speech Dispatcher.
If there is a need to stay longer, you should create a separate
thread or process. This is for example the case of some software
synthesizers which use a blocking function (eg. spd_audio_play) or
hardware devices that have to send data to output modules at some
particular speed. Note that if you use threads for this purpose,
you have to set them to ignore all signals. The simplest way to do
this is to call 'set_speaking_thread_parameters()' which is defined
in module_utils.c. Call it at the beginning of the thread code.
-- Output module function: int module_stop (void)
This function should stop the synthesis of the currently spoken
message immediately and throw away the rest of the message.
This function should return immediately. Speech Dispatcher will
not send another command until module_report_event_stop() is
called. Note that you cannot call module_report_event_stop() from
within the call to module_stop(). The best thing to do is emit the
stop event from another thread.
It should return 0 on success, -1 otherwise.
-- Output module function: size_t module_pause (void)
This function should stop speaking on the synthesizer (or sending
data to soundcard) just after sending an '__spd_' index mark so
that Speech Dispatcher knows the position of stop.
The pause can wait for a short time until an index mark is reached.
However, if it's not possible to determine the exact position, this
function should have the same effect as 'module_stop'.
This function should return immediately. Speech Dispatcher will
not send another command until module_report_event_pause() is
called. Note that you cannot call module_report_event_pause() from
within the call to module_pause(). The best thing to do is emit
the pause event from another thread.
For some software synthesizers, the desired effect can be archieved
in this way: When 'module_speak()' is called, you execute a
separate process and pass it the requested message. This process
cuts the message into sentences and then runs in a loop and sends
the pieces to synthesis. If a signal arrives from
'module_pause()', you set a flag and stop the loop at the point
where next piece of text would be synthesized.
It's not an error if this function is called when the device is not
speaking. In this case, it should return 0.
Note there is no module_resume() function. The semantics of
'module_pause()' is the same as 'module_stop()' except that your
module should stop after reaching a '__spd_' index mark. Just like
'module_stop()', it should discard the rest of the message after
pausing. On the next 'module_speak()' call, Speech Dispatcher will
resend the rest of the message after the index mark.
File: speech-dispatcher.info, Node: Module Utils Functions and Macros, Next: Index Marks in Output Modules, Prev: Output Module Functions, Up: Output Modules
5.2.6 Module Utils Functions and Macros
---------------------------------------
This section describes the various variables, functions and macros that
are available in the 'module_utils.h' file. They are intended to make
writing new output modules easier and allow the programmer to reuse
existing pieces of code instead of writing everything from scratch.
* Menu:
* Initialization Macros and Functions::
* Generic Macros and Functions::
* Functions used by module_main.c::
* Functions for use when talking to synthesizer::
* Multi-process output modules::
* Memory Handling Functions::
File: speech-dispatcher.info, Node: Initialization Macros and Functions, Next: Generic Macros and Functions, Prev: Module Utils Functions and Macros, Up: Module Utils Functions and Macros
5.2.6.1 Initialization Macros and Functions
...........................................
-- Module Utils macro: INIT_SETTINGS_TABLES ()
This macro initializes the settings tables where the parameters
received with the 'SET' command are stored. You must call this
macro if you want to use the 'UPDATE_PARAMETER()' and
'UPDATE_STRING_PARAMETER()' macros.
It is intended to be called from inside a function just after the
output module starts.
5.2.6.2 Debugging Macros
........................
-- Module Utils macro: DBG (format, ...)
DBG() outputs a debugging message, if the 'Debug' option in
module's configuration is set, to the file specified in
configuration ad 'DebugFile'. The parameter syntax is the same as
for the printf() function. In fact, it calls printf() internally.
-- Module Utils macro: FATAL (text)
Outputs a message specified as 'text' and calls exit() with the
value EXIT_FAILURE. This terminates the whole output module without
trying to kill the child processes or freeing other resources other
than those that will be freed by the system.
It is intended to be used after some severe error has occurred.
File: speech-dispatcher.info, Node: Generic Macros and Functions, Next: Functions used by module_main.c, Prev: Initialization Macros and Functions, Up: Module Utils Functions and Macros
5.2.6.3 Generic Macros and Functions
....................................
-- Module Utils macro: UPDATE_PARAMETER (param, setter)
Tests if the integer or enum parameter specified in 'param' (e.g.
rate, pitch, cap_let_recogn, ...) changed since the last time when
the 'setter' function was called.
If it changed, it calls the function 'setter' with the new value.
(The new value is stored in the msg_settings structure that is
created by module_utils.h, which you normally don't have to care
about.)
The function 'setter' should be defined as:
void setter_name(type value);
Please look at the 'SET' command in the communication protocol for
the list of all available parameters. *note Communication Protocol
for Output Modules::.
An example from Festival output module:
static void
festival_set_rate(signed int rate)
{
assert(rate >= -100 && rate <= +100);
festivalSetRate(festival_info, rate);
}
[...]
int
module_speak(char *data, size_t bytes, EMessageType msgtype)
{
[...]
UPDATE_PARAMETER(rate, festival_set_rate);
UPDATE_PARAMETER(pitch, festival_set_pitch);
[...]
}
-- Module Utils macro: UPDATE_STRING_PARAMETER (param, setter)
The same as 'UPDATE_PARAMETER' except that it works for parameters
with a string value.
File: speech-dispatcher.info, Node: Functions used by module_main.c, Next: Functions for use when talking to synthesizer, Prev: Generic Macros and Functions, Up: Module Utils Functions and Macros
5.2.6.4 Functions used by 'module_main.c'
.........................................
-- Module Utils function: char* do_speak(void)
Takes care of communication after the 'SPEAK' command was received.
Calls 'module_speak()' when the full text is received.
It returns a response according to the communication protocol.
-- Module Utils function: char* do_stop(void)
Calls the 'module_stop()' function of the particular output module.
It returns a response according to the communication protocol.
-- Module Utils function: char* do_pause(void)
Calls the 'module_pause()' function of the particular output
module.
It returns a response according to the communication protocol and
the value returned by 'module_pause()'.
-- Module Utils function: char* do_set()
Takes care of communication after the 'SET' command was received.
Doesn't call any particular function of the output module, only
sets the values in the settings tables. (You should then call the
'UPDATE_PARAMETER()' macro in module_speak() to actually set the
synthesizer to these values.)
It returns a response according to the communication protocol.
-- Module Utils function: char* do_speaking()
Calls the 'module_speaking()' function.
It returns a response according to the communication protocol and
the value returned by 'module_speaking()'.
-- Module Utils function: void do_quit()
Prints the farewell message to the standard output, according to
the protocol. Then it calls 'module_close()'.
File: speech-dispatcher.info, Node: Functions for use when talking to synthesizer, Next: Multi-process output modules, Prev: Functions used by module_main.c, Up: Module Utils Functions and Macros
5.2.6.5 Functions for use when talking to synthesizer
.....................................................
-- Module Utils function: static int module_get_message_part ( const
char* message, char* part, unsigned int *pos, size_t maxlen,
const char* dividers)
Gets a part of the 'message' according to the specified 'dividers'.
It scans the text in 'message' from the byte specified by '*pos'
and looks for one of the characters specified in 'dividers'
followed by a whitespace character or the terminating NULL byte.
If one of them is encountered, the read text is stored in 'part'
and the number of bytes read is returned. If end of 'message' is
reached, the return value is -1.
'message' is the text to process. It must be a NULL-terminated
uni-byte string.
'part' is a pointer to the place where the output text should be
stored. It must contain at least 'maxlen' bytes of space.
'maxlen' is the maximum number of bytes that should be written to
'part'.
'dividers' is a NULL-terminated uni-byte string containing the
punctuation characters where the message should be divided into
smaller parts (if they are followed by whitespace).
After returning, 'pos' is the position where the function
terminated in processing 'message'.
-- Output module function: void module_report_index_mark(char *mark)
-- Output module function: void module_report_event_*()
The 'module_report_' functions serve for reporting event
notifications and index marking events. You should use them
whenever you get an event from the synthesizer which is defined in
the output module communication protocol.
Note that you cannot call these functions from within a call to
module_speak(), module_stop(), or module_pause(). The best way to
do this is to emit the events from another thread.
-- Output module function: int module_close(void)
This function is called when Speech Dispatcher terminates. The
output module should terminate all threads and processes, free all
resources, close all sockets etc. Never assume this function is
called only when Speech Dispatcher terminates and exit(0) will do
the work for you. It's perfectly ok for Speech Dispatcher to load,
unload or reload output modules in the middle of its run.
File: speech-dispatcher.info, Node: Multi-process output modules, Next: Memory Handling Functions, Prev: Functions for use when talking to synthesizer, Up: Module Utils Functions and Macros
5.2.6.6 Multi-process output modules
....................................
-- Module Utils function: size_t module_parent_wfork (
TModuleDoublePipe dpipe,
const char* message, SPDMessageType msgtype, const size_t maxlen,
const char* dividers, int *pause_requested)
It simply sends the data to the child in smaller pieces and waits
for confirmation with a single 'C' character on the pipe from child
to parent.
'dpipe' is a parameter which contains the information necessary for
communicating through pipes between the parent and the child and
vice-versa.
typedef struct{
int pc[2]; /* Parent to child pipe */
int cp[2]; /* Child to parent pipe */
}TModuleDoublePipe;
'message' is a pointer to a NULL-terminated string containing the
message for synthesis.
'msgtype' is the type of the message for synthesis.
'maxlen' is the maximum number of bytes that should be transfered
over the pipe.
'dividers' is a NULL-terminated string containing the punctuation
characters at which this function should divide the message into
smaller pieces.
'pause_requested' is a pointer to an integer flag, which is either
0 if no pause request is pending, or 1 if the function should
terminate at a convenient place in the message because a pause is
requested.
In the beginning, it initializes the pipes and then it enters a
simple cycle:
1. Reads a part of the message or an index mark using
'module_get_message_part()'.
2. Looks if there isn't a pending request for pause and handles
it.
3. Sends the current part of the message to the child using
'module_parent_dp_write()'.
4. Waits until a single character 'C' comes from the other pipe
using 'module_parent_dp_read()'.
5. Repeats the cycle or terminates, if there is no more data.
-- Module Utils function: int
module_parent_wait_continue(TModuleDoublePipe dpipe)
Waits until the character 'C' (continue) is read from the pipe from
child. This function is intended to be run from the parent.
'dpipe' is the double pipe used for communication between the child
and parent.
Returns 0 if the character was read or 1 if the pipe was broken
before the character could be read.
-- Module Utils function: void module_parent_dp_init (TModuleDoublePipe
dpipe)
Initializes pipes (dpipe) in the parent. Currently it only closes
the unnecessary ends.
-- Module Utils function: void module_child_dp_close (TModuleDoublePipe
dpipe)
Initializes pipes (dpipe) in the child. Currently it only closes
the unnecessary ends.
-- Module Utils function: void module_child_dp_write(TModuleDoublePipe
dpipe, const char *msg, size_t bytes)
Writes the specified number of 'bytes' from 'msg' to the pipe to
the parent. This function is intended, as the prefix says, to be
run from the child. Uses the pipes defined in 'dpipe'.
-- Module Utils function: void module_parent_dp_write(TModuleDoublePipe
dpipe, const char *msg, size_t bytes)
Writes the specified number of 'bytes' from 'msg' into the pipe to
the child. This function is intended, as the prefix says, to be
run from the parent. Uses the pipes defined in 'dpipe'.
-- Module Utils function: int module_child_dp_read(TModuleDoublePipe
dpipe char *msg, size_t maxlen)
Reads up to 'maxlen' bytes from the pipe from parent into the
buffer 'msg'. This function is intended, as the prefix says, to be
run from the child. Uses the pipes defined in 'dpipe'.
-- Module Utils function: int module_parent_dp_read(TModuleDoublePipe
dpipe, char *msg, size_t maxlen)
Reads up to 'maxlen' bytes from the pipe from child into the buffer
'msg'. This function is intended, as the prefix says, to be run
from the parent. Uses the pipes defined in 'dpipe'.
-- Module Utils function: void module_sigblockall(void)
Blocks all signals. This is intended to be run from the child
processes and threads so that their signal handling won't interfere
with the parent.
-- Module Utils function: void module_sigunblockusr(sigset_t
*some_signals)
Use the set 'some_signals' to unblock SIGUSR1.
-- Module Utils function: void module_sigblockusr(sigset_t
*some_signals)
Use the set 'some_signals' to block SIGUSR1.
File: speech-dispatcher.info, Node: Memory Handling Functions, Prev: Multi-process output modules, Up: Module Utils Functions and Macros
5.2.6.7 Memory Handling Functions
.................................
-- Module Utils function: static void* xmalloc (size_t size)
The same as the classical 'malloc()' except that it executes
'FATAL(``Not enough memory'')' on error.
-- Module Utils function: static void* xrealloc (void *data, size_t
size)
The same as the classical 'realloc()' except that it also accepts
'NULL' as 'data'. In this case, it behaves as 'xmalloc'.
-- Module Utils function: void xfree(void *data)
The same as the classical 'free()' except that it checks if data
isn't NULL before calling 'free()'.
File: speech-dispatcher.info, Node: Index Marks in Output Modules, Prev: Module Utils Functions and Macros, Up: Output Modules
5.2.7 Index Marks in Output Modules
-----------------------------------
Output modules need to provide some kind of synchronization and they
have to give Speech Dispatcher back some information about what part of
the message is currently being said. On the other hand, output modules
are not able to tell the exact position in the text because various
conversions and message processing take place (sometimes punctuation and
spelling substitution, the message needs to be recoded from multibyte to
unibyte coding etc.) before the text reaches the synthesizer.
For this reason, Speech Dispatcher places so-called index marks in
the text it sends to its output modules. They have the form:
'id' is the identifier associated with each index mark. Within a
'module_speak()' message, each identifer is unique. It consists of the
string '__spd_' and a counter number. Numbers begin from zero for each
message. For example, the fourth index mark within a message looks like
When an index mark is reached, its identifier should be stored so
that the output module is able to tell Speech Dispatcher the identifier
of the last index mark. Also, index marks are the best place to stop
when the module is requested to pause (although it's ok to stop at some
place close by and report the last index mark).
Notice that index marks are in SSML format using the 'mark' tag.
File: speech-dispatcher.info, Node: Download and Contact, Next: Reporting Bugs, Prev: Server Programming, Up: Top
6 Download
**********
You can download Speech Dispatcher's latest release source code from
. There is also information on how to
set up anonymous access to our git repository.
However, you may prefer to download Speech Dispatcher in a binary
package for your system. We don't distribute such packages ourselves.
If you run Debian GNU/Linux, it should be in the central repository
under the name 'speech-dispatcher' or 'speechd'. If you run an
rpm-based distribution like RedHat, Mandrake or SuSE Linux, please try
to look at .
If you want to contact us, please look at
or use the email
.
File: speech-dispatcher.info, Node: Reporting Bugs, Next: How You Can Help, Prev: Download and Contact, Up: Top
7 Reporting Bugs
****************
If you believe you found a bug in Speech Dispatcher, we will be very
grateful if you let us know about it. Please do it by email on the
address , but please don't send us messages
larger than half a megabyte unless we ask you.
To report a bug in a way that is useful for the developers is not as
easy as it may seem. Here are some hints that you should follow in
order to give us the best information so that we can find and fix the
bug easily.
First of all, please try to describe the problem as exactly as you
can. We prefer raw data over speculations about where the problem may
lie. Please try to explain in what situation the bug happens. Even if
it's a general bug that happens in many situations, please try to
describe at least one case in as much detail, as possible.
Also, please specify the versions of programs that you use when the
bug happens. This is not only Speech Dispatcher, but also the client
application you use (speechd-el, say, etc.) and the synthesizer name
and version.
If you can reproduce the bug, please send us the log file also. This
is very useful, because otherwise, we may not be able to reproduce the
bug with our configuration and program versions that differ from yours.
Configuration must be set to logging priority at least 4, but best 5, so
that it's useful for debugging purposes. You can do so in
'etc/speech-dispatcher/speechd.conf' by modifying the variable
'LogLevel'. Also, you may want to modify the log destination with
variable 'LogFile'. After modifying these options, please restart
Speech Dispatcher and repeat the situation in which the bug happens.
After it happened, please take the log and attach it to the bug report,
preferably compressed using 'gzip'. But note, that when logging with
level 5, all the data that come from Speech Dispatcher is also recorded,
so make sure there is no sensitive information when you are reproducing
the bug. Please make sure you switch back to priority 3 or lower
logging, because priority 4 or 5 produces really huge logs.
If you are a programmer and you find a bug that is reproducible in
SSIP, you can send us the sequence of SSIP commands that lead to the bug
(preferably from starting the connection). You can also try to
reproduce the bug in a simple test-script under
'speech-dispatcher/src/tests' in the source tree. Please check
'speech-dispatcher/src/tests/README' and see the other tests scripts
there for an example.
When the bug is a SEGMENTATION FAULT, a backtrace from gdb is also
valuable, but if you are not familiar with gdb, don't bother with that,
we may ask you to do it later.
Finally, you may also send us a guess of what you think happens in
Speech Dispatcher that causes the bug, but this is usually not very
helpful. If you are able to provide additional technical information
instead, please do so.
File: speech-dispatcher.info, Node: How You Can Help, Next: Appendices, Prev: Reporting Bugs, Up: Top
8 How You Can Help
******************
If you want to contribute to the development of Speech Dispatcher, we
will be very happy if you do so. Please contact us on
.
Here is a short, definitively not exhaustive, list of how you can
help us and other users.
* _Donate money:_ We are a non-profit organization and we can't work
without funding. Brailcom, o.p.s. created Speech Dispatcher,
speechd-el and also works on other projects to help blind and
visually impaired users of computers. We build on Free Software
and GNU/Linux, because we believe this is the right way. But it
won't be possible when we have no money.
* _Report bugs:_ Every user, even if he can't give us money and he is
not a programmer, can help us very much by just using our software
and telling us about the bugs and inconveniences he encounters. A
good user community that reports bugs is a crucial part of
development of a good Free Software package. We can't test our
software under all circumstances and on all platforms, so each
constructive bug report is highly appreciated. You can report bugs
in Speech Dispatcher on .
* _Write or modify an application to support synthesis:_ With Speech
Dispatcher, we have provided an interface that allows applications
easy access to speech synthesis. However powerful, it's no more
than an interface, and it's useless on its own. Now it's time to
write the particular client applications, or modify existing
applications so that they can support speech synthesis. It is
useful if the application needs a specific interface for blind
people or if it wants to use speech synthesis for educational or
other purposes.
* _Develop new voices and language definitions for Festival:_ In the
world of Free Software, currently Festival is the most promising
interface for Text-to-Speech processing and speech synthesis. It's
an extensible and highly configurable platform for developing
synthetic voices. If there is a lack of synthetic voices or no
voices at all for some language, we believe the wisest solution is
to try to develop a voice in Festival. It's certainly not
advisable to develop your own synthesizer if the goal is producing
a quality voice system in a reasonable time. Festival developers
provide nice documentation about how to develop a voice and a lot
of tools that help doing this. We found that some language
definitions can be constructed by canibalizing the already existing
definitions and can be tuned later. As for the voice samples, one
can temporarily use the MBROLA project voices. But please note
that, although they are downloadable for free (as price), they are
not Free Software and it would be wonderful if we could replace
them by Free Software alternatives as soon as possible. See
.
* _Help us with this or other Free-b-Soft projects:_ Please look at
to find information about our projects.
There is a plenty of work to be done for the blind and visually
impaired people to make their work with computers easier.
* _Spread the word about Speech Dispatcher and Free Software:_ You
can help us, and the whole community around Free Software, just by
telling your friends about the amazing world of Free Software. It
doesn't have to be just about Speech Dispatcher; you can tell them
about other projects or about Free Software in general. Remember
that Speech Dispatcher could only arise out of understanding of
some people of the principles and ideas behind Free Software. And
this is mostly the same for the rest of the Free Software world.
See for more information about GNU/Linux and
Free Software.
File: speech-dispatcher.info, Node: Appendices, Next: GNU General Public License, Prev: How You Can Help, Up: Top
Appendix A Appendices
*********************
File: speech-dispatcher.info, Node: GNU General Public License, Next: GNU Free Documentation License, Prev: Appendices, Up: Top
Appendix B GNU General Public License
*************************************
Version 2, June 1991
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
========
The licenses for most software are designed to take away your freedom to
share and change it. By contrast, the GNU General Public License is
intended to guarantee your freedom to share and change free software--to
make sure the software is free for all its users. This General Public
License applies to most of the Free Software Foundation's software and
to any other program whose authors commit to using it. (Some other Free
Software Foundation software is covered by the GNU Lesser General Public
License instead.) You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it if
you want it, that you can change the software or use pieces of it in new
free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software,
and (2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
===============================================================
0. This License applies to any program or other work which contains a
notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program",
below, refers to any such program or work, and a "work based on the
Program" means either the Program or any derivative work under
copyright law: that is to say, a work containing the Program or a
portion of it, either verbatim or with modifications and/or
translated into another language. (Hereinafter, translation is
included without limitation in the term "modification".) Each
licensee is addressed as "you".
Activities other than copying, distribution and modification are
not covered by this License; they are outside its scope. The act
of running the Program is not restricted, and the output from the
Program is covered only if its contents constitute a work based on
the Program (independent of having been made by running the
Program). Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's source
code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any
warranty; and give any other recipients of the Program a copy of
this License along with the Program.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange
for a fee.
2. You may modify your copy or copies of the Program or any portion of
it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a. You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b. You must cause any work that you distribute or publish, that
in whole or in part contains or is derived from the Program or
any part thereof, to be licensed as a whole at no charge to
all third parties under the terms of this License.
c. If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display
an announcement including an appropriate copyright notice and
a notice that there is no warranty (or else, saying that you
provide a warranty) and that users may redistribute the
program under these conditions, and telling the user how to
view a copy of this License. (Exception: if the Program
itself is interactive but does not normally print such an
announcement, your work based on the Program is not required
to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the
Program, and can be reasonably considered independent and separate
works in themselves, then this License, and its terms, do not apply
to those sections when you distribute them as separate works. But
when you distribute the same sections as part of a whole which is a
work based on the Program, the distribution of the whole must be on
the terms of this License, whose permissions for other licensees
extend to the entire whole, and thus to each and every part
regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or
contest your rights to work written entirely by you; rather, the
intent is to exercise the right to control the distribution of
derivative or collective works based on the Program.
In addition, mere aggregation of another work not based on the
Program with the Program (or with a work based on the Program) on a
volume of a storage or distribution medium does not bring the other
work under the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms
of Sections 1 and 2 above provided that you also do one of the
following:
a. Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of
Sections 1 and 2 above on a medium customarily used for
software interchange; or,
b. Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange; or,
c. Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with
such an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete
source code means all the source code for all modules it contains,
plus any associated interface definition files, plus the scripts
used to control compilation and installation of the executable.
However, as a special exception, the source code distributed need
not include anything that is normally distributed (in either source
or binary form) with the major components (compiler, kernel, and so
on) of the operating system on which the executable runs, unless
that component itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this
License. However, parties who have received copies, or rights,
from you under this License will not have their licenses terminated
so long as such parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify
or distribute the Program or its derivative works. These actions
are prohibited by law if you do not accept this License.
Therefore, by modifying or distributing the Program (or any work
based on the Program), you indicate your acceptance of this License
to do so, and all its terms and conditions for copying,
distributing or modifying the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject
to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted
herein. You are not responsible for enforcing compliance by third
parties to this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent
issues), conditions are imposed on you (whether by court order,
agreement or otherwise) that contradict the conditions of this
License, they do not excuse you from the conditions of this
License. If you cannot distribute so as to satisfy simultaneously
your obligations under this License and any other pertinent
obligations, then as a consequence you may not distribute the
Program at all. For example, if a patent license would not permit
royalty-free redistribution of the Program by all those who receive
copies directly or indirectly through you, then the only way you
could satisfy both it and this License would be to refrain entirely
from distribution of the Program.
If any portion of this section is held invalid or unenforceable
under any particular circumstance, the balance of the section is
intended to apply and the section as a whole is intended to apply
in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of
any such claims; this section has the sole purpose of protecting
the integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is
willing to distribute software through any other system and a
licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed
to be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces,
the original copyright holder who places the Program under this
License may add an explicit geographical distribution limitation
excluding those countries, so that distribution is permitted only
in or among countries not thus excluded. In such case, this
License incorporates the limitation as if written in the body of
this License.
9. The Free Software Foundation may publish revised and/or new
versions of the General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies a version number of this License which applies to
it and "any later version", you have the option of following the
terms and conditions either of that version or of any later version
published by the Free Software Foundation. If the Program does not
specify a version number of this License, you may choose any
version ever published by the Free Software Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the
author to ask for permission. For software which is copyrighted by
the Free Software Foundation, write to the Free Software
Foundation; we sometimes make exceptions for this. Our decision
will be guided by the two goals of preserving the free status of
all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS
AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR
OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY
OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
=======================================================
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES.
Copyright (C) YYYY NAME OF AUTHOR
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
Also add information on how to contact you by electronic and paper
mail.
If the program is interactive, make it output a short notice like
this when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) YEAR NAME OF AUTHOR
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands 'show w' and 'show c' should show the
appropriate parts of the General Public License. Of course, the
commands you use may be called something other than 'show w' and 'show
c'; they could even be mouse-clicks or menu items--whatever suits your
program.
You should also get your employer (if you work as a programmer) or
your school, if any, to sign a "copyright disclaimer" for the program,
if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
SIGNATURE OF TY COON, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your
program into proprietary programs. If your program is a subroutine
library, you may consider it more useful to permit linking proprietary
applications with the library. If this is what you want to do, use the
GNU Lesser General Public License instead of this License.
File: speech-dispatcher.info, Node: GNU Free Documentation License, Next: Index of Concepts, Prev: GNU General Public License, Up: Top
Appendix C GNU Free Documentation License
*****************************************
Version 1.2, November 2002
Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
0. PREAMBLE
The purpose of this License is to make a manual, textbook, or other
functional and useful document "free" in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or
noncommercially. Secondarily, this License preserves for the
author and publisher a way to get credit for their work, while not
being considered responsible for modifications made by others.
This License is a kind of "copyleft", which means that derivative
works of the document must themselves be free in the same sense.
It complements the GNU General Public License, which is a copyleft
license designed for free software.
We have designed this License in order to use it for manuals for
free software, because free software needs free documentation: a
free program should come with manuals providing the same freedoms
that the software does. But this License is not limited to
software manuals; it can be used for any textual work, regardless
of subject matter or whether it is published as a printed book. We
recommend this License principally for works whose purpose is
instruction or reference.
1. APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work, in any medium,
that contains a notice placed by the copyright holder saying it can
be distributed under the terms of this License. Such a notice
grants a world-wide, royalty-free license, unlimited in duration,
to use that work under the conditions stated herein. The
"Document", below, refers to any such manual or work. Any member
of the public is a licensee, and is addressed as "you". You accept
the license if you copy, modify or distribute the work in a way
requiring permission under copyright law.
A "Modified Version" of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.
A "Secondary Section" is a named appendix or a front-matter section
of the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall
subject (or to related matters) and contains nothing that could
fall directly within that overall subject. (Thus, if the Document
is in part a textbook of mathematics, a Secondary Section may not
explain any mathematics.) The relationship could be a matter of
historical connection with the subject or with related matters, or
of legal, commercial, philosophical, ethical or political position
regarding them.
The "Invariant Sections" are certain Secondary Sections whose
titles are designated, as being those of Invariant Sections, in the
notice that says that the Document is released under this License.
If a section does not fit the above definition of Secondary then it
is not allowed to be designated as Invariant. The Document may
contain zero Invariant Sections. If the Document does not identify
any Invariant Sections then there are none.
The "Cover Texts" are certain short passages of text that are
listed, as Front-Cover Texts or Back-Cover Texts, in the notice
that says that the Document is released under this License. A
Front-Cover Text may be at most 5 words, and a Back-Cover Text may
be at most 25 words.
A "Transparent" copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed
of pixels) generic paint programs or (for drawings) some widely
available drawing editor, and that is suitable for input to text
formatters or for automatic translation to a variety of formats
suitable for input to text formatters. A copy made in an otherwise
Transparent file format whose markup, or absence of markup, has
been arranged to thwart or discourage subsequent modification by
readers is not Transparent. An image format is not Transparent if
used for any substantial amount of text. A copy that is not
"Transparent" is called "Opaque".
Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format,
SGML or XML using a publicly available DTD, and standard-conforming
simple HTML, PostScript or PDF designed for human modification.
Examples of transparent image formats include PNG, XCF and JPG.
Opaque formats include proprietary formats that can be read and
edited only by proprietary word processors, SGML or XML for which
the DTD and/or processing tools are not generally available, and
the machine-generated HTML, PostScript or PDF produced by some word
processors for output purposes only.
The "Title Page" means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the
material this License requires to appear in the title page. For
works in formats which do not have any title page as such, "Title
Page" means the text near the most prominent appearance of the
work's title, preceding the beginning of the body of the text.
A section "Entitled XYZ" means a named subunit of the Document
whose title either is precisely XYZ or contains XYZ in parentheses
following text that translates XYZ in another language. (Here XYZ
stands for a specific section name mentioned below, such as
"Acknowledgements", "Dedications", "Endorsements", or "History".)
To "Preserve the Title" of such a section when you modify the
Document means that it remains a section "Entitled XYZ" according
to this definition.
The Document may include Warranty Disclaimers next to the notice
which states that this License applies to the Document. These
Warranty Disclaimers are considered to be included by reference in
this License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and
has no effect on the meaning of this License.
2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License
applies to the Document are reproduced in all copies, and that you
add no other conditions whatsoever to those of this License. You
may not use technical measures to obstruct or control the reading
or further copying of the copies you make or distribute. However,
you may accept compensation in exchange for copies. If you
distribute a large enough number of copies you must also follow the
conditions in section 3.
You may also lend copies, under the same conditions stated above,
and you may publicly display copies.
3. COPYING IN QUANTITY
If you publish printed copies (or copies in media that commonly
have printed covers) of the Document, numbering more than 100, and
the Document's license notice requires Cover Texts, you must
enclose the copies in covers that carry, clearly and legibly, all
these Cover Texts: Front-Cover Texts on the front cover, and
Back-Cover Texts on the back cover. Both covers must also clearly
and legibly identify you as the publisher of these copies. The
front cover must present the full title with all words of the title
equally prominent and visible. You may add other material on the
covers in addition. Copying with changes limited to the covers, as
long as they preserve the title of the Document and satisfy these
conditions, can be treated as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto
adjacent pages.
If you publish or distribute Opaque copies of the Document
numbering more than 100, you must either include a machine-readable
Transparent copy along with each Opaque copy, or state in or with
each Opaque copy a computer-network location from which the general
network-using public has access to download using public-standard
network protocols a complete Transparent copy of the Document, free
of added material. If you use the latter option, you must take
reasonably prudent steps, when you begin distribution of Opaque
copies in quantity, to ensure that this Transparent copy will
remain thus accessible at the stated location until at least one
year after the last time you distribute an Opaque copy (directly or
through your agents or retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of
the Document well before redistributing any large number of copies,
to give them a chance to provide you with an updated version of the
Document.
4. MODIFICATIONS
You may copy and distribute a Modified Version of the Document
under the conditions of sections 2 and 3 above, provided that you
release the Modified Version under precisely this License, with the
Modified Version filling the role of the Document, thus licensing
distribution and modification of the Modified Version to whoever
possesses a copy of it. In addition, you must do these things in
the Modified Version:
A. Use in the Title Page (and on the covers, if any) a title
distinct from that of the Document, and from those of previous
versions (which should, if there were any, be listed in the
History section of the Document). You may use the same title
as a previous version if the original publisher of that
version gives permission.
B. List on the Title Page, as authors, one or more persons or
entities responsible for authorship of the modifications in
the Modified Version, together with at least five of the
principal authors of the Document (all of its principal
authors, if it has fewer than five), unless they release you
from this requirement.
C. State on the Title page the name of the publisher of the
Modified Version, as the publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.
F. Include, immediately after the copyright notices, a license
notice giving the public permission to use the Modified
Version under the terms of this License, in the form shown in
the Addendum below.
G. Preserve in that license notice the full lists of Invariant
Sections and required Cover Texts given in the Document's
license notice.
H. Include an unaltered copy of this License.
I. Preserve the section Entitled "History", Preserve its Title,
and add to it an item stating at least the title, year, new
authors, and publisher of the Modified Version as given on the
Title Page. If there is no section Entitled "History" in the
Document, create one stating the title, year, authors, and
publisher of the Document as given on its Title Page, then add
an item describing the Modified Version as stated in the
previous sentence.
J. Preserve the network location, if any, given in the Document
for public access to a Transparent copy of the Document, and
likewise the network locations given in the Document for
previous versions it was based on. These may be placed in the
"History" section. You may omit a network location for a work
that was published at least four years before the Document
itself, or if the original publisher of the version it refers
to gives permission.
K. For any section Entitled "Acknowledgements" or "Dedications",
Preserve the Title of the section, and preserve in the section
all the substance and tone of each of the contributor
acknowledgements and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document, unaltered
in their text and in their titles. Section numbers or the
equivalent are not considered part of the section titles.
M. Delete any section Entitled "Endorsements". Such a section
may not be included in the Modified Version.
N. Do not retitle any existing section to be Entitled
"Endorsements" or to conflict in title with any Invariant
Section.
O. Preserve any Warranty Disclaimers.
If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no
material copied from the Document, you may at your option designate
some or all of these sections as invariant. To do this, add their
titles to the list of Invariant Sections in the Modified Version's
license notice. These titles must be distinct from any other
section titles.
You may add a section Entitled "Endorsements", provided it contains
nothing but endorsements of your Modified Version by various
parties--for example, statements of peer review or that the text
has been approved by an organization as the authoritative
definition of a standard.
You may add a passage of up to five words as a Front-Cover Text,
and a passage of up to 25 words as a Back-Cover Text, to the end of
the list of Cover Texts in the Modified Version. Only one passage
of Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity. If the Document
already includes a cover text for the same cover, previously added
by you or by arrangement made by the same entity you are acting on
behalf of, you may not add another; but you may replace the old
one, on explicit permission from the previous publisher that added
the old one.
The author(s) and publisher(s) of the Document do not by this
License give permission to use their names for publicity for or to
assert or imply endorsement of any Modified Version.
5. COMBINING DOCUMENTS
You may combine the Document with other documents released under
this License, under the terms defined in section 4 above for
modified versions, provided that you include in the combination all
of the Invariant Sections of all of the original documents,
unmodified, and list them all as Invariant Sections of your
combined work in its license notice, and that you preserve all
their Warranty Disclaimers.
The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy. If there are multiple Invariant Sections with the same name
but different contents, make the title of each such section unique
by adding at the end of it, in parentheses, the name of the
original author or publisher of that section if known, or else a
unique number. Make the same adjustment to the section titles in
the list of Invariant Sections in the license notice of the
combined work.
In the combination, you must combine any sections Entitled
"History" in the various original documents, forming one section
Entitled "History"; likewise combine any sections Entitled
"Acknowledgements", and any sections Entitled "Dedications". You
must delete all sections Entitled "Endorsements."
6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other
documents released under this License, and replace the individual
copies of this License in the various documents with a single copy
that is included in the collection, provided that you follow the
rules of this License for verbatim copying of each of the documents
in all other respects.
You may extract a single document from such a collection, and
distribute it individually under this License, provided you insert
a copy of this License into the extracted document, and follow this
License in all other respects regarding verbatim copying of that
document.
7. AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other
separate and independent documents or works, in or on a volume of a
storage or distribution medium, is called an "aggregate" if the
copyright resulting from the compilation is not used to limit the
legal rights of the compilation's users beyond what the individual
works permit. When the Document is included in an aggregate, this
License does not apply to the other works in the aggregate which
are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half
of the entire aggregate, the Document's Cover Texts may be placed
on covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic
form. Otherwise they must appear on printed covers that bracket
the whole aggregate.
8. TRANSLATION
Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section
4. Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also
include the original English version of this License and the
original versions of those notices and disclaimers. In case of a
disagreement between the translation and the original version of
this License or a notice or disclaimer, the original version will
prevail.
If a section in the Document is Entitled "Acknowledgements",
"Dedications", or "History", the requirement (section 4) to
Preserve its Title (section 1) will typically require changing the
actual title.
9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document
except as expressly provided for under this License. Any other
attempt to copy, modify, sublicense or distribute the Document is
void, and will automatically terminate your rights under this
License. However, parties who have received copies, or rights,
from you under this License will not have their licenses terminated
so long as such parties remain in full compliance.
10. FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions of
the GNU Free Documentation License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns. See
.
Each version of the License is given a distinguishing version
number. If the Document specifies that a particular numbered
version of this License "or any later version" applies to it, you
have the option of following the terms and conditions either of
that specified version or of any later version that has been
published (not as a draft) by the Free Software Foundation. If the
Document does not specify a version number of this License, you may
choose any version ever published (not as a draft) by the Free
Software Foundation.
C.1 ADDENDUM: How to use this License for your documents
========================================================
To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and license
notices just after the title page:
Copyright (C) YEAR YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the section entitled ``GNU
Free Documentation License''.
If you have Invariant Sections, Front-Cover Texts and Back-Cover
Texts, replace the "with...Texts." line with this:
with the Invariant Sections being LIST THEIR TITLES, with
the Front-Cover Texts being LIST, and with the Back-Cover Texts
being LIST.
If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.
If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of free
software license, such as the GNU General Public License, to permit
their use in free software.
File: speech-dispatcher.info, Node: Index of Concepts, Prev: GNU Free Documentation License, Up: Top
Index of Concepts
*****************
[index ]
* Menu:
* AddVoice: Configuration of the Generic Output Module.
(line 49)
* Basic ideas, Motivation: Motivation. (line 6)
* C API type: Speech Synthesis Commands in C.
(line 6)
* C API type <1>: Event Notification and Index Marking in C.
(line 11)
* C API type <2>: Event Notification and Index Marking in C.
(line 27)
* C API type <3>: Event Notification and Index Marking in C.
(line 49)
* char*: Parameter Setting Commands in C.
(line 51)
* char* <1>: Direct SSIP Communication in C.
(line 38)
* char* <2>: Functions used by module_main.c.
(line 6)
* char* <3>: Functions used by module_main.c.
(line 12)
* char* <4>: Functions used by module_main.c.
(line 17)
* char* <5>: Functions used by module_main.c.
(line 24)
* char* <6>: Functions used by module_main.c.
(line 33)
* char**: Information Retrieval Commands in C.
(line 6)
* char** <1>: Information Retrieval Commands in C.
(line 16)
* char** <2>: Information Retrieval Commands in C.
(line 34)
* configuration: Configuration. (line 6)
* DBG: Initialization Macros and Functions.
(line 18)
* DBG <1>: Initialization Macros and Functions.
(line 19)
* default values: Configuration. (line 6)
* Design: Basic Design. (line 6)
* different synthesizers: Synthesis Output Modules.
(line 6)
* do_pause: Functions used by module_main.c.
(line 18)
* do_quit: Functions used by module_main.c.
(line 40)
* do_set: Functions used by module_main.c.
(line 25)
* do_speak: Functions used by module_main.c.
(line 7)
* do_speaking: Functions used by module_main.c.
(line 34)
* do_stop: Functions used by module_main.c.
(line 13)
* FATAL: Initialization Macros and Functions.
(line 24)
* FATAL <1>: Initialization Macros and Functions.
(line 25)
* FDL, GNU Free Documentation License: GNU Free Documentation License.
(line 7)
* GenericExecuteSynth: Configuration of the Generic Output Module.
(line 14)
* GenericLanguage: Configuration of the Generic Output Module.
(line 53)
* GenericPitchAdd: Configuration of the Generic Output Module.
(line 66)
* GenericPitchMultiply: Configuration of the Generic Output Module.
(line 67)
* GenericPitchRangeAdd: Configuration of the Generic Output Module.
(line 68)
* GenericPitchRangeMultiply: Configuration of the Generic Output Module.
(line 69)
* GenericRateAdd: Configuration of the Generic Output Module.
(line 64)
* GenericRateMultiply: Configuration of the Generic Output Module.
(line 65)
* GPL, GNU General Public License: GNU General Public License.
(line 7)
* INIT_SETTINGS_TABLES: Initialization Macros and Functions.
(line 6)
* INIT_SETTINGS_TABLES <1>: Initialization Macros and Functions.
(line 7)
* int: Speech Synthesis Commands in C.
(line 21)
* int <1>: Speech Synthesis Commands in C.
(line 47)
* int <2>: Speech output control commands in C.
(line 9)
* int <3>: Speech output control commands in C.
(line 23)
* int <4>: Speech output control commands in C.
(line 30)
* int <5>: Speech output control commands in C.
(line 46)
* int <6>: Speech output control commands in C.
(line 53)
* int <7>: Speech output control commands in C.
(line 60)
* int <8>: Speech output control commands in C.
(line 76)
* int <9>: Speech output control commands in C.
(line 96)
* int <10>: Speech output control commands in C.
(line 103)
* int <11>: Speech output control commands in C.
(line 119)
* int <12>: Speech output control commands in C.
(line 131)
* int <13>: Speech output control commands in C.
(line 138)
* int <14>: Characters and Keys in C.
(line 6)
* int <15>: Characters and Keys in C.
(line 24)
* int <16>: Characters and Keys in C.
(line 32)
* int <17>: Sound Icons in C. (line 6)
* int <18>: Parameter Setting Commands in C.
(line 14)
* int <19>: Parameter Setting Commands in C.
(line 24)
* int <20>: Parameter Setting Commands in C.
(line 35)
* int <21>: Parameter Setting Commands in C.
(line 63)
* int <22>: Parameter Setting Commands in C.
(line 80)
* int <23>: Parameter Setting Commands in C.
(line 94)
* int <24>: Parameter Setting Commands in C.
(line 106)
* int <25>: Parameter Setting Commands in C.
(line 120)
* int <26>: Parameter Setting Commands in C.
(line 131)
* int <27>: Parameter Setting Commands in C.
(line 140)
* int <28>: Parameter Setting Commands in C.
(line 151)
* int <29>: Parameter Setting Commands in C.
(line 160)
* int <30>: Parameter Setting Commands in C.
(line 171)
* int <31>: Parameter Setting Commands in C.
(line 183)
* int <32>: Event Notification and Index Marking in C.
(line 80)
* int <33>: Event Notification and Index Marking in C.
(line 82)
* int <34>: Event Notification and Index Marking in C.
(line 84)
* int <35>: Direct SSIP Communication in C.
(line 14)
* int <36>: Output Module Functions.
(line 6)
* int <37>: Functions for use when talking to synthesizer.
(line 47)
* int <38>: Multi-process output modules.
(line 53)
* int <39>: Multi-process output modules.
(line 86)
* int <40>: Multi-process output modules.
(line 92)
* int module_stop: Output Module Functions.
(line 58)
* int spd_pause(): Speech output control commands in C.
(line 77)
* int spd_resume(): Speech output control commands in C.
(line 120)
* module_child_dp_init: Multi-process output modules.
(line 71)
* module_child_dp_read: Multi-process output modules.
(line 88)
* module_child_dp_write: Multi-process output modules.
(line 76)
* module_close: Functions for use when talking to synthesizer.
(line 48)
* module_get_message_part: Functions for use when talking to synthesizer.
(line 9)
* module_parent_dp_init: Multi-process output modules.
(line 66)
* module_parent_dp_read: Multi-process output modules.
(line 94)
* module_parent_dp_write: Multi-process output modules.
(line 82)
* module_parent_wait_continue: Multi-process output modules.
(line 55)
* module_parent_wfork: Multi-process output modules.
(line 9)
* module_pause(): Output Module Functions.
(line 72)
* module_report_event_*: Functions for use when talking to synthesizer.
(line 37)
* module_report_index_mark: Functions for use when talking to synthesizer.
(line 36)
* module_sigblockall: Multi-process output modules.
(line 99)
* module_sigblockusr: Multi-process output modules.
(line 109)
* module_sigunblockusr: Multi-process output modules.
(line 105)
* module_speak(): Output Module Functions.
(line 8)
* module_stop(): Output Module Functions.
(line 59)
* Other programs: Current State. (line 6)
* output module: Synthesis Output Modules.
(line 6)
* Philosophy: Motivation. (line 6)
* size_t: Multi-process output modules.
(line 6)
* size_t module_pause: Output Module Functions.
(line 71)
* SPDCallback: Event Notification and Index Marking in C.
(line 28)
* SPDCallbackIM: Event Notification and Index Marking in C.
(line 50)
* SPDConnection*: Initializing and Terminating in C.
(line 6)
* SPDConnection* <1>: Initializing and Terminating in C.
(line 62)
* SPDNotification: Event Notification and Index Marking in C.
(line 12)
* SPDPriority: Speech Synthesis Commands in C.
(line 7)
* spd_cancel_all(): Speech output control commands in C.
(line 54)
* spd_cancel_uid(): Speech output control commands in C.
(line 62)
* spd_char(): Characters and Keys in C.
(line 8)
* spd_close(): Initializing and Terminating in C.
(line 83)
* spd_execute_command(): Direct SSIP Communication in C.
(line 16)
* spd_get_client_list(): History Commands in C.
(line 6)
* spd_get_message_list_fd(): History Commands in C.
(line 5)
* spd_get_output_module(): Parameter Setting Commands in C.
(line 53)
* spd_get_voice_pitch(): Parameter Setting Commands in C.
(line 152)
* spd_get_voice_rate(): Parameter Setting Commands in C.
(line 132)
* spd_get_volume(): Parameter Setting Commands in C.
(line 184)
* spd_history_select_client(): History Commands in C.
(line 6)
* spd_key(): Characters and Keys in C.
(line 34)
* spd_list_modules(): Information Retrieval Commands in C.
(line 7)
* spd_list_synthesis_voices(): Information Retrieval Commands in C.
(line 36)
* spd_list_voices(): Information Retrieval Commands in C.
(line 17)
* spd_open(): Initializing and Terminating in C.
(line 9)
* spd_open2(): Initializing and Terminating in C.
(line 65)
* spd_pause_all(): Speech output control commands in C.
(line 97)
* spd_pause_uid(): Speech output control commands in C.
(line 105)
* spd_resume_all(): Speech output control commands in C.
(line 132)
* spd_resume_uid(): Speech output control commands in C.
(line 140)
* spd_say(): Speech Synthesis Commands in C.
(line 23)
* spd_sayf(): Speech Synthesis Commands in C.
(line 49)
* spd_say_wchar(): Characters and Keys in C.
(line 26)
* spd_send_data(): Direct SSIP Communication in C.
(line 40)
* spd_set_data_mode(): Parameter Setting Commands in C.
(line 16)
* spd_set_language(): Parameter Setting Commands in C.
(line 26)
* spd_set_notification: Event Notification and Index Marking in C.
(line 86)
* spd_set_notification_off: Event Notification and Index Marking in C.
(line 84)
* spd_set_notification_on: Event Notification and Index Marking in C.
(line 82)
* spd_set_output_module(): Parameter Setting Commands in C.
(line 37)
* spd_set_punctuation(): Parameter Setting Commands in C.
(line 65)
* spd_set_spelling(): Parameter Setting Commands in C.
(line 82)
* spd_set_voice_pitch(): Parameter Setting Commands in C.
(line 142)
* spd_set_voice_pitch() <1>: Parameter Setting Commands in C.
(line 162)
* spd_set_voice_rate(): Parameter Setting Commands in C.
(line 122)
* spd_set_voice_type(): Parameter Setting Commands in C.
(line 96)
* spd_set_voice_type() <1>: Parameter Setting Commands in C.
(line 108)
* spd_set_volume(): Parameter Setting Commands in C.
(line 173)
* spd_sound_icon(): Sound Icons in C. (line 8)
* spd_stop(): Speech output control commands in C.
(line 10)
* spd_stop_all(): Speech output control commands in C.
(line 24)
* spd_stop_uid(): Speech output control commands in C.
(line 32)
* static: Functions for use when talking to synthesizer.
(line 6)
* static <1>: Memory Handling Functions.
(line 6)
* static <2>: Memory Handling Functions.
(line 10)
* Synthesizers: Current State. (line 6)
* tail recursion: Index of Concepts. (line 6)
* UPDATE_PARAMETER: Generic Macros and Functions.
(line 6)
* UPDATE_PARAMETER <1>: Generic Macros and Functions.
(line 7)
* UPDATE_STRING_PARAMETER: Generic Macros and Functions.
(line 40)
* UPDATE_STRING_PARAMETER <1>: Generic Macros and Functions.
(line 41)
* void: Initializing and Terminating in C.
(line 82)
* void <1>: Functions used by module_main.c.
(line 39)
* void <2>: Functions for use when talking to synthesizer.
(line 35)
* void <3>: Functions for use when talking to synthesizer.
(line 36)
* void <4>: Multi-process output modules.
(line 64)
* void <5>: Multi-process output modules.
(line 69)
* void <6>: Multi-process output modules.
(line 74)
* void <7>: Multi-process output modules.
(line 80)
* void <8>: Multi-process output modules.
(line 98)
* void <9>: Multi-process output modules.
(line 103)
* void <10>: Multi-process output modules.
(line 107)
* void <11>: Memory Handling Functions.
(line 15)
* xfree: Memory Handling Functions.
(line 16)
* xmalloc: Memory Handling Functions.
(line 7)
* xrealloc: Memory Handling Functions.
(line 12)
Tag Table:
Node: Top255
Node: Introduction1983
Node: Motivation2332
Node: Basic Design4198
Node: Features Overview8953
Node: Current State9627
Node: User's Documentation11465
Node: Installation12134
Node: Running16802
Node: Running Under Ordinary Users17457
Node: Running in a Custom Setup18329
Node: Setting Communication Method18995
Node: Troubleshooting21122
Node: Configuration23234
Node: Configuration file syntax24428
Node: Configuration options25467
Node: Audio Output Configuration25918
Node: Client Specific Configuration27093
Node: Output Modules Configuration28687
Node: Loading Modules in speechd.conf29635
Ref: AddModule29906
Node: Configuration files of output modules30710
Ref: AddVoice31333
Node: Configuration of the Generic Output Module34173
Node: Log Levels38044
Node: Tools39262
Node: spd-say39896
Node: spd-conf40081
Node: spd-send41053
Node: Synthesis Output Modules41468
Node: Provided Functionality42318
Node: Supported Modules43090
Node: Security45234
Node: Technical Specifications46229
Node: Communication mechanisms46534
Node: Address specification48969
Node: Actions performed on startup50617
Node: Accepted signals53457
Node: Client Programming53916
Node: C API54963
Node: Initializing and Terminating in C55482
Node: Speech Synthesis Commands in C60040
Node: Speech output control commands in C63057
Node: Characters and Keys in C68531
Node: Sound Icons in C70234
Node: Parameter Setting Commands in C71167
Ref: spd_set_output_module72519
Ref: spd_get_output_module73161
Ref: spd_set_voice_type74682
Ref: spd_set_synthesis_voice75083
Node: Other Functions in C77614
Node: Information Retrieval Commands in C77816
Ref: spd_list_modules78129
Ref: spd_list_voices78533
Ref: spd_list_synthesis_voices79303
Node: Event Notification and Index Marking in C80241
Ref: SPDNotification80779
Ref: SPDCallback81245
Node: History Commands in C86388
Node: Direct SSIP Communication in C86600
Node: Python API89690
Node: Guile API92771
Node: Common Lisp API93075
Node: Autospawning93393
Node: Server Programming94931
Node: Server Core95261
Node: Output Modules98284
Node: Basic Structure98764
Node: Communication Protocol for Output Modules100076
Ref: Events notification and index marking108264
Node: How to Write New Output Module111450
Node: The Skeleton of an Output Module113381
Node: Output Module Functions120039
Node: Module Utils Functions and Macros125364
Node: Initialization Macros and Functions126122
Node: Generic Macros and Functions127529
Node: Functions used by module_main.c129134
Node: Functions for use when talking to synthesizer130915
Node: Multi-process output modules133517
Node: Memory Handling Functions138299
Node: Index Marks in Output Modules139068
Node: Download and Contact140642
Node: Reporting Bugs141485
Node: How You Can Help144528
Node: Appendices148660
Node: GNU General Public License148826
Node: GNU Free Documentation License168111
Node: Index of Concepts190571
End Tag Table
speech-dispatcher-0.9.1/doc/ssip.info 0000644 0001750 0001750 00000325265 13465234513 014460 0000000 0000000 This is ssip.info, produced by makeinfo version 6.5 from ssip.texi.
INFO-DIR-SECTION Sound
INFO-DIR-SECTION Development
START-INFO-DIR-ENTRY
* SSIP: (ssip). Speech Synthesis Interface Protocol.
END-INFO-DIR-ENTRY
File: ssip.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir)
This manual documents Speech Synthesis Interface Protocol, version 0.2.
Copyright (C) 2001, 2002, 2003 Brailcom, o.p.s.,
http://www.brailcom.cz .
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License,
Version 1.2 or any later version published by the Free Software
Foundation; with no Invariant Sections, with no Front-Cover Texts
and no Back-Cover Texts. A copy of the license is included in the
section entitled "GNU Free Documentation License."
You can also (at your option) distribute this manual under the GNU
General Public License:
Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
A copy of the license is included in the section entitled "GNU
General Public License"
Please contact us on
* Menu:
* Introduction::
* Basic Terminology::
* General Rules::
* SSIP Commands::
* Return Codes::
* Appendices::
* GNU Free Documentation License::
* GNU General Public Licence::
File: ssip.info, Node: Introduction, Next: Basic Terminology, Prev: Top, Up: Top
1 Introduction
**************
* Menu:
* Purpose::
* Protocol Philosophy::
* Higher Level API::
File: ssip.info, Node: Purpose, Next: Protocol Philosophy, Prev: Introduction, Up: Introduction
1.1 Purpose
===========
Speech Synthesis Interface Protocol is a device independent layer for
speech synthesis, developed with the goal of making the usage of speech
synthesis easier for application programmers. It takes care of most of
the output-related tasks necessary to solve in speech enabled
applications. What is a very high level GUI library to graphics, Speech
Synthesis Interface Protocol is to speech synthesis.
Up to now, the applications that wanted to implement speech output
had to handle all the device dependent aspects of communication with
different speech synthesizers themselves. Speech Synthesis Interface
Protocol (SSIP) aims to provide a totally independent abstract set of
commands by which different applications can talk to some central Speech
Server installed on the system that than talks to the synthesizers
themselves. This way, user applications don't have to care about the
particular synthesizers available on the system and the synthesizers
don't have to care about the installed user applications.
SSIP is not only a device independent language for speech synthesis
related requests, but also a mechanism to coordinate the interaction and
conflicts between different clients' needs in a central place in the
system. Through the priority system, the central Speech Server that
implements SSIP can decide which messages are considered the most
important at any particular time and say them, while possibly supressing
others.
File: ssip.info, Node: Protocol Philosophy, Next: Higher Level API, Prev: Purpose, Up: Introduction
1.2 Protocol Philosophy
=======================
Speech Synthesis Interface Protocol defines a reasonable subset of the
different capabilities provided by the different synthesizers. It
supports some basic events (message, key, character, ...) as well as
changing the basic voice parameters (language, voice, rate, pitch, ...)
or the more advanced ones (punctuation mode, spelling mode, ...).
None of the commands or parameters of SSIP depends on the
characteristics of the particular devices that are being used. For
example when the client application wants to change the language for the
next message, it only calls the appropriate SSIP command and it leaves
the Speech Server to decide which synthesizer to use.
SSIP was designed to allow multiple simultaneous connections to the
server. A connection is identified by an identification string provided
by the client application and an id number. Each connection with all
its parameters is considered a closed space independent of the others,
so that different clients can maintain different settings in their
connections and then the Speech Server should take care of setting the
right parameters on the synthesizer according to the origin of each
request. One client can even establish several connections to maintain
different contexts.
SSIP also solves the issue when more than one client wants to speak
at one time or when more messages come than it's possible to say. Each
message has an assigned priority and according to this priority, when
multiple messages come to the server, they are directly said, postponed
or suppressed.
It is important to understand the difference between SSIP and higher
level protocols like SABLE, VoiceXML or SSML. Speech Synthesis Interface
Protocol is not a markup language in which one would write a document.
SSIP is rather the underlaying tool that the application would use to
let you read and browse the documents encoded in either ordinary formats
(like plain text, HTML, PDF) or the voice-enabled formats (SABLE,
VoiceXML, SSML). These higher level protocols describe only how the
document should be said, while SSIP is the means to actually do it on
your system. In this manner, one of the supported formats of the
messages you can send through SSIP is SSML.
File: ssip.info, Node: Higher Level API, Prev: Protocol Philosophy, Up: Introduction
1.3 Higher Level API
====================
SSIP is the basic interface protocol that is being used in the
communication of a client with the central Speech Server on a system.
However, in many cases it may be more convenient for application
programmers not to use SSIP directly (having to care about open socket
connections etc.) but rather use an interface wrapper written in the
specific programming language they use. There is no obstacle in SSIP
for this option, and in fact, this approach is highly encouraged.
This way, application programmers should finally be able to use such
simple functions as speech_open(), speech_printf() and speech_set_rate()
in their programs.
We believe this can make writing new speech enabled applications a
lot easier and allow programmers to make more of them.
File: ssip.info, Node: Basic Terminology, Next: General Rules, Prev: Introduction, Up: Top
2 Basic Terminology
*******************
* _Speech Synthesis Interface Protocol_ or _SSIP_ is the
device-independent protocol described in this document through
which client application can send their requests for speech
synthesis to the Speech Server.
* _Speech Server_ is the server application that implements Speech
Synthesis Interface Protocol, as described in this document, and
provides an interface for client applications.
* _Client_ or _client application_ is every application that connects
to Speech Server and talks to it through the Speech Synthesis
Interface Protocol. In other words, this is the application that
"wants to speak".
* _Message_ is a chunk of text that a client sends to Speech Server
to request saying something or play some sound.
* _To cancel a message_ means to stop saying it and/or remove it from
the queue of messages waiting to be said. However, it is not
removed from the history, where it was stored after being received
by Speech Server.
File: ssip.info, Node: General Rules, Next: SSIP Commands, Prev: Basic Terminology, Up: Top
3 General Rules
***************
SSIP communicates with the clients through a defined set of text
commands, in the usual manner for common Internet protocols. The
characters sent through the Speech Synthesis Interface Protocol are
encoded using the UTF-8 encoding.
Each SSIP command, unless specified otherwise, consists of exactly
one line. The line is sent in the following format:
COMMAND ARG ...
where COMMAND is a case insensitive command name and ARGs are its
arguments separated by spaces. The command arguments which come from a
defined set of values are case insensitive as well. The number of
arguments is dependent on the particular command and there can be
commands having no arguments.
All lines of SSIP input and output must be ended with a pair of
carriage return and line feed characters, in that order.
When you connect to Speech Server, you should at least set your
client name, through the 'SET SELF CLIENT_NAME' command (*note Parameter
Setting Commands::). This is important to get a proper identification
of your client -- to allow managing it from the control center
application and to identify it in a message history browser. You might
want to set other connection parameters as well. Look for more details
in *note Parameter Setting Commands::.
An SSIP connection is preferably closed by issuing the 'QUIT'
command, see *note Other Commands::.
SSIP is a synchronous protocol -- you send commands and only after a
complete response from SSIP arrives back are you allowed to send the
next command. Usually, the SSIP connection remains open during the
whole run of the particular client application. If you close the
connection and open it again, you must set all the previously set
parameters again, SSIP doesn't store session parameters between
connections.
The protocol allows you to perform commands influencing other
currently connected or previously connected clients. This allows you to
write a control application managing or browsing all the messages
received by the current Speech Server process. The mechanism is
completely relaxed, there are no restrictions on managing some aspects
of sound output for other users, however, there is a mechanism to
prevent one user from seeing history messages of another user.
Some of the commands (*note Speech Output Control Commands:: and
*note Parameter Setting Commands::) take an argument in the form:
{ ID | all | self }
where the value can be the 'id' of the connection the command should
be performed on (a positive number), the string 'all' to act on all
clients of this server or 'self' to act on the connection itself.
Unless you are writing a special client for managing Speech Server or
unless you have specific needs, you should only use the 'self' value for
this argument.
Not all parameter setting commands may receive all kinds of the first
parameter defined above, for instance, some of them may receive only
'self'.
SSIP replies have the following format:
CCC-line 1
CCC-line 2
...
CCC-line N-1
DDD line N
where N is a positive integer, and CCC and DDD are three-digit long
numeric codes identifying the result of the command. The last line
determines the overall result of the command. The result code is
followed by an English message describing the result of the action in a
human readable form.
File: ssip.info, Node: SSIP Commands, Next: Return Codes, Prev: General Rules, Up: Top
4 SSIP Commands
***************
Commands recognized by SSIP can be divided into several groups: Speech
synthesis and sound output commands, speech control commands, parameter
setting commands, commands retrieving information about current client
and server settings, commands handling the message history, and other
commands. Each of these command groups is described in one of the
following sections.
In the command descriptions, the command is written together with its
arguments. Optional arguments are enclosed by square brackets ('[' and
']'), alternatives are separated by the vertical rule ('|') and are
grouped within braces ('{' and '}') or square brackets for mandatory or
optional arguments respectively. Literal argument values are typeset in
lowercase letters (they are case insensitive), and variable arguments
are typeset LIKE THIS. Ellipsis denoted by three dots ('...') means
repetition (zero or more times) of all the arguments within the current
brackets.
* Menu:
* Speech Synthesis and Sound Output Commands::
* Speech Output Control Commands::
* Message Priority Commands::
* Blocks of Messages Commands::
* Parameter Setting Commands::
* Information Retrieval Commands::
* Message Events Notification and Index Marking::
* History Handling Commands::
* Other Commands::
File: ssip.info, Node: Speech Synthesis and Sound Output Commands, Next: Speech Output Control Commands, Prev: SSIP Commands, Up: SSIP Commands
4.1 Speech Synthesis and Sound Output
=====================================
These commands invoke actual output to particular output device. The
particular way how the message is handled depends on current speech
parameter settings and user configuration.
'SPEAK'
Start receiving a text message and synthesize it. After sending a
reply to the command, Speech Server waits for the text of the
message. The text can spread over any number of lines and is
finished by an end of line marker followed by the line containing
the single character '.' (dot). Thus the complete character
sequence closing the input text is 'CR LF . CR LF'. If any line
within the sent text starts with a dot, an extra dot is prepended
before it.
During reception of the text message, Speech Server doesn't send
responses for the lines sent. The response line is sent only
immediately after the 'SPEAK' command and after receiving the
closing dot line.
The content of the message can be either a plain text or a SSML
(Speech Synthesis Markup Language) text. See 'SET SELF SSML_MODE'.
There is no guarantee that the SSML markup will be respected, so
the application shouldn't rely on them. The external parameters
can still be set by the parameter setting commands. SSML is
intended only for additional markup inside the message. In SSML
mode, each message must begin with '' and end with
''.
Speech Server can start speech synthesis as soon as a sufficient
amount of the text arrives; it generally needn't (but may) wait
until the end of data marker is received.
There is no explicit upper limit on the size of the text, but the
server administrator may set one in the configuration or the limit
can be enforced by available system resources. If the limit is
exceeded, the whole text is accepted, but the excess is ignored and
an error response code is returned after processing the final dot
line.
The reply takes the form
225-msg_id
225 OK MESSAGE QUEUED
where MSG_ID is a unique id assigned to this message in Speech
Server. This is useful for the *note History Handling Commands::
commands as well as for *note Message Events Notification and Index
Marking::.
The 'SPEAK' command might be used for example in this way:
SPEAK
230 OK RECEIVING DATA
hi
.
225-21
225 OK MESSAGE QUEUED
'CHAR CHAR'
Speak letter CHAR. CHAR can be any character representable by the
UTF-8 encoding. The only exception is the character space (' ');
that can't be sent directly. In this case, a string 'space' must
be sent instead.
CHAR e
CHAR \
CHAR space
CHAR &
This command is intended to be used for speaking single letters,
e.g. when reading a character under cursor or when spelling words.
'KEY KEY-NAME'
Speak key identified by KEY-NAME. The command is intended to be
used for speaking keys pressed by the user.
KEY-NAME is a case sensitive symbolic key name. It is composed of
a key name, optionally prepended with one or more prefixes, each
containing an auxiliary key name and the underscore character.
Key name may contain any character excluding control characters
(for example, the characters in the range 0 to 31 in the ASCII
table, characters in the range 128 to 159 in the Latin-* tables and
other "invisible" characters), spaces, underscores, and double
quotes.
The recognized key names are:
* Any single UTF-8 character, excluding the exceptions defined
above.
* Any of the symbolic key names defined in *note Key Names::.
Examples of valid key names:
a
A
shift_a
shift_A
u'
$
enter
shift_kp-enter
control_alt_delete
control
'SOUND_ICON ICON-NAME'
Send a sound identified by ICON-NAME to the audio output.
ICON-NAME is a symbolic name of the given sound from the standard
set listed in *note Standard Sound Icons::, or another name from
the particular Speech Server sound icon configuration.
File: ssip.info, Node: Speech Output Control Commands, Next: Message Priority Commands, Prev: Speech Synthesis and Sound Output Commands, Up: SSIP Commands
4.2 Controlling Speech Output
=============================
These commands can stop or resume speech or audio output. They all
affect only the synthesis process and output to a sound device, they do
not affect the message history.
'STOP { ID | all | self }'
Immediately stop outputting the current message (whatever it is --
text, letter, key, or sound icon) from the identified client, if
any is being output. If the command argument is 'self', the last
message from the current client connection is stopped. If it is
'all', stop currently output message or messages from all the
clients. Otherwise, argument ID must be given as a positive
integer and the currently processed message from the client
connection identified by ID is stopped; if there is none such, do
nothing.
'CANCEL { ID | all | self }'
This command is the same as 'STOP', with the exception that it
stops as yet unspoken output messages as well. All currently
queued messages are stored into the message history without being
sent to the audio output device.
'PAUSE { ID | all | self }'
Stop audio output immediately, but do not discard anything. All
the currently speaking and currently or later queued messages are
postponed and saved for later processing, until a corresponding
'RESUME' command is received.
The meaning of the command arguments is the same as in the 'STOP'
command.
'RESUME { ID | all | self }'
Cancel the effect of the previously issued 'PAUSE' command. Note
that messages of the priority "progress" and "notification"
received during the pause are not output (but they remain stored in
the message history).
It is an error to send the 'RESUME' command when the output
corresponding to the given argument is not paused by a previous
invocation of the 'PAUSE' command. Such an error is signaled by a
'4XX' return code.
The meaning of the command arguments is the same as in the 'STOP'
command.
File: ssip.info, Node: Message Priority Commands, Next: Blocks of Messages Commands, Prev: Speech Output Control Commands, Up: SSIP Commands
4.3 Priority Setting Commands
=============================
A speech synthesizer can't synthesize everything that comes to it, for
the simple reason that messages are often coming faster than a synthetic
voice can say them. On the screen of a monitor, there is relatively a
lot of space compared to one-channel speech synthesis output. For this
reason, SSIP implements a system of several priorities targeted at
different types of messages.
The idea is that the task of the programmer of a client application
is only to assign a meaningful priority to each message and all the
synchronization and switching between the messages (that can be coming
from different clients) is automatically handled by the Speech Server by
applying certain rules based on the priorities.
* Menu:
* Priority Categories:: What are the available priorities.
* Priority Diagram:: Schematic diagram of used priority model.
* Priority Setting Commands::
* Examples of Using Priorities:: A few examples of using the priorities.
File: ssip.info, Node: Priority Categories, Next: Priority Diagram, Prev: Message Priority Commands, Up: Message Priority Commands
4.3.1 Priority Categories
-------------------------
Speech Synthesis Interface Protocol provides a system of five
priorities. Every message will either contain explicit priority
information, or the default value will be used.
Please see also the diagram below.
Priority 'important'
====================
This message will be said immediately as it comes to server. It is
never interrupted. When several concurrent messages of this priority
are received by server, they are queued and said in the order they came.
When a new message of level 'important' comes while a message of
another priority is being spoken, the other message is canceled and the
message with priority 'important' is said instead. Other messages of
lower priorities are postponed (priority 'message' and 'text') until
there are no messages of priority important waiting, or are canceled
(priority 'notification' and 'progress').
These messages should be as short as possible and should rarely be
used, because they block the output of all other messages.
Priority 'message'
==================
This message will be said when there is no message of priority
'important' or 'message' waiting in the queue. If there are, this
message is postponed until those messages are spoken. This means that
the priority 'message' doesn't interrupt itself. If there are messages
of priority 'notification', 'progress' or 'text' waiting in the queue or
being spoken when a message of priority 'message' comes, they are
canceled.
Priority 'text'
===============
This message will be said when there is no message of priority
'important' or 'message' waiting in the queue. If there are, this
message is postponed until the previous messages are spoken.
The priority text interrupts itself. This means that if several
messages of this priority are received, they are not said in the order
they were received, but only the latest of them is said; others are
canceled.
If there are messages of priority 'notification' and 'progress'
waiting in the queue or being spoken when a message of priority 'text'
comes, they are canceled.
Priority 'notification'
=======================
This is a low priority message. If there are messages with priorities
'important', 'message', 'text' or 'progress' waiting in the queues or
being spoken, this 'notification' message is canceled.
This priority interrupts itself, so if more messages with priority
'notification' come at the same time, only the last of them is spoken.
Priority 'progress'
===================
This is a special priority for messages that are coming shortly one
after each other and they carry the information about some work in
progress (e.g. 'Completed 45%').
If new messages interrupted each other (see priority Notification),
the user might not receive any complete message.
This priority behaves the same as "notification" except for two
things:
* The messages of this priority don't interrupt each other, instead,
a newly arriving message is canceled if another message is being
spoken.
* Speech Server tries to detect the last message of a series of
messages (for instance, it's important for the user to hear the
final 'Completed 100%' message to know the work has completed).
Speech Server waits until there are no more messages of this
priority waiting in queues and if the last of them wasn't spoken
yet, it speaks it with the priority 'message'.
This way, even if Speech Server is busy speaking messages of other
priorities, we are still sure that the important messages at the end of
the 'progress' sequences will be said.
File: ssip.info, Node: Priority Diagram, Next: Priority Setting Commands, Prev: Priority Categories, Up: Message Priority Commands
4.3.2 Priority Diagram
----------------------
[image src="figures/priorities.png" alt="Speech Synthesis Interface Protocol Priorities" text=" ___________
| IMPORTANT |
`-----------'
.
/ \\
/ |p| \\
. . . . . . . |r| . . . . . . . . .
. message ----> |i| <---- text .
. . |o| . .
. progress ----> |r| <---- notification .
. . |i| . .
. . |t| . .
. . . . . . . |y| . . . . . . . . .
doesn't interrupt interrupts itself
itself
" ]
File: ssip.info, Node: Priority Setting Commands, Next: Examples of Using Priorities, Prev: Priority Diagram, Up: Message Priority Commands
4.3.3 Priority Setting Commands
-------------------------------
When a priority is set for a given connection, all the newly arriving
messages will be said with this priority until it is changed for a new
value.
* SET self PRIORITY P
This command sets message priority to P. P must be one of the
values 'important', 'text', 'message', 'notification', 'progress'.
*Note Priority Categories::.
Only 'self' is allowed as the 'target' argument.
File: ssip.info, Node: Examples of Using Priorities, Prev: Priority Setting Commands, Up: Message Priority Commands
4.3.4 Examples of Using Priorities
----------------------------------
Example uses for priority 'important' are:
* error messages
* very important messages
* ...
Example uses for priority 'message' are:
* regular program messages
* warnings
* ...
Example uses for priority 'text' are:
* text the user is working on
* menu items
* ...
Example uses for priority 'notification' are:
* less important status information
* letters when typing input
* run-time help
* ...
Example uses for level 'progress' are:
* "completed 15%", "completed 16%", "completed 17%"
* "Loading sounds", "Loading graphics", "Loading ai", ...
File: ssip.info, Node: Blocks of Messages Commands, Next: Parameter Setting Commands, Prev: Message Priority Commands, Up: SSIP Commands
4.4 Blocks of Messages Commands
===============================
Block commands allow the client to concatenate several messages to form
one block that behaves as one message in the priority system and
history. After opening the block, client can send a specified subset of
the commands and the messages introduced by 'SPEAK' will be processed
immediately, however there will be no priority interaction before
closing the block. The *note Speech Output Control Commands:: also
handle the whole block as one message.
Take for example this message from an email client:
> Hi, how are you?
I'm fine. Thank you.
The character '>' clearly marks who said which part. So it'd be nice
to say the two lines with different voices, however, it'd be desirable
to treat it all as one message with priority TEXT and have it put
together in history, because in fact, it logically _is_ one message.
'BLOCK BEGIN'
Opens a block of messages. There will be no priority interaction
between the messages inside the block, the whole block will be
treated as one message of the priority that was specified by
previous 'SET' command.
It can only be called outside of a block; nesting is not allowed.
The allowed commands inside a block are:
* 'SPEAK'
* 'SOUND_ICON'
* 'CHAR'
* 'KEY'
* 'SET SELF RATE'
* 'SET SELF PITCH'
* 'SET SELF VOLUME'
* 'SET SELF VOICE'
* 'SET SELF LANGUAGE'
* 'SET SELF PUNCTUATION'
* 'SET SELF CAP_LET_RECOGN'
* 'QUIT'
* 'BLOCK END'
'BLOCK END'
Closes a block of messages, see 'BLOCK BEGIN'.
It can be only called inside a block opened by 'BLOCK BEGIN';
nesting is not allowed.
A more complete example of SSIP communication using BLOCKs.
[...]
SET SELF PRIORITY TEXT
202 OK PRIORITY SET
BLOCK BEGIN
260 OK INSIDE BLOCK
SET SELF VOICE MALE1
209 OK VOICE SET
SPEAK
230 OK RECEIVING DATA
The word
225 OK MESSAGE QUEUED
SET SELF VOICE MALE2
209 OK VOICE SET
SPEAK
230 OK RECEIVING DATA
`Free'
225 OK MESSAGE QUEUED
SET SELF VOICE MALE1
209 OK VOICE SET
SPEAK
230 OK RECEIVING DATA
in Free Software refers to freedom, not price.
225 OK MESSAGE QUEUED
BLOCK END
261 OK OUTSIDE BLOCK
File: ssip.info, Node: Parameter Setting Commands, Next: Information Retrieval Commands, Prev: Blocks of Messages Commands, Up: SSIP Commands
4.5 Parameter Setting
=====================
The 'SET' command sets various control parameters of the synthesized
speech or server configuration. The parameter is always denoted by the
second command argument.
All the settings take effect on the connections specified in the
first argument (*note General Rules::) and until the parameter setting
is changed by another invocation of the appropriate 'SET' command or
until the connection is closed.
The voice property and TTS-processing settings can sometimes be
without any real effect if the end synthesizer doesn't provide the
required functionality. This is not considered an error in the
implementation of SSIP.
'SET self CLIENT_NAME USER:CLIENT:COMPONENT'
Set client's name. Client name consists of the user name, client
(application) identification, and the identification of the
component of the client (application). Each of the parts of the
client name may contain only alphanumeric characters, dashes ('-')
and underscores ('_').
For example, for a client called 'lynx' that creates an SSIP
connection for its command processing, the name could be set in the
following way:
SET CLIENT_NAME joe:lynx:cmd_processing
The client name is used in the server configuration settings,
client listings and message history handling. All its three parts
can be arbitrary, but it's important to define and follow rules for
each application supporting Speech Synthesis Interface Protocol, so
that a Speech Server user can configure all the aspects of the
speech output easily.
Usually, this command should be sent as the very first command when
a new SSIP connection is established. The command may be sent only
once within a single connection. Attempts to change the client's
name once it's already set are answered with an error code.
Only 'self' is allowed as the 'target' argument.
'SET all DEBUG {ON|OFF}'
If set to 'ON', Speech Dispatcher will write all its debugging
information (including output modules) with maximal verbosity into
a debug directory which is reported by the server to the client in
reply to this command. When subsequently set to 'OFF', Speech
Dispatcher will stop writing out debugging information into this
path and close all the appropriate logging files.
The intended use for this functionality is on-line debugging from
client application. If the user wants to report a problem, the
client application will ask him/her for a place to generate the
logs, to repeat the situation that he/she considers to be a bug,
and then perhaps it will automatically pack the logs and offer to
send them to the developers of Speech Dispatcher or another
appropriate place where the contained information can be processed.
Warning: This option results in a lot of data being written into
the output logs and so should not be left on for an unnecessarily
long time.
SET all DEBUG ON
262-/home/hanke/.cache/speech-dispatcher/log/debug
262 OK DEBUGGING SET
'SET {all | self | ID } OUTPUT_MODULE MODULE'
Set the output module to MODULE. This overrides the selection
based on language. Only values returned by the 'LIST
OUTPUT_MODULES' command are permitted. *Note
list-output-modules::.
SET self OUTPUT_MODULE espeak
216 OK OUTPUT MODULE SET
'GET OUTPUT_MODULE'
Get the output module currently in use. This takes no parameters
and simply returns the current output module.
GET OUTPUT_MODULE
251-espeak
251 OK GET RETURNED
'SET { all | self | ID } LANGUAGE LANGUAGE-CODE'
Set recommended language for this client according to
LANGUAGE-CODE. LANGUAGE-CODE is the code of the language according
to RFC 1766.
For example, to set the preferred language to Czech, you send the
following command:
SET SELF LANGUAGE cs
Please note, that switching a language may require switching a
voice, so this command may actually override a previous call to
'SET VOICE' or 'SET SYNTHESIS_VOICE'.
The default for the Speech Dispatcher implementation of SSIP is
determined by the 'DefaultLanguage' setting in the 'speechd.conf'
file. The factory default is 'en' (English).
'SET {self} SSML_MODE MODE'
Set the mode of the text received in the message body sent by the
'SPEAK' command. This can be either a plain text, if 'mode' is set
to 'off' or a SSML marked text, if 'mode' is set to 'on'.
There is no guarantee that the SSML markup will be respected, so
the application shouldn't rely on them. The external parameters
can still be set by the parameter setting commands. SSML is
intended only for additional markup inside the message. In SSML
mode, each message must begin with '' and end with
''.
For example a simple 'hello world' looks like this:
SET SELF SSML_MODE on
SPEAK
Hello world!
.
'SET { all | self | ID } PUNCTUATION { all | some | none }'
Set punctuation mode to the given value. 'all' means speak all
punctuation characters, 'none' means speak no punctuation
characters, 'some' means speak only punctuation characters set in
the synthesizer's configuration. The default for the Speech
Dispatcher implementation of SSIP is determined by the
'DefaultPunctuationMode' setting in the 'speechd.conf' file. The
factory default is 'none'.
'SET { all | self | ID } SPELLING { on | off }'
Switch spelling on or off. If spelling is set to on, all the
incoming messages will be said letter-by-letter, instead of
speaking them as whole words. The default for the Speech
Dispatcher implementation of SSIP is determined by the
'DefaultSpelling' setting in the 'speechd.conf' file. The factory
default is 'off'.
'SET { all | self | ID } CAP_LET_RECOGN { none | spell | icon }'
Set capital letters recognition mode. 'none' switches this feature
off. 'spell' causes capital letters to be spelled in the speech
using the table set as 'CAP_LET_RECOGN_TABLE'. With parameter
'icon', each capital letter will be preceeded by a sound icon
(either sound or textual) specified by the user in his
configuration. The default for the Speech Dispatcher
implementation of SSIP is determined by the
'DefaultCapLetRecognition' setting in the 'speechd.conf' file. The
factory default is 'none'.
'SET { all | self | ID } VOICE_TYPE NAME'
Set the voice identified by NAME. NAME must be one of the voice
identifiers returned by the command 'LIST VOICES' (*note
Information Retrieval Commands::).
There is a standard set of voice identifiers defined in *note
Standard Voices::.
The default for the Speech Dispatcher implementation of SSIP is
determined by the 'DefaultVoiceType' setting in the 'speechd.conf'
file. The factory default is 'MALE1'.
'GET VOICE_TYPE'
Gets the current pre-defined voice. A list of voice identifiers
can be obtained by the command 'LIST VOICES' (*note Information
Retrieval Commands::).
GET VOICE_TYPE
251-MALE1
251 OK GET RETURNED
'SET { all | self | ID } SYNTHESIS_VOICE NAME'
Set the voice identified by NAME. NAME is a voice name recognized
by the current synthesizer. It must be one of the names returned
by the command 'LIST SYNTHESIS_VOICES' run for the appropriate
synthesizer. (*note Information Retrieval Commands::).
Please note, that switching to a particular voice may require
switching a language, so this command may actually override a
previous call to 'SET LANGUAGE'.
'SET { all | self | ID } RATE N'
Set the rate of speech. N is an integer value within the range
from -100 to 100, lower values meaning slower speech and higher
values meaning faster speech. The default for the Speech
Dispatcher implementation of SSIP is determined by the
'DefaultRate' setting in the 'speechd.conf' file. The factory
default is 0.
'GET RATE'
Get the current rate of speech value.
GET RATE
251-10
251 OK GET RETURNED
'SET { all | self | ID } PITCH N'
Set the pitch of speech. N is an integer value within the range
from -100 to 100, lower values meaning lower pitch and higher
values meaning higher pitch. The default for the Speech Dispatcher
implementation of SSIP is determined by the 'DefaultPitch' setting
in the 'speechd.conf' file. The factory default is 0.
'GET PITCH'
Get the current pitch value.
GET PITCH
251-10
251 OK GET RETURNED
'SET { all | self | ID } VOLUME N'
Set the volume of speech. N is an integer value within the range
from -100 to 100. lower values meaning lower volume and higher
values meaning higher volume. The default for the Speech
Dispatcher implementation of SSIP is determined by the
'DefaultVolume' setting in the 'speechd.conf' file. The factory
default is 100.
'GET VOLUME'
Get the current volume value.
GET VOLUME
251-100
251 OK GET RETURNED
'SET { all | self | ID } PAUSE_CONTEXT N'
Set the number of (more or less) sentences that should be repeated
after a previously paused text is resumed. If there isn't enough
text before the pause spot, the entire message is repeated. N is a
positive integer value specifying the number of sentences to
repeat. The default for the Speech Dispatcher implementation of
SSIP is determined by the 'DefaultPauseContext' setting in the
'speechd.conf' file. The factory default is 0.
'SET { all | self | ID } HISTORY { on | off }'
Enable ('on') or disable ('off') storing of received messages into
history.
This command is intended for use by message history browsers and
usually should not be used by other kinds of clients.
File: ssip.info, Node: Information Retrieval Commands, Next: Message Events Notification and Index Marking, Prev: Parameter Setting Commands, Up: SSIP Commands
4.6 Retrieving Information
==========================
The 'LIST' command serves for retrieving information that can be
presented to the user for selection of the values to the 'SET' command.
The information listed is selected according to the first argument of
the 'LIST' command.
'LIST OUTPUT_MOUDLES'
Lists the available output modules putting each module
identification name one on a single line.
Example:
LIST OUTPUT_MODULES
250-festival
250-espeak
250 OK MODULE LIST SENT
'LIST VOICES'
Lists the available symbolic voice names putting each voice name on
a single line. These are symbolic names that are mapped to the
real voices used in the synthesizer either automatically or via
synthesizer or output module configuration.
Example:
LIST VOICES
249-MALE1
249-MALE2
249-MALE3
249-FEMALE1
249-FEMALE2
249-FEMALE3
249-CHILD_MALE
249-CHILD_FEMALE
249 OK VOICE LIST SENT
'LIST SYNTHESIS_VOICES'
Lists the available voices for the current synthesizer in use.
These names differ from those obtained by 'LIST VOICES' in that
they are names of the real voices used inside the synthesizer.
This feature should only be used to allow the user to choose the
voice. All automatic switching of voices (unless
user-configurable) should be done using the symbolic voice names
which can be configured in the synthesizer.
Each voice name is listed on a separate line together with its
language code and dialect identification string separated by tabs.
The dialect identification strings do not have well-defined meaning
yet. If no dialect is specified by the synthesizer, the value
'none' is used.
Example:
LIST SYNTHESIS_VOICES
249-afrikaans af none
249-welsh-test cy none
249-german de none
249-greek_test el none
249-en-rhotic en r
249-lancashire en uk-north
249 OK VOICE LIST SENT
File: ssip.info, Node: Message Events Notification and Index Marking, Next: History Handling Commands, Prev: Information Retrieval Commands, Up: SSIP Commands
4.7 Message Events Notification and Index Marking
=================================================
* Menu:
* Why Events Notification::
* Types of Events::
* Events Notifications in SSIP::
* Switching Notifications On and Off::
File: ssip.info, Node: Why Events Notification, Next: Types of Events, Prev: Message Events Notification and Index Marking, Up: Message Events Notification and Index Marking
4.7.1 Why Events Notification
-----------------------------
Applications can send messages to a Speech Server through the SSIP
'SPEAK' command. However, this command only puts the received message
into a queue in Speech Server and returns immediately. The message then
will or will not be said at some particular time according to its
priority. Through Message Events Notification, the application is able
to discover certain kind of events, including when the message started
to be played on the speakers, when it terminated playing, when it was
paused and resumed, or when it was interrupted/discarded. It is also
possible to get notification when a certain place in the given text was
reached while playing the synthesized text on the speakers - this
capability, however, might or might not be supported by the end
synthesizer and so client applications should not rely on it.
File: ssip.info, Node: Types of Events, Next: Events Notifications in SSIP, Prev: Why Events Notification, Up: Message Events Notification and Index Marking
4.7.2 Types of Events
---------------------
SSIP recognizes several types of events. Each event is reported
together with the unique identification of the message and client it is
associated with. This is an overview of available events. For detailed
SSIP syntax, please look below.
'BEGIN'
This event means that the synthesizer just started to speak the
message and the user is able to hear the speech on his/her
speakers.
Please note that not every message stored for speaking by the
'SPEAK' command will issue this event. It can issue the 'CANCEL'
event instead.
'END'
This event means that the synthesizer just terminated speaking the
message (by reaching its end) and the user is no longer able to
hear the speech on their speakers.
Again, note that not every message that has already reported the
'BEGIN' event will necessarily get to the 'END' event. It might
instead issue the 'CANCEL' or 'PAUSE' events.
'CANCEL'
The 'CANCEL' event is reported when the message was canceled
(either after 'BEGIN' during speaking or even before, when waiting
in the queues) and will not be spoken anymore.
'PAUSE'
The event 'PAUSE' means that the message that was being spoken was
paused and no longer produces any sound on the speakers, but was
not discarded and the rest of the message might be spoken again
after the 'RESUME' command is sent. *Note Speech Output Control
Commands::. This will be reported by the 'RESUME' event.
'PAUSE' is always preceded by the event 'BEGIN', and can be
followed by either the event 'RESUME' or 'CANCEL'.
'RESUME'
The event 'RESUME' means that a message that was paused while being
spoken, just started to continue and again produces sound in the
speakers.
'RESUME' is always preceeded by the event 'PAUSE', and can be
followed by either the event 'END' or 'CANCEL'.
'INDEX_MARK'
This event means that some previously specified place in the text
(so-called index mark) was reached when speaking the synthesized
message in the speakers. It is always accompanied by an additional
parameter that indicates which place it is - the name of the index
mark.
Example (not in SSIP syntax):
This SSML message
Hello, how does it work?
would issue the following sequence of events if it is not discarded
or paused:
BEGIN
INDEX_MARK "mark1"
END
or this one if it gets paused after the first index mark and then
later resumed.
BEGIN
INDEX_MARK "mark1"
PAUSE
RESUME
END
File: ssip.info, Node: Events Notifications in SSIP, Next: Switching Notifications On and Off, Prev: Types of Events, Up: Message Events Notification and Index Marking
4.7.3 Events Notification in SSIP
---------------------------------
Event notifications, if requested, are reported asynchronously in SSIP.
This means that they are not sent as replies to any particular requests
but can arrive anytime. However, notifications can't arrive in the time
between when a SSIP command is sent by the client and its reply is sent
back by the server.
Each notification consists of a multi-line SSIP reply as defined in
*note General Rules::, and includes at least two parameters: 'msg_id'
and 'client_id'. 'msg_id' is the identification number of the message
the event is related to, *note SPEAK:: while 'client_id' is the
identification number of the client who sent the message. Some events
may have additional parameters.
'INDEX_MARK'
700-msg_id
700-client_id
700-index_mark
700 END
The event 'INDEX_MARK' carries a special parameter 'index_mark'
which is a string of characters identifying the index mark, as
specified by the client application (e.g. by the SSML tag .
'BEGIN'
701-msg_id
701-client_id
701 BEGIN
'END'
702-msg_id
702-client_id
702 END
'CANCEL'
703-msg_id
703-client_id
703 CANCELED
'PAUSE'
704-msg_id
704-client_id
704 PAUSED
'RESUME'
705-msg_id
705-client_id
705 RESUMED
File: ssip.info, Node: Switching Notifications On and Off, Prev: Events Notifications in SSIP, Up: Message Events Notification and Index Marking
4.7.4 Switching Notifications On and Off
----------------------------------------
The client application might or might not want to receive the
notifications about events, or it might want to receive some but not
others. SSIP allows clients to specify which notifications are to be
used.
The following commands for setting notifications on and off affect
all the text messages (sent by the 'SPEAK' SSIP command) based on when
the appropriate 'SPEAK' command was called. So if for example, you set
all notifications on, send a message and then set all notifications off,
you will receive all the available notifications for that message even
though it might start speaking after the notifications are already
turned off.
'SET SELF NOTIFICATION ALL { on | off }'
Set all available event notifications to either "on" or "off" for
for the messages that follow. *Note Types of Events::.
'SET SELF NOTIFICATION BEGIN { on | off }'
'SET SELF NOTIFICATION END { on | off }'
Set the event notifications for 'BEGIN' or 'END' to either "on" or
"off" for the messages that follow. *Note Types of Events::.
'SET SELF NOTIFICATION CANCEL { on | off }'
Set the event notifications for 'CANCEL' to 'mode' where 'mode' is
either "on" or "off" for switching the notifications on or off for
the messages that follow. *Note Types of Events::.
'SET SELF NOTIFICATION PAUSE { on | off }'
'SET SELF NOTIFICATION RESUME { on | off }'
Set the event notifications for 'PAUSE' or 'RESUME' to 'mode' where
'mode' is either "on" or "off" for switching the notifications on
or off for the messages that follow. *Note Types of Events::.
'SET SELF NOTIFICATION INDEX_MARKS { on | off }'
Set the event notifications for 'INDEX_MARK' to either "on" or
"off" for switching the notifications on or off for the messages
that follow. *Note Types of Events::.
File: ssip.info, Node: History Handling Commands, Next: Other Commands, Prev: Message Events Notification and Index Marking, Up: SSIP Commands
4.8 History Handling
====================
* Menu:
* Purpose of Message History::
* Message History in SSIP::
File: ssip.info, Node: Purpose of Message History, Next: Message History in SSIP, Prev: History Handling Commands, Up: History Handling Commands
4.8.1 Purpose of Message History
--------------------------------
It seems a good feature for the blind and visually impaired to provide
the possibility to browse, through some simple client, the history of
received and previously said messages.
Some messages are even received by Speech Server without being said,
because there will always be more space for information on the screen
than speech output can possibly provide.
For this reason, SSIP defines a set of commands that allow client
applications to browse through the history of previously received
messages saved on the server. The idea is that _each_ message received
by the server should be accessible through the history and the user can
search for it later by time, keywords or using other methods.
On the other hand, this may cause security issues as several clients
may connect to Speech Server and they might originate from different
users. For this reason, only those messages that come from the same
user should be accessible by default (if not overridden in server
configuration).
File: ssip.info, Node: Message History in SSIP, Prev: Purpose of Message History, Up: History Handling Commands
4.8.2 Message History in SSIP
-----------------------------
History is handled by the 'HISTORY' command. It can take many forms,
described below, that allow browsing, retrieving and repeating stored
messages. In each invocation of the 'HISTORY' command there is no
difference between processing spoken or not spoken messages, all the
received messages are processed.
The implementation of these history commands in the Speech Dispatcher
implementation of SSIP is still under way. If you want to use them,
please contact us to see the current status.
There is a "history cursor" pointing to some message in the history.
You can move it across history messages and retrieve the message the
cursor is pointing to, using the 'HISTORY CURSOR' set of command
arguments described below.
'HISTORY GET CLIENT_LIST'
List known client names, their identifiers and status. Each
connection is listed on a separate line in the following format:
ID NAME STATUS
where ID is a client id that can be used in other history handling
requests or in the speech output control commands (*note Speech
Output Control Commands::), NAME is the client name as set through
the 'SET SELF CLIENT_NAME' command, and STATUS is '1' for connected
clients and '0' for disconnected clients. IDs are unique within a
single run of Speech Server.
Sample SSIP reply:
240-0 joe:speechd_client:main 0
240-1 joe:speechd_client:status 0
240-2 unknown:unknown:unknown 1
240 OK CLIENTS LIST SENT
'HISTORY GET CLIENT_ID'
Return id of the client itself.
The id is listed on a separate line in the following format:
ID
Example:
200-123
200 OK CLIENT ID SENT
'HISTORY GET CLIENT_MESSAGES { ID | all | self } START NUMBER'
List identifiers of messages sent by the client identified by ID.
If the special identifier 'all' is used, identifiers of messages
sent by all clients are listed; if the special identifier 'self' is
used, identifiers of messages sent by this client are listed.
NUMBER of messages is listed, starting from the message numbered
START. Both NUMBER and START must be positive integers. The first
message is numbered 1, the second 2, etc. If the given range
exceeds the range of available messages, no error is signaled and
the given range is restricted to the available range of messages.
Messages are sorted by the criterion used in the last client's
invocation of the 'HISTORY SORT' command. If no 'HISTORY SET' has
been invoked yet, the messages are sorted from the oldest to the
newest, according to their time of arrival at Speech Server.
Each message id is listed, together with other information, on a
separate line, in the following format:
ID CLIENT-ID CLIENT-NAME "TIME" PRIORITY "INTRO"
CLIENT-ID is a numeric identifier of the client which sent the
message, CLIENT-NAME is its name as set by the 'SET SELF
CLIENT_NAME' command (*note Parameter Setting Commands::). TIME is
the time of arrival of the message, in the fixed length 'YYYY-MM-DD
HH:MM:SS' format. PRIORITY is the priority of the message, one of
the values accepted by the 'SET SELF PRIORITY' command (*note
Parameter Setting Commands::).
INTRO is the introductory part of the message of a certain maximum
length, see the 'HISTORY SET SHORT_MESSAGE_LENGTH' command. INTRO
does not contain any double quotes nor the line feed character.
All the message identifiers in the history, regardless of clients
that issued them, are unique within a single run of Speech Server
and remain unchanged.
'HISTORY GET LAST'
List the id of the last message sent by the client.
The id is listed on a separate line of the following format:
ID
If the client hasn't sent any message yet, return an error code.
'HISTORY GET MESSAGE ID'
Return the text of the history message identified by ID. If ID
doesn't refer to any message, return an error code instead. The
text is sent as a multi-line message, with no escaping or special
transformation.
An example SSIP response to the command:
200-Hello, world!
200-How are you?
200 OK MESSAGE SENT
'HISTORY CURSOR GET'
Get the id of the message the history cursor is pointing to.
The id is listed on a separate line. Sample SSIP reply to this
command:
243-42
243 OK CURSOR POSITION RETURNED
'HISTORY CURSOR SET { ID | all | self } { first | last | pos N }'
Set the history cursor to the given position. The meaning of the
first argument after 'SET' is the same as in the 'HISTORY GET
CLIENT_MESSAGES' command. The argument 'first' asks to set the
cursor on the first position and the argument 'last' asks to set
the cursor on the last position of the history of the given client.
If the argument 'pos' is used, the position is set to N, where N is
a positive integer. It is an error if ID doesn't identify any
client or if N doesn't point to any existing position in the
history.
As for the order and numbering of the messages in the history, the
same rules apply as in 'HISTORY GET CLIENT_MESSAGES'. See above.
'HISTORY CURSOR { forward | backward }'
Move the cursor one position 'forward', resp. 'backward', within
the messages of the client specified in the last 'HISTORY CURSOR
SET' command. If there is no next, resp. previous, message, don't
move the cursor and return an error code.
'HISTORY SAY ID'
Speak the message from history identified by ID. If ID doesn't
refer to any message, return an error code instead.
The message is spoken as it would be sent by its originating
command ('SPEAK' or 'SOUND_ICON'), but the _current_ settings
(priority, etc.) apply.
'HISTORY SORT { asc | desc } { time | user | client_name | priority | message_type }'
Sort the messages in history according to the given criteria. If
the second command argument is 'asc', sort in ascending order, if
it is 'desc', sort in descending order. The third command argument
specifies the message property to order by:
'time'
Time of arrival of the message.
'user'
User name.
'client_name'
Client name, excluding user name.
'priority'
Priority.
'message_type'
Type of the message (text, sound icon, character, key), in the
order specified in the Speech Server configuration or by the
'HISTORY SET MESSAGE_TYPE_ORDERING' command.
The sorting is stable -- order of all the messages that are equal
in the given ordering remains the same.
The sorting is specific to the given client connection, other
connections are unaffected by invocation of this command.
'HISTORY SET SHORT_MESSAGE_LENGTH LENGTH'
Set the maximum length of short versions of history messages to
LENGTH characters. LENGTH must be a non-negative integer.
Short (truncated) versions of history messages are used e.g. in
the answer to the 'HISTORY GET CLIENT_MESSAGES' format.
'HISTORY SET MESSAGE_TYPE_ORDERING "ORDERING"'
Set the ordering of the message types, from the minimum to the
maximum. ORDERING is a sequence of the following symbols,
separated by spaces: 'text', 'sound_icon', 'char', 'key'. The
symbols are case insensitive and each of them must be present in
ORDERING exactly once.
The specified ordering can be used by the 'HISTORY SORT' command.
'HISTORY SEARCH { ID | all | self } "CONDITION"'
Return the list of history messages satisfying CONDITION. The
command allows searching messages by given words. The output
format is the same as the 'HISTORY GET CLIENT_MESSAGES' command.
The meaning of the first argument after 'SEARCH' is the same as the
'HISTORY GET CLIENT_MESSAGES' command.
CONDITION is constructed according to the following grammar rules:
'CONDITION :: WORD'
Matches messages containing WORD.
'CONDITION :: ( ! CONDITION )'
Negation of the given condition.
'CONDITION :: ( CONDITION [ & CONDITION ... ] )'
Logical AND -- all the conditions must be satisfied.
'CONDITION :: ( CONDITION [ | CONDITION ... ] )'
Logical OR -- at least one of the conditions must be
satisfied.
Spaces within the condition are insignificant and ignored.
The following rules apply to WORDs:
- WORD is a sequence of adjacent alphanumeric characters.
- If WORD contains any upper-case letter, the search for the
word is case sensitive, otherwise it's case insensitive.
- WORD must match whole word, not only its substring.
- WORD can contain the wild card characters '?', substituting
any single alphanumeric character, and '*', substituting any
number (incl. zero) of alphanumeric characters.
Returned messages are sorted by the following rules:
1. The primary sorting is defined by the number of the satisfied
subconditions on the top level of the given condition, from
the highest (best matching messages first) to the lowest.
This takes effect only if the given condition is the OR rule.
2. The criterion used in the last client's invocation of the
'HISTORY SORT' command. If no 'HISTORY SORT' has been invoked
yet, the messages are sorted from the oldest to the newest,
according to their time of arrival.
File: ssip.info, Node: Other Commands, Prev: History Handling Commands, Up: SSIP Commands
4.9 Other Commands
==================
'QUIT'
Close the connection.
'HELP'
Print a short list of all SSIP commands, as a multi-line message.
File: ssip.info, Node: Return Codes, Next: Appendices, Prev: SSIP Commands, Up: Top
5 Return Codes
**************
Each line of the SSIP output starts with a three-digit numeric code of
the form NXX where N determines the result group and XX denotes the
finer classification of the result.
SSIP defines the following result groups:
1XX
Informative response -- general information about the protocol,
help messages.
2XX
Operation was completely successful.
3XX
Server error, problem on the server side.
4XX
Client error, invalid arguments or parameters received.
5XX
Client error, invalid command syntax, unparseable input.
7XX
Event notifications. See *Note Events Notifications in SSIP::.
Result groups 1XX and 2XX correspond to successful actions, other
groups to unsuccessful actions. Only the groups defined here may be
returned in an SSIP connection.
Currently, for return codes in the range '100'-'599', only the
meaning of the first digit of the result code is defined. The last two
digits are insignificant and can be of any value. Clients shouldn't
rely on the unspecified digits in any way.
However, the return codes in the range '700'-'800', reserved for
events notification, are well defined in the appropriate section of SSIP
documentation and client applications can rely on them.
In the future, these return codes should be fixed so that clients can
rely on them.
* Menu:
* Sample SSIP Dialog::
File: ssip.info, Node: Sample SSIP Dialog, Prev: Return Codes, Up: Return Codes
5.1 Example of an SSIP Dialog
=============================
The following example illustrates a sample dialog with SSIP. The client
connects to a Speech Server, sets all the common parameters, sends two
text messages, displays the list of clients, instructs Speech Server to
repeat the second message, and closes the connection. Lines starting
with a numeric code are response lines of the server, other lines are
the lines sent by the client.
SET SELF CLIENT_NAME joe:vi:default
208 OK CLIENT NAME SET
SET SELF PRIORITY MESSAGE
202 OK PRIORITY SET
SPEAK
230 OK RECEIVING DATA
Hello, I'm am SSIP communication example!
How are you?
.
225 OK MESSAGE QUEUED
SPEAK
230 OK RECEIVING DATA
Still there?
.
225 OK MESSAGE QUEUED
HISTORY GET CLIENT_LIST
240-1 jim:Emacs:default 0
240-2 jim:Emacs:default 0
240-3 unknown:unknown:unknown 0
240-4 jim:Emacs:default 1
240-5 joe:vi:default 1
240 OK CLIENTS LIST SENT
HISTORY GET LAST
242-39 joe:vi:default
242 OK LAST MSG SENT
HISTORY SAY 39
225 OK MESSAGE QUEUED
QUIT
231 HAPPY HACKING
File: ssip.info, Node: Appendices, Next: GNU Free Documentation License, Prev: Return Codes, Up: Top
Appendix A Appendices
*********************
* Menu:
* Key Names:: List of the symbolic key names.
* Standard Sound Icons:: List of the standard sound icon names.
* Standard Voices::
File: ssip.info, Node: Key Names, Next: Standard Sound Icons, Prev: Appendices, Up: Appendices
A.1 Key Names
=============
This appendix defines all the recognized symbolic key names. The names
are case sensitive.
Special Key Names
-----------------
'space'
'underscore'
'double-quote'
Auxiliary Keys
--------------
'alt'
'control'
'hyper'
'meta'
'shift'
'super'
Control Character Keys
----------------------
'backspace'
'break'
'delete'
'down'
'end'
'enter'
'escape'
'f1'
'f2'
'f3'
'f4'
'f5'
'f6'
'f7'
'f8'
'f9'
'f10'
'f11'
'f12'
'f13'
'f14'
'f15'
'f16'
'f17'
'f18'
'f19'
'f20'
'f21'
'f22'
'f23'
'f24'
'home'
'insert'
'kp-*'
'kp-+'
'kp--'
'kp-.'
'kp-/'
'kp-0'
'kp-1'
'kp-2'
'kp-3'
'kp-4'
'kp-5'
'kp-6'
'kp-7'
'kp-8'
'kp-9'
'kp-enter'
'left'
'menu'
'next'
'num-lock'
'pause'
'print'
'prior'
'return'
'right'
'scroll-lock'
'space'
'tab'
'up'
'window'
File: ssip.info, Node: Standard Sound Icons, Next: Standard Voices, Prev: Key Names, Up: Appendices
A.2 Standard Sound Icons
========================
There are none currently.
File: ssip.info, Node: Standard Voices, Prev: Standard Sound Icons, Up: Appendices
A.3 Standard Voices
===================
The following voice names are always present in the output of the 'LIST
VOICES' command (*note Information Retrieval Commands::):
'MALE1'
'MALE2'
'MALE3'
'FEMALE1'
'FEMALE2'
'FEMALE3'
'CHILD_MALE'
'CHILD_FEMALE'
The actual presence of any of these voices is not guaranteed. But
the command 'SET VOICE' (*note Parameter Setting Commands::) must accept
any of them. If the given voice is not available, it is mapped to
another voice by the output module.
File: ssip.info, Node: GNU Free Documentation License, Next: GNU General Public Licence, Prev: Appendices, Up: Top
Appendix B GNU Free Documentation License
*****************************************
Version 1.2, November 2002
Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
0. PREAMBLE
The purpose of this License is to make a manual, textbook, or other
functional and useful document "free" in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or
noncommercially. Secondarily, this License preserves for the
author and publisher a way to get credit for their work, while not
being considered responsible for modifications made by others.
This License is a kind of "copyleft", which means that derivative
works of the document must themselves be free in the same sense.
It complements the GNU General Public License, which is a copyleft
license designed for free software.
We have designed this License in order to use it for manuals for
free software, because free software needs free documentation: a
free program should come with manuals providing the same freedoms
that the software does. But this License is not limited to
software manuals; it can be used for any textual work, regardless
of subject matter or whether it is published as a printed book. We
recommend this License principally for works whose purpose is
instruction or reference.
1. APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work, in any medium,
that contains a notice placed by the copyright holder saying it can
be distributed under the terms of this License. Such a notice
grants a world-wide, royalty-free license, unlimited in duration,
to use that work under the conditions stated herein. The
"Document", below, refers to any such manual or work. Any member
of the public is a licensee, and is addressed as "you". You accept
the license if you copy, modify or distribute the work in a way
requiring permission under copyright law.
A "Modified Version" of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.
A "Secondary Section" is a named appendix or a front-matter section
of the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall
subject (or to related matters) and contains nothing that could
fall directly within that overall subject. (Thus, if the Document
is in part a textbook of mathematics, a Secondary Section may not
explain any mathematics.) The relationship could be a matter of
historical connection with the subject or with related matters, or
of legal, commercial, philosophical, ethical or political position
regarding them.
The "Invariant Sections" are certain Secondary Sections whose
titles are designated, as being those of Invariant Sections, in the
notice that says that the Document is released under this License.
If a section does not fit the above definition of Secondary then it
is not allowed to be designated as Invariant. The Document may
contain zero Invariant Sections. If the Document does not identify
any Invariant Sections then there are none.
The "Cover Texts" are certain short passages of text that are
listed, as Front-Cover Texts or Back-Cover Texts, in the notice
that says that the Document is released under this License. A
Front-Cover Text may be at most 5 words, and a Back-Cover Text may
be at most 25 words.
A "Transparent" copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed
of pixels) generic paint programs or (for drawings) some widely
available drawing editor, and that is suitable for input to text
formatters or for automatic translation to a variety of formats
suitable for input to text formatters. A copy made in an otherwise
Transparent file format whose markup, or absence of markup, has
been arranged to thwart or discourage subsequent modification by
readers is not Transparent. An image format is not Transparent if
used for any substantial amount of text. A copy that is not
"Transparent" is called "Opaque".
Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format,
SGML or XML using a publicly available DTD, and standard-conforming
simple HTML, PostScript or PDF designed for human modification.
Examples of transparent image formats include PNG, XCF and JPG.
Opaque formats include proprietary formats that can be read and
edited only by proprietary word processors, SGML or XML for which
the DTD and/or processing tools are not generally available, and
the machine-generated HTML, PostScript or PDF produced by some word
processors for output purposes only.
The "Title Page" means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the
material this License requires to appear in the title page. For
works in formats which do not have any title page as such, "Title
Page" means the text near the most prominent appearance of the
work's title, preceding the beginning of the body of the text.
A section "Entitled XYZ" means a named subunit of the Document
whose title either is precisely XYZ or contains XYZ in parentheses
following text that translates XYZ in another language. (Here XYZ
stands for a specific section name mentioned below, such as
"Acknowledgements", "Dedications", "Endorsements", or "History".)
To "Preserve the Title" of such a section when you modify the
Document means that it remains a section "Entitled XYZ" according
to this definition.
The Document may include Warranty Disclaimers next to the notice
which states that this License applies to the Document. These
Warranty Disclaimers are considered to be included by reference in
this License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and
has no effect on the meaning of this License.
2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License
applies to the Document are reproduced in all copies, and that you
add no other conditions whatsoever to those of this License. You
may not use technical measures to obstruct or control the reading
or further copying of the copies you make or distribute. However,
you may accept compensation in exchange for copies. If you
distribute a large enough number of copies you must also follow the
conditions in section 3.
You may also lend copies, under the same conditions stated above,
and you may publicly display copies.
3. COPYING IN QUANTITY
If you publish printed copies (or copies in media that commonly
have printed covers) of the Document, numbering more than 100, and
the Document's license notice requires Cover Texts, you must
enclose the copies in covers that carry, clearly and legibly, all
these Cover Texts: Front-Cover Texts on the front cover, and
Back-Cover Texts on the back cover. Both covers must also clearly
and legibly identify you as the publisher of these copies. The
front cover must present the full title with all words of the title
equally prominent and visible. You may add other material on the
covers in addition. Copying with changes limited to the covers, as
long as they preserve the title of the Document and satisfy these
conditions, can be treated as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto
adjacent pages.
If you publish or distribute Opaque copies of the Document
numbering more than 100, you must either include a machine-readable
Transparent copy along with each Opaque copy, or state in or with
each Opaque copy a computer-network location from which the general
network-using public has access to download using public-standard
network protocols a complete Transparent copy of the Document, free
of added material. If you use the latter option, you must take
reasonably prudent steps, when you begin distribution of Opaque
copies in quantity, to ensure that this Transparent copy will
remain thus accessible at the stated location until at least one
year after the last time you distribute an Opaque copy (directly or
through your agents or retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of
the Document well before redistributing any large number of copies,
to give them a chance to provide you with an updated version of the
Document.
4. MODIFICATIONS
You may copy and distribute a Modified Version of the Document
under the conditions of sections 2 and 3 above, provided that you
release the Modified Version under precisely this License, with the
Modified Version filling the role of the Document, thus licensing
distribution and modification of the Modified Version to whoever
possesses a copy of it. In addition, you must do these things in
the Modified Version:
A. Use in the Title Page (and on the covers, if any) a title
distinct from that of the Document, and from those of previous
versions (which should, if there were any, be listed in the
History section of the Document). You may use the same title
as a previous version if the original publisher of that
version gives permission.
B. List on the Title Page, as authors, one or more persons or
entities responsible for authorship of the modifications in
the Modified Version, together with at least five of the
principal authors of the Document (all of its principal
authors, if it has fewer than five), unless they release you
from this requirement.
C. State on the Title page the name of the publisher of the
Modified Version, as the publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.
F. Include, immediately after the copyright notices, a license
notice giving the public permission to use the Modified
Version under the terms of this License, in the form shown in
the Addendum below.
G. Preserve in that license notice the full lists of Invariant
Sections and required Cover Texts given in the Document's
license notice.
H. Include an unaltered copy of this License.
I. Preserve the section Entitled "History", Preserve its Title,
and add to it an item stating at least the title, year, new
authors, and publisher of the Modified Version as given on the
Title Page. If there is no section Entitled "History" in the
Document, create one stating the title, year, authors, and
publisher of the Document as given on its Title Page, then add
an item describing the Modified Version as stated in the
previous sentence.
J. Preserve the network location, if any, given in the Document
for public access to a Transparent copy of the Document, and
likewise the network locations given in the Document for
previous versions it was based on. These may be placed in the
"History" section. You may omit a network location for a work
that was published at least four years before the Document
itself, or if the original publisher of the version it refers
to gives permission.
K. For any section Entitled "Acknowledgements" or "Dedications",
Preserve the Title of the section, and preserve in the section
all the substance and tone of each of the contributor
acknowledgements and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document, unaltered
in their text and in their titles. Section numbers or the
equivalent are not considered part of the section titles.
M. Delete any section Entitled "Endorsements". Such a section
may not be included in the Modified Version.
N. Do not retitle any existing section to be Entitled
"Endorsements" or to conflict in title with any Invariant
Section.
O. Preserve any Warranty Disclaimers.
If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no
material copied from the Document, you may at your option designate
some or all of these sections as invariant. To do this, add their
titles to the list of Invariant Sections in the Modified Version's
license notice. These titles must be distinct from any other
section titles.
You may add a section Entitled "Endorsements", provided it contains
nothing but endorsements of your Modified Version by various
parties--for example, statements of peer review or that the text
has been approved by an organization as the authoritative
definition of a standard.
You may add a passage of up to five words as a Front-Cover Text,
and a passage of up to 25 words as a Back-Cover Text, to the end of
the list of Cover Texts in the Modified Version. Only one passage
of Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity. If the Document
already includes a cover text for the same cover, previously added
by you or by arrangement made by the same entity you are acting on
behalf of, you may not add another; but you may replace the old
one, on explicit permission from the previous publisher that added
the old one.
The author(s) and publisher(s) of the Document do not by this
License give permission to use their names for publicity for or to
assert or imply endorsement of any Modified Version.
5. COMBINING DOCUMENTS
You may combine the Document with other documents released under
this License, under the terms defined in section 4 above for
modified versions, provided that you include in the combination all
of the Invariant Sections of all of the original documents,
unmodified, and list them all as Invariant Sections of your
combined work in its license notice, and that you preserve all
their Warranty Disclaimers.
The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy. If there are multiple Invariant Sections with the same name
but different contents, make the title of each such section unique
by adding at the end of it, in parentheses, the name of the
original author or publisher of that section if known, or else a
unique number. Make the same adjustment to the section titles in
the list of Invariant Sections in the license notice of the
combined work.
In the combination, you must combine any sections Entitled
"History" in the various original documents, forming one section
Entitled "History"; likewise combine any sections Entitled
"Acknowledgements", and any sections Entitled "Dedications". You
must delete all sections Entitled "Endorsements."
6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other
documents released under this License, and replace the individual
copies of this License in the various documents with a single copy
that is included in the collection, provided that you follow the
rules of this License for verbatim copying of each of the documents
in all other respects.
You may extract a single document from such a collection, and
distribute it individually under this License, provided you insert
a copy of this License into the extracted document, and follow this
License in all other respects regarding verbatim copying of that
document.
7. AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other
separate and independent documents or works, in or on a volume of a
storage or distribution medium, is called an "aggregate" if the
copyright resulting from the compilation is not used to limit the
legal rights of the compilation's users beyond what the individual
works permit. When the Document is included in an aggregate, this
License does not apply to the other works in the aggregate which
are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half
of the entire aggregate, the Document's Cover Texts may be placed
on covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic
form. Otherwise they must appear on printed covers that bracket
the whole aggregate.
8. TRANSLATION
Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section
4. Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also
include the original English version of this License and the
original versions of those notices and disclaimers. In case of a
disagreement between the translation and the original version of
this License or a notice or disclaimer, the original version will
prevail.
If a section in the Document is Entitled "Acknowledgements",
"Dedications", or "History", the requirement (section 4) to
Preserve its Title (section 1) will typically require changing the
actual title.
9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document
except as expressly provided for under this License. Any other
attempt to copy, modify, sublicense or distribute the Document is
void, and will automatically terminate your rights under this
License. However, parties who have received copies, or rights,
from you under this License will not have their licenses terminated
so long as such parties remain in full compliance.
10. FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions of
the GNU Free Documentation License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns. See
.
Each version of the License is given a distinguishing version
number. If the Document specifies that a particular numbered
version of this License "or any later version" applies to it, you
have the option of following the terms and conditions either of
that specified version or of any later version that has been
published (not as a draft) by the Free Software Foundation. If the
Document does not specify a version number of this License, you may
choose any version ever published (not as a draft) by the Free
Software Foundation.
B.1 ADDENDUM: How to use this License for your documents
========================================================
To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and license
notices just after the title page:
Copyright (C) YEAR YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the section entitled ``GNU
Free Documentation License''.
If you have Invariant Sections, Front-Cover Texts and Back-Cover
Texts, replace the "with...Texts." line with this:
with the Invariant Sections being LIST THEIR TITLES, with
the Front-Cover Texts being LIST, and with the Back-Cover Texts
being LIST.
If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.
If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of free
software license, such as the GNU General Public License, to permit
their use in free software.
File: ssip.info, Node: GNU General Public Licence, Prev: GNU Free Documentation License, Up: Top
Appendix C GNU General Public License
*************************************
Version 2, June 1991
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
========
The licenses for most software are designed to take away your freedom to
share and change it. By contrast, the GNU General Public License is
intended to guarantee your freedom to share and change free software--to
make sure the software is free for all its users. This General Public
License applies to most of the Free Software Foundation's software and
to any other program whose authors commit to using it. (Some other Free
Software Foundation software is covered by the GNU Lesser General Public
License instead.) You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it if
you want it, that you can change the software or use pieces of it in new
free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software,
and (2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
===============================================================
0. This License applies to any program or other work which contains a
notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program",
below, refers to any such program or work, and a "work based on the
Program" means either the Program or any derivative work under
copyright law: that is to say, a work containing the Program or a
portion of it, either verbatim or with modifications and/or
translated into another language. (Hereinafter, translation is
included without limitation in the term "modification".) Each
licensee is addressed as "you".
Activities other than copying, distribution and modification are
not covered by this License; they are outside its scope. The act
of running the Program is not restricted, and the output from the
Program is covered only if its contents constitute a work based on
the Program (independent of having been made by running the
Program). Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's source
code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any
warranty; and give any other recipients of the Program a copy of
this License along with the Program.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange
for a fee.
2. You may modify your copy or copies of the Program or any portion of
it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a. You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b. You must cause any work that you distribute or publish, that
in whole or in part contains or is derived from the Program or
any part thereof, to be licensed as a whole at no charge to
all third parties under the terms of this License.
c. If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display
an announcement including an appropriate copyright notice and
a notice that there is no warranty (or else, saying that you
provide a warranty) and that users may redistribute the
program under these conditions, and telling the user how to
view a copy of this License. (Exception: if the Program
itself is interactive but does not normally print such an
announcement, your work based on the Program is not required
to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the
Program, and can be reasonably considered independent and separate
works in themselves, then this License, and its terms, do not apply
to those sections when you distribute them as separate works. But
when you distribute the same sections as part of a whole which is a
work based on the Program, the distribution of the whole must be on
the terms of this License, whose permissions for other licensees
extend to the entire whole, and thus to each and every part
regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or
contest your rights to work written entirely by you; rather, the
intent is to exercise the right to control the distribution of
derivative or collective works based on the Program.
In addition, mere aggregation of another work not based on the
Program with the Program (or with a work based on the Program) on a
volume of a storage or distribution medium does not bring the other
work under the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms
of Sections 1 and 2 above provided that you also do one of the
following:
a. Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of
Sections 1 and 2 above on a medium customarily used for
software interchange; or,
b. Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange; or,
c. Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with
such an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete
source code means all the source code for all modules it contains,
plus any associated interface definition files, plus the scripts
used to control compilation and installation of the executable.
However, as a special exception, the source code distributed need
not include anything that is normally distributed (in either source
or binary form) with the major components (compiler, kernel, and so
on) of the operating system on which the executable runs, unless
that component itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this
License. However, parties who have received copies, or rights,
from you under this License will not have their licenses terminated
so long as such parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify
or distribute the Program or its derivative works. These actions
are prohibited by law if you do not accept this License.
Therefore, by modifying or distributing the Program (or any work
based on the Program), you indicate your acceptance of this License
to do so, and all its terms and conditions for copying,
distributing or modifying the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject
to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted
herein. You are not responsible for enforcing compliance by third
parties to this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent
issues), conditions are imposed on you (whether by court order,
agreement or otherwise) that contradict the conditions of this
License, they do not excuse you from the conditions of this
License. If you cannot distribute so as to satisfy simultaneously
your obligations under this License and any other pertinent
obligations, then as a consequence you may not distribute the
Program at all. For example, if a patent license would not permit
royalty-free redistribution of the Program by all those who receive
copies directly or indirectly through you, then the only way you
could satisfy both it and this License would be to refrain entirely
from distribution of the Program.
If any portion of this section is held invalid or unenforceable
under any particular circumstance, the balance of the section is
intended to apply and the section as a whole is intended to apply
in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of
any such claims; this section has the sole purpose of protecting
the integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is
willing to distribute software through any other system and a
licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed
to be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces,
the original copyright holder who places the Program under this
License may add an explicit geographical distribution limitation
excluding those countries, so that distribution is permitted only
in or among countries not thus excluded. In such case, this
License incorporates the limitation as if written in the body of
this License.
9. The Free Software Foundation may publish revised and/or new
versions of the General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies a version number of this License which applies to
it and "any later version", you have the option of following the
terms and conditions either of that version or of any later version
published by the Free Software Foundation. If the Program does not
specify a version number of this License, you may choose any
version ever published by the Free Software Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the
author to ask for permission. For software which is copyrighted by
the Free Software Foundation, write to the Free Software
Foundation; we sometimes make exceptions for this. Our decision
will be guided by the two goals of preserving the free status of
all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS
AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR
OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY
OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
=======================================================
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES.
Copyright (C) YYYY NAME OF AUTHOR
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
Also add information on how to contact you by electronic and paper
mail.
If the program is interactive, make it output a short notice like
this when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) YEAR NAME OF AUTHOR
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands 'show w' and 'show c' should show the
appropriate parts of the General Public License. Of course, the
commands you use may be called something other than 'show w' and 'show
c'; they could even be mouse-clicks or menu items--whatever suits your
program.
You should also get your employer (if you work as a programmer) or
your school, if any, to sign a "copyright disclaimer" for the program,
if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
SIGNATURE OF TY COON, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your
program into proprietary programs. If your program is a subroutine
library, you may consider it more useful to permit linking proprietary
applications with the library. If this is what you want to do, use the
GNU Lesser General Public License instead of this License.
Tag Table:
Node: Top221
Node: Introduction1541
Node: Purpose1727
Node: Protocol Philosophy3305
Node: Higher Level API5695
Node: Basic Terminology6596
Node: General Rules7755
Node: SSIP Commands11250
Node: Speech Synthesis and Sound Output Commands12648
Ref: SPEAK13066
Ref: SSIP KEY15832
Ref: SSIP SOUND_ICON16883
Node: Speech Output Control Commands17148
Node: Message Priority Commands19356
Node: Priority Categories20536
Node: Priority Diagram24314
Node: Priority Setting Commands25251
Node: Examples of Using Priorities25868
Node: Blocks of Messages Commands26673
Node: Parameter Setting Commands29213
Node: Information Retrieval Commands39584
Ref: list-output-modules40034
Node: Message Events Notification and Index Marking41862
Node: Why Events Notification42259
Node: Types of Events43326
Node: Events Notifications in SSIP46229
Node: Switching Notifications On and Off47855
Node: History Handling Commands49915
Node: Purpose of Message History50177
Node: Message History in SSIP51396
Node: Other Commands61279
Node: Return Codes61528
Node: Sample SSIP Dialog63013
Node: Appendices64271
Node: Key Names64589
Node: Standard Sound Icons65455
Node: Standard Voices65640
Node: GNU Free Documentation License66231
Node: GNU General Public Licence88671
End Tag Table
speech-dispatcher-0.9.1/doc/figures/ 0000755 0001750 0001750 00000000000 13372573660 014342 5 0000000 0000000 speech-dispatcher-0.9.1/doc/figures/priorities.txt 0000644 0001750 0001750 00000001210 11447133617 017201 0000000 0000000 ___________
| IMPORTANT |
`-----------'
.
/ \
/ |p| \
. . . . . . . |r| . . . . . . . . .
. message ----> |i| <---- text .
. . |o| . .
. progress ----> |r| <---- notification .
. . |i| . .
. . |t| . .
. . . . . . . |y| . . . . . . . . .
doesn't interrupt interrupts itself
itself
speech-dispatcher-0.9.1/doc/figures/priorities.png 0000644 0001750 0001750 00000027407 11447133617 017166 0000000 0000000 PNG
IHDR ° ZJą> sBITŰáOŕ IDATxíwxGúÇßel0
m\0ŕ\Ŕ-Š. Đ.r@w@|đK
L
-p H. 1B˝¸Ŕ#4ąl\0ޞôűcNHŤŐŞíŽ4ďçááYíNyWZż;ówfVËąyóćˇŢzKl+ŚNşvíZą@Řm Tm â@ƸjÍ&ą@ęHŮ´.ić;b[p-DA:Đ!"ÔA¤t u CDŠ" HčAę@ RfÓá¸ZXę3;É]l("[ u`vô8ŘäA("b]ş°Tkęďzë_ÓÖ ˇn̸Öbu'-*Đ8EˇŔżRÄŔ.3Âýż|SÇŹgüŮ3ŚNrÂĎp.;Mbc]-DÄşśAĚ ÉĆúQ?=kÉúq´
š-业oÁOÁčá_)âD`ą?>ÂŔŃň#ĆîťX+Ź"~M÷;ą-u!N
:DÄ9°ÝCaˇ1v*°¨/PśŔ0Â
:DÄţ°Ńę)ĐžcYP)"}°ËL;ÜA3úáxĆcÍŹÇŚĺS5ÇUîąfÝq!$ąŠ w_ĆąDŚNňŹq:Đ!"öÇlT3k#Ń.ČÜr^;¨RÄš@H;Ćî1kŕNc
sąô^¸?ZW&âÔ CDěëÜts* u`ąŘD\ l!"ÔA¤t u CDŠ" HčAęŔ°WćŰo6űÍfą@§[ u0Z-ĆÓ" `AD:DA:Đ!"ŇĺŃŁGbĐ:DD˘üňË/óçĎŰ
.pP(}úôšvíÚýű÷Ĺ6ĄtDiذayyyAAŻŻŻŘś ´]fD\ştééÓ§ZvĹbŰP:DD,]şüë_˙×*°ËH??żÇLĆTTTÖŤWOl*Ŕ""9ţřăâ
ÝänvĂ
b[Đ:DDr,Y˛ ž6í"`Ë-"P:DDrěŮł şýšóčC ŕęŐŤb[Đ:DDZ=x Sg5áULVSSóĂ?mBčią|ůrxŐoŰŠ\.o
ëׯŰ.
Đ!"ŇÄŮt&ę çĎÓ&Đ!"˘şşúćÍ đÎä̤żbŚ˘˘âôéÓ˘P:DDBlذAŁŃşťËűîNÎ4Tx5i 8e t 6ÚFčě7¤ =zTŞ@H+WŽ ŔčőONM ĹĹĹŮŮŮâ
P:DD*üđĂjľZ&8H˙|ŚžţJx° ""HlMćršáî¸=úĆŔž}űD0Ą tT ą5CG%_ô ČËËSŠTB
Đ:DD>}ş˘˘aIe|ľUt¸WĂ °lŮ2ÁMC("" HTMf
^Ź bťĆ Ŕ?ţ(¨Ye CD$Ş!6ŹLúűH ¸uëVeeĽpf!ěěěââbxaĂĘ+}ăęy¸kľÚľk×
hBčń!ń4žţĘ&M8ľi ß|ó@f!ôOÓŁO,w˛żL
׎]Óh4B
Đ:DDdT*U^^ Lý§Éţ2áqýÝÜdjľzÇP:DDdH$WâÚSĘd˛°¨? î˛8tČHUc×˙Ň ._žěXZAIeeĺ[ˇŕYTY&NÁ0Leeĺ#GlB#č1YťvVŤçáţJß8>éë7đl +WŽt°i CDÄÄĐíFy2pXO 8yň¤ŁlB(""ćÚľk 0öíĄüs
JKK˙ýď;Ę2VĐ!"˘ącÇľZíć&>n ˙\ýü} 99ŮaŚ!
=ő'̲ç°Wż 8pŕCĚB(""$zfŘŘţf|'é/ ˙đáCű
P:DD9RYYÉ0Ě[ď°4ořK/zű4ĽK:Ŕ4^Đ!"â°jŐ* h\ż§Ůşˇ]ťvŮŮ,nĐ!"âpâÄ xCcf;wîŮÓ,nĐ!""đď˙ť´´ĹĐXAÂ+í=<ëiľÚŐŤWŰŐ4jĐ!""@"fü}úY]HL§V °}űvť
P:DDHÄąń_ëׯăň˝@ÍĂóóóáYôŐŃŰMîV[[ťeËűXP:DDhHʎÂ+üĽMĽ b:1täŘ LŮş lܸŃaĆ"t+˙J{4yÚË ÄtČÓ^&˙X}âń --Í1"Ô˛˛˛;wî ŔŰ˙m61qşcc8nňëĂTWW˙úëŻöľĄt Ź^˝ZŤŐzxz$ô`ińY§g˝ĐCHąś čA!Q2m;ždŻ˝ńg 8}ú´˝
Dh""ćúőë 0~ň0>éőűČDO4N3yÖX (++KOOˇ˝ CDcË-ľľľnrˇ!#űđIOtCňŐŻż20ŘpyDÄ CDÄÇDśjÁDÝ(3GŢťŔáĂmˇĄtpřáă-Xď${÷î١d6Đ!"ą˙ţęęjaĆOyĂlbý¨lł˙Ö̧7 ,Y˛Äv;AÄ_| Ą/xzÖ3X×Sćî,ëčŇł# ěŢ˝ŰF#ĘA!Q2vgňĚ1 p˙ţ}˛ŞX:DDŇÓÓÉJŽ$JĆîtŽßŔSŤŐâö- CD,čěďëŻtPíc_;w:¨|Đ!"BpčĐ!xă Ţú dggŤŐjÇŐ¸6čsďŢ˝xă ë)wk4M69ŽÄľA8
ăÓČűOaÍř¤7XcID^j )))6P\l×DĂtéŃgzÝbÄ ňźŃ]ů=+##Ă*3[)--˝˙> L5ĆŇźüă ŁßzM&ŐÔÔ¤ŚŚZZ śGłrĺJV Ż&LdMŕ^O~ŻęźEevxaŕý;y ÖŽ];dČĘDŔ"âhŁ5sýěŮłöŻĄ tcÉĘĘŇ`˙ţýś<}útS%?}úÔ^ö#T]fD4a=Ż?žL,RÄjĐ!"Ý"čäŘącŢŢŢmŰśË-~ÂóóóľZm@@ Ă0xLŰ1čdüüüźźźÚÚZ<ĆcSÚ7ćĆ<ŕţŔ ŕ^OŽżŘM§¸oß> `&44třđá,ŘłgĎ;w4YŤ<== ˘˘Š:öđđ ˙9ÄĆë^âŤT*ڎîŘßßg˝ÖŮc\>÷yÇÝ96JĽ:}úôćÍ˙ůĎ4( @.7jÔ¨°°Ov#˘VŤ
3ný)ĘnÝşM6퍯ž:ţ|YYqĆĐĐĐŔŔ@ňG˘ÜźyóŔŔŔĘĘJÖóĆÇ$
IoF˙źńąu6*ť.îô|Ę7uďüË7őÝZ$Ď˙:ţţţ2lvĄÜ¸qcťó/híüˡ4˝uÇnnn|ęĺoţwb\>÷yÇÝWYYY˝ző
nĐŁşşúÖ[7nܸqăĆőë×ÉAaaĄąÇIJJňőő5>/<+VŹ8p ťťűęŐŤłłłŻ\šňűďż