Browse Source

[1.43.63]

Phoneme definitions.  Add "equivalents" table to translate phonemes from a foreign language (eg. English) into the equivalant phonemes of this language. This is used when *_rules and *_list files indicate that a word uses pronunciation rules from a different language.

Unpronouncable words can be recognised by rules in *_rule files.  This feature is now used for en, de, es.

Lang=ta, hi.  Letter-names for combining vowel characters are distinguished from stand-alone vowel characters by a preceding beep.


git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@251 d46cf337-b52f-0410-862d-fd96e6ae7743
master
jonsd 15 years ago
parent
commit
4423576af2
58 changed files with 1644 additions and 731 deletions
  1. 0
    1
      dictsource/ca_list
  2. 6
    3
      dictsource/da_list
  3. 50
    16
      dictsource/da_rules
  4. 48
    40
      dictsource/de_list
  5. 85
    19
      dictsource/de_rules
  6. 47
    36
      dictsource/dict_phonemes
  7. 7
    1
      dictsource/en_list
  8. 118
    30
      dictsource/en_rules
  9. 9
    10
      dictsource/es_list
  10. 33
    14
      dictsource/es_rules
  11. 86
    86
      dictsource/fr_list
  12. 182
    155
      dictsource/fr_rules
  13. 23
    0
      dictsource/hi_list
  14. 58
    12
      dictsource/hu_list
  15. 44
    14
      dictsource/hu_rules
  16. 0
    1
      dictsource/nl_list
  17. 0
    1
      dictsource/pap_list
  18. 15
    2
      dictsource/ta_list
  19. 12
    2
      dictsource/ta_rules
  20. 0
    1
      dictsource/tr_list
  21. 2
    1
      dictsource/tr_rules
  22. 39
    27
      phsource/compile_report
  23. 2
    1
      phsource/intonation
  24. 6
    1
      phsource/ph_afrikaans
  25. 1
    0
      phsource/ph_catalan
  26. 1
    8
      phsource/ph_croatian
  27. 5
    1
      phsource/ph_english
  28. 123
    29
      phsource/ph_french
  29. 79
    1
      phsource/ph_german
  30. 7
    0
      phsource/ph_hindi
  31. 2
    2
      phsource/ph_slovak
  32. 2
    0
      phsource/ph_swedish
  33. 8
    0
      phsource/ph_tamil
  34. 4
    1
      phsource/ph_turkish
  35. 6
    0
      phsource/phonemes
  36. BIN
      phsource/vdiph2/vowelchart.png
  37. BIN
      phsource/vowel/&
  38. 8
    8
      platforms/big_endian/espeak-phoneme-data.c
  39. 171
    27
      src/compiledata.cpp
  40. 12
    7
      src/compiledict.cpp
  41. 77
    128
      src/dictionary.cpp
  42. 2
    0
      src/espeakedit.cpp
  43. 72
    0
      src/extras.cpp
  44. 1
    0
      src/main.h
  45. 1
    0
      src/menus.cpp
  46. 16
    3
      src/numbers.cpp
  47. 2
    1
      src/phoneme.h
  48. 1
    1
      src/prosodydisplay.cpp
  49. 5
    9
      src/readclause.cpp
  50. 1
    1
      src/synth_mbrola.cpp
  51. 14
    11
      src/synthdata.cpp
  52. 5
    1
      src/synthesize.cpp
  53. 1
    0
      src/synthesize.h
  54. 17
    10
      src/tr_languages.cpp
  55. 114
    2
      src/translate.cpp
  56. 11
    4
      src/translate.h
  57. 1
    0
      src/voices.cpp
  58. 2
    2
      src/vowelchart.cpp

+ 0
- 1
dictsource/ca_list View File

@@ -109,7 +109,6 @@ _5C sins'Ents
_7C s,ets'Ents
_9C n,Ous'Ents
_0M1 m'il
_1M1 m'il // no '1' before thousand
_0M2 mil^'on@s
_dpt _koma
//_roman Rom'a

+ 6
- 3
dictsource/da_list View File

@@ -1,7 +1,7 @@
tv $abbrev

// PB = Peter Bjarkov - [email protected]

iv $abbrev

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

@@ -130,6 +130,8 @@ _0M4 bilij'o:n3

_0and 3
_dpt _k,Vm&:
_roman d%En


// PB a number followed by dot
// ordinals are followed by a dot in Danish
@@ -6156,7 +6158,7 @@ proceder $alt
producere $alt
profaner $alt
professionaliser $alt
profeter $alt
profetere $alt
profilere $alt
profiter $alt
prognosticer $alt
@@ -8563,6 +8565,7 @@ ovation $alt
ovulation $alt
oxidation $alt
participation $alt
pavillon $alt
passion $alt
pension $alt
perception $alt

+ 50
- 16
dictsource/da_rules View File

@@ -81,10 +81,11 @@
// PB general rule: [a] after k before m
k) a (m a // PB kam, kamp
c) a (mp & // PB camping
// PB kamm => [a]
k) a (mm a // PB kammerat
// PB amm => [a]
a (mm a // PB kammerat, amme
// PB kame => [&]
k) a (me & // PB kamel, kamera

// PB general rule: [&] after d
d) a (+ & // PB dame, dag
d) a (g@ a // PB dagbog
@@ -160,6 +161,7 @@
l) a (gt+ A // PB lagt
l) ag (_ &j // lag
f) ag (s au // PB fagsnak
l) ag (C au // PB flagstang, lagkage
// PB general rule: [A] before vn after consonant
C) a (vn A // favn, savn
// PB general rule: [a] after kl before consonant
@@ -486,6 +488,7 @@ amsterd) a (m 'a // PB
sp) ag (num Au // PB
r) ag (e+ Au // PB drage, rage
C) age (+ &:j@ // PB tage, bage, kage
g) age (+ &:S@ // PB
fl) ager (mus AuV // PB
C) ager (_+ &:jV // PB tager, bager, kager
l) agd (e &:j // PB lagde
@@ -625,6 +628,7 @@ _trienn) ale '&:l@
offi) ce (r se // PB sprogofficer
ce (rt s'E // PB koncert
c (i s
frederi) c (ia =ks // PB
c (k
ch (+ S // PB check, chokolade
mi) ch (a k S
@@ -803,7 +807,7 @@ stikor) d // PB exception - silent d in 'stikord'
dodge dVdZ // PB city
daiquiri d&k@ri // PB drink
_) duke dZu:k // PB Duke - name
_) drive dRAjv // PB drive-in
_) drive (- dRAjv // PB drive-in

.group é // added by PB
é 'e // idé, entré
@@ -815,6 +819,8 @@ stikor) d // PB exception - silent d in 'stikord'
&b) e (@ E, // PB hv'alrosbest,and
// PB general rules
l) e e
val) e (ncia 'E // PB
al) er V // PB maler
perl) e @ // PB
_dil) e (mma 'E // PB
ll) e (de // PB silent e - billede
@@ -851,6 +857,7 @@ stikor) d // PB exception - silent d in 'stikord'
rn) e (d+ e // PB derned
an) e (r @ // PB anerkende
L09) e (de E // nede, nederlag
mus) e (um 'E // PB stressed
mån) e (d @ // PB
L09) e (t e // metal
L09) e (l E // mellem
@@ -1062,6 +1069,7 @@ _sakram) e (nte 'e
_st) eg (_ e // steg - verb, problem with noun = "roast"
best) eg (_ 'e // PB besteg
best) eg (et_ 'e // PB besteget
st) eg (å @g // PB præstegård
n) egl ajl // PB negl
r) egel Ejl // PB regel
r) egl Ejl // PB regler
@@ -1176,6 +1184,7 @@ muskat) el ''El // PB
intellektu) el el // // PB
bestandd) el el // PB
halvd) el el // PB
evang) el el // PB evangelie
d) el (t+ el // PB tildelt
lob) el (ia 'el // PB
d) el (A+ el // PB dele, omdele
@@ -1186,6 +1195,7 @@ _offici) el (+ 'el // PB officiel
mod) el el // PB fotomodel
_mod) el 'el // PB modelbureau
u) el (+ 'el // aktuel, seksuel, visuel
u) el (t+ 'el // aktuelt, seksuelt, visuelt
gennemsku) el (ig =el
ur) el (_+ '&#l // konjunkturel
and) el el // andel
@@ -1303,7 +1313,7 @@ _præsid) en (t 'en // præsidentfrue
&b) en (+ en // PB koben, nøgleben
_åb) en (+ @n // PB åben
våb) en (+ @n // PB våben
C) en (sC @n // PB TEST - verdensmagt
// C) en (sC @n // PB TEST - verdensmagt
tj) en (st En // PB fortjenstmedalje
m) en (s+ En // PB menstruation
g) en (st en // PB genstand
@@ -1500,7 +1510,9 @@ L06L06) er V // PB klipper
_) er (_ &r // PB er
L09) er (ne_ V // PB kameraerne
juvel) er (en 'er // PB juveleren
juvel) er (er 'er // PB juvelerer
juvel) erer ''eV // PB juvelerer
_man) erer 'eV // PB
man) erer eV // PB
_l) er (_++ er // PB ler
v) er (r_ er // PB levere
th) er_ V // Luther
@@ -1537,7 +1549,7 @@ L06L06) er V // PB klipper
år) ede (_+ 3D@ // PB sårede
odr) ede (_+ 3D@ // PB fodrede
obr) ede (_ 3D@ // PB erobrede
tr) ede (_+ 3D@ // PB splintrede
tr) ede (_+ 3D-@ // PB splintrede
hundr) ed (+ @:D // PB hundred
rn) ed (e eD // PB dernede
&k) ede (+ eD@ // PB dødkede
@@ -1568,6 +1580,7 @@ _tromp) et 'et // PB stressed
_klarin) et 'et // PB
_servi) et 'et // PB
servi) et et // PB
_prof) et 'et // PB stressed
klarin) et et // PB
_plan) et 'et // PB
meg) et (+ et // PB not a suffix
@@ -1708,7 +1721,9 @@ _vinaigr) ette '&t@
al) geriet Sj3r'i@d // PB Algeriet
al) gerier Sj'iV // PB Algeriet
al) gerisk Sj'i:rsg
g (iro S // PB
guinea gin'e& // PB
gui (nnes ge // PB
ødi) g (t_ // nødigt
i) g (i g
g (entl j // PB egentlig
@@ -1721,6 +1736,7 @@ _vinaigr) ette '&t@
ble) g (ansigt j // PB blegansigt
ble) g (fi j
L08e) g j // PB steg, spegepølse
g (å++ g // PB præstegård
L08e) g (t g // PB stegt
æ) g (e j
æl) g (e j // PB sælge vælge
@@ -1825,7 +1841,8 @@ _vinaigr) ette '&t@
geneve Sen'E:v // PB
genève Sen'E:v // PB
_) gudskelov (_ gusg@lVu // PB
georgia dZV:dZj&
georgia dZV:dZj& // PB
gibraltar SibRalt'A // PB

.group ge

@@ -1890,6 +1907,7 @@ _korte) ge =Se
_l) ig (_ordentligt ek // PB
_l) ig (_godt ek // PB
_l) ig (_roligt ek // PB
pav) ill (o ilj // PB pavillon
færd) ig i // PB silent g
hurt) ig i // PB silent g
ig (hed i // PB vittighed
@@ -1977,6 +1995,7 @@ intell) ige (n ig'e // PB intelligent
sk) i (dt i // PB skidt
sk) i (mm e // PB skimmel
mask) i (n 'i // PB stressed - maskinskrive
par) i (s 'i // PB
h) i (d i // PB hidtil
b) i (lled e / PB billede
kr) i (dt i // PB skridt, kridt
@@ -2247,6 +2266,7 @@ _terap) i 'i
v) i (sne e // PB
l) i (e j
r) i (gt e // PB rigtigt
r) i (c e // PB Fredericia
l) ig (g+ e // PB ligge - only one g
s) i (e j
// t) i (e j
@@ -2365,6 +2385,7 @@ _sport) iv 'iw
spe) k (takl // silent k - spektakler
&) k k // after stressed vowel
_) kate (_ kEjt // PB name
karaoke k&r&'ouki // PB
// &) kk g

.group l // PB l changed to l/3 in ph_danish
@@ -2607,6 +2628,8 @@ subtrahe) nd nd
.group ng
ng (_ N // general rule - ting, ring
A) ng (e N // general rule - mange, penge
i) ngeni (ø nSin // PB ingeniør
eva) ng (el ng // PB evangelie
allo) ng (e NS // PB
_ri) ng (o ng // PB Ringo - name
hæ) ng N // PB hængning
@@ -2722,6 +2745,7 @@ mening) oko (k ok'V // PB meningokokker
hypok) o (nder 'V // PB
d) o (b V // PB dobbelt
d) o (nn V // PB donna
b) o (ls V // PB bolsje
h) o (ll V // PB Holland
_horis) o (n 'V // PB horisont
o (nt V // PB dont
@@ -3019,6 +3043,8 @@ dødvægtt) on Vn
kol) on Vn
kol) onn 'Vn // kolonne - only one n, stressed
kompagn) on VN
_pavill) on 'VN
pavill) on VN
orl) on Vn
_maked) on 'on // PB makedoner
perl) on Vn
@@ -3126,7 +3152,7 @@ _success) or =V
_f) or (a_ 'V // PB fora (plur. of 'forum')
_f) or (an_ 'V // PB foran
_f) or (ankørende 'V // PB forankørende
_f) or (annævnt'V // PB forannævnt
_f) or (annævnt 'V // PB forannævnt
_f) or (ansat 'V // PB foransat
_f) or (anstille 'V // PB foranstillet
_f) or (anstående 'V // PB foranstående
@@ -3472,6 +3498,7 @@ strabad) s s // PB not a suffix
ky) s s // PB not a suffix
anderlede) s s // PB not a suffix
interferen) s s // PB not a suffix
residen) s s // PB
tilpa) s s

s (p s
@@ -3505,6 +3532,7 @@ franci) sc (o sk // PB Francisco
sydney sidni // PB
shakespeare SEiksbi:r // PB
squash sgwVS // PB
shor (t SV // PB shorts
_) stone sdoun // PB namde - Stone
er_) sig (_til saj // PB avoid [si] - glæder sig [saj] til
et_) sig (_til saj // PB avoid [si] - glædet sig [saj] til
@@ -3741,6 +3769,7 @@ meningi) ti (s =ti

// PB final -tur in da_list - stressed u
&t) ur ($p_alt 'ur // struktur
_komf) ur 'ur // PB

// PB final -ut in da_list - stressed u
&) ut ($p_alt 'ut // rekrut
@@ -3991,7 +4020,8 @@ _molek) y (le 'y // PB stressed
f) yrre (t Y:V // PB fyrretræ
n) y (t Y // PB nyt
n) y (tt W // PB nytte, benytte
n) y (k W: // PB nyk
n) y (k_ W // PB nyk
n) y (ker W // PB nykker
kn) y (tt W: // PB tilknytte
kn) y (t y // PB knyt
k) y (s W // PB kys
@@ -4052,12 +4082,13 @@ _molek) y (le 'y // PB stressed
tr) æ (n &# // PB trænge
tr) æ (ne E // PB træne
dr) æ (n E // PB dræne
// kr) æ (f &# // PB kræfter
// kr) æ (m &# // PB skræmme, kræmmer
kr) æ (f &# // PB kræfter
kr) æ (m &# // PB skræmme, kræmmer
// r) æ (n &# // PB changed from [Aj] - rænke
// r) æ (k &# // PB række
// r) æ (t &# // PB åndedræt
r) æ (C &# // PB rædsel
r) æ (d &# // PB rædsel
æ (ld+ E // PB forældre
pr) æ (k E // PB præke
bl) ære EV // PB blærerøv
gr) æ (ken E // Grækenland
@@ -4065,9 +4096,13 @@ _molek) y (le 'y // PB stressed
br) æ (dd a // PB brædder
br) æ (t &# // PB bræt
dr) æ (gtig &# // PB nederdrægtig
r) æ (k &# // PB skrækkelig
br) æ (nd &# // PB brænde
pr) æ (st & // PB præst
tr) æ (t & // PB træt
tr) æ (f &# // PB træffe
tr) æ (k &# // PB trække
fr) æ (k &# // PB
gr) æ (n & // PB grænse
gr) æ (s &# // PB græs
gr) æ (d &# // PB græde
@@ -4104,6 +4139,7 @@ majest) æ (t 'E // PB stressed æ
øjer W#jV // PB bøjer
ø (jn W# // PB øjne
l) øg 'Vj // løgn, løg
gl) øgg Wg // PB gløgg
g) øg (l Vj // PB gøgler
l) ø (s W
C) ø (j W# // PB søjle, bøjle
@@ -4184,8 +4220,10 @@ uimodst) å (elig 'O // PB stressed
åre V3 // PB tåre
å (lti V // PB måltid


.group '
's (_S2 s
'en (_S3 @n
'er (_S3 %V
'erne (_S5 %Vn@
'ernes (_S6 %Vn@s
@@ -4196,7 +4234,3 @@ uimodst) å (elig 'O // PB stressed
$ dVlV // PB changed from [dVlar]
ñ _^_ES // PB mañana
ï i: // PB Thaïs
'er (_ %V // PB 60'er
'erne (_ %Vn@ // PB 60'erne
'ernes (_ %Vn@s // PB 60'ernes
'en (_S3 %@n // PB EMP'en - doesn't work

+ 48
- 40
dictsource/de_list View File

@@ -121,7 +121,6 @@ _8X '_axtsIC
_9X 'nOYntsIC
_0C 'hUnd3t
_0M1 'taUz@nt
_1M1 'taUz@nt // no '1' before thousand
_0M2 ||mIlI'o:n@n
_1M2 _'aIn@||mIlI'o:n
_0M3 ||mIlI'ard@n
@@ -611,33 +610,34 @@ hm h@m
horsam hO3zA:m
hostie $alt

illegitim Ile:gi:t'i:m
illiberal Ili:b@r'A:l
illoyal IlOajA:l
immobilie $alt
indem Ind'e:m
inden Ind'e:n
inder Ind3
indes Ind'Es
indessen Ind'Es@n
injurie $alt
inka INkA:
inkaisch INkA:IS
inkonstant $1
insbesondere $3
interess Int@r'Es
intern Int'Ern

januar janu:A:r

kamelie $alt
kanoe kan'u:
kastanie $alt
kid kId
komödie $alt
konservativ $1
konsul $1
kurie $alt
illegitim Ile:gi:t'i:m
illiberal Ili:b@r'A:l
illoyal IlOajA:l
immobilie $alt
indem Ind'e:m
inden Ind'e:n
inder Ind3
indes Ind'Es
indessen Ind'Es@n
injurie $alt
inka INkA:
inkaisch INkA:IS
inkonstant $1
insbesondere $3
interess Int@r'Es
intern Int'Ern

januar janu:A:r

kamelie $alt
kanoe kan'u:
kastanie $alt
kid kId
komödie $alt
konservativ $1
konsul $1
kurie $alt
kwaß kvas

lappalie $alt
lilie $alt
@@ -709,17 +709,12 @@ telegen te:le:g'e:n
the D@ // English
theater te:'A:t3
train tre:n
tsunami tsu:n'a:mi:
turin $2

umweg $1
unten Unt@n

wasserung vas@rUN // because -ung isn't marked as a suffix
weiterung vaIt@rUN
weither vaIth'Er
weitum vaIt_|'Um
woher vo:h'e:r

verein fEr'aIn
vielbesprochen $3
vielleicht $2
@@ -729,18 +724,31 @@ vorherig fo:rh'e:rIg#
vorig fo:rIg#

//wahrscheinlich $2
warum vA:r'Um
warum vA:r'Um
wasserung vas@rUN // because -ung isn't marked as a suffix
weiterung vaIt@rUN
weither vaIth'Er
weitum vaIt_|'Um
woher vo:h'e:r


zoom zu:m
zugegen tsu:g'e:g@n
zudem tsu:'de:m
zloty slOti:
zoom zu:m
zugegen tsu:g'e:g@n
zudem tsu:'de:m
zugegen tsu:g'e:g@n
zurück $2
zymbal $1
zurück $2
zymbal $1


// Names
Djakarta dZak'artA:
Djibouti dZib'u:ti:
Georg ge:Ork $only
George dZO:rdZ
Khmer kme:r
Mc m@-k
Neumexiko $2
Neuseeland $2
Rwanda rU'andA:
Sri sr,i:

+ 85
- 19
dictsource/de_rules View File

@@ -18,7 +18,8 @@
// * <http://www.gnu.org/licenses/>. *
// ***************************************************************************/

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

// This file is UTF-8 encoded

@@ -145,10 +146,11 @@

.group b
_) b (_ be:
_) b (L01A b // allow bl br at start of word
b b
b) b
b (_N p
b (L01 p
b (L02 p
b (sA b
bt (_N pt

@@ -197,6 +199,12 @@

.group c
_) c (_ se:
_) c (L01A k // allow cl cr at start of word
_) ch (L01A k
_) ch (a S
_) ch (A C
_) ch (o k

c k
c) c

@@ -212,7 +220,6 @@
e) chen (_ C@n
ü) chen (_ C@n

_) chr kr
chs ks (_
ck k

@@ -225,8 +232,6 @@
_) ch (if S
_) ch (il S
chip (_ tSIp // English
_) ch (ol k
_) ch (or k

bre) ch (en x
chro kro:
@@ -236,6 +241,7 @@
pla) c (ie ts
coat (_ _^_EN
_) code ko:t
_) computer(@P kOmpj'u:t3
_) cow _^_EN
crew _^_EN
cup _^_EN
@@ -243,10 +249,13 @@

.group d
_) d (_ de:
_) d (rA d // allow dr at start of word
_) d (schA d
_) d (shA d
d d
d) d
d (_N t
d (L01 t
d (L02 t
d (sA d
ds (_ ts
dt t
@@ -440,6 +449,8 @@
_) f (_ Ef
f f
f) f
_) f (L01A f // allow fl fr at start of word
_) f (jord f

_) faks (i f%akz
_) farb (C@P4 f'arp
@@ -459,12 +470,17 @@

.group g
_) g (_ ge:
_) g (L01A g // allow _gl _gr
g g
g (g
g (_N k
g (L01 k
g (L02 k
g (sA g
gd (_N kt
_) gh (A g
_) g (nA g@- // allow _gn
B) gn (A g@-n

i) gt (_ Ct
zei) gt (_ kt
gtet (_ kt@t
@@ -472,8 +488,6 @@

_) g (eHC g // hC, lC, mC, nC, rC

_) gn (A g@-n
B) gn (A g@-n

@) ght (_ _^_EN
graph grAf
@@ -580,7 +594,7 @@
i (dee %i:
i (erin =i:
&) ig (+ Ig# // [ig] or [iC]
igh aI
igh (K _^_EN

i (i i:_!

@@ -679,9 +693,13 @@ formal) ie =I@
_) j (_ jOt
j j


.group k
_) k (_ kA:
k k
_) k (L01A k // allow _kl _kr
_) k (ha k
_) k (nA k // allow _kn
k) k

// @) keit (_S4 kaIt
@@ -753,6 +771,7 @@ formal) ie =I@
_) mit (P3 m'It
mitt mIt
mitt (eil mItt
_) m (nem m // allow _mnem
_) mo (rb m%O
_) mono (@ m,o:no:
_) motor m%o:to:r
@@ -829,6 +848,7 @@ formal) ie =I@
z) oo (m u:
&t) or (_ =o:r
&) oren (_ 'o:r@n
_) orts (@P4 'Orts
oso (_ 'o:zo:
st) o (ss o:
oy (K OY
@@ -838,9 +858,17 @@ formal) ie =I@
.group p
_) p (_ pe:
p p
p) p
pf pF
p) p
_) p (L01A p // allow _pl _pr
_) pf (A pF
_) pf (L01A pF // allow _pfl _pfr
_) ph (A f // allow _ph
_) ph (L01A f // allow _phl _phr
_) phth (A ft
ph f
_) p (neu p // allow _pneu
_) p (sA p // allow _ps
_) p (tol p

pake (t p%ake:
_) para (@ p,ara
@@ -857,6 +885,7 @@ formal) ie =I@
po (et p%o:
poesie po:e:z'i:
_) poly (@P4 p,o:ly:
_) polygon (@P7 po:ly:g'o:n
partei p%artaI
_) perfe (k p%ErfE
_) polik p'o:li:k
@@ -884,7 +913,7 @@ formal) ie =I@
r (r
b) r @-*
_) r r
_) rh r
_) rh (A r // allow _rh

rangier rA:NZ'i:r
_) re (d re:
@@ -901,15 +930,39 @@ formal) ie =I@
ss s
sst (@ sSt

_) s (cA s // allow _sc
_) s (cr s // allow _scr
_) sch (A S
_) sch (L01A S
_) sch (mA S
_) sch (nA S
_) sch (w S
_) sh (A S
_) sh (rA S
_) s (kA s // allow _sk
_) s (kL01A s // allow _skl _skr
_) s (lA s
_) s (mA s
_) s (nA s
_) s (pA S
_) s (phA s
_) s (plA S
_) s (plend s
_) s (prA S
_) s (quA s
_) s (tA S
_) s (trA S
_) s (ve s
_) s (wA s
_) s (zA s

sch S
_) sh S
sh (K S
sou (nd saU
p) s (a s
p) s (i s
t) s (i s
k) s (i s
_) sp Sp
_be) sp Sp
_ge) sp Sp
_ver) sp Sp
@@ -925,7 +978,6 @@ formal) ie =I@
&C) ster (_S4 st3
&C) stes (_S4 st@s

_) st St
_be) st St
_ge) st St
_ver) st St
@@ -970,9 +1022,15 @@ formal) ie =I@
.group t
_) t (_ te:
t t
t) t
t) t
_) th (A t // allow _th
_) th (rA t // allow _thr
th (K t
K) th t
_) t (rA t // allow _tr
_) tsch (A tS
_) t (setse t
_) tw (A tw
tz ts

&t) te (_ @
@@ -1005,7 +1063,6 @@ formal) ie =I@

