diff --git a/dictsource/ca_list b/dictsource/ca_list
index 97052b3b..0e1cfb17 100755
--- a/dictsource/ca_list
+++ b/dictsource/ca_list
@@ -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
diff --git a/dictsource/da_list b/dictsource/da_list
index eae75c2b..b13db194 100755
--- a/dictsource/da_list
+++ b/dictsource/da_list
@@ -1,7 +1,7 @@
-tv $abbrev
-
// PB = Peter Bjarkov - pbj1234@hotmail.com
+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
diff --git a/dictsource/da_rules b/dictsource/da_rules
index 8f17a268..53287628 100755
--- a/dictsource/da_rules
+++ b/dictsource/da_rules
@@ -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
diff --git a/dictsource/de_list b/dictsource/de_list
index b122a888..14ab3011 100644
--- a/dictsource/de_list
+++ b/dictsource/de_list
@@ -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
+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
+januar janu:A:r
-kamelie $alt
-kanoe kan'u:
-kastanie $alt
-kid kId
-komödie $alt
-konservativ $1
-konsul $1
-kurie $alt
+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
-zurück $2
-zymbal $1
+zudem tsu:'de:m
+zugegen tsu:g'e:g@n
+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:
diff --git a/dictsource/de_rules b/dictsource/de_rules
index 328011fd..f769781f 100644
--- a/dictsource/de_rules
+++ b/dictsource/de_rules
@@ -18,7 +18,8 @@
// * . *
// ***************************************************************************/
-.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
diff --git a/dictsource/dict_phonemes b/dictsource/dict_phonemes
index f5b68e54..02a713a4 100644
--- a/dictsource/dict_phonemes
+++ b/dictsource/dict_phonemes
@@ -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
diff --git a/dictsource/en_list b/dictsource/en_list
index e854ce3a..d6928021 100644
--- a/dictsource/en_list
+++ b/dictsource/en_list
@@ -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
diff --git a/dictsource/en_rules b/dictsource/en_rules
index aa4da05b..069a8d21 100644
--- a/dictsource/en_rules
+++ b/dictsource/en_rules
@@ -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
diff --git a/dictsource/es_list b/dictsource/es_list
index bc796fb9..11d838a8 100644
--- a/dictsource/es_list
+++ b/dictsource/es_list
@@ -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
diff --git a/dictsource/es_rules b/dictsource/es_rules
index a3344f1b..c4f6ce16 100644
--- a/dictsource/es_rules
+++ b/dictsource/es_rules
@@ -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
diff --git a/dictsource/fr_list b/dictsource/fr_list
index f0b16f26..9550322a 100755
--- a/dictsource/fr_list
+++ b/dictsource/fr_list
@@ -24,7 +24,7 @@
// 2006-11-18 Gilles Casse
//
-// Updated 2010-07-16 Michel Such
+// Updated 2010-07-25 Michel Such
//
// * 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
-
diff --git a/dictsource/fr_rules b/dictsource/fr_rules
index 438fb197..d321c939 100755
--- a/dictsource/fr_rules
+++ b/dictsource/fr_rules
@@ -27,7 +27,7 @@
// http://www.fluxnic.net/cicero
//
// Rules are now maintained by Michel Such
-// Last update: 2010-07-16 Michel Such
+// Last update: 2010-07-30 Michel Such
//
// 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
diff --git a/dictsource/hi_list b/dictsource/hi_list
index d81e028a..36662ce8 100755
--- a/dictsource/hi_list
+++ b/dictsource/hi_list
@@ -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
diff --git a/dictsource/hu_list b/dictsource/hu_list
index 225c2858..5e57274a 100755
--- a/dictsource/hu_list
+++ b/dictsource/hu_list
@@ -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+
diff --git a/dictsource/hu_rules b/dictsource/hu_rules
index 646428fe..a041be4d 100644
--- a/dictsource/hu_rules
+++ b/dictsource/hu_rules
@@ -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
diff --git a/dictsource/nl_list b/dictsource/nl_list
index bd6458d3..c9b81c51 100644
--- a/dictsource/nl_list
+++ b/dictsource/nl_list
@@ -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
diff --git a/dictsource/pap_list b/dictsource/pap_list
index 84722927..6a5bedf0 100644
--- a/dictsource/pap_list
+++ b/dictsource/pap_list
@@ -73,7 +73,6 @@ _8X otS'enta
_9X nob'enta
_0C sj'en
_0M1 m'il
-_1M1 m'il
_0M2 mi'on
_dpt _kOma/
diff --git a/dictsource/ta_list b/dictsource/ta_list
index e2c1ad5f..e505473c 100644
--- a/dictsource/ta_list
+++ b/dictsource/ta_list
@@ -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:
diff --git a/dictsource/ta_rules b/dictsource/ta_rules
index 72ce5c1a..b7ebba59 100644
--- a/dictsource/ta_rules
+++ b/dictsource/ta_rules
@@ -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 ட+
diff --git a/dictsource/tr_list b/dictsource/tr_list
index 6798b5ed..26bce891 100644
--- a/dictsource/tr_list
+++ b/dictsource/tr_list
@@ -113,7 +113,6 @@ _9X doksan
_0C jyz
_2C 'icijyz
_0M1 bIn
-_1M1 bIn
_0M2 miljon
_0M3 miljar
_dpt _viRg,Yl_|
diff --git a/dictsource/tr_rules b/dictsource/tr_rules
index aa46a51f..84edcb4d 100644
--- a/dictsource/tr_rules
+++ b/dictsource/tr_rules
@@ -327,4 +327,5 @@
.group
$ dolar
' (Pb // split a word at ' and translate the first part separately.
-
+ ə E // used in Aberbaijan
+ ä E
diff --git a/phsource/compile_report b/phsource/compile_report
index f9131864..ac65428c 100644
--- a/phsource/compile_report
+++ b/phsource/compile_report
@@ -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
diff --git a/phsource/intonation b/phsource/intonation
index 0a6b7e73..ad53fce1 100644
--- a/phsource/intonation
+++ b/phsource/intonation
@@ -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
+
diff --git a/phsource/ph_afrikaans b/phsource/ph_afrikaans
index cfa51cff..0c311bad 100755
--- a/phsource/ph_afrikaans
+++ b/phsource/ph_afrikaans
@@ -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
-
diff --git a/phsource/ph_catalan b/phsource/ph_catalan
index b7855ea1..441adff1 100644
--- a/phsource/ph_catalan
+++ b/phsource/ph_catalan
@@ -12,6 +12,7 @@ endphoneme
phoneme a#
vowel starttype #@ endtype #@
+ ipa ɐ
unstressed
length 170
FMT(vowel/a#_3)
diff --git a/phsource/ph_croatian b/phsource/ph_croatian
index 56f35904..98c39733 100644
--- a/phsource/ph_croatian
+++ b/phsource/ph_croatian
@@ -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(*)
diff --git a/phsource/ph_english b/phsource/ph_english
index 7d345863..6b8d96fa 100644
--- a/phsource/ph_english
+++ b/phsource/ph_english
@@ -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
diff --git a/phsource/ph_french b/phsource/ph_french
index 3e6843be..7de54e40 100644
--- a/phsource/ph_french
+++ b/phsource/ph_french
@@ -1,7 +1,7 @@
//====================================================
// French
//====================================================
-// Updated 2010-07-16 Michel Such
+// Updated 2010-07-25 Michel Such
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
+
diff --git a/phsource/ph_german b/phsource/ph_german
index 4f6ee98f..93b85876 100755
--- a/phsource/ph_german
+++ b/phsource/ph_german
@@ -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
diff --git a/phsource/ph_hindi b/phsource/ph_hindi
index 7e20326c..afbe6f45 100644
--- a/phsource/ph_hindi
+++ b/phsource/ph_hindi
@@ -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
diff --git a/phsource/ph_slovak b/phsource/ph_slovak
index 8226d5fd..cf4766db 100644
--- a/phsource/ph_slovak
+++ b/phsource/ph_slovak
@@ -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
diff --git a/phsource/ph_swedish b/phsource/ph_swedish
index fabfa70b..3f0e99b3 100644
--- a/phsource/ph_swedish
+++ b/phsource/ph_swedish
@@ -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
diff --git a/phsource/ph_tamil b/phsource/ph_tamil
index 9ebcc7bf..6ee50b78 100644
--- a/phsource/ph_tamil
+++ b/phsource/ph_tamil
@@ -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
diff --git a/phsource/ph_turkish b/phsource/ph_turkish
index cd03992f..c8f9c236 100644
--- a/phsource/ph_turkish
+++ b/phsource/ph_turkish
@@ -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
diff --git a/phsource/phonemes b/phsource/phonemes
index 291a231e..35b3d19c 100644
--- a/phsource/phonemes
+++ b/phsource/phonemes
@@ -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
diff --git a/phsource/vdiph2/vowelchart.png b/phsource/vdiph2/vowelchart.png
index ddd857f9..94e1bc03 100644
Binary files a/phsource/vdiph2/vowelchart.png and b/phsource/vdiph2/vowelchart.png differ
diff --git a/phsource/vowel/& b/phsource/vowel/&
index 5d0ee30d..f22100fb 100644
Binary files a/phsource/vowel/& and b/phsource/vowel/& differ
diff --git a/platforms/big_endian/espeak-phoneme-data.c b/platforms/big_endian/espeak-phoneme-data.c
index 24155cdb..4f88f2fc 100644
--- a/platforms/big_endian/espeak-phoneme-data.c
+++ b/platforms/big_endian/espeak-phoneme-data.c
@@ -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);
diff --git a/src/compiledata.cpp b/src/compiledata.cpp
index 8dd96ce4..0a6ee71e 100644
--- a/src/compiledata.cpp
+++ b/src/compiledata.cpp
@@ -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 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 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"
diff --git a/src/compiledict.cpp b/src/compiledict.cpp
index faccbeb3..c6ef8e5a 100644
--- a/src/compiledict.cpp
+++ b/src/compiledict.cpp
@@ -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))
diff --git a/src/dictionary.cpp b/src/dictionary.cpp
index fcba0acc..202e1749 100644
--- a/src/dictionary.cpp
+++ b/src/dictionary.cpp
@@ -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;
+ int end_flags;
+ char ph_buf[N_WORD_PHONEMES];
- 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);
+ 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);
diff --git a/src/espeakedit.cpp b/src/espeakedit.cpp
index ee559136..efa9f3fe 100644
--- a/src/espeakedit.cpp
+++ b/src/espeakedit.cpp
@@ -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;
diff --git a/src/extras.cpp b/src/extras.cpp
index e04f5477..0df0b04d 100644
--- a/src/extras.cpp
+++ b/src/extras.cpp
@@ -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
diff --git a/src/main.h b/src/main.h
index 90942259..be1c9a87 100755
--- a/src/main.h
+++ b/src/main.h
@@ -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,
diff --git a/src/menus.cpp b/src/menus.cpp
index 7a450db4..93c21575 100644
--- a/src/menus.cpp
+++ b/src/menus.cpp
@@ -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);
diff --git a/src/numbers.cpp b/src/numbers.cpp
index 772d1416..a2cbdb7d 100644
--- a/src/numbers.cpp
+++ b/src/numbers.cpp
@@ -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);
}
diff --git a/src/phoneme.h b/src/phoneme.h
index 353b6746..8d39de4e 100644
--- a/src/phoneme.h
+++ b/src/phoneme.h
@@ -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;
diff --git a/src/prosodydisplay.cpp b/src/prosodydisplay.cpp
index cc08acf8..f7706e35 100644
--- a/src/prosodydisplay.cpp
+++ b/src/prosodydisplay.cpp
@@ -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
diff --git a/src/readclause.cpp b/src/readclause.cpp
index ffadad85..12d304a6 100644
--- a/src/readclause.cpp
+++ b/src/readclause.cpp
@@ -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;
}
diff --git a/src/synth_mbrola.cpp b/src/synth_mbrola.cpp
index 4919a890..b1d96dc0 100644
--- a/src/synth_mbrola.cpp
+++ b/src/synth_mbrola.cpp
@@ -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");
diff --git a/src/synthdata.cpp b/src/synthdata.cpp
index 1e9b7e86..4f450396 100644
--- a/src/synthdata.cpp
+++ b/src/synthdata.cpp
@@ -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]);
}
diff --git a/src/synthesize.cpp b/src/synthesize.cpp
index 74873304..0805c53a 100644
--- a/src/synthesize.cpp
+++ b/src/synthesize.cpp
@@ -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();
diff --git a/src/synthesize.h b/src/synthesize.h
index 3eef6a24..910f440c 100644
--- a/src/synthesize.h
+++ b/src/synthesize.h
@@ -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);
diff --git a/src/tr_languages.cpp b/src/tr_languages.cpp
index cf8103cb..cd6cbf51 100644
--- a/src/tr_languages.cpp
+++ b/src/tr_languages.cpp
@@ -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;
diff --git a/src/translate.cpp b/src/translate.cpp
index 74816a85..10df8492 100644
--- a/src/translate.cpp
+++ b/src/translate.cpp
@@ -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; ixlangopts.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;
}
diff --git a/src/translate.h b/src/translate.h
index 92a487d9..492cf414 100644
--- a/src/translate.h
+++ b/src/translate.h
@@ -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);
diff --git a/src/voices.cpp b/src/voices.cpp
index 40200de2..508efcfd 100644
--- a/src/voices.cpp
+++ b/src/voices.cpp
@@ -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
diff --git a/src/vowelchart.cpp b/src/vowelchart.cpp
index 81cae2eb..394e728e 100644
--- a/src/vowelchart.cpp
+++ b/src/vowelchart.cpp
@@ -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)