\input texinfo   @c -*-texinfo-*-
@c %**start of header
@documentencoding ISO-8859-2
@documentlanguage cs
@setfilename speech-dispatcher-cs.info
@settitle Speech Dispatcher
@finalout
@c @setchapternewpage odd
@c %**end of header

@syncodeindex pg cp
@syncodeindex fn cp
@syncodeindex vr cp

@include version-2.texi

@dircategory Sound
@dircategory Development

@direntry
* Speech Dispatcher cs: (speechd-cs).     Speech Dispatcher (in Czech).
@end direntry

@titlepage
@title Speech Dispatcher
@subtitle Zvládnutí Babylonu TTS'
@subtitle pro Speech Dispatcher @value{VERSION}
@author Tom@'a@v{s} Cerha <@email{cerha@@brailcom.org}>
@author Hynek Hanke <@email{hanke@@volny.cz}>
@author Milan Zamazal <@email{pdm@@brailcom.org}>

@page
@vskip 0pt plus 1filll

Tento manuál se vzathuje ke Speech Dispatcher, verze @value{VERSION}.  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 @copyright{} 2001, 2002, 2003, 2006 Brailcom, o.p.s.

@quotation
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''.
@end quotation

@end titlepage

@ifnottex
@node Top, Úvod, (dir), (dir)

Tento manuál se vzathuje ke Speech Dispatcher, verze @value{VERSION}.  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 @copyright{} 2001, 2002, 2003 Brailcom, o.p.s.

@quotation
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''.
@end quotation
@end ifnottex

@ifhtml
@heading Menu
@end ifhtml

@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::           
@end menu

@node Úvod, Uživatelská dokumentace, Top, Top
@chapter Ú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?
@end menu

@node Motivace, Základní design, Úvod, Úvod
@section Motivace
@cindex Hlavní myšlenky, Motivace
@cindex Filosofie

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...

@node Základní design, Přehled základních rysů, Motivace, Úvod
@section Základní design
@cindex 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ý @code{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{figures/architecture,155mm,,Architektura Speech Dispatchera}

Detailní popis programování klientů i serveru je k dispozici v anglickém
manuálu.

@node Přehled základních rysů, Současný stav, Základní design, Úvod
@section Přehled základních rysů

Speech Dispatcher z pohledu uživatele:

@itemize @bullet
@item snadná konfigurace různých mluvících aplikací, centrální správa
@item možnost volně rozhodovat, jaká aplikace bude mluvit s jakým syntetizérem
@item méně času věnovaného konfiguraci a ladění různých aplikací využívajících syntézu
@item historie zpráv pro zrakově postižené uživatele
@end itemize

Speech Dispatcher z pohledu programátora aplikace:

@itemize @bullet
@item snadná cesta, jak aplikaci rozmluvit
@item jednotné rozhraní k různým syntetizérům
@item synchronizace zpráv na vyšší úrovni (kategorizace pomocí priorit)
@item možnost nemuset se starat o konfiguraci parametrů hlasu
@end itemize

@node Současný stav,  , Přehled základních rysů, Úvod
@section Současný stav
@cindex Syntetizéry
@cindex Ostatní programy

TODO:

@node Uživatelská dokumentace, GNU General Public License, Úvod, Top
@chapter 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
@end menu

@node Základní funkce, Spouštění, Uživatelská dokumentace, Uživatelská dokumentace
@section 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  
@end menu

@node Model priorit zpráv, Historie zpráv, Základní funkce, Základní funkce
@subsection Model priorit zpráv
@cindex priority

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::    
@end menu

@node Typy priorit, Diagram priorit, Model priorit zpráv, Model priorit zpráv
@subsubsection 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).

