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)