Browse Source

[1.42.02]


git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@231 d46cf337-b52f-0410-862d-fd96e6ae7743
master
jonsd 15 years ago
parent
commit
e404310b8f
83 changed files with 3299 additions and 1637 deletions
  1. 7
    2
      dictsource/da_list
  2. 46
    12
      dictsource/da_rules
  3. 80
    65
      dictsource/de_list
  4. 74
    30
      dictsource/de_rules
  5. 24
    22
      dictsource/dict_phonemes
  6. 33
    16
      dictsource/en_list
  7. 88
    70
      dictsource/en_rules
  8. 3
    3
      dictsource/fr_rules
  9. 1
    1
      dictsource/hi_rules
  10. 290
    43
      dictsource/hu_list
  11. 523
    154
      dictsource/hu_rules
  12. 52
    5
      dictsource/no_list
  13. 1
    11
      dictsource/no_rules
  14. 121
    0
      dictsource/pap_list
  15. 139
    0
      dictsource/pap_rules
  16. 96
    70
      dictsource/pt_list
  17. 757
    717
      dictsource/pt_rules
  18. 15
    9
      dictsource/ta_list
  19. 215
    76
      dictsource/ta_rules
  20. 15
    8
      docs/commands.html
  21. 13
    6
      docs/dictionary.html
  22. 27
    19
      docs/index.html
  23. 20
    19
      phsource/compile_report
  24. BIN
      phsource/d/tap2
  25. BIN
      phsource/n/nr@
  26. BIN
      phsource/n/nra
  27. BIN
      phsource/n/nre
  28. BIN
      phsource/n/nri
  29. BIN
      phsource/n/nro
  30. BIN
      phsource/n/nru
  31. 1
    19
      phsource/ph_danish
  32. 12
    2
      phsource/ph_english
  33. 0
    9
      phsource/ph_english_us
  34. 1
    1
      phsource/ph_german
  35. 7
    0
      phsource/ph_hungarian
  36. 24
    5
      phsource/ph_pt_brazil
  37. BIN
      phsource/vnasal/a#_n
  38. BIN
      phsource/vowel/a#_3
  39. BIN
      phsource/vowel/a_5
  40. BIN
      phsource/vowel/e_8
  41. BIN
      phsource/vowel/e_9
  42. BIN
      phsource/vowel/ii_2
  43. BIN
      phsource/vowel/o_8
  44. BIN
      phsource/vowel/vowelchart.png
  45. BIN
      phsource/vwl_fr/_r
  46. BIN
      phsource/vwl_fr/r
  47. BIN
      phsource/vwl_fr/r_
  48. BIN
      phsource/vwl_fr/r_@
  49. BIN
      phsource/vwl_fr/r_a
  50. BIN
      phsource/vwl_fr/r_i
  51. BIN
      phsource/vwl_fr/r_o
  52. BIN
      phsource/vwl_fr/r_u
  53. BIN
      phsource/vwl_fr/r_y
  54. BIN
      phsource/vwl_fr/ra
  55. BIN
      phsource/vwl_fr/re
  56. BIN
      phsource/vwl_fr/ri
  57. BIN
      phsource/vwl_fr/ro
  58. BIN
      phsource/vwl_fr/ru
  59. BIN
      phsource/vwl_fr/ry
  60. BIN
      phsource/vwl_fr/tr
  61. BIN
      phsource/vwl_fr/xr
  62. 20
    8
      platforms/windows/make_espeak.iss
  63. 1
    1
      platforms/windows/make_espeakedit.iss
  64. 22
    23
      platforms/windows/windows_dll/src/speak_lib.h
  65. 1
    0
      platforms/windows/windows_dll/src/speech.h
  66. 5
    5
      platforms/windows/windows_sapi/version.rc2
  67. 38
    6
      src/compiledict.cpp
  68. 72
    59
      src/dictionary.cpp
  69. 2
    1
      src/espeakedit.cpp
  70. 3
    3
      src/intonation.cpp
  71. 1
    1
      src/menus.cpp
  72. 88
    46
      src/numbers.cpp
  73. 1
    0
      src/phoneme.h
  74. 99
    4
      src/readclause.cpp
  75. 2
    2
      src/setlengths.cpp
  76. 39
    1
      src/speak_lib.cpp
  77. 1
    1
      src/speak_lib.h
  78. 14
    2
      src/synthdata.cpp
  79. 51
    12
      src/synthesize.cpp
  80. 28
    13
      src/tr_languages.cpp
  81. 96
    45
      src/translate.cpp
  82. 26
    7
      src/translate.h
  83. 4
    3
      src/voices.cpp

+ 7
- 2
dictsource/da_list View File


// This file is UTF8 encoded // This file is UTF8 encoded
// Spelling-to-phoneme words for Danish // Spelling-to-phoneme words for Danish


÷ divid'eReD meD ÷ divid'eReD meD
= l'imeD = l'imeD
# n'OmV # n'OmV
§ paragr'af
§ paragR'af






egne a:in@ egne a:in@
enter entV enter entV
ide id'e // idea ide id'e // idea
idé id'e // idea
igen igen igen igen
Ny ny // new Ny ny // new
også Vs@ // also også Vs@ // also
havde h'aD@ // had havde h'aD@ // had
idet id'e // in so far as
sagde sa@ // said sagde sa@ // said
sig sAi // oneself sig sAi // oneself
//slags sl+ags // sort, type
tre tr'e // the number 3






+ 46
- 12
dictsource/da_rules View File

au (K au au (K au
ch) au (f o ch) au (f o
nive) au o nive) au o
an (cienn aN
aw (K aw aw (K aw
ay (K aj ay (K aj
aa O: aa O:
al) d (er al) d (er
al) d (et al) d (et
al) d (o d al) d (o d
al) d (rig d
an) d (re d an) d (re d
An) d (rA d An) d (rA d
An) d (re d An) d (re d
be) d (A d be) d (A d
be) d (es D
bu) d (get bu) d (get
bu) d (t bu) d (t
ej) d (e d ej) d (e d
in) d (u d in) d (u d
in) d (uC d in) d (uC d
in) d (ue d in) d (ue d
la) d (t
le) d (t le) d (t
li) d (e D li) d (e D
li) d (s D li) d (s D
or) d (ning d or) d (ning d
or) d (re d or) d (re d
or) d (ret or) d (ret
pu) d (s
pæ) d (a d pæ) d (a d
ro) d (s
ry) d (ni D
re) d (a d re) d (a d
re) d (i d re) d (i d
ri) d (e D ri) d (e D
rø) dd (er D rø) dd (er D
si) d (e D si) d (e D
si) dd (e D
si) d (eA D si) d (eA D
si) d (eC D si) d (eC D
ti) d (e D ti) d (e D
ud) d d ud) d d
ur) d (e d ur) d (e d
ve) d (h D ve) d (h D
ve) d (t D
vi) d (e D vi) d (e D
vi) d (er D vi) d (er D
yl) d (er yl) d (er
ær) d (es d
æl) d (e æl) d (e
æl) d (i d æl) d (i d
æl) d (re d æl) d (re d
kla) dd (e D kla) dd (e D
kry) dd (er D kry) dd (er D
dd (et D dd (et D
pu) d (s
ro) d (s
ry) d (ni D
ær) d (es d
bla) d (r D bla) d (r D
dar) d d dar) d d
gui) de d gui) de d
mad) d (A D mad) d (A D
plu) d (se plu) d (se
ral) d (e ral) d (e
sag) d (e
sku) d (t
smu) d (s smu) d (s
snu) d (e D snu) d (e D
Aor) d (ret d Aor) d (ret d
ver) d (en d ver) d (en d
sli) d (so D sli) d (so D
sli) d (s sli) d (s
skræ) dd (e D
kandi) d (at 'd
tilfre) d (s tilfre) d (s




g) e (C e g) e (C e
g) e (js aj g) e (js aj
em) e (nt a em) e (nt a
plem) e (nter e
cem) e (nt e
elem) e (nt e elem) e (nt e
plem) e (nter e
em) e (ntal e em) e (ntal e
glem) e (nt a glem) e (nt a
glem) e (ntal e glem) e (ntal e
ni) e ni) e
ni) e (n e ni) e (n e
niv) e (au
bur) eau 'o
niv) eau 'o
ani) e (l e ani) e (l e
lini) e e lini) e e
r) e (_ V% r) e (_ V%
en (gage aN en (gage aN
en (tre aN en (tre aN
c) en (t en c) en (t en
c) en (tA en
c) en (tC en
p) en (sion aN p) en (sion aN
r) en (ce aN r) en (ce aN
r) eg (n A:j r) eg (n A:j
ika) e (l ika) e (l
ir) e (n 'e ir) e (n 'e
yr) e (n 'e yr) e (n 'e
ompet) en (ce aN




.group f .group f
i) g (t_ i) g (t_
i) g i) g
i) g (A i) g (A
i) g (a g
i) g (en g i) g (en g
i) g (ere g i) g (ere g
i) g (i g i) g (i g
ø) g (e ø) g (e
ø) g (n ø) g (n
æ) g (e j æ) g (e j
g (iv+ g // avoid letter "g" pronounced with phoneme S
Ca) g (en j Ca) g (en j
ha) g (l u
in) ge (niør Se in) ge (niør Se
ki) gg (e g ki) gg (e g
la) g (C u
la) g (t g
la) gde e
li) g (ere li) g (ere
ra) g (_ w ra) g (_ w
ra) g (e w ra) g (e w
sa) g (n u
ør) g (s ør) g (s
ur) g (A g ur) g (A g
l) g (_ j l) g (_ j
li) g (g g li) g (g g
mA) g (a g mA) g (a g
nA) g (a g nA) g (a g
ta) g (A u
ta) g (C u
&e) g j &e) g j
an) g (å g an) g (å g
ba) g (e ba) g (e
sa) g (a =g sa) g (a =g
sa) g (s ' sa) g (s '
si) g (t g si) g (t g
va) g (n u
pli) g (t g pli) g (t g
&ti) g &ti) g
bor) g u
bud) g (et S bud) g (et S
gti) g gti) g
hol) g (er g
jer) g (A w jer) g (A w
jer) g (C w jer) g (C w
rea) g (er g rea) g (er g
t) i (on // i ommitted because of sj t) i (on // i ommitted because of sj
t) i (øs t) i (øs
s) i (on j s) i (on j
des) ign ain
ingen) i (ør ingen) i (ør




i) nd (eks nd i) nd (eks nd
i) nd (ing n i) nd (ing n
u) nd ( n u) nd ( n
bå) nd (A n
pu) n (kt pu) n (kt
ru) n (ke ru) n (ke
sa) n (kt sa) n (kt


.group r .group r
r r r r
b) r r
r (A R
ø) r V: ø) r V:
A) r r
Ae) r V Ae) r V
&) rd (e_ r &) rd (e_ r
&) rd (eKK r &) rd (eKK r


&) tt t &) tt t
&) th d &) th d
simpel) th (en th
t (ie t t (ie t
t (ion+ sj' t (ion+ sj'
t (iøs+ sj' t (iøs+ sj'
lek) t (i S lek) t (i S
emen) t emen) t
cemen) t t
elemen) t t elemen) t t
emen) t (al t emen) t (al t
glemen) t glemen) t
u (mK O u (mK O
a) u (g u a) u (g u
b) u (dget y b) u (dget y
b) u (reau y
g) ui (de ai g) ui (de ai
g) u (st O
l) u (k O? l) u (k O?
l) u (kas u l) u (kas u
m) u (k O? m) u (k O?
r) u u r) u u
r) u (m O r) u (m O
r) u (nd O? r) u (nd O?
r) u (s u
s) u (cc y
comp) u (ter ju comp) u (ter ju
fris) u (r y fris) u (r y
frit) u (r y frit) u (r y
men) u y men) u y
proced) u (re y
proven) u y
resso) u (rs 'u resso) u (rs 'u
g) u (st O
r) u (s u
s) u (cc y




.group v .group v









+ 80
- 65
dictsource/de_list View File

€ OY*o: € OY*o:
£ paUnd £ paUnd
& Unt & Unt
@ kl'ame:*,af@
@ kl'am3_,af@
~ tIld@ ~ tIld@
\ bEkslES
\ bakslaS
° g@-*A:t ° g@-*A:t


_, kOma _, kOma
_; St@-*'ICpUNkt _; St@-*'ICpUNkt
__ ,Unt3St@-*'IC __ ,Unt3St@-*'IC
_- b'IndEst@-*,IC _- b'IndEst@-*,IC
_! 'aUs_|@-*,u:fe:ts,aIC@n
_? f@-*'Age:ts,aIC@n
_' 'apOst@-*,Of
_! 'aUs_|@-*,u:f@ts,aIC@n
_? f@-*'Ag@ts,aIC@n
_' ,apo:st@-*'Of
_" tsi:t'A:t _" tsi:t'A:t
_/ S@-*'Egst@-*IC
_/ S@-*'e:gSt@-*IC
_( kl'am3||_|'aUf _( kl'am3||_|'aUf
_) kl'am3||ts'u: _) kl'am3||ts'u:
_{ g@Sv'aIft@kl'am3||_|'aUf _{ g@Sv'aIft@kl'am3||_|'aUf
_} g@Sv'aIft@kl'am3||ts'u: _} g@Sv'aIft@kl'am3||ts'u:
_[ 'EkIg@kl'am3||_|'aUf _[ 'EkIg@kl'am3||_|'aUf
_] 'ECIg@kl'am3||ts'u:
_] 'EkIg@kl'am3||ts'u:
_< klaIn3 _< klaIn3
_> g@-*Ws3
_> g@-*Y:s3
_` g@-*A:v _` g@-*A:v
_^ sI*kUmflEks
_— g@d'ank@nSt@-*,IC
_^ tsI*kUmflEks
_— g@d'aNk@nSt@-*,IC


_#9 t,abu:l'Ato:*

_#9 t,abu:l'A:to:3
_#32 l'e:*ts'aIC@n _#32 l'e:*ts'aIC@n
_?? zymb'o:l _?? zymb'o:l
_?A b'UxstA:b@
_?A b'u:xstA:b@
_cap g@-*'o:s _cap g@-*'o:s




// accent names // accent names
_lig l'i:gat,u:*
_lig l'i:gat,u:3
_acu ak'u:t _acu ak'u:t
_ac2 d'Op@l,aku:t
_brv b@-*'e:v@
_ced tse:d'Il@
_ac2 d'Op@lak,u:t
_brv b@-*'E:v@
_ced se:d'i:j
_cir ts'I*kUmflEks _cir ts'I*kUmflEks
_dia 'UmlaUt _dia 'UmlaUt
_dot p'Unkt _dot p'Unkt
_grv g@-*'AvIs
_hac h'atSe:k
_mcn m'ak@-*o:n
_ogo 'o:go:n,e:k
_rng k@-*'u:Ze:k
_stk S@-*'Egst@-*IC
_grv g@-*'A:vIs
_hac h'atSEk
_mcn m'A:k@-*On
_ogo 'o:gOn,Ek
_rng k@-*'o:wZEk
_stk S@-*'e:gst@-*IC
_tld t'Ild@ _tld t'Ild@


æ $accent æ $accent
_11 '_Elf _11 '_Elf
_12 'tsvWlf _12 'tsvWlf
_13 'd@-*aItse:n _13 'd@-*aItse:n
_14 'fi:*tse:n
_14 'fI*tse:n
_15 'fynftse:n _15 'fynftse:n
_16 'zEktse:n
_16 'zECtse:n
_17 'zi:btse:n _17 'zi:btse:n
_18 '_axttse:n
_18 '_axtse:n
_19 'nOYntse:n _19 'nOYntse:n
_2X 'tsvantsIC _2X 'tsvantsIC
_3X 'd@-*aIsIC _3X 'd@-*aIsIC
_4X 'fi:*tsIC
_4X 'fI*tsIC
_5X 'fynftsIC _5X 'fynftsIC
_6X 'zECtsIC _6X 'zECtsIC
_7X 'zi:btsIC _7X 'zi:btsIC
_8X '_axttsIC
_8X '_axtsIC
_9X 'nOYntsIC _9X 'nOYntsIC
_0C 'hUnd3t _0C 'hUnd3t
_0M1 'taUz@nt _0M1 'taUz@nt
// ordinal numbers // ordinal numbers
_ord t@ // default ending _ord t@ // default ending
_ord20 st@ // 20,30,etc _ord20 st@ // 20,30,etc
_1o _'e:*st@
_1o _'e:3st@
_3o dr'It@ _3o dr'It@
_7o z'i:bt@ _7o z'i:bt@
_8o _'axt@ _8o _'axt@


// Abbreviations // Abbreviations
//============== //==============
a.a.o A:A:o:
allg 'alg@maIn@n
a.a.o A:||A:||_o:
allg 'alg@maIn
abb 'abb,IldUN abb 'abb,IldUN
anm 'anm,E*kUN anm 'anm,E*kUN
bd band bd band
bde bEnd@ bde bEnd@
bzw b@tsi:hUNsvaIz@
chr k@-*Istu:s
dm d'OYtSm,A:*k $capital $only $abbrev
bzw b@tsi:UNsvaIz@
chr k@-*IstUs
dm d'OYtS@||m'A:*k $capital $only $abbrev
dr dOkt'o:* dr dOkt'o:*
evtl e:vEntu:'El evtl e:vEntu:'El
od o:d3 od o:d3
frl f@-*OYlaIn frl f@-*OYlaIn
hr hE* hr hE*
hrsg hE*'aUsge:b3 hrsg hE*'aUsge:b3
inkl Inklu:s'i:v@
inkl Inklu:z'i:v@
km ki:lo:me:t3 km ki:lo:me:t3
nr nUm3 nr nUm3
st 'Este: st 'Este:
des %dEs des %dEs


derselb $2 derselb $2
desselb dEss'Elb
desselb dEsz'Elb
dieselb $2 dieselb $2
dasselb dasz'Elb dasselb dasz'Elb
demselb $2 demselb $2
denn dEn $u+ $pause denn dEn $u+ $pause
weil $pause weil $pause
als $u+ $pause als $u+ $pause
bevor be:fo:* $2 $pause
bevor b@fo:* $2 $pause
also $pause also $pause
wenn ,vEn $pause $strend wenn ,vEn $pause $strend
sowie $2 $pause sowie $2 $pause
obgleich $2 $pause obgleich $2 $pause
obwohl $2 $pause obwohl $2 $pause
deren dE*@n $u+ $brk
deren de:*@n $u+ $brk


// prepositions // prepositions
ab ap $u+ $brk ab ap $u+ $brk
im Im $u+ $brk im Im $u+ $brk
ins Ins $u+ $brk ins Ins $u+ $brk
mit mIt $u+ $pause mit mIt $u+ $pause
nach nax $u+ $brk
nach nA:x $u+ $brk
ob ,Ob $pause $strend $only ob ,Ob $pause $strend $only
pro ,p@-*o: $pause pro ,p@-*o: $pause
von fOn $u+ $brk von fOn $u+ $brk
unter ,Unt3 $pause $strend unter ,Unt3 $pause $strend
um Um $u+ $brk um Um $u+ $brk
//(um die) %Umd%i: $brk //(um die) %Umd%i: $brk
//(um den) %Umd%e:m $brk
//(um den) %Umd%e:n $brk
während $pause während $pause


// misc // misc
so zo: $u+ so zo: $u+
doch dOx $u+ doch dOx $u+
noch $pause noch $pause
(noch nicht) n'Ox||n,ICt $brk
(noch nicht) n'Ox||n'ICt $brk
(nicht mehr) n'ICt||,me:* (nicht mehr) n'ICt||,me:*
(nicht mehr) n,ICt||m'e:* $atend (nicht mehr) n,ICt||m'e:* $atend
(nicht nur) n'ICt||n'u:* $pause (nicht nur) n'ICt||n'u:* $pause
ich IC $u $only ich IC $u $only
du du: $u $only du du: $u $only
er Er $u $brk $only er Er $u $brk $only
es Ez $u $only
es Es $u $only
sie zi: $u $only sie zi: $u $only
wir vi:* $u $only wir vi:* $u $only
ihr i:* $u ihr i:* $u
man man $u $only man man $u $only
sich zIC $u $only sich zIC $u $only
(es ist) %Ez%Ist
(es ist) %Es%Ist




daß das $u+ daß das $u+
seit zaIt $u $only seit zaIt $u $only


habe %hA:b@ $only habe %hA:b@ $only
habst %habst $only
habest hA:bEst $only $u
hast %hast $only hast %hast $only
hat %hat $only hat %hat $only
haben h,A:b@n $only haben h,A:b@n $only
will %vIl $only will %vIl $only
willst %vIlst $only willst %vIlst $only
wollen %vOl@n $only wollen %vOl@n $only
wolt %vOlt
wollt %vOlt


werden v,E*d@n werden v,E*d@n
werde v,E*d@ werde v,E*d@
werdst v,E*dst
wirst v,I*st
werdet v,E*d@t werdet v,E*d@t
wurden vU*d@n wurden vU*d@n
wurde vU*d@ wurde vU*d@
wurdst vU*dst
wurdest v,U*dEst
wurdet vU*d@t wurdet vU*d@t


können ,kWn@n $only können ,kWn@n $only
aid _^_EN // aids aid _^_EN // aids
appeal _^_EN appeal _^_EN
apple _^_EN apple _^_EN
association _^_EN
baseball _^_EN baseball _^_EN
bbc _^_EN bbc _^_EN
beat _^_EN beat _^_EN
cool _^_EN cool _^_EN
couch _^_EN couch _^_EN
cursor _^_EN cursor _^_EN
debugger _^_EN
dj _^_EN dj _^_EN
email _^_EN email _^_EN
ensemble _^_FR ensemble _^_FR
enterprise _^_EN
event _^_EN event _^_EN
firewall _^_EN firewall _^_EN
foul _^_EN foul _^_EN
jean _^_EN jean _^_EN
jet _^_EN jet _^_EN
job _^_EN job _^_EN
joint _^_EN
joke _^_EN joke _^_EN
joystick _^_EN joystick _^_EN
junkie _^_EN junkie _^_EN
macho _^_EN macho _^_EN
mail _^_EN mail _^_EN
message _^_EN message _^_EN
my _^_EN
mysql _^_EN
offline _^_EN offline _^_EN
online _^_EN online _^_EN
out _^_EN out _^_EN
small _^_EN small _^_EN
snob _^_EN snob _^_EN
song _^_EN song _^_EN
source _^_EN
spam _^_EN spam _^_EN
spirit _^_EN spirit _^_EN
squaw _^_EN squaw _^_EN
trip _^_EN trip _^_EN
tuner _^_EN tuner _^_EN
unix _^_EN unix _^_EN
venture _^_EN
window _^_EN window _^_EN
word _^_EN word _^_EN


andre and@-*@ // andere andre and@-*@ // andere
anomalie $2 anomalie $2
antik ant'i:k antik ant'i:k
archaik a*k'A:Ik
archaik a*C'A:Ik
arie $alt arie $alt
arpeggier a*pEdZ'i:* arpeggier a*pEdZ'i:*
arrangier a*aNZ'i:@ arrangier a*aNZ'i:@
arterie $alt arterie $alt
asphalt $2 asphalt $2
atommüll $1
ausgeschamt aUsg@SA:mt ausgeschamt aUsg@SA:mt
außerdem aUs3d'e:m
außerdem 'aUs3d,e:m
aventurin avEntu:*'i:n aventurin avEntu:*'i:n
ave A:ve:
ave A:vE


balkan $1 balkan $1
balkon $2 balkon $2
coup ku: coup ku:


dahlie $alt dahlie $alt
debatte $2
deshalb $2 deshalb $2
dezember $2 dezember $2
diadem di:ad'e:m diadem di:ad'e:m


ebendaher e:b@ndah'e:r ebendaher e:b@ndah'e:r
ebendahin e:b@ndah'In ebendahin e:b@ndah'In
ebenso $1
einander aIn'and3 einander aIn'and3
einerlei aIn@*laI einerlei aIn@*laI
einher aInh'e:r einher aInh'e:r
einig aInIC $only einig aInIC $only
einige aInIg@ $u+ einige aInIg@ $u+
einiges aInIg@s $u+ einiges aInIg@s $u+
enagier EngaZ'i:*
engagier aNgaZ'i:*
endivie $alt endivie $alt
endlich EntlIC endlich EntlIC
episkopal e:pIsko:p'A:l episkopal e:pIsko:p'A:l
ersten e:*st@n ersten e:*st@n
erstmal e:*stma:l erstmal e:*stma:l
extravagant $1 extravagant $1
extrem Ekstr'e:m
extrem Ekst@-*'e:m


feuerrot $3 feuerrot $3
friedvoll f@-*'i:tf,Ol friedvoll f@-*'i:tf,Ol
gessen gEs@n gessen gEs@n
geste ge:st@ geste ge:st@
gestern gEst3n gestern gEst3n
gestrig gEst@-*IC
glorie $alt glorie $alt
grazie $alt grazie $alt


handy handI
handy hEndi:
häuschen hOYsC@n häuschen hOYsC@n
hausier haUz'i:* hausier haUz'i:*
heimat haImat
heimat $1
herberg hE*bE*g herberg hE*bE*g
historie $alt historie $alt
hm h@m hm h@m
horsam ho:zA:m
horsam hO3zA:m
hostie $alt hostie $alt


illegitim Ile:gi:t'i:m illegitim Ile:gi:t'i:m
kastanie $alt kastanie $alt
kid kId kid kId
komödie $alt komödie $alt
konkret k%ONk@-*e:t
konservativ $1 konservativ $1
konstatier kOnStat'i:*
konsul $1 konsul $1
kurie $alt kurie $alt


lakaienhaft l%akaInhaft
lappalie $alt lappalie $alt
lilie $alt lilie $alt
logier lo:Z'i:* logier lo:Z'i:*
lucent lu:sEnt
luetisch lu:'e:tIS luetisch lu:'e:tIS


machen max@n machen max@n
menagier me:naZ'i:* menagier me:naZ'i:*
menuette mEnu:'Et menuette mEnu:'Et
minut $2 minut $2
mikrofiche maIk@-*o:fIS
mikrofiche mi:k@-*o:fi:S
miteinander $1 miteinander $1
modell mo:d'El modell mo:d'El
monoton $3 monoton $3


nebulos $3 nebulos $3
negligent ne:gli:dZ'Ent negligent ne:gli:dZ'Ent
numero $1


oberen o:b@*@n oberen o:b@*@n
oboe o:bo:@
oboe o:b'o:@
orgie $alt orgie $alt
ok o:k'e: ok o:k'e:


perplex $2 perplex $2
petersilie $alt petersilie $alt
pinie $alt pinie $alt
planet plan'Et
planet plan'e:t
pochier pOS'i:* pochier pOS'i:*
pochs pOxs pochs pOxs
präsident $3 präsident $3
sparsam SpA:*zA:m sparsam SpA:*zA:m
spinozaisch spi:n'o:tsaIS spinozaisch spi:n'o:tsaIS
stalagmit stalagm'It stalagmit stalagm'It
system z%IstEm
system zIst'e:m


tag tA:g tag tA:g
telegen te:le:g'e:n telegen te:le:g'e:n
theater te:'A:t3 theater te:'A:t3
train t@-*e:n train t@-*e:n
turin $2 turin $2
tuerei tu:*aI


umweg $1 umweg $1
unten Unt@n unten Unt@n
vorbei fo:*b'aI vorbei fo:*b'aI
vorher fo:*h'e:* vorher fo:*h'e:*
vorherig fo:*h'e:*IC vorherig fo:*h'e:*IC
vorig fo:*IC
vorig fo:*Ig


//wahrscheinlich $2 //wahrscheinlich $2
warum vA:*'Um warum vA:*'Um


zoom zu:m zoom zu:m
zuerst tsu:'E*st
//zuerst tsu:'E*st
zugegen tsu:g'e:g@n
zudem tsu:'de:m zudem tsu:'de:m
zurück $2 zurück $2
zymbal $1



// Names
Neumexiko $2
Neuseeland $2

+ 74
- 30
dictsource/de_rules View File

// * <http://www.gnu.org/licenses/>. * // * <http://www.gnu.org/licenses/>. *
// ***************************************************************************/ // ***************************************************************************/


.L01 c f h k p q s t // unvoiced, except s+vowel


// This file is UTF-8 encoded // This file is UTF-8 encoded