_) talent tal'Ent
tch tS
_) tsch tS
t (chen_ t
_) teen _^_EN
_) tele (@ t,e:le:
@@ -1094,6 +1151,10 @@ formal) ie =I@
v) v
v (_N f

_) v (lad v
_) v (lies f
_) v (ri f

_) vie fi:
_) vi (CC vI
_) vi vi:
@@ -1147,6 +1208,9 @@ formal) ie =I@
.group w
_) w (_ ve:
w v
_) wh (A v
_) w (lad v
_) w (rA v

@) wert (_ vErt
_) wh _^_EN
@@ -1182,7 +1246,9 @@ formal) ie =I@
.group z
_) z (_ tsEt
z ts
z) z
z) z
_) z (den z
_) z (wA ts // allow _zw

_) zentral (@P7 tsEntr'A:l
_) zentral (i tsEntral

+ 47
- 36
dictsource/dict_phonemes View File

@@ -15,7 +15,7 @@ n N n^ p r s S t
T tS v w x x2 z Z


Dictionary ca_dict 2010-05-12
Dictionary ca_dict 2010-07-27

@ a a# aI e E E2 i
o O u U
@@ -53,7 +53,7 @@ p r s S t T v w
x z


Dictionary da_dict 2010-07-03
Dictionary da_dict 2010-07-29

& &# 0 3 @ @- a A
e E i o O u V W
@@ -65,7 +65,7 @@ l/2 l/3 m n N p r R
s S t T tS v w z


Dictionary hu_dict 2010-07-17
Dictionary hu_dict 2010-08-02

A a: E e: i i: o o:
u u: Y y y: Y:
@@ -76,7 +76,7 @@ n^ p r R R2 s S s2
t tS ts v z Z


Dictionary de_dict 2010-07-03
Dictionary de_dict 2010-07-27

3 3: @ @- a A A: aI
aU E E2 E: e: EI i I
@@ -100,7 +100,7 @@ n^ p Q r R s s; t
T ts v x z z;


Dictionary en_dict 2010-07-13
Dictionary en_dict 2010-07-30

0 3 3: @ @- @2 @5 @L
a a# A: A@ aa aI aI@ aU
@@ -110,10 +110,10 @@ O@ o@ OI oU O~ U u: U@
V VR

: ; ? b C d D dZ
f g g- h j k l l#
m n N n^ p Q r r-
s S t T t2 tS v w
x z Z
f g h j k l l# m
n N n^ p Q r r- s
S t T t2 tS v w x
z Z


Dictionary eo_dict 2010-05-19
@@ -127,7 +127,7 @@ s S t T tS ts v w
x z Z


Dictionary es_dict 2010-07-13
Dictionary es_dict 2010-07-28

a aI aU e E eI eU i
o O oI u
@@ -150,16 +150,16 @@ l m n N p r s S
s2 t v w Z


Dictionary fr_dict 2010-07-18
Dictionary fr_dict 2010-07-30

@ @- a A~ e E E2 E:
E~ i I o O o3 O~ u
u: w W W~ y Y
@ @- a A~ e E E: E~
i I o O O~ u u: w
W W~ y Y

- : b d dZ f g h
j k l m n N n2 n^
p p2 r r2 s S t t2
t3 tS v z Z z2 z3
: b d dZ f g h j
k l m n N n2 n^ p
p2 r r2 s S t t2 t3
tS v z Z z2 z3


Dictionary grc_dict 2008-03-03
@@ -185,32 +185,32 @@ N n^ p r R R2 s S
t tS ts tS; v x z Z


Dictionary hi_dict 2009-11-24
Dictionary hi_dict 2010-07-30

@ @- @2 @3 a a: aI aU
e E e: E: E~ i I i:
l- o O o: O: O~ o~ r-
U u: u~ V

- : b bh c ch d d.
dh dh. f g gh h H j
J Jh k kh l l. m n
N n. n^ p ph Q q r
r. s S s. t T t. th
th. v w x z
#X1 #X2 - : b bh c ch
d d. dh dh. f g gh h
H j J Jh k kh l l.
m n N n. n^ p ph Q
q r r. s S s. t T
t. th th. v w x z


Dictionary ta_dict 2010-07-18
Dictionary ta_dict 2010-07-30

a a: aI aU e E e: i
I i: o o: u U u: U:
V V#
I i: o o: u U u2 u:
U: V V#

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


Dictionary hy_dict 2008-12-22
@@ -325,7 +325,7 @@ k l m n p R s S
t tS v w x


Dictionary nl_dict 2010-07-18
Dictionary nl_dict 2010-07-27

8 @ @- A a: A~ E e:
EI eU i I O O: o: u
@@ -349,7 +349,7 @@ k l m n N p r R
s S s; t v w x z


Dictionary pap_dict 2009-05-02
Dictionary pap_dict 2010-07-27

a a/ aI e E eI i o
O u y Y
@@ -474,7 +474,7 @@ p R R^ s S t tS ts
v w x z Z


Dictionary tr_dict 2010-06-02
Dictionary tr_dict 2010-07-27

@ a e E i I o O
u U W y Y
@@ -636,3 +636,14 @@ O~ u w y
; b d f g j k l
m n N p r s S t
tS v z Z


Dictionary az_dict 2010-07-27

& @ a e E i o u
W y

* b c C d dZ f g
h j J k l m n p
Q R s S t tS v w
x z Z

+ 7
- 1
dictsource/en_list View File

@@ -1132,7 +1132,6 @@ finite faInaIt
fishnet fISnEt
fiord fi:O@d
fix fIks // for fixer
fjord fIO@d
flagellum fla#dZEl@m
flamenco fla#mENkoU
flexible flEksIb@L
@@ -2447,6 +2446,7 @@ Durham dVr@m
Egyptian IdZ'IpS@n
Eire e@r@
Geneva dZ@ni:v@
Gdansk g@-dansk
Gomera goUm'e@r@
Harare ha#rA:rI
Hanoi han'OI
@@ -2481,6 +2481,7 @@ Lesotho l@s'u:tu:
Liberia laIb'i@ri:@
Lima li:ma#
Luxembourg lVks@mb3:g
Lvov l@-v0v
?5 Luxembourg lVks@mbVRg
Madagascar mad@g'ask3
Madras m@draas
@@ -2536,6 +2537,7 @@ Qatar katA@
Quebec kwI2bEk
Raleigh rA:lI
Reno ri:noU
Rio ri:oU
Sahel sA:h'El
Saigon saIg'0n
Santiago santI'A:goU
@@ -2556,6 +2558,7 @@ Taiwan taI'wan
(tel aviv) t,El||a#v'i:v
Tenerife tEn3r'i:f
Texas tEks@s
Tblisi t@-bli:si
Toronto t@r0ntoU
Timor ti:mo@
Tokyo toUkIoU
@@ -2611,6 +2614,7 @@ Bambi bambi:
Barack ba#rA:k
Barbara bA@b@r@
Betsy bEtsI
Bjorn bjO@n
Boris b0rIs
Brien braI@n
Candace kandIs
@@ -2638,11 +2642,13 @@ Declan dEkla#n
Denise d@ni:s
Derek dErIk
Dinah daIn@
Dmitri d@mi:tri
Dominic d0mI2nIk
Donaghy d0n'hi:
Doris d0rIs
Dorothy dO@r@Ti
Dougall du:g@L
Dvina d@vi:n@
Dylan dIl@n
Edith i:dIT
Elise I2li:z

+ 118
- 30
dictsource/en_rules View File

@@ -28,6 +28,8 @@
// ?7 Scottish
// ?8 Use full vowel, not schwa in some word endings


// Group Y, vowels + y
.L01 l r
.L02 i y
.L03 a i o u // vowel, not 'e'
@@ -76,7 +78,6 @@
aar 'A@
w) a (b 0
r) a (ciA eI
_r) a (cis eI
w) a (d 0
ow) a (d @
ae i:
@@ -230,8 +231,8 @@
&) able (_S4iev @b@L // suffix
&c) able (_ @b@L
@ct) able (_ =@b@L
&) ability (S7iev @b'IlI2t%I // suffix
&) abilities (S9iev @b'IlI2t%Iz // suffix
&) ability (S7iev @b'IlI2t%i // suffix
&) abilities (S9iev @b'IlI2t%iz // suffix
&) ably (_S4iefv @bl%I
&c) ably (_S4fv @bl%I

@@ -252,7 +253,10 @@
accu (ra akjU
accus (A a#kju:z
ace (_ eIs
sp) ac (e eIs
_r) ac (e eIs
_) ac (e a#s
_r) ac (is eIs
acean (_ 'eIS@n
pl) ac (at a#k
pl) ac (eb @s
@@ -277,7 +281,7 @@
achia 'eIS@
f) ac (ilit @s
_m) ace (d asI
m) achi (n# @Si:
m) achi (nA# @Si:
m) achina (t aSI2neI
ach (rom ak
ac (id_ as
@@ -312,6 +316,7 @@
_b) ac (o eIk
y) ach (t 0
&) ac (y_ @s
cr) ac (y_ =@s

.group ad
_) ad (@ a#d
@@ -979,7 +984,7 @@
purch) as (e Is
ph) ase (_ eIz
r) ase (_ eIz
&) asey (_ @s%I
&) asey (_ @s%i
b) as (i eIs
b) as (il az
as (sist a#
@@ -992,7 +997,7 @@
nt) as (t as
as (ive 'eIs
as (ymp as
&) asy (_ @s%I
&) asy (_ @s%i
w) ast (e# eIst

.group at
@@ -1131,6 +1136,10 @@

.group b
b b
_) bh b
_) b (L01Y b // allow _bl _br
_) brz (e brz

b (b
m) b (_
_) bally (@ b,alI2
@@ -1233,6 +1242,10 @@

.group c
c k
_) c (L01Y k // allow _cl _cr
_) cz (ar ts
_) cz (e tS

cc k
ck k
c (e s
@@ -1272,6 +1285,9 @@
czech tSEk

.group ch
_) ch (Y tS
_) ch (L01Y k

ch tS
ch (r k
chry (sa krI
@@ -1469,6 +1485,11 @@

.group d
d d
_) d (L01Y d // allow _dl _dr
_) dj (Y dZ
_) d (nie d
_) d (wY d // allow _dw

d (d
_) d' (AP2 d
@@e) d (_S1 d // suffix
@@ -1698,7 +1719,7 @@
econo (m Ik'0n@
econo (mic i:k@n'0
_) eco (s i:koU
&) ecy (_ @s%I
&) ecy (_ @s%i
ee i:
coff) ee I
ee (m 'i:
@@ -2028,7 +2049,7 @@
_) encha (n %EntSaa
enclav EnkleIv
en (core 0n
&) ency (_ @ns%I
&) ency (_ @ns%i
ency (cli %EnsI
en (dA_ 'En
_) en (d En
@@ -2432,6 +2453,9 @@

.group f
f f
_) f (L01Y f // allow _fl _fr
_) fj (ord fI'

f (f
fa (ciA feI
fa (miliar f@
@@ -2445,6 +2469,11 @@

.group g
g g
_) g (L01Y g
_) gh (Y g
_) g (nY
_) g (wA g

gg g
g (e dZ
_) gaol dZeIl
@@ -2458,10 +2487,8 @@
g (ilC g
l) ging dZI2N
g (y dZ
_) g (n
exa) gg (er dZ
ght t
_) gh g
gh (_ g
C) gh (A g
gh (C g
@@ -2721,6 +2748,7 @@

.group ie
ie I
X) ie i:
ie (_ aI
ied (_S2i d // suffix
ieds (_S3i dz
@@ -2741,7 +2769,7 @@
ie (k i:
ie (l i:
ie (llA I2'E
n) iel (_ I2@L
&n) iel (_ I2@L
&r) iel (_ =i:@L
ie (n i@
d) iene (_ 'aIi:n
@@ -2787,6 +2815,7 @@
ie (ve i:
s) ie (ve I
ie (z i:
_t) ie aI

.group ig
am) ig (a_ i:g
@@ -2860,19 +2889,19 @@
.group in
@) ing (_+S3dve IN
@) ings (_S4dve INz
@) ingly (_S5dve INg-lI
@) ingment (_S7dve INg-m@nt
@) ingly (_S5dve INlI
@) ingment (_S7dve INm@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
en) ingly (_S5vf INgI
er) ing (_S3v IN
er) ings (_S4v INz
er) ingly (_S5vf INg-lI
er) ingment (_S7v INg-m@nt
er) ingly (_S5vf INlI
er) ingment (_S7v INm@nt
Br) ing (_ IN

?7 &) in (_ @n
@@ -3160,13 +3189,13 @@
_) it' %It
_m) it (o aIt
it (o_ 'i:t
_C) ity (_ ItI
_C) ity (_ Iti
_ed) it It
cred) it It
CAt) it (_ 'i:t //apetite
v) it (al aIt
t) it (l aIt
&) ity (_ =I2t%I
&) ity (_ =I2t%i
orb) it It
@@) it (an_ =It
?3 &) itary (_ @tEr%I // military
@@ -3251,7 +3280,10 @@
.group k
k k
k (k
_) kn n
_) k (L01Y k
_) k (hY k
_) k (wY k
_) kn (Y n
kn (if n
kn (iv n
kn (it n
@@ -3269,6 +3301,10 @@
.group l
l l
l (l
_) l (hY l
_) ll (Y l
_) l (ju l

l (_ l
A') ll l
A) ll l
@@ -3333,9 +3369,11 @@
?8 @) lessly (_S6i lEsl%I
?8 @) lessness (_S8i lEsnEs


.group m
m m
mm m
_) mn (e n
h) m (_ @m
B) m (_ @m
l) m (_ m
@@ -3361,7 +3399,6 @@
_) mc (A mak
_) mc (-A mak
mn (_ m
_) mn n
&B) me (_ m%I
@) men (_ mEn
&) ment (_S4 m@nt
@@ -3422,6 +3459,8 @@
.group n
n n
n) n
_) n (gY+ @-N

&ia) n (_S1 n
&ia) ns (_S2 nz
@) name (_S4 neIm
@@ -4111,7 +4150,7 @@
&dr) ous (_ =@s
&l) ous (_ @s
&) ous (_ @s
&) ousy (_ @s%I
&) ousy (_ @s%i
&m) ous (_ @s
&n) ous (_ @s
_) out (@P3 %aUt // prefix out
@@ -4226,6 +4265,14 @@
.group p
p p
p (p
_) p (L01Y p // allow _pl _pr
_) pf (Y f
_) ph (Y f
_) ph (L01Y f
_) pn (eu n
_) ps (Y s
_) pt (Y t

ph f
phenome (n fI2n0mI
phenyl f,i:naIl
@@ -4252,12 +4299,10 @@
poly (@@ p,0lI
poly (@ p0lI
pota (t p@teI
_) ps s
pseudo su:doU
psych saIk
psycho saIkoU
psycho (lo saIk'0
_) pt t
ei) pt t
ras) p (b
_) pur (su p3
@@ -4388,7 +4433,6 @@
pro (log proU

.group q
_) q (B kju:
q k
q (q
qu kw
@@ -4413,13 +4457,15 @@
.group r
r r
rr r
_) rh (Y r
_) rw (a r%U

r) r (_
C) r (_N r@
e) r (_ 3
@) r (B @
3_) rd (_
rEr (_ r3
_) rh r
C) rh r
rheu ru:
rhi (n raI
@@ -4433,7 +4479,6 @@
_) ru (bL01 ru:
_) run (a rVn
_) run (o rVn
_) rw r%U
&ant) ry (_S2 r%I

.group re
@@ -4541,7 +4586,29 @@
s s
s (s
s (sh s

_) s (cY s
_) s (cL01Y s
_) sch S
_) sh (Y S
_) sh (L01Y S
_) s (kY s
_) s (kL01Y s
_) s (lY s
_) s (mY s
_) s (nY s
_) s (pY s
_) s (phY s
_) s (pL01Y s
_) s (qu s
_) s (ri s
_) s (tY s
_) s (trY s
_) s (va s
_) s (ve s
_) s (wY s
_) s (zY s

sche (m ski:
_) sch (ism sk
_) schiz skIts
@@ -4721,6 +4788,14 @@
.group t
t t
t) t
_) th (Y T
_) th (rY T
_) th (wY T
_) t (rY t
_) t (sY t
_) t (wY t
_) tz (ar ts

tch tS
_) tele tElI2
r) tga (g gI
@@ -4901,6 +4976,7 @@
?8 &f) ully (_ Vl%I
&) u (lous_ =jU
b) ul (r Ul
&ic) ul (t @L
_) ultra (@ ,Ultra
u (lul V
@) u (lum =jU
@@ -4972,7 +5048,7 @@
g) ui (lC I
_g) ui (le aI
@) ui (ty 'ju:I
g) ui (dA aI
g) ui (dA# aI
g) uide (l aId
beg) ui (l aI
_g) ui (n I
@@ -5098,6 +5174,7 @@
.group v
v v
v (v
_) v (la v

@) va (len veI
_) vehem vi@m
@@ -5108,6 +5185,9 @@
.group w
w w
w (w
_) wh (Y w
_) wr (Y r

C) w (_ w@
wh w
wr r
@@ -5140,14 +5220,14 @@
As) w (ick

.group x
_) x (C Eks
x ks
x) x (A
_) xy zaI
_) x z
_) x (Y z
xio (n kS@
xious =kS@s
xu (a =kSu:
xure (_ kS%U@

.group y
y j
@@ -5164,6 +5244,8 @@
y (Be# aI
@C) y (Be# aI
ye (_ aI
y (ear j
%B) y (_NS1d i
%B) y (_S1d I
_C) y (Ce aI
C) y (i I
@@ -5201,10 +5283,11 @@
d) yse (n Is@
f) y (_ aI
ff) y (_ I
&sk) y (_ =I
&sk) y (_ =i
den) y (_ aI
bel) y (_ aI
&) y (_ %I
&) y (_N %i
y (_ aI
y (Cic_ 'I
y (Cical 'I
@@ -5257,6 +5340,11 @@
.group z
z z
z (z
_) zh (Y Z
_) z (lot z
_) zs (Y z
_) z (wY z

@) zales (_ z'A:lEs
zes (_ zI2z
zh Z

+ 9
- 10
dictsource/es_list View File

@@ -106,7 +106,6 @@ _5C kinj'EntOs
_7C s,eteTj'EntOs
_9C n,OBeTj'EntOs
_0M1 m'il
_1M1 m'il // no '1' before thousand
_0M2 miJ^'ones
_1M2 'unmiJ^'On
_0M4 _biJ^'onEs
@@ -358,23 +357,23 @@ alguna $u
b be
c Te
d de
f Efe
f _|Efe
g xe
h atSe
j xOta
k ka
l Ele
m Eme
n Ene
ñ En^e
l _|Ele
m _|Eme
n _|Ene
ñ _|En^e
p pe
q ku
r E**e
s Ese
r _|E**e
s _|Ese
t te
v uBe
v _|uBe
w ,uBe||d'OBle
x Ekis
x _|Ekis
z TEta

_a a

+ 33
- 14
dictsource/es_rules View File

@@ -5,11 +5,12 @@
// ?1 Castilian
// ?2 Latin America

.L01 j w l r b d g n m p t k c
.L01 l r y
.L02 b d g n m // change [s] to [z] before these
.L03 f h j s y z // allow [B] [D] [Q] before these consonants
.L03 f h j s y z r // allow [B] [D] [Q] before these consonants
.L04 b v f p // labials, nasals are [m]
.L05 g k // velars, nasals are [N]
.L06 j w l r b d g n m p t k c

.group a
a a
@@ -22,7 +23,8 @@

.group b
b b
_) b b // phoneme definition may change it to [B]
_) b ($unpr b // phoneme definition may change it to [B]
_) b (L01A b // Only bl, br are allowed at start of word
b (A B
b (cY B
b (L03 B
@@ -33,13 +35,17 @@

.group c
c k
_) c (L01A k // allow: cl cr at start of word
_) ch (A tS // allow _ch

c (Y T // ce, ci
ch tS


.group d
d d
_) d d // phoneme definition may change it to [D]
_) d ($unpr d // phoneme definition may change it to [D]
_) d (rA d
d (A D
d (cY D
d (L03 D
@@ -64,11 +70,15 @@

.group f
f f
_) f (L01A f // allow fl fr at start of word


.group g
g g
_) g g // phoneme definition may change it to [Q]
_) g ($unpr g // phoneme definition may change it to [Q]
_) g (L01A g
_) gh (A g // allow _gh in foreign words
_) gn (A n
g (A Q
g (cY Q
g (L03 Q
@@ -95,10 +105,12 @@

.group k
k k
_) k (L01A k // allow kl kr at start of word


.group l
l l
_) ll (A J^ // allowe _ll
ll J^
?2 A) ll (A j:

@@ -106,6 +118,8 @@

.group m
m m
_) mn (em n

m (K n
m (L04 m
m (_L04 m
@@ -136,11 +150,14 @@

.group p
p p
_) p (L01A p // allow pl pr at start of word
p (t p:
_) ph f
ph (K f
_) ps (ico s
_) ps (i s
_) ps (eudo s
_) pt (ero t
_) pt (ol t


.group q
@@ -150,7 +167,6 @@

.group r
r R
_) r RR2
r (_ *
r (t **
A) r (A **
@@ -165,13 +181,15 @@
.group s
s s
&) s (_S1 s
_) s (C Es
_) sh S
_) s (C %Es
_) sh (A S
_) sh (L01A S
sh (K S


.group t
t t
_) t (L01A t // all tr at start of word
_) th T
th (K T

@@ -188,15 +206,15 @@

.group v
v B
_) v b
_) v (L01A b // allow vl vr at start of word
?1 m) v b
?1 n) v b
?1 v (L01 b
?1 v (L06 b
?1 v (iA b
?1 v (uA b
?2 v v#
?2 _) v v
?2 v (L01 v
?2 v (L06 v
?2 v (j v
?2 v (iA v
?2 v (uA v
@@ -204,18 +222,19 @@

.group w
w w
_) wh (A w


.group x
x ks
?1 A) x (A Qs
x (_ =Qs
_) x z // ?
_) x ($unpr z // ?


.group y
y i
_) y J
_) y ($unpr J
_m) y J
n) y J
_l) y J

+ 86
- 86
dictsource/fr_list View File

@@ -24,7 +24,7 @@

// 2006-11-18 Gilles Casse <[email protected]>
//
// Updated 2010-07-16 Michel Such <[email protected]>
// Updated 2010-07-25 Michel Such <[email protected]>
//
// * Numbers, a few abbreviations and exceptions.
//
@@ -83,8 +83,8 @@ z zEd

// accent names
_lig ligat'yr
_acu aksA~tE2g'y
_ac2 dublaksA~tE2g'y
_acu aksA~tEg'y
_ac2 dublaksA~tEg'y
_brv br'Ev
_ced sed'ij
_cir aksA~sirkO~fl'Eks
@@ -104,29 +104,29 @@ _cap maZysk'yl
_?A l'Etr
_?? sE~b'oll
_#9 tabylasiO~
_#32 E2spas
_#32 Espas


_" gijmE2
_" gijmE
_# djEz
_' apostr'Of

_( parA~tEz_goS
_) parA~tEz_drwat
_, virgyl
_- tirE2
_- tirE
_. _|pw%E~
_/ barOblik
_/ baroblik
_: d'Y||pw'E~
_; pwE~||virg'yl
_< E~feriWr
_= egal
_> syperiWr
_? pwE~||dE~tE2rogasj'O~
_? pwE~||dE~tErogasj'O~
_! pwE~||dEksklamasj'O~
_[ krOSE2_goS
_\ barOblik_E~vErse
_] krOSE2_drwa
_[ krOSE_goS
_\ bakslaS
_] krOSE_drwa
_^ sirkO~flEks
__ sulin^e
_` aks'A~_gr'av
@@ -134,8 +134,8 @@ _{ akOlad_goS
_| bar_vErtik'al
_} akOlad_drwat
² pyis'A~s||d'Y
_« uvre||gijm'E2
_» fErme||gijm'E2
_« uvre||gijm'E
_» fErme||gijm'E
_’ apostr'Of
_‘ apostr'Of
_µ mikr'o
@@ -174,7 +174,7 @@ _5 sE~k
_6 siz3
_7 sEt
_8 _|yit3
_9 nYf
_9 nWf
_10 diz3
_11 _|O~z
_12 duz
@@ -184,7 +184,7 @@ _15 kE~z
_16 sEz
_17 disEt
_18 dizyit3
_19 diznYf
_19 diznWf
_20 vE~t2
_21 vE~te:W~
_22 vE~tdYz2
@@ -194,7 +194,7 @@ _25 vE~tsE~k
_26 vE~tsiz3
_27 vE~tsEt
_28 vE~tyit3
_29 vE~tnYf
_29 vE~tnWf
_3X trA~t
_31 trA~te:W~
_4X karA~t
@@ -251,17 +251,18 @@ cci $abbrev
cia $abbrev
cio $abbrev
cm centimètre $text
collins kOlins
collins _^_en
cpu $abbrev
ctrl _::kO~trOl
dept depart@mA~
dept département $text
divx diviks
ebay _^_en
(e bay) ebay $text
ebcdic @besedik
edf @d,eEf
eml @,EmEl
etc E2tsetera
etc Etsetera
fyi fWr||jWr||InfWrm'EjSWn
ghz ZigaErts
(g hz) ZigaErts
hmm hWm
@@ -271,14 +272,13 @@ ibm ib,e'Em
ide $abbrev
ip ipe
irc I,Er_|se
jaws dZo3:z
kbit kilobit
kde $abbrev
kg kilogramme $text
khz kiloErts
km kilomètre $text
(km player) ka,EmplE2j'Wr
(kmplayer) ka,EmplE2j'Wr
(km player) ka,EmplEj'Wr
(kmplayer) ka,EmplEj'Wr
kw kilowatt $text
m. m@siY
mbit megabit
@@ -314,12 +314,12 @@ sap $abbrev
scsi $abbrev
solaris solaris
sos $abbrev
s.t.p silt@:pl'E2
s.v.p silvu:pl'E2
s.t.p silt@:pl'E
s.v.p silvu:pl'E
st s'E~t2
ste s'E~t
stp silt@:pl'E2
svp silvu:pl'E2
stp silt@:pl'E
svp silvu:pl'E
tva $abbrev
uk $abbrev
ups ypeEs
@@ -331,7 +331,6 @@ u.s y:Es
virgin virZin
vip v,i||,aj||p'i
(web visum) webvisum $text
windows windo3z
wma $abbrev
xfce iksEfse@
xy $abbrev
@@ -421,10 +420,11 @@ lui $u+ $verbf

ca sa $u+ $capital $verbf
ce $u+ $nounf
ceux $u+
celle $u+
celles $u+
ceci $u+ $verbf
cela $u+ $verbf
voici $u+
voilà $u+
cet $u $nounf
cette $u $nounf
ces sez2 $u $nounf
@@ -435,6 +435,8 @@ ces sez2 $u $nounf
(celles ci) sEl||si $verbf $u+
(celles là) sEl||la $verbf $u+
plupart $u+
voici $u+
voilà $u+

// possessives
ma $u $nounf
@@ -527,8 +529,8 @@ pourtant $u+

// auxillary verbs (be, have, can, etc)
suis $u+ $verb
es E2z2 $u+
est E2t2 $u+
es Ez2 $u+
est Et2 $u+
sommes $u+ $verb
êtes $u+ $verb
sont $u+ $verb
@@ -544,7 +546,7 @@ sois $u+ $verb
soit $u+

ai $u+ $verb
(ai je) E2Z $u+
(ai je) EZ $u+
as as
as az2 $u+ $verb
(as tu) aty
@@ -642,7 +644,6 @@ albinos albinos
alleluia alelui'a
alterego altErego
anis anis
any Eni $u
armageddon armagedO~
auvent ovA~
beta beta
@@ -653,7 +654,7 @@ blues _^_en
blum blum
broglie breuil $text
browglie breuil $text
buffer bYfYr
buffer bYfWr
bus bys
bus by $verb
cancer kA~sEr
@@ -673,11 +674,12 @@ dot dOt
enfer A~fEr
fahrenheit far@najt
faut fot2 $u+
feldspath fEldspat
fier fjer $verb
for $u+
francis frA~sis
fred frEd
free frI:
free _^_en
fuel fjul
gangster gA~gstEr
gars ga
@@ -685,20 +687,20 @@ genesis Zenezis
georges ZOrZ
gilles Zil
gin dZin
gulf gWlf
gulf gOlf
gus gys
gym Zim
han _|A~
hélas elas $u+
jacques Zak
karaoke karaOke
karaoke karaoke
kevin kevin
laetitia letisja
laser lazEr
listbox listbOks
louis lwi
malus malys
mai mE2
mailto mEjltu_
mai mE
mapper _^_en
mars mars
mas mas
@@ -712,32 +714,31 @@ mrs _^_en
oasis oazis
ours urs
pataquès patakEs
patchwork patSwWrk
peter pItWr
peter _^_en
phallus falys
polder pOldEr
premier pr@mjer2
program _^_en
(program files) prOgramfajlz
query kueri
queries kueri
query _^_en
queries _^_en
quid kwid $u+
quit kwit
recorder rikOrdWr
quit _^_en
recorder _^_en
requiem rekyijEm
revolver revOlvEr
sas sas
scan skan
scan _^_en
scanner skaner2 $verb
scanner skanWr $noun
scanners skanWr
shampoing SA~pwE~
sir sWr
sir _^_en
souris suri
stocker stoker2
sus sys
sus sy $verb
sushi suSi
thierry tjEri
to tu $u+
tramway tramwE:
tuttiquanti tutikw'anti
@@ -745,7 +746,6 @@ vaut $u+
vaux $u+
vénus venys
vot vOt
writer raitWr
yves iv


@@ -777,18 +777,17 @@ zut zyt

// et (t is said)

exocet E2gzOsEt
exocet EgzosEt
fret fr'Et
budget bydZE2
budget bydZE
hamlet _|amlEt
knesset knesEt
lazaret lazarE2
lazaret lazarE
margaret margarEt
net nEt
offset OfsEt
set sEt
soviet soviEt
stewart stIwart

// urt (t is said)
kurt kurt
@@ -800,19 +799,14 @@ yogourt _|iogurt
short SOrt

// art (t said)
steward stiwart
stuttgart Stutgart
hart art
kart kart
smart smart

// irt
(sweat shirt) swEtSWrt
(sweat shirts) swEtSWrt
(tee shirt) t,IS'Wrt
(tee shirts) t,IS'Wrt
(t shirt) t,IS'Wrt
(t shirts) t,IS'Wrt
(t shirt) _^_en
(t shirts) _^_en


// words from other languages
@@ -821,34 +815,38 @@ acer asEr
and _^_en
amazon amaz'On
apple _^_en
at at $u+
(audible manager) od,ibl||manadZ'Wr
at _^_en
(audible manager) _^_en
balabolka balabOlka
be _^_en
better _^_en
bin bin
bit bit
bluetooth blut'us
bluetooth _^_en
computer _^_en
(cyber link) _^_en
debian debjan
do _^_en
edit _^_en
emacs E2maks
emacspeak E2makspI:k
emacs _^_en
end _^_en
espeak @spI:k
ethernet etErnEt
exit egzit
(file zilla) f,ajl||zij'a
from frOm $u+
(file zilla) _^_en
from _^_en
get _^_en
google gug=Wl
google _^_en
gnome gnOm
gnu $abbrev
hamburger _|A~b@rgWr
he _^_en
her _^_en
help _^_en
hot _^_en
in in $u+
inside _^_en
in _^_en
internet E~tErn'Et
(internet explorer) E~tErn'Et||E2ksplOr'Wr
(internet explorer) E~tErn'Et||EksplOr'Wr
it _^_en
klaxon klaksOn
let _^_en
lite _^_en
@@ -856,28 +854,29 @@ login _^_en
logon _^_en
(mac os x) makoEsiks
made _^_en
mail _^_en
mailto _^_en
media medja
messenger mE2sEnZWr
my maj $u+
messenger _^_en
nat nat
not _^_en
null _^_en
ok oke $u+
open op'Wn
(open source) op,Wn||s'urs
outlook autlu:k
open _^_en
outlook _^_en
paint _^_en
paper _^_en
people _^_en
redhat rEdat
redhat _^_en
same _^_en
sametime _^_en
she _^_en
sun _^_en
(text aloud) tEkst||@la=wd
(text aloud) _^_en
ubuntu ubuntu
up _^_en
win win $u+
yes _^_en
yet _^_en


// tions (tjO~ instead of sjO~)
@@ -903,6 +902,7 @@ vincent vE~sA~
// Some countries, areas and languages
afrikaans afrikans
aix Eks
aruba aruba
bahamas baamas
bangladesh bA~gladES
bayeux bajY
@@ -915,14 +915,17 @@ burundi burundi
calvados calvadoss $text
christmas krismas
croatie kroasi
esperanto E2sperA~to
esperanto EsperA~to
groenland groEnlA~d
guatemala gwatemala
hindi _|indi
honduras _|O~dyras
kenya kenja
koweït kowEjt
laos laOs
leone leOn
lesotho lezOto
libye libi
liechtenstein liStWnStajn
angeles A~nZelEs
malawi malawi
@@ -935,15 +938,12 @@ oman oman
palaos palaOs
samoa samoa
swaziland swazilA~d
leone leOn
koweït kowEjt
taïwan tajwan
texas tE2ks'as
texas tEks'as
tuvalu tuvalu
vanuatu vanuatu
venezuela venezy-E2la
venezuela venezyEla
(viêt nam) vjEtnam
wallis walis
futuna futuna
zimbabwe zimbabwe


+ 182
- 155
dictsource/fr_rules View File

@@ -27,7 +27,7 @@
// http://www.fluxnic.net/cicero
//
// Rules are now maintained by Michel Such <[email protected]>
// Last update: 2010-07-16 Michel Such <[email protected]>
// Last update: 2010-07-30 Michel Such <[email protected]>
//

// Letter classes:
@@ -45,7 +45,32 @@
.L03 d l m n s t v
.L04 c d f g l m n v
.L05 g h k l m v w
.L06 l r s

// Following groups are used to manage mute e inside words.

// After or before L06, e is not mute
.L06 bl br cl cr ct dr fl fr ft gl gr kl kr pl pr tr vr

// After L07, e is not mute
.L07 ec éc ed éd lb lc ld lg lm ln lp lt lv rb rc rd rf rg rl rm rn rp rs rt rv

// All consonants + ch gu qu used as ch g k
.L08 b c d f g h j k l m n p q r s t v w x z ch qu gu

// E placed after a consonant following L09 is not mute
.L09 l r s

// When these diphtonges are after a consonant folllowing e, e is not mute
.L10 ia ie io ua ue ui uo
.L11 b p
.L12 é è al ib ie l om on ré

// Words ending "son" pust sound english if preceded by L13
.L13 d g k l p er hn

// For english words ending "side"
.L14 be in up ut



.group a
@@ -56,21 +81,18 @@
ain (K E~ // pain
Ct) ain (_ E~n2 // certain ami
ch) ain (_ E~n2 // prochain arret
ai (_ e // dirai ferai...
_ess) ai (_ E2 // essai
_vr) ai (_ E2 // vrai
ai (b E // faible
ais (_ E2z2 // dirais ferais...
ait (_ E2t2 // dirait ferait...
aient (_ E2t2 // diraient feraient...
ai E
ai (_ e
_bal) ai (_ E
_ess) ai (_ E
_vr) ai (_ E
aie E
ais (_ Ez2
ait (_ Et2
aient Et2
f) ai (sA @ // faisons faisan
a (ilK a
aie (me E2 // paiement
ai E // aile
ai (L06 E // aile
ai (CAX E // aile
am (b A~ // jambon
am (p A~ // camp
am (L11 A~ // jambon, tampon
am (m a // programmation
_) am (n am // amnistie
am (n a // condamner
@@ -106,22 +128,22 @@
aud (_ o // chaud
_C) aud (_ od // Maud
au (l_ O // Paul
au (re_ o // dinosaure
au (re_ O // dinosaure
_) audio (@P5 odio
_) auto (@P4 oto
_) autom (n otO
bb) aye (X ei // abbaye
ay (C E // aymé
ay Ej // paye
ay (_ E2 // display
Xl) ayer (X E2jWr // player, layer
ay (_ E // display
Xl) ayer (X EjWr // player, layer
h) am (_S2 am
w) an (_ an
a a // bateau

// group a: English section
sm) all _^_en // small, smaller
a (wC _^_en
any _^_en
aw (K _^_en


.group b
@@ -131,12 +153,9 @@ _C) aud (_ od // Maud

// group b: English section
back _^_en
bbl _^_en
bird _^_en // bird
board _^_en // board, keyboard
box (_ _^_en // box, inbox, outbox
bugg _^_en // debugger
_) by _^_en // by, bye, bypass


.group c
@@ -239,50 +258,64 @@ _ingré) dien (t_ djA~ // ingrédient
_) devic _^_en
dle (X _^_en // bundle, handle


.group e

// Define use of the final 'e' in french
e (_

// Manage mute e inside words
@C) e (CeCA @
@L08) e (CA
@L08) e (CL10C @
@L08) e (L06
@L08) e (L06L10C @
@L06) e (CA @
@L06) e (L06 @
@L07) e (CA @
@L07) e (L06 @
@L09gu) e (CA @
@L09gu) e (L06 @
@L09qu) e (CA @
@L09qu) e (L06 @
e (ct+++++ E
e (x+++++ E

_C) e (_ @ // je te
-c) e (_
-j) e (_
C) e (-

e (Ce_ E
eau o // bateau
g) ea (s_ a // mangeas
cap) e (la_ e
gh) e (tAX e // spagheti
j) e (a // Jean Jeanne
p) ect (_ E2 // suspect
_) e (CAN e // Evident
_) e (L06A e // Ecran
_eC) e (CA++ E // Evenement
eau (++ o // bateau
e (CC E
cap) e (la_ E
gh) e (tAX E // spagheti
p) ect (_ E // suspect
ect (_ Ekt // direct
pi) ed (_ e // pied
_art) e (++ e // arte, artefact
_cl) ef (_ e // clef
_cr) e (at e
_) ein (K En // Einstein
ein (K E~ // peindre
pl) ein (_ E~n2 // plein emploi
e (il E // vieille
ei E // neige
eoi wa // asseoir
ell El // selle
el (K El // celsius, caramel
e (oi // asseoir
el (l E // belle
_f) em (me a // femme
i) e (mA // remerciement, d�ploiement
e (ro_ e // Cicero
A) e (rA // remerciera
tch) e (rX W
@) em (me a // patiemment
em (b A~ // décembre
em (L11 A~ // décembre
em (mACC A~ // emmancher
em (mACAC A~ // emmagasiner
em (ma E2 // emmanuel
em (ma E // emmanuel
em (mai A~ // emmailloter
l) em (n a // solemnel
il) emn Em // dilemne
em (p A~
en (_ A~n2 // en
en (hA A~n // enharmonique
_C) en (j E~ // benjamin
@@ -440,7 +473,7 @@ s_couv) en (t_ // elles couvent
_hiv) er (X Er // hiver
Cst) er (X Er // hamster
_cart) er (X Er // carter
_cutt) er (X Er // cutter
_cutt) er (X Wr // cutter
tain) er (X Er // container
_ti) er (_ Er
ack) er (K Wr
@@ -467,6 +500,7 @@ s_couv) en (t_ // elles couvent
Am) es (nA e // Dumesnil

d) esh (A ez // Deshormeaux
f) eb (vA E // Lefebvre

_r) e (ss @ // ressembler
_r) e (ssu e // ressusciter
@@ -477,13 +511,14 @@ s_couv) en (t_ // elles couvent

dg) et (_ Et // Bridget, gadget
k) et (_ Et
tick) et (_ E2
tick) et (_ E
m) et (_ Et2

eu Y // eu
eu (CX W // neuf
eu (CeX W // fleuve
eu (Cer_ Y // pleurer
eu (i W // feuille
eu (CeX Y // meule
eu (reX W // demeure
gu) eu (leX W // gueule
@@ -494,82 +529,46 @@ gu) eu (ler Y // gueuler

_) eut (_ yt2
eut (_ Yt2
_) extra (uP5 E2kstra
_) extra (CP5 E2kstra
eux (_ Yz2
_) extra (uP5 Ekstra
_) extra (CP5 Ekstra
_) eû y // eût
eû Y: // jeûne

ey (_ E2 // dahomey
ey (C E2 // ceylan
ey (_ E // dahomey
ey (C E // ceylan
ey Ej // asseye

ez (_ ez2 // nez mangez chez

g) e (A // mangeons
g) eu Y // vengeur
g) eu W // vengeur
g) eu (re y // gageure

_d) e (ch @
_r) e (ch @ // recherche
e (Cl @

_l) e (xA E2
_m) e (xA E2
_l) e (CA @
_l) e (ChA @
_l) e (ClA @ // Leclerc
tr) e (CA @
tr) e (ChA @

e (CC E // infect pelle mettre
e (Cr @
_) e (C% e // effet, effectuer
e (C_ E
e (t_ E2
e (rC E
es (_ z2

%C) e (xA E2

@gu) e (CA
@gu) er (A r
@qu) e (CA
@qu) er (A r
_qu) e (CA @
@L06gu) e (CA @
@L06qu) e (CA @
@C) e (CA
@C) e (li @
@ch) e (li @
@C) er (A r
@C) e (rion++ @
@C) e (riez++ @
@ch) e (CA
@ch) er (A r
L06ch) e (CA @
@L06C) e (CA @
@CL06) e (CA @
@bC) e (CA @
@ct) e (CA @
%C) e (CA++
%C) er (A++ r
@C) e (xA++ E2
@c) e (v++ @
@d) e (v++ @

@C) e (CrA
@ch) e (CrA
@L06ch) e (CrA @
@L06C) e (CrA @
@L06C) e (rrA E
@CL06) e (CrA @
%C) e (CrA++
e (ri_++ e
e (ria_++ e
e (ro_++ e // Cicero
e (rr+++ E

e @ // menue
_) e (CA e
_) e (xC++ E2
Cr) eam Im
Cr) eam I:m
Cr) eamer ImWr
Cl) eaner InWr
vert) e (rX W
@@ -580,26 +579,23 @@ gu) eu (ler Y // gueuler


// group e: English section
eac _^_en
C) ead _^_en // read, head
eak _^_en // break, speak
eal _^_en // deal
ear _^_en // ear, search
eas _^_en // please
eave _^_en // leave
ea _^_en
e (CeX _^_en
ed (_ _^_en
ee _^_en // meeting
efore (_ _^_en // before
eing (_ _^_en // being, boeing
eive _^_en // receive
eld (_ _^_en // field
el (CX _^_en // field
el (sX El
_) enter (_ _^_en // enter
_) enhan _^_en
qu) est (_ _^_en // request
qu) este (X_ _^_en // requested, requester
_) even (X _^_en // forever, however
_) ever _^_en // forever, however
_) even (K _^_en
_) ever _^_en
oC) ever _^_en // forever, however
ew (++ _^_en
_) eye _^_en


@@ -636,6 +632,8 @@ gu) eu (ler Y // gueuler
.group g
g g
g (Y Z
ge (a Z
ge (o Z

su) gg (Y gZ // suggérer suggestif
gg g // agglomérer
@@ -683,6 +681,7 @@ _quatrevin) gts (_ z2
// group g: English section
_) game (X _^_en
girl _^_en // girl
gh (K _^_en
gy (_ _^_en


@@ -732,7 +731,7 @@ _quatrevin) gts (_ z2

// group h: English section
_) half _^_en
here (_ _^_en // here
_) ha (C_ _^_en


.group i
@@ -751,11 +750,8 @@ _quatrevin) gts (_ z2
or) ien (t iA~ // orient, orienter
ot) ien (t_ jA~ // quotient

i (e_ i
_) i (ce@ aj // iceberg
_) ill il // illégal
ill (_ il // Bill
_C) ill (y_ il // Billy
_) il (l i // illégal
aigu) ill ij // aiguille
anqu) ill il // tranquille
c) ill (i il
@@ -776,17 +772,14 @@ _quatrevin) gts (_ z2
imm imm // immaculé
im (_ im // karim
im (C E~ // timbre
w) in in // winrar
inct (_ E~ // distinct
in (h in // inhumain
in (kX iN // link
in (n i // innombrable
in (C E~ // vingt
in (_ E~ // vin
ing (_ iN
// ing (_ iN
ing (h ing
ing (s iN
ing (to iN
_) infra (sP5 E~fra
_) inter (@@P5 E~tEr
_) interr (A E~tEr
@@ -810,13 +803,17 @@ _quatrevin) gts (_ z2
ibuter (X _^_en
iev _^_en
ife (_ _^_en
igh _^_en
ign (_ _^_en
ill (_ _^_en // Bill
C) ill (y_ _^_en // Billy
ing (_ _^_en
C) irt (_ _^_en
iven (_ _^_en
ind (X _^_en // find, mind
_C) ind (erX _^_en // finder
AC) ind (erX _^_en // reminder
ize (X _^_en // realize
_bAl) i (ze i
C) ird (X _^_en // bird
ize (K _^_en // realize
ram_f) i (le _^_en

.group ï
@@ -833,6 +830,7 @@ _quatrevin) gts (_ z2

.group j
j Z // adjoint joujoux
je (a Z // Jean
_) j' (P2v Z
_) jazz dZaz
_) j (obK dZ
@@ -849,10 +847,11 @@ _quatrevin) gts (_ z2
ke (s_ _^_en // makes, takes
ke (rX _^_en // maker
ke (nX _^_en // taken
AC) k (X _^_en // bank

.group l
l l // lit
ll l // aller
ll (A l // aller
_) l' (P2 l
au) lt // hérault
uCi) l (_ // outil, fusil
@@ -862,10 +861,15 @@ _quatrevin) gts (_ z2
_) lorsqu' (P7 lorsk

// group l: English section
ld (_ _^_en // could
less (_ _^_en // noiseless
%C) l (eX _^_en
ff) l (eX l
pp) l (eX l
_) line (X _^_en
_) live _^_en
@) loud (_ _^_en
ll (X _^_en
AC) l (X _^_en


.group m
@@ -877,8 +881,9 @@ _quatrevin) gts (_ z2
master (_S6 mastWr

// group m: English section
_) mail (_ _^_en // mailer
mov (ieX _^_en // move, movy
m (n_ _^_en // column, autumn
mov (AX _^_en // move, movy
mov (ie_ _^_en // move, movy


.group n
@@ -894,19 +899,23 @@ _quatrevin) gts (_ z2
_) neuro (@@P5 nYro
_) nvda (P4 Envedea

// group n: English section
_) name _^_en
_re) name _^_en
n (eme_ _^_en
n (emes_ _^_en


.group o
br) oc (_ o // broc
cr) oc (_ o // escroc
ls) on (_ On
Cst) on (_ On
_) os (_ Os
_) os (_++ Os
_v) os (gY o
s_) os (_ o
x_) os (_ o
o (t_ o

oe (ll wa // moelleux
oe (llA wa // moelleux
oe (i W // oeil
_) oe (C Y // oesophage
_ph) oe (C e // phoetus
@@ -921,8 +930,7 @@ _quatrevin) gts (_ z2
oin (_ wE~ // coin
oi wa // poil
oê (l wa // poêle
om (b O~ // bombe
om (p O~ // trompe
om (L11 O~ // bombe, pompe
n) om (X O~ // nom
om (_ Om // www.web.com

@@ -937,10 +945,6 @@ _quatrevin) gts (_ z2
_) on (z _|O~ // onze, onzième

_c) on (_ O~ // no comment
ps) on (_ On // Epson
gt) on (_ On // Washington
Cst) on (_ On
ps) on (_ On
_C) on (_ O~n2 // mon appui, mon histoire, mon havre

alc) oo (l O // alcool
@@ -969,7 +973,10 @@ _quatrevin) gts (_ z2
o (_ o // zorro allégro
gr) oss os // grosse, grossir

C) o (sA o // position
C) o (me_ o // atome, chrome
_C) o (me_ O // Rome tome
o (sA o // position
o (zA o // Mozilla
o (CC O // poste, votre
o O

@@ -979,8 +986,13 @@ _quatrevin) gts (_ z2
oa (s_ oa
oa (CerX _^_en
oach _^_en
old (er_ _^_en // folder, older
oes _^_en
_) of (X _^_en
o (lder_ _^_en // folder, older
_) o (rder_ _^_en // order
C) oing (_ _^_en // going
gt) on (_ _^_en
Cst) on (_ _^_en
oo (Ce _^_en // boomer
oo (k _^_en // book, cook
oo (st _^_en // booster
@@ -992,7 +1004,7 @@ _quatrevin) gts (_ z2
_sC) ot _^_en // shot, slot, spot
ow (e _^_en // flower, power
ow (X _^_en
oy (X _^_en // boy, toy
_C) oy (X _^_en // boy, toy


.group ô
@@ -1005,11 +1017,11 @@ _quatrevin) gts (_ z2
_) para (pCP4 para
_) photo (@P5 foto
_) poly (@P4 poli
_) post (KP4 post
_) post (CP4 post
_) post (ACCP4 post
_) pseudo (@P6 psYdo
p (p // appliquer
pays pE2iz2 // pays, paysage
pays pEiz2 // pays, paysage
ph f // phrase

m) ps (_ // temps champs
@@ -1076,7 +1088,6 @@ _quatrevin) gts (_ z2

// group r: English section
_) real _^_en
resen _^_en
rst (_ _^_en
_) rule _^_en

@@ -1175,13 +1186,19 @@ _cACpu) s (_ s
_tou) s (_leurs_

// group s: English section
CA) sh (_ _^_en // punish
send (_ _^_en
sh (_ _^_en
sh (Ap _^_en // shop, ship
sh (At _^_en // shut, shot
_) side (X+++ _^_en
L14) side (X+++ _^_en
_) sky _^_en
_) smil _^_en // smile, smiley
spy _^_en
_A) s (_ _^_en
L13) son (_ _^_en
L13) ston (_ _^_en
stone (_ _^_en


.group t
@@ -1194,7 +1211,9 @@ _cACpu) s (_ s
VCi) t (_ t2
t (_
peti) t (_ t2
_) th t // thon
th (L12++ t
or) th (++ t
_) th (erm t
ts (_S1 z2 // silent at end of word unless next word starts with a vowel
C) t (_ t // compost watt soft script malttact abrupt
ki) t (_ t // kit
@@ -1284,13 +1303,13 @@ _cACpu) s (_ s
_transA) t (_ t

// group t: English section
C) th (_ _^_en // month
_) th (eX _^_en // the, then
_) th (aX _^_en // than, that
th (A _^_en // this
th (K _^_en // month
_) time _^_en
tle (_ _^_en
too _^_en
ttl _^_en
g) ton (_ _^_en // try, country
try (_ _^_en // try, country
sCar) t (_ _^_en // smart, start
sCar) t (er_ _^_en // starter
@@ -1299,34 +1318,30 @@ _transA) t (_ t

.group u
u y // cruel nuage brut
ue (il W // orgueil
ui yi // nuit, fuite
uin (K yE~ // juin
_s) u (rfX W
_C) u (rfX W
_bl) u (ff W
_s) u (rfeX W
uy (A yij

C) ucci utSi // capuccino
c) ueill Wj // cueillir
c) ueil (_ Wj // recueil
_g) ua wa
ag) ua (X wa
Ctig) ua (_ wa
_c) ul (_ y
_) ultra (P5 yltra
g) u (ay u
g) ueill Wj // orgueilleux
haïk) u (X u

C) u (bX W // hub, club
C) u (gX W // bug, mug
_n) u (rse W // nurse
r) u (nX W // run, autorun
pr) unt (_ W~ // emprunt
um (_ Om // album
f) um (_ W~ // parfum
um (b W~ // humble
um (p W~
um (L11 W~ // humble
un (C W~ // emprunt lundi
un (n y // tunnel
CC) un (_ W~ // brun
@@ -1341,10 +1356,14 @@ _transA) t (_ t
uz (z W

// group u: English section
ual (_ _^_en // usual
uch (_ _^_en // much
_b) usi _^_en // business, businessman
C) ui (ce _^_en // produice, juice
C) ult (_ _^_en
umber (_ _^_en
ump (_ _^_en
r) u (nX _^_en // run, autorun
unch _^_en
under _^_en // under, understand, thunder
_C) un (_ _^_en
@@ -1353,6 +1372,7 @@ _transA) t (_ t
up (_ _^_en // setup
urn (X _^_en // burn, turn
ust (_ _^_en // just, trust
uzz _^_en // buzz


.group ü
@@ -1378,19 +1398,19 @@ _transA) t (_ t
.group w
w w
_) w (A _|w
w (ag v // wagon
wa (ve_ wE:j // wave
wa (re_ wE: // hardware software
w (ag++ v // wagon

// group w: English section
e) w (K _^_en
_) wan _^_en
_) w (AC _^_en
_) w (ina w
_) w (Ai _^_en
_) w (ACo w
_) we _^_en
wh _^_en // why whisky when
wr _^_en // write
war _^_en // war
wav _^_en // wave
way _^_en // way, away
_) wir _^_en // wire
winn _^_en // winner
wise _^_en
with _^_en
wor _^_en


@@ -1432,13 +1452,19 @@ _transA) t (_ t
_) yacht _^_en // yacht, yachtman

_) yahoo (P5 ja'u
ym (K E~ // tympan
y (nn i
y (nA i
ym (L11 E~ // tympan
X) ys (_ is
yx (_ iks

yn E~ // laryngite
yn (K E~ // laryngite
y (nn i

// group y: English section
_C) y (_ _^_en
C) y (e_ _^_en
%C) y (_ _^_en
//@CAC) y (_ _^_en
nC) y (_ _^_en
yze _^_en


.group z
@@ -1466,6 +1492,7 @@ _transA) t (_ t
$ dOlar
° d@gre
_n_) ° // n°
' (C _^_en




+ 23
- 0
dictsource/hi_list View File

@@ -172,6 +172,29 @@ _dpt _d@s@ml'o:_ // ?? what is Hi for "." ?
फ़ f@
य़ j@

// combining vowel signs
ा #X2a:
ि #X1I
ी #X2i:
ु #X1U
ू #X2u:
ृ #X1rI
ॄ #X1rI
ॅ #X1E
ॆ #X1e
े #X2e:
ै #X2E:
?2 ै #X2aI
ॉ #X1O
ॊ #X1o
ो #X2o:
ौ #X2O:
?3 ौ #X2aU
ॢ #X1l-
ॣ #X2l-:
ॐ #X1o~m


// Punctuation
। dVn.d.V


+ 58
- 12
dictsource/hu_list View File

@@ -28,7 +28,6 @@ _9X kilEntsvEn
_0C sa:z

_0M1 EzER2
_1M1 EzER2
_2M1 ke:tEzER2
_0M2 millio:
_1M2 EJmillio:
@@ -129,15 +128,15 @@ _#-től e:tY:l $alt2
_#-tól a:to:l $alt2
_#-ig e:ig $alt2 //special date ordinal numbers for example elsejéig, negyedikéig etc.
_#-éről e:R2Y:l
_#-áról a:R2o:l $alt2
_#-áról a:R2o:l

_#-ától a:to:l $alt2
_#-ától a:to:l
_#-ről e:R2Y:l $alt2
_#-ról a:R2o:l $alt2
_#-ével e:vEl $alt2
_#-ával a:vAl $alt2
_#-éig e:ig $alt2
_#-áig a:ig $alt2
_#-ével e:vEl
_#-ával a:vAl
_#-éig e:ig
_#-áig a:ig
_#-étől e:tY:l $alt2
_#-ét e:t $alt2
_#-át a:t $alt2
@@ -168,8 +167,8 @@ _#-ához a:hoz
(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
(1-ével) elsejével $text
(1-éig) elsejéig $text
(1-étől) elsejétől $text $alt2
(1-ét) elsejét $text $alt2
(1-je) elseje $text $alt2
@@ -188,6 +187,8 @@ _#-ához a:hoz
(1-éhez) elsejéhez $text $alt2
(2-i) másodikai $text $alt2
(2-ig) másodikáig $text $alt2
(2-étől) másodikától $text $alt2 //this is not mistake, don't change!
(2-től) másodikától $text $alt2 //this is not a mistake, don't change!
(3-i) hAR2_mAdikAi $alt2
(3-ig) harmadikáig $text $alt2
(6-i) hAtodikAi $alt2
@@ -238,6 +239,7 @@ _#-ához a:hoz
(2-őn) kEt:Y:n
(2-n) kEt:Y:n
(2-m) kEt:Y:m
(2-el) kEt:Y:vEl
// entries with a single digit such as (2-i) also apply to 22, 32, etc, unless $only
(30-cal) hAR2mints:Al
(3-al) ha:R2om:Al
@@ -294,6 +296,18 @@ _20e hus
(80-al) n^oltsvAn:Al
(90-el) kilEntsvEn:El

//Special roman number suffixes and exceptions
(XVI-ig) tizEnhAtodikig //Special roman number suffix exception
(II-el) kEt:Y:vEl
(III-al) ha:R2om:Al
(IV-el) ne:J:El
(5-el) Yt:El //this exception not working, Espeak always spokening YtEl phoneme, but Yt:El phoneme is right
(VI-al) hAt:Al
(VII-el) he:t:El
(VIII-al) n^olts:Al
(IX-el) kilEnts:El
(CD-ellenőrzést) tse:de:El:EnY:R2ze:St //this is not a mistake, default Espeak spokening roman number before the ellenőrzés word

// These words mean that a dot after number, immediately preceding, does not mean an ordinal number
január $alt
február $alt
@@ -346,6 +360,8 @@ tavaszi $alt
nyári $alt
őszi $alt
téli $alt
végén $alt
elején $alt

// accent names
_lig ligAtu:R2A
@@ -403,7 +419,7 @@ BAR bAR2 $allcaps

(a . m .) An^n^i||m'int
ún u:JnEvEzEt: $hasdot
dr doktoR2 $dot
dr doktoR2 $hasdot
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
@@ -413,7 +429,7 @@ MB mEgAba:jt $allcaps
OK ok $allcaps
mvgyosz Emve:Je:oEs
OTP o:te:pe: $allcaps
id idY:SEb: $hasdot
id idY:SEb: $hasdot $only
ill illEtvE $hasdot
ifj ifjAb: $hasdot
mta $abbrev
@@ -1007,6 +1023,36 @@ halt $unstressend
ész $unstressend
kapta $unstressend
kaptak $unstressend
kék $unstressend
kelt $unstressend
kárt $unstressend
gróf $unstressend
grófot $unstressend
lakik $unstressend
laknak $unstressend
laktak $unstressend
kapsz $unstressend
tudta $unstressend
kapnak $unstressend
tért $unstressend
törtek $unstressend
tört $unstressend
vész $unstressend
park $unstressend
tartja $unstressend
válik $unstressend
rajta $unstressend
merült $unstressend
zuhant $unstressend
jöttek $unstressend
leltem $unstressend
múlva $unstressend
várta $unstressend
ház $unstressend
állnak $unstressend
idején $unstressend
néznek $unstressend
érezte $unstressend

// word pairs

@@ -1045,7 +1091,7 @@ kell $unstressend // should

szabad $u+ // can (allowed)

fog $u+ // going to
fog $unstressend // going to
fogok $u+
fogsz $u+
fogunk $u+

+ 44
- 14
dictsource/hu_rules View File

@@ -83,6 +83,9 @@ gyümöl) cs (zs tS
fil) c (csiz ts
szo) c (segély ts
_kó) c (csomó ts
árbó) c (csúcs ts
árbo) c (csúcs ts
fegyen) c (csoport ts

.group ch
anar) ch (i h
@@ -208,12 +211,15 @@ menetren) dsz (erű d|s
va) d (szeder d
twee) d (sapk d
fe) dd (hetetlen d
ezre) d (segé d
erő) d (szerű d
csalá) d (szociol d
száza) d (szemle d
zöl) d (szem d

ezre) d (segé d
erő) d (szerű d
csalá) d (szociol d
száza) d (szemle d
zöl) d (szem d
utó) d (jelöl d
cselé) ds (ég tS:
föl) d (szegély d
stran) d (szezon d

.group dz
fogó) dz (kod ts
@@ -250,9 +256,11 @@ titkoló) dz z
ringató) dz z
mére) dz (k ts
pilóta) dzs (ek dZ
ezre) dz (ene d|z
száza) dz (ene d|z
honvé) dz (ászló d|z
ezre) dz (ene d|z
száza) dz (ene d|z
honvé) dz (ászló d|z
smarag) dz (öld d|z
kapáló) dz z

.group e
e E
@@ -261,7 +269,7 @@ honvé) dz (ászló d|z

_) ehhez EhEz
_) egyezség EJ:ESSe:g
_) egyezségg EJ:ESSe:g:

.group é
é e:
@@ -410,6 +418,13 @@ tizene) gy (en J:
_e) gy (év J:
_e) gy (órá J:
_e) gy (se J
je) gy (ezte J
na) gy (sebes J
_í) gys (e J|S
na) gy (siker J
huszone) gy (edik J:
je) gy (ért J
harmince) gy (edik J:

.group h
h h
@@ -461,6 +476,7 @@ tizene) gy (en J:
kk k:
kk (C k:
_) köztársaság k'Ysta:R2SASa:g
_) köztársaságg k'Ysta:R2SASa:g:
központ kYspont
központt kYspont:
központj kYsponc
@@ -525,7 +541,7 @@ keresztü) l (j l
_) e) lj (ár lj
ha) ll (ga l
_ta) lj (án lj
_fé) l (jobb l
_fé) l (jobb l



@@ -846,6 +862,7 @@ kitöré) ssz (erű Ss
nyúva) ssz s:
hirdeté) ssz (erve Ss
páncélo) ssz Ss
hajtá) ssz (erű Ss

.group sz
sz s
@@ -1030,7 +1047,7 @@ négyze) t (centi t
á) tj (öt t|j
á) tj (ön t|j
á) t (süvít t
bará) tj (ára c:
bará) tj (ár c: //barátjára, barátjáról words need spokening c: phoneme
kísérle) t (sorozat t
á) t (sült t
á) t (süt t
@@ -1084,7 +1101,19 @@ fejeze) t (cím t
pán) t (szél t
boo) t (sorrend t
_á) t (jöj t
ú) tsz (oros t|s
ú) tsz (oros t|s
művele) t (sáv t
_ké) t (szob t
ne) t (sátor t
há) tj (ár c:
ker) t (szomszéd t
éle) t (járadék t
_á) t (sodor t
par) t (sáv t
tes) t (játék t
ö) t (jegyű t
ha) t (jegyű t
hé) t (jegyű t

.group ts
ts (_S2 tS //general rule with word end of ts letters
@@ -1171,6 +1200,7 @@ indula) tsz (ó t|s
sie) tsz ts:
szemé) ts (ég tS:
ré) ts (ég tS:
já) tsz (ok ts:

.group u
u u
@@ -1242,7 +1272,7 @@ lefeje) z (ték s
gá) z (cső z


ké) z (sz zz
ké) z (sz z
há) z (so z



+ 0
- 1
dictsource/nl_list View File

@@ -108,7 +108,6 @@ _8X t'Axt@x
_9X n'e:g@nt@x
_0C h'OndErt
_0M1 d'WyzEnt
_1M1 d'WyzEnt
_0M2 m'iljun
_0M3 m'iljArt
_0M4 b'iljun

+ 0
- 1
dictsource/pap_list View File

@@ -73,7 +73,6 @@ _8X otS'enta
_9X nob'enta
_0C sj'en
_0M1 m'il
_1M1 m'il
_0M2 mi'on
_dpt _kOma/


+ 15
- 2
dictsource/ta_list View File

@@ -33,6 +33,20 @@ U+bcd ot.RU

ஏ je:

// combining vowels, precede by a click so they can be distinguished from stand-alone vowels
ா #X2a::
ி #X1i
ீ #X2i::
ு #X1u
ூ #X2u::
ெ #X1e
ே #X2e::
ை #X2aI
ொ #X1o
ோ #X2o::
ௌ #X2aU



// speak Latin letters as English
a e:j
@@ -151,9 +165,7 @@ _8C ;en.n.u:t.t.Ri
_9C tol.l.a:jirVttU

_0M1x a:jirVm
_1M1x a:jirVm
_0M1 a:jirVttU
_1M1 a:jirVttU

_0M2x lVd.tSVm // 100,000
_1M2x orUlVd.tSVm
@@ -234,6 +246,7 @@ tamil தமிழ் $text
பலத்தில் $alt
பலத்தின் $alt
பைக்ல $alt
பாவ்லா $alt
(பி . ஏ) bije:



+ 12
- 2
dictsource/ta_rules View File

@@ -242,7 +242,7 @@
அப) க (ீர்த்தி k
_பால்) க (ுட k
_வளை) க (ுட k
மன்னார்) க (டி k
மன்னார்) க (டி ku2
நற்) க (ுண g
_சற்) க (ுண g
க (ுமார k
@@ -281,6 +281,8 @@
வி) க்ட (ோரியா kt. // victoria
வி) க (்ரம k
ஆ) க (்ரோஷ k
_கால) க (ட்ட kV
_வலை) க (ாப் k
//endsort


@@ -388,7 +390,6 @@
ிங்) ட (ன் t.V // -ington
_) ட (ாக்க t. // talkies
_) டிராக்ட (ர t.ira:gt.V
_) ட (யர t.V
_) ட (ைம்_ t.
டெலிப (ோன t.elif
_) ட (ம்ப்ளர t.V
@@ -404,6 +405,9 @@
_) ட (ேப t.
_) டாக (்ஸி t.a:k
_ல) ட்ட d.d.V#
_) ட (யர் t.V
_) ட (யரில t.V


.group ண
ண n.V
@@ -684,6 +688,7 @@ _பார்வ) த (ி t
ச) த (்ரு t
த) த (்ரூப t
பா) த (்ரூம t
_கௌ) த (மி tV
//endsort


@@ -733,6 +738,7 @@ _பார்வ) த (ி t
_) ப (கிரங்க bV
_) ப (கிஷ்க bV
_) ப (கீர bV
_) ப (க்கெட் bV
_) பக் (த bVk
_) ப (ங்கம bV
_) ப (ங்களா bV
@@ -790,12 +796,14 @@ _பார்வ) த (ி t
_) ப (லூன bV
_) ப (வாணி bV
_) ப (வானி bV
_) பவுண்ட (ன faUn.t.V
_) ப (வ்ய bV
_) ப (ஸ bV
_) ப (ாகங்க b
_) ப (ாகத b
_) ப (ாகம b
_) ப (ாக்கிய b
_) ப (ாங்க் b
_) ப (ாசு b
_) ப (ாசுர p
_) ப (ாடி_பில்டிங் b
@@ -1062,6 +1070,8 @@ _முகத்தின்_) ப (ாவ b
மன) ப்பி (ரமை bb
துர்) ப்ப (ோதனை bb
கம்) ப்யூட (ர pjU:t.V
மென்) ப (ொருள் p
வன்) ப (ொருள் p
//endsort

// If ப+ appearing in the middle of a word is followed by ட+

+ 0
- 1
dictsource/tr_list View File

@@ -113,7 +113,6 @@ _9X doksan
_0C jyz
_2C 'icijyz
_0M1 bIn
_1M1 bIn
_0M2 miljon
_0M3 miljar
_dpt _viRg,Yl_|

+ 2
- 1
dictsource/tr_rules View File

@@ -327,4 +327,5 @@
.group
$ dolar
' (Pb // split a word at ' and translate the first part separately.

ə E // used in Aberbaijan
ä E

+ 39
- 27
phsource/compile_report View File

@@ -1,4 +1,4 @@
64 phoneme tables
65 phoneme tables
new total
base 107 107
consonants 9 115
@@ -17,17 +17,17 @@ consonants 9 115
jbo 2 114
nci 3 123
fi 40 133
fr 55 137
fr-ca 11 137
hi 58 149
ta 20 151
fr 58 140
fr-ca 11 140
hi 59 150
ta 21 153
hu 24 121
lv 29 125
nl 24 125
pl 20 118
sk 28 133
cs 6 133
hr 26 138
hr 25 138
mk 3 139
sr 14 138
it 18 126
@@ -55,15 +55,16 @@ consonants 9 115
hy 23 117
da 24 120
rw 15 130
ml 13 150
ne 18 156
pa 14 150
ml 13 151
ne 18 157
pa 14 151
prs 8 111
sl 7 133
gd 6 107
bg 10 119
nso 8 107
ht 11 137
ht 11 140
az 10 127

Data file Used by
b/b [b] base
@@ -341,8 +342,8 @@ l/l_ [l/] base
[l/] fr
l/l_@ [l/3] base
[l/] fr
l/l@ [l#] base
[€¦] base
l/l@ [h&w] base
[l#] base
[l] fr
[l/2] fr
l/L1_aL [l/] base
@@ -367,14 +368,14 @@ l/L2_oL [l/2] base
l/L2_uL [l/2] base
l/l_3 [l/] de
l/l_4 [ll] sq
l/la [l#] base
[€¦] base
l/la [h&w] base
[l#] base
[l] fr
[l/2] fr
l/l_a [l/3] base
[l/] fr
l/le [l#] base
[€¦] base
l/le [h&w] base
[l#] base
[l] fr
[l/2] fr
l/l_e [l/3] base
@@ -383,8 +384,8 @@ l/L_eL_af [&] af
[&:] af
l/l_front [L] sq
l/l_front_ [l/4] sq
l/li [l#] base
[€¦] base
l/li [h&w] base
[l#] base
[l] fr
[l/2] fr
[l] zh
@@ -395,15 +396,15 @@ ll/ll [L] bg
ll/_ll [L] bg
l/l_long [l] base
[l] fr
l/lo [l#] base
[€¦] base
l/lo [h&w] base
[l#] base
[l] fr
[l/2] fr
l/l_o [l/3] base
[l/] fr
l^/l_rfx [l.] base
l/lu [l#] base
[€¦] base
l/lu [h&w] base
[l#] base
[l] fr
[l/2] fr
l/l_u [l/3] base
@@ -731,6 +732,7 @@ ustop/p_asp [ph] consonants
[bh] hi
[ph] zh
[p#] hy
ustop/percus02 [#X2] hi
ustop/percus10 [#X1] base
ustop/pl [p] base
[p-] consonants
@@ -834,6 +836,7 @@ vdiph/0i [OI] pt
vdiph/0i_2 [OI] en-sc
[OI] en-wi
[AI] no
vdiph2/8@ [U@] en
vdiph2/e@ [3:] en-sc
[e@] en-sc
[e@] en-wi
@@ -1047,8 +1050,7 @@ vdiph/@u [u:] en-wm
[@U] vi
[@:U] vi
vdiph/@u_2 [oU] en-rp
vdiph/@u_3 [o3] fr
[@U] ro
vdiph/@u_3 [@U] ro
vdiph/@u_en [oU] en
[@U] id
vdiph/ui [uI] base2
@@ -1202,6 +1204,7 @@ vowel/& [a] en-rp
[&:] lv
[&] sv
[&#] da
[&] az
vowel/0 [0] en
[O] hi
[O] pt
@@ -1238,6 +1241,7 @@ vowel/@_4 [@] en-us
[@] no
vowel/@_6 [@] en
[W] fr
[W2] fr
vowel/8 [o-] zh
vowel/8_2 [U] en-us
[8] sv
@@ -1343,6 +1347,7 @@ vowel/aa [A] fr-ca
[A:] no
[aa] zhy
[a] hy
[a] az
vowel/aa# [O] en-us
[0] en-wi
[a2] fi
@@ -1422,7 +1427,6 @@ vowel/e_5 [i] en-sc
vowel/e_6 [e] ht
vowel/e_8 [E:] de
[e] fr
vowel/e_9 [E2] fr
vowel/ee [E] en-n
[E] sv
vowel/e_e [E] en-sc
@@ -1497,6 +1501,7 @@ vowel/e_mid2 [E] af
[E] da
[e] bg
[e] nso
[e] az
vowel/@_fnt [@] en-wi
[@2] en-wi
[@2] hr
@@ -1535,7 +1540,6 @@ vowel/i_2 [i2] de
[i:] la
[i:] sv
vowel/i_3 [i] af
[I] fr
[i:] sk
vowel/i_4 [i] fi
[i] hu
@@ -1605,6 +1609,7 @@ vowel/ii_4 [I2] en
vowel/ii_5 [I] la
[i] zh
[i] bg
[i] az
vowel/ii_6 [I] en-wm
[I] en-wi
[I2] en-wi
@@ -1683,10 +1688,12 @@ vowel/oe [W] af
vowel/oe_2 [W] no
vowel/oe_4 [W] sv
vowel/o_mid [U@] en-rp
[O] fr
[o] hu
[o] tr
[o] ne
[o] bg
[o] az
vowel/o_mid2 [O] fr
[O] ht
vowel/oo [o] base
@@ -1750,7 +1757,6 @@ vowelr/o_r [o@] en-sc
vowelr/r-voc [r-] base
[r-] sk
[r:] sk
[r-] hr
vowelr/V3_r [VR] en
[3] en-sc
[@r] zh
@@ -1784,15 +1790,18 @@ vowel/u#_4 [U] en-sc
[u:] en-sc
vowel/u_5 [u] sw
[u] nso
[u] az
vowel/u#_5 [y] vi
vowel/u_6 [u:] en-rp
[u] ta
[u2] ta
[u:] ta
[U] pt-pt
[u] pt-pt
[u] ku
vowel/u_7 [u] vi
vowel/u#_7 [@] tr
[@] az
vowel/u_bck [u] base2
[U] cy
[u] fi
@@ -1849,6 +1858,7 @@ vowel/V [3] en-sc
[@] bg
vowel/V_2 [V] en
[a] af
[V] fr
[V] ru
[V#] ru
[V] ku
@@ -1873,6 +1883,7 @@ vowel/y [y] base2
[yu] zhy
[y] sq
[y] da
[y] az
vowel/y# [Y] base2
[3:] en-wm
[Y:] de
@@ -1888,6 +1899,7 @@ vowel/y_2 [y:] la
[y] zh
vowel/y#_2 [Y] hu
[Y:] sv
[W] az
vowel/y_3 [y] af
vowel/y#_3 [W] is
[W:] is

+ 2
- 1
phsource/intonation View File

@@ -99,7 +99,7 @@ tune c3
prehead 46 57
headenv fall 16
head 4 80 30 -5 -15
headextend 25 63 38 13 0
headextend 0 63 38 13 0
nucleus0 fall-rise 75 40
endtune

@@ -122,3 +122,4 @@ headextend 16 82 50 32 16
nucleus0 fall 92 8
nucleus fall 92 80 76 8
endtune


+ 6
- 1
phsource/ph_afrikaans View File

@@ -25,6 +25,7 @@ endphoneme

phoneme a // short A
vowel starttype #a endtype #a
ipa ɐ
length 140
FMT(vowel/V_2)
endphoneme
@@ -38,6 +39,7 @@ endphoneme

phoneme I // short I, Schwa
vowel starttype #@ endtype #@
ipa ə
length 140
IF nextPh(r/) THEN
Length 190
@@ -106,6 +108,7 @@ endphoneme

phoneme e@ // long E
vowel starttype #i endtype #@
ipa iə
length 230
FMT(vdiph/i@_2)
endphoneme
@@ -121,6 +124,7 @@ endphoneme

phoneme o@ // long O
vowel starttype #u endtype #@
ipa ʊə
length 250
FMT(vdiph2/o@)
endphoneme
@@ -165,6 +169,7 @@ endphoneme

phoneme eI
vowel starttype #e endtype #i
ipa ɛɪ
length 170
IfNextVowelAppend(;)
FMT(vdiph/@i_2)
@@ -181,6 +186,7 @@ endphoneme

phoneme oI
vowel starttype #o endtype #i
ipa ʊɪ
length 290
IfNextVowelAppend(;)
FMT(vdiph/oi_2)
@@ -325,4 +331,3 @@ phoneme c // used in -tjie
WAV(ustop/ki)
endphoneme



+ 1
- 0
phsource/ph_catalan View File

@@ -12,6 +12,7 @@ endphoneme

phoneme a#
vowel starttype #@ endtype #@
ipa ɐ
unstressed
length 170
FMT(vowel/a#_3)

+ 1
- 8
phsource/ph_croatian View File

@@ -230,13 +230,6 @@ phoneme x
endphoneme


phoneme r- // syllabic r
vowel starttype #@ endtype #@
length 240
FMT(vowelr/r-voc)
endphoneme


phoneme R
import_phoneme base/R
endphoneme
@@ -245,7 +238,7 @@ endphoneme
phoneme r*
vowel nonsyllabic
unstressed
ipa r
ipa NULL
length 50
starttype #@ endtype #@
AppendPhoneme(*)

+ 5
- 1
phsource/ph_english View File

@@ -204,6 +204,7 @@ endphoneme

phoneme i // optional variant of [I] for end of words
vowel starttype #i endtype #i
ipa ɪ
length 140
IfNextVowelAppend(;)
FMT(vowel/ii_en)
@@ -334,7 +335,7 @@ endphoneme
phoneme aI
vowel starttype #a endtype #i
length 240
IF nextPh(#a) OR nextPh(#o) THEN
IF nextPh(#a) THEN
AppendPhoneme(;)
ENDIF
FMT(vdiph/ai_2)
@@ -383,6 +384,9 @@ phoneme U@
vowel starttype #u endtype #@
length 200
IfNextVowelAppend(r-)
IF thisPh(isUnstressed) THEN
FMT(vdiph2/8@)
ENDIF
FMT(vdiph2/uu@)
endphoneme


+ 123
- 29
phsource/ph_french View File

@@ -1,7 +1,7 @@
//====================================================
// French
//====================================================
// Updated 2010-07-16 Michel Such <[email protected]>
// Updated 2010-07-25 Michel Such <[email protected]>

phoneme #l virtual
// Used for l and l/
@@ -24,7 +24,7 @@ endphoneme
procedure pre_r
IF prevPh(y) THEN
VowelEnding(vwl_fr/y2r)
ELIF prevPh(E) OR prevPh(E2) THEN
ELIF prevPh(E) THEN
VowelEnding(vwl_fr/e_2r)
ELIF prevPh(A~) THEN
VowelEnding(vwl_fr/aa2r)
@@ -47,7 +47,7 @@ endprocedure

procedure post_r

IF nextPh(E) OR nextPh(E2) THEN
IF nextPh(E) THEN
VowelStart(vwl_fr/re2)
ELIF nextPh(W) THEN
VowelStart(vwl_fr/r@2)
@@ -285,6 +285,11 @@ phoneme a
endphoneme


phoneme a# // For english words
import_phoneme en/a#
endphoneme


phoneme e
vowel starttype #e endtype #e

@@ -313,14 +318,6 @@ phoneme E
endphoneme


phoneme E2 // Between e and E
vowel starttype #e endtype #e
length 170

FMT(vowel/e_9)
endphoneme


phoneme i
vowel starttype #i endtype #i
palatal
@@ -347,15 +344,13 @@ phoneme i
endphoneme


phoneme I // longer than i
vowel starttype #i endtype #i
palatal
length 240
ipa i
phoneme I // For english words
import_phoneme en/I
endphoneme

IfNextVowelAppend(;)

FMT(vowel/i_3)
phoneme I2 // For english words
import_phoneme en/I2
endphoneme


@@ -396,18 +391,22 @@ phoneme O
vowel starttype #o endtype #o
length 170

IF nextPhW(z) OR nextPhW(z2) OR nextPhW(z3) THEN
ChangePhoneme(o)
IF thisPh(isFinalVowel) THEN
FMT(vowel/o_mid2)
ENDIF
IF nextPhW(#l) AND next2Ph(isNotVowel) THEN
FMT(vowel/o_mid2)
ENDIF
IF nextPhW(#r) AND next2Ph(isNotVowel) THEN
FMT(vowel/o_mid2)
ENDIF

FMT(vowel/o_mid2)
FMT(vowel/o_mid)
endphoneme


phoneme o3 // almost like english oU
vowel starttype #@ endtype #u
length 220
FMT(vdiph/@u_3)
phoneme oU
import_phoneme en/oU
endphoneme


@@ -451,6 +450,15 @@ phoneme W
endphoneme


phoneme W2 // For english words
vowel starttype #@ endtype #@
length 100
unstressed

FMT(vowel/@_6)
endphoneme


phoneme Y
vowel starttype #@ endtype #@
length 170
@@ -714,14 +722,14 @@ phoneme p
Vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=22

IF nextPh(isPause2) THEN
WAV(ustop/p_, 70)
WAV(ustop/p_, 80)
ELIF nextPh(@-) THEN
WAV(ustop/p_unasp, 60)
WAV(ustop/p_unasp, 70)
ELIF nextPh(#l) THEN
WAV(ustop/pl, 30)
WAV(ustop/pl, 40)
ELIF nextPh(#r) THEN
length 40
WAV(ustop/p_, 60)
WAV(ustop/p_, 70)
ENDIF
WAV(ustop/p_unasp_, 90)
endphoneme
@@ -849,6 +857,14 @@ phoneme v
FMT(voc/v) addWav(vocw/v, 60)
endphoneme

phoneme V // For english words
vowel starttype #a endtype #@
length 140

ChangeIfDiminished(@)
FMT(vowel/V_2)
endphoneme


phoneme z
vcd alv frc sibilant
@@ -895,4 +911,82 @@ phoneme z3 // "six" and "dix". [s] before pause, [z] before vowel, else []
endphoneme


// translate from English to French phonemes
equivalents en
remove_stress
0 O
3 W r
3: W : r
@ W
@- W
@2 W
@5 W
@L W l
a a
a# a#
A: a :
A@ a r
aa a :
aI a j
aI@ a j W2 r
aU a w
aU@ a w @
A~ A~
E E
e: e
e@ E : r
eI E : j/
i i
I I
I2 I2
i: i :
i@ i r
i@3 i : r
O O
O: O :
o: o
O@ O r
o@ O r
OI O j
oU oU
O~ O~
U u
u: u:
U@ u r
V V
IR i r
VR W r
b b
C C
d d
D D
dZ dZ
f f
g g
h h
j j
k k
l l
l# l#
m m
n n
N N
n^ n^
p p
Q Q
r r
r- r
s s
S S
t t
T T
t2 t
tS tS
v v
w w/
x x
z z
Z Z
endphoneme



+ 79
- 1
phsource/ph_german View File

@@ -110,7 +110,7 @@ endphoneme
phoneme A // reduces to [a] if not stressed
vowel starttype #a endtype #a
length 250
ChangeIfNotStressed(a)
ChangeIfUnstressed(a)
FMT(vowel/aa_6)
endphoneme

@@ -377,3 +377,81 @@ phoneme UR
endphoneme




// translate from English to German phonemes
equivalents en
0 O
3 3
3: W :
@ @
@- @-
@2 @
@5 @
@L U l
a a
a# a
A: A:
A@ A: r
aa a
aI aI
aI@ aI 3
aU aU
aU@ aU 3
A~ O n
E E
e: e:
e@ E: r
eI e:
i I
I I
I2 I
i: i:
i@ i: 3
i@3 i: r
O O
O: O :
o: o:
O@ O : r
o@ O : r
OI OY
oU o:
O~ O n
U U
u: u:
U@ U r
V W
IR I r
VR W r
b b
C C
d d
D D
dZ dZ
f f
g g
h h
j j
k k
l l
l# l#
m m
n n
N N
n^ n^
p p
Q Q
r r
r- r
s s
S S
t t
T T
t2 t
tS tS
v v
w w
x x
z z
Z Z
endphoneme

+ 7
- 0
phsource/ph_hindi View File

@@ -477,5 +477,12 @@ phoneme gh
FMT(g2/xg) addWav(ustop/k_asp, 70)
endphoneme

//================

phoneme #X2 // click, use for indicating combining long vowels
vls alv frc sibilant
lengthmod 3
WAV(ustop/percus02)
endphoneme



+ 2
- 2
phsource/ph_slovak View File

@@ -102,14 +102,14 @@ endphoneme



phoneme r-
phoneme r- // syllabic r
vowel starttype #@ endtype #@
ipa rU+0329
length 220
FMT(vowelr/r-voc)
endphoneme

phoneme r:
phoneme r: // syllabic r
vowel starttype #@ endtype #@
ipa rU+0329ː
length 300

+ 2
- 0
phsource/ph_swedish View File

@@ -53,6 +53,7 @@ endphoneme

phoneme E-
vowel starttype #@ endtype #@
ipa ə
unstressed
length 140
FMT(vowel/ee#_2)
@@ -74,6 +75,7 @@ endphoneme

phoneme u-
vowel starttype #u endtype #u
ipa ʉ
length 200
FMT(vowel/u#_2)
endphoneme

+ 8
- 0
phsource/ph_tamil View File

@@ -85,8 +85,15 @@ phoneme u
FMT(vowel/u_6)
endphoneme

phoneme u2 // as [u] but don't reduce
vowel starttype #u endtype #u
length 110
FMT(vowel/u_6)
endphoneme

phoneme U
vowel starttype #u endtype #u
ipa ʉ
length 110
FMT(vowel/u#_3)
endphoneme
@@ -103,6 +110,7 @@ endphoneme

phoneme U:
vowel starttype #u endtype #u
ipa ʉ
length 240
FMT(vowel/u#_3)
endphoneme

+ 4
- 1
phsource/ph_turkish View File

@@ -84,14 +84,17 @@ phoneme u
FMT(vowel/u_2)
endphoneme


phoneme U
vowel starttype #u endtype #u
length 150
FMT(vowel/uu_2)
endphoneme

phoneme @ // previously u#

phoneme @
vowel starttype #@ endtype #@
ipa ɯ
length 150
FMT(vowel/u#_7)
endphoneme

+ 6
- 0
phsource/phonemes View File

@@ -198,6 +198,7 @@ endphoneme

phoneme m-
vowel starttype #@ endtype #@
ipa mU+0329
length 170

IF thisPh(isWordStart) THEN
@@ -211,6 +212,7 @@ endphoneme

phoneme n-
vowel starttype #@ endtype #@
ipa nU+0329
length 170

IF thisPh(isWordStart) THEN
@@ -224,6 +226,7 @@ endphoneme

phoneme N-
vowel starttype #e endtype #e
ipa ŋU+0329
length 190
FMT(nn/nn-syl)
endphoneme
@@ -1811,3 +1814,6 @@ include ph_northern-sotho

phonemetable ht fr
include ph_haitian

phonemetable az tr
include ph_azerbaijani

BIN
phsource/vdiph2/vowelchart.png View File


BIN
phsource/vowel/& View File


+ 8
- 8
platforms/big_endian/espeak-phoneme-data.c View File

@@ -288,7 +288,7 @@ void swap_phonindex (const char *infile, const char *outfile)
{//==========================================================
FILE *in, *out;
char buf_4[4];
unsigned int val;
unsigned short val;

in = fopen (infile, "rb");
if (in == NULL) {
@@ -324,7 +324,7 @@ void swap_phonindex (const char *infile, const char *outfile)
void swap_phontab (const char *infile, const char *outfile)
{//========================================================
FILE *in, *out;
char buf_4[4];
char buf_8[8];
int i, n_phoneme_tables;

in = fopen (infile, "rb");
@@ -339,18 +339,18 @@ void swap_phontab (const char *infile, const char *outfile)
exit (1);
}

fread (buf_4, 4, 1, in);
fwrite (buf_4, 4, 1, out);
n_phoneme_tables = buf_4[0];
fread (buf_8, 4, 1, in);
fwrite (buf_8, 4, 1, out);
n_phoneme_tables = buf_8[0];

for (i = 0; i < n_phoneme_tables; i++) {
int n_phonemes, j;
char tab_name[N_PHONEME_TAB_NAME];

fread (buf_4, 4, 1, in);
fwrite (buf_4, 4, 1, out);
fread (buf_8, 8, 1, in);
fwrite (buf_8, 8, 1, out);

n_phonemes = buf_4[0];
n_phonemes = buf_8[0];

fread (tab_name, N_PHONEME_TAB_NAME, 1, in);
fwrite (tab_name, N_PHONEME_TAB_NAME, 1, out);

+ 171
- 27
src/compiledata.cpp View File

@@ -149,6 +149,7 @@ enum {
kPROCEDURE,
kENDPHONEME,
kENDPROCEDURE,
kEQUIVALENTS,
kPHONEMENUMBER,
kPHONEMETABLE,
kINCLUDE,
@@ -243,6 +244,7 @@ static keywtab_t keywords[] = {
{"procedure", tSTATEMENT, kPROCEDURE},
{"endphoneme", tSTATEMENT, kENDPHONEME},
{"endprocedure", tSTATEMENT, kENDPROCEDURE},
{"equivalents", tSTATEMENT, kEQUIVALENTS},
{"import_phoneme", tSTATEMENT, kIMPORT_PH},
{"stress_type",tSTATEMENT, kSTRESSTYPE},
{"starttype", tSTATEMENT, kSTARTTYPE},
@@ -363,6 +365,10 @@ static PHONEME_TAB *phoneme_tab2;
static int phoneme_flags;
static int place_articulation;

static char *p_equivalence;
static char equivalence_buf[20000];


#define N_PROCS 50
int n_procs;
int proc_addr[N_PROCS];
@@ -2479,6 +2485,23 @@ static int CompileSwitch(int type)



static PHONEME_TAB_LIST *FindPhonemeTable(const char *string)
{//==========================================================
int ix;

for(ix=0; ix<n_phoneme_tabs; ix++)
{
if(strcmp(phoneme_tab_list2[ix].name, string) == 0)
{
return(&phoneme_tab_list2[ix]);
}
}
error("Unknown phoneme table: '%s'",string);
return(NULL);
} // end of FindPhonemeTable



static PHONEME_TAB *FindPhoneme(const char *string)
{//================================================
PHONEME_TAB_LIST *phtab = NULL;
@@ -2487,7 +2510,7 @@ static PHONEME_TAB *FindPhoneme(const char *string)
char *phname;
char buf[200];

// is this the name of a phoneme which is ijn scope
// is this the name of a phoneme which is in scope
if((strlen(string) <= 4) && ((ix = LookupPhoneme(string,0)) != -1))
{
return(&phoneme_tab2[ix]);
@@ -2500,17 +2523,9 @@ static PHONEME_TAB *FindPhoneme(const char *string)
*phname++ = 0;
}

for(ix=0; ix<n_phoneme_tabs; ix++)
{
if(strcmp(phoneme_tab_list2[ix].name,buf) == 0)
{
phtab = &phoneme_tab_list2[ix];
break;
}
}
phtab = FindPhonemeTable(buf);
if(phtab == NULL)
{
error("Unknown phoneme table: '%s'",buf);
return(NULL); // phoneme table not found
}

@@ -3025,6 +3040,7 @@ static void WritePhonemeTables()
fputc(phoneme_tab_list2[ix].includes,f_phtab);
fputc(0,f_phtab);
fputc(0,f_phtab);
Write4Bytes(f_phtab, phoneme_tab_list2[ix].equivalence_tables); // byte index into phondata for equivalence tables

fwrite(phoneme_tab_list2[ix].name,1,N_PHONEME_TAB_NAME,f_phtab);

@@ -3047,6 +3063,8 @@ static void WritePhonemeTables()
static void EndPhonemeTable()
{//==========================
int ix;
int *pw;
int length;

if(n_phoneme_tabs == 0)
return;
@@ -3061,10 +3079,24 @@ static void EndPhonemeTable()
fprintf(f_errors,"%3d: Phoneme [%s] not declared, referenced at line %d\n",linenum,
WordToString(phoneme_tab2[ix].mnemonic),int(phoneme_tab2[ix].program));
error_count++;
phoneme_tab2[ix].type = 0; // prevent the error message repeating
}
}

n_phcodes_list[n_phoneme_tabs-1] = n_phcodes;

if((length = p_equivalence - equivalence_buf) > 0)
{
// terminate the list of phoneme equivalence tables
pw = (int *)p_equivalence;
pw[0] = 0;

// write the equivalence data into phondata, and remember it's address
ix = ftell(f_phdata);
fprintf(f_phcontents,"Q 0x%.5x %s\n", ix, phoneme_tab_list2[n_phoneme_tabs-1].name);
phoneme_tab_list2[n_phoneme_tabs-1].equivalence_tables = ix;
fwrite(equivalence_buf, length+4, 1, f_phdata);
}
}


@@ -3092,11 +3124,12 @@ static void StartPhonemeTable(const char *name)
if(gui_flag)
progress->Update(n_phoneme_tabs);

memset(&phoneme_tab_list2[n_phoneme_tabs], 0, sizeof(PHONEME_TAB_LIST));
phoneme_tab_list2[n_phoneme_tabs].phoneme_tab_ptr = phoneme_tab2 = p;
memset(phoneme_tab_list2[n_phoneme_tabs].name, 0, N_PHONEME_TAB_NAME);
strncpy0(phoneme_tab_list2[n_phoneme_tabs].name, name, N_PHONEME_TAB_NAME);
n_phcodes = 1;
phoneme_tab_list2[n_phoneme_tabs].includes = 0;
p_equivalence = equivalence_buf;

if(n_phoneme_tabs > 0)
{
@@ -3131,6 +3164,111 @@ static void StartPhonemeTable(const char *name)
} // end of StartPhonemeTable


static void CompileEquivalents()
{//=============================
// a list of phonemes in another language and the equivalent phoneme strings in this language

int ix;
int n_names;
int n_bytes;
int foreign_phoneme;
int foreign_error = 0;
int remove_stress = 0;
char *p_start;
char *p;
int foreign_table;
char foreign_table_name[40];
char line_buf[80];
char names[6][80];
char phcode[7];
char save_voice_name[80];

NextItem(tSTRING);
strcpy(foreign_table_name, item_string);
strcpy(save_voice_name,voice_name2);

if((foreign_table = SelectPhonemeTableName(foreign_table_name)) < 0)
{
error("Unknown phoneme table '%s'", foreign_table_name);
foreign_error = 1;
foreign_phoneme = 0;
}

p_start = p_equivalence;
p_equivalence += 8;

p_start[0] = foreign_table;

linenum--;
while(!feof(f_in))
{
linenum++;
if(fgets(line_buf, sizeof(line_buf), f_in) == NULL)
break;

if((p = strstr(line_buf,"//")) != NULL)
*p = 0;

for(ix=0; ix<6; ix++)
names[ix][0] = 0;
n_names = sscanf(line_buf,"%s %s %s %s %s %s",names[0],names[1],names[2],names[3],names[4],names[5]);
if(n_names < 1)
continue;

if(strcmp(names[0],"endphoneme") == 0)
break;

if(strcmp(names[0],"remove_stress") == 0)
{
remove_stress = 1;
continue;
}

if(p_equivalence > &equivalence_buf[sizeof(equivalence_buf) - 16])
{
error("'equivalents' tables are too large",NULL);
break;
}

if(foreign_error == 0)
{
phcode[0] = foreign_phoneme = LookupPhonemeString(names[0]);
if(foreign_phoneme == 0)
{
sprintf(line_buf,"%s/%s", foreign_table_name, names[0]);
error("Unknown phoneme '%s'", line_buf);
}
}

for(ix=1; ix<n_names; ix++)
{
phcode[ix] = LookupPhoneme(names[ix], 1);
}

// only write a translation if it has an effect
if((n_names > 2) || (phcode[0] != phcode[1]))
{
// write: foreign phoneme number, then a string of local phoneme numbers
memcpy(p_equivalence, phcode, n_names);
p_equivalence += n_names;
*p_equivalence++ = 0;
}
}
*p_equivalence++ = 0;

p_equivalence = (char *)((int)(p_equivalence + 3) & ~0x3); // align to word boundary
n_bytes = p_equivalence - p_start;
p_start[1] = remove_stress;
n_bytes = n_bytes / 4;
p_start[2] = n_bytes >> 8; // index of next table
p_start[3] = n_bytes;

LoadVoice(voice_name2,0); // reset the original phoneme table
LoadVoiceVariant(save_voice_name,0);
} // end of CompileEquivalents



static void CompilePhonemeFiles()
{//==============================
int item;
@@ -3161,8 +3299,9 @@ static void CompilePhonemeFiles()

item = NextItem(tKEYWORD);

if(item == kINCLUDE)
switch(item)
{
case kINCLUDE:
NextItem(tSTRING);
sprintf(buf,"%s%s",path_source,item_string);
if((stack_ix < N_STACK) && (f = fopen_log(f_errors,buf,"rb")) != NULL)
@@ -3176,32 +3315,36 @@ static void CompilePhonemeFiles()
strncpy0(current_fname,item_string,sizeof(current_fname));
linenum = 1;
}
}
else
if(item == kPHONEMETABLE)
{
break;

case kPHONEMETABLE:
EndPhonemeTable();
NextItem(tSTRING); // name of the new phoneme table
StartPhonemeTable(item_string);
}
else
if(item == kPHONEMESTART)
{
break;

case kPHONEMESTART:
if(n_phoneme_tabs == 0)
{
Error("phonemetable is missing");
return;
}
CompilePhoneme(1);
}
else
if(item == kPROCEDURE)
{
break;

case kPROCEDURE:
CompilePhoneme(0);
break;

case kEQUIVALENTS:
CompileEquivalents();
break;

default:
if(!feof(f_in))
Error("Keyword 'phoneme' expected");
break;
}
else
if(!feof(f_in))
Error("Keyword 'phoneme' expected");
}
phoneme_tab2[n_phcodes+1].mnemonic = 0; // terminator
} // end of CompilePhonemeFiles
@@ -3275,6 +3418,7 @@ memset(markers_used,0,sizeof(markers_used));
"# S - A SPECT_SEQ structure\n"
"# W - A wavefile segment\n"
"# E - An envelope\n"
"# Q - Phoneme equivalence tables\n"
"#\n"
"# Address is the displacement within phondata of this item\n"
"#\n"

+ 12
- 7
src/compiledict.cpp View File

@@ -53,6 +53,7 @@ static char *hash_chains[N_HASH_DICT];
static char letterGroupsDefined[N_LETTER_GROUPS];

MNEM_TAB mnem_rules[] = {
{"unpr", 0x01},
{"w_alt2", 0x12},
{"w_alt3", 0x13},
{"w_alt", 0x11}, // note: put longer names before their sub-strings
@@ -192,8 +193,8 @@ char *print_dictionary_flags(unsigned int *flags)



char *DecodeRule(const char *group_chars, int group_length, char *rule)
{//====================================================================
char *DecodeRule(const char *group_chars, int group_length, char *rule, int control)
{//=================================================================================
/* Convert compiled match template to ascii */

unsigned char rb;
@@ -268,16 +269,20 @@ char *DecodeRule(const char *group_chars, int group_length, char *rule)
if(rb == RULE_DOLLAR)
{
p[0] = '$';
name = LookupMnemName(mnem_rules, *rule++);
strcpy(&p[1],name);
p += (strlen(name)+1);
value = *rule++ & 0xff;
if((value != 0x01) || (control & FLAG_UNPRON_TEST))
{
p[0] = '$';
name = LookupMnemName(mnem_rules, value);
strcpy(&p[1],name);
p += (strlen(name)+1);
}
c = ' ';
}
else
if(rb == RULE_ENDING)
{
static const char *flag_chars = "ei vtfq t";
static const char *flag_chars = "eipvdfq tba ";
flags = ((rule[0] & 0x7f)<< 8) + (rule[1] & 0x7f);
suffix_char = 'S';
if(flags & (SUFX_P >> 8))

+ 77
- 128
src/dictionary.cpp View File

@@ -38,15 +38,16 @@ int dictionary_skipwords;
char dictionary_name[40];

extern char *print_dictionary_flags(unsigned int *flags);
extern char *DecodeRule(const char *group_chars, int group_length, char *rule);
extern char *DecodeRule(const char *group_chars, int group_length, char *rule, int control);

// accented characters which indicate (in some languages) the start of a separate syllable
//static const unsigned short diereses_list[7] = {L'ä',L'ë',L'ï',L'ö',L'ü',L'ÿ',0};
static const unsigned short diereses_list[7] = {0xe4,0xeb,0xef,0xf6,0xfc,0xff,0};

// convert characters to an approximate 7 bit ascii equivalent
// used for checking for vowels
static unsigned char remove_accent[] = {
// used for checking for vowels (up to 0x259=schwa)
#define N_REMOVE_ACCENT 0x25e
static unsigned char remove_accent[N_REMOVE_ACCENT] = {
'a','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i', // 0c0
'd','n','o','o','o','o','o', 0, 'o','u','u','u','u','y','t','s', // 0d0
'a','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i', // 0e0
@@ -73,7 +74,9 @@ static unsigned char remove_accent[] = {
'r','r','r','r','u','u','u','u','s','s','t','t','y','y','h','h', // 210
'n','d','o','o','z','z','a','a','e','e','o','o','o','o','o','o', // 220
'o','o','y','y','l','n','t','j','d','q','a','c','c','l','t','s', // 230
'z', 0 };
'z', 0, 0, 'b','u','v','e','e','j','j','q','q','r','r','y','y', // 240
'a','a','a','b','o','c','d','d','e','e','e','e','e','e' };




@@ -86,8 +89,8 @@ void strncpy0(char *to,const char *from, int size)
}


static int reverse_word_bytes(int word)
{//=============================
int Reverse4Bytes(int word)
{//========================
// reverse the order of bytes from little-endian to big-endian
#ifdef ARCH_BIG
int ix;
@@ -170,9 +173,9 @@ static void InitGroups(Translator *tr)
pw = (unsigned int *)(tr->langopts.replace_chars);
while(*pw != 0)
{
*pw = reverse_word_bytes(*pw);
*pw = Reverse4Bytes(*pw);
pw++;
*pw = reverse_word_bytes(*pw);
*pw = Reverse4Bytes(*pw);
pw++;
}
#endif
@@ -275,7 +278,7 @@ int LoadDictionary(Translator *tr, const char *name, int no_error)


pw = (int *)(tr->data_dictlist);
length = reverse_word_bytes(pw[1]);
length = Reverse4Bytes(pw[1]);

if(size <= (N_HASH_DICT + sizeof(int)*2))
{
@@ -283,10 +286,10 @@ int LoadDictionary(Translator *tr, const char *name, int no_error)
return(2);
}

if((reverse_word_bytes(pw[0]) != N_HASH_DICT) ||
if((Reverse4Bytes(pw[0]) != N_HASH_DICT) ||
(length <= 0) || (length > 0x8000000))
{
fprintf(stderr,"Bad data: '%s' (%x length=%x)\n",fname,reverse_word_bytes(pw[0]),length);
fprintf(stderr,"Bad data: '%s' (%x length=%x)\n",fname,Reverse4Bytes(pw[0]),length);
return(2);
}
tr->data_dictrules = &(tr->data_dictlist[length]);
@@ -742,7 +745,7 @@ static int IsLetter(Translator *tr, int letter, int group)
}
else
{
if((letter >= 0xc0) && (letter <= 0x241))
if((letter >= 0xc0) && (letter < N_REMOVE_ACCENT))
return(tr->letter_bits[remove_accent[letter-0xc0]] & (1L << group));
}

@@ -753,107 +756,31 @@ static int IsLetter(Translator *tr, int letter, int group)
}


static int IsVowel(Translator *tr, int letter)
{//===========================================
return(IsLetter(tr, letter, 0));
int IsVowel(Translator *tr, int letter)
{//====================================
return(IsLetter(tr, letter, LETTERGP_VOWEL2));
}




static int Unpronouncable_en(Translator *tr, char *word)
{//=====================================================
/* Determines whether a word in 'unpronouncable', i.e. whether it should
be spoken as individual letters.

This function is language specific.
*/

static int Unpronouncable2(Translator *tr, char *word)
{//===================================================
int c;
int vowel_posn=9;
int index;
int count;
int ix;
int apostrophe=0;

static unsigned char initials_bitmap[86] = {
0x00, 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x88, // 0
0x20, 0x24, 0x20, 0x80, 0x10, 0x00, 0x00, 0x00,
0x00, 0x28, 0x08, 0x00, 0x88, 0x22, 0x04, 0x00, // 16
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x88, 0x22, 0x04, 0x00, 0x02, 0x00, 0x04, // 32
0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x28, 0x8a, 0x03, 0x00, 0x00, 0x40, 0x00, // 48
0x02, 0x00, 0x41, 0xca, 0xbb, 0x06, 0x20, 0x80,
0x91, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, // 64
0x08, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x22, 0x00, 0x01, 0x00, };


// words which we pass through to the dictionary, even though they look unpronouncable
static const char *exceptions[] = {
"'s ", "st ","nd ","rd ","th ",NULL };

if((*word == ' ') || (*word == 0))
return(0);

for(ix=0; exceptions[ix] != NULL; ix++)
{
// Seemingly uncpronouncable words, but to be looked in the dictionary rules instead
if(memcmp(word,exceptions[ix],3)==0)
return(0);
}

index=0;
count=0;
for(;;)
{
index += utf8_in(&c,&word[index]);
count++;

if((c==0) || (c==' ') || (c == '\''))
break;

if(IsVowel(tr, c) || (c == 'y'))
{
vowel_posn = count;
break;
}

if(c == '\'')
apostrophe = 1;
else
if(!IsAlpha(c))
return(0); // letter (not vowel) outside Latin character range or apostrophe, abort test
}
if((vowel_posn > 5) || ((word[0]!='s') && (vowel_posn > 4)))
return(1); // no vowel, or no vowel in first four letters

/* there is at least one vowel, is the initial letter combination valid ? */

if(vowel_posn < 3)
return(0); /* vowel in first two letters, OK */

if(apostrophe)
return(0); // first two letters not a-z, abort test

index = (word[0]-'a') * 26 + (word[1]-'a');
if(initials_bitmap[index >> 3] & (1L << (index & 7)))
return(0);
else
return(1); /****/
} /* end of Unpronounceable */


static int Unpronouncable_de(Translator *tr, char *word)
{//=====================================================
if(memcmp(word,"tsch",4)==0)
return(0);
return(2);
int end_flags;
char ph_buf[N_WORD_PHONEMES];

ph_buf[0] = 0;
c = word[-1];
word[-1] = ' '; // ensure there is a space before the "word"
end_flags = TranslateRules(tr, word, ph_buf, sizeof(ph_buf), NULL, FLAG_UNPRON_TEST, NULL);
word[-1] = c;
if((end_flags == 0) || (end_flags & SUFX_UNPRON))
return(1);
return(0);
}



int Unpronouncable(Translator *tr, char *word)
{//===========================================
/* Determines whether a word in 'unpronouncable', i.e. whether it should
@@ -868,18 +795,6 @@ int Unpronouncable(Translator *tr, char *word)
int index;
int count;
int apostrophe=0;
int result=2; // unknown

if(tr->translator_name == L('e','n'))
{
return(Unpronouncable_en(tr,word));
}
if(tr->translator_name == L('d','e'))
{
result = Unpronouncable_de(tr,word);
}
if(result < 2)
return(result);

utf8_in(&c,word);
if((tr->letter_bits_offset > 0) && (c < 0x241))
@@ -899,9 +814,12 @@ int Unpronouncable(Translator *tr, char *word)
for(;;)
{
index += utf8_in(&c,&word[index]);
if((c==0) || (c==' ') || (c == '\''))
if((c==0) || (c==' '))
break;

if((c=='\'') && (count > 1))
break; // "tv'" but not "l'"

if(count==0)
c1 = c;
count++;
@@ -916,11 +834,14 @@ int Unpronouncable(Translator *tr, char *word)
apostrophe = 1;
else
if(!iswalpha(c))
return(0); // letter (not vowel) outside a-z range or apostrophe, abort test
return(0);
}

if((vowel_posn < 9) && (tr->langopts.param[LOPT_UNPRONOUNCABLE] == 2))
return(0); // option means allow any word with a vowel
if((vowel_posn > 2) && (tr->langopts.param[LOPT_UNPRONOUNCABLE] == 2))
{
// Lookup unpronounable rules in *_rules
return(Unpronouncable2(tr, word));
}

if(c1 == tr->langopts.param[LOPT_UNPRONOUNCABLE])
vowel_posn--; // disregard this as the initial letter when counting
@@ -1813,6 +1734,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_

int match_type; /* left, right, or consume */
int failed;
int unpron_ignore;
int consumed; /* number of letters consumed from input */
int count; /* count through rules in the group */
int syllable_count;
@@ -1858,6 +1780,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
/* search through dictionary rules */
while(rule[0] != RULE_GROUP_END)
{
unpron_ignore = word_flags & FLAG_UNPRON_TEST;
match_type=0;
consumed = 0;
letter = 0;
@@ -1874,6 +1797,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_

/* work through next rule until end, or until no-match proved */
rule_start = rule;

failed = 0;
while(!failed)
{
@@ -1904,6 +1828,14 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
break;
case RULE_PRE:
match_type = RULE_PRE;
if(word_flags & FLAG_UNPRON_TEST)
{
// checking the start of the word for unpronouncable character sequences, only
// consider rules which explicitly match the start of a word
if(rule[0] != ' ')
failed = 1;
unpron_ignore = 0;
}
break;
case RULE_POST:
match_type = RULE_POST;
@@ -2046,8 +1978,14 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_

case RULE_DOLLAR:
command = *rule++;
if(command == 0x01)
{
match.end_type = SUFX_UNPRON; // $unpron
}
else
if((command & 0xf0) == 0x10)
{
// $w_alt
if(dict_flags & (1 << (BITNUM_FLAG_ALT + (command & 0xf))))
add_points = 23;
else
@@ -2056,6 +1994,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
else
if((command & 0xf0) == 0x20)
{
// $p_alt
// make a copy of the word up to the post-match characters
ix = *word - word_start + consumed + group_length + 1;
memcpy(word_buf, word_start-1, ix);
@@ -2151,8 +2090,8 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
break;

case RULE_DEL_FWD:
// find the next 'e' in the word and replace by ''
for(p = *word + group_length; *p != ' '; p++)
// find the next 'e' in the word and replace by 'E'
for(p = *word + group_length; p < post_ptr; p++)
{
if(*p == 'e')
{
@@ -2366,9 +2305,11 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
match.points += add_points;
}

if(failed == 2)

if((failed == 2) && (unpron_ignore == 0))
{
/* matched OK, is this better than the last best match ? */

if(match.points >= best.points)
{
memcpy(&best,&match,sizeof(match));
@@ -2386,7 +2327,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
if(group_length > 1)
pts += 35; // to account for an extra letter matching
DecodePhonemes(match.phonemes,decoded_phonemes);
fprintf(f_trans,"%3d\t%s [%s]\n",pts,DecodeRule(group_chars, group_length, rule_start),decoded_phonemes);
fprintf(f_trans,"%3d\t%s [%s]\n",pts,DecodeRule(group_chars, group_length, rule_start, word_flags), decoded_phonemes);
}

}
@@ -2469,7 +2410,10 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c
wordbuf[ix] = c;
}
wordbuf[ix] = 0;
fprintf(f_trans,"Translate '%s'\n",wordbuf);
if(word_flags & FLAG_UNPRON_TEST)
fprintf(f_trans,"Unpronouncable? '%s'\n",wordbuf);
else
fprintf(f_trans,"Translate '%s'\n",wordbuf);
}

p = p_start;
@@ -2597,7 +2541,7 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c
}

// no match, try removing the accent and re-translating the word
if((letter >= 0xc0) && (letter <= 0x241) && ((ix = remove_accent[letter-0xc0]) != 0))
if((letter >= 0xc0) && (letter < N_REMOVE_ACCENT) && ((ix = remove_accent[letter-0xc0]) != 0))
{
// within range of the remove_accent table
if((p[-2] != ' ') || (p[n] != ' '))
@@ -2682,7 +2626,11 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c
strcpy(phonemes,match1.phonemes);
return(0);
}

if(word_flags & FLAG_UNPRON_TEST)
return(match1.end_type | 1);
match1.end_type &= ~SUFX_UNPRON;

if((match1.end_type != 0) && (end_phonemes != NULL))
{
/* a standard ending has been found, re-translate the word without it */
@@ -3524,7 +3472,8 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy)
if((strcmp(ending,"s")==0) || (strcmp(ending,"es")==0))
end_flags |= FLAG_SUFX_S;

if(strcmp(ending,"'s")==0)
// if(strcmp(ending,"'s")==0)
if(ending[0] == '\'')
end_flags &= ~FLAG_SUFX; // don't consider 's as an added suffix

return(end_flags);

+ 2
- 0
src/espeakedit.cpp View File

@@ -233,6 +233,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxMDIParentFrame)
EVT_MENU(MENU_LEXICON_DE, MyFrame::OnTools)
EVT_MENU(MENU_LEXICON_IT, MyFrame::OnTools)
EVT_MENU(MENU_LEXICON_IT2, MyFrame::OnTools)
EVT_MENU(MENU_LEXICON_TEST, MyFrame::OnTools)
EVT_MENU(MENU_TO_UTF8, MyFrame::OnTools)
EVT_MENU(MENU_COUNT_WORDS, MyFrame::OnTools)
EVT_MENU(MENU_TEST, MyFrame::OnTools)
@@ -608,6 +609,7 @@ void MyFrame::OnTools(wxCommandEvent& event)
case MENU_LEXICON_DE:
case MENU_LEXICON_IT:
case MENU_LEXICON_IT2:
case MENU_LEXICON_TEST:
CompareLexicon(event.GetId()); // Compare a lexicon with _rules translation
break;


+ 72
- 0
src/extras.cpp View File

@@ -763,6 +763,75 @@ void Lexicon_De()
}


extern int IsVowel(Translator *tr, int letter);

void Lexicon_Test()
{//================
int c1, c2, c3;
char *p;
int prev_c1=0;
int prev_c2=0;
int prev_c3 = 0;
FILE *f_in;
FILE *f_out;
char buf[200];

wxString s_fname = wxFileSelector(_T("List of UTF-8 words with Combining Grave Accent U+300 to indicate stress"),path_dir1,
_T(""),_T(""),_T("*"),wxOPEN);
if(s_fname.IsEmpty())
return;
strcpy(buf,s_fname.mb_str(wxConvLocal));
path_dir1 = wxFileName(s_fname).GetPath();

if((f_in = fopen(buf,"r")) == NULL)
{
wxLogError(_T("Can't read file: ") + wxString(buf,wxConvLocal));
return;
}

strcat(buf,"_1");
if((f_out = fopen(buf,"w")) == NULL)
{
wxLogError(_T("Can't write file: ") + wxString(buf,wxConvLocal));
fclose(f_in);
return;
}

while(!feof(f_in))
{
if((p = fgets(buf,sizeof(buf),f_in)) == NULL)
break;

if(buf[0] == 0)
continue;

p += utf8_in(&c1, p);
p += utf8_in(&c2, p);
p += utf8_in(&c3, p);

c1 = towlower(c1);
c2 = towlower(c2);
c3 = towlower(c3);

if(IsVowel(translator, c1))
continue;
if(IsVowel(translator, c2))
continue;

if((prev_c1 != c1) || (prev_c2 != c2) || ((prev_c3 != c3) && !IsVowel(translator,c3)))
fputc('\n',f_out);
prev_c1 = c1;
prev_c2 = c2;
prev_c3 = c3;
fprintf(f_out,"%s",buf);

}
fclose(f_in);
fclose(f_out);
} // end of Lexicon_Test



void Lexicon_Bg()
{//==============
// Bulgarian: compare stress markup in a list of words with lookup using bg_rules
@@ -1275,6 +1344,9 @@ void CompareLexicon(int id)
case MENU_LEXICON_IT2:
Lexicon_It(2);
break;
case MENU_LEXICON_TEST:
Lexicon_Test();
break;
}
} // end of CompareLexicon


+ 1
- 0
src/main.h View File

@@ -161,6 +161,7 @@ enum {
MENU_LEXICON_DE,
MENU_LEXICON_IT,
MENU_LEXICON_IT2,
MENU_LEXICON_TEST,
MENU_TO_UTF8,
MENU_COUNT_WORDS,
MENU_TEST,

+ 1
- 0
src/menus.cpp View File

@@ -128,6 +128,7 @@ wxMenuBar *MakeMenu(int type, const char *dict_name)
lexicon_menu->Append(MENU_LEXICON_DE, _("German"));
lexicon_menu->Append(MENU_LEXICON_IT, _("Italian"));
lexicon_menu->Append(MENU_LEXICON_IT2, _("Italian, pass 2"));
// lexicon_menu->Append(MENU_LEXICON_TEST, _("Test"));

tools_menu = new wxMenu;
tools_menu->Append(MENU_VOWELCHART, _("Make &Vowels Chart"), vowelchart_menu);

+ 16
- 3
src/numbers.cpp View File

@@ -766,7 +766,7 @@ static int CheckDotOrdinal(Translator *tr, char *word, char *word_end, WORD_TAB
if(word_end[0] == '.')
utf8_in(&c2, &word_end[2]);
else
utf8_in(&c2, &word_end[1]);
utf8_in(&c2, &word_end[0]);

if((word_end[1] != 0) && ((c2 == 0) || (wtab[0].flags & FLAG_COMMA_AFTER) || IsAlpha(c2)))
{
@@ -850,8 +850,8 @@ int TranslateRoman(Translator *tr, char *word, char *ph_out, WORD_TAB *wtab)
flags[0] = 0;
flags[1] = 0;

if((tr->langopts.numbers & NUM_ROMAN_CAPITALS) && !(wtab[0].flags & FLAG_ALL_UPPER))
return(0);
if(((tr->langopts.numbers & NUM_ROMAN_CAPITALS) && !(wtab[0].flags & FLAG_ALL_UPPER)) || isdigit(word[-2]))
return(0); // not '2xx'

word_start = word;
while((c = *word++) != ' ')
@@ -889,6 +889,10 @@ int TranslateRoman(Translator *tr, char *word, char *ph_out, WORD_TAB *wtab)
prev = value;
n_digits++;
}

if(isdigit(word[0]))
return(0); // eg. 'xx2'
acc += prev;
if(acc < tr->langopts.min_roman)
return(0);
@@ -896,6 +900,7 @@ int TranslateRoman(Translator *tr, char *word, char *ph_out, WORD_TAB *wtab)
if(acc > tr->langopts.max_roman)
return(0);


Lookup(tr, "_roman",ph_roman); // precede by "roman" if _rom is defined in *_list
p = &ph_out[0];

@@ -931,6 +936,10 @@ int TranslateRoman(Translator *tr, char *word, char *ph_out, WORD_TAB *wtab)
return(0);
}
}
else
{
wtab[0].flags |= FLAG_ORDINAL;
}
}

tr->prev_dict_flags = 0;
@@ -1071,6 +1080,10 @@ static int LookupThousands(Translator *tr, int value, int thousandplex, int thou
}
}
sprintf(ph_out,"%s%s",ph_of,ph_thousands);

if((value == 1) && (thousandplex == 1) && (tr->langopts.numbers & NUM_OMIT_1_THOUSAND))
return(1);

return(found_value);
}


+ 2
- 1
src/phoneme.h View File

@@ -130,7 +130,8 @@ typedef struct {
char name[N_PHONEME_TAB_NAME];
PHONEME_TAB *phoneme_tab_ptr;
int n_phonemes;
int includes; // also include the phonemes from this other phoneme table
int includes; // also include the phonemes from this other phoneme table
int equivalence_tables; // lists of equivalent phonemes to match other languages, byte index into phondata
} PHONEME_TAB_LIST;



+ 1
- 1
src/prosodydisplay.cpp View File

@@ -613,7 +613,7 @@ void MyFrame::OnProsody(wxCommandEvent& WXUNUSED(event))
prosodyframe->CreateStatusBar();

int width, height;
wxMDIClientWindow *clientwin = this->GetClientWindow();
wxMDIClientWindow *clientwin = (wxMDIClientWindow *)this->GetClientWindow();
clientwin->GetClientSize(&width, &height);

#ifdef deleted

+ 5
- 9
src/readclause.cpp View File

@@ -1995,8 +1995,8 @@ static MNEM_TAB xml_char_mnemonics[] = {
{NULL,-1}};


int ReadClause(Translator *tr, FILE *f_in, char *buf, short *charix, int *charix_top, int n_buf, int *tone_type)
{//=============================================================================================================
int ReadClause(Translator *tr, FILE *f_in, char *buf, short *charix, int *charix_top, int n_buf, int *tone_type, char *voice_change)
{//=================================================================================================================================
/* Find the end of the current clause.
Write the clause into buf

@@ -2051,6 +2051,7 @@ int ReadClause(Translator *tr, FILE *f_in, char *buf, short *charix, int *charix
tr->clause_lower_count = 0;
end_of_input = 0;
*tone_type = 0;
*voice_change = 0;

f_input = f_in; // for GetC etc

@@ -2218,16 +2219,11 @@ f_input = f_in; // for GetC etc
if(terminator & CLAUSE_BIT_VOICE)
{
// a change in voice, write the new voice name to the end of the buf
p = current_voice_id;
while((*p != 0) && (ix < (n_buf-1)))
{
buf[ix++] = *p++;
}
buf[ix++] = 0;
strcpy(voice_change, current_voice_id);
}
return(terminator);
}
c1 = ' ';
c2 = GetC();
continue;
}

+ 1
- 1
src/synth_mbrola.cpp View File

@@ -73,7 +73,7 @@ BOOL load_MBR()
if(hinstDllMBR != NULL)
return TRUE; // already loaded

if (!(hinstDllMBR=LoadLibraryA("mbrola.dll")))
if ((hinstDllMBR=LoadLibraryA("mbrola.dll")) == 0)
return FALSE;
init_MBR =(PROCIC) GetProcAddress(hinstDllMBR,"init_MBR");
write_MBR =(PROCIC) GetProcAddress(hinstDllMBR,"write_MBR");

+ 14
- 11
src/synthdata.cpp View File

@@ -35,8 +35,8 @@
#include "translate.h"
#include "wave.h"

const char *version_string = "1.43.57 18.Jul.10";
const int version_phdata = 0x014354;
const char *version_string = "1.43.63 02.Aug.10";
const int version_phdata = 0x014361;

int option_device_number = -1;
FILE *f_logespeak = NULL;
@@ -49,7 +49,7 @@ PHONEME_TAB *phoneme_tab[N_PHONEME_TAB];
unsigned char phoneme_tab_flags[N_PHONEME_TAB]; // bit 0: not inherited

USHORT *phoneme_index=NULL;
char *spects_data=NULL;
char *phondata_ptr=NULL;
unsigned char *wavefile_data=NULL;
static unsigned char *phoneme_tab_data = NULL;

@@ -116,16 +116,17 @@ int LoadPhData()
int result = 1;
int length;
unsigned char *p;
int *pw;

if((phoneme_tab_data = (unsigned char *)ReadPhFile((void *)(phoneme_tab_data),"phontab",NULL)) == NULL)
return(-1);
if((phoneme_index = (USHORT *)ReadPhFile((void *)(phoneme_index),"phonindex",NULL)) == NULL)
return(-1);
if((spects_data = ReadPhFile((void *)(spects_data),"phondata",NULL)) == NULL)
if((phondata_ptr = ReadPhFile((void *)(phondata_ptr),"phondata",NULL)) == NULL)
return(-1);
if((tunes = (TUNE *)ReadPhFile((void *)(tunes),"intonations",&length)) == NULL)
return(-1);
wavefile_data = (unsigned char *)spects_data;
wavefile_data = (unsigned char *)phondata_ptr;
n_tunes = length / sizeof(TUNE);

// read the version number from the first 4 bytes of phondata
@@ -150,7 +151,9 @@ int LoadPhData()
n_phonemes = p[0];
phoneme_tab_list[ix].n_phonemes = p[0];
phoneme_tab_list[ix].includes = p[1];
p += 4;
pw = (int *)p;
phoneme_tab_list[ix].equivalence_tables = Reverse4Bytes(pw[1]);
p += 8;
memcpy(phoneme_tab_list[ix].name,p,N_PHONEME_TAB_NAME);
p += N_PHONEME_TAB_NAME;
phoneme_tab_list[ix].phoneme_tab_ptr = (PHONEME_TAB *)p;
@@ -168,10 +171,10 @@ void FreePhData(void)
{//==================
Free(phoneme_tab_data);
Free(phoneme_index);
Free(spects_data);
Free(phondata_ptr);
phoneme_tab_data=NULL;
phoneme_index=NULL;
spects_data=NULL;
phondata_ptr=NULL;
}


@@ -226,7 +229,7 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params,
frame_t *frame;
static frameref_t frames_buf[N_SEQ_FRAMES];
seq = (SPECT_SEQ *)(&spects_data[fmt_params->fmt_addr]);
seq = (SPECT_SEQ *)(&phondata_ptr[fmt_params->fmt_addr]);
seqk = (SPECT_SEQK *)seq;
nf = seq->n_frames;

@@ -279,7 +282,7 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params,
{
// a secondary reference has been returned, which is not a wavefile
// add these spectra to the main sequence
seq2 = (SPECT_SEQ *)(&spects_data[fmt_params->fmt2_addr]);
seq2 = (SPECT_SEQ *)(&phondata_ptr[fmt_params->fmt2_addr]);
seqk2 = (SPECT_SEQK *)seq2;
// first frame of the addition just sets the length of the last frame of the main seq
@@ -371,7 +374,7 @@ unsigned char *GetEnvelope(int index)
fprintf(stderr,"espeak: No envelope\n");
return(envelope_data[0]); // not found, use a default envelope
}
return((unsigned char *)&spects_data[index]);
return((unsigned char *)&phondata_ptr[index]);
}



+ 5
- 1
src/synthesize.cpp View File

@@ -254,6 +254,9 @@ static int DoSample2(int index, int which, int std_length, int control, int leng
wav_length = (p[1] * 256);
wav_length += p[0]; // length in bytes

if(wav_length == 0)
return(0);

min_length = speed.min_sample_len;

if(wav_scale==0)
@@ -1656,7 +1659,8 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)
{
InterpretPhoneme2(p->tone_ph, &phdata_tone);
pitch_env = GetEnvelope(phdata_tone.pitch_env);
amp_env = GetEnvelope(phdata_tone.amp_env);
if(phdata_tone.amp_env > 0)
amp_env = GetEnvelope(phdata_tone.amp_env);
}

StartSyllable();

+ 1
- 0
src/synthesize.h View File

@@ -533,6 +533,7 @@ int SelectPhonemeTableName(const char *name);

void Write4Bytes(FILE *f, int value);
int Read4Bytes(FILE *f);
int Reverse4Bytes(int word);
int CompileDictionary(const char *dsource, const char *dict_name, FILE *log, char *err_name,int flags);



+ 17
- 10
src/tr_languages.cpp View File

@@ -130,7 +130,7 @@ static Translator* NewTranslator(void)
memset(tr->letter_bits,0,sizeof(tr->letter_bits));
memset(tr->letter_groups,0,sizeof(tr->letter_groups));

// 0-5 sets of characters matched by A B C E F G in pronunciation rules
// 0-5 sets of characters matched by A B C H F G Y in pronunciation rules
// these may be set differently for different languages
SetLetterBits(tr,0,"aeiou"); // A vowels, except y
SetLetterBits(tr,1,"bcdfgjklmnpqstvxz"); // B hard consonants, excluding h,r,w
@@ -424,7 +424,7 @@ Translator *SelectTranslator(const char *name)

tr->langopts.stress_rule = STRESSPOSN_1L;
SetLetterVowel(tr,'y');
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_ORDINAL_DOT | NUM_1900;
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_ORDINAL_DOT | NUM_1900 | NUM_ROMAN | NUM_ROMAN_CAPITALS | NUM_ROMAN_ORDINAL;
}
break;

@@ -440,8 +440,9 @@ Translator *SelectTranslator(const char *name)
tr->langopts.param[LOPT_LONG_VOWEL_THRESHOLD] = 175/2;
memcpy(tr->stress_lengths,stress_lengths_de,sizeof(tr->stress_lengths));
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_OMIT_1_HUNDRED | NUM_ALLOW_SPACE | NUM_ORDINAL_DOT | NUM_ROMAN;
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_ALLOW_SPACE | NUM_ORDINAL_DOT | NUM_ROMAN;
SetLetterVowel(tr,'y');
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 2; // use de_rules for unpronouncable rules
}
break;

@@ -458,6 +459,8 @@ Translator *SelectTranslator(const char *name)
tr->langopts.numbers = NUM_HUNDRED_AND | NUM_ROMAN | NUM_1900;
tr->langopts.param[LOPT_COMBINE_WORDS] = 2; // allow "mc" to cmbine with the following word
tr->langopts.suffix_add_e = 'e';
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 2; // use en_rules for unpronouncable rules
SetLetterBits(tr,6,"aeiouy"); // Group Y: vowels, including y
}
break;

@@ -547,7 +550,7 @@ Translator *SelectTranslator(const char *name)
tr->langopts.unstressed_wd2 = 2;
tr->langopts.param[LOPT_SONORANT_MIN] = 120; // limit the shortening of sonorants before short vowels

tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_AND_UNITS | NUM_OMIT_1_HUNDRED | NUM_ROMAN | NUM_ROMAN_AFTER;
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_AND_UNITS | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_ROMAN | NUM_ROMAN_AFTER;

if(name2 == L('c','a'))
{
@@ -559,6 +562,10 @@ Translator *SelectTranslator(const char *name)
{
tr->langopts.stress_flags = 0x100 | 0x6 | 0x30; // stress last syllable unless word ends with a vowel
}
else
{
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 2; // use es_rules for unpronouncable rules
}
}
break;

@@ -702,7 +709,7 @@ Translator *SelectTranslator(const char *name)
tr->langopts.param[LOPT_IT_DOUBLING] = 1;
tr->langopts.param[LOPT_ANNOUNCE_PUNCT] = 2; // don't break clause before announcing . ? !

tr->langopts.numbers = NUM_DFRACTION_5 | NUM_ALLOW_SPACE | NUM_ROMAN | NUM_ROMAN_ORDINAL | NUM_ROMAN_CAPITALS | NUM_ORDINAL_DOT | NUM_OMIT_1_HUNDRED;
tr->langopts.numbers = NUM_DFRACTION_5 | NUM_ALLOW_SPACE | NUM_ROMAN | NUM_ROMAN_ORDINAL | NUM_ROMAN_CAPITALS | NUM_ORDINAL_DOT | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND;
tr->langopts.thousands_sep = ' '; // don't allow dot as thousands separator
tr->langopts.decimal_sep = ',';
tr->langopts.max_roman = 899;
@@ -879,7 +886,7 @@ SetLengthMods(tr,3); // all equal
tr->letter_groups[0] = vowels_cyrillic;

tr->langopts.stress_rule = STRESSPOSN_3R; // antipenultimate
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_AND_UNITS | NUM_OMIT_1_HUNDRED | NUM_DFRACTION_2;
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_AND_UNITS | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_DFRACTION_2;
tr->langopts.numbers2 = 0x8a; // variant numbers before thousands,milliards
}
break;
@@ -1098,7 +1105,7 @@ SetLengthMods(tr,3); // all equal
if(name2 == L('t','a'))
{
tr->letter_bits_offset = OFFSET_TAMIL;
tr->langopts.numbers = 0x1;
tr->langopts.numbers = NUM_OMIT_1_THOUSAND ;
}
if(name2 == L('m','r'))
{
@@ -1140,8 +1147,8 @@ SetLengthMods(tr,3); // all equal

case L('t','r'): // Turkish
{
static const unsigned char stress_amps_tr[8] = {18,16, 20,20, 20,21, 21,20 };
static const short stress_lengths_tr[8] = {190,180, 200,200, 0,0, 240,250};
static const unsigned char stress_amps_tr[8] = {18,16, 20,21, 20,21, 21,20 };
static const short stress_lengths_tr[8] = {190,180, 200,230, 0,0, 240,250};

SetupTranslator(tr,stress_lengths_tr,stress_amps_tr);
tr->charset_a0 = charsets[9]; // ISO-8859-9 - Latin5
@@ -1149,7 +1156,7 @@ SetLengthMods(tr,3); // all equal
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.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_OMIT_1_THOUSAND | NUM_DFRACTION_2;
tr->langopts.max_initial_consonants = 2;
}
break;

+ 114
- 2
src/translate.cpp View File

@@ -667,6 +667,98 @@ static int CheckDottedAbbrev(char *word1, WORD_TAB *wtab)
} // end of CheckDottedAbbrev


extern char *phondata_ptr;

int ChangeEquivalentPhonemes(Translator *tr, int lang2, char *phonemes)
{//====================================================================
// tr: the original language
// lang2: phoneme table number for the temporary language
// phonemes: the phonemes to be replaced

int ix;
int len;
char phon;
char *p;
unsigned char *pb;
char *eqlist;
char *p_out;
char *p_in;
int remove_stress = 0;
char phonbuf[N_WORD_PHONEMES];

// has a phoneme equivalence table been specified for thus language pair?
if((ix = phoneme_tab_list[tr->phoneme_tab_ix].equivalence_tables) == 0)
return(0);

pb = (unsigned char *)&phondata_ptr[ix];

for(;;)
{
if(pb[0] == 0)
return(0); // table not found

if(pb[0] == lang2)
break;

len = (pb[2] << 8) + pb[3]; // size of this table in words
pb += (len * 4);
}
remove_stress = pb[1];

if(option_phonemes == 2)
{
DecodePhonemes(phonemes, phonbuf);
fprintf(f_trans,"(%s) %s -> (%s) ", phoneme_tab_list[lang2].name, phonbuf, phoneme_tab_list[tr->phoneme_tab_ix].name);
}

p_in = phonemes;
eqlist = (char *)&pb[8];
p_out = phonbuf;

while((phon = *p_in++) != 0)
{
if(remove_stress && ((phon & 0xff) < phonSTRESS_PREV))
continue; // remove stress marks

// is there a translation for this phoneme code?
p = eqlist;
while(*p != 0)
{
len = strlen(&p[1]);
if(*p == phon)
{
strcpy(p_out, &p[1]);
p_out += len;
break;
}
p += (len + 2);
}
if(*p == 0)
{
// no translation found
*p_out++ = phon;
}
}
*p_out = 0;

if(remove_stress)
{
SetWordStress(tr, phonbuf, NULL, -1, 0);
}

strcpy(phonemes, phonbuf);

if(option_phonemes == 2)
{
SelectPhonemeTable(tr->phoneme_tab_ix);
DecodePhonemes(phonemes, phonbuf);
fprintf(f_trans,"%s\n\n", phonbuf);
}
return(1);
} // end of ChangeEquivalentPhonemes




int TranslateWord(Translator *tr, char *word1, int next_pause, WORD_TAB *wtab)
{//===========================================================================
@@ -1148,6 +1240,12 @@ strcpy(phonemes2,phonemes);
strcpy(word_phonemes,phonemes);
return(0);
}

if(dictionary_flags2[0] & FLAG_ABBREV)
{
// Removing the suffix leaves a word which should be spoken as individual letters
// Not yet implemented
}
if(dictionary_flags[0]==0)
{
dictionary_flags[0] = dictionary_flags2[0];
@@ -1697,6 +1795,19 @@ static int TranslateWord2(Translator *tr, char *word, WORD_TAB *wtab, int pre_pa
p[1] = phonSCHWA;
p[2] = 0;
}

// ?? Option to convert from language2 phonemes to the equivalent language1 phonemes
// ?? Option to set the word-stress according to language1 rules eg. lang=fr)
if(ChangeEquivalentPhonemes(tr, switch_phonemes, (char *)p))
{
switch_phonemes = -1;
}

if(switch_phonemes == -1)
{
strcpy(dictionary_name, old_dictionary_name);
SelectPhonemeTable(voice->phoneme_tab_ix);
}
}

if(!(word_flags & FLAG_HYPHEN))
@@ -2196,6 +2307,7 @@ void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *t

short charix[N_TR_SOURCE+4];
WORD_TAB words[N_CLAUSE_WORDS];
static char voice_change_name[40];
int word_count=0; // index into words

char sbuf[N_TR_SOURCE];
@@ -2218,7 +2330,7 @@ void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *t

for(ix=0; ix<N_TR_SOURCE; ix++)
charix[ix] = 0;
terminator = ReadClause(tr, f_text, source, charix, &charix_top, N_TR_SOURCE, &tone2);
terminator = ReadClause(tr, f_text, source, charix, &charix_top, N_TR_SOURCE, &tone2, voice_change_name);

if((f_logespeak != NULL) && (logging_type & 4))
{
@@ -3038,7 +3150,7 @@ if((c == '/') && (tr->langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(pre
{
// return new voice name if an embedded voice change command terminated the clause
if(terminator & CLAUSE_BIT_VOICE)
*voice_change = &source[source_index];
*voice_change = voice_change_name;
else
*voice_change = NULL;
}

+ 11
- 4
src/translate.h View File

@@ -112,6 +112,8 @@
#define FLAG_SUFFIX_VOWEL 0x08000000 // remember an initial vowel from the suffix
#define FLAG_NO_TRACE 0x10000000 // passed to TranslateRules() to suppress dictionary lookup printout
#define FLAG_NO_PREFIX 0x20000000
#define FLAG_UNPRON_TEST 0x80000000 // do unpronounability test on the beginning of the word


// 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
@@ -125,6 +127,8 @@
#define SUFX_B 0x20000 // break, this character breaks the word into stem and suffix (used with SUFX_P)
#define SUFX_A 0x40000 // remember that the suffix starts with a vowel

#define SUFX_UNPRON 0x8000 // used to return $unpron flag from *_rules


#define FLAG_ALLOW_TEXTMODE 0x02 // allow dictionary to translate to text rather than phonemes
#define FLAG_SUFX 0x04
@@ -221,9 +225,9 @@
typedef const char * constcharptr;

typedef struct {
int points;
int points;
const char *phonemes;
int end_type;
int end_type;
char *del_fwd;
} MatchRecord;
@@ -388,6 +392,7 @@ typedef struct {
#define NUM_AND_HUNDRED 0x40000
#define NUM_THOUSAND_AND 0x80000
#define NUM_VIGESIMAL 0x100000
#define NUM_OMIT_1_THOUSAND 0x200000

#define NUM_ROMAN 0x1000000
#define NUM_ROMAN_CAPITALS 0x2000000
@@ -413,6 +418,7 @@ typedef struct {
// bit18= 'and' before hundreds
// bit19= 'and' after thousands if there are no hundreds
// bit20= vigesimal number, if tens are not found
// bit21= omit "one" before "thousand"

// bit24= recognize roman numbers
// bit25= Roman numbers only if upper case
@@ -484,7 +490,8 @@ typedef struct

char phon_out[300];
char phonemes_repeat[20];
int phonemes_repeat_count;
int phonemes_repeat_count;
int phoneme_tab_ix;

unsigned char stress_amps[8];
unsigned char stress_amps_r[8];
@@ -650,7 +657,7 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags,
int TranslateRules(Translator *tr, char *p, char *phonemes, int size, char *end_phonemes, int end_flags, unsigned int *dict_flags);
int TranslateWord(Translator *tr, char *word1, int next_pause, WORD_TAB *wtab);
void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *tone, char **voice_change);
int ReadClause(Translator *tr, FILE *f_in, char *buf, short *charix, int *charix_top, int n_buf, int *tone_type);
int ReadClause(Translator *tr, FILE *f_in, char *buf, short *charix, int *charix_top, int n_buf, int *tone_type, char *voice_change);

void SetVoiceStack(espeak_VOICE *v);
void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_DATA *phdata);

+ 1
- 0
src/voices.cpp View File

@@ -978,6 +978,7 @@ voice_t *LoadVoice(const char *vname, int control)
fprintf(stderr,"Unknown phoneme table: '%s'\n",phonemes_name);
}
voice->phoneme_tab_ix = ix;
new_translator->phoneme_tab_ix = ix;
error = LoadDictionary(new_translator, new_dictionary, control & 4);
if(dictionary_name[0]==0)
return(NULL); // no dictionary loaded

+ 2
- 2
src/vowelchart.cpp View File

@@ -41,7 +41,7 @@
*/
extern wxString path_phsource;

extern char *spects_data;
extern char *phondata_ptr;
extern USHORT *phoneme_index;
extern int n_phoneme_tables;

@@ -664,7 +664,7 @@ void MakeVowelLists(void)
{
ix = vowelfmt_addr[vowelfmt_ix];

seq = (SPECT_SEQ *)(&spects_data[ix]);
seq = (SPECT_SEQ *)(&phondata_ptr[ix]);
seqk = (SPECT_SEQK *)seq;
if(seq->frame[0].frflags & FRFLAG_KLATT)

Loading…
Cancel
Save