File: speech-dispatcher-cs.texi

package info (click to toggle)
speech-dispatcher 0.12.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 36,616 kB
  • sloc: ansic: 27,757; sh: 5,884; python: 1,224; makefile: 1,039; lisp: 583; cpp: 404
file content (897 lines) | stat: -rw-r--r-- 37,225 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
\input texinfo   @c -*-texinfo-*-
@c %**start of header
@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

@tex
\gdef\putwordAppendix{Pøílohy}
@end tex

@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 vztahuje 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 modifikovat 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

@shortcontents
@contents

@ifnottex
@node Top, Úvod, (dir), (dir)
@top Speech Dispatcher

Tento manuál se vztahuje 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 modifikovat 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

* Standardní hlasy::            Standardní hlasy
* 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 ješ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{/usr/share/doc/speech-dispatcher/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  
* Autentizace uživatelů::     Autentizace 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řeruš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{/usr/share/doc/speech-dispatcher/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řijaty 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{Autentizace 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ů, Autentizace uživatelů, Historie zpráv, Základní funkce
@subsection Více výstupních modulů
@cindex výstupní modul
@cindex syntezá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ýstupního modulu mohou být
ovlivněna v konfiguračním souboru @file{speechd.conf}.

@node Autentizace uživatelů,  , Více výstupních modulů, Základní funkce
@subsection Autentizace 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í autentizační mechanismus.  K
ověření identity uživatelů používáme Identification Protocol definovaný v RFC
1413.

@cindex mapování uživatelů
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í konfigurace 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 vypnuta 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é syntezátory, např. Festival, podporují symbolická jména
SSIP přímo, takže konfigurace konkrétních hlasů se provádí v syntezá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časnosti používáme pro Epos (generic) vypadá
takto:

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

@item GenericDelimiters "@var{delimiters}", GenericMaxChunkLength @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{$LANGUAGE}
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 $LANGUAGE --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{$LANGUAGE}
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

@node Standardní hlasy, GNU General Public License, Úrovně logování, Top
@appendix 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 precision archieved succes