_) animal ,ani:mA:l _) animal ,ani:mA:l
_) anim ,ani:m _) anim ,ani:m
_) ani (s %ani: _) ani (s %ani:
a (Co_ 'A:
_) anti (@P4 ,antI _) anti (@P4 ,antI
_) an (tw an _) an (tw an
_) auf (@P3 _!'aUf _) auf (@P3 _!'aUf
air (_ E:r air (_ E:r
akqu %akv akqu %akv
@A) al (_ 'A:l @A) al (_ 'A:l
b) al (_ 'A:l
g) al (_ 'A:l g) al (_ 'A:l
k) al (_ 'A:l k) al (_ 'A:l
n) al (_ 'A:l n) al (_ 'A:l
@) atisch (_S6 'A:tIS @) atisch (_S6 'A:tIS
@) atisieren (_S9 A:tIs'i:*@n @) atisieren (_S9 A:tIs'i:*@n
a (tion a a (tion a
_) ato (m %ato:
_) au (Ceinand aU _) au (Ceinand aU
_) aufent aUf@nt _) aufent aUf@nt
austra (l %aUst@-*A austra (l %aUst@-*A
b b b b
b) b b) b
b (_N p b (_N p
b (h p
b (s_ p
b (L01 p
b (sA b
bt (_N pt bt (_N pt


_) be (@P2 b@ _) be (@P2 b@
_) cey tsaI _) cey tsaI
chef SEf chef SEf
_) c (ent ts _) c (ent ts
_) ch (ic S
_) ch (if S
_) ch (il S _) ch (il S
chip (_ _^_EN
chip (_ tSIp // English
_) ch (ol k _) ch (ol k
_) ch (or k _) ch (or k


bre) ch (en x bre) ch (en x
chro k@-*o: chro k@-*o:
nä) chs (t Cs nä) chs (t Cs
wa) chstu (m kstu:
c (ie s c (ie s
pla) c (ie ts pla) c (ie ts
coat (_ _^_EN coat (_ _^_EN
_) cow _^_EN _) cow _^_EN
crew _^_EN crew _^_EN
cup _^_EN cup _^_EN
_) cyber saIb3


.group d .group d
_) d (_ de: _) d (_ de:
d d d d
d) d d) d
d (_N t d (_N t
d (h t
d (L01 t
d (sA d
ds (_ ts ds (_ ts
dt t dt t
ddt t ddt t
&) end (_ @nd &) end (_ @nd
ier) end (_NS3 @nt ier) end (_NS3 @nt
ier) end (_ @nd ier) end (_ @nd
@) enhaft (_ =@nhaft
@) ent (_ 'Ent @) ent (_ 'Ent
@) entlich @ntl%IC @) entlich @ntl%IC
@m) ent (_ 'Ent @m) ent (_ 'Ent
w) er (k_ E* w) er (k_ E*
&) er (nd_ @* &) er (nd_ @*
&) erin (_ @*In &) erin (_ @*In
&) erisch (_ @*IS
&) erisch (_ @*IS
exp) er (t E*
@) es (_S2 @s @) es (_S2 @s
&) et (_S2 @t &) et (_S2 @t
&) est (_S3 @st &) est (_S3 @st
_) emp (@P3 _|%Emp _) emp (@P3 _|%Emp
_) emph (@ %Emf _) emph (@ %Emf
_) emp (ir %Emp _) emp (ir %Emp
br) ems Ems // brems-t, not brem-st
_) ene (rg %e:nE _) ene (rg %e:nE
_) energie e:nE*g'i:
@) en (i e:n @) en (i e:n
@) e (nsi E @) e (nsi E
_) ent (@P3 _|%Ent _) ent (@P3 _|%Ent
_) enten Ent@n _) enten Ent@n
_) ent (er Ent _) ent (er Ent
pat) ent 'Ent
t) en (t En t) en (t En
qu) en (tA En qu) en (tA En
&) en (tum @n &) en (tum @n
&) e (nz_ 'E
&) e (nzK 'E
_) epi (@ ,e:pi: _) epi (@ ,e:pi:
_) epi (sk e:pI _) epi (sk e:pI
_) er (@P2 _|%E* _) er (@P2 _|%E*
&) er (igst @* &) er (igst @*
_) er (beK E* _) er (beK E*
_) er (HC E* // lC, mC, nC, rC _) er (HC E* // lC, mC, nC, rC
er (o_ 'e:*
_) ergeb (nis E*g'e:b _) ergeb (nis E*g'e:b
_) er (stC E* _) er (stC E*
_) er (ste E* _) er (ste E*
g g g g
g (g g (g
g (_N k g (_N k
g (h k
g (L01 k
g (sA g
gd (_N kt gd (_N kt
gt (_N kt
gtet (_ kt@t gtet (_ kt@t
gtest kt@st gtest kt@st


_) ge (orP2 g@ _) ge (orP2 g@
ge (rman gE ge (rman gE
ge (rät g@ ge (rät g@
ge (strig gE
@) ght (_ _^_EN @) ght (_ _^_EN
graph g@-*Af graph g@-*Af
graph (_ g@-*'A:f graph (_ g@-*'A:f
_) illeg ,Ile:g _) illeg ,Ile:g
_) i (llu %I _) i (llu %I
_) i (mag I _) i (mag I
i (Co_ 'i:
ik (o_ i:k
&) im (o_ =i:m
r) i (na_ 'i: r) i (na_ 'i:
// @) ing (_N _^_EN // @) ing (_N _^_EN
_) in (k %In _) in (k %In
bank) ie (r I'e: bank) ie (r I'e:
barr) ie (r I'e: barr) ie (r I'e:
financ) ie (r I'e: financ) ie (r I'e:
arr) ie (r I'e:
hotel) ie (r I'e: hotel) ie (r I'e:
prem) ie (r I'e: prem) ie (r I'e:
hyg) ie (n I'e: hyg) ie (n I'e:
_) leit (@P4 l'aIt _) leit (@P4 l'aIt
_) lern (@@P4 l'E*n _) lern (@@P4 l'E*n
_) lexi (@ lEksi: _) lexi (@ lEksi:
@) lich (_S4 lIC
@) liche (_S5 lIC@
@) lichem (_S6 lIC@m
@) lichen (_S6 lIC@n
@) licher (_S6 lIC3
@) liches (_S6 lIC@s
@) lichere (_S7 lIC@*@
@) licherem (_S8 lIC@*@m
@) licheren (_S8 lIC@*@n
@) licherer (_S8 lIC@*@3
@) licheres (_S8 lIC@*@s
@) lichste (_S7 lICst@
@) lichstem (_S8 lICst@m
@) lichsten (_S8 lICst@n
@) lichster (_S8 lICst@r
@) lichstes (_S8 lICst@s
@) lichkeit (_S8 lICk%aIt
@) lichung (_S7 lIC%UN
&) lich (_S4 lIC
&) liche (_S5 lIC@
&) lichem (_S6 lIC@m
&) lichen (_S6 lIC@n
&) licher (_S6 lIC3
&) liches (_S6 lIC@s
&) lichere (_S7 lIC@*@
&) licherem (_S8 lIC@*@m
&) licheren (_S8 lIC@*@n
&) licherer (_S8 lIC@*@3
&) licheres (_S8 lIC@*@s
&) lichste (_S7 lICst@
&) lichstem (_S8 lICst@m
&) lichsten (_S8 lICst@n
&) lichster (_S8 lICst@r
&) lichstes (_S8 lICst@s
&) lichkeit (_S8 lICk%aIt
&) lichung (_S7 lIC%UN
@) lo (gisch l'o: @) lo (gisch l'o:


.group m .group m
o (sch O o (sch O
o (x O o (x O
&CC) o (_ =o: &CC) o (_ =o:
o (Co_ 'o:
o (lo_ o:


ob (t_ o:p ob (t_ o:p
og (t_ o:k og (t_ o:k
pf pF pf pF
ph f ph f


pake (t p%ake:
_) para (@ p,a*a _) para (@ p,a*a
passagie pasaZ'i: passagie pasaZ'i:
_) peri p,e:*i: _) peri p,e:*i:
_be) sp Sp _be) sp Sp
_ge) sp Sp _ge) sp Sp
_ver) sp Sp _ver) sp Sp
sp (eich Sp
sp (err Sp
sp (r Sp
&C) st (_S2 st &C) st (_S2 st
&C) ste (_S3 st@ &C) ste (_S3 st@
&C) stem (_S4 st@m &C) stem (_S4 st@m
_be) st St _be) st St
_ge) st St _ge) st St
_ver) st St _ver) st St
ste (ll StE
a) ste (ll stE


_) safe _^_EN _) safe _^_EN
&) schaft (_S6 Saft &) schaft (_S6 Saft
schwer Sve:* schwer Sve:*
_) sechs (P5 z'Eks _) sechs (P5 z'Eks
_) selbst (@@P6 z'Elpst _) selbst (@@P6 z'Elpst
service (_S7 z%Ervi:s
shop _^_EN shop _^_EN
_) sky _^_EN _) sky _^_EN
soldat z%OldA:t soldat z%OldA:t


sound _^_EN sound _^_EN
speed _^_EN speed _^_EN
stau) ss s
@) straße (_S6 st*,A:s@ @) straße (_S6 st*,A:s@
_) street _^_EN _) street _^_EN
style _^_EN style _^_EN
ier) tester (_S6 t@st3 ier) tester (_S6 t@st3
ier) testes (_S6 t@st@s ier) testes (_S6 t@st@s


_) talent tal'Ent
tch tS tch tS
t (chen_ t t (chen_ t
_) teen _^_EN _) teen _^_EN
_) tele (@ t,e:le: _) tele (@ t,e:le:
tuerei (_ tu:@*'aI
thrill _^_EN thrill _^_EN
_pa) th t _pa) th t
the (era te: the (era te:
_) v (on f _) v (on f


_) vehe ve:he: _) vehe ve:he:
_) ver (@P3 f%E*
_) ver (bal v%E*
_) ver (sion vE*
_) ver (tik vE*
_) ver (@P3 f%Er
_) ve (rbal vE
_) ve (rbos v%E
_) ve (rsat vE
_) ve (rsie vE
_) ve (rsif vE
_) ve (rsion vE
_) ve (rteb vE
_) ve (rtik vE
@) versich fE*z,IC @) versich fE*z,IC
@) vergess fE*g,Es @) vergess fE*g,Es
@) verfahren (_S9 fErf,A:@-*@n
_) viel (@P4 f'i:l _) viel (@P4 f'i:l
_) vier (g@P4 f'i:* _) vier (g@P4 f'i:*
_) viet vIEt _) viet vIEt
_) weg (C@P3 v'e:k _) weg (C@P3 v'e:k
_) weit (C@P4 v'aIt _) weit (C@P4 v'aIt
_) weiter (@P6 v'aIt@* _) weiter (@P6 v'aIt@*
_) weither vaIthe:*
_) wieder (@P6 vi:d3
_) wo (hin v%o: _) wo (hin v%o:
_) wohl (@P4 v'o:l _) wohl (@P4 v'o:l
work _^_EN work _^_EN
_) zigaretten (@P10 tsi:ga*'Et@n _) zigaretten (@P10 tsi:ga*'Et@n
_) zigeu tsi:g'OY _) zigeu tsi:g'OY
_) zu (C@P2 ts%u: _) zu (C@P2 ts%u:
_) zu (eP2 ts%u:
_) zu (g@ tsu:
_) zu (gu@P2 ts%u:
_) zu (nC tsU _) zu (nC tsU
_) zurück (@P6 tsu:*'yk _) zurück (@P6 tsu:*'yk
_) zyklo (@P5 ,tsy:klo: _) zyklo (@P5 ,tsy:klo:
äb (t_ E:p äb (t_ E:p
äg (t_ E:k äg (t_ E:k
t) ät (_ 'E:t t) ät (_ 'E:t
ä (um_N 'E:


.group ö .group ö
ö Y: ö Y:

+ 24
- 22
dictsource/dict_phonemes View File



0 3 3: @ @- @2 @5 @L 0 3 3: @ @- @2 @5 @L
a a2 A: A@ aa aI aI@ aU a a2 A: A@ aa aI aI@ aU
aU@ A~ E e@ eI I i I2
i: i@ i@3 IR O O: o: O@
o@ OI oU O~ U u: U@ V
VR
aU@ A~ E e: e@ eI I i
I2 i: i@ i@3 IR O O: o:
O@ o@ OI oU O~ U u: U@
V VR


: ; ? b C d D dZ : ; ? b C d D dZ
f g g- h j k l L f g g- h j k l L
A a: E e: i i: o o: A a: E e: i i: o o:
u u: Y y y: Y: u u: Y y y: Y:


: b c C d dZ f g
h j J k l l^ m n
N n^ p R R2 s S s2
t tS ts v z Z
- : b c d dZ f g
h j J k l m n n^
p r R R2 s S s2 t
tS ts v z Z




Dictionary hy_dict Dictionary hy_dict
: b bh c ch d d. dh : b bh c ch d d. dh
dh. dZ f g gh h j J dh. dZ f g gh h j J
Jh k kh l l. m n N Jh k kh l l. m n N
n. n^ p ph R R2 s S
s. S; t t. th th. tS v
w z
n. n^ p ph r R R2 s
S s. S; t t. th th. tS
v w z




Dictionary ku_dict Dictionary ku_dict


Dictionary prs_dict Dictionary prs_dict


@ A i o
@ A E eI i o u


b d h l t X
: b d dZ f g h j
k l m n p r R s
S t tS v w X z Z




Dictionary pt_dict Dictionary pt_dict
iU o O Oa oI oU u uI iU o O Oa oI oU u uI
y Y yI yU y Y yI yU


* *; - b b; c C d
d; dZ f f; g h j k
l l; m m; n N n; p
p; r s S S; t t; tS
ts ts; v v; w w2 x z
Z z; Z;
* *; b b; c C d d;
dZ f f; g h j k l
l; m m; n N n; p p;
r s S S; t t; tS ts
ts; v v; w w2 x z Z
z; Z;




Dictionary ru_dict Dictionary ru_dict


: ; b C d d. dZ f : ; b C d d. dZ f
g h H j k l l. m g h H j k l l. m
n N n. n^ p r R s
S s. t t. th tS v w
z z.
n N n. n^ p Q r R
s S s. t t. th tS v
w z z.




Dictionary tr_dict Dictionary tr_dict

+ 33
- 16
dictsource/en_list View File

_?? sImb@L _?? sImb@L
_#9 tab _#9 tab
_#32 speIs _#32 speIs
… _::d%0td,0t // for elipsis or ... while reading
//… _::d%0td,0t // for elipsis or ... while reading


_  hA@dspeIs // U+00A0 no-break-space _  hA@dspeIs // U+00A0 no-break-space
_! Ekskl@m'eIS@n _! Ekskl@m'eIS@n
# haS $max3 # haS $max3
@ _at_ $u+ @ _at_ $u+
& _and $u+ & _and $u+
\ bakstroUk $max3
/ stroUk $max3
?3 \ bakslaS $max3
?3 / slaS $max3
\ bakslaS $max3
/ slaS $max3
* ast@rIsk $max3 * ast@rIsk $max3
% p3sEnt $max3 % p3sEnt $max3
?5 % pVRs'Ent $max3 ?5 % pVRs'Ent $max3
dept dI2pA@tm@nt dept dI2pA@tm@nt
diy $abbrev diy $abbrev
edt $abbrev edt $abbrev
eg fO@Egz'aamp@L
eg fO@Egz'aamp@L $only
est $abbrev est $abbrev
etc Et'sEtr@ etc Et'sEtr@
eu $abbrev eu $abbrev
eur jU@
eur jU@ $only
hmm h@m hmm h@m
(http ://) eItSti:ti:'pi:_ (http ://) eItSti:ti:'pi:_
ibm $abbrev ibm $abbrev
LBS $abbrev LBS $abbrev
ltd lImI2tI2d ltd lImI2tI2d
mc m@k $combine // combine with the following word mc m@k $combine // combine with the following word
mya $abbrev
ny $abbrev ny $abbrev
oem $abbrev oem $abbrev
ok $abbrev ok $abbrev
alfalfa alf'alf@ alfalfa alf'alf@
alias eIli@s alias eIli@s
alibi al@baI alibi al@baI
alibis al@baIz
alkali alk@laI alkali alk@laI
allay a2leI allay a2leI
allegiance a2li:dZ@ns allegiance a2li:dZ@ns
archive A@kaIv archive A@kaIv
archway $1 archway $1
arena a2ri:n@ arena a2ri:n@
argue A@gju:
arithmetic a2rITm@tIk arithmetic a2rITm@tIk
arise a2raIz arise a2raIz
arisen a2rIz@n arisen a2rIz@n
canal k@nal canal k@nal
canary k@ne@rI canary k@ne@rI
canine keInaIn canine keInaIn
cannabis kana2bIs
canoe k@nu: canoe k@nu:
canoes k@nu:z canoes k@nu:z
canton kant0n canton kant0n
chic Si:k chic Si:k
chimpanzee $3 chimpanzee $3
chisel tSIz@L chisel tSIz@L
chloroplast $1
chocolate tS0kl@t chocolate tS0kl@t
cholera k0l@r@ cholera k0l@r@
cholesterol k@lEst@r0l cholesterol k@lEst@r0l
erase I2reIz // erasing erases erase I2reIz // erasing erases
ere e@ $only ere e@ $only
eros i@r0s eros i@r0s
err 3:
errand Er@nd errand Er@nd
escapism Esk'eIpI2z@m escapism Esk'eIpI2z@m
escargot I2sk'A@goU escargot I2sk'A@goU
?5 furthermore fVRD3m'o@ $pause ?5 furthermore fVRD3m'o@ $pause
fuscia fju:S@ fuscia fju:S@
fuselage fju:z@lA:Z fuselage fju:z@lA:Z
futon fu:t0n


gala gA:l@ gala gA:l@
galaxy gala2ksI galaxy gala2ksI
hasty heIstI hasty heIstI
hatred heItrI2d hatred heItrI2d
hazardous haz3d@s hazardous haz3d@s
heh hEh
hehe hi:h'i: hehe hi:h'i:
heifer hEf@ heifer hEf@
heist haIst heist haIst
kaput ka2pUt kaput ka2pUt
karate k@rA:tI karate k@rA:tI
kebab k@bab kebab k@bab
kefir ki:f3
hiatus haI'eIt@s hiatus haI'eIt@s
kilo ki:loU kilo ki:loU
kilter kIlt3 kilter kIlt3
leapt lEpt leapt lEpt
lego lEgoU lego lEgoU
leisure l'EZ3 leisure l'EZ3
lemme lElI // let me
lemme lEmI // let me
lemonade $3 lemonade $3
leo li:oU leo li:oU
leopard lEp@d leopard lEp@d
lethal li:T@L lethal li:T@L
liaison li:'eIz0n liaison li:'eIz0n
libre li:br@ libre li:br@
lichen laIk@n
lier laI3 // outlier lier laI3 // outlier
ligate li:geIt ligate li:geIt
lilac laIl@k lilac laIl@k
mixer mIks3 mixer mIks3
modem moUdEm modem moUdEm
moderate m0d@reIt $verb moderate m0d@reIt $verb
momentum $2
momentary moUm@nt@rI
momentum $2
monday mVndeI monday mVndeI
monotone m0n@toUn monotone m0n@toUn
monsieur m@sj3: monsieur m@sj3:
ordeal O@d'i@l ordeal O@d'i@l
orphan O@f@n // orphaned orphan O@f@n // orphaned
outage $1 outage $1
outback $1
outcome $1 outcome $1
outer aUt3 outer aUt3
outbreak $1 outbreak $1
outcry $1 outcry $1
outed aUtI2d outed aUtI2d
outfit $1 outfit $1
outhouse $1
outing $1 outing $1
outlaw $1 outlaw $1
outlay $1
outlet $1 outlet $1
outlier 'aUtl,aI3 outlier 'aUtl,aI3
outline $1 outline $1
outlive aUtl'Iv outlive aUtl'Iv
outlook $1 outlook $1
outmost $1
outpost aUtpoUst outpost aUtpoUst
output $1 output $1
outrage $1 outrage $1
quiche ki:S quiche ki:S
quiver kwIv3 quiver kwIv3


rabbis rabaIz
rabid reIbI2d rabid reIbI2d
radar reIdA@ radar reIdA@
radioactive reIdI2oU'aktIv radioactive reIdI2oU'aktIv
saudi saUdI saudi saUdI
saute sO:teI saute sO:teI
says sEz says sEz
schema ski:m@
shallow SaloU
salmon sam@n salmon sam@n
scalpel skalp@L scalpel skalp@L
scared ske@d scared ske@d
severely sI2v'i@3lI2 $verbf severely sI2v'i@3lI2 $verbf
sex sEks // sexism sex sEks // sexism
several sEvr@L several sEvr@L
shallow SaloU
shampoo $2 shampoo $2
sheriff S'ErI2f sheriff S'ErI2f
shew SoU shew SoU
shia Si:@ shia Si:@
shiitake Si:t'A:ke:
shillelagh S,I2l'eIl@ shillelagh S,I2l'eIl@
shiver SIv3 shiver SIv3
shone S0n shone S0n
?3 yoghurt joUg3t ?3 yoghurt joUg3t
yoyo joUjoU yoyo joUjoU


zulu zu:lu:
zulus zu:lu:z




// place names // place names
Cherie Se@r'i: Cherie Se@r'i:
Chloe kloUI Chloe kloUI
Chris krIs Chris krIs
Cleo kli:oU
Connie k0nI Connie k0nI
Connor k0n3 Connor k0n3
Daphne dafnI Daphne dafnI
(of a) @v@ $nounf (of a) @v@ $nounf
(of an) @v@n $nounf (of an) @v@n $nounf
(of which) 0vwItS $2 $pause (of which) 0vwItS $2 $pause
(of the) %0vD@2 $nounf
?6 (of the) %VD@2 $nounf ?6 (of the) %VD@2 $nounf
?6 (of which) VvwItS $2 $pause ?6 (of which) VvwItS $2 $pause


(from which) %fr0m||w'ItS $pause (from which) %fr0m||w'ItS $pause
up ,Vp $strend2 up ,Vp $strend2
down ,daUn $only $strend2 down ,daUn $only $strend2
by baI $u
by baI $u+
across @kr0s $u2 $strend2 across @kr0s $u2 $strend2
per p3: $u per p3: $u
(per cent) p3||s'Ent (per cent) p3||s'Ent


//aux. verbs //aux. verbs


be %bi: $pastf $only
be bi: $pastf $only $u+
been ,bi:n $pastf $only been ,bi:n $pastf $only
?3 been ,bIn $pastf $only ?3 been ,bIn $pastf $only
being ,bi:IN $pastf $only $strend2 being ,bi:IN $pastf $only $strend2
(might have) maItha2v $pastf $u1+ (might have) maItha2v $pastf $u1+
(might have to) ,maIth'avt@5 $verbf $atend (might have to) ,maIth'avt@5 $verbf $atend


have %hav $pastf $only $strend2
have hav $pastf $only $u $strend2
haves havz haves havz
(have been) %hav%bIn $pastf (have been) %hav%bIn $pastf
has %ha2z $pastf $only has %ha2z $pastf $only
didn't dIdnt $verbf didn't dIdnt $verbf
done dVn done dVn


make m,eIk $strend2 $only
made m,eId $strend2 $only

putting pUtI2N putting pUtI2N
put ,pUt $onlys $strend2 put ,pUt $onlys $strend2



+ 88
- 70
dictsource/en_rules View File

al (ien eIl al (ien eIl
_) al (i al _) al (i al
_) al (ig a2l _) al (ig a2l
X) al (in eIl
_) ali (Be a2laI _) ali (Be a2laI
&) ali (sC_ @lI &) ali (sC_ @lI
&) al (isCic @l &) al (isCic @l
amaz (o am@z amaz (o am@z
ambi (d ambI ambi (d ambI
ch) am (b eIm ch) am (b eIm
ambiv amb'Iv
fl) ame eIm fl) ame eIm
As) ame (_ 'A:mE As) ame (_ 'A:mE
_) ame (l a2mi: _) ame (l a2mi:
ch) ang (e eIndZ ch) ang (e eIndZ
ch) anging eIndZIN ch) anging eIndZIN
d) ang (er eIndZ d) ang (er eIndZ
m) angel aNg@L
r) ang (e eIndZ r) ang (e eIndZ
r) anging eIndZIN r) anging eIndZIN
r) anged (S1 d r) anged (S1 d
app (licab a2p app (licab a2p
app (reh ap app (reh ap
apres apreI apres apreI
_) apprec (i a2pri:S
_) apprec (L02 a2pri:S
_) ap (ri eIp _) ap (ri eIp
ap (ro eIp ap (ro eIp
_) ap (s ap _) ap (s ap
e) ch (el S e) ch (el S
cli) ch S cli) ch S
fi) ch S fi) ch S
li) ch k
ni) ch S ni) ch S
clo) ch S clo) ch S
_o) ch (e S _o) ch (e S
d (d d (d
_) d' (AP2 d _) d' (AP2 d
@@e) d (_S1 d // suffix @@e) d (_S1 d // suffix
db (_ d,i:bi:
ddh d ddh d
dj dZ dj dZ
dg (_ dZ dg (_ dZ
fr) e (q i: fr) e (q i:
_s) e (que i: _s) e (que i:
e (quip %I e (quip %I
e (quiv %I
equiv %IkwIv
e'er e@ e'er e@
h) e (sion 'i: h) e (sion 'i:
&f) e's (_S2i s &f) e's (_S2i s
engin EndZIn engin EndZIn
eng (_ 'EN // place names eng (_ 'EN // place names
enging EndZIN enging EndZIN
eng (th EN
en (ig En en (ig En
en (igma_ %En en (igma_ %En
&) enine @ni:n &) enine @ni:n
z) er (o i@r z) er (o i@r
_C) er (o_ i@r _C) er (o_ i@r
er (rA E er (rA E
err (_ 3:
err (_N e@


.group es .group es
&) es (_S1i z &) es (_S1i z
gue (_ g gue (_ g
_) gue gE _) gue gE
_) guer (n g3: _) guer (n g3:
ar) gue gju:
// _ar) gu gju:


.group h .group h
h h h h
if (icAnC 'If if (icAnC 'If
r) i (fl aI r) i (fl aI
st) i (fl aI st) i (fl aI
i (genous 'I
igeo IdZ@ igeo IdZ@


n) ihi aI|@ n) ihi aI|@
sh) i (ma_ 'i: sh) i (ma_ 'i:
i (mum I i (mum I
@) i (ness I @) i (ness I
io (_ =I2oU
?7 io (_ =i:oU
b) io aIoU
b) io (logy aI0
v) io aI0
i (o I2 i (o I2
?7 i (o i: ?7 i (o i:
io (li_ I2'oU
&) ion (_ =i@n
?8 &) ion (_ =IVn
n) ion =i@n
v) io (l aI@
g) io (n @
m) io (n I20
sh) io (n @
_) io (n aI0
_l) ion aI@n
z) io (n aI@
r) ior (_ I3
&) ior (+ i@3
&) ior (_ j3
iority I'0rI2t%I
iou (rA j@
iour (K j3
@) ious (_ =I2@s
ioux u:
_r) io (t aI@
io (t_ I|@
ipede Ipi:d ipede Ipi:d
_s) i (ph aI _s) i (ph aI
i (que_ 'i: i (que_ 'i:
iz (er_ aIz iz (er_ aIz
prAm) is Is prAm) is Is
@Cs) is (_ =Is @Cs) is (_ =Is
b) is (_ Is
ize (_ aIz ize (_ aIz
ise (d_ aIz ise (d_ aIz
ize (d_ aIz ize (d_ aIz
?3 s) im (ult aIm ?3 s) im (ult aIm


.group in .group in
@) ing (_+S3dve I2N
@) ings (_S4dve I2Nz
@) ingly (_S5dve I2Ng-lI
@) ingment (_S7dve I2Ng-m@nt
logu) ing (_S4v I2N
x) ing (_+S3v I2N
el) ing (_+S3dv I2N
@@om) ing (_S3dv I2N
en) ing (_S3v I2N
en) ings (_S4v I2Nz
en) ingly (_S5vf I2Ng-lI
er) ing (_S3v I2N
er) ings (_S4v I2Nz
er) ingly (_S5vf I2Ng-lI
er) ingment (_S7v I2Ng-m@nt
@) ing (_+S3dve IN
@) ings (_S4dve INz
@) ingly (_S5dve INg-lI
@) ingment (_S7dve INg-m@nt
logu) ing (_S4v IN
x) ing (_+S3v IN
el) ing (_+S3dv IN
@@om) ing (_S3dv IN
en) ing (_S3v IN
en) ings (_S4v INz
en) ingly (_S5vf INg-lI
er) ing (_S3v IN
er) ings (_S4v INz
er) ingly (_S5vf INg-lI
er) ingment (_S7v INg-m@nt
Br) ing (_ IN Br) ing (_ IN


?7 &) in (_ @n ?7 &) in (_ @n
_) intra Intr@ _) intra Intr@
_) intra (CC %Intra _) intra (CC %Intra


.group io
io (_ =I2oU
?7 io (_ =i:oU
b) io aIoU
b) io (logy aI0
v) io aI0
io (li_ I2'oU
&) ion (_ =i@n
?8 &) ion (_ =IVn
n) ion =i@n
v) io (l aI@
g) io (n @
m) io (n I20
sh) io (n @
_) io (n aI0
_l) ion aI@n
z) io (n aI@
r) ior (_ I3
&) ior (+ i@3
&) ior (_ j3
iority I'0rI2t%I
iou (rA j@
iour (K j3
@) ious (_ =I2@s
ioux u:
_r) io (t aI@
io (t_ I|@

.group ir .group ir
_) ir (a I2r _) ir (a I2r
ir (a_ 'i@r ir (a_ 'i@r
@) men (_ mEn @) men (_ mEn
&) ment (_S4 m@nt &) ment (_S4 m@nt
&) ments (_S5 m@nt|s &) ments (_S5 m@nt|s
u) ment (_ m@nt
u) ments (_ m@nt|s
?8 &) ment (_S4 mEnt ?8 &) ment (_S4 mEnt
?8 &) ments (_S5 mEnt|s ?8 &) ments (_S5 mEnt|s
mEnt (_ m@nt mEnt (_ m@nt
n) n n) n
&ia) n (_S1 n &ia) n (_S1 n
&ia) ns (_S2 nz &ia) ns (_S2 nz
@) name (_ neIm
@) name (_S4 neIm
_) nano (P4 n,anoU _) nano (P4 n,anoU
nause nO:sI nause nO:sI
necessit n@sEsIt necessit n@sEsIt
o (ffic 0 o (ffic 0
o (gan_ oU o (gan_ oU
&) o (gen_ @ &) o (gen_ @
hom) o (gen '0
o (genous '0
o (geny '0
ogeni (c oUdZ'EnI ogeni (c oUdZ'EnI
r) o (ger 0 r) o (ger 0
l) o (gy @ l) o (gy @
r) ogue oUg r) ogue oUg
v) ogue oUg v) ogue oUg
@@) ogue 0g @@) ogue 0g
@) oged 0gd
@l) oge (_ 0g
oh oU oh oU
o (hA oU o (hA oU
j) oh (n 0 j) oh (n 0
tr) othe oUD tr) othe oUD
l) oth (ian oUD l) oth (ian oUD
_r) o (ther 0 _r) o (ther 0
ph) oto oUtoU
ph) o (ton oU
ph) otocop oUt@k0p
ph) oto (grapher @t0
ph) oto (graphy @t0
pr) oto oUtoU pr) oto oUtoU
pr) oto (n oUt0 pr) oto (n oUt0
m) otor oUt@ m) otor oUt@
olo (gic @l'0 olo (gic @l'0
v) olt oUlt v) olt oUlt
w) olv Ulv w) olv Ulv
_p) oly ,0lI
N_p) oly ,0lI


.group om .group om
&) om (_ @m &) om (_ @m
_) or (iC 0r _) or (iC 0r
@t) ore (_ 3 @t) ore (_ 3
st) ore (_ o@ st) ore (_ o@
@) orily (_ '0r@l%I
@) orily (_ =@r@l%I
h) ori (z @raI h) ori (z @raI
h) ori (zont 0rI h) ori (zont 0rI
?!3 _h) or (o 0r ?!3 _h) or (o 0r
p (haza p p (haza p
ph (erd p ph (erd p
phila fIla phila fIla
_) photo (@@P5 f,oUtoU
photo foUtoU
photon foUt0n
photocop foUt@k0p
photo (grapher f@t0
photo (graphy f@t0
photo (met foUt'0
_) phyco f,aIkoU
p (hole p p (hole p
sym) pa p@ sym) pa p@
_) paleo (@P5 p,eIli:oU _) paleo (@P5 p,eIli:oU
_) pre (ss prE _) pre (ss prE
_) pre (st prE _) pre (st prE
_) pre (u pr%i: _) pre (u pr%i:
_) pre (val prE
_) prev (al prEv
_) pre (vio pri: _) pre (vio pri:
_) pre (view pri: _) pre (view pri:
_) pri (o praI _) pri (o praI
_) re (i@P2 r,i: _) re (i@P2 r,i:
_) rei (c raI _) rei (c raI
_) rei (l raI _) rei (l raI
rei (s raI
_) rele (g rElI2 _) rele (g rElI2
rele (nt rI2lE rele (nt rI2lE
rele (v rElI rele (v rElI
s (s s (s
s (sh s s (sh s
_) sch S _) sch S
sch (em sk
sche (m ski:
_) sch (ism sk _) sch (ism sk
_) schiz skIts _) schiz skIts
sch (o sk sch (o sk
ca) th (eri T ca) th (eri T
_e) th (er T _e) th (er T
th (ern_ D th (ern_ D
_) thio T,aIoU
th (ith D th (ith D
th (ole th th (ole th
_) th (om@ t _) th (om@ t


.group u .group u
u V u V
u (_N u:
u (_ ju: u (_ ju:
r) u (_ u:
l) u (_ u:
w) u (_ u:
L01) u (_ u:
h) u (_ =u: h) u (_ =u:
men) u (_ ju:
u (ga_ 'u: u (ga_ 'u:
u (ki_ 'u: u (ki_ 'u:
u (ma_ 'u: u (ma_ 'u:
u (mo_ 'u: u (mo_ 'u:
u (CA ju: u (CA ju:
u (Cu_ u:
?3 d) u (CA u: ?3 d) u (CA u:
?3 n) u (CA u: ?3 n) u (CA u:
?3 t) u (CA+ u: ?3 t) u (CA+ u:
_) una (b ,Vna2 _) una (b ,Vna2
t) un (e ju:n t) un (e ju:n
?3 t) un (e u:n ?3 t) un (e u:n
_) un (if ju:n
un (ani %ju:n un (ani %ju:n
_) under (@P5 ,Vnd3 // prefix _) under (@P5 ,Vnd3 // prefix
_) un (deP2 ,Vn _) un (deP2 ,Vn
_) un (dula Vn _) un (dula Vn
_) un (enP2 ,Vn _) un (enP2 ,Vn
_) un (exP2 ,Vn _) un (exP2 ,Vn
_) un (ic ju:n
_) un (imP2 ,Vn _) un (imP2 ,Vn
_) unin ,VnI2n
un (inj %Vn
_) uni ju:nI
_) un (id ,Vn
_) un (inP2 ,Vn
_) un (il ,ju:n _) un (il ,ju:n
_) un (io ju:n _) un (io ju:n
_) un (iq %ju:n _) un (iq %ju:n
_) un (is ju:n
_) un (it ju:n
unit (e ju:n'aIt unit (e ju:n'aIt
_) un (iv ju:n
_) un (ix ju:n _) un (ix ju:n
un (i ju:n un (i ju:n
p) un (ish Vn p) un (ish Vn
.group v .group v
v v v v
v (v v (v

@) va (len veI
_) vehem vi@m _) vehem vi@m
_) vi (brat v%aI _) vi (brat v%aI
vivi (@ vIvI vivi (@ vIvI
wh (ol h wh (ol h
m) w (ich_ m) w (ich_
B) wing (_ wIN B) wing (_ wIN
B) wing (s_ wIN
@) wise (_S4 waIz @) wise (_S4 waIz
e) with (_ w'ID e) with (_ w'ID
with (C w%ID with (C w%ID
_) x z _) x z
xio (n kS@ xio (n kS@
xious =kS@s xious =kS@s
xu (a kSu:
xu (a =kSu:


.group y .group y
y j y j
d) ynam aInam d) ynam aInam
@C) y (mAn_ I @C) y (mAn_ I
w) y (n I w) y (n I
gl) y (ce I
gl) y (cer I
d) yse (n Is@ d) yse (n Is@
f) y (_ aI f) y (_ aI
ff) y (_ I ff) y (_ I
Em (_ @m Em (_ @m
@) E (mber 'E @) E (mber 'E
Eme (_ i:m Eme (_ i:m
Em (ic_ 'i:m
Ensk (_ 'Ensk Ensk (_ 'Ensk
En (_ @n En (_ @n
?8 En (_ En ?8 En (_ En
Esque 'Esk Esque 'Esk
E (ss E E (ss E
Ess (_ Es Ess (_ Es
E (te_ i:
E (tric E E (tric E
Etta (_ 'Et@ Etta (_ 'Et@
Ette (_ 'Et Ette (_ 'Et

+ 3
- 3
dictsource/fr_rules View File



// 2006-11-18 Gilles Casse <[email protected]> // 2006-11-18 Gilles Casse <[email protected]>
// //
// Updated: 2009-10-15 Michel Such <[email protected]>
// Updated: 2009-11-20 Michel Such <[email protected]>
// //


// Letter classes: // Letter classes:
dist) ill il // distiller dist) ill il // distiller
_L05) ill il // Lille, mille, ville, william _L05) ill il // Lille, mille, ville, william
osc) ill il // osciller osc) ill il // osciller
gu) ill ij // guillaume
qu) ill ij // quille qu) ill ij // quille
A) ill j // caillou A) ill j // caillou
C) ill ij // famille C) ill ij // famille
.group v .group v
v v v v
vers (_ vErz2 vers (_ vErz2
Xri) ver (X vWr
dri) ver (X vWr
_) view (X vju _) view (X vju
_) view (A vjuv _) view (A vjuv










+ 1
- 1
dictsource/hi_rules View File

// This file is UTF8 encoded // This file is UTF8 encoded


// letter groups: // letter groups:
// A vowel letters
// A vowel letters and vowel signs
// B vowel signs and virama ् // B vowel signs and virama ्
// C consonants // C consonants
// Y vowel letters and vowel signs // Y vowel letters and vowel signs

+ 290
- 43
dictsource/hu_list View File

_8X n^oltsvAn _8X n^oltsvAn
_9X kilEntsvEn _9X kilEntsvEn
_0C sa:z _0C sa:z

_0M1 EzER2 _0M1 EzER2
_1M1 EzER2 _1M1 EzER2
_2M1 ke:tEzER2 _2M1 ke:tEzER2
_0M2 millio: _0M2 millio:
_1M2 millio:
_1M2 EJmillio:
_2M2 ke:tmillio: _2M2 ke:tmillio:
_0M3 millia:R2d _0M3 millia:R2d
_1M3 EJmillia:R2d _1M3 EJmillia:R2d
_0-től e:tY:l $alt2 _0-től e:tY:l $alt2
_0-tól a:to:l $alt2 _0-tól a:to:l $alt2
_0-ig e:ig $alt2 //special date ordinal numbers for example elsejéig, negyedikéig etc. _0-ig e:ig $alt2 //special date ordinal numbers for example elsejéig, negyedikéig etc.

_0-éről e:R2Y:l $alt2
_0-áról a:R2o:l $alt2
_0-ára a:R2A $alt2
_0-ától a:to:l $alt2
_0-ről e:R2Y:l $alt2
_0-ról a:R2o:l $alt2
_0-ével e:vEl $alt2
_0-ával a:vAl $alt2
_0-éig e:ig $alt2
_0-áig a:ig $alt2
(1-e) elseje $text $alt2 (1-e) elseje $text $alt2
(1-én) elsején $text $alt2 (1-én) elsején $text $alt2
(1-jén) elsején $text $alt2 (1-jén) elsején $text $alt2
(1-re) elsejére $text $alt2 (1-re) elsejére $text $alt2
(1-től) elsejétől $text $alt2 (1-től) elsejétől $text $alt2
(1-ig) elsejéig $text $alt2 (1-ig) elsejéig $text $alt2

(1-éről) elsejéről $text $alt2
(1-ről) elsejéről $text $alt2
(1-ével) elsejével $text $alt2
(1-éig) elsejéig $text $alt2
(2-i) másodikai $text $alt2 (2-i) másodikai $text $alt2
(2-ig) másodikáig $text $alt2 (2-ig) másodikáig $text $alt2
(3-i) hAR2_mAdikAi $alt2 (3-i) hAR2_mAdikAi $alt2
(16-ig) tizenhatodikáig $text $alt2 (16-ig) tizenhatodikáig $text $alt2
(18-ig) tizennyolcadikáig $text $alt2 (18-ig) tizennyolcadikáig $text $alt2
(20-i) huszadikai $text $alt2 (20-i) huszadikai $text $alt2

(20-ig) huszadikáig $text $alt2 (20-ig) huszadikáig $text $alt2
(23-ig) huszonharmadikáig $text $alt2 (23-ig) huszonharmadikáig $text $alt2
(26-ig) huszonhatodikáig $text $alt2 (26-ig) huszonhatodikáig $text $alt2







// these exceptions only for 0, not for other numbers ending in '0' // these exceptions only for 0, not for other numbers ending in '0'
(0-ás) nul:a:S (0-ás) nul:a:S
(0-t) nul:a:t (0-t) nul:a:t
(0-val) nul:a:vAl (0-val) nul:a:vAl
(0-ra) nul:a:R2A
(0-nál) nul:a:na:l
(0-hoz) nul:a:hoz


// entries with a single digit such as (2-i) also apply to 22, 32, etc, unless $only // entries with a single digit such as (2-i) also apply to 22, 32, etc, unless $only


(2-esekkel) kEt:ESEk:El (2-esekkel) kEt:ESEk:El
(2-eseket) kEt:ESEkEt (2-eseket) kEt:ESEkEt
(2-eseik) kEt:ESEik (2-eseik) kEt:ESEik
(2-esük) kEt:ESyk
(3-as) ha:R2mAS (3-as) ha:R2mAS
(3-asának) ha:R2mASa:nAk (3-asának) ha:R2mASa:nAk
(3-ason) ha:R2mASon (3-ason) ha:R2mASon
(3-assal) ha:R2mAS:Al (3-assal) ha:R2mAS:Al
(3-asával) ha:R2mASa:vAl (3-asával) ha:R2mASa:vAl
(3-ast) ha:R2mASt (3-ast) ha:R2mASt
(3-astól) ha:R2mASto:l
(3-ashoz) ha:R2mAShoz
(3-at) ha:R2mAt (3-at) ha:R2mAt
(3-al) ha:R2om:Al (3-al) ha:R2om:Al


(4-el) ne:J:El //4 number suffixes (now contains one suffix)
//4 number suffixes
(4-el) ne:J:El //Nneed J: phoneme, not J phoneme contains one suffix)
(4-gyel) ne:J:El //Need J: phoneme, not J phoneme
(5-tel) Yt:El (5-tel) Yt:El
(5-el) Yt:El (5-el) Yt:El
(5-től) Yt:Y:l
(5-től) YtYdike:tY:l $alt2
(6-al) hAt:Al (6-al) hAt:Al
(6-tal) hAt:Al (6-tal) hAt:Al

(6-tól) hAt:o:l
(6-tól) h'Atodika:to:l $alt2
(7-es) hEtES (7-es) hEtES
(7-est) hEtESt (7-est) hEtESt
(7-esek) hEtESEk (7-esek) hEtESEk
(7-esük) hEtESyk (7-esük) hEtESyk
(7-tel) he:t:El (7-tel) he:t:El
(7-el) he:t:El (7-el) he:t:El

(7-től) he:t:Y:l
(7-től) hEtEdike:tY:l $alt2
(7-essel) hEtES:El
(10-es) tizES // use [i] not [i:] (10-es) tizES // use [i] not [i:]
(10-est) tizESt (10-est) tizESt
(10-essel) tizES:El (10-essel) tizES:El
(10-esével) tizESe:vEl (10-esével) tizESe:vEl

(10-en) tizEn
(10-et) tizEt
(10-szer) ti:s:ER2
(10-szeres) ti:s:ER2ES
(20-as) husAS // use [u] not [u:] (20-as) husAS // use [u] not [u:]
(20-ast) husASt (20-ast) husASt
(20-assal) husAS:Al (20-assal) husAS:Al
(20-asával) husASa:vAl (20-asával) husASa:vAl
(20-at) husAt



//special number exceptions //special number exceptions
(10-el) ti:zzEl (10-el) ti:zzEl
aug $alt aug $alt
szept $alt szept $alt
okt $alt okt $alt
now $alt
nov $alt
dec $alt dec $alt


//this following 7 lines means the 7 hungarian day name //this following 7 lines means the 7 hungarian day name
_#13 vAlAmi _#13 vAlAmi
_#32 so:kYz _#32 so:kYz
_cap n'AJ_| _cap n'AJ_|
_?? kAR2AktEr||ko:d // unknown characters (change this)



// Abbreviations // Abbreviations
ADSL a:de:ESEl $allcaps //Internet connection type, we pronouns this with ádéesel
ÁNTSZ a:Ente:Es $allcaps ÁNTSZ a:Ente:Es $allcaps
ATM a:te:Em $allcaps //The ATM stands. We pronouns this abbreviation with átéem word. Default, Espeak pronouns this abbreviation with atéem word.

km kilo:me:tER2 km kilo:me:tER2
GYSEV JESEv $allcaps GYSEV JESEv $allcaps
GYESEV JESEv $allcaps GYESEV JESEv $allcaps
HÉV he:v $allcaps HÉV he:v $allcaps
City siti $capital
IPTV $abbrev $allcaps
GDP dZi:di:pi: $allcaps GDP dZi:di:pi: $allcaps
HSDPA $abbrev $allcaps HSDPA $abbrev $allcaps
ORTT $abbrev $allcaps ORTT $abbrev $allcaps
MÁV ma:v $allcaps MÁV ma:v $allcaps
MTI $abbrev $allcaps MTI $abbrev $allcaps
mm milime:tER2 mm milime:tER2

RAM R2Am $allcaps //Espeak normaly spokening this abbreviation with erraem, but this is not good
Psszt ps:t $capital // similar word with quiet word. Espeak default spokening this abbrew quiet word with letter by letter by default.
VDSZSZ ve:de:EsEs $allcaps VDSZSZ ve:de:EsEs $allcaps
a.m An^n^i||m'int $dot a.m An^n^i||m'int $dot
ún u:JnEvEzEt: $dot
ún u:JnEvEzEt: $hasdot
dr doktoR2 $dot dr doktoR2 $dot
mr mistER2 $dot //in hungarian we not use, but lot of books contains this word.
mrs misis $dot //In hungarian we not use, but lot of book contains this word.
mr mistER2 $hasdot //in hungarian we not use, but lot of books contains this word.
mrs misis $hasdot //In hungarian we not use, but lot of book contains this word.
miss mis: $hasdot
gpu $abbrev gpu $abbrev
GB gigAba:jt $allcaps GB gigAba:jt $allcaps
MB mEgAba:jt $allcaps MB mEgAba:jt $allcaps
OK ok $allcaps OK ok $allcaps
mvgyosz Emve:Je:oEs mvgyosz Emve:Je:oEs
OTP o:te:pe: $allcaps OTP o:te:pe: $allcaps
id idY:SEb: $dot
ill illEtvE $dot
ifj ifjAb: $dot
id idY:SEb: $hasdot
ill illEtvE $hasdot
ifj ifjAb: $hasdot
mta $abbrev mta $abbrev
pl pe:lda:ul $dot
stb SAtYb:i $dot
u.n u:JnEvEzEt: $dot
ú.n u:JnEvEzEt: $dot
pl pe:lda:ul $hasdot
stb SAtYb:i $hasdot
u.n u:JnEvEzEt: $hasdot
ú.n u:JnEvEzEt: $hasdot
vö v'EZd||_'Yss2E vö v'EZd||_'Yss2E




de $u+ $pause // but de $u+ $pause // but
vagy $u+ $pause // or vagy $u+ $pause // or


mert $u $pause // because
mert $u $pause // because
miatt $u // because miatt $u // because
bár $u $pause // although bár $u $pause // although
habár $u $pause // although habár $u $pause // although




// Negative // Negative
nem $unstressend $combine $strend
nem $strend2 $combine
?2 nem $strend2
ne $unstressend ne $unstressend


e $u // "-e" question e $u // "-e" question
felett $unstressend // above felett $unstressend // above
fölött $unstressend fölött $unstressend


//mellől $u // besides
//mellé $u
//mellett $u
mellől $unstressend // besides
mellé $unstressend
mellett $unstressend
lett $unstressend lett $unstressend
ott $unstressend ott $unstressend
itt $unstressend itt $unstressend
nekik $unstressend nekik $unstressend
neki $unstressend neki $unstressend
nekem $unstressend nekem $unstressend
//közül $u
//közé $u
//között $u
közül $unstressend
közé $unstressend
között $u
an $u // so many persons an $u // so many persons
as $u as $u
ba $unstressend // into ba $unstressend // into
szer $u szer $u
szor $u // times szor $u // times
szó $unstressend szó $unstressend
szót $unstressend
szór $u szór $u
ször $u ször $u
tól $unstressend // from tól $unstressend // from
ide $unstressend // here ide $unstressend // here
oda $unstressend // there oda $unstressend // there
szét $unstressend //apart szét $unstressend //apart
//össze $u //connect with
//vissza $u //back
össze $unstressend //connect with
vissza $unstressend //back
volna $unstressend // would volna $unstressend // would
//részén $u //on ... part of //részén $u //on ... part of


kér $unstressend kér $unstressend
tartják $unstressend tartják $unstressend
erős $unstressend erős $unstressend
lenni $unstressend
lennie $unstressend lennie $unstressend
közt $u+ közt $u+
levegőjére $unstressend levegőjére $unstressend
őt $unstressend őt $unstressend
helyes $u+ helyes $u+
fák $unstressend fák $unstressend
fát $unstressend
et $unstressend et $unstressend
megvédeni $unstressend megvédeni $unstressend
sztrájk $unstressend sztrájk $unstressend
rám $unstressend rám $unstressend
tűnik $unstressend tűnik $unstressend
nyújt $unstressend nyújt $unstressend
nincs $unstressend
nincsen $unstressend nincsen $unstressend
mégy $unstressend mégy $unstressend
nő $unstressend nő $unstressend
más $unstressend más $unstressend
mást $unstressend mást $unstressend
rúd $unstressend rúd $unstressend
mint $unstressend $brk $combine
mint $unstressend $combine
?2 mint $unstressend
iránt $unstressend iránt $unstressend
légy $unstressend légy $unstressend
tűnt $unstressend tűnt $unstressend
szólsz $unstressend szólsz $unstressend
lőtt $unstressend lőtt $unstressend
sor $unstressend sor $unstressend
sort $unstressend
árt $unstressend árt $unstressend
fest $unstressend fest $unstressend
fújt $unstressend fújt $unstressend
több $unstressend több $unstressend
tart $unstressend tart $unstressend
hág $unstressend hág $unstressend

sors $unstressend
küzd $unstressend
vert $unstressend
csaj $unstressend
tárgy $unstressend
lágy $unstressend
pont $unstressend //This is mean pont word, not dot character.
pontok $unstressend
bújt $unstressend
mély $unstressend
úr $unstressend
szép $unstressend
szék $unstressend
nagy $unstressend
kár $unstressend
hó $unstressend
tánc $unstressend
füst $unstressend
két $unstressend
őr $unstressend
őrt $unstressend
nyílt $unstressend
fényt $unstressend
éjt $unstressend
ég $unstressend
lépett $unstressend
perc $unstressend
halk $unstressend
busz $unstressend
gyors $unstressend
vett $unstressend
kést $unstressend
fess $unstressend
szín $unstressend
szög $unstressend
sincs $unstressend
tér $unstressend
sztár $unstressend
vers $unstressend
mondja $unstressend
mondják $unstressend
mondta $unstressend
mondták $unstressend
szert $unstressend
látja $unstressend
szél $unstressend
óra $unstressend
hegy $unstressend
colt $unstressend
róla $unstressend
rólunk $unstressend
rólatok $unstressend
róluk $unstressend
szád $unstressend
nos $u
no $u
na $u
vall $unstressend
magam $unstressend
magad $unstressend
tűz $unstressend
egy $unstressend
lehetett $unstressend
arra $unstressend
erre $unstressend
arról $unstressend
erről $unstressend
ölt $unstressend
rosszak $unstressend
helyt $unstressend
bort $unstressend
látszik $unstressend
látszott $unstressend
látszanak $unstressend
látszotok $unstressend
körül $unstressend
dőlt $unstressend
vér $unstressend
sót $unstressend
múlt $unstressend
ügy $unstressend
cél $unstressend
célt $unstressend
láb $unstressend
bőr $unstressend
víz $unstressend
fagy $unstressend
nyelt $unstressend
sokk $unstressend
hét $unstressend
zajt $unstressend
pest $unstressend
stáb $unstressend
súlyt $unstressend
szólt $unstressend
vidd $unstressend
fönn $unstressend
szűk $unstressend
fordul $unstressend
fordult $unstressend
hús $unstressend
bor $unstressend
húsz $unstressend
tőle $unstressend
tőled $unstressend
tőlük $unstressend
tőletek $unstressend
tőlünk $unstressend
mászni $unstressend
jel $unstressend
szállt $unstressend
száll $unstressend
sínt $unstressend
kút $unstressend
bőrt $unstressend
vért $unstressend
lóg $unstressend
vette $unstressend
lenn $unstressend
indult $unstressend
völgy $unstressend
frászt $unstressend
hang $unstressend
fény $unstressend
kösz $unstressend
gramm $unstressend
húst $unstressend
telt $unstressend
zár $unstressend
rész $unstressend
nyom $unstressend
hiszem $unstressend
hiszed $unstressend
hiszi $unstressend
telik $unstressend
adott $unstressend
gázt $unstressend
csap $unstressend
falán $unstressend
hitte $unstressend
nyár $unstressend
túl $unstressend
fáj $unstressend
tudni $unstressend
hinni $unstressend
hopp $unstressend
vinni $unstressend
hozni $unstressend
hittem $unstressend
hitted $unstressend
hittük $unstressend
hittétek $unstressend
hitték $unstressend
folt $unstressend
írva $unstressend
vele $unstressend
veled $unstressend
velem $unstressend
velünk $unstressend
veletek $unstressend
velük $unstressend


// word pairs // word pairs




vagyok $u // to be, present vagyok $u // to be, present
vagy $u vagy $u
van $u
vagyunk $u
vagytok $u
vannak $u
van $unstressend
vagyunk $unstressend
vagytok $unstressend
vannak $unstressend


voltam $u // to be, past voltam $u // to be, past
voltál $u voltál $u
fogtok $u+ fogtok $u+
fognak $u+ fognak $u+


tud $u+ // can
tud $unstressend // can
tudok $u+ tudok $u+
tudsz $u+ tudsz $u+
tudunk $u+ tudunk $u+
_- m'inus $max3 _- m'inus $max3
__ Ala:hu:za:S $max3 __ Ala:hu:za:S $max3
_' ApostR2o:f _' ApostR2o:f
_– nAJkYtY:
_– gondolAtjEl
_— kviR2tmi:nus _— kviR2tmi:nus
_" ide:zY:jEl _" ide:zY:jEl
_( b'Alza:R2o:jEl $max3 _( b'Alza:R2o:jEl $max3
_} v'e:gkAptSoS $max3 _} v'e:gkAptSoS $max3
_… pontpontpont _… pontpontpont


_• di:spont
_• fElSoR2ola:SjEl
_| fyg:Y:lEgESvonAl _| fyg:Y:lEgESvonAl
_> nAJob _> nAJob
_< kiSSEb _< kiSSEb
_¤ pe:nznEmjEl _¤ pe:nznEmjEl

® bEjEJzEt:
™ ve:djEJ
_` tompA
_  SokYz
_« bElSY:|bAl|ide:zY:jEl
_» bElSY:|jobb|ide:zY:jEl
_­ la:JkYtY:jEl
_² ma:Sodik|hAtva:n^
_³ hArmAdik|hAtva:n^
_· kYze:pSY:pont
_¹ ElsY:hAtva:n^
_º Sorsa:m
_‘ bAloldAli|ide:zY:jEl
_’ job:oldAli|ide:zY:jEl
_‚ ide:zY:jEl
_‛ ide:zY:jEl
_“ ide:zY:jEl
_” ide:zY:jEl
_„ ide:zY:jEl
_‟ ide:zY:jEl
_‣ ha:R2omsYgAlAku:|fElSoR2ola:SjEl
_‰ EzR2Ele:k
_′ ApostR2o:f
_″ duplA|ApostR2o:f
© tsopiR2ight-jEl
° fok
− minus
± plusminus
µ my:
¼ nEJEd
½ fe:l
¾ ha:R2omnEJEd
× tAlpAS
÷ osta:S
¬ logikAinEm
√ JYkjEl
∞ vEgtElEn
≠ nEmEJEnlY:
_ˇ lEfEle:n^i:l


// Main Exceptions List // Main Exceptions List
//===================== //=====================


nato na:to: nato na:to:
(end-of line) u:jS,oR2


$textmode $textmode
MSZP emeszpé MSZP emeszpé
(db-os) darabos (db-os) darabos
(db-ot) darabot (db-ot) darabot









+ 523
- 154
dictsource/hu_rules
File diff suppressed because it is too large
View File


+ 52
- 5
dictsource/no_list View File

_0and u:g _0and u:g
_dpt kOmmA _dpt kOmmA


// ordinal numbers
_ord @nd@2
_1o f'WRst@2
_2o 'AndR@2
_3o tR'Edj@2
_4o fj'a:R@2
_5o f'Emt@2
_6o S'Et:@2
_8o 'Ot:@nd@2
_11o 'EllEvt@2
_12o t'Olvt@2
_13o tR'Et:@nd@2
_14o fj'URt@md@2
_15o f'Emt@nd@2
_16o s'Ekst@nd@2
_17o s'yt:@nd@2
_18o 'At:@nd@2
_19o n'It:@nd@2
_2Xo s;'u-:@nd@2
_0Co h'u-ndR@d@2
_0M1o t'u-:s@nd@2


// punctuation and symbols // punctuation and symbols
//======================== //========================


* ss;aRn@2 $max3
= aRli:k $max3
+ plu-s $max3
% pR'u:s'Ent $max3
& O:g
# nu-mm@RtENn $max3
/ skROstR@k $max3
\ OmvEndt||skROstR@k $max3

_! u-:tRu:pstENn _! u-:tRu:pstENn
_" AnfY:RS@l _" AnfY:RS@l
_# nu-mm@RtENn
_$ dOllA:R _$ dOllA:R
% pR'u:s'Ent
& O:g
_' ApUstR'u:f _' ApUstR'u:f
_( paRaNt'e:s||b@j'ynn@R _( paRaNt'e:s||b@j'ynn@R
_) paRaNt'e:s||Sl'u-t: _) paRaNt'e:s||Sl'u-t:
_* ss;aRn@2 _* ss;aRn@2
+ plu-s
_, kOmmA _, kOmmA
_- stRe:k _- stRe:k
_. pu-Nktu-:m _. pu-Nktu-:m
/ skROstR@k
_: ku:lOn _: ku:lOn
_; se:mi:ku:lOn _; se:mi:ku:lOn
_< mIndR@2||En _< mIndR@2||En
__ u-ndaRStR@k __ u-ndaRStR@k
_` 'OmvEndt||ApUstR'u:f _` 'OmvEndt||ApUstR'u:f


_#09 tA:b
_#32 mEllOmRu:m

_acu A:'ku-t:
_ced s'e:dIll@2
_cir s'IRku-mflEks
_dia tR'e:mA
_grv gR'A:vi:s
_tld t'Ild@2


é $accent
ü $accent




// abbreviations // abbreviations
i i: $atend i i: $atend




// English Words
firefox _^_EN
screen _^_EN
reader _^_EN
cancel _^_EN
continue _^_EN
magnifier _^_EN
and @2nd $only



// MAIN WORD DICTIONARY // MAIN WORD DICTIONARY
//********************* //*********************

+ 1
- 11
dictsource/no_rules View File

.group c .group c
c k c k
cc k: cc k:
_) c (e s
c (i s c (i s
c (y s c (y s
c (ei s c (ei s
ü y: ü y:


$ dOllA:R $ dOllA:R
\\ OmvEndt||skROstR@k
! _:'u-:tRu:pstENn_: ! _:'u-:tRu:pstENn_:
!) ! !) !


__) - (_D mi:nu-:s __) - (_D mi:nu-:s
A_) - (_D _ A_) - (_D _
C_) - (_D _ C_) - (_D _
--) -


* ss;aRn@2
*) * (*
**
**) * (_ _::

= aRli:k
= (==
=) = (=
==) = (_ _::

+ 121
- 0
dictsource/pap_list View File

// This file is UTF8 encoded
// Spelling to phoneme words and exceptions for Papiamento

//http://papiamentu.pbworks.com/Pronouns
//http://www.papiamentu.com/vocab.html



// characters
b be
c se
d de
f Ef
g ge
h ha
j je
k ka
l El
m Em
n En
p pe
q ky
r ER
s Es
t te
v ve
w we
x Eks
z zEt
ñ en^e

_a a
_e e
_i i
_o o
_y igR'Ek $atend

// these letters are in pap_rules, but the letter names include the accent name
á $accent
é $accent
í $accent
ó $accent
ú $accent
// è $accent
// ò $accent
// ù $accrnt

// accent names
_acu skERpi
_grv gRave


// numbers
_0 z'eRo
_1 'unu
_2 d'os
_3 tR'es
_4 kwat'eR
_5 s'inku
_6 s'Ejs
_7 S'ete
_8 'otSo
_9 nw'ebe
_1X dj'es
_11 djes'un
_2X b'inti
_3X tR'inta
_4X kwaR'enta
_5X sinkw'enta
_6X ses'enta
_7X set'enta
_8X otS'enta
_9X nob'enta
_0C sj'en
_0M1 m'il
_1M1 m'il
_0M2 mi'on
_dpt _kOma/


// common function words

un $u+ // a
algun $u+ // some
to

i $u+ $pause // and
y $u $pause // and ??
y igR'Ek $atend

o $u+ $pause // or
òf $u+ $pause // or
ma $pause // but
ku $u+ $brk // which, that
(ken su) $u $brk


mi $u+ // I,me
bo $u+ // you
e $u+ // the. it, he, she
el $u+ // it, he, she (before 'a')
nos $u+ // we
boso $u+ // you
nan $u+ // they

ami $u+ // I
abo $u+ // you
su $u+ // his, her, its


ta $u+ // to be
tabata $u+ // was
lo $u+ // (future)
a $u+ // (past)
// tin $u+ // have
por $u+ // can

di $u+ // of
den $u+ // in
na $u+ // at


+ 139
- 0
dictsource/pap_rules View File

// This file is UTF8 encoded
// Spelling-to-phoneme rules for Papiamento (Curacao, Netherlands Antilles)

.group a
a a
aa a:
ai aI

.group b
b b

.group c
c k
c (Y s
ch tS

.group d
d d
dj dZ

.group e
e e
ee e:
ei eI
eu ew

.group è
è 'E

.group f
f f

.group g
g g
g (Y x
gu (Y g

.group h
h h

.group i
i i
i (A j
A) i (K j
ij eI

.group j
j j

.group k
k k

.group l
l l

.group m
m m

.group n
n n
n (_ N
&) nan (_ n%an

.group ñ
ñ n^

.group o
o o
oe u
oo o:
ou ow

.group ò
ò 'O

.group p
p p

.group q
q k
qu (A kw
qui kwi

.group r
r R

.group s
s s
sh S

.group t
t t

.group u
u u
u (A w
ui uj
uu y

.group ù
ù Y
ùi Yj

.group ü
ü y
üi yj

.group v
v v

.group w
w w

.group x
x ks
_) x (A z

.group y
y j
K) y (K i

.group z
z z
zj Z

.group
' ?
á ''a
é ''e
í ''i
ó ''o
ú ''u
ç s

$ dOlO





+ 96
- 70
dictsource/pt_list View File

// ?3 Epenthetic [I] between consonants // ?3 Epenthetic [I] between consonants
// ?4 Brazil mbrola voice // ?4 Brazil mbrola voice


// $alt change [e] or [o] in the stressed syllable to [E] or [O]
// $alt2 change [E] or [O] in the stressed syllable to [e] or [o]
// Any [E] or [O] phonemes in unstressed words must be listed explicitly


// Note for "pt-pt" [R] is the same sound as [r] // Note for "pt-pt" [R] is the same sound as [r]
// for "pt" [y] is the same sound as [i] // for "pt" [y] is the same sound as [i]


_à $accent _à $accent
_â $accent _â $accent
_ã $accent _ã $accent
_ç $accent
ç $accent
_é $accent _é $accent
_ê $accent _ê $accent
_í $accent _í $accent


// ABBREVIATIONS // ABBREVIATIONS
//************** //**************
aapp $abbrev
abadv $abbrev
abc $abbrev
a.c 'as'e
adsl $abbrev
ae $abbrev
aids $abbrev
apedv $abbrev
avc $abbrev
bios b'i,OS
d.c d,es'e
cne $abbrev
cpu $abbrev
cpuc $abbrev
dpoc $abbrev
ecg $abbrev
edp $abbrev
aapp $abbrev
abadv $abbrev
abc $abbrev
a.c 'as'e
adsl $abbrev
ae $abbrev
aids $abbrev
apedv $abbrev
avc $abbrev
bios b'i,OS
d.c d,es'e
cne $abbrev
cpu $abbrev
cpuc $abbrev
dpoc $abbrev
ecg $abbrev
edp $abbrev
?1 etc ,ets'Et:*& ?1 etc ,ets'Et:*&
?2 etc ,ets'Ete*& ?2 etc ,ets'Ete*&
hiv $abbrev
(http ://) ag,atete'pe_
icc $abbrev
ieee $abbrev // Institute of Electrical and Electronics Engineers
iss $abbrev
jpeg Z,Ot&p'Eg
mpeg ,Emp'Eg
nba $abbrev
nvda $abbrev
oms $abbrev
omt $abbrev
osi $abbrev
e.u.a Eua
eua $abbrev
fbi $abbrev
hiv $abbrev
(http ://) ag,atete'pe_
icc $abbrev
ieee $abbrev // Institute of Electrical and Electronics Engineers
iss $abbrev
jpeg Z,Ot&p'Eg
mpeg ,Emp'Eg
nba $abbrev
nvda $abbrev
oms $abbrev
omt $abbrev
osi $abbrev
?1 sa ,Esj'a ?1 sa ,Esj'a
?1 sos ,Esj,O'Es ?1 sos ,Esj,O'Es
ue $abbrev
unts $abbrev
usb $abbrev
ue $abbrev
unts $abbrev
usb $abbrev




dr $dot dr $dot


// MAIN WORD DICTIONARY // MAIN WORD DICTIONARY
//********************* //*********************
borboleta b,orbol'et&
catorze k&t'orzy
fosse f'osy
fossem f'oseIN
hoje 'oZi
líderes l'ide*ys
mexa m'eS&
mexi meS'i
mexo m'eSU
?2 mulher mulj'Er
?4 mulher mul^'Er
mui mu~j
muito m'u~jtu // -s is included as a suffix
muita m'u~jt&
praxedes pR&S'EdZys
?2 rede x'edZy
selvagem seUv'aZeIN
teta t'et&

// $alt changes the first [o] phoneme to open [O]
novos $alt
mortos $alt
corpos $alt
modo $alt
modos $alt
fogos $alt
lopes $alt
jogos $alt

// Close [O]
?1 calculadora k,Alkul&d'or&
?1 professora pr,ufys'or&
?1 senhora syn^'or&
?1 sobre s'obry
// $alt changes stressed [e] or [o] phoneme to open [E] or [O]
// $alt2 changes stressed [E] or [O] phoneme to close [e] or [o]
boca $alt2
borboleta $alt2
catorze $alt2
copo $alt
escova $alt2
fosse $alt2
fossem $alt2
hoje $alt2
líderes $alt2
mexa m'eS&
mexi meS'i
mexo m'eSU
?2 mulher mulj'Er
?4 mulher mul^'Er
mui mwi
muito mw'iNtU // -s is included as a suffix
muita mw'iNt&
paexa paeSa
perdem $alt
preto $alt2
onu $1
rede $alt2
rixa xiS&
selvagem seUv'aZeIN
suor swOr
tapete $alt2
teta $alt2

novos $alt
mortos $alt
corpos $alt
modo $alt
modos $alt
fogos $alt
lopes $alt
jogos $alt
doce $alt2
drogas $alt
grosso $alt2
torres $alt2

// Close [o]
?1 calculadora $alt2
?1 professora $alt2
?1 senhora $alt2
?1 sobre $alt2

vanessa $alt2
violeta $alt2




abacaxi abakaSy abacaxi abakaSy
axé aSE axé aSE
elixir eliSir elixir eliSir
?1 fixe f'iSy ?1 fixe f'iSy
roxo x'oSU
xiquexique S,ikeS'iky
// foreign words // foreign words
?1 alt 'alt ?1 alt 'alt
?2 agosto &g'ostU ?2 agosto &g'ostU
?2 Outlook ,aUtl'uk ?2 Outlook ,aUtl'uk
?1 paint p'aint ?1 paint p'aint
?1 player pl'eI&r- ?1 player pl'eI&r-
playstation _^_EN
?1 point p'oint ?1 point p'oint
?1 power p'aU&r- ?1 power p'aU&r-
?1 product p:r'&d&kt ?1 product p:r'&d&kt
steve st'i:v steve st'i:v
turing t'u*iNg turing t'u*iNg
voltaire vOlt'Er voltaire vOlt'Er
von f'On
von f%On




// foreign common names/surnames // foreign common names/surnames

+ 757
- 717
dictsource/pt_rules
File diff suppressed because it is too large
View File


+ 15
- 9
dictsource/ta_list View File

ஸ் is ஸ் is
ஹ் iC ஹ் iC
U+b82 anUsvVRV U+b82 anUsvVRV
ஃ ah
ஃ agH
U+bcd ot.RU U+bcd ot.RU


ஏ je: ஏ je:
_0M3 ko:d.ie: _0M3 ko:d.ie:
_1M3 orUko:d.ie: _1M3 orUko:d.ie:


_0M4x a:jirVmko:d.i // 10,000,000,000
_1M4x a:jirVmko:d.i
_0M4 a:jirVmko:d.ie:
_1M4 a:jirVmko:d.ie:
_dpt _pul.l.i


_0M5 a:jirVma:jirVmko:d.i // 10,000,000,000,000
_1M5 a:jirVma:jirVmko:d.i


_dpt _pul.l.i
// English words
tamil தமிழ் $text




// exceptions // exceptions
பீடி $alt பீடி $alt
பீதி $alt பீதி $alt
பேகம் $alt பேகம் $alt
பார்லி $alt
பிக்கினி $alt
பேதம் $alt
போனஸ் $alt
போகி $alt
பாபா ba:ba:
புத்த buddV




// initial த as [d] // initial த as [d]
தடியன் $alt தடியன் $alt
தரிசனம் $alt தரிசனம் $alt
தட்சணை $alt தட்சணை $alt
தைவதம் $alt
தாட்சண்யம் $alt
தனம் $alt
திக்கற்ற $alt




கக $alt // initial க as [g] கக $alt // initial க as [g]




பப pVpV பப pVpV
டாக்டர் d.a:ktVr

+ 215
- 76
dictsource/ta_rules View File

// Spelling to phoneme rules for Tamil // Spelling to phoneme rules for Tamil


// B means a combining vowel sign, or a virama // B means a combining vowel sign, or a virama
// K means a consonant or end-of-word




.replace .replace
௭ 7 ௭ 7
௮ 8 ௮ 8
௯ 9 ௯ 9

ொ ொ ொ ொ
ோ ோ ோ ோ
ௌ ௌ ௌ ௌ




.group 0xe0ae // characters which start with UTF-8 bytes: [e0 ae]

ஂ // anusvara

ஃ // visarga

அ a

ஆ a:

இ i

ஈ i:

உ u

ஊ u:

எ e
_) எ ;e // add a short [j] sound at start of word ?

ஏ e:
_) ஏ ;e: // add a short [j] sound at start of word ?

ஐ aI

ஒ o

ஓ o:

ஔ aU

// consonants // consonants


.group க
க்ஷ ks.V
க்ஷ (B ks.

க gV // inter-vocalic, unless there is virama before or after க gV // inter-vocalic, unless there is virama before or after
க (B g க (B g
க (் g
்) க gV
்) க (B g
_) க kV _) க kV
_) க (B k _) க (B k
_) க (T gV // if word has $alt attribute in ta_list _) க (T gV // if word has $alt attribute in ta_list
_) க (BT g // $alt _) க (BT g // $alt
க்க kkV க்க kkV
க்க (B kk க்க (B kk
ற்) க _kV
ற்) க (B _k


க (ீத g க (ீத g
க (ஜ gV க (ஜ gV
_) க (ுண g _) க (ுண g
_) க (தியில் gV _) க (தியில் gV
_) க (டிகார gV _) க (டிகார gV
வி) க்ட (ோரியா kt. // victoria
க (ோப g
க (ாரன k
க (ாரர k
_) க (ோபம k
_) கோப (ித்து ko:b
_) க (ோபப் k
_) க (ெட்டி g




.group ங
ங NV ங NV
ங (B N ங (B N




.group ச
ச sV // ?? [z] ச sV // ?? [z]
ச (B s ச (B s
_) ச sa
_) ச sV
_) ச (B s _) ச (B s
ச்ச tS:V ச்ச tS:V
ச்ச (B tS: ச்ச (B tS:
ற்ச tS:
ற்ச (B tS:
ட்) ச tSV ட்) ச tSV
ட்) ச (B tS ட்) ச (B tS
ற்) ச tSV
ற்) ச (B tS
ஞ்) ச dZV ஞ்) ச dZV
ஞ்) ச (B dZ ஞ்) ச (B dZ
ச் (_ tS
ச்_) ச tSV // previous word ends in ச்
ச்_) ச (B tS

_) ச (ிட் tS _) ச (ிட் tS
_) ச (ின் tS _) ச (ின் tS


_) ச (ப்பாத்தி tSV




.group ஜ
ஜ dZV ஜ dZV
ஜ (B dZ ஜ (B dZ




.group ஞ
ஞ n^V ஞ n^V
ஞ (B n^ ஞ (B n^




.group ட
ட d.V ட d.V
ட (B d. ட (B d.
// _) ட t.V
// _) ட (B t.
_) ட (ீ t.
ட்ட t.t.V ட்ட t.t.V
ட்ட (B t.t. ட்ட (B t.t.
ஷ்) ட t.V ஷ்) ட t.V
ஷ்) ட (B t. ஷ்) ட (B t.
_) டாக்ட (ர d.a:kt.V
_) ட (ோக்கியோ t.
ிங்) ட (ன் t.V // -ington
_) ட (ாக்க t. // talkies



.group ண
ண n.V ண n.V
ண (B n. ண (B n.




.group த
த dV த dV
த (B d த (B d
_) த tV _) த tV
ஸ்) த tV ஸ்) த tV
ஸ்) த (B t ஸ்) த (B t




// exceptions, த as [d] // exceptions, த as [d]
_) த (ன dV
_) த (ர்ம dV
_) த (ுர் d
_) த (ூர d
_) த (ர்ம dV
_) த (ுர் d
_) த (ூர d
_) த (ெய்வ d _) த (ெய்வ d
_) த (ுஷ் d
_) த (ுஷ் d
_) த (க்ஷிணா dV _) த (க்ஷிணா dV
_) த (ண்ட dV
_) த (ருமி dV
_) த (ர்பை dV
_) த (ண்ட dV
_) த (ருமி dV
_) த (ர்பை dV
_) த (ாவா d _) த (ாவா d
_) த (ாதா d _) த (ாதா d
_) த (ரித்திரம dV _) த (ரித்திரம dV
_) த (ர்பார dV
_) த (ீர்க d
_) த (ர்பார dV
_) த (ீர்க d
_) த (ீரன d
_) த (ீரர் d
_) த (ீரச் d
_) த (ினுச d _) த (ினுச d
_) த (ாராவி d _) த (ாராவி d
_) த (ர்க dV
_) த (ர்க dV
_) த (ான d _) த (ான d
_) த (ேக d _) த (ேக d
_) த (ேக்கு t _) த (ேக்கு t
_) த (ேக்கடி t _) த (ேக்கடி t
_) த (ிரவிய d _) த (ிரவிய d
_) த (ூப d _) த (ூப d
_) த (ீப d
_) த (ீர d
_) த (ீப d
_) த (ைரிய d _) த (ைரிய d
_) த (ிட d
_) த (ிட d
_) த (ிரவ d _) த (ிரவ d
_) த (ிடீ d
_) த (ிடீ d
_) த (ிவச d _) த (ிவச d
_) த (ியான d _) த (ியான d
_) த (ானிய d _) த (ானிய d
_) த (ிகில d _) த (ிகில d
_) த (ூம d _) த (ூம d
_) த (ாவணி d _) த (ாவணி d
_) த (ாம்_தூம d
_) த (ாம்_தூம d
_) த (ாடி d _) த (ாடி d
_) த (ாச d _) த (ாச d
_) த (சரா dV _) த (சரா dV
_) த (ரணி dV _) த (ரணி dV
_) த (ாரணி d _) த (ாரணி d
_) த (ோசை d _) த (ோசை d



_) த (வம dV
_) த (ட்சன dV
_) த (ாட்சாய d
_) த (ாக்கா d
_) த (ில்லி d
_) த (டித்த dV
_) த (டியன dV
_) த (டியர dV
_) த (ிக்கு d
_) த (ிக்கு_வாய t
_) த (ிக்கில d
_) த (னபால dV
_) த (னசேகரன dV
_) த (னலட்சுமி dV
_) த (னகோடி dV
_) த (னன்ஜெயன dV
_) த (ிசை d
_) த (சை dV
_) த (னராஜ dV
_) த (ன்மந்திரி dV
_) த (ினம d
_) த (ினக d
_) த (னலக்ஷ்மி dV
_) த (க்க்ஷிண dV
_) த (ட்சிண dV
_) த (ன்ராஜ dV
_) த (ாராபுர d
_) த (டி_மாட dV

பு) த்த (ி dd
பு) த்த (ியி dd
பு) த்த (ர ddV
பு) த்த (ன ddV


.group ந
ந nV ந nV
ந (B n // dental n ந (B n // dental n




.group ன
ன nV ன nV
ன (B n // alveolar n ன (B n // alveolar n




.group ப
ப bV ப bV
ப (B b ப (B b
_) ப pV _) ப pV
ட்) ப (B p ட்) ப (B p
ற்) ப pV ற்) ப pV
ற்) ப (B p ற்) ப (B p
று) ப pV
று) ப(B p
று) ப _pV
று) ப(B _p
ன்) ப pV ன்) ப pV
ன்) ப (B p ன்) ப (B p


ம்) ப p
ம்) ப (ா p
ம்) ப (B b
த்) ப p
த்) ப (ா p
த்) ப (B b
ம) ப pV
ம) ப (ா p
ம) ப (B b
த) ப pV
த) ப (ா p
த) ப (B b

பத (ி pVt
ப (ுர p
ப (ால p
ப (ாள p
ம்) ப (ா b


ஃ) ப fV
ஃ) ப (B f


_) ப (ால b _) ப (ால b
_) ப (ால் p _) ப (ால் p
_) ப (லி bV _) ப (லி bV
_) ப (கவான bV _) ப (கவான bV
_) ப (ௌதிக b _) ப (ௌதிக b


_) ப (ரோட bV
_) ப (ெர்லிங b
_) ப (ீஜிங b
_) ப (ுவன b
_) ப (ரதநாட்டிய bV
_) ப (ேதலித்த b
_) ப (ோன்ஸ்லே b
_) ப (ௌத்த b
_) ப (கீர bV
_) ப (கிரங்க bV
_) ப (ோபால b
_) ப (ெங்களூர b
_) ப (ூபாள b
_) ப (ுத்த b
_) ப (னியன bV
கோ) ப (ி p


// musical notes
சா) ப (ா p
ரி) ப (K pV
ரீ) ப (K pV
ரி) ப (ா p
ரீ) ப (ா p
ம) ப (K pV
மா) ப (K pV
ம) ப (ா p
மா) ப( ா p
பப (K pVpV
பாப (K pa:pV
பப (ா pVp
பாப (ா pa:p
// த) ப (K pV
தா) ப (K pV
// த) ப (ா p
தா) ப (ா p

னி) ப (K pV
னீ) ப (K pV
னி) ப (ா p
னீ) ப( ா p
க) ப (K pV
க) ப (ா p
கா) ப (K pV
கா) ப (ா p

// (exceptions)
தா) ப (ம் bV
_த) ப (ால b
_க) ப (ால b
_கா) ப (ந்து bV



.group ம
ம mV ம mV
ம (B m ம (B m




.group ய
ய jV ய jV
ய (B j ய (B j




.group ர
ர rV ர rV
ர (B r ர (B r




.group ற
ற RV ற RV
ற (B R ற (B R
ற் (ற t. // RR -> t.R ற் (ற t. // RR -> t.R
ற்ச tS:
ற்ச (B tS:




.group ல
ல lV ல lV
ல (B l ல (B l




.group ள
ள l.V ள l.V
ள (B l. ள (B l.




.group ழ
ழ z.V ழ z.V
ழ (B z. ழ (B z.



.group வ
வ vV வ vV
வ (B v வ (B v




.group ஶ
ஶ SV ஶ SV
ஶ (B S ஶ (B S




.group ஷ
ஷ s.V ஷ s.V
ஷ (B s. ஷ (B s.




.group ஸ
ஸ sV ஸ sV
ஸ (B s ஸ (B s




.group ஹ
ஹ HV ஹ HV
ஹ (B H ஹ (B H




க்ஷ ks.V
க்ஷ (B ks.
.group ஃ
ஃ h
ஃப fV
ஃப (B f
ஃத QdV
ஃத (B Qd
ஃக gQV
ஃக (B gQ

// vowel letters

.group 0xe0ae // characters which start with UTF-8 bytes: [e0 ae]

ஂ // anusvara

அ a

ஆ a:

இ i
_) இ (ரா // silent before 'raa'

ஈ i:

உ u

ஊ u:

எ e
_) எ ;e // add a short [j] sound at start of word ?

ஏ e:
_) ஏ ;e: // add a short [j] sound at start of word ?

ஐ aI

ஒ o

ஓ o:

ஔ aU




// combining vowels // combining vowels

+ 15
- 8
docs/commands.html View File

Or just type<br> Or just type<br>
&nbsp; <strong>espeak</strong><br> &nbsp; <strong>espeak</strong><br>
followed by text on subsequent lines. Each line is spoken when followed by text on subsequent lines. Each line is spoken when
RETURN is pressed.<br>Use <strong>espeak -x</strong> to see the corresponding phoneme codes.
RETURN is pressed.
<p>
Use <strong>espeak -x</strong> to see the corresponding phoneme codes.
<p>&nbsp;<hr> <p>&nbsp;<hr>
<h3>2.2.2 The Command Line Options</h3> <h3>2.2.2 The Command Line Options</h3>
<dl> <dl>
<dt> <dt>
<strong>-s &lt;integer&gt;</strong><br> <strong>-s &lt;integer&gt;</strong><br>
<dd>Sets the speed in words-per-minute (approximate values for the default English voice, others may differ slightly). The default value is 170. I generally use a faster speed <dd>Sets the speed in words-per-minute (approximate values for the default English voice, others may differ slightly). The default value is 170. I generally use a faster speed
of 190. Range 80 to 390.
of 190. Range 80 to 390. Larger value are rounded down to the maximum.
<p> <p>
<dt> <dt>
<strong>-b</strong><br>
<dd>Indicates that the input text is not UTF-8, but the 8-bit character set which corresponds to the language (eg. Latin-2 for Polish). Without this option, eSpeak assumes text is UTF8, but will automatically switch to the 8-bit character set if it finds an illegal UTF8 sequence. That may give wrong results if some 8-bit character sequences look like valid UFT8 multibyte characters.
<strong>-b &lt;integer&gt;</strong><br>
<dd>Input text character format.<p>
1 &nbsp; UTF-8. This is the default.<p>
2 &nbsp; The 8-bit character set which corresponds to the language (eg. Latin-2 for Polish).<p>
4 &nbsp; 16 bit Unicode.<p>
Without this option, eSpeak assumes text is UTF-8, but will automatically switch to the 8-bit character set if it finds an illegal UTF-8 sequence.
<p> <p>
<dt> <dt>
<strong>-g &lt;integer&gt;</strong><br> <strong>-g &lt;integer&gt;</strong><br>
<pre> espeak -vaf</pre> <pre> espeak -vaf</pre>
To use the Afrikaans voice. A modifier after the voice name can be used to vary the tone of the voice, eg: To use the Afrikaans voice. A modifier after the voice name can be used to vary the tone of the voice, eg:
<pre> espeak -vaf+3</pre> <pre> espeak -vaf+3</pre>
The variants are <code> +m1 +m2 +m3 +m4 +m5 +m6 </code> for male voices and <code> +f1 +f2 +f3 +f4 </code> which simulate female voices by using higher pitches. Other variants are <code>+croak</code> and <code>+whisper</code>.
The variants are <code> +m1 +m2 +m3 +m4 +m5 +m6 +m7</code> for male voices and <code> +f1 +f2 +f3 +f4 </code> which simulate female voices by using higher pitches. Other variants include <code>+croak</code> and <code>+whisper</code>.
<p> <p>
&lt;voice filename&gt; is a file within the <code>espeak-data/voices</code> directory.<br> &lt;voice filename&gt; is a file within the <code>espeak-data/voices</code> directory.<br>
&lt;variant&gt; is a file within the <code>espeak-data/voices/!v</code> directory.<p> &lt;variant&gt; is a file within the <code>espeak-data/voices/!v</code> directory.<p>
<strong>--voices [=&lt;language code&gt;]</strong><br> <strong>--voices [=&lt;language code&gt;]</strong><br>
<dd>Lists the available voices.<br> <dd>Lists the available voices.<br>
If =&lt;language code&gt; is present then only those voices which are suitable for that language are listed.<br> If =&lt;language code&gt; is present then only those voices which are suitable for that language are listed.<br>
<code>--voices=mbrola</code> lists the voices which use mbrola diphone voices. These are not included in the <code>--voices</code> list<br>
<code>--voices=mbrola</code> lists the voices which use mbrola diphone voices. These are not included in the default <code>--voices</code> list<br>
<code>--voices=variant</code> lists the voice variants (voice modifiers).<br> <code>--voices=variant</code> lists the voice variants (voice modifiers).<br>


</dl> </dl>
&nbsp; eg: &nbsp; <code> espeak -v en "[[D,Is Iz sVm f@n'EtIk t'Ekst 'InpUt]]" </code><p> &nbsp; eg: &nbsp; <code> espeak -v en "[[D,Is Iz sVm f@n'EtIk t'Ekst 'InpUt]]" </code><p>
This command will speak: "This is some phonetic text input". This command will speak: "This is some phonetic text input".
</dl> </dl>
</body>
</b>


<hr>
<a href="http://sourceforge.net"><img src="http://sflogo.sourceforge.net/sflogo.php?group_id=159649&amp;type=2" width="125" height="37" border="0" alt="SourceForge.net Logo" /></a>


</body>

+ 13
- 6
docs/dictionary.html View File

A group for each letter or character. A group for each letter or character.
<p> <p>
<dt><strong>.group &lt;2 characters&gt;</strong><br><dd> <dt><strong>.group &lt;2 characters&gt;</strong><br><dd>
Optional groups for some common 2 letter combinations. This is only needed, for efficiency, in cases where there are many rules for a particular letter. They would not be needed for a language which has regular spelling rules.
Optional groups for some common 2 letter combinations. This is only needed, for efficiency, in cases where there are many rules for a particular letter. They would not be needed for a language which has regular spelling rules. The first character can only be an ascii character (less than 0x80).
<p> <p>
<dt><strong>.group</strong><br><dd> <dt><strong>.group</strong><br><dd>
A group for other characters which don't have their own group. A group for other characters which don't have their own group.
<p> <p>
<dt><strong>.L&lt;nn&gt;</strong><br><dd> <dt><strong>.L&lt;nn&gt;</strong><br><dd>
Defines a group of letter sequences, any of which can match with <strong>Lnn</strong> in a <strong>post</strong> rule (see below). <strong>nn</strong> is a 2 digit decimal number in the range 01 to 25. eg:<p>
Defines a group of letter sequences, any of which can match with <strong>Lnn</strong> in a <strong>pre</strong> or <strong>post</strong> rule (see below). <strong>nn</strong> is a 2 digit decimal number in the range 01 to 25. eg:<p>
<code>.L01 b bl br pl pr</code> <code>.L01 b bl br pl pr</code>
<p> <p>
<dt><strong>.replace</strong><br><dd> <dt><strong>.replace</strong><br><dd>
<td><strong>B&nbsp;H&nbsp;F&nbsp;G&nbsp;Y&nbsp;</strong></td> <td><strong>B&nbsp;H&nbsp;F&nbsp;G&nbsp;Y&nbsp;</strong></td>
<td>These may indicate other sets of characters (defined for a particular language).</td> <td>These may indicate other sets of characters (defined for a particular language).</td>
</tr> </tr>
<tr>
<tr>
<td><strong>L&lt;nn&gt;</strong></td>
<td>Any of the sequence of characters defined as a letter group (see 4.3.1 above).</td>
</tr>
<tr>
<td><strong>D</strong></td> <td><strong>D</strong></td>
<td>Any digit.</td> <td>Any digit.</td>
</tr> </tr>
<td>$dot</td> <td>$dot</td>
<td>Ignore a . after this word even when followed by a capital letter (eg. Mr. Dr. ).</td> <td>Ignore a . after this word even when followed by a capital letter (eg. Mr. Dr. ).</td>
</tr> </tr>
<tr>
<td>$hasdot</td>
<td>Use this pronunciation if the word is followed by a dot. (This attribute also implies $dot).</td>
</tr>
<tr> <tr>
<td>$abbrev</td> <td>$abbrev</td>
<td>This has two meanings.<br> 1. If there is no phoneme string: Speak the word as individual letters, even if it contains a vowel (eg. "abc" should be spoken as "a" "b" "c").<br>2. If there is a phoneme string: This word is capitalized because it is an abbreviation and capitalization does indicate emphasis (if the "emphasize all-caps" is on).</td> <td>This has two meanings.<br> 1. If there is no phoneme string: Speak the word as individual letters, even if it contains a vowel (eg. "abc" should be spoken as "a" "b" "c").<br>2. If there is a phoneme string: This word is capitalized because it is an abbreviation and capitalization does indicate emphasis (if the "emphasize all-caps" is on).</td>
<td>The numbers 0 to 9 <td>The numbers 0 to 9
</tr> </tr>
<tr> <tr>
<td>_13<td>etc. Any pronunciations which are needed for specific numbers in the range _11 to _99 &nbsp;
<td>_13<td>etc. Any pronunciations which are needed for specific numbers in the range _10 to _99 &nbsp;
</tr> </tr>
<tr> <tr>
<td>_2X &nbsp;_3X<td>Twenty, thirty, etc., used to make numbers 10 to 99 &nbsp; <td>_2X &nbsp;_3X<td>Twenty, thirty, etc., used to make numbers 10 to 99 &nbsp;
</tr> </tr>
<tr> <tr>
<td>_nn<td>Any two digit numbers with a special pronunciation (eg. _15 "fifteen").
</tr> </tr>
<tr><TD>_0C<td>The word for "hundred"</td> <tr><TD>_0C<td>The word for "hundred"</td>
<tr><TD>_1C &nbsp;_2C<td>Special pronunciation for one hundred, two hundred, etc., if needed.</tr> <tr><TD>_1C &nbsp;_2C<td>Special pronunciation for one hundred, two hundred, etc., if needed.</tr>
<tr><TD>_0M1<td>The word for "thousand"</tr> <tr><TD>_0M1<td>The word for "thousand"</tr>
<tr><TD>_0M2<td>The word for "million"</tr> <tr><TD>_0M2<td>The word for "million"</tr>
<tr><TD>_0M3<td>The word for 1000000000</tr> <tr><TD>_0M3<td>The word for 1000000000</tr>
<tr><TD>_1M1 &nbsp;_2M1<td>Special pronunciation for one thousand, two thousand, tc, if needed</td>
<tr><TD>_1M1 &nbsp;_2M1<td>Special pronunciation for one thousand, two thousand, etc, if needed</td>
<tr><TD>_0and<td>Word for "and" when speaking numbers (eg. "two hundred and twenty").</tr> <tr><TD>_0and<td>Word for "and" when speaking numbers (eg. "two hundred and twenty").</tr>
<tr><TD>_dpt<td>Word spoken for the decimnal point/comma</tr> <tr><TD>_dpt<td>Word spoken for the decimnal point/comma</tr>
<tr><TD>_dpt2<td>Word spoken (if any) at the end of all the digits after a decimal point.</tr> <tr><TD>_dpt2<td>Word spoken (if any) at the end of all the digits after a decimal point.</tr>

+ 27
- 19
docs/index.html View File

<div align="center"> <div align="center">
(email) &nbsp; jonsd at users dot sourceforge.net<br> (email) &nbsp; jonsd at users dot sourceforge.net<br>
<a href="http://espeak.sf.net/download.html"><strong>Download</strong></a> <a href="http://espeak.sf.net/download.html"><strong>Download</strong></a>
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://sourceforge.net/forum/?group_id=159649"><strong>Forum</strong></a>
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://sourceforge.net/projects/espeak/"><strong>eSpeak Sourceforge page</a>
&nbsp; &nbsp; &nbsp; &nbsp;
<a href="http://sourceforge.net/projects/espeak/"><strong>eSpeak Sourceforge page</a>
&nbsp; &nbsp; &nbsp; &nbsp;
<a href="http://sourceforge.net/forum/?group_id=159649"><strong>Forum</strong></a>
&nbsp; &nbsp; &nbsp; &nbsp;
<a href="http://sourceforge.net/mail/?group_id=159649"><strong>Mailing list</strong></a>
</div> </div>
</td> </td>
</tr> </tr>
eSpeak is a compact open source software speech synthesizer for English and other languages, for Linux and Windows. &nbsp; eSpeak is a compact open source software speech synthesizer for English and other languages, for Linux and Windows. &nbsp;
<a href="http://espeak.sourceforge.net/"><strong>http://espeak.sourceforge.net</strong></a> <a href="http://espeak.sourceforge.net/"><strong>http://espeak.sourceforge.net</strong></a>
<p> <p>
eSpeak produces good quality English speech. It uses a different synthesis method from other open source TTS engines, and sounds quite different. It's perhaps not as natural or "smooth", but I find the articulation clearer and easier to listen to for long periods.
eSpeak uses a "formant synthesis" method. This allows many languages to be provided in a small size. The speech is clear, and can be used at high speeds, but is not as natural or smooth as larger synthesizers which are based on human speech recordings.
<p> <p>
It can run as a command line program to speak text from a file or from stdin. A shared library version is also available.

eSpeak is available as:
<ul>
<li>A command line program (Linux and Windows) to speak text from a file or from stdin.
<li>A shared library version for use by other programs. (On Windows this is a DLL).
<li>A SAPI5 version for Windows, so it can be used with screen-readers and other programs that support the Windows SAPI5 interface.
<li>eSpeak has been ported to other platforms, including Solaris and Mac OSX.
</ul>
Features.
<ul> <ul>
<li>Includes different Voices, whose characteristics can be altered. <li>Includes different Voices, whose characteristics can be altered.
<li>Can produce speech output as a WAV file. <li>Can produce speech output as a WAV file.
<li>SSML (Speech Synthesis Markup Language) is supported (not complete), and also HTML. <li>SSML (Speech Synthesis Markup Language) is supported (not complete), and also HTML.
<li>Compact size. The program and its data, including many languages, totals about 1 Mbytes.
<li>Can translate text to phoneme codes, so it could be adapted as a front end for another speech synthesis engine.
<li>Potential for other languages. Several are included in varying stages of progress. Help from native speakers for these or other languages is welcomed.
<li>Development tools available for producing and tuning phoneme data.
<li>Written in C++.
<li>Compact size. The program and its data, including many languages, totals about 1.4 Mbytes.
<li>Can be used as a front-end to MBROLA diphone voices, see <a href="mbrola.html">mbrola.html</a>. eSpeak converts text to phonemes with pitch and length information.
<li>Can translate text into phoneme codes, so it could be adapted as a front end for another speech synthesis engine.
<li>Potential for other languages. Several are included in varying stages of progress. Help from native speakers for these or other languages is welcome.
<li>Development tools are available for producing and tuning phoneme data.
<li>Written in C.
</ul> </ul>
<p> <p>
It works well as a "Talker" with the KDE text to speech system (KTTS), as an alternative to Festival for example. As such, it can speak text which has been selected into the clipboard, or directly from the Konqueror browser or the Kate editor. A Gnome Speech driver is now available.
<p>
I regularly use it to listen to blogs and news sites. I prefer the sound through a domestic stereo system rather than my small computer speakers.
<hr>
<strong>Windows Version</strong>. There are Windows SAPI5 and command-line versions of eSpeak. The SAPI5 version can be used with screen readers such as NVDA, JAWS, Supernova, and Window-Eyes.<br>
They are available as a Windows installer package from the <a href="download.html"><strong>eSpeak Download</strong></a> page.<p>
A Windows version of the espeakedit program is also available.
I regularly use eSpeak to listen to blogs and news sites. I prefer the sound through a domestic stereo system rather than small computer speakers, which can sound rather harsh.


<hr> <hr>
<strong>Languages</strong>. The eSpeak speech synthesizer supports several languages, however in most cases these are initial drafts and need more work to improve them. Assistance from native speakers is welcome for these, or other new languages. Please contact me if you want to help.<p>
eSpeak does text to speech synthesis for the following languages, some better than others. Afrikaans, Albanian, Armenian, Cantonese, Catalan, Croatian, Czech, Dutch, English, Esperanto, Finnish, French, German, Greek, Hindi, Hungarian, Icelandic, Indonesian, Italian, Kurdish, Latvian, Lojban, Macedonian, Mandarin, Norwegian, Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Spanish, Swahili, Swedish, Tamil, Vietnamese, Welsh. See <a href="languages.html">Languages</a>.
<strong>Languages</strong>. The eSpeak speech synthesizer supports several languages, however in many cases these are initial drafts and need more work to improve them. Assistance from native speakers is welcome for these, or other new languages. Please contact me if you want to help.<p>
eSpeak does text to speech synthesis for the following languages, some better than others. Afrikaans, Albanian, Armenian, Cantonese, Catalan, Croatian, Czech, Danish, Dutch, English, Esperanto, Finnish, French, German, Greek, Hindi, Hungarian, Icelandic, Indonesian, Italian, Kurdish, Latvian, Lojban, Macedonian, Mandarin, Norwegian, Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Spanish, Swahili, Swedish, Tamil, Turkish, Vietnamese, Welsh.
<hr>
The latest <strong>development version</strong> is at:
<a href="http://espeak.sf.net/test/latest.html">espeak.sf.net/test/latest.html</a>.
<hr> <hr>
<strong>espeakedit</strong> is a GUI program used to prepare and compile phoneme data. It is now available for download. Documentation is currently sparse, but if you want to use it to add or improve language support, let me know. <strong>espeakedit</strong> is a GUI program used to prepare and compile phoneme data. It is now available for download. Documentation is currently sparse, but if you want to use it to add or improve language support, let me know.
<hr> <hr>

+ 20
- 19
phsource/compile_report View File

new total new total
base 104 104 base 104 104
base2 26 125 base2 26 125
en 50 150
en 51 150
en_n 32 150 en_n 32 150
en_us 37 151
en_us 36 151
en_sc 39 152 en_sc 39 152
en_rp 34 150 en_rp 34 150
en_wm 31 150 en_wm 31 150
es 9 125 es 9 125
es_la 1 125 es_la 1 125
ca 11 127 ca 11 127
pt 28 141
pt_pt 20 141
pt 30 142
pt_pt 20 142
ro 36 147 ro 36 147
el 8 125 el 8 125
grc 12 129 grc 12 129
id 15 127 id 15 127
sq 35 128 sq 35 128
hy 24 120 hy 24 120
da 22 122
da 20 119
rw 15 132 rw 15 132
ml 13 154 ml 13 154
kn 15 154 kn 15 154
[d.] bn [d.] bn
d/tap [*;] ro d/tap [*;] ro
d/tap1 [*] base d/tap1 [*] base
d/tap2 [t#] en_us
d/tap2 [t#] en
[*] pt
d/tap3 [*] base d/tap3 [*] base
d/tap4 [r] es d/tap4 [r] es
d/tap_i [*;] ro d/tap_i [*;] ro
d/xdz [dz] pl d/xdz [dz] pl
[dz] sq [dz] sq
[dz] hy [dz] hy
d/x_tap [t#] en_us
d/x_tap [t#] en
[*] pt
dzh/dzh [dZ] base dzh/dzh [dZ] base
[dZ;] base [dZ;] base
[dz;] base [dz;] base
[x] pt [x] pt
r3/r_u [(u)] base r3/r_u [(u)] base
r3/r_uvl [r"] base r3/r_uvl [r"] base
[R4] da
r3/r_uvl.wav [r"] base r3/r_uvl.wav [r"] base
[R] fr [R] fr
[r] fr [r] fr
[r/2] fr [r/2] fr
[R4] da
r3/rx [*] base r3/rx [*] base
[r/] base [r/] base
[r/] af [r/] af
r3/@tap2 [**] base r3/@tap2 [**] base
r3/@tap_rfx [r.] base r3/@tap_rfx [r.] base
r/a_ [r] da r/a_ [r] da
r/aa [R6] da
r/aa [R] da
r/r [r] base r/r [r] base
[r-] base [r-] base
[r] en_sc [r] en_sc
[r] de [r] de
[R5] da
r/_r [r] base r/_r [r] base
[r] en_sc [r] en_sc
[r.] bn [r.] bn
[a2] en_sc [a2] en_sc
[a2] en_wi [a2] en_wi
[&] sr [&] sr
[&] pt
[&/] pt
[a#] rw [a#] rw
[a/] rw [a/] rw
vowel/a_2 [a] base2 vowel/a_2 [a] base2
[a] hi [a] hi
[a#] ru [a#] ru
[a#] ca [a#] ca
[&] pt
[&/] pt
[&] pt_pt [&] pt_pt
[&/] pt_pt [&/] pt_pt
[a] zhy [a] zhy
[E:] sv [E:] sv
[E:] no [E:] no
[e] zhy [e] zhy
vowel/ee_2 [E] en
[E] cy
vowel/ee_2 [E] cy
[E2] nl [E2] nl
[E] zh [E] zh
[E#] ku [E#] ku
[E] pt [E] pt
[E] vi [E] vi
vowel/ee_4 [E] sq vowel/ee_4 [E] sq
vowel/ee_5 [E] en
vowel/ee_6 [&] sk vowel/ee_6 [&] sk
[E3] sv [E3] sv
[E] ku [E] ku
[i] sq [i] sq
[y] ml [y] ml
[y] kn [y] kn
vowel/ii_2 [i] zh
vowel/ii_2 [I] en
[i] zh
vowel/ii#_2 [y] pl vowel/ii#_2 [y] pl
vowel/ii_3 [I] cy vowel/ii_3 [I] cy
[I] fi [I] fi
[I] bn [I] bn
[I] pa [I] pa
vowel/ii#_3 [I2] en_us vowel/ii#_3 [I2] en_us
vowel/ii_4 [I] en
[I2] en
vowel/ii_4 [I2] en
[I] en_us [I] en_us
vowel/ii_5 [I] la vowel/ii_5 [I] la
[i] zh [i] zh
[u:] lv [u:] lv
[u:] cs [u:] cs
[U] la [U] la
[u2] pt
[u] id [u] id
[u] ml [u] ml
[u:] ml [u:] ml
x/b_ [b] base x/b_ [b] base
[b] fr [b] fr
x/d [d] base x/d [d] base
[t#] en_us
[t#] en
[d] fr [d] fr
[d.] hi [d.] hi
[dh.] hi [dh.] hi
[d] hr [d] hr
[*] pt
[d] el [d] el
[d] is [d] is
[d] id [d] id

BIN
phsource/d/tap2 View File


BIN
phsource/n/nr@ View File


BIN
phsource/n/nra View File


BIN
phsource/n/nre View File


BIN
phsource/n/nri View File


BIN
phsource/n/nro View File


BIN
phsource/n/nru View File


+ 1
- 19
phsource/ph_danish View File

lengthmod 7 lengthmod 7
endphoneme endphoneme


phoneme R6 //
phoneme R //
liquid liquid
formants r/aa formants r/aa
lengthmod 7 lengthmod 7
endphoneme endphoneme


phoneme R4 // uvular trill [r"] without WAV
vcd uvl frc
formants r3/r_uvl+r3/r_uvl.wav%1
before _ r3/r_uvl+r3/r_uvl.wav%1
lengthmod 6
endphoneme


phoneme R5 // English r
liquid starttype #r endtype #r
rhotic
length 100
lengthmod 7
beforenotvowel r/
formants r/r
endphoneme



+ 12
- 2
phsource/ph_english View File

endphoneme endphoneme




phoneme t# // reduced [t] as in "city"
vcd alv stop
vowelin f1=1 f2=1700 -300 300 f3=-100 80
vowelout f1=2 f2=1700 -300 300 f3=-100 80
formants d/tap2+x/d%70
after @ d/x_tap
lengthmod 5
endphoneme


phoneme l phoneme l
liquid liquid
length 100 length 100
phoneme E phoneme E
vowel starttype (e) endtype (e) vowel starttype (e) endtype (e)
length 140 length 140
formants vowel/ee_2
formants vowel/ee_5
reduceto I 0 reduceto I 0
endphoneme endphoneme


phoneme I phoneme I
vowel starttype (i) endtype (i) vowel starttype (i) endtype (i)
length 130 length 130
formants vowel/ii_4
formants vowel/ii_2
linkout ; linkout ;
endphoneme endphoneme



+ 0
- 9
phsource/ph_english_us View File

endphoneme endphoneme




phoneme t# // reduced [t] as in "city"
vcd alv stop
vowelin f1=1 f2=1700 -300 300 f3=-100 80
vowelout f1=2 f2=1700 -300 300 f3=-100 80
formants d/tap2+x/d%70
after @ d/x_tap
lengthmod 5
endphoneme


+ 1
- 1
phsource/ph_german View File



phoneme y phoneme y
vowel starttype (u) endtype (u) vowel starttype (u) endtype (u)
length 150
length 130
formants vowel/yy_4 formants vowel/yy_4
before * DFT+40 before * DFT+40
endphoneme endphoneme

+ 7
- 0
phsource/ph_hungarian View File



phoneme i: phoneme i:
vowel starttype (i) endtype (i) vowel starttype (i) endtype (i)
long
length 220 length 220
formants vowel/i formants vowel/i
// linkout ; // linkout ;


phoneme e: phoneme e:
vowel starttype (e) endtype (e) vowel starttype (e) endtype (e)
long
length 240 length 240
formants vowel/e_3 formants vowel/e_3
endphoneme endphoneme


phoneme a: phoneme a:
vowel starttype (a) endtype (a) vowel starttype (a) endtype (a)
long
length 270 length 270
formants vowel/a formants vowel/a
endphoneme endphoneme


phoneme o: phoneme o:
vowel starttype (o) endtype (o) vowel starttype (o) endtype (o)
long
length 260 length 260
formants vowel/o_2 formants vowel/o_2
endphoneme endphoneme


phoneme u: phoneme u:
vowel starttype (u) endtype (u) vowel starttype (u) endtype (u)
long
length 240 length 240
formants vowel/u_bck formants vowel/u_bck
endphoneme endphoneme


phoneme y: phoneme y:
vowel starttype (u) endtype (u) vowel starttype (u) endtype (u)
long
length 240 length 240
formants vowel/y formants vowel/y
endphoneme endphoneme


phoneme Y: phoneme Y:
vowel starttype (@) endtype (@) vowel starttype (@) endtype (@)
long
length 260 length 260
formants vowel/y# formants vowel/y#
endphoneme endphoneme

+ 24
- 5
phsource/ph_pt_brazil View File



phoneme &~ phoneme &~
vowel starttype (@) endtype (@) vowel starttype (@) endtype (@)
length 200
length 180
formants vnasal/a#_n formants vnasal/a#_n
// reduceto & 4 // reduceto & 4
endphoneme endphoneme
phoneme & phoneme &
vowel starttype (@) endtype (@) vowel starttype (@) endtype (@)
length 180 length 180
formants vowel/a#
formants vowel/a#_3
endphoneme endphoneme


phoneme &/ // Used for final "a" when next word starts with "a" phoneme &/ // Used for final "a" when next word starts with "a"
vowel starttype (@) endtype (@) vowel starttype (@) endtype (@)
beforevowel NULL beforevowel NULL
length 180 length 180
formants vowel/a#
formants vowel/a#_3
endphoneme endphoneme






phoneme y // this is the same as [i] for Brazil phoneme y // this is the same as [i] for Brazil
vowel starttype (i) endtype (i) vowel starttype (i) endtype (i)
length 150
length 110
formants vowel/ii_6 formants vowel/ii_6
linkout ; linkout ;
endphoneme endphoneme
formants vowel/u_bck formants vowel/u_bck
endphoneme endphoneme


phoneme U
phoneme u2 // TEST
vowel starttype (u) endtype (u) vowel starttype (u) endtype (u)
length 160 length 160
formants vowel/u
endphoneme

phoneme U
vowel starttype (u) endtype (u)
length 140
formants vowel/uu_bck formants vowel/uu_bck
endphoneme endphoneme


vowel starttype (a) endtype (i) vowel starttype (a) endtype (i)
length 230 length 230
formants vdiph/ai formants vdiph/ai
linkout ;
endphoneme endphoneme




vowel starttype (e) endtype (i) vowel starttype (e) endtype (i)
length 210 length 210
formants vdiph/ei formants vdiph/ei
linkout ;
endphoneme endphoneme




vowel starttype (o) endtype (i) vowel starttype (o) endtype (i)
length 230 length 230
formants vdiph/0i formants vdiph/0i
linkout ;
endphoneme endphoneme




switchvoicing z switchvoicing z
endphoneme endphoneme



phoneme *
vcd alv stop
vowelin f1=1 f2=1700 -300 300 f3=0 80
vowelout f1=2 f2=1700 -300 300 f3=0 80
formants d/tap2+x/d%40
after @ d/x_tap
lengthmod 6
endphoneme


BIN
phsource/vnasal/a#_n View File


BIN
phsource/vowel/a#_3 View File


BIN
phsource/vowel/a_5 View File


BIN
phsource/vowel/e_8 View File


BIN
phsource/vowel/e_9 View File


BIN
phsource/vowel/ii_2 View File


BIN
phsource/vowel/o_8 View File


BIN
phsource/vowel/vowelchart.png View File


BIN
phsource/vwl_fr/_r View File


BIN
phsource/vwl_fr/r View File


BIN
phsource/vwl_fr/r_ View File


BIN
phsource/vwl_fr/r_@ View File


BIN
phsource/vwl_fr/r_a View File


BIN
phsource/vwl_fr/r_i View File


BIN
phsource/vwl_fr/r_o View File


BIN
phsource/vwl_fr/r_u View File


BIN
phsource/vwl_fr/r_y View File


BIN
phsource/vwl_fr/ra View File


BIN
phsource/vwl_fr/re View File


BIN
phsource/vwl_fr/ri View File


BIN
phsource/vwl_fr/ro View File


BIN
phsource/vwl_fr/ru View File


BIN
phsource/vwl_fr/ry View File


BIN
phsource/vwl_fr/tr View File


BIN
phsource/vwl_fr/xr View File


+ 20
- 8
platforms/windows/make_espeak.iss View File

[Setup] [Setup]
AppName=eSpeak AppName=eSpeak
AppVerName=eSpeak version 1.41.01
AppVerName=eSpeak version 1.42
AppCopyright=Licensed under GNU General Public License version 3. (See file License.txt for details). AppCopyright=Licensed under GNU General Public License version 3. (See file License.txt for details).
WindowVisible=yes WindowVisible=yes
$07: Result := 'de'; $07: Result := 'de';
$08: Result := 'el'; $08: Result := 'el';
$09: Result := 'en'; $09: Result := 'en';
$0a: Result := 'es-la';
$0a: Result := 'es-la es-la+m3 es-la+f3';
$0b: Result := 'fi'; $0b: Result := 'fi';
$0c: Result := 'fr'; $0c: Result := 'fr';
$0e: Result := 'hu'; $0e: Result := 'hu';
$41: Result := 'sw'; $41: Result := 'sw';
$49: Result := 'ta'; $49: Result := 'ta';
$4b: Result := 'kn'; $4b: Result := 'kn';
$50: Result := 'mn';
$52: Result := 'cy'; $52: Result := 'cy';
$61: Result := 'ne'; $61: Result := 'ne';
$87: Result := 'rw'; $87: Result := 'rw';
// is there a match on the full language code? // is there a match on the full language code?
case language of case language of
$40a: Result := 'es';
$80a: Result := 'es-la es-la+f3 es-la+m3';
$c0a: Result := 'es'; $c0a: Result := 'es';
$816: Result := 'pt-pt';
$816: Result := 'pt-pt es-la';
$41a: Result := 'hr'; $41a: Result := 'hr';
$81a: Result := 'sr'; $81a: Result := 'sr';
$c1a: Result := 'sr'; $c1a: Result := 'sr';
'ko': value := $412; 'ko': value := $412;
'lv': value := $426; 'lv': value := $426;
'mk': value := $42f; 'mk': value := $42f;
'mn': value := $450;
'ne': value := $461; 'ne': value := $461;
'nl': value := $413; 'nl': value := $413;
'no': value := $414; 'no': value := $414;
var var
lang: String; lang: String;
voice2: String; voice2: String;
uilang: String;
begin begin
// Create the language selection page // Create the language selection page
UILanguage := GetUILanguage;
UIVoice := VoiceFromLanguage(UILanguage);
uilang := Format(' (Language code %x)',[UILanguage]);
lang := ActiveLanguage; lang := ActiveLanguage;
Page := CreateInputQueryPage(wpSelectDir,CustomMessage('v1'),CustomMessage('v2'),CustomMessage('v3'));
Page := CreateInputQueryPage(wpSelectDir,CustomMessage('v1'),CustomMessage('v2')+uilang,CustomMessage('v3'));
// Add items (False means it's not a password edit) // Add items (False means it's not a password edit)
Page.Add('', False); Page.Add('', False);
Page.Add('', False); Page.Add('', False);
Page.Add('', False); Page.Add('', False);
UILanguage := GetUILanguage;
UIVoice := VoiceFromLanguage(UILanguage);
// Set initial values (optional) // Set initial values (optional)
if UIVoice = 'en' then if UIVoice = 'en' then
voice2 := 'en-us' voice2 := 'en-us'
else else
voice2 := 'en'; voice2 := 'en';
Page.Values[0] := Format('%s %s %s',[UIVoice, UIVoice+'+f2', voice2]);
if Pos('+',UIVoice) = 0 then
Page.Values[0] := Format('%s %s',[UIVoice, UIVoice+'+f2'])
else
Page.Values[0] := Format('%s',[UIVoice]);
Page.Values[1] := Format('%s',[voice2]);
end; end;

+ 1
- 1
platforms/windows/make_espeakedit.iss View File

[Setup] [Setup]
AppName=eSpeakEdit AppName=eSpeakEdit
AppVerName=eSpeakEdit version 1.41.02
AppVerName=eSpeakEdit version 1.42
DefaultDirName={pf}\eSpeak DefaultDirName={pf}\eSpeak
DefaultGroupName=eSpeak DefaultGroupName=eSpeak
OutputBaseFilename=setup_espeakedit OutputBaseFilename=setup_espeakedit

+ 22
- 23
platforms/windows/windows_dll/src/speak_lib.h View File

/* This is the header file for the library version of espeak */ /* This is the header file for the library version of espeak */
/* */ /* */
/*************************************************************/ /*************************************************************/
#define ESPEAK_API __declspec(dllexport)


#include <stdio.h> #include <stdio.h>


#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API int espeak_Initialize(espeak_AUDIO_OUTPUT output, int buflength, const char *path, int options);
int espeak_Initialize(espeak_AUDIO_OUTPUT output, int buflength, const char *path, int options);
/* Must be called before any synthesis functions are called. /* Must be called before any synthesis functions are called.
output: the audio data can either be played by eSpeak or passed back by the SynthCallback function. output: the audio data can either be played by eSpeak or passed back by the SynthCallback function.


#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API void espeak_SetSynthCallback(t_espeak_callback* SynthCallback);
void espeak_SetSynthCallback(t_espeak_callback* SynthCallback);
/* Must be called before any synthesis functions are called. /* Must be called before any synthesis functions are called.
This specifies a function in the calling program which is called when a buffer of This specifies a function in the calling program which is called when a buffer of
speech sound data has been produced. speech sound data has been produced.
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API void espeak_SetUriCallback(int (*UriCallback)(int, const char*, const char*));
void espeak_SetUriCallback(int (*UriCallback)(int, const char*, const char*));
/* This function may be called before synthesis functions are used, in order to deal with /* This function may be called before synthesis functions are used, in order to deal with
<audio> tags. It specifies a callback function which is called when an <audio> element is <audio> tags. It specifies a callback function which is called when an <audio> element is
encountered and allows the calling program to indicate whether the sound file which encountered and allows the calling program to indicate whether the sound file which
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API espeak_ERROR espeak_Synth(const void *text,
espeak_ERROR espeak_Synth(const void *text,
size_t size, size_t size,
unsigned int position, unsigned int position,
espeak_POSITION_TYPE position_type, espeak_POSITION_TYPE position_type,
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API espeak_ERROR espeak_Synth_Mark(const void *text,
espeak_ERROR espeak_Synth_Mark(const void *text,
size_t size, size_t size,
const char *index_mark, const char *index_mark,
unsigned int end_position, unsigned int end_position,
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API espeak_ERROR espeak_Key(const char *key_name);
espeak_ERROR espeak_Key(const char *key_name);
/* Speak the name of a keyboard key. /* Speak the name of a keyboard key.
If key_name is a single character, it speaks the name of the character. If key_name is a single character, it speaks the name of the character.
Otherwise, it speaks key_name as a text string. Otherwise, it speaks key_name as a text string.
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API espeak_ERROR espeak_Char(wchar_t character);
espeak_ERROR espeak_Char(wchar_t character);
/* Speak the name of the given character /* Speak the name of the given character


Return: EE_OK: operation achieved Return: EE_OK: operation achieved
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API espeak_ERROR espeak_SetParameter(espeak_PARAMETER parameter, int value, int relative);
espeak_ERROR espeak_SetParameter(espeak_PARAMETER parameter, int value, int relative);
/* Sets the value of the specified parameter. /* Sets the value of the specified parameter.
relative=0 Sets the absolute value of the parameter. relative=0 Sets the absolute value of the parameter.
relative=1 Sets a relative value of the parameter. relative=1 Sets a relative value of the parameter.
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API int espeak_GetParameter(espeak_PARAMETER parameter, int current);
int espeak_GetParameter(espeak_PARAMETER parameter, int current);
/* current=0 Returns the default value of the specified parameter. /* current=0 Returns the default value of the specified parameter.
current=1 Returns the current value of the specified parameter, as set by SetParameter() current=1 Returns the current value of the specified parameter, as set by SetParameter()
*/ */
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API espeak_ERROR espeak_SetPunctuationList(const wchar_t *punctlist);
espeak_ERROR espeak_SetPunctuationList(const wchar_t *punctlist);
/* Specified a list of punctuation characters whose names are to be spoken when the /* Specified a list of punctuation characters whose names are to be spoken when the
value of the Punctuation parameter is set to "some". value of the Punctuation parameter is set to "some".


#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API void espeak_SetPhonemeTrace(int value, FILE *stream);
void espeak_SetPhonemeTrace(int value, FILE *stream);
/* Controls the output of phoneme symbols for the text /* Controls the output of phoneme symbols for the text
value=0 No phoneme output (default) value=0 No phoneme output (default)
value=1 Output the translated phoneme symbols for the text value=1 Output the translated phoneme symbols for the text
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API void espeak_CompileDictionary(const char *path, FILE *log, int flags);
void espeak_CompileDictionary(const char *path, FILE *log, int flags);
/* Compile pronunciation dictionary for a language which corresponds to the currently /* Compile pronunciation dictionary for a language which corresponds to the currently
selected voice. The required voice should be selected before calling this function. selected voice. The required voice should be selected before calling this function.


#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API const espeak_VOICE **espeak_ListVoices(espeak_VOICE *voice_spec);
const espeak_VOICE **espeak_ListVoices(espeak_VOICE *voice_spec);
/* Reads the voice files from espeak-data/voices and creates an array of espeak_VOICE pointers. /* Reads the voice files from espeak-data/voices and creates an array of espeak_VOICE pointers.
The list is terminated by a NULL pointer The list is terminated by a NULL pointer


If voice_spec is NULL then all voices are listed. If voice_spec is NULL then all voices are listed.
If voice spec is give, then only the voices which are compatible with the voice_spec
If voice spec is given, then only the voices which are compatible with the voice_spec
are listed, and they are listed in preference order. are listed, and they are listed in preference order.
*/ */


#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API espeak_ERROR espeak_SetVoiceByName(const char *name);
espeak_ERROR espeak_SetVoiceByName(const char *name);
/* Searches for a voice with a matching "name" field. Language is not considered. /* Searches for a voice with a matching "name" field. Language is not considered.
"name" is a UTF8 string. "name" is a UTF8 string.


#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API espeak_ERROR espeak_SetVoiceByProperties(espeak_VOICE *voice_spec);
espeak_ERROR espeak_SetVoiceByProperties(espeak_VOICE *voice_spec);
/* An espeak_VOICE structure is used to pass criteria to select a voice. Any of the following /* An espeak_VOICE structure is used to pass criteria to select a voice. Any of the following
fields may be set: fields may be set:


#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API espeak_VOICE *espeak_GetCurrentVoice(void);
espeak_VOICE *espeak_GetCurrentVoice(void);
/* Returns the espeak_VOICE data for the currently selected voice. /* Returns the espeak_VOICE data for the currently selected voice.
This is not affected by temporary voice changes caused by SSML elements such as <voice> and <s> This is not affected by temporary voice changes caused by SSML elements such as <voice> and <s>
*/ */
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API espeak_ERROR espeak_Cancel(void);
espeak_ERROR espeak_Cancel(void);
/* Stop immediately synthesis and audio output of the current text. When this /* Stop immediately synthesis and audio output of the current text. When this
function returns, the audio output is fully stopped and the synthesizer is ready to function returns, the audio output is fully stopped and the synthesizer is ready to
synthesize a new message. synthesize a new message.
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API int espeak_IsPlaying(void);
int espeak_IsPlaying(void);
/* Returns 1 if audio is played, 0 otherwise. /* Returns 1 if audio is played, 0 otherwise.
*/ */


#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API espeak_ERROR espeak_Synchronize(void);
espeak_ERROR espeak_Synchronize(void);
/* This function returns when all data have been spoken. /* This function returns when all data have been spoken.
Return: EE_OK: operation achieved Return: EE_OK: operation achieved
EE_INTERNAL_ERROR. EE_INTERNAL_ERROR.
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API espeak_ERROR espeak_Terminate(void);
espeak_ERROR espeak_Terminate(void);
/* last function to be called. /* last function to be called.
Return: EE_OK: operation achieved Return: EE_OK: operation achieved
EE_INTERNAL_ERROR. EE_INTERNAL_ERROR.
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
ESPEAK_API const char *espeak_Info(void* ptr);
const char *espeak_Info(void* ptr);
/* Returns the version number string. /* Returns the version number string.
The parameter is for future use, and should be set to NULL The parameter is for future use, and should be set to NULL
*/ */

+ 1
- 0
platforms/windows/windows_dll/src/speech.h View File



#define PATHSEP '\\' #define PATHSEP '\\'
// #define USE_PORTAUDIO // #define USE_PORTAUDIO
#define NO_VARIADIC_MACROS
#define ESPEAK_API __declspec(dllexport) #define ESPEAK_API __declspec(dllexport)
#define LIBRARY #define LIBRARY



+ 5
- 5
platforms/windows/windows_sapi/version.rc2 View File

// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,40,00
PRODUCTVERSION 1,0,40,00
FILEVERSION 1,0,42,00
PRODUCTVERSION 1,0,42,00
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
VALUE "Comments", "\0" VALUE "Comments", "\0"
VALUE "CompanyName", "Jonathan Duddington\0" VALUE "CompanyName", "Jonathan Duddington\0"
VALUE "FileDescription", "Text to Speech\0" VALUE "FileDescription", "Text to Speech\0"
VALUE "FileVersion", "1, 0,40,00\0"
VALUE "InternalName", "espeak1.40\0"
VALUE "FileVersion", "1, 0,42,00\0"
VALUE "InternalName", "espeak1.42\0"
VALUE "LegalCopyright", "Copyright (c) Jonathan Duddington\0" VALUE "LegalCopyright", "Copyright (c) Jonathan Duddington\0"
VALUE "LegalTrademarks", "\0" VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "espeak_sapi.dll\0" VALUE "OriginalFilename", "espeak_sapi.dll\0"
VALUE "PrivateBuild", "\0" VALUE "PrivateBuild", "\0"
VALUE "ProductName", "espeak TTS\0" VALUE "ProductName", "espeak TTS\0"
VALUE "ProductVersion", "1, 0, 40, 00\0"
VALUE "ProductVersion", "1, 0, 42, 00\0"
VALUE "SpecialBuild", "\0" VALUE "SpecialBuild", "\0"
END END
END END

+ 38
- 6
src/compiledict.cpp View File

{"$unstressend",13}, /* reduce stress at end of clause */ {"$unstressend",13}, /* reduce stress at end of clause */
{"$atend", 14}, /* use this pronunciation if at end of clause */ {"$atend", 14}, /* use this pronunciation if at end of clause */


{"$dot", 16}, /* ignore '.' after this word (abbreviation) */
{"$abbrev", 17}, /* use this pronuciation rather than split into letters */ {"$abbrev", 17}, /* use this pronuciation rather than split into letters */
{"$stem", 18}, // must have a suffix {"$stem", 18}, // must have a suffix


{"$alt2", 21}, {"$alt2", 21},
{"$combine", 22}, // Combine with the next word {"$combine", 22}, // Combine with the next word


{"$dot", 24}, // ignore '.' after this word (abbreviation)
{"$hasdot", 25}, // use this pronunciation if there is a dot after the word

{"$max3", 27}, // limit to 3 repetitions {"$max3", 27}, // limit to 3 repetitions
{"$brk", 28}, // a shorter $pause {"$brk", 28}, // a shorter $pause
{"$text", 29}, // word translates to replcement text, not phonemes {"$text", 29}, // word translates to replcement text, not phonemes
char name[LEN_GROUP_NAME+1]; char name[LEN_GROUP_NAME+1];
unsigned int start; unsigned int start;
unsigned int length; unsigned int length;
int group3_ix;
} RGROUP; } RGROUP;




break; break;
case 1: case 1:
if((c == '-') && (word[0] != '_'))
if((c == '-') && multiple_words)
{ {
if(isdigit(word[0])) if(isdigit(word[0]))
{ {
static char rule_match[80]; static char rule_match[80];
static char rule_phonemes[80]; static char rule_phonemes[80];
static char group_name[LEN_GROUP_NAME+1]; static char group_name[LEN_GROUP_NAME+1];
static int group3_ix;


#define N_RULES 2000 // max rules for each group #define N_RULES 2000 // max rules for each group




static int __cdecl rgroup_sorter(RGROUP *a, RGROUP *b) static int __cdecl rgroup_sorter(RGROUP *a, RGROUP *b)
{//=================================================== {//===================================================
// Sort long names before short names
int ix; int ix;
ix = strlen(b->name) - strlen(a->name);
if(ix != 0) return(ix);
ix = strcmp(a->name,b->name); ix = strcmp(a->name,b->name);
if(ix != 0) return(ix); if(ix != 0) return(ix);
return(a->start-b->start); return(a->start-b->start);
int n_rules=0; int n_rules=0;
int count=0; int count=0;
int different; int different;
int wc;
const char *prev_rgroup_name; const char *prev_rgroup_name;
unsigned int char_code; unsigned int char_code;
int compile_mode=0; int compile_mode=0;
char *rules[N_RULES]; char *rules[N_RULES];


int n_rgroups = 0; int n_rgroups = 0;
int n_groups3 = 0;
RGROUP rgroup[N_RULE_GROUP2]; RGROUP rgroup[N_RULE_GROUP2];
linenum = 0; linenum = 0;
if(n_rules > 0) if(n_rules > 0)
{ {
strcpy(rgroup[n_rgroups].name,group_name); strcpy(rgroup[n_rgroups].name,group_name);
rgroup[n_rgroups].group3_ix = group3_ix;
rgroup[n_rgroups].start = ftell(f_temp); rgroup[n_rgroups].start = ftell(f_temp);
output_rule_group(f_temp,n_rules,rules,group_name); output_rule_group(f_temp,n_rules,rules,group_name);
rgroup[n_rgroups].length = ftell(f_temp) - rgroup[n_rgroups].start; rgroup[n_rgroups].length = ftell(f_temp) - rgroup[n_rgroups].start;
while((*p > ' ') && (ix < LEN_GROUP_NAME)) while((*p > ' ') && (ix < LEN_GROUP_NAME))
group_name[ix++] = *p++; group_name[ix++] = *p++;
group_name[ix]=0; group_name[ix]=0;
group3_ix = 0;

if(sscanf(group_name,"0x%x",&char_code)==1) if(sscanf(group_name,"0x%x",&char_code)==1)
{ {
// group character is given as a character code (max 16 bits) // group character is given as a character code (max 16 bits)
*p++ = char_code; *p++ = char_code;
*p = 0; *p = 0;
} }
else
{
if(translator->letter_bits_offset > 0)
{
utf8_in(&wc, group_name);
if(((ix = (wc - translator->letter_bits_offset)) >= 0) && (ix < 128))
{
group3_ix = ix+1; // not zero
}
}
}
if(strlen(group_name) > 2)
if((group3_ix == 0) && (strlen(group_name) > 2))
{ {
if(utf8_in(&c,group_name) < 2) if(utf8_in(&c,group_name) < 2)
{ {
if(gp > 0) if(gp > 0)
fputc(RULE_GROUP_END,f_out); fputc(RULE_GROUP_END,f_out);
fputc(RULE_GROUP_START,f_out); fputc(RULE_GROUP_START,f_out);
fprintf(f_out, prev_rgroup_name = rgroup[gp].name);

if(rgroup[gp].group3_ix != 0)
{
n_groups3++;
fputc(1,f_out);
fputc(rgroup[gp].group3_ix, f_out);
}
else
{
fprintf(f_out, "%s", prev_rgroup_name = rgroup[gp].name);
}
fputc(0,f_out); fputc(0,f_out);
} }


fclose(f_temp); fclose(f_temp);
remove(fname_temp); remove(fname_temp);


fprintf(f_log,"\t%d rules, %d groups\n\n",count,n_rgroups);
fprintf(f_log,"\t%d rules, %d groups (%d)\n\n",count,n_rgroups,n_groups3);
return(0); return(0);
} // end of compile_dictrules } // end of compile_dictrules



+ 72
- 59
src/dictionary.cpp View File

#include "translate.h" #include "translate.h"





int dictionary_skipwords; int dictionary_skipwords;
char dictionary_name[40]; char dictionary_name[40];


tr->groups2_start[ix]=255; // indicates "not set" tr->groups2_start[ix]=255; // indicates "not set"
} }
memset(tr->letterGroups,0,sizeof(tr->letterGroups)); memset(tr->letterGroups,0,sizeof(tr->letterGroups));
memset(tr->groups3,0,sizeof(tr->groups3));


p = tr->data_dictrules; p = tr->data_dictrules;
while(*p != 0) while(*p != 0)
len = strlen(p); len = strlen(p);
p_name = p; p_name = p;
c = p_name[0]; c = p_name[0];
c2 = p_name[1];

p += (len+1); p += (len+1);
if(len == 1) if(len == 1)
{ {
tr->groups1[0] = p; tr->groups1[0] = p;
} }
else else
if(c == 1)
{
// index by offset from letter base
tr->groups3[c2 - 1] = p;
}
else
{ {
if(tr->groups2_start[c] == 255) if(tr->groups2_start[c] == 255)
tr->groups2_start[c] = tr->n_groups2; tr->groups2_start[c] = tr->n_groups2;
tr->groups2_count[c]++; tr->groups2_count[c]++;
tr->groups2[tr->n_groups2] = p; tr->groups2[tr->n_groups2] = p;
c2 = p_name[1];
tr->groups2_name[tr->n_groups2++] = (c + (c2 << 8)); tr->groups2_name[tr->n_groups2++] = (c + (c2 << 8));
} }
} }
{ {
/* no explicit stress - stress the final vowel */ /* no explicit stress - stress the final vowel */
stressed_syllable = vowel_count - 1; stressed_syllable = vowel_count - 1;
if(max_stress == 0)

while(stressed_syllable > 0)
{ {
while(stressed_syllable > 0)
// find the last vowel which is not unstressed
if(vowel_stress[stressed_syllable] == 0)
{ {
if(vowel_stress[stressed_syllable] == 0)
{
vowel_stress[stressed_syllable] = 4;
break;
}
else
stressed_syllable--;
vowel_stress[stressed_syllable] = 4;
break;
} }
else
stressed_syllable--;
} }
max_stress = 4; max_stress = 4;
} }
if(vowel_stress[2] == 4) if(vowel_stress[2] == 4)
vowel_stress[1] = 3; vowel_stress[1] = 3;
} }
#if deleted
if((stressflags & 0x2000) && (vowel_stress[1] == 0)) if((stressflags & 0x2000) && (vowel_stress[1] == 0))
{ {
// If there is only one syllable before the primary stress, give it a secondary stress // If there is only one syllable before the primary stress, give it a secondary stress
vowel_stress[1] = 3; vowel_stress[1] = 3;
} }
} }
#endif


done = 0; done = 0;
for(v=1; v<vowel_count; v++) for(v=1; v<vowel_count; v++)




#ifdef LOG_TRANSLATE #ifdef LOG_TRANSLATE
static char *DecodeRule(const char *group, char *rule)
{//==================================================
static char *DecodeRule(const char *group_chars, int group_length, char *rule)
{//===========================================================================
/* Convert compiled match template to ascii */ /* Convert compiled match template to ascii */


unsigned char rb; unsigned char rb;


match_type = 0; match_type = 0;
buf_pre[0] = 0; buf_pre[0] = 0;
strcpy(buf,group);

for(ix=0; ix<group_length; ix++)
{
buf[ix] = group_chars[ix];
}
buf[ix] = 0;

p = &buf[strlen(buf)]; p = &buf[strlen(buf)];
while(!finished) while(!finished)
{ {






static void MatchRule(Translator *tr, char *word[], const char *group, char *rule, MatchRecord *match_out, int word_flags, int dict_flags)
{//=======================================================================================================================================
static void MatchRule(Translator *tr, char *word[], int group_length, char *rule, MatchRecord *match_out, int word_flags, int dict_flags)
{//======================================================================================================================================
/* Checks a specified word against dictionary rules. /* Checks a specified word against dictionary rules.
Returns with phoneme code string, or NULL if no match found. Returns with phoneme code string, or NULL if no match found.


static MatchRecord best; static MatchRecord best;


int total_consumed; /* letters consumed for best match */ int total_consumed; /* letters consumed for best match */
int group_length;


unsigned char condition_num; unsigned char condition_num;
char *common_phonemes; /* common to a group of entries */ char *common_phonemes; /* common to a group of entries */
char *group_chars;


group_chars = *word;


if(rule == NULL) if(rule == NULL)
{ {
best.end_type = 0; best.end_type = 0;
best.del_fwd = NULL; best.del_fwd = NULL;


group_length = strlen(group);
/* search through dictionary rules */ /* search through dictionary rules */
while(rule[0] != RULE_GROUP_END) while(rule[0] != RULE_GROUP_END)
{ {
if(group_length > 1) if(group_length > 1)
pts += 35; // to account for an extra letter matching pts += 35; // to account for an extra letter matching
DecodePhonemes(match.phonemes,decoded_phonemes); DecodePhonemes(match.phonemes,decoded_phonemes);
fprintf(f_trans,"%3d\t%s [%s]\n",pts,DecodeRule(group,rule_start),decoded_phonemes);
fprintf(f_trans,"%3d\t%s [%s]\n",pts,DecodeRule(group_chars, group_length, rule_start),decoded_phonemes);
} }
#endif #endif


Append the result to 'phonemes' and any standard prefix/suffix in 'end_phonemes' */ Append the result to 'phonemes' and any standard prefix/suffix in 'end_phonemes' */


unsigned char c, c2; unsigned char c, c2;
unsigned int c12;
unsigned int c12, c123;
int wc=0; int wc=0;
int wc_prev; int wc_prev;
int wc_bytes; int wc_bytes;
char word_copy[N_WORD_BYTES]; char word_copy[N_WORD_BYTES];
static const char str_pause[2] = {phonPAUSE_NOLINK,0}; static const char str_pause[2] = {phonPAUSE_NOLINK,0};


char group_name[4];

if(tr->data_dictrules == NULL) if(tr->data_dictrules == NULL)
return(0); return(0);


{ {
digit_count = 0; digit_count = 0;
found = 0; found = 0;
if(n > 0)

if(((ix = wc - tr->letter_bits_offset) >= 0) && (ix < 128))
{
if(tr->groups3[ix] != NULL)
{
MatchRule(tr, &p, wc_bytes, tr->groups3[ix], &match1, word_flags, dict_flags0);
found = 1;
}
}

if(!found && (n > 0))
{ {
/* there are some 2 byte chains for this initial letter */ /* there are some 2 byte chains for this initial letter */
c2 = p[1]; c2 = p[1];
c12 = c + (c2 << 8); /* 2 characters */ c12 = c + (c2 << 8); /* 2 characters */
c123 = c12 + (p[2] << 16);
g1 = tr->groups2_start[c]; g1 = tr->groups2_start[c];
for(g=g1; g < (g1+n); g++) for(g=g1; g < (g1+n); g++)
{ {
found = 1; found = 1;


group_name[0] = c;
group_name[1] = c2;
group_name[2] = 0;
p2 = p; p2 = p;
MatchRule(tr, &p2, group_name, tr->groups2[g], &match2, word_flags, dict_flags0);
MatchRule(tr, &p2, 2, tr->groups2[g], &match2, word_flags, dict_flags0);
if(match2.points > 0) if(match2.points > 0)
match2.points += 35; /* to acount for 2 letters matching */ match2.points += 35; /* to acount for 2 letters matching */


/* now see whether single letter chain gives a better match ? */ /* now see whether single letter chain gives a better match ? */
group_name[1] = 0;
MatchRule(tr, &p, group_name, tr->groups1[c], &match1, word_flags, dict_flags0);
MatchRule(tr, &p, 1, tr->groups1[c], &match1, word_flags, dict_flags0);


if(match2.points >= match1.points) if(match2.points >= match1.points)
{ {
if(!found) if(!found)
{ {
/* alphabetic, single letter chain */ /* alphabetic, single letter chain */
group_name[0] = c;
group_name[1] = 0;
if(tr->groups1[c] != NULL) if(tr->groups1[c] != NULL)
MatchRule(tr, &p, group_name, tr->groups1[c], &match1, word_flags, dict_flags0);
MatchRule(tr, &p, 1, tr->groups1[c], &match1, word_flags, dict_flags0);
else else
{ {
// no group for this letter, use default group // no group for this letter, use default group
MatchRule(tr, &p, "", tr->groups1[0], &match1, word_flags, dict_flags0);
MatchRule(tr, &p, 0, tr->groups1[0], &match1, word_flags, dict_flags0);


if((match1.points == 0) && ((option_sayas & 0x10) == 0)) if((match1.points == 0) && ((option_sayas & 0x10) == 0))
{ {


len = strlen(phonemes); len = strlen(phonemes);


switch(tr->translator_name)
if(tr->langopts.param[LOPT_ALT] & 2)
{ {
case L('i','t'):
for(ix=0; ix<(len-1); ix++) for(ix=0; ix<(len-1); ix++)
{ {
if(phonemes[ix] == phonSTRESS_P) if(phonemes[ix] == phonSTRESS_P)
break; break;
} }
} }
break;
} }
} // end of ApplySpecialAttribute2 } // end of ApplySpecialAttribute2


{//======================================================================= {//=======================================================================
// Amend the translated phonemes according to an attribute which is specific for the language. // Amend the translated phonemes according to an attribute which is specific for the language.
int len; int len;
int ix;
char *p_end; char *p_end;
int phoneme_1;


if((dict_flags & (FLAG_ALT_TRANS | FLAG_ALT2_TRANS)) == 0) if((dict_flags & (FLAG_ALT_TRANS | FLAG_ALT2_TRANS)) == 0)
return; return;
} }
break; break;


case L('p','t'):
phoneme_1 = PhonemeCode('o');
for(ix=0; ix<(len-1); ix++)
{
if(phonemes[ix] == phoneme_1)
{
phonemes[ix] = PhonemeCode('O');
break;
}
}
break;

case L('r','o'): case L('r','o'):
if(p_end[0] == PhonemeCode('j')) if(p_end[0] == PhonemeCode('j'))
{ {
wlen = strlen(word); wlen = strlen(word);
} }



hash = HashDictionary(word); hash = HashDictionary(word);
p = tr->dict_hashtab[hash]; p = tr->dict_hashtab[hash];


continue; continue;
} }
} }
if(dictionary_flags & FLAG_NEEDS_DOT)
{
if(!(wflags & FLAG_HAS_DOT))
continue;
}


if((dictionary_flags & FLAG_ATEND) && (word_end < tr->clause_end)) if((dictionary_flags & FLAG_ATEND) && (word_end < tr->clause_end))
{ {
// set the skip words flag // set the skip words flag
flags[0] |= FLAG_SKIPWORDS; flags[0] |= FLAG_SKIPWORDS;
dictionary_skipwords = length; dictionary_skipwords = length;
return(flags[0]);
return(1);
} }
} }


return(0); return(0);
} }


return(flags[0]);
return(1);
} }


ph_out[0] = 0; ph_out[0] = 0;
return(LookupDictList(tr, &word1, ph_out, flags, 0, NULL)); return(LookupDictList(tr, &word1, ph_out, flags, 0, NULL));
} }


int LookupFlags(Translator *tr, const char *word)
{//==============================================
char buf[100];
static unsigned int flags[2];

flags[0] = flags[1] = 0;
char *word1 = (char *)word;
LookupDictList(tr, &word1, buf, flags, 0, NULL);
return(flags[0]);
}





int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy) int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy)
"ion", NULL }; "ion", NULL };


static const char *add_e_additions[] = { static const char *add_e_additions[] = {
"c", "rs", "ir", "ur", "ath", "ns", "lu", NULL };
// "c", "rs", "ir", "ur", "ath", "ns", "lu", NULL };
"c", "rs", "ir", "ur", "ath", "ns", "u", NULL };


for(word_end = word; *word_end != ' '; word_end++) for(word_end = word; *word_end != ' '; word_end++)
{ {

+ 2
- 1
src/espeakedit.cpp View File





ConfigInit(); ConfigInit();
LoadConfig();
WavegenInitSound(); WavegenInitSound();


if((result = LoadPhData()) != 1) if((result = LoadPhData()) != 1)
{ {
sprintf(buf,"Compile &dictionary '%s'",dictionary_name); sprintf(buf,"Compile &dictionary '%s'",dictionary_name);
data_menu->SetLabel(MENU_COMPILE_DICT, wxString(buf,wxConvLocal)); data_menu->SetLabel(MENU_COMPILE_DICT, wxString(buf,wxConvLocal));
sprintf(buf,"&Format '%s_rules' file",dictionary_name);
sprintf(buf,"&Layout '%s_rules' file",dictionary_name);
data_menu->SetLabel(MENU_FORMAT_DICTIONARY, wxString(buf,wxConvLocal)); data_menu->SetLabel(MENU_FORMAT_DICTIONARY, wxString(buf,wxConvLocal));
} }
} }

+ 3
- 3
src/intonation.cpp View File

//static int drops_2[8] = {0x400,0x400,0x600,0x600,-0x800,0xc00,0x0e00,0x0e00}; //static int drops_2[8] = {0x400,0x400,0x600,0x600,-0x800,0xc00,0x0e00,0x0e00};


static short oflow[] = {0, 20, 12, 4, 0}; static short oflow[] = {0, 20, 12, 4, 0};
static short oflow_emf[] = {5, 24, 15, 10, 5};
static short oflow_emf[] = {5, 26, 16, 10, 5};
static short oflow_less[] = {3, 19, 12, 7, 2}; static short oflow_less[] = {3, 19, 12, 7, 2};
// static short oflow_test2[] = {20, 0, 20, 0, 20}; // static short oflow_test2[] = {20, 0, 20, 0, 20};
// static short back_emf[] = {35, 32, 0}; // static short back_emf[] = {35, 32, 0};
{20, 25, 34, 22, drops_0, 3, 3, 5, oflow}, // 0 statement {20, 25, 34, 22, drops_0, 3, 3, 5, oflow}, // 0 statement
{20, 25, 34, 20, drops_0, 3, 3, 5, oflow}, // 1 comma {20, 25, 34, 20, drops_0, 3, 3, 5, oflow}, // 1 comma
{20, 25, 34, 20, drops_0, 3, 3, 5, oflow}, // 2 question {20, 25, 34, 20, drops_0, 3, 3, 5, oflow}, // 2 question
{20, 25, 36, 22, drops_0, 3, 4, 5, oflow_emf}, // 3 exclamation
{20, 25, 39, 22, drops_0, 3, 4, 5, oflow_emf}, // 3 exclamation
{20, 25, 34, 22, drops_0, 3, 3, 5, oflow}, // 4 statement, emphatic {20, 25, 34, 22, drops_0, 3, 3, 5, oflow}, // 4 statement, emphatic
{20, 25, 32, 24, drops_0, 4, 3, 5, oflow_less}, // 5 statement, less intonation {20, 25, 32, 24, drops_0, 4, 3, 5, oflow_less}, // 5 statement, less intonation
{20, 25, 32, 24, drops_0, 4, 3, 5, oflow_less}, // 6 comma, less intonation {20, 25, 32, 24, drops_0, 4, 3, 5, oflow_less}, // 6 comma, less intonation
}; };


static TONE_NUCLEUS tone_nucleus_table[N_TONE_NUCLEUS_TABLE] = { static TONE_NUCLEUS tone_nucleus_table[N_TONE_NUCLEUS_TABLE] = {
{PITCHfall, 29, 4, PITCHfall, 32, 9, NULL, 12, 6, 0}, // 0 statement
{PITCHfall, 29, 4, PITCHfall, 31, 8, NULL, 11, 6, 0}, // 0 statement
{PITCHfrise, 35, 8, PITCHfrise2, 35,10, NULL, 15, 23, 0}, // 1 comma {PITCHfrise, 35, 8, PITCHfrise2, 35,10, NULL, 15, 23, 0}, // 1 comma
{PITCHfrise, 39,10, PITCHfrise2, 36,10, NULL, 15, 28, 0}, // 2 question {PITCHfrise, 39,10, PITCHfrise2, 36,10, NULL, 15, 28, 0}, // 2 question
// {PITCHfall, 41, 4, PITCHfall, 41,27, NULL, 16, 4, T_EMPH}, // 3 exclamation // {PITCHfall, 41, 4, PITCHfall, 41,27, NULL, 16, 4, T_EMPH}, // 3 exclamation

+ 1
- 1
src/menus.cpp View File

data_menu->Append(MENU_COMPILE_DICT_DEBUG, _("Compile dictionary (debu&g)")); data_menu->Append(MENU_COMPILE_DICT_DEBUG, _("Compile dictionary (debu&g)"));
data_menu->Append(MENU_COMPILE_MBROLA, _("Compile &mbrola phonemes list...")); data_menu->Append(MENU_COMPILE_MBROLA, _("Compile &mbrola phonemes list..."));
data_menu->AppendSeparator(); data_menu->AppendSeparator();
data_menu->Append(MENU_FORMAT_DICTIONARY, _("&Format *_rules file"));
data_menu->Append(MENU_FORMAT_DICTIONARY, _("&Layout *_rules file"));
// OPTIONS MENU // OPTIONS MENU
paths_menu = new wxMenu; paths_menu = new wxMenu;

+ 88
- 46
src/numbers.cpp View File



static int n_digit_lookup; static int n_digit_lookup;
static char *digit_lookup; static char *digit_lookup;
static int speak_missing_thousands;



typedef struct { typedef struct {
const char *name; const char *name;






int TranslateLetter(Translator *tr, char *word, char *phonemes, int control, int word_length)
{//======================================================================================
int TranslateLetter(Translator *tr, char *word, char *phonemes, int control)
{//=========================================================================
// get pronunciation for an isolated letter // get pronunciation for an isolated letter
// return number of bytes used by the letter // return number of bytes used by the letter
// control 2=say-as glyphs, 3-say-as chars // control 2=say-as glyphs, 3-say-as chars
static char ph_ordinal2[12]; static char ph_ordinal2[12];




static int CheckDotOrdinal(Translator *tr, char *word, WORD_TAB *wtab, int lowercase)
{//==================================================================================
// nextupper: Next word must start with lower-case
static int CheckDotOrdinal(Translator *tr, char *word, WORD_TAB *wtab, int roman)
{//==============================================================================


int ordinal = 0; int ordinal = 0;
int c2; int c2;


if((tr->langopts.numbers & NUM_ORDINAL_DOT) && (word[0] == '.'))
if((tr->langopts.numbers & NUM_ORDINAL_DOT) && ((word[0] == '.') || (wtab[0].flags & FLAG_HAS_DOT)) && !(wtab[1].flags & FLAG_NOSPACE))
{ {
if((lowercase==0) || !(wtab[1].flags & FLAG_FIRST_UPPER))
if(roman || !(wtab[1].flags & FLAG_FIRST_UPPER))
{ {
utf8_in(&c2, &word[2]); utf8_in(&c2, &word[2]);
if(IsAlpha(c2))
if((word[1] != 0) && IsAlpha(c2))
{ {
// ordinal number is indicated by dot after the number // ordinal number is indicated by dot after the number
// but not if the next word starts with an upper-case letter // but not if the next word starts with an upper-case letter
ordinal = 2; ordinal = 2;
word[0] = ' ';
if(tr->translator_name == L('h','u'))
if(word[0] == '.')
word[0] = ' ';

if((roman==0) && (tr->translator_name == L('h','u')))
{ {
// lang=hu don't treat dot as ordinal indicator if the next word is a month name ($alt)
// lang=hu don't treat dot as ordinal indicator if the next word is a month name ($alt). It may have a suffix.
if(TranslateWord(tr, &word[2], 0, NULL) & FLAG_ALT_TRANS) if(TranslateWord(tr, &word[2], 0, NULL) & FLAG_ALT_TRANS)
ordinal = 0; ordinal = 0;
} }
int subtract; int subtract;
int repeat = 0; int repeat = 0;
int n_digits = 0; int n_digits = 0;
unsigned int flags;
unsigned int flags[2];
char ph_roman[30]; char ph_roman[30];
char number_chars[N_WORD_BYTES]; char number_chars[N_WORD_BYTES];


acc = 0; acc = 0;
prev = 0; prev = 0;
subtract = 0x7fff; subtract = 0x7fff;
ph_out[0] = 0;


if((tr->langopts.numbers & NUM_ROMAN_CAPITALS) && !(wtab[0].flags & FLAG_ALL_UPPER)) if((tr->langopts.numbers & NUM_ROMAN_CAPITALS) && !(wtab[0].flags & FLAG_ALL_UPPER))
return(0); return(0);
if((tr->langopts.numbers & NUM_ROMAN_AFTER) == 0) if((tr->langopts.numbers & NUM_ROMAN_AFTER) == 0)
{ {
strcpy(ph_out,ph_roman); strcpy(ph_out,ph_roman);
p = &ph_out[strlen(ph_out)];
p = &ph_out[strlen(ph_roman)];
} }


sprintf(number_chars," %d ",acc);
sprintf(number_chars," %d ",acc);


if(CheckDotOrdinal(tr, word, wtab, 0))
if(CheckDotOrdinal(tr, word, wtab, 1))
wtab[0].flags |= FLAG_ORDINAL; wtab[0].flags |= FLAG_ORDINAL;


if(tr->langopts.numbers & NUM_ROMAN_ORDINAL) if(tr->langopts.numbers & NUM_ROMAN_ORDINAL)
wtab[0].flags |= FLAG_ORDINAL; wtab[0].flags |= FLAG_ORDINAL;
} }


TranslateNumber(tr, &number_chars[1], p, &flags, wtab);
tr->prev_dict_flags = 0;
TranslateNumber(tr, &number_chars[2], p, flags, wtab);


if(tr->langopts.numbers & NUM_ROMAN_AFTER) if(tr->langopts.numbers & NUM_ROMAN_AFTER)
strcat(ph_out,ph_roman); strcat(ph_out,ph_roman);
char string[12]; char string[12];
char ph_of[12]; char ph_of[12];
char ph_thousands[40]; char ph_thousands[40];
char ph_buf[40];


ph_of[0] = 0; ph_of[0] = 0;




if(Lookup(tr, string, ph_thousands) == 0) if(Lookup(tr, string, ph_thousands) == 0)
{ {
// repeat "thousand" if higher order names are not available
sprintf(string,"_%dM1",value);
if((found_value = Lookup(tr, string, ph_thousands)) == 0)
Lookup(tr, "_0M1", ph_thousands);
if(thousandplex > 3)
{
sprintf(string,"_0M%d", thousandplex-1);
if(Lookup(tr, string, ph_buf) == 0)
{
// say "millions" if this name is not available and neither is the next lower
Lookup(tr, "_0M2", ph_thousands);
speak_missing_thousands = 3;
}
}
if(ph_thousands[0] == 0)
{
// repeat "thousand" if higher order names are not available
sprintf(string,"_%dM1",value);
if((found_value = Lookup(tr, string, ph_thousands)) == 0)
Lookup(tr, "_0M1", ph_thousands);
speak_missing_thousands = 2;
}
} }
} }
} }


found = 0; found = 0;
ph_ordinal[0] = 0; ph_ordinal[0] = 0;
ph_tens[0] = 0;
ph_digits[0] = 0;
ph_and[0] = 0;


if((control & 2) && (n_digit_lookup == 2)) if((control & 2) && (n_digit_lookup == 2))
{ {


int n_digits; int n_digits;
int value; int value;
unsigned int ix;
int ix;
unsigned char c; unsigned char c;
int suppress_null = 0; int suppress_null = 0;
int decimal_point = 0; int decimal_point = 0;
int prev_thousands = 0; int prev_thousands = 0;
int ordinal = 0; int ordinal = 0;
int this_value; int this_value;
static int prev_value;
int decimal_count; int decimal_count;
int max_decimal_count; int max_decimal_count;
int decimal_mode; int decimal_mode;
static const char str_pause[2] = {phonPAUSE_NOLINK,0}; static const char str_pause[2] = {phonPAUSE_NOLINK,0};


*flags = 0; *flags = 0;
n_digit_lookup = 0;
buf_digit_lookup[0] = 0;
digit_lookup = buf_digit_lookup; digit_lookup = buf_digit_lookup;


for(ix=0; isdigit(word[ix]); ix++) ; for(ix=0; isdigit(word[ix]); ix++) ;
n_digits = ix; n_digits = ix;
value = this_value = atoi(word); value = this_value = atoi(word);


// is there a previous thousands part (as a previous "word") ?
if((n_digits == 3) && (word[-2] == tr->langopts.thousands_sep) && isdigit(word[-3]))
{
prev_thousands = 1;
}
else
if((tr->langopts.thousands_sep == ' ') || (tr->langopts.numbers & NUM_ALLOW_SPACE))
{
// thousands groups can be separated by spaces
if((n_digits == 3) && isdigit(word[-2]))
{
prev_thousands = 1;
}
}
if(prev_thousands == 0)
{
speak_missing_thousands = 0;
}


ph_ordinal2[0] = 0; ph_ordinal2[0] = 0;
ph_zeros[0] = 0; ph_zeros[0] = 0;


ordinal = CheckDotOrdinal(tr, &word[ix], wtab, 1);
if(prev_thousands || (word[0] != '0'))
{
// don't check for ordinal if the number has a leading zero
ordinal = CheckDotOrdinal(tr, &word[ix], wtab, 0);
}

if((word[ix] == '.') && !isdigit(word[ix+1]) && !isdigit(word[ix+2]) && !(wtab[1].flags & FLAG_NOSPACE))
{
// remove dot unless followed by another number
word[ix] = 0;
}


if(ordinal == 0) if(ordinal == 0)
{ {
hyphen = 1; hyphen = 1;
ix++; ix++;
} }
while((word[ix] != 0) && (word[ix] != ' ') && (ix < (sizeof(suffix)-1)))
while((word[ix] != 0) && (word[ix] != ' ') && (ix < int(sizeof(suffix)-1)))
{ {
*p++ = word[ix++]; *p++ = word[ix++];
} }
ph_append[0] = 0; ph_append[0] = 0;
ph_buf2[0] = 0; ph_buf2[0] = 0;


// is there a previous thousands part (as a previous "word") ?
if((n_digits == 3) && (word[-2] == tr->langopts.thousands_sep) && isdigit(word[-3]))
{
prev_thousands = 1;
}
else
if((tr->langopts.thousands_sep == ' ') || (tr->langopts.numbers & NUM_ALLOW_SPACE))
{
// thousands groups can be separated by spaces
if((n_digits == 3) && isdigit(word[-2]))
{
prev_thousands = 1;
}
}


if((word[0] == '0') && (prev_thousands == 0) && (word[1] != ' ') && (word[1] != tr->langopts.decimal_sep)) if((word[0] == '0') && (prev_thousands == 0) && (word[1] != ' ') && (word[1] != tr->langopts.decimal_sep))
{ {
} }
} }
else else
if((thousandplex > 1) && prev_thousands && (prev_value > 0))

if(speak_missing_thousands == 1)
{ {
sprintf(string,"_%s%d",M_Variant(value),thousandplex+1);
// speak this thousandplex if there was no word for the previous thousandplex
sprintf(string,"_0M%d",thousandplex+1);
if(Lookup(tr, string, buf1)==0) if(Lookup(tr, string, buf1)==0)
{ {
// speak this thousandplex if there was no word for the previous thousandplex
sprintf(string,"_0M%d",thousandplex); sprintf(string,"_0M%d",thousandplex);
Lookup(tr, string, ph_append); Lookup(tr, string, ph_append);
} }
Lookup(tr, "_.", ph_append); Lookup(tr, "_.", ph_append);
} }


n_digit_lookup = 0;
buf_digit_lookup[0] = 0;
if(thousandplex == 0) if(thousandplex == 0)
{ {
char *p2; char *p2;
{ {
p2 = p - 1; p2 = p - 1;
if(LookupDictList(tr, &p2, buf_digit_lookup, flags, FLAG_SUFX, wtab)) // lookup 2 digits if(LookupDictList(tr, &p2, buf_digit_lookup, flags, FLAG_SUFX, wtab)) // lookup 2 digits
{
n_digit_lookup = 2; n_digit_lookup = 2;
}
} }
if((buf_digit_lookup[0] == 0) && (*p != '0')) if((buf_digit_lookup[0] == 0) && (*p != '0'))
{ {
// not found, lookup only the last digit // not found, lookup only the last digit
if(LookupDictList(tr, &p, buf_digit_lookup, flags, FLAG_SUFX, wtab)) // don't match '0', or entries with $only if(LookupDictList(tr, &p, buf_digit_lookup, flags, FLAG_SUFX, wtab)) // don't match '0', or entries with $only
n_digit_lookup = 1;
{
n_digit_lookup = 1;
}
} }
} }


} }


*flags |= FLAG_FOUND; *flags |= FLAG_FOUND;
prev_value = this_value;
speak_missing_thousands--;
return(1); return(1);
} // end of TranslateNumber_1 } // end of TranslateNumber_1



+ 1
- 0
src/phoneme.h View File



// place of articulation // place of articulation
#define phPLACE 0xf0000 #define phPLACE 0xf0000
#define phPLACE_blb 0x10000
#define phPLACE_pla 0x60000 #define phPLACE_pla 0x60000


#define N_PHONEME_TABS 100 // number of phoneme tables #define N_PHONEME_TABS 100 // number of phoneme tables

+ 99
- 4
src/readclause.cpp View File

static int clear_skipping_text = 0; // next clause should clear the skipping_text flag static int clear_skipping_text = 0; // next clause should clear the skipping_text flag
int count_characters = 0; int count_characters = 0;
static int sayas_mode; static int sayas_mode;
static int sayas_start;
static int ssml_ignore_l_angle = 0; static int ssml_ignore_l_angle = 0;


// alter tone for announce punctuation or capitals // alter tone for announce punctuation or capitals
} // end of SetProsodyParemeter } // end of SetProsodyParemeter




static int ReplaceKeyName(char *outbuf, int index, int &outix)
{//===========================================================
// Replace some key-names by single characters, so they can be pronounced in different languages
MNEM_TAB keynames[] = {
{"space ",0xe020},
{"tab ", 0xe009},
{"underscore ", 0xe05f},
{"double-quote ", '"'},
{NULL, 0}};
int ix;
int letter;
char *p;

p = &outbuf[index+1];

if((letter = LookupMnem(keynames, p)) != 0)
{
ix = utf8_out(letter, p);
outix = index + ix + 1;
return(letter);
}
return(0);
}



static int ProcessSsmlTag(wchar_t *xml_buf, char *outbuf, int &outix, int n_outbuf, int self_closing) static int ProcessSsmlTag(wchar_t *xml_buf, char *outbuf, int &outix, int n_outbuf, int self_closing)
{//================================================================================================== {//==================================================================================================
strcpy(&outbuf[outix],buf); strcpy(&outbuf[outix],buf);
outix += strlen(buf); outix += strlen(buf);


sayas_start = outix;
sayas_mode = value; // punctuation doesn't end clause during SAY-AS sayas_mode = value; // punctuation doesn't end clause during SAY-AS
break; break;


case SSML_SAYAS + SSML_CLOSE: case SSML_SAYAS + SSML_CLOSE:
if(sayas_mode == SAYAS_KEY)
{
outbuf[outix] = 0;
ReplaceKeyName(outbuf, sayas_start, outix);
}

outbuf[outix++] = CTRL_EMBEDDED; outbuf[outix++] = CTRL_EMBEDDED;
outbuf[outix++] = 'Y'; outbuf[outix++] = 'Y';
sayas_mode = 0; sayas_mode = 0;
int is_end_clause; int is_end_clause;
int announced_punctuation; int announced_punctuation;
int stressed_word = 0; int stressed_word = 0;
int end_clause_after_tag = 0;
int end_clause_index = 0;
const char *p; const char *p;
wchar_t xml_buf[N_XML_BUF+1]; wchar_t xml_buf[N_XML_BUF+1];


clear_skipping_text = 0; clear_skipping_text = 0;
} }


tr->phonemes_repeat_count = 0;
tr->clause_upper_count = 0; tr->clause_upper_count = 0;
tr->clause_lower_count = 0; tr->clause_lower_count = 0;
end_of_input = 0; end_of_input = 0;
if(terminator != 0) if(terminator != 0)
{ {
if(end_clause_after_tag)
ix = end_clause_index;

buf[ix] = ' '; buf[ix] = ' ';
buf[ix++] = 0; buf[ix++] = 0;
// 2nd newline, assume paragraph // 2nd newline, assume paragraph
UngetC(c2); UngetC(c2);


if(end_clause_after_tag)
ix = end_clause_index; // delete clause-end punctiation

buf[ix] = ' '; buf[ix] = ' ';
buf[ix+1] = 0; buf[ix+1] = 0;
if(parag > 3) if(parag > 3)
{ {
is_end_clause = 0; is_end_clause = 0;


if(end_clause_after_tag)
{
// Because of an xml tag, we are waiting for the
// next non-blank character to decide whether to end the clause
// i.e. is dot followed by an upper-case letter?
if(c1 == '\n')
{
// end_clause_after_tag &= ~CLAUSE_DOT;
}
if(!iswspace(c1))
{
if(iswdigit(c1) || (IsAlpha(c1) && !iswlower(c1)))
{
UngetC(c2);
ungot_char2 = c1;
buf[end_clause_index] = ' '; // delete the end-clause punctuation
buf[end_clause_index+1] = 0;
return(end_clause_after_tag);
}
end_clause_after_tag = 0;
}
}

if((c1 == '.') && (c2 == '.')) if((c1 == '.') && (c2 == '.'))
{ {
while((c_next = GetC()) == '.') while((c_next = GetC()) == '.')
// if a list of allowed punctuation has been set up, check whether the character is in it // if a list of allowed punctuation has been set up, check whether the character is in it
if((option_punctuation == 1) || (wcschr(option_punctlist,c1) != NULL)) if((option_punctuation == 1) || (wcschr(option_punctlist,c1) != NULL))
{ {
tr->phonemes_repeat_count = 0;
if((terminator = AnnouncePunctuation(tr, c1, &c2, buf, &ix, is_end_clause)) >= 0) if((terminator = AnnouncePunctuation(tr, c1, &c2, buf, &ix, is_end_clause)) >= 0)
return(terminator); return(terminator);
announced_punctuation = c1; announced_punctuation = c1;
} }
} }


if((c1 == '.') && (nl_count < 2))
{
punct_data |= CLAUSE_DOT;
}

if(nl_count==0) if(nl_count==0)
{ {
if(c1 == '.') if(c1 == '.')
(iswdigit(cprev) || (IsRomanU(cprev) && (IsRomanU(cprev2) || iswspace(cprev2))))) // lang=hu (iswdigit(cprev) || (IsRomanU(cprev) && (IsRomanU(cprev2) || iswspace(cprev2))))) // lang=hu
{ {
// dot after a number indicates an ordinal number // dot after a number indicates an ordinal number
if(!iswdigit(cprev) || iswlower(c_next) || (c_next == '<'))
is_end_clause = 0; // only if followed by lower-case, (or if there is a XML tag)
if(!iswdigit(cprev))
{
is_end_clause = 0; // Roman number followed by dot
}
else
{
if (iswlower(c_next))
is_end_clause = 0; // only if followed by lower-case, (or if there is a XML tag)
}
} }
else else
if(iswlower(c_next)) if(iswlower(c_next))
{ {
// next word has no capital letter, this dot is probably from an abbreviation // next word has no capital letter, this dot is probably from an abbreviation
c1 = ' ';
// c1 = ' ';
is_end_clause = 0; is_end_clause = 0;
} }
if(any_alnum==0) if(any_alnum==0)
is_end_clause = 0; is_end_clause = 0;
} }
} }

if(is_end_clause && (c1 == '.') && (c_next == '<') && option_ssml)
{
// wait until after the end of the xml tag, then look for upper-case letter
is_end_clause = 0;
end_clause_index = ix;
end_clause_after_tag = punct_data;
}
} }


if(is_end_clause) if(is_end_clause)
UngetC(c_next); UngetC(c_next);
buf[ix] = ' '; buf[ix] = ' ';
buf[ix+1] = 0; buf[ix+1] = 0;

if(!IsAlpha(c_next))
{
punct_data &= ~CLAUSE_DOT;
}
if(nl_count > 1) if(nl_count > 1)
{ {
if((punct_data == CLAUSE_QUESTION) || (punct_data == CLAUSE_EXCLAMATION)) if((punct_data == CLAUSE_QUESTION) || (punct_data == CLAUSE_EXCLAMATION))
{ {
ix += utf8_out(CHAR_EMPHASIS, &buf[ix]); ix += utf8_out(CHAR_EMPHASIS, &buf[ix]);
} }
if(end_clause_after_tag)
{
ix = end_clause_index; // delete clause-end punctuation
}
buf[ix] = ' '; buf[ix] = ' ';
buf[ix+1] = 0; buf[ix+1] = 0;
return(CLAUSE_EOF); // end of file return(CLAUSE_EOF); // end of file

+ 2
- 2
src/setlengths.cpp View File

case phSTOP: case phSTOP:
last_pitch = 0; last_pitch = 0;
if(prev->type == phFRICATIVE) if(prev->type == phFRICATIVE)
p->prepause = 20;
p->prepause = 25;
else else
if((more_syllables > 0) || (stress < 4)) if((more_syllables > 0) || (stress < 4))
p->prepause = 40;
p->prepause = 48;
else else
p->prepause = 60; p->prepause = 60;



+ 39
- 1
src/speak_lib.cpp View File

#include "wave.h" #include "wave.h"


unsigned char *outbuf=NULL; unsigned char *outbuf=NULL;
extern FILE *f_logespeak;
extern espeak_VOICE voice_selected; extern espeak_VOICE voice_selected;


espeak_EVENT *event_list=NULL; espeak_EVENT *event_list=NULL;
init_path(path); init_path(path);
initialise(); initialise();
select_output(output_type); select_output(output_type);

if(f_logespeak)
{
fprintf(f_logespeak,"INIT mode %d options 0x%x\n",output_type,options);
}

// buflength is in mS, allocate 2 bytes per sample // buflength is in mS, allocate 2 bytes per sample
if(buf_length == 0) if(buf_length == 0)
buf_length = 200; buf_length = 200;
SHOW("espeak_Synth > position=%d, position_type=%d, end_position=%d, flags=%d, user_data=0x%x, text=%s\n", position, position_type, end_position, flags, user_data, text); SHOW("espeak_Synth > position=%d, position_type=%d, end_position=%d, flags=%d, user_data=0x%x, text=%s\n", position, position_type, end_position, flags, user_data, text);
#endif #endif


if(f_logespeak)
{
fprintf(f_logespeak,"\nSYNTH posn %d %d %d flags 0x%x\n%s\n",position,end_position,position_type,flags, (const char *)text);
fflush(f_logespeak);
}

espeak_ERROR a_error=EE_INTERNAL_ERROR; espeak_ERROR a_error=EE_INTERNAL_ERROR;
static unsigned int temp_identifier; static unsigned int temp_identifier;


espeak_ERROR a_error=EE_OK; espeak_ERROR a_error=EE_OK;
static unsigned int temp_identifier; static unsigned int temp_identifier;


if(f_logespeak)
{
fprintf(f_logespeak,"\nSYNTH MARK %s posn %d flags 0x%x\n%s\n",index_mark,end_position,flags, (const char *)text);
}


if (unique_identifier == NULL) if (unique_identifier == NULL)
{ {
unique_identifier = &temp_identifier; unique_identifier = &temp_identifier;
ENTER("espeak_Key"); ENTER("espeak_Key");
// symbolic name, symbolicname_character - is there a system resource of symbolicnames per language // symbolic name, symbolicname_character - is there a system resource of symbolicnames per language


if(f_logespeak)
{
fprintf(f_logespeak,"\nKEY %s\n",key);
}

espeak_ERROR a_error = EE_OK; espeak_ERROR a_error = EE_OK;


if(synchronous_mode) if(synchronous_mode)
ENTER("espeak_Char"); ENTER("espeak_Char");
// is there a system resource of character names per language? // is there a system resource of character names per language?


if(f_logespeak)
{
fprintf(f_logespeak,"\nCHAR U+%x\n",character);
}

#ifdef USE_ASYNC #ifdef USE_ASYNC
espeak_ERROR a_error; espeak_ERROR a_error;


{//============================================================================================= {//=============================================================================================
ENTER("espeak_SetParameter"); ENTER("espeak_SetParameter");


if(f_logespeak)
{
fprintf(f_logespeak,"SETPARAM %d %d %d\n",parameter,value,relative);
}
#ifdef USE_ASYNC #ifdef USE_ASYNC
espeak_ERROR a_error; espeak_ERROR a_error;


outbuf = NULL; outbuf = NULL;
FreePhData(); FreePhData();


if(f_logespeak)
{
fclose(f_logespeak);
f_logespeak = NULL;
}

return EE_OK; return EE_OK;
} // end of espeak_Terminate } // end of espeak_Terminate



+ 1
- 1
src/speak_lib.h View File

The list is terminated by a NULL pointer The list is terminated by a NULL pointer


If voice_spec is NULL then all voices are listed. If voice_spec is NULL then all voices are listed.
If voice spec is give, then only the voices which are compatible with the voice_spec
If voice spec is given, then only the voices which are compatible with the voice_spec
are listed, and they are listed in preference order. are listed, and they are listed in preference order.
*/ */



+ 14
- 2
src/synthdata.cpp View File

#include "translate.h" #include "translate.h"
#include "wave.h" #include "wave.h"


const char *version_string = "1.41.32 09.Nov.09";
const int version_phdata = 0x014118;
const char *version_string = "1.42.02 30.Nov.09";
const int version_phdata = 0x014200;


int option_device_number = -1; int option_device_number = -1;
FILE *f_logespeak = NULL;
int logging_type;


// copy the current phoneme table into here // copy the current phoneme table into here
int n_phoneme_tab; int n_phoneme_tab;
char *p; char *p;
char string[200]; char string[200];


logging_type = 0;

for(ix=0; ix<N_SOUNDICON_SLOTS; ix++) for(ix=0; ix<N_SOUNDICON_SLOTS; ix++)
{ {
soundicon_tab[ix].filename = NULL; soundicon_tab[ix].filename = NULL;


while(fgets(buf,sizeof(buf),f)!=NULL) while(fgets(buf,sizeof(buf),f)!=NULL)
{ {
if(buf[0] == '/') continue;

if(memcmp(buf,"log",3)==0)
{
if(sscanf(&buf[4],"%d %s",&logging_type,string)==2)
f_logespeak = fopen(string,"w");
}
else
if(memcmp(buf,"tone",4)==0) if(memcmp(buf,"tone",4)==0)
{ {
ReadTonePoints(&buf[5],tone_points); ReadTonePoints(&buf[5],tone_points);

+ 51
- 12
src/synthesize.cpp View File

int ix; int ix;
long *q; long *q;
int len; int len;
int min;
int match_level; int match_level;
int frame_length; int frame_length;
int frame1_length; int frame1_length;
int frame2_length; int frame2_length;
int length_factor; int length_factor;
int length_mod; int length_mod;
int length_mod2; // reduced effect length_mod
int total_len = 0; int total_len = 0;
int len_adjust_factor = 256;
static int wave_flag = 0; static int wave_flag = 0;
int wcmd_spect = WCMD_SPECT; int wcmd_spect = WCMD_SPECT;


length_mod = plist->length; length_mod = plist->length;
if(length_mod==0) length_mod=256; if(length_mod==0) length_mod=256;


if(which==1)
{
// limit the shortening of sonorants before shortened (eg. unstressed vowels)
if((this_ph->type==phLIQUID) || (prev_ph->type==phLIQUID) || (prev_ph->type==phNASAL))
length_mod2 = (length_mod*(256-speed.speed_factor3) + 256*speed.speed_factor3)/256;

if(which==1)
{ {
if(length_mod < (len = translator->langopts.param[LOPT_SONORANT_MIN]))
// limit the shortening of sonorants before shortened (eg. unstressed vowels)
if((this_ph->type==phLIQUID) || (prev_ph->type==phLIQUID) || (prev_ph->type==phNASAL))
{ {
length_mod = len;
if(length_mod < (len = translator->langopts.param[LOPT_SONORANT_MIN]))
{
length_mod = len;
}
} }
} }
}

modn_flags = 0; modn_flags = 0;
frames = LookupSpect(this_ph,prev_ph,next_ph,which,&match_level,&n_frames, plist); frames = LookupSpect(this_ph,prev_ph,next_ph,which,&match_level,&n_frames, plist);
if(frames == NULL) if(frames == NULL)
return(0); // not found return(0); // not found


// if((which==2) && (this_ph->phflags & phLONG))
if((which==2) && (this_ph->std_length >= 200))
{
// apply a minimum length for long vowels at fast speeds, to keep the distinction with short vowels
total_len = 0;
for(frameix=0; frameix<(n_frames-1); frameix++)
{
length_factor = length_mod;
if(frames[frameix].frflags & FRFLAG_LEN_MOD) // reduce effect of length mod
{
length_factor = length_mod2;
}
len = (frames[frameix].length * samplerate)/1000;
len = (len * length_factor)/256;
total_len += len;
}

min = translator->langopts.param[LOPT_MIN_LONG_VOWEL] * (samplerate)/1000;
min = (min * length_mod2)/256;
if(total_len < min)
{
len_adjust_factor = (min*256)/total_len;
}
}

frame1 = frames[0].frame; frame1 = frames[0].frame;
frame1_length = frames[0].length; frame1_length = frames[0].length;
if(voice->klattv[0]) if(voice->klattv[0])
syllable_centre = wcmdq_tail; syllable_centre = wcmdq_tail;
} }


total_len = 0;
frame_length = frame1_length; frame_length = frame1_length;
for(frameix=1; frameix<n_frames; frameix++) for(frameix=1; frameix<n_frames; frameix++)
{ {
length_factor = length_mod; length_factor = length_mod;
if(frame1->frflags & FRFLAG_LEN_MOD) // reduce effect of length mod if(frame1->frflags & FRFLAG_LEN_MOD) // reduce effect of length mod
{ {
length_factor = (length_mod*(256-speed.speed_factor3) + 256*speed.speed_factor3)/256;
length_factor = length_mod2;
} }
len = (frame_length * samplerate)/1000; len = (frame_length * samplerate)/1000;
len = (len * length_factor)/256; len = (len * length_factor)/256;
len = (len * len_adjust_factor)/256;


if(modulation >= 0) if(modulation >= 0)
{ {


case phSTOP: case phSTOP:
released = 0; released = 0;
if(next->type==phVOWEL) released = 1;
if(next->type==phLIQUID && !next->newword) released = 1;
if(next->type==phVOWEL)
{
released = 1;
}
else
if(!next->newword)
{
if(next->type==phLIQUID) released = 1;
// if(((p->ph->phflags & phPLACE) == phPLACE_blb) && (next->ph->phflags & phSIBILANT)) released = 1;
}


if(released) if(released)
DoSample(p->ph,next->ph,2,0,0); DoSample(p->ph,next->ph,2,0,0);
} }
} }


if((next->type==phVOWEL) || ((next->type==phLIQUID)) && (next->newword==0)) // ?? test 14.Aug.2007
if((next->type==phVOWEL) || ((next->type==phLIQUID) && (next->newword==0))) // ?? test 14.Aug.2007
{ {
StartSyllable(); StartSyllable();
if(p->synthflags & SFLAG_LENGTHEN) if(p->synthflags & SFLAG_LENGTHEN)

+ 28
- 13
src/tr_languages.cpp View File

#define OFFSET_GREEK 0x380 #define OFFSET_GREEK 0x380
#define OFFSET_CYRILLIC 0x420 #define OFFSET_CYRILLIC 0x420
#define OFFSET_ARMENIAN 0x530 #define OFFSET_ARMENIAN 0x530
#define OFFSET_ARABIC 0x600
#define OFFSET_DEVANAGARI 0x900 #define OFFSET_DEVANAGARI 0x900
#define OFFSET_BENGALI 0x980 #define OFFSET_BENGALI 0x980
#define OFFSET_GURMUKHI 0xa00 #define OFFSET_GURMUKHI 0xa00
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 's'; // don't count this character at start of word tr->langopts.param[LOPT_UNPRONOUNCABLE] = 's'; // don't count this character at start of word
tr->langopts.param[LOPT_BRACKET_PAUSE] = 4; // pause at bracket tr->langopts.param[LOPT_BRACKET_PAUSE] = 4; // pause at bracket
tr->langopts.param2[LOPT_BRACKET_PAUSE] = 2; // pauses when announcing bracket names tr->langopts.param2[LOPT_BRACKET_PAUSE] = 2; // pauses when announcing bracket names
tr->langopts.param[LOPT_MIN_LONG_VOWEL] = 40;
tr->langopts.max_initial_consonants = 3; tr->langopts.max_initial_consonants = 3;
tr->langopts.replace_chars = NULL; tr->langopts.replace_chars = NULL;
tr->langopts.ascii_language = ""; // Non-Latin alphabet languages, use this language to speak Latin words, default is English tr->langopts.ascii_language = ""; // Non-Latin alphabet languages, use this language to speak Latin words, default is English
static const char dev_consonants2[] = {0x02,0x03,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f}; static const char dev_consonants2[] = {0x02,0x03,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f};


memset(tr->letter_bits,0,sizeof(tr->letter_bits)); memset(tr->letter_bits,0,sizeof(tr->letter_bits));
SetLetterBitsRange(tr,LETTERGP_A,0x04,0x14); // vowel letters only
SetLetterBitsRange(tr,LETTERGP_A,0x04,0x14); // vowel letters
SetLetterBitsRange(tr,LETTERGP_A,0x3e,0x4d); // + vowel signs, and virama

SetLetterBitsRange(tr,LETTERGP_B,0x3e,0x4d); // vowel signs, and virama SetLetterBitsRange(tr,LETTERGP_B,0x3e,0x4d); // vowel signs, and virama


SetLetterBitsRange(tr,LETTERGP_C,0x15,0x39); // the main consonant range SetLetterBitsRange(tr,LETTERGP_C,0x15,0x39); // the main consonant range
} }
break; break;


case L('a','r'): // Arabic
case L('u','r'): // Urdu
tr->letter_bits_offset = OFFSET_ARABIC;
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words
break;

case L('b','n'): // Bengali case L('b','n'): // Bengali
{ {
static const short stress_lengths_bn[8] = {180, 180, 210, 210, 0, 0, 230, 240}; static const short stress_lengths_bn[8] = {180, 180, 210, 210, 0, 0, 230, 240};
static const unsigned char stress_amps_eu[8] = {16,16, 18,18, 18,18, 18,18 }; static const unsigned char stress_amps_eu[8] = {16,16, 18,18, 18,18, 18,18 };
SetupTranslator(tr,stress_lengths_eu,stress_amps_eu); SetupTranslator(tr,stress_lengths_eu,stress_amps_eu);
tr->langopts.stress_rule = STRESSPOSN_2L; // ?? second syllable ?? tr->langopts.stress_rule = STRESSPOSN_2L; // ?? second syllable ??
tr->langopts.numbers = NUM_SINGLE_STRESS + NUM_DECIMAL_COMMA | NUM_AND_UNITS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_VIGESIMAL;
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_AND_UNITS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_VIGESIMAL;
} }
break; break;




case L('f','a'): // Farsi case L('f','a'): // Farsi
{ {
tr->letter_bits_offset = OFFSET_ARABIC;
tr->langopts.numbers = NUM_AND_UNITS | NUM_HUNDRED_AND;
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words
} }
break; break;
tr->langopts.stress_flags = 0x56; // move secondary stress from light to a following heavy syllable tr->langopts.stress_flags = 0x56; // move secondary stress from light to a following heavy syllable
tr->langopts.param[LOPT_IT_DOUBLING] = 1; tr->langopts.param[LOPT_IT_DOUBLING] = 1;
tr->langopts.long_stop = 130; tr->langopts.long_stop = 130;
tr->langopts.param[LOPT_MIN_LONG_VOWEL] = 65;


tr->langopts.numbers = NUM_DECIMAL_COMMA + NUM_ALLOW_SPACE; tr->langopts.numbers = NUM_DECIMAL_COMMA + NUM_ALLOW_SPACE;
SetLetterVowel(tr,'y'); SetLetterVowel(tr,'y');
tr->langopts.stress_flags = 0x0024; // don't use secondary stress tr->langopts.stress_flags = 0x0024; // don't use secondary stress
tr->langopts.param[LOPT_IT_LENGTHEN] = 1; // remove lengthen indicator from unstressed syllables tr->langopts.param[LOPT_IT_LENGTHEN] = 1; // remove lengthen indicator from unstressed syllables


tr->langopts.numbers = NUM_SINGLE_STRESS + NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_OMIT_1_HUNDRED | NUM_NOPAUSE | NUM_ROMAN | NUM_VIGESIMAL | NUM_DFRACTION_4;
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_OMIT_1_HUNDRED | NUM_NOPAUSE | NUM_ROMAN | NUM_VIGESIMAL | NUM_DFRACTION_4;
SetLetterVowel(tr,'y'); SetLetterVowel(tr,'y');
} }
break; break;
tr->langopts.spelling_stress = 1; tr->langopts.spelling_stress = 1;
tr->langopts.accents = 1; tr->langopts.accents = 1;


tr->langopts.numbers = NUM_SINGLE_STRESS + NUM_HUNDRED_AND | NUM_DECIMAL_COMMA | NUM_THOUS_SPACE | NUM_DFRACTION_2 | NUM_ROMAN_UC;
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_DECIMAL_COMMA | NUM_THOUS_SPACE | NUM_DFRACTION_2 | NUM_ROMAN_UC;
tr->langopts.numbers2 = 0x4a; // variant numbers before thousands,milliards tr->langopts.numbers2 = 0x4a; // variant numbers before thousands,milliards
tr->langopts.replace_chars = replace_cyrillic_latin; tr->langopts.replace_chars = replace_cyrillic_latin;




tr->langopts.vowel_pause = 0x20; tr->langopts.vowel_pause = 0x20;
tr->langopts.stress_rule = STRESSPOSN_1L; tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.stress_flags = 0x8036 | STRS_HYPEN_UNSTRESS;
tr->langopts.stress_flags = 0x8036 | S_HYPEN_UNSTRESS;
tr->langopts.unstressed_wd1 = 2; tr->langopts.unstressed_wd1 = 2;
tr->langopts.param[LOPT_IT_DOUBLING] = 1; tr->langopts.param[LOPT_IT_DOUBLING] = 1;
tr->langopts.param[LOPT_ANNOUNCE_PUNCT] = 2; // don't break clause before announcing . ? ! tr->langopts.param[LOPT_ANNOUNCE_PUNCT] = 2; // don't break clause before announcing . ? !
// tr->langopts.param[LOPT_COMBINE_WORDS] = 9; // combine some prepositions with the following word
tr->langopts.param[LOPT_MIN_LONG_VOWEL] = 65;


tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_DFRACTION_5 | NUM_ROMAN | NUM_ROMAN_ORDINAL | NUM_ROMAN_CAPITALS | NUM_ORDINAL_DOT | NUM_OMIT_1_HUNDRED; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_DFRACTION_5 | NUM_ROMAN | NUM_ROMAN_ORDINAL | NUM_ROMAN_CAPITALS | NUM_ORDINAL_DOT | NUM_OMIT_1_HUNDRED;
tr->langopts.min_roman = 1; tr->langopts.min_roman = 1;
SetupTranslator(tr,stress_lengths_no,NULL); SetupTranslator(tr,stress_lengths_no,NULL);
tr->langopts.stress_rule = STRESSPOSN_1L; tr->langopts.stress_rule = STRESSPOSN_1L;
SetLetterVowel(tr,'y'); SetLetterVowel(tr,'y');
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_HUNDRED_AND | NUM_ALLOW_SPACE | NUM_1900 + NUM_ORDINAL_DOT;
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_HUNDRED_AND | NUM_ALLOW_SPACE | NUM_1900 | NUM_ORDINAL_DOT;
} }
break; break;




case L('p','t'): // Portuguese case L('p','t'): // Portuguese
{ {
static const short stress_lengths_pt[8] = {180, 125, 210, 210, 0, 0, 270, 295};
static const unsigned char stress_amps_pt[8] = {16,13, 19,19, 20,22, 22,21 }; // 'diminished' is used to mark a quieter, final unstressed syllable
static const short stress_lengths_pt[8] = {170, 115, 210, 240, 0, 0, 260, 280};
static const unsigned char stress_amps_pt[8] = {16,11, 19,21, 20,22, 22,21 }; // 'diminished' is used to mark a quieter, final unstressed syllable


SetupTranslator(tr,stress_lengths_pt,stress_amps_pt); SetupTranslator(tr,stress_lengths_pt,stress_amps_pt);
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable


tr->langopts.stress_rule = STRESSPOSN_1R; // stress on final syllable tr->langopts.stress_rule = STRESSPOSN_1R; // stress on final syllable
tr->langopts.stress_flags = 0x6 | 0x10 | 0x20000;
tr->langopts.stress_flags = 0x6 | 0x10 | 0x2000 | 0x20000;
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_DFRACTION_2 | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_ROMAN; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_DFRACTION_2 | NUM_HUNDRED_AND | NUM_AND_UNITS | NUM_ROMAN;
SetLetterVowel(tr,'y'); SetLetterVowel(tr,'y');
ResetLetterBits(tr,0x2); ResetLetterBits(tr,0x2);
SetLetterBits(tr,1,"bcdfgjkmnpqstvxz"); // B hard consonants, excluding h,l,r,w,y SetLetterBits(tr,1,"bcdfgjkmnpqstvxz"); // B hard consonants, excluding h,l,r,w,y
tr->langopts.param[LOPT_ALT] = 2; // call ApplySpecialAttributes2() if a word has $alt or $alt2
} }
break; break;




tr->langopts.stress_rule = STRESSPOSN_1L; tr->langopts.stress_rule = STRESSPOSN_1L;
SetLetterVowel(tr,'y'); SetLetterVowel(tr,'y');
tr->langopts.numbers = NUM_SINGLE_STRESS + NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_1900;
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_1900;
tr->langopts.accents = 1; tr->langopts.accents = 1;
} }
break; break;


tr->langopts.stress_rule = STRESSPOSN_1L; tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.stress_flags = 0x10004; // use 'diminished' for unstressed final syllable tr->langopts.stress_flags = 0x10004; // use 'diminished' for unstressed final syllable
tr->langopts.break_numbers = 0x24a8; // 1000, 100,000 10,000,000
tr->langopts.break_numbers = 0x14a8; // 1000, 100,000 10,000,000


if(name2 == L('t','a')) if(name2 == L('t','a'))
{ {
tr->langopts.stress_rule = 7; // stress on the last syllable, before any explicitly unstressed syllable tr->langopts.stress_rule = 7; // stress on the last syllable, before any explicitly unstressed syllable
tr->langopts.stress_flags = 0x20; //no automatic secondary stress tr->langopts.stress_flags = 0x20; //no automatic secondary stress


tr->langopts.numbers = NUM_SINGLE_STRESS + NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_OMIT_1_HUNDRED | NUM_DFRACTION_2;
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_OMIT_1_HUNDRED | NUM_DFRACTION_2;
tr->langopts.max_initial_consonants = 2; tr->langopts.max_initial_consonants = 2;
} }
break; break;
{ {
tr->langopts.thousands_sep = 0; // don't allow thousands separator, except space tr->langopts.thousands_sep = 0; // don't allow thousands separator, except space
} }

return(tr); return(tr);
} // end of SelectTranslator } // end of SelectTranslator



+ 96
- 45
src/translate.cpp View File





// these were previously in translator class // these were previously in translator class
#ifdef PLATFORM_WINDOWS
char word_phonemes[N_WORD_PHONEMES*2]; // longer, because snprint() is not available
#else
char word_phonemes[N_WORD_PHONEMES]; // a word translated into phoneme codes char word_phonemes[N_WORD_PHONEMES]; // a word translated into phoneme codes
#endif
int n_ph_list2; int n_ph_list2;
PHONEME_LIST2 ph_list2[N_PHONEME_LIST]; // first stage of text->phonemes PHONEME_LIST2 ph_list2[N_PHONEME_LIST]; // first stage of text->phonemes


return(0); return(0);
} }


if((c >= 0x64b) && (c <= 0x65e))
return(1); // arabic vowel marks

if((c >= 0x300) && (c <= 0x36f)) if((c >= 0x300) && (c <= 0x36f))
return(1); // combining accents return(1); // combining accents









int TranslateWord(Translator *tr, char *word1, int next_pause, WORD_TAB *wtab) int TranslateWord(Translator *tr, char *word1, int next_pause, WORD_TAB *wtab)
{//=========================================================================== {//===========================================================================
// word1 is terminated by space (0x20) character // word1 is terminated by space (0x20) character
char *wordx; char *wordx;
char phonemes[N_WORD_PHONEMES]; char phonemes[N_WORD_PHONEMES];
char *ph_limit; char *ph_limit;
char *phonemes_ptr;
char prefix_phonemes[N_WORD_PHONEMES]; char prefix_phonemes[N_WORD_PHONEMES];
char unpron_phonemes[N_WORD_PHONEMES];
char end_phonemes[N_WORD_PHONEMES]; char end_phonemes[N_WORD_PHONEMES];
char word_copy[N_WORD_BYTES]; char word_copy[N_WORD_BYTES];
char prefix_chars[N_WORD_BYTES];
char prefix_chars[41];
int found=0; int found=0;
int end_flags; int end_flags;
char c_temp; // save a character byte while we temporarily replace it with space char c_temp; // save a character byte while we temporarily replace it with space
int first_char; int first_char;
int last_char = 0; int last_char = 0;
int unpron_length;
int add_plural_suffix = 0; int add_plural_suffix = 0;
int prefix_flags = 0; int prefix_flags = 0;
int confirm_prefix; int confirm_prefix;
dictionary_flags2[1] = 0; dictionary_flags2[1] = 0;
dictionary_skipwords = 0; dictionary_skipwords = 0;


phonemes[0] = 0;
unpron_phonemes[0] = 0;
prefix_phonemes[0] = 0; prefix_phonemes[0] = 0;
end_phonemes[0] = 0; end_phonemes[0] = 0;
ph_limit = &phonemes[N_WORD_PHONEMES]; ph_limit = &phonemes[N_WORD_PHONEMES];
word_length++; word_length++;
} }


// try an initial lookup in the dictionary list, we may find a pronunciation specified, or
// we may just find some flags
spell_word = 0; spell_word = 0;
if(option_sayas == SAYAS_KEY) if(option_sayas == SAYAS_KEY)
{ {
if(word_length == 1) if(word_length == 1)
spell_word = 4; spell_word = 4;
else
{
// is there a translation for this keyname ?
word1--;
*word1 = '_'; // prefix keyname with '_'
found = LookupDictList(tr, &word1, phonemes, dictionary_flags, 0, wtab);
}
} }


// try an initial lookup in the dictionary list, we may find a pronunciation specified, or
// we may just find some flags
if(option_sayas & 0x10) if(option_sayas & 0x10)
{ {
// SAYAS_CHAR, SAYAS_GYLPH, or SAYAS_SINGLE_CHAR // SAYAS_CHAR, SAYAS_GYLPH, or SAYAS_SINGLE_CHAR
} }
else else
{ {
found = LookupDictList(tr, &word1, phonemes, dictionary_flags, FLAG_ALLOW_TEXTMODE, wtab); // the original word
if(!found)
found = LookupDictList(tr, &word1, phonemes, dictionary_flags, FLAG_ALLOW_TEXTMODE, wtab); // the original word


if((dictionary_flags[0] & FLAG_DOT) && (wordx[1] == '.'))
if((dictionary_flags[0] & (FLAG_ALLOW_DOT || FLAG_NEEDS_DOT)) && (wordx[1] == '.'))
{ {
wordx[1] = ' '; // remove a Dot after this word wordx[1] = ' '; // remove a Dot after this word
} }


while(*wordx != ' ') while(*wordx != ' ')
{ {
wordx += TranslateLetter(tr,wordx, phonemes,spell_word, word_length);
wordx += TranslateLetter(tr,wordx, phonemes, spell_word);
posn++; posn++;
if(phonemes[0] == phonSWITCH) if(phonemes[0] == phonSWITCH)
{ {
// This word looks "unpronouncable", so speak letters individually until we // This word looks "unpronouncable", so speak letters individually until we
// find a remainder that we can pronounce. // find a remainder that we can pronounce.
emphasize_allcaps = 0; emphasize_allcaps = 0;
wordx += TranslateLetter(tr,wordx,phonemes,0, word_length);
wordx += TranslateLetter(tr, wordx, unpron_phonemes, 0);
posn++; posn++;
if(phonemes[0] == phonSWITCH) if(phonemes[0] == phonSWITCH)
{ {
// change to another language in order to translate this word // change to another language in order to translate this word
strcpy(word_phonemes,phonemes);
if(strcmp(&phonemes[1],"en")==0)
strcpy(word_phonemes,unpron_phonemes);
if(strcmp(&unpron_phonemes[1],"en")==0)
return(FLAG_SPELLWORD); // _^_en must have been set in TranslateLetter(), not *_rules return(FLAG_SPELLWORD); // _^_en must have been set in TranslateLetter(), not *_rules
return(0); return(0);
} }
if(length > 0) if(length > 0)
wordx[-1] = ' '; // prevent this affecting the pronunciation of the pronuncable part wordx[-1] = ' '; // prevent this affecting the pronunciation of the pronuncable part
} }
SetSpellingStress(tr,phonemes,0,posn);
SetSpellingStress(tr,unpron_phonemes,0,posn);


// anything left ? // anything left ?
if(*wordx != ' ') if(*wordx != ' ')
{ {
// Translate the stem // Translate the stem
unpron_length = strlen(phonemes);
end_type = TranslateRules(tr, wordx, phonemes, N_WORD_PHONEMES, end_phonemes, wflags, dictionary_flags); end_type = TranslateRules(tr, wordx, phonemes, N_WORD_PHONEMES, end_phonemes, wflags, dictionary_flags);


if(phonemes[0] == phonSWITCH) if(phonemes[0] == phonSWITCH)
posn = 0; posn = 0;
while((*wordx != ' ') && (*wordx != 0)) while((*wordx != ' ') && (*wordx != 0))
{ {
wordx += TranslateLetter(tr,wordx, phonemes, 4, word_length);
wordx += TranslateLetter(tr,wordx, phonemes, 4);
posn++; posn++;
if(phonemes[0] == phonSWITCH) if(phonemes[0] == phonSWITCH)
{ {
// The word has a standard ending, re-translate without this ending // The word has a standard ending, re-translate without this ending
end_flags = RemoveEnding(tr, wordx, end_type, word_copy); end_flags = RemoveEnding(tr, wordx, end_type, word_copy);


phonemes_ptr = &phonemes[unpron_length];
phonemes_ptr[0] = 0;
phonemes[0] = 0;


if(prefix_phonemes[0] != 0) if(prefix_phonemes[0] != 0)
{ {
// lookup the stem without the prefix removed // lookup the stem without the prefix removed
wordx[-1] = c_temp; wordx[-1] = c_temp;
found = LookupDictList(tr, &word1, phonemes_ptr, dictionary_flags2, end_flags, wtab); // include prefix, but not suffix
found = LookupDictList(tr, &word1, phonemes, dictionary_flags2, end_flags, wtab); // include prefix, but not suffix
wordx[-1] = ' '; wordx[-1] = ' ';
if(dictionary_flags[0]==0) if(dictionary_flags[0]==0)
{ {
} }
if(found == 0) if(found == 0)
{ {
found = LookupDictList(tr, &wordx, phonemes_ptr, dictionary_flags2, end_flags, wtab); // without prefix and suffix
if(phonemes_ptr[0] == phonSWITCH)
found = LookupDictList(tr, &wordx, phonemes, dictionary_flags2, end_flags, wtab); // without prefix and suffix
if(phonemes[0] == phonSWITCH)
{ {
// change to another language in order to translate this word // change to another language in order to translate this word
memcpy(wordx,word_copy,strlen(word_copy)); memcpy(wordx,word_copy,strlen(word_copy));
strcpy(word_phonemes,phonemes_ptr);
strcpy(word_phonemes,phonemes);
return(0); return(0);
} }
if(dictionary_flags[0]==0) if(dictionary_flags[0]==0)
*p = phonSTRESS_3; *p = phonSTRESS_3;
} }
} }
strcpy(word_phonemes,prefix_phonemes);
strcat(word_phonemes,phonemes);
#ifdef PLATFORM_WINDOWS
sprintf(word_phonemes, "%s%s%s", unpron_phonemes, prefix_phonemes, phonemes);
#else
snprintf(word_phonemes, sizeof(word_phonemes), "%s%s%s", unpron_phonemes, prefix_phonemes, phonemes);
#endif
word_phonemes[N_WORD_PHONEMES-1] = 0;
SetWordStress(tr, word_phonemes, dictionary_flags, -1, 0); SetWordStress(tr, word_phonemes, dictionary_flags, -1, 0);
} }
else else
{ {
// stress position affects the whole word, including prefix // stress position affects the whole word, including prefix
strcpy(word_phonemes,prefix_phonemes);
strcat(word_phonemes,phonemes);
#ifdef PLATFORM_WINDOWS
sprintf(word_phonemes, "%s%s%s", unpron_phonemes, prefix_phonemes, phonemes);
#else
snprintf(word_phonemes, sizeof(word_phonemes), "%s%s%s", unpron_phonemes, prefix_phonemes, phonemes);
#endif
word_phonemes[N_WORD_PHONEMES-1] = 0;
SetWordStress(tr, word_phonemes, dictionary_flags, -1, tr->prev_last_stress); SetWordStress(tr, word_phonemes, dictionary_flags, -1, tr->prev_last_stress);
} }
} }
SetWordStress(tr, phonemes, dictionary_flags, -1, tr->prev_last_stress); SetWordStress(tr, phonemes, dictionary_flags, -1, tr->prev_last_stress);
else else
SetWordStress(tr, phonemes, dictionary_flags, -1, 0); SetWordStress(tr, phonemes, dictionary_flags, -1, 0);
strcpy(word_phonemes,prefix_phonemes);
strcat(word_phonemes,phonemes);
#ifdef PLATFORM_WINDOWS
sprintf(word_phonemes, "%s%s%s", unpron_phonemes, prefix_phonemes, phonemes);
#else
snprintf(word_phonemes, sizeof(word_phonemes), "%s%s%s", unpron_phonemes, prefix_phonemes, phonemes);
#endif
word_phonemes[N_WORD_PHONEMES-1] = 0;
} }


if(end_phonemes[0] != 0) if(end_phonemes[0] != 0)
{ {
// a suffix had the SUFX_T option set, add the suffix after the stress pattern has been determined // a suffix had the SUFX_T option set, add the suffix after the stress pattern has been determined
strcat(word_phonemes,end_phonemes);
ix = strlen(word_phonemes);
end_phonemes[N_WORD_PHONEMES-1-ix] = 0; // ensure no buffer overflow
strcpy(&word_phonemes[ix], end_phonemes);
} }


if(wflags & FLAG_LAST_WORD) if(wflags & FLAG_LAST_WORD)
dictionary_flags[0] &= ~FLAG_PAUSE1; dictionary_flags[0] &= ~FLAG_PAUSE1;
} }


if((wflags & FLAG_HYPHEN) && (tr->langopts.stress_flags & STRS_HYPEN_UNSTRESS))
if((wflags & FLAG_HYPHEN) && (tr->langopts.stress_flags & S_HYPEN_UNSTRESS))
{ {
ChangeWordStress(tr,word_phonemes,3); ChangeWordStress(tr,word_phonemes,3);
} }
{ {
// English Specific !!!! // English Specific !!!!
// any single letter before a dot is an abbreviation, except 'I' // any single letter before a dot is an abbreviation, except 'I'
dictionary_flags[0] |= FLAG_DOT;
dictionary_flags[0] |= FLAG_ALLOW_DOT;
} }


if((tr->langopts.param[LOPT_ALT] & 2) && ((dictionary_flags[0] & (FLAG_ALT_TRANS | FLAG_ALT2_TRANS)) != 0)) if((tr->langopts.param[LOPT_ALT] & 2) && ((dictionary_flags[0] & (FLAG_ALT_TRANS | FLAG_ALT2_TRANS)) != 0))
} }
} }


if(option_sayas2 == SAYAS_KEY)
if((option_sayas2 == SAYAS_KEY) && (c != ' '))
{ {
if(((c == '_') || (c == '-')) && IsAlpha(prev_in))
{
c = ' ';
}
if((prev_in == ' ') && (next_in == ' '))
option_sayas2 = SAYAS_SINGLE_CHARS; // single character, speak its name
c = towlower2(c); c = towlower2(c);
} }


} }
} }
else else
if((option_sayas2 & 0x30) == 0)
if((option_sayas2 & 0x10) == 0)
{ {
// speak as words // speak as words


// start of word, insert space if not one there already // start of word, insert space if not one there already
c = ' '; c = ' ';
space_inserted = 1; space_inserted = 1;
next_word_flags |= FLAG_NOSPACE;
} }
else else
{ {
else else
if(c=='-') if(c=='-')
{ {
if((IsAlpha(prev_in) || iswdigit(prev_in)) && IsAlpha(next_in))
if(!IsSpace(prev_in) && IsAlpha(next_in))
{ {
// '-' between two letters is a hyphen, treat as a space
word_flags |= FLAG_HYPHEN;
words[word_count-1].flags |= FLAG_HYPHEN_AFTER;
c = ' ';
if(prev_out != ' ')
{
// previous 'word' not yet ended (not alpha or numeric), start new word now.
c = ' ';
space_inserted = 1;
}
else
{
// '-' between two letters is a hyphen, treat as a space
word_flags |= FLAG_HYPHEN;
words[word_count-1].flags |= FLAG_HYPHEN_AFTER;
c = ' ';
}
} }
else else
if((prev_in==' ') && (next_in==' ')) if((prev_in==' ') && (next_in==' '))
} }
} }
else else
if(c == '.')
{
if(!(words[word_count-1].flags & FLAG_NOSPACE) && IsAlpha(prev_in))
{
// dot after a word, with space following, probably an abbreviation
words[word_count-1].flags |= FLAG_HAS_DOT;

if(IsSpace(next_in))
c = ' '; // remove the dot if it's followed by a space, so that it's not pronounced
}
}
else
if(c == '\'') if(c == '\'')
{ {
if(iswalnum(prev_in) && IsAlpha(next_in)) if(iswalnum(prev_in) && IsAlpha(next_in))
words[0].pre_pause = 0; // don't add extra pause at beginning of clause words[0].pre_pause = 0; // don't add extra pause at beginning of clause
words[word_count].pre_pause = 8; words[word_count].pre_pause = 8;
if(word_count > 0) if(word_count > 0)
{
words[word_count-1].flags |= FLAG_LAST_WORD; words[word_count-1].flags |= FLAG_LAST_WORD;
if((terminator & CLAUSE_DOT) && !(words[word_count-1].flags & FLAG_NOSPACE))
words[word_count-1].flags |= FLAG_HAS_DOT;
}
words[0].flags |= FLAG_FIRST_WORD; words[0].flags |= FLAG_FIRST_WORD;



for(ix=0; ix<word_count; ix++) for(ix=0; ix<word_count; ix++)
{ {
int nx; int nx;
} }
} }
} }
word = pw;
pw--;


// include the next few characters, in case there are an ordinal indicator or other suffix // include the next few characters, in case there are an ordinal indicator or other suffix
pn[0] = ' ';
memcpy(pn+1, pw, 16);
memcpy(pn, pw, 16);
pn[16] = 0; pn[16] = 0;


for(pw = &number_buf[1]; pw < pn;) for(pw = &number_buf[1]; pw < pn;)
} }
} }


if((dict_flags & FLAG_DOT) && (ix == word_count-1) && (terminator == CLAUSE_PERIOD))
if((dict_flags & (FLAG_ALLOW_DOT | FLAG_NEEDS_DOT)) && (ix == word_count-1) && (terminator & CLAUSE_DOT))
{ {
// probably an abbreviation such as Mr. or B. rather than end of sentence // probably an abbreviation such as Mr. or B. rather than end of sentence
clause_pause = 10; clause_pause = 10;

+ 26
- 7
src/translate.h View File

#define FLAG_ATEND 0x4000 /* use this pronunciation if at end of clause */ #define FLAG_ATEND 0x4000 /* use this pronunciation if at end of clause */
#define FLAG_SPELLWORD 0x8000 // re-translate the word as individual letters, separated by spaces #define FLAG_SPELLWORD 0x8000 // re-translate the word as individual letters, separated by spaces


#define FLAG_DOT 0x10000 /* ignore '.' after word (abbreviation) */
#define FLAG_ABBREV 0x20000 // spell as letters, even with a vowel, OR use specified pronunciation rather than split into letters #define FLAG_ABBREV 0x20000 // spell as letters, even with a vowel, OR use specified pronunciation rather than split into letters
#define FLAG_STEM 0x40000 // must have a suffix #define FLAG_STEM 0x40000 // must have a suffix


#define FLAG_ALT2_TRANS 0x200000 // language specific #define FLAG_ALT2_TRANS 0x200000 // language specific
#define FLAG_COMBINE 0x400000 // combine with the next word #define FLAG_COMBINE 0x400000 // combine with the next word


#define FLAG_ALLOW_DOT 0x01000000 // ignore '.' after word (abbreviation)
#define FLAG_NEEDS_DOT 0x02000000 // only if the word is followed by a dot

#define FLAG_MAX3 0x08000000 // limit to 3 repeats #define FLAG_MAX3 0x08000000 // limit to 3 repeats
#define FLAG_PAUSE1 0x10000000 // shorter prepause #define FLAG_PAUSE1 0x10000000 // shorter prepause
#define FLAG_TEXTMODE 0x20000000 // word translates to replacement text, not phonemes #define FLAG_TEXTMODE 0x20000000 // word translates to replacement text, not phonemes
#define FLAG_SUFFIX_REMOVED 0x2000 #define FLAG_SUFFIX_REMOVED 0x2000
#define FLAG_HYPHEN_AFTER 0x4000 #define FLAG_HYPHEN_AFTER 0x4000
#define FLAG_ORDINAL 0x8000 // passed to TranslateNumber() to indicate an ordinal number #define FLAG_ORDINAL 0x8000 // passed to TranslateNumber() to indicate an ordinal number
#define FLAG_HAS_DOT 0x10000 // dot after this word


#define FLAG_NO_TRACE 0x10000 // passed to TranslateRules() to suppress dictionary lookup printout
#define FLAG_NO_PREFIX 0x20000
#define FLAG_NO_TRACE 0x10000000 // passed to TranslateRules() to suppress dictionary lookup printout
#define FLAG_NO_PREFIX 0x20000000


// prefix/suffix flags (bits 8 to 14, bits 16 to 22) don't use 0x8000, 0x800000 // prefix/suffix flags (bits 8 to 14, bits 16 to 22) don't use 0x8000, 0x800000
#define SUFX_E 0x0100 // e may have been added #define SUFX_E 0x0100 // e may have been added
// bit 16 used to distinguish otherwise identical types // bit 16 used to distinguish otherwise identical types
// bit 20= punctuation character can be inside a word (Armenian) // bit 20= punctuation character can be inside a word (Armenian)
// bit 21= speak the name of the punctuation character // bit 21= speak the name of the punctuation character
// bit 22= dot after the last word
#define CLAUSE_BIT_SENTENCE 0x80000 #define CLAUSE_BIT_SENTENCE 0x80000
#define CLAUSE_BIT_CLAUSE 0x40000 #define CLAUSE_BIT_CLAUSE 0x40000
#define CLAUSE_BIT_VOICE 0x20000 #define CLAUSE_BIT_VOICE 0x20000
#define CLAUSE_BITS_INTONATION 0x7000 #define CLAUSE_BITS_INTONATION 0x7000
#define PUNCT_IN_WORD 0x100000 #define PUNCT_IN_WORD 0x100000
#define PUNCT_SAY_NAME 0x200000 #define PUNCT_SAY_NAME 0x200000
#define CLAUSE_DOT 0x400000


#define CLAUSE_NONE 0 + 0x04000 #define CLAUSE_NONE 0 + 0x04000
#define CLAUSE_PARAGRAPH 70 + 0x80000 #define CLAUSE_PARAGRAPH 70 + 0x80000


// used to mark words with the source[] buffer // used to mark words with the source[] buffer
typedef struct{ typedef struct{
unsigned int flags;
unsigned short start; unsigned short start;
unsigned short sourceix; unsigned short sourceix;
unsigned short flags;
unsigned char pre_pause; unsigned char pre_pause;
unsigned char wmark; unsigned char wmark;
unsigned char length; unsigned char length;






#define N_LOPTS 18
#define N_LOPTS 19
#define LOPT_DIERESES 1 #define LOPT_DIERESES 1
// 1=remove [:] from unstressed syllables, 2= remove from unstressed or non-penultimate syllables // 1=remove [:] from unstressed syllables, 2= remove from unstressed or non-penultimate syllables
// bit 4=0, if stress < 4, bit 4=1, if not the highest stress in the word // bit 4=0, if stress < 4, bit 4=1, if not the highest stress in the word
#define LOPT_IT_DOUBLING 14 #define LOPT_IT_DOUBLING 14


// Call ApplySpecialAttributes() if $alt or $alt2 is set for a word // Call ApplySpecialAttributes() if $alt or $alt2 is set for a word
// bit 1: stressed syllable: $alt change [e],[o] to [E],[O], $alt2 change [E],[O] to [e],[o]
#define LOPT_ALT 15 #define LOPT_ALT 15


// pause for bracket (default=4), pause when annoucing bracket names (default=2) // pause for bracket (default=4), pause when annoucing bracket names (default=2)
// bit 1, don't break clause before annoucning . ? ! // bit 1, don't break clause before annoucning . ? !
#define LOPT_ANNOUNCE_PUNCT 17 #define LOPT_ANNOUNCE_PUNCT 17


// set minimum length for long vowels at fast speeds, to keep a distinction with short vowels
#define LOPT_MIN_LONG_VOWEL 18



// stress_rule // stress_rule
#define STRESSPOSN_1L 0 // 1st syllable #define STRESSPOSN_1L 0 // 1st syllable
int vowel_pause; int vowel_pause;
int stress_rule; // 1=first syllable, 2=penultimate, 3=last int stress_rule; // 1=first syllable, 2=penultimate, 3=last


#define STRS_HYPEN_UNSTRESS 0x100000
#define S_NO_DIM 0x02
#define S_FINAL_DIM 0x04
#define S_FINAL_NO_2 0x10
#define S_NO_AUTO_2 0x20
#define S_2_TO_HEAVY 0x40
#define S_2_SYL_2 0x1000
#define S_INITIAL_2 0x2000
#define S_NO_AUTO_DIM 0x10000
#define S_HYPEN_UNSTRESS 0x100000
// bit0=don't stress monosyllables, except at end of clause // bit0=don't stress monosyllables, except at end of clause
// bit1=don't set diminished stress, // bit1=don't set diminished stress,
// bit2=mark unstressed final syllables as diminished // bit2=mark unstressed final syllables as diminished
// the two-letter rules for each letter must be consecutive in the language_rules source // the two-letter rules for each letter must be consecutive in the language_rules source
char *groups1[256]; // translation rule lists, index by single letter char *groups1[256]; // translation rule lists, index by single letter
char *groups3[128]; // index by offset letter
char *groups2[N_RULE_GROUP2]; // translation rule lists, indexed by two-letter pairs char *groups2[N_RULE_GROUP2]; // translation rule lists, indexed by two-letter pairs
unsigned int groups2_name[N_RULE_GROUP2]; // the two letter pairs for groups2[] unsigned int groups2_name[N_RULE_GROUP2]; // the two letter pairs for groups2[]
int n_groups2; // number of groups2[] entries used int n_groups2; // number of groups2[] entries used
int SetTranslator2(const char *name); int SetTranslator2(const char *name);
void DeleteTranslator(Translator *tr); void DeleteTranslator(Translator *tr);
int Lookup(Translator *tr, const char *word, char *ph_out); int Lookup(Translator *tr, const char *word, char *ph_out);
int LookupFlags(Translator *tr, const char *word);


int TranslateNumber(Translator *tr, char *word1, char *ph_out, unsigned int *flags, WORD_TAB *wtab); int TranslateNumber(Translator *tr, char *word1, char *ph_out, unsigned int *flags, WORD_TAB *wtab);
int TranslateRoman(Translator *tr, char *word, char *ph_out, WORD_TAB *wtab); int TranslateRoman(Translator *tr, char *word, char *ph_out, WORD_TAB *wtab);


void ChangeWordStress(Translator *tr, char *word, int new_stress); void ChangeWordStress(Translator *tr, char *word, int new_stress);
void SetSpellingStress(Translator *tr, char *phonemes, int control, int n_chars); void SetSpellingStress(Translator *tr, char *phonemes, int control, int n_chars);
int TranslateLetter(Translator *tr, char *letter, char *phonemes, int control, int word_length);
int TranslateLetter(Translator *tr, char *letter, char *phonemes, int control);
void LookupLetter(Translator *tr, unsigned int letter, int next_byte, char *ph_buf); void LookupLetter(Translator *tr, unsigned int letter, int next_byte, char *ph_buf);
void LookupAccentedLetter(Translator *tr, unsigned int letter, char *ph_buf); void LookupAccentedLetter(Translator *tr, unsigned int letter, char *ph_buf);



+ 4
- 3
src/voices.cpp View File

static MNEM_TAB options_tab[] = { static MNEM_TAB options_tab[] = {
{"reduce_t", LOPT_REDUCE_T}, {"reduce_t", LOPT_REDUCE_T},
{"bracket", LOPT_BRACKET_PAUSE}, {"bracket", LOPT_BRACKET_PAUSE},
{"fastLongVowel", LOPT_MIN_LONG_VOWEL},
{NULL, -1} }; {NULL, -1} };


static MNEM_TAB keyword_tab[] = { static MNEM_TAB keyword_tab[] = {


static int breath_widths[N_PEAKS] = {0,200,200,400,400,400,600,600,600}; static int breath_widths[N_PEAKS] = {0,200,200,400,400,400,600,600,600};


// default is: pitch 78,120
voice->pitch_base = 0x45000;
voice->pitch_range = 4536;
// default is: pitch 80,118
voice->pitch_base = 0x47000;
voice->pitch_range = 4104;
// default is: pitch 80,117 // default is: pitch 80,117
// voice->pitch_base = 0x47000; // voice->pitch_base = 0x47000;
// voice->pitch_range = 3996; // voice->pitch_range = 3996;

Loading…
Cancel
Save