@subsubheading Priorita @code{important}
@cindex 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 @code{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 @code{message} a @code{text}) než již nečekají na přeříkání
žádné zprávy priority @code{important}, nebo jsou zahozeny (priority
@code{notification} a @code{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.

@subsubheading Priorita @code{message}
@cindex Priorita message

Tato zpráva bude přeříkána, pokud již ve frontě nečeká žádná jiná zpráva
priority @code{important} nebo @code{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
@code{message} nezastavuje sama sebe.  Když ve frontě čekají zprávy priorit
@code{notification} nebo @code{progress} nebo @code{text} když přijde zpráva
priority @code{message}, jsou zahozeny.

@subsubheading Priorita @code{text}
@cindex Priorita text

Tato zpráva bude přeříkána, když ve frontě nečeká žádná zpráva priority
@code{important} nebo @code{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 @code{notification} nebo @code{progress}
nebo se právě přeříkávají, jsou zahozeny.

@subsubheading Priorita @code{notification}
@cindex Priorita notification

Toto je zpráva nízké priority.  Pokud ve frontě čekají zprávy priorit
@code{important}, @code{messages}, @code{text} nebo @code{progress} nebo jsou
právě přeříkávány, tato nová zpráva priority @code{notification} je zrušena.

Tato priorita přerušuje sama sebe, takže když přijde najednou více zpráv s
prioritou @code{notification}, přeříká se pouze poslední z nich.

@subsubheading Priority @code{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ř.@ @code{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 @code{notification} s výjimkou dvou věcí.

@itemize
@item
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.
@item
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 @code{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 @code{message}.
@end itemize

@node Diagram priorit, Příklady využití priorit, Typy priorit, Model priorit zpráv
@subsubsection Diagram priorit

@image{figures/priorities,,,Speech Dispatcher architecture}
@c TODO: Generate a pdf version. (Why? -- Hynek Hanke)

@node Příklady využití priorit,  , Diagram priorit, Model priorit zpráv
@subsubsection Příklady využití priorit

Příklady použití priority @code{important} jsou:
 
@itemize
@item chybové hlášky
@item velmi důležité zprávy
@item ...
@end itemize

Příklady použití priority @code{message} jsou:

@itemize
@item běžné zprávy programu
@item varování
@item ...
@end itemize

Příklady použití priority @code{text} jsou:

@itemize
@item text, na kterém uživatel pracuje
@item předčítaný text
@item položky menu
@item ...
@end itemize

Příklady použití priority @code{notification} jsou:

@itemize
@item méně důležité informace
@item písmenka při vkládání
@item run-time nápověda
@item ...
@end itemize

Příklady použití priority @code{progress} jsou:

@itemize
@item ``dokončeno 15%'', ``dokončeno 16%'', ``dokončeno 17%''
@item ``Načítám zvuky'', ``Načítám grafiku'', ``Načítám ai'', ...
@end itemize

@node Historie zpráv, Více výstupních modulů, Model priorit zpráv, Základní funkce
@subsection Historie zpráv
@cindex history

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
@end menu

@node Přístupová práva,  , Historie zpráv, Historie zpráv
@subsubsection Access Rights
@cindex 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:

@itemize @bullet
@item
Všechny zprávy přijaté od určitého klientského spojení jsou tomuto spojení
přístupny i v historii.

@item
Všechny zprávy odeslané určitým uživatelem jsou tomuto uživateli přístupny i v
historii.

@item
@cindex @code{speechd} uživatel
@cindex @code{speechd} skupina
Všechny zprávy zaslané uživatelem @code{speechd} jsou přístupny všem uživatelům
na daném systému, pod kterým běží Speech Dispatcher ve skupině @code{speechd}.

@item
Žádné další zprávy nejsou přístupné.
@end itemize

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 @ref{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é.

@node Více výstupních modulů, Autentifikace uživatelů, Historie zpráv, Základní funkce
@subsection Více výstupních modulů
@cindex výstupní modul
@cindex syntetizátory

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 @file{speechd.conf}.

@node Autentifikace uživatelů,  , Více výstupních modulů, Základní funkce
@subsection Autentifikace uživatelů
@cindex Identification Protocol
@cindex identd
@cindex RFC 1413

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.

@cindex mapování uživatlů
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 @ref{Historie zpráv}).

@node Spouštění, Konfigurace, Základní funkce, Uživatelská dokumentace
@section Invoking

@subsection 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:

@itemize
@item
Speech Dispatcher vytváří PID file standardně ve
@file{/var/run/speech-dispatcher.pid}, takže @file{/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
@code{pidpath} při volání skriptu @code{./configure} při kompilaci.
@item
Když je zapnuto logování, výchozí cesta, kam Speech Dispatcher zapisuje svůj
log, je @file{/var/log/speech-dispatcher.log}.  To ale může být kdykoliv
přenastaveno v hlavním konfiguračním souboru.
@end itemize

@subsection Volby příkazové řádky

Speech Dispatcher může být spuštěn s těmito volbami:

@code{speech-dispatcher [-@{d|s@}] [-l @{1|2|3|4|5@}] [-p=port] | [-v] | [-h]}

@table @code
@item -d or --run-daemon
Spustí program jako démona (běží v pozadí, odpojí se od terminálu, atd.)  Toto
je výchozí chování.

@item -s or --run-single
Spustí program jako běžnou aplikaci běžící na popředí.

@item -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. @xref{Ú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í.

@item -p or --port
Zadá port, na kterém by měl server čekat na klienty.  Výchozí je 6560.

@item -v or --version
Vypíše informace o verzi Speech Dispatchera.  Také oznámí základní informace o
copyrightu.

@item -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.
@end table


@node Konfigurace,  , Spouštění, Uživatelská dokumentace
@section konfigurace
@cindex 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í::             
@end menu

@node Syntaxe konfiguračního souboru, Volby v konfiguraci, Konfigurace, Konfigurace
@subsection 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 (@code{a}, @code{b}, ...), pomlčky (@code{-}) a podtržítka @code{_}.

Komentáře a dočasně neaktivní volby začínají znakem @code{#}.  Pokud chcete
takovu volbu zapnout, stačí smazat znak komentáře a nastavit volbu na
požadovanou hodnotu.
@example
# toto je komentar
# InactiveOption "tato volba je zatim vypla komentarem"
@end example

Řetězce jsou uzavřeny v uvozovkách.
@example
LogFile  "/var/log/speech-dispatcher.log"
@end example

Čísla jsou zapsána bez uvozovek.
@example
Port 6560
@end example

Přepínače používají On (zapnuto) a Off (vypnuto).
@example
Debug Off
@end example

@node Volby v konfiguraci, Nastavení výstupních modulů, Syntaxe konfiguračního souboru, Konfigurace
@subsection 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 @code{#}.

@node Nastavení výstupních modulů, Úrovně logování, Volby v konfiguraci, Konfigurace
@subsection 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 @file{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::  
@end menu

@node Natahování modulů ve speechd.conf, Konfigurační soubory výstupních modulů, Nastavení výstupních modulů, Nastavení výstupních modulů
@subsubsection Natahování modulů ve speechd.conf

@anchor{AddModule} Každý modul, který by se měl spustit při startu Speech
Dispatchera, musí být natažen příkazem @code{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ů.  @xref{Konfigurace generického
výstupního modulu}.

@example
AddModule "@var{module_name}" "@var{module_binary}" "@var{module_config}"
@end example

@var{module_name} je jméno daného výstupního modulu.

@var{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
@file{bin/speechd-modules/}.

@var{module_config} je soubor s konfigurací pro tento konkrétní výstupní modul.
Cesta může být absolutní i relativní k @file{etc/speech-dispatcher/modules/}.
Tento parametr je volitelný (není třeba jej uvádět).

@node Konfigurační soubory výstupních modulů, Konfigurace generického výstupního modulu, Natahování modulů ve speechd.conf, Nastavení výstupních modulů
@subsubsection 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é.

@table @code
@item AddVoice "@var{language}" "@var{symbolicname}" "@var{name}"
@anchor{AddVoice}

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 @code{AddVoice}.

@var{language} je ISO kód jazyka tohoto hlasu (en, cs, de, en-US, ...)

@var{symbolicname} je symbolické jméno, pod kterým chcete, aby byl tento hlas
dostupný.  @xref{Standardní hlasy}, pro seznam symbolických jmen, která můžete
použít.

@var{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:

@example
        AddVoice        "cs"  "male1"   "kadlec"
        AddVoice        "sk"  "male1"   "bob"
@end example

@item ModuleDelimiters "@var{delimiters}", ModuleMaxChunkLength @var{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
(@var{delimiters}) by se měl text rozdělit na menší části (pokud jsou
následovány nějakým whitespace znakem).  Druhá volba (@var{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 @var{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 @code{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:

@example
    FestivalMaxChunkLength  300
    FestivalDelimiters  ".?!;,:"
@end example

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).
@end table

@node Konfigurace generického výstupního modulu,  , Konfigurační soubory výstupních modulů, Nastavení výstupních modulů
@subsubsection 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.  @xref{AddModule}.

Klíčová část každého generického výstupního modulu je definice řetězce, který
se má spouštět.

@defvr {Konfigurace generického modulu} GenericExecuteSynth "@var{execution_string}"

@code{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 @code{&&}.  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 @code{play})

V @code{execution_string} můžete využít těchto proměnných, které budou
nahrazeny pořadovanými hodnotami, než bude příkaz vykonán.

@itemize
@item @code{$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: @code{\"$DATA\"}).
@item @code{$LANG}
Identifikační řetězec jazyka (ten je definován pomocí GenericLanguage).
@item @code{$VOICE}
Identifikační řetězec hlasu (ten je definován pomocí AddVoice).
@item @code{$PITCH}
Požadovaná výška hlasu (desetinné číslo definované v GenericPitchAdd a v
GenericPitchMultiply)
@item @code{$RATE}
Požadovaná rychlost hlasu (desetinné číslo definované v GenericRateAdd a v
GenericRateMultiply)
@end itemize

Tady je příklad z @file{etc/speech-dispatcher/modules/epos-generic.conf}
@example
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"
@end example
@end defvr

@defvr {Konfigurace generického modulu} AddVoice "@var{language}" "@var{symbolicname}" "@var{name}"
@xref{AddVoice}.
@end defvr

@defvr {Konfigurace generického modulu} GenericLanguage "iso-code" "string-subst"

Definuje, jaký řetězec @code{string-subst} by měl být nahrazen za @code{$LANG}
pro daný @code{iso-code} ISO kód jazyka.

Opět příklad z Epos generic:
@example
GenericLanguage "en-US" "english-US"
GenericLanguage "cs" "czech"
GenericLanguage "sk" "slovak"
@end example
@end defvr

@defvr {Konfigurace generického modulu} GenericRateAdd @var{num}
@end defvr
@defvr {Konfigurace generického modulu} GenericRateMultiply @var{num}
@end defvr
@defvr {Konfigurace generického modulu} GenericPitchAdd @var{num}
@end defvr
@defvr {Konfigurace generického modulu} GenericPitchMultiply @var{num}
Tyto parametry nastavují konverzi pro výpočet rychlosti a výšky.
(@code{$RATE} a @code{$PITCH}). 

Výsledná rychlost (nebo výška) je dána následujícím vzorcem:
@example
   (speechd_rate * GenericRateMultiply) + GenericRateAdd
@end example
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.)
@end defvr

@node Úrovně logování,  , Nastavení výstupních modulů, Konfigurace
@subsection Ú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.

@itemize @bullet

@item Úroveň 0
@itemize @bullet
@item Žádné informace
@end itemize

@item Úroveň 1
@itemize @bullet
@item Informace o startu a vypínání.
@end itemize

@item Úroveň 2
@itemize @bullet
@item Informace o chybách, které nastaly.
@item Alokace a uvolňování zdrojů při startu a při exitu.
@end itemize

@item Úroveň 3
@itemize @bullet
@item Informace o přijímání/odepírání/zavírání klientských spojení.
@item Informace o neplatných SSIP příkazech od klientů.
@end itemize

@item Úroveň 4
@itemize @bullet
@item Je vypisován každý přijatý příkaz
@item Informace o zpracovávání vstupu
@item Informace o ukládání zpráv do front
@item Informace o fungování historie, zvukových ikon, atd.
facilities.
@item Informace o práci vlákna speak()
@end itemize

@item Úroveň 5
(Ta slouží pouze pro ladící účely a může vypisovat opravdu *mnoho*
dat. Používejte opatrně.)
@itemize @bullet
@item Všechna obdržená data jsou vypisována (zprávy od klientů)
@item Ladící informace.
@end itemize
@end itemize

@appendix Standardní hlasy
@anchor{Standardní hlasy}

@table @code
@item MALE1
@item MALE2
@item MALE3
@item FEMALE1
@item FEMALE2
@item FEMALE3
@item CHILD_MALE
@item CHILD_FEMALE
@end table

Skutečná dostupnost těchto hlasů není zaručena, ale příkaz @code{SET SELF
VOICE} musí akceptovat jakýkoliv z nich.  Pokud není daný hlas dostupný, je
mapován na jiný hlas výstupním modulem.

@node GNU General Public License, GNU Free Documentation License, Uživatelská dokumentace, Top
@appendix GNU General Public License
@center Version 2, June 1991
@cindex GPL, GNU General Public License

@include gpl.texi


@node GNU Free Documentation License, Index of Concepts, GNU General Public License, Top
@appendix GNU Free Documentation License
@center Version 1.2, November 2002
@cindex FDL, GNU Free Documentation License

@include fdl.texi

@node Index of Concepts,  , GNU Free Documentation License, Top
@unnumbered Index of Concepts

@cindex tail recursion
@printindex cp

@bye

@c  LocalWords:  texinfo setfilename speechd settitle finalout syncodeindex pg
@c  LocalWords:  setchapternewpage cp fn vr texi dircategory direntry titlepage
@c  LocalWords:  Cerha Hynek Hanke vskip pt filll insertcopying ifnottex dir fd
@c  LocalWords:  API SSIP cindex printf ISA pindex Flite Odmluva FreeTTS TTS CR
@c  LocalWords:  src struct gchar gint const OutputModule intl FDSetElement len
@c  LocalWords:  fdset init flite deffn TFDSetElement var int enum EVoiceType
@c  LocalWords:  sayf ifinfo verbatiminclude ref UTF ccc ddd pxref LF cs conf
@c  LocalWords:  su AddModule DefaultModule xref identd printindex Dectalk GTK

@c speechd.texi ends here
@c  LocalWords:  emph soundcard precission archieved succes
