diff --git a/dictsource/da_list b/dictsource/da_list index 42a5a961..eca6df58 100644 --- a/dictsource/da_list +++ b/dictsource/da_list @@ -111,9 +111,9 @@ _19 n'ed@-n _2X t'y:w _3X tR'&#Dv@ //PB [tR'ADv@] changed to [tR'&#Dv@] _4X f'WRV //PB [f'W:*3] changed to [ f'WRV] -_5X hal't*es +_5X h&l't*es // PB [a] changed to [&] _6X t*'es -_7X halfj'&rs +_7X h&lfj'&rs // PV a changed to & _8X f'irs _9X h&lf'Ems // PB a changed to & _0C h'un*@:D @@ -163,6 +163,8 @@ en e:n $u et ed $u her $u kun $u +vel $u+ +da $u // conjunctions og V $u+ $pause // and @@ -187,6 +189,7 @@ med $u+ // with af & // PB changed from [a?] to [&] - sound too short in a sentence // Also removed $u from 'af' and other words. They disappeared. ad &: // PB added 'ad' +ad &D $atend $sentence // PB "Det må ikke skille os ad." at &: $u // PB changed from [at] to [&:] hos // at - PB: removed [$u+] som sVm // which / that - PB: removed [$u+] @@ -257,7 +260,7 @@ f Ef g ge: h hO: _i i: -j joD +j jVD // PB changed from [o] k kO: l El m Em @@ -316,7 +319,6 @@ interface _^_EN image _^_EN joke _^_EN joystick _^_EN -junkie _^_EN laptop _^_EN level _^_EN login _^_EN @@ -335,13 +337,11 @@ password _^_EN penthouse _^_EN pickup _^_EN pidgin _^_EN -producer _^_EN ranger _^_EN receiver _^_EN research _^_EN remake _^_EN roadie _^_EN -roastbeef _^_EN run _^_EN scanner _^_EN science _^_EN @@ -356,7 +356,6 @@ small _^_EN snob _^_EN song _^_EN source _^_EN -spam _^_EN spirit _^_EN squaw _^_EN sweatshirt _^_EN @@ -2344,7 +2343,7 @@ dessin des'EN $alt dioxin $alt disciplin $alt doktrin $alt -(drive-in) drajv'in $alt +//(drive-in) drajv'in $alt dusin $alt endokrin $alt endorfin $alt @@ -2398,7 +2397,6 @@ lupin $alt magasin $alt mandarin $alt mandolin $alt -mannequin m&n@k'EN $alt margin $alt marin $alt marocain mAro'kEN $alt @@ -5046,6 +5044,7 @@ adstringer $alt adviser $alt advoker $alt afficer $alt +aflever $alt afmarcher $alt afrikaniser $alt agere $alt @@ -5154,7 +5153,7 @@ banaliser $alt bandagere $alt banderolere $alt barbariser $alt -barber $alt +barbere $alt barder $alt barrier $alt barrikader $alt @@ -5179,7 +5178,7 @@ bonbonniere bVNbVNj'E:r $alt boniter $alt botaniser $alt braiser $alt -briketter $alt +brikettere $alt brillere $alt brochere $alt brodere $alt @@ -5188,7 +5187,7 @@ bronzere $alt brunere $alt brutaliser $alt bruyere bryj'E:r $alt -budgetter $alt +budgettere $alt bugser $alt bureaukratiser $alt cadmier $alt @@ -5274,7 +5273,7 @@ deputer $alt dereguler $alt deriver $alt desarmer $alt -deserter $alt +desertere $alt designere $alt desinficer $alt destiller $alt @@ -5434,7 +5433,7 @@ farser $alt fasciner $alt favoriser $alt feminiser $alt -ferier $alt +feriere $alt fermenter $alt ferniser $alt fertiliser $alt @@ -5550,7 +5549,7 @@ halver $alt harceler $alt harmoner $alt harmoniser $alt -harpuner $alt +harpunere $alt havarer $alt hektografer $alt herbariser $alt @@ -5669,7 +5668,7 @@ intriger $alt introducer $alt intuber $alt invader $alt -invalider $alt +invalidere $alt inventer $alt inverter $alt invester $alt @@ -5890,7 +5889,6 @@ laminer $alt lancer $alt lasere $alt latiniser $alt -//lavere $alt lavpasteuriser $alt legaliser $alt leger $alt @@ -6119,7 +6117,7 @@ plakater $alt planere $alt plastificer $alt platiner $alt -pletter $alt +plettere $alt plisser $alt plomber $alt plæder $alt @@ -6153,7 +6151,7 @@ privileger $alt prober $alt problematiser $alt proceder $alt -producer $alt +producere $alt profaner $alt professionaliser $alt profeter $alt @@ -6190,7 +6188,7 @@ præferer $alt præjudicer $alt prækvalificer $alt præluder $alt -præmier $alt +præmiere $alt prænumerer $alt præparer $alt præsenter $alt @@ -6218,7 +6216,7 @@ ramponer $alt ranger $alt rappeller $alt rapportere $alt -raser $alt +rasere $alt ratificer $alt ratihaber $alt rationaliser $alt @@ -6256,7 +6254,7 @@ reimporter $alt reinvester $alt rejicer $alt rekapituler $alt -reklamer $alt +reklamere $alt rekognoscer $alt rekommander $alt rekompenser $alt @@ -6418,7 +6416,7 @@ stabiliser $alt staffer $alt stagner $alt standardiser $alt -stationer $alt +stationere $alt statuere $alt stenciler $alt stenografer $alt @@ -6492,9 +6490,9 @@ temperer $alt tender $alt teoretiser $alt termografer $alt -terrasser $alt +terrassere $alt terroriser $alt -testamenter $alt +testamentere $alt testere $alt tiere $alt titrer $alt @@ -6565,7 +6563,7 @@ verbaliser $alt verificer $alt verser $alt versificer $alt -versioner $alt +versionere $alt vibrer $alt vidimer $alt vikarier $alt @@ -10300,23 +10298,24 @@ også Vs@ // also idet id'e // in so far as bleg blaj blegrød blajrWD +blegrøde blajrWD@ //blege blaj@ blegemiddel bl&#j@mid@l //blegansigt bl&#jansegt slags sl'ags // sort, type tre tr'e // the number 3 -barber bab'er // PB barber -barbere bab'eV // PB barbere -barberer bab'eV // PB barberer +//barber bAb'er // PB barber +//barbere bab'eV // PB barbere +//barberer bab'eV // PB barberer //barberes bab'eVs // PB barberes -barbererne bab'eVn@ // PB barberene -barberenes bab'eVn@s // PB barberenes +//barbererne bab'eVn@ // PB barberene +//barberenes bab'eVn@s // PB barberenes rejicere rejis'eV // PB should not be pronounced [raje] rejicerer rejis'eV // PB rejiceres rejis'eVs // PB rejicering rejis'eRiN // PB gele sjel'e // PB gele -géle sjel'e // PB géle +gelé sjel'e // PB gelé geleen sjel'e@-n // PB geleen geleer sjel'e3 // PB geleer geleens sjel'e@-ns // PB geleens @@ -10361,6 +10360,7 @@ shampu Sjambo // PB Danish pronunciation - oo has been replaced b (tour de force) tu:@d@||'fV:s // PB (al qaeda) al||k'ajda // PB (force majeure) fVrs||,ma'sjW:r // PB +(diner transportable) din'e|trANspVt'abl@ // PB (quiche lorraine) kiS||lor'E:n: (fait accompli) fEtakVmpl'i // PB wien v'i:n // PB Wien - the town of Vienna @@ -10406,6 +10406,8 @@ dna $abbrev sos $abbrev // PB the SOS signal pharm fA:rm? $hasdot // PB fx cand. pharm. phil fil/3 $hasdot // PB fx cand. phil. +bh $abbrev +(bh'er) b,e:h'O:V // Try to catch errors @@ -10439,6 +10441,7 @@ sig si $capital //PB Sig = si with capital S - Sig det med blom (vi steg) vi||st'e (de steg) di||st'e (alle steg) &l3||st'e +steg sdaj $atend $sentence steget ste@d // PB problem with noun "hav" = ocean and verb "hav(e)" = to have [hAu]/[h&v] (et hav) ed||h'Au // PB "et hav" = an ocean - not "hav en god dag" - have a nice day @@ -10472,6 +10475,7 @@ legenderne leg'EndVn3s (så længe) sV||l'EN3 (så må) sV||m'O (så har) sV||har +så sV $sentence $atstart (virkede så) v'irkeD@||sV (kom så) kVm||sV (koste med) kosd@||mED diff --git a/dictsource/da_rules b/dictsource/da_rules index b3bbb888..ee77a918 100644 --- a/dictsource/da_rules +++ b/dictsource/da_rules @@ -37,23 +37,31 @@ efter) a (b & // PB efterabe for) a (n & // foran for) a (nd A // PB forandre + for) a (nk A // PB forankre // PB general rule: [a] after r followed by sp/st/sk r) a (L08 a // PB rask // PB general rule: [&:] after m/n - L09) a & // mave + L09) a &: // mave + gn) av (pot Aw // PB gnavpotte torn) ad (o '&d // PB stressed kn) a (p A // PB manchetknap + sn) a (p a // PB snappe m) a (p a // PB mappe L09) a (j a // PB maj // PB general rule: [a] after n before vn n) a (vn a // navn // PB general rule: [a] after l before n l) a (n & // land + l) an (ce AN // PB lancere + pl) an (ch AN // PB planche // PB words in da_list with final -ance &) ance ($p_alt 'ANs@ // balance, romance + &) ance (+ ANs@ // PB unstressed after a syllable - ferieromance + &) ance (re$p_alt ANs'e // PB avancere // PB general rule: [a] after consonant before m C) a (m a // PB ham, gamle, lam C) a (mi & // PB vitamin + alab) a (m '& // PB Alabama // PB general rule: [&] after l before m + vowel l) a (mA & // PB ham, gamle, lam // PB general rule: [&] after before m/n @@ -61,8 +69,9 @@ // PB general rule: [&] after k k) a (+ & // PB kage, kaste sk) a (k A // PB skak -// PB general rule: [a] after k before pp +// PB general rule: [a] after k before p k) a (p+ a // PB kappe, kaptajn + k) a (pi+ & // PB [&] before i - kapitel // PB general rule: [a] after sk before f sk) a (f+ a // PB skaffe // PB general rule: [&] after sk before p/b @@ -78,6 +87,9 @@ k) a (me & // PB kamel, kamera // PB general rule: [&] after d d) a (+ & // PB dame, dag + d) a (g@ a // PB dagbog + _d) a (m_ a // PB dam + _d) a (mm a // PB dammen // PB general rule: [A] after d before mp d) a (mp A // PB damp // PB general rule: [A] after a followed by k/g plus t @@ -124,6 +136,9 @@ l) av (ed &v // PB lavede l) av (es &v // PB laves l) av (t &v // PB lavt + l) av (ni &v // PB madlavning + l) av (a_ &v // PB lava + l) av (ae &v // PB lavaen b) alaklav (a &l&kl'&:v // PB g) av (mi Au // PB gavmild // PB general rule: [Au] after t before s @@ -137,7 +152,9 @@ a (nklag+ & // PB anklage a (nko+ & // PB ankomme ang (re aN // PB angre - ang (er_ aN // PB anger + _) ang (eC aN // PB anger, angelsaksisk + + _) ang (ol ang // PB Angola ang (reb &ng // PB angreb a (gt A // agt l) a (gt+ A // PB lagt @@ -147,6 +164,7 @@ C) a (vn A // favn, savn // PB general rule: [a] after kl before consonant kl) a (L06 a // PB klap + a (k a // akrobat a (ngC A // PB angst b) a (L06 A // PB baptist a (mp %A // PB ampul @@ -154,8 +172,13 @@ a (ppar a // PB apparat _okt) a (v '& // stressed _konk) a (v '& // stressed + _det) a (lje '& // PB stressed + nev) a (da '& // PB _pol) a (k 'a // PB stressed polak _kos) a (k 'a // PB stressed - kosak +_milli) a (r 'A // PB stressed - milliard +_trilli) a (r 'A // PB stressed - trilliard + _sejl) a (ds '& // PB stressed L08) av (C Au // stavn st) av (nin &v // PB stavning h) av (_ & // PB hav - problem with the noun "hav" [hAu] @@ -163,14 +186,20 @@ h) av (C Au // PB havbund h) av (over Au // PB havoverfladen h) a (vn A // PB havn + h) ag (l Au // PB hav) a (nna '& // PB Havanna + h) a (ck & // PB hacke color) ado 'Ado // PB US state _) av (_ Au // PB av C) a (k a // PB makværk + C) a (x a // PB fax + st) a (ki & // PB stakit + m) a (ka & // PN makaber C) a (ck a // PB tackle s) a (x a // PB saxofon l) a (kA & // PB lakune @l) a (g &j // PB nederlag + gr) ape Eb // PB grapefrugt // PB stressed a in final -al in $alt words in da_list &) al ($p_alt+ ''&l // the double '' enforces primary stress - fatal, monumental @@ -193,6 +222,7 @@ intern) atio (nal &So // clash with "internat" // PB nouns with final -ade in da_list - stressed a &) ade ($p_alt '&:D@ // hystade + &r) ade ($p_alt 'A:D@ // parade &) adent ($p_alt &d'ent // don't spoil the -ent rule - dekad'ent // PB nouns with final -an in da_list - stressed a @@ -264,7 +294,11 @@ _vatik) a (n '& // PB Vatikanet lumb) a (go '& // PB stressed - lumbago _kapt) a (jn '& // PB kaptajn tilsk) a (de '& // PB tilskadekommne + al) a (sk '& // PB Alaska _radio) a (kti 'A // PB stressed - radioaktiv +_impres) a (rio 'A // PB stressed + _rab) a (rber 'A // PB stressed + _ar) a (ber 'A // PB stressed bl) a (d & // PB blad h) a (n & // PB han j) a & // PB ja @@ -276,12 +310,13 @@ _radio) a (kti 'A // PB stressed - radioaktiv l) ave (_ &v@ // PB lave l) aver (_ &vV // PB laver kl) aver (_ &v'er // PB klaver - l) a (bo a // PB laborastorium - g) a (v & // PB gav, opgave + l) a (bo a // PB laborastorium + g) a (v &: // PB gav, opgave g) a (vn A // PB gavn b) a (b+ A // PB babser + b) a (jer a // PB b) aby (+ eibi // PB baby - _) a (ndA a // PB anderledes + _) a (nder a // PB anderledes _) a (ndet & // PB andet _) a (nden & // PB anden t) a (bt a // PB tabte @@ -305,6 +340,10 @@ interf) a (ce ei // PB interface C) a (ft A // PB haft, saft sl) a (L06 a // PB slap ai (K aj + mount) ai (n e // PB mountain + cockt) ail Ejl // PB + cont) ai (n 'Ej // PB container + d) ay Ej // PB holyday, Holliday aise 'E:s@ // PB mayonnaise k) ai (n &|'i: // PB kokain ld) a (k & // PB baldakin @@ -316,12 +355,14 @@ interf) a (ce ei // PB interface p) a (pi & // PB papir L09) a (l &: // PB male L09) a (ld & // PB knald - _) a (ld a // PB aldrig, alder + _) a (ldr a // PB aldrig + a (ld & // PB alder b) a (lkan &: // PB Balkan over) a (lt '& // PB stressed a in 'overalt' s) a (m a // PB sammen _eks) a (m+ '& // PB stressed - eksamen, eksaminere &eks) a (m & // PB + sp) a (m &: // PB isl) a (m 'a: // PB islam, islamisk j) a (m+ a // PB fjams pl) a (m+ & // PB plamage CHECK THIS ONE @@ -342,6 +383,7 @@ interf) a (ce ei // PB interface an (cien aN L06) a (nd & // PB pande a (ndre A // PB andre + a (p a // PB apotek L06) a (nk a // PB banke @g) a (ng 'a // PB stressed a in words ending with -gang - engang, enegang h) a (nk a // PB hank @@ -351,9 +393,7 @@ restaur) ant 'AN // PB added stress t) a (nk A // PB tankstation t) a (x a // PB taxa kålr) a (bi 'A // PB kålrabi - stressed a - au (+ aw // PB auto, autoritet - e) au 'o // PB bureau, niveau - nive) au o + au (++ aw // PB auto, autoritet _biss) au 'a:w // PB Guinea-Bissau s) au (ce O: // PB sauce, bearnaisesauce ch) au (f o @@ -368,6 +408,9 @@ restaur) ant 'AN // PB added stress akkordeon ak'V:deVn attention at'EnS@n athen &t'en // PB Athen + andrews &ndRu:z // PB + angeles &ndZ3lEs + abilene &bili:n // PB str) abads Ab'&s // PB stressed a, silent d disput) a (ts '& // PB stressed amsterd) a (m 'a // PB @@ -390,14 +433,16 @@ amsterd) a (m 'a // PB // PB (French) nouns with final -age and with $alt flag in da_list // stressed a, "age" pronounced [aS@] &) age ($p_alt+ '&:S@ // ravage, bagage + &) age (r$p_alt+ '&:S@ // reportager &r) age ($p_alt+ 'A:S@ // [A] after "r" - garage &) age (re$p_alt+ &S'e@ // not for the "age" words - gagere // "ag" words silent g d) ag (_ &j // PB dag d) ag (e+ &j // PB dage - d) ag (@+ Au // PB daglejer - @d) ag (++ & // PB dommedag + d) ag (l@+ Au // PB daglejer + @d) ag (_++ & // PB dommedag + sd) ag & // PB fødselsdagsgave d) ag (og+ ag // PB pædagog j) ag (e+ &: // PB jage j) ag (uar ag // PB @@ -426,16 +471,22 @@ amsterd) a (m 'a // PB b) ag (til & // PB bagtil b) ag (ud &_: // PB bagud p) age (++ &:S@ // PB page, pagehår + band) age &:S@ // PB gipsbandage sC) ag &j // PB slag, slaget, Skagen, smag + esl) ag (lA Au // PB beslaglægge sC) ag (t ag // PB universitetsvagt + sv) ag (t &j // PB svagt m) ag (t ag // PB verdensmagt - sl) ag (t ag // PB slagte + sl) ag (te ag // PB slagte sl) ag (smål Au // slagsmål + sl) ag (tilf Au // PB slagtilfælde sl) ag (side Au // PB slagside sp) ag (ett &g' // PB spagetti sp) ag (hett &g' // PB spaghetti + sp) ag (num Au // PB r) ag (e+ Au // PB drage, rage C) age (+ &:j@ // PB tage, bage, kage + fl) ager (mus AuV // PB C) ager (_+ &:jV // PB tager, bager, kager l) agd (e &:j // PB lagde g) ager (e+ &S'e // PB gagere @@ -485,6 +536,7 @@ _trienn) ale '&:l@ b b bb b + ko) bb (er w // PB b (il 'b beagle bi:g@l //PB beagle - dog bloody blVdi // PB @@ -509,7 +561,10 @@ _trienn) ale '&:l@ .group be // PB words beginning with "be" with stress on the second syllable (850) - _) be (@ b%E +// They have secondary stress on the second syllable with a preceeding syllable + _) be (@ b%E // PB besta'and +//&) be (@ bE, // PB hv'alrosbest,and + // PB exceptions to the "be" rule _) be (dste bE // bedstefar, bedstemor _) be (nmel bE @@ -520,6 +575,7 @@ _trienn) ale '&:l@ _) be (nchmark bE _) be (nedder bE _) be (nende bE + _) be (net be _) be (nfisk bE _) be (nfedt bE _) be (nfri bE @@ -561,7 +617,7 @@ _trienn) ale '&:l@ // PB nouns in da_list with final -ce - stress on previous syllable &) ce ($p_alt =s@ // ekspeditrice - &) cer ($p_alt =s'er // annoncere + &) cer ($p_alt =s''er // annoncere c (y s // PB s followed by y - cykel c (e s // PB race, procent @@ -593,21 +649,31 @@ _trienn) ale '&:l@ _) ciao (_ tjAw // PB claude klO:d // PB name churchill tSW:Sil // PB - cambridge kejmbRidZ // PB + cambridge kejmbRidZ // PB + connecticut kVn'etikVd // PB + carlisle kAlajl // PB + china tjajn& // PB .group d d d - A) de (_ D3 // PB change to D? + A) de (_ D3 A) d D // PB way too broad? + d (uk d // PB produkt a) d D // PB ad, udenad - dangerously broad + a) de (Cr D3 // PB badedragt - not testet + y) de D3 // PB brydehold Coe) de @-D // PB boede - Co) d (A D // do we need this one? - u) d (elt d // PB udelt + @) d (elt d // PB udelt, tildelt l) d // PB omit d after l - hold, skjold + l) d (et // PB spjældet + d (ør d // PB bildør + d (et d // PB metaldetektor + d (ing d // PB holdingfirma l) d (rig d // PB aldrig l) d (ig d // PB skyldig + bal) de l3 // PB silent d - balde l) d (a d // PB keep d in "baldakin" hel) d (i d // PB keep d in "heldig" fær) d // silent d in færd, færdsel @@ -623,12 +689,16 @@ _trienn) ale '&:l@ hjor) d d // PB exception - pronounce d in 'hjord' stikor) d // PB exception - silent d in 'stikord' d' d //PB d'Aviano - e.g. French and Italian names + woo) d d // PB Hollywood ud) d (A d A) d (C D A) dd D // PB hedder - "er" removed by &) er (_NS2 [V] A) d (s@ // PB fødsel - deleted 30+ rules, this one does the work + ræ) d (sel D // PB + me) d (+ D // PB medspiller A) ds (_ s // PB silent d - palads, trods ø) d (L08+ D // PB nødstop + dø) d (s D // PB dødscelle be) d (st // PB silent d - bedst A) dd (A D // PB redder si) d (s // PB silent d - sidst @@ -639,6 +709,8 @@ stikor) d // PB exception - silent d in 'stikord' hår) d // PB silend d - hård, hårdere stri) d (s D // PB but not silent d in e.g. 'stridsvogn' u) d (C+ D // udsætte + pu) d (s // PB silent d - pudse + smu) ds s // PB tilsmudse u) dt (+ t // PB brudt plu) dsel sl/2 // PB silentg d - pludselig [pl'usli] in) d (C @@ -658,7 +730,7 @@ stikor) d // PB exception - silent d in 'stikord' kla) dd (e D mi) dd (el D mu) dder DV - rø) dd (er D + rø) dder DV kry) dd (er D dd (et D bu) dd (ing D @@ -681,7 +753,7 @@ stikor) d // PB exception - silent d in 'stikord' gui) de (n de ver) d (en d vi) d (er D - gui) de (r de + gui) der dV lu) d (ere d A) d (es D ær) d (es d @@ -717,7 +789,8 @@ stikor) d // PB exception - silent d in 'stikord' fjer) d (e // PB silent d - fjerde L09A) d (ta D // PB modtage, medtage, nedtage in) d (u d - pro) d (u d + pro) ducer (_ dj'usV // PB + pro) ducer (assistent dj'usV // PB in) d (uC d mo) d (ul 'd pen) d (ul 'd // PB pendul @@ -727,20 +800,31 @@ stikor) d // PB exception - silent d in 'stikord' detente det'A:Nt // PB doughnut downVd // PB _) doc (_ dVk // PB Doc - name + dodge dVdZ // PB city + daiquiri d&k@ri // PB drink + _) duke dZu:k // PB Duke - name + _) drive dRAjv // PB drive-in .group é // added by PB - é 'e: // idé, entré + é 'e // idé, entré .group e e e // PB e: => e - +// PB stress on second syllable after initial "be" in .group be +// Secondary stress after a syllable + &b) e (@ E, // PB hv'alrosbest,and // PB general rules l) e e - ll) e (d // PB silent e - billede + perl) e @ // PB + _dil) e (mma 'E // PB + ll) e (de // PB silent e - billede midl) er V // PB midlertidig elleve elv@ // PB _koll) e (ga 'e // PB stressed + _koll) eg (e 'ej // PB stressed kolleger r) e E // PB general rule: [E] after r + klatr) e V // PB + gr) e (s & // PB kongres // dr) e (C@ @ // PP sladresøster - not tested r) e (vn &# // PB revne r) e (kto &# // PB rektor @@ -757,17 +841,20 @@ stikor) d // PB exception - silent d in 'stikord' r) e (ng aj //PB general rule: [&#] after r before ng - streng, dreng r) e (ngø E // PB rengøre r) e (t &# //PB general rule: [&#] after r before t - ret + _tr) e (t e // PB tretal fr) e (l &# // frelse yr) e (+ @ // PB myretue, dyrehold r) e (h @ // PB general rule: [@] after r before h - fårehyrde, varehus @n) e (d @ // PB general rule: [@] after @+n before d - måned + n) e (dgang e // PB m) e (di+ e // PB medicin - _ans) e (+ e // PB avoid [V] in "anser" and [@] in "anse" rn) e (d+ e // PB derned an) e (r @ // PB anerkende L09) e (de E // nede, nederlag + mån) e (d @ // PB L09) e (t e // metal L09) e (l E // mellem + _m) e (l_ e // PB ed) e (r @ // nederlag tr) e (ma E' // trema s) e (dd E // PB seddel @@ -777,22 +864,25 @@ stikor) d // PB exception - silent d in 'stikord' dec) e (mber 'e // PB sept) e (mber 'e // PB eus Wws // PB for Greek names - Zeus, Achilleus -// aml) e 3 // PB gamle tel) e 3 // PB tele afl) e (v 3 // PB aflevere ri) e 3 // PB ferie _a) e (_ 3 // PB ae ød) e 3 // PB øde + god) e @ // PB pl) e (men 3 // PB supplement øbl) e (m 3 // PB møblement hvab) e (har_ 3 // PB hvabehar Ar) e (s_ 3_: // PB gøres r) eau o // PB bureaukratiske ee 'e: // PB ideer, cafeer + fr) ee (lan i: // PB freelance b) ee (d ee // PB beedige en) e @ // PB ene, eneste + en) e (rgi E // PB br) e (L09 & // PB bremse - sn) e (K e? // PB sne, snebold + sn) e (K e // PB sne, snebold + sn) e (rp E // PB snerpet sn) ed (k e e // PB silent d - snedker _s) e (_ e? // PB se e (mball A // PB emballere, emballage @@ -826,13 +916,14 @@ provenc) e // PB Provence - skip the e prov) e (nce 'A: // PB Provence e (gsot &# // PB blegsot e (gfi &# // PB blegfis - r) e (st &# // PB resten, restaurant + r) e (ste &# // PB resten, restaurant e (gansigt &# // PB blegansigt _kongr) e (s '& // PB kongres - stressed but not after a syllable _regr) e (s '& // PB regres _rødb) e (de 'e // PB stressed e in 'rødbede' _aller) e (de_ E // PB allerede - otherwise the E is changed by another rule _im) e (ns+ 'e // PB stressed + _magn) e (t 'e // PB stressed lar) e (do 'e // PB // PB final -em - stressed e @@ -851,11 +942,14 @@ _myxød) e (m 'e _syst) e (m 'e _teor) e (m 'e _ød) e (m 'e - _el) e (ndig 'e // PB stressed e in elendig - _leb) e (ndig 'e // PB stressed e in lebendig + + el) e (ndig E // PB møgelendig - steressed with $alt rule + leb) e (ndig 'E // PB steressed with $alt rule + _ball) e (t@ 'E // PB balletdanser +_en_ball) e (t 'E // PB lini) e @ // PB changed from [e] to [@] ft) e (r @ // PB oftere - r) e (nd a // PB rend + _r) e (nd+ a // PB rend @st) e (n+ e: // øjesten, skorstene h) e (n_+ e // hen carst) e (n @ @@ -865,10 +959,12 @@ _myxød) e (m 'e entente ANt'ANt // PB prof) essionel 'eSonel // PB eisenhower ajs@nhAuV // PB + eiger ajgV // PB Eiger mountain sp) ee (d i: // PB speedbåd // PB Words ending with e - general rule @) e (_+ 3 // PB husleje + afs) e (_ e // PB afse _) e (_speak i // PB eSpeak - capital s makes the e one word _) e (_mail i // PB e-mail // PB Words ending with -te @@ -878,6 +974,8 @@ _myxød) e (m 'e // PB Words ending with -se or -ce s) e (_ @ c) e (_ @ + overs) e (_ e + _ans) e (+ e // PB avoid [V] in "anser" and [@] in "anse" // PB Words ending with -ske (and ste, spe) L08) e (_ @ // PB påske, forske @@ -919,7 +1017,8 @@ _intell) e (kt 'E _proj) e (kt 'E _prosp) e (kt 'E _præf) e (kt 'E - resp) e (kt 'E + _resp) e (kt 'E + resp) e (ktabel E _sociol) e (kt 'E _subj) e (kt 'E _susp) e (kt 'E @@ -955,11 +1054,14 @@ _sakram) e (nte 'e k) ende (_ E-n@ // genkende, kende, anerkende sv) ende (_ E-n@ // PB not a -ende suffix - svende henv) ende (_ E-n@ // PB + anv) ende (_ E-n@ // PB + røvr) ende (_ a-n@ // PB røvrende L08) e (gt e // PB stegt L08) e (g a // PB steg, spegepølse _st) eg (_ e // steg - verb, problem with noun = "roast" best) eg (_ 'e // PB besteg + best) eg (et_ 'e // PB besteget n) egl ajl // PB negl r) egel Ejl // PB regel r) egl Ejl // PB regler @@ -968,7 +1070,8 @@ _sakram) e (nte 'e _) eget (_ a:j@D // PB eget r) eg (er Eg // PB e=> E eg (n aj // PB regn, tegning, lege - str) eg aj // PB stregen +underl) eg ej // PB underlegen + str) eg (+ aj // PB stregen p) eg aj // PB pegefinger _) ege (_ e:j@ // PB added _ - ege(træer) _) ege (træ e:j@ // PB added _ - egetræe @@ -980,6 +1083,7 @@ _sakram) e (nte 'e r) ej (s aj en (gage aN // engagere en (tre aN + en (tré aN // PB c) en (t en c) en (tA en c) en (tC en @@ -988,19 +1092,21 @@ _sakram) e (nte 'e r) en (ce AN // reference r) edd ED // PB redder br) edd Ed // PB bredde - _tr) e (t a // tretten + _tr) e (tten a // tretten _tr) e (d E // tredje - ej (+ aj // PB changed from ai to aj - nej + ej (++ aj // PB changed from ai to aj - nej, arbejde v) ej (r 'e v) ejr (e_ ajR // PB vejre v) ejr (er_ ajR // PB vejrer _offic) e (_ // office (officepakke) fl) e (de+ e // PB aflede &) edet (_ @D3d // PB hovedet + r) edet (_ ED3d // PB helbredet st) edet (_ ED3d // PB værkstedet Ad) en (@ @-n // udenlandsk, udenad Ad) en (t en // PB identificere &) ene (_ @-n@ + gr) ene En@ // PB grene ucc) es 'e nog) et (_ D // PB noget ir) e (n 'e @@ -1012,6 +1118,8 @@ _offic) e (_ // office (officepakke) forur) e (ne 'e // PB stressed - forurene _terap) eut 'Wwd // PB stressed _torp) e (do 'e // PB stressed + _cel) e (ber 'e // PB stressed + // PB a few words with final -es - stressed e abc) e (s 'e cypr) e (s '& @@ -1022,16 +1130,24 @@ _terap) eut 'Wwd // PB stressed ompet) en (ce aN ress) en (timent aN // PB ressentiment m) edie 'edj3 // medie, kommedie + m) edier 'edjV // medier, kommedier inds) e e // PB indse + inds) e (r_ e // PB indser etagere et&S'E:R // PB espeak ispi:k // PB eindhoven ajnh'o:f@n // PB einstein ajnstajn eyeliner ajlajnV // PB + ey i // PB jockey eiffel ajf3l // PB Eiffeltårnet + ef) eu Vj // PB plant _) earl W:l/2 // PB Earl + _) earp W:b // PB name + _) east i:sd // PB Eastwood eu (rop Wu // PB Europa - _t) e (_ e // PB + eau 'o // PB bureau, niveau + _t) e (_ e // PB te + kin) e (s 'e // PB kineser // PB plural suffix -ene @) ene (_S3 @n@ // brødrene - the brothers @@ -1047,6 +1163,7 @@ _terap) eut 'Wwd // PB stressed @) el (s @l // fødselsdag, fødselstal @) el (A @l // fødselar @) el (t_ @l // ædelt + t) el (t_ el // PB ilttelt // PB exceptions to the -el rule // PB final -el i da_list - stressed e @@ -1054,7 +1171,13 @@ _terap) eut 'Wwd // PB stressed &) el (l$p_alt ''E - modellen - only one l _) el el // elkedel +muskat) el ''El // PB + el (sk+ el // PB naturelsker +intellektu) el el // // PB bestandd) el el // PB + halvd) el el // PB + d) el (t+ el // PB tildelt + lob) el (ia 'el // PB d) el (A+ el // PB dele, omdele edd) el l/2 // PB seddel medd) el del // PB meddel @@ -1064,11 +1187,12 @@ _offici) el (+ 'el // PB officiel _mod) el 'el // PB modelbureau u) el (+ 'el // aktuel, seksuel, visuel gennemsku) el (ig =el - ur) el (+ '&#l // konjunkturel + ur) el (_+ '&#l // konjunkturel and) el el // andel and) el (se @l // PB forbandelse hand) el @l // handel i) el (+ 'el // arteriel, artificiel + i) el (t+ 'el // arterielt, artificielt spani) el @l // PB cockerspaniel dani) el el // Daniel ford) el el // fordel @@ -1121,7 +1245,7 @@ mortad) el 'el nuv) el 'el ovend) el el parall) el 'el - c) el 'el // parcelhus + parc) el 'el // parcelhus past) el 'el ped) el 'el procentd) el el @@ -1138,15 +1262,18 @@ reserved) el el sard) el 'el s) el (e el // sikkerhedssele sigtem) el el - skalp) el 'el +_skalp) el 'el sport) el 'el stikked) el el såv) el 'el - tab) el 'el + _tab) el 'el + tab) el el +respektab) el @l // PB tarant) el 'el univers) el 'el +_frikad) el (l 'El // PB stressed - frikadelle +frikad) el (l El // PB verdensd) el el -// t) el (+ el @) el (øs el // PB mageløs el (eg+ el // PB juleleg @@ -1158,11 +1285,12 @@ verdensd) el el // exceptions - don't remove "en" aft) en @n // PB avoid [Au] when aft(en) is translated &g) en (+ @n // PB avoid [g] when læg(en) is translated - _ag) en (t 'en // PB agent - ag) en (t en // PB agent + _ag) en (t 'en // PB agent + ag) en (t en // PB agent &g) en (st en // PB genstand &g) en (kend en // PB genkende &g) enn (em en // ugennemskuelig +kuglep) en En // PB ord) en @n anci) enn EN // anciennitet retskaff) en @n @@ -1181,18 +1309,24 @@ _præsid) en (t 'en // præsidentfrue g) en (st en // PB genstand g) en (sk en // PB genskabe t) en (A @n // PB TEST - femtenårig + st) en (A en // PB stenograf eksist) en (s 'en // PB eksistens _resid) en (s 'en // PB residens resid) en (s en // PB residens _acetyl) en 'en // PB _influ) en (za 'En // PB +skizofr) en 'En // PB + + s) en (sib AN // PB sensibel + _rev) en (che 'An // PB stressed + rev) en (che 'An // PB not stressed after a syllable // PB $alt words with final -ent in da_list - stressed e - &) ent ($p_alt+ 'end // student - &) ent (&$p_alt+ 'end // student - &r) ent ($p_alt+ '&#nd // omtrent - &) ent (ur$p_alt+ end' // agentur - stressed u - &) ent (alsk$p_alt+ end' // + "alsk" - stressed a - orientalsk + &) ent ($p_alt+ 'ent // student + &) ent (&$p_alt+ 'ent // student + &r) ent ($p_alt+ '&#nt // omtrent + &) ent (ur$p_alt+ ent' // agentur - stressed u + &) ent (alsk$p_alt+ ent' // + "alsk" - stressed a - orientalsk // exceptions acc) ent (+ AN // PB ev) ent (A+ ent // PB eventyr, eventuel @@ -1203,6 +1337,7 @@ _influ) en (za 'En // PB // common affix -ender &) ender (_ EnV // anliggender, foretagender + &r) ender (_ anV // røvrender .group er // PB noun suffix -er (perler - pearls), -ers (perlers - pearls') -erne (perlerne - the pearls), -ernes (perlernes - the pearls') @@ -1213,9 +1348,9 @@ _influ) en (za 'En // PB &) ere (_ 3V // elskere &) eren (_ @r3n // elskeren &) erens (_ @r3ns // elskerens - &) ers (_S3 Vs // elskers + &) ers (_ Vs // elskers &) erne (_ Vn@ // elskerne - &) ernes (_S5 Vn@s // elskernes + &) ernes (_ Vn@s // elskernes &) erste (_ Vst@ //midterste &) ert (_ Vt // lummert @@ -1223,12 +1358,19 @@ _influ) en (za 'En // PB g) er (_++ V // våger, læger [ l'Ejer] g) er (t+ er // PB Gerta @g) erne (++ Vn@ // lægerne + fing) erne (m Vne // PB fingernem @d) erne (++ Vn@ // let the nd rule kick in - inderne g) er (n++ Er // gerning reag) ere (_ er3 // overreagere _reag) ere (_ 'er3 // overreagere + vurd) ere (_ er3 // overvurdere ng) er (_++ V // unger - j) er (n+ Er // jern, stjerne +revolv) er V // PB + skid) er Vr // PB + all) er V // PB allersidst + all) er (g er // PB allergisk + j) er (n+ Er // jern + j) er (ne++ Er // PB stjerne bunk) er V // PB not a -er suffix alexand) er =dV // PB Alexander report) er V // PN not a suffix @@ -1246,7 +1388,7 @@ _perif) er 'er // PB stressed up) er (C V // PB superfølsom @d) er (C V // PB hæderlig - TOO BROAD? mm) er (C V // PB sommerhilsen - &f) er (@ @ // PB konference + &nf) er (@ @ // PB konference // not a -erne suffix _mod) erne (+ 'ern@ @@ -1257,6 +1399,7 @@ _perif) er 'er // PB stressed &kas) erne (+ ern@ _lant) erne (+ 'ern@ &lant) erne (+ ern@ + plant) erne (++ Vn@ _luc) erne (+ 'ern@ &luc) erne (+ ern@ _saut) erne (+ 'ern @@ -1270,6 +1413,8 @@ _perif) er 'er // PB stressed &) er ($p_alt++ ''er // PB stressed - repeter // exceptions fing) er (en VR // fingeren - clsashes with 'fing'ere' + _barb) er 'er // PB + lev) er (eg+ @r // PB leveregel // PB stressed e in words with -ering (1.100) in da_ list - likvidering &) ering ($p_alt ''ereN @@ -1296,16 +1441,21 @@ reserv) ert 'ert alt) er (nativ 'ER // PB stressed LOOK FOR MORE C) er (At V // PB probably way too broad - offeret + c) er (e+ e // PB velkvalificeret + v) er (et er // PB kultiverret + t) er (et er // PB citeret bl) er (e er // PB genetablere desp) er (at 3R // PB desperat d) er (fra er // PB derfra + d) er (et er // PB vurderet v) er (C+ Er // PB vers, verden øv) er (st V // PB perv) er (s 'er // PB stressed e - pervers Cav) er (+ V // PB laver, saver lev) er (C+ V // levertran led) er (@ V // lederkursus - @st) er (@ V // PB kryst*er*agtig + yst) er (@ V // PB kryst*er*agtig + _myst) er (iu 'e // PB mysterium _hyst) er (i 'er // PB hysterisk hust) er (i er // PB not stressed after a syllable - overhysterisk @st) er (ie 'er // PB ministeriet @@ -1314,6 +1464,7 @@ reserv) ert 'ert _h) er (++ Er // PB her h) erre (+ ER@ // PB herre hv) er (+ er // PB hver + enhv) er 'er // PB stressed fork) er (t+ er // PB forkert Cik) er (+ V // PB epileptiker, optiker kk) er (+ V // PB rykker @@ -1325,12 +1476,17 @@ reserv) ert 'ert _inf) er (no 'Er // PB inferno st) er (et r // PB orkesteret t) er (C V // PB lattermild + int) er (n+ 'Er // PB + t) er (min Er // PB terminal + t) er (p Er // PB terpentin, terpe + t) er (mo Er // PB termometer t) er (r E // PB terror _) er (C %er // PB er + consonant: stress on next syllable - er'hverv _) er (go er // PB not stress on next in "ergo..." ov) er (+ V // PB overbevisende, sover am) er (ika_ 'er // PB Amerika - v) er (i Vr' // PB røveri - stressed i + _røv) er (i Vr' // PB røveri - stressed i + røv) er (i Vr // PB togrøveri sv) er (ige Er // PB ærg) err Erg // PB ærgerrig offic) er 'er // PB officer - stressed e @@ -1339,6 +1495,7 @@ reserv) ert 'ert n) er (t Er // PB genert _L06) er (_ &r // PB per L06L06) er V // PB klipper + sk) er V // PB fisker nd) er V // PB under _) er (_ &r // PB er L09) er (ne_ V // PB kameraerne @@ -1347,15 +1504,18 @@ L06L06) er V // PB klipper _l) er (_++ er // PB ler v) er (r_ er // PB levere th) er_ V // Luther + gt) er V // PB agter hj) er Er // PB hjerne stj) er+ Er // PB stjerne + øl) er V // PB brøler t) erræn &r'&#N // PB terræn _g) er (ne_+ Er // PB gerne j) er (g Er // PB bjerg @m) er (sk V // PB romersk ob) er (st V // PB + rooms) ervice Wvis // PB + d) erby A:bi // PB _all) erede (_ @reD@ -// &) eren (s_ 3r3n .group ed // PB verb suffix - ede (elskede - lovede) @@ -1372,6 +1532,7 @@ L06L06) er V // PB klipper _fr) ede (_+ ED@ // PB frede vr) ede (_+ ED@ // PB vrede ler) ede (_+ ED@ // PB fuglerede + b) ede (_+ eD@ // PB embede hindr) ede (_ 3D@ // PB forhindrede år) ede (_+ 3D@ // PB sårede odr) ede (_+ 3D@ // PB fodrede @@ -1385,15 +1546,30 @@ L06L06) er V // PB klipper .group et // PB verb suffix -et (har elsket - has loved) // not treated as a suffix any more - &) et (_+ @D // PB elsket + @) et (_+ @D // PB elsket // PB exceptions: not a 'et suffix _sk) et et // PB sket + el) et (+ et // PB pærelet + geb) et (+ 'et // PB s) et (_+ et // PB set it) et (_+ 'et // aktivitet _rak) et 'Et // PB raket + _brik) et 'Et // PB + brik) et Et // PB _toil) et 'Et // PB toilet, toilette _kok) et 'Et // PB stressed - koketteri, koket +_kvint) et 'Et // PB +_kvart) et 'Et // PB + kvint) et Et // PB + kvart) et Et // PB +_tromp) et 'et // PB stressed + tromp) et et // PB +_klarin) et 'et // PB +_servi) et 'et // PB + servi) et et // PB +klarin) et et // PB + _plan) et 'et // PB meg) et (+ et // PB not a suffix om) et (++ 'et // PB kilometer, kometer r) et (_++ &#t // ret @@ -1406,9 +1582,11 @@ L06L06) er V // PB klipper amul) et 'et // PB alfab) et 'et // pb _bill) et 'et // PB stressed + bill) et et // PB _bill) ett 'et // PB stressed - only one t _kask) et 'et // PB stressed _bajon) et 'Et // PB stressed +_tabur) et (+ '&#t // PB bajon) et Et // PB udsl) et et // PB udslet intern) et Et // PB @@ -1480,7 +1658,8 @@ _vinaigr) ette '&t@ a) ff (ære f // PB affære a) ff (age f // PB staffage a) ff (utage f // PB - + ra) ff (e f // PB straffe + a) ff (el f // PB vaffel, taffel a) f (ro f // PB afroasiat, afroamerikaner, afrohår etc. a) f (re f // PB blafre @) fobi fob'i // PB xenofobi, hydrofobi @@ -1493,11 +1672,12 @@ _vinaigr) ette '&t@ Ca) f (t f Ca) f (A f ga) f (fel f + va) f (l f // PB vafler + ga) f (l f // PB gafler gra) f f gra) f (A f gra) f (C f ra) f (ik f - ra) f (fe f fire fi:V // PB fire sa) f (ar f sta) f (e f @@ -1510,6 +1690,7 @@ _vinaigr) ette '&t@ g g gg (e g // lægge ru) g // PB rug, rugmel + fru) g (t g // PB æ) g (ernA j // PB lægerne o) g (ernA // PB nekrologerne sti) gmata gm'&:t& // PB stressed @@ -1527,6 +1708,7 @@ _vinaigr) ette '&t@ al) geriet Sj3r'i@d // PB Algeriet al) gerier Sj'iV // PB Algeriet al) gerisk Sj'i:rsg + guinea gin'e& // PB ødi) g (t_ // nødigt i) g (i g g (entl j // PB egentlig @@ -1543,24 +1725,30 @@ _vinaigr) ette '&t@ æ) g (e j æl) g (e j // PB sælge vælge y) g (e j // syge, ryge, myge - l) g (_ j + l) g (_ j // valg + l) g (et_ j // PB valget l) g (C j // PB bælgmørkt, bælgplante ø) g j // PB deleted (_ g (le j // PB mægler, besegle g (lem g // PB glemt + g )led g // PB gled val) g (t // PB silent g - valgt sy) g // PB silent g -sygdom spur) gte t@ // PB silent g - spurgte n) gæ gE Co) g w // PB sprog, tog, toge + vo) g (t g // PB bevogtning + surro) g (at g // PB to) g (a g // PB exception toga to) g (o g // PB exception Togo to) g (t g // PB exception togt + vo) g (te g // PB bevogte ro) g (an g // PB arrogance ro) g (es g // PB progesteron - o) g (r g // autograf + o) g (raf g // autograf o) g (n u // PB g => u - vogn, sogn r) g (_ w + ær) g w // PB bjærge r) g (er_ u // PB herberger u) g (e : u) g (ene S // PB ugenert @@ -1568,6 +1756,7 @@ _vinaigr) ette '&t@ u) g (enL11 g // PB ugengældt, ugenkendelig u) g (l ? ø) ge (+ :j@ // PB bøgetræ, øge + mø) ge (len :je // PB møgelendig ø) g (n j g (iv+ g // avoid letter "g" pronounced with phoneme S dra) g (en w // PB dragen, uopdragen @@ -1606,6 +1795,7 @@ _vinaigr) ette '&t@ geronimo dZer'VnimO:u // PB // PB final -gi in da_list - stressed i &) gi ($p_alt g'i // pædagogi + &) gi (sk$p_alt =gi // pædagogisk _lo) gi (_ S'i // logi lo) g (a g @@ -1620,6 +1810,7 @@ _vinaigr) ette '&t@ å) g u // PB åg, åge ni) gger gV // PB nigger ne) g (_ j // PB neg, juleneg + ve) g (en j // PB undvegen ne) ger (++ V // PB neger te) g (ori g // kategori gear gir // PB gear, bakgear @@ -1634,6 +1825,7 @@ _vinaigr) ette '&t@ geneve Sen'E:v // PB genève Sen'E:v // PB _) gudskelov (_ gusg@lVu // PB + georgia dZV:dZj& .group ge @@ -1668,6 +1860,7 @@ _korte) ge =Se _a) ge (re g'e // PB agere ge (nial ge // PB ge (ni Se // PB + ge (nind ge // PB genindspille ger (ning gEr // PB bud) ge (t S'E @@ -1685,10 +1878,21 @@ _korte) ge =Se housecoat hAuskowd // PB hitech hajtek // PB homer hom'er // PB Homer - Greek + hawaii h&w'a:ji // PB + heather hEDV // PB .group i i i // PB i: => i - made a lot of rules redundant ig (_ i // dejlig, rig + r) i (gg e // PB rigge + _l) ig (_stille ek // PB problem: lig = "dead body" and lig = the verb "lie" + _l) ig (_pænt ek // PB + _l) ig (_ordentligt ek // PB + _l) ig (_godt ek // PB + _l) ig (_roligt ek // PB + færd) ig i // PB silent g + hurt) ig i // PB silent g + ig (hed i // PB vittighed _k) ig (_ ig // PB kig _t) ig (_ eg // PB tig t) igg eg // PB tigge @@ -1698,6 +1902,7 @@ _korte) ge =Se l) ig (i ig // PB religiøs pl) ig (t ek // PB pligt ig (s i // PB silent g -rigsret +samtid) ig i // PB silent g mussol) i (ni 'i // PB _præc) i (s 'i // PB stressed _av) i (s 'i // PB stressed @@ -1708,13 +1913,21 @@ _molev) i (t 'i // PB stressed - molevitten _marskand) i (s 'i // PB stressed - marskandiser _princ) i (p 'i // PB stressed _mess) i (as 'i // PB + _mart) i (ni 'i // PB cocktail + _alb) i (no 'i // PB stressed n) ij (megen aj // PB Nijmegen n) i (gg e // PB nigger + n) i (p e // PB nip, nippe n) i (ss e // PB nisse skr) i (pt 'e? // PB stressed - manuskript r) i (ft e // PB skrift, rift, drift + v) i (ft e // PB vifte + d) i (sk e // PB købmandsdisk + d) i (skett i // PB diskette + d) i (sku i // PB diskutere kr) i (cket e // PB f) i (sk e // PB + gr) i (m e // PB l) i (lla e // PB kv) i (st e // PB @@ -1724,32 +1937,29 @@ _princ) i (p 'i // PB stressed // therefore u- is removed in group u before the word is translated // since the u+list words keep the stress. // Any other syllable before the word reverts to normal stress - &) ig ($p_alt+ =i // velærværdig, gudvelbehagelig + &) ig ($p_alt++ =i // velærværdig, gudvelbehagelig ige i:@ // PB deleted [(_] - pige, pigen, stige, sige iger i:V // PB piger p) igen i:3n // PB pigen kr) igen i:3n // PB krigen + dil) igen (ce iS'AN // PB diligence kr) igs is - d) ige (r ig'e // PB redigere + ed) ige (r ig'e // PB redigere rr) ige (r ig'e // PB korrigere nav) ige (r ig'e // PB navigere dir) ige (r ig'e // PB dirigere -intell) ige (nt ig'e // PB intelligent +intell) ige (n ig'e // PB intelligent fr) igea (r igi // PB frigear _) ige (n ig'E // PB igen rol) ige iE // PB rolige, beroligende + værd) ig i // PB silent g idel i:D@l // PB idel israel isrA:l // PB Israel vend) ige i:3 // PB nødvendige iew j'u -// i (nK i -// i (ng e // PB Inge, ingen -// sv) i (ng e // PB sving -// v) i (nk e // PB vinkel -// v) i (ng e // PB vinge -// s) i (nk e // PB sinke i (nL11 e //PB blinke, sinke, vinge, sving + v) i (nkæld i // PB vinkælder s) i (d e // PB sidde s) i (ds i // PB sidst t) i (n e // PB stinke @@ -1760,19 +1970,28 @@ intell) ige (nt ig'e // PB intelligent dr) i (l e // PB drille br) i (lle e // PB briller i (dt e // PB midt, lidt + _sol) i (d 'i // PB solid + b) i (dt i // PB bidt + b) i (tter e // PB + sm) i (dt i // PB sk) i (dt i // PB skidt + sk) i (mm e // PB skimmel mask) i (n 'i // PB stressed - maskinskrive h) i (d i // PB hidtil b) i (lled e / PB billede kr) i (dt i // PB skridt, kridt v) i (dt i // PB vidt + v) i (sse e // PB visse, forvisse forv) i (s i // PB forvise l) i (st e // PB liste i (nd e // PB ind i (nt e // PB intakt f) i (nt_ i // PB + v) i (mp e // PB vimpel + h) i (m e // PB himmel am) i (go 'i // PB amigo magas) i 'i // PB magasin + _kap) i (tel 'i // PB stressed asp) i (c 'i // PB aspic - only this word // PB words with final -id in da_list - stressed i @@ -1790,9 +2009,12 @@ intell) ige (nt ig'e // PB intelligent // PB words with final -ik in da_list - stressed i &) ik ($p_alt ''ik // romantik + &) ik (er$p_alt =ik // romantiker &r) ik ($p_alt ''ek // fabrik &) ik (k$p_alt ''i // antikke - only one k &r) ik (k$p_alt ''e // fabrikker - only one k + mim) ik (er ik // PB mimiker + kom) ik (er ik // PB not stressed // PB words with final -ti in da_list - stressed i &t) i ($p_alt 'i // politi @@ -1800,6 +2022,28 @@ intell) ige (nt ig'e // PB intelligent // PB words with final -inde in da_list - stressed i &) inde ($p_alt 'en@ // malerinde +// PB French words with final -ier + atel) ier j'e + bank) ier j'e +barbad) ier j'e + coll) ier j'e + croup) ier j'e + den) ier j'e + doss) ier j'e +elegant) ier j'e + espal) ier j'e +financ) ier j'e +finans) ier j'e +grenad) ier j'e +konferenc) ier j'e +kostum) ier j'e + lanc) ier j'e + met) ier j'e +particul) ier j'e + port) ier j'e + rent) ier j'e + spal) ier j'e + L10am) i (lla 'i // PB Camilla, Kamilla _alib) i 'i // PB alibi _fob) i 'i // PB fobi @@ -1807,23 +2051,32 @@ _konfl) i (kt 'i // PB stressed _pap) i (r 'i // PB stressed _tap) i (r 'i // PB stressed _vels) i (gn 'i // PB stressed + _just) i (ts 'i // PB + _kul) i (ss 'i // PB kulisse i (nn e - i (mK e +// i (mK e l) i (m i // PB lim gl) i (m e // PB glimt, glimrende i (kK e // PB ikke, pik + lin) i (k i // PB klinik + @t) i (k i // PB ferieromantik + sk) i (k i // PB skikkelse + _art) i (k 'i // PB stressed artikkel m) i (k i // PB mikroskop +gudhjælpem) ig aj // PB g) i (k+ i // PB begik i (x e // PB fixe + m) i (ks e // PB mikse mus) i (k i // PB musik it) i (k i // PB politik _g) i (k_ i // PB i (k@ i // PB antikvar v) i (k i // PB kvik - v) i (kl e // OB vikle + v) i (kl e // PB vikle k) i (kC+ i // PB kiks, kikkert l) i (kv i // PB likvid fl) i (C i // PB flid + fl) ig i // PB høflig r) ikk (+ ek // PB skiderikker t) i (me i: // PB time s) i (dA+ i: // PB siden @@ -1837,16 +2090,22 @@ _konfl) i (kt 'i // PB stressed st) i (k e // PB stik spl) i (t e // PB splitte d) i (gt e // PB heltedigt + sned) i (g i // PB ld) ig i // PB heldig l) i (p e // PB slippe r) i (k e // PB drik, skiderik - l) i (dt e // PB lidt + br) i (ke i // PB briket + _l) i (dt e // PB lidt + bl) i (dt i // PB L08) i (l_ e // PB spil, skil - _st) i (l_ i // PB stil + st) i (l_ i // PB stil + best) i (l e // PB L08) i (lt e // PB skilt, adskilt spl) i (n e // PB splint L08) i (ll e // PB spille - problem with the verb (ud)spile/(ud)spil[sbil] L08) i (ld i // PB spilde + L08) i (ls e // PB skilsmisse + sk) i (ldr e // PB skildring m) i (dda e // PB middag m) i (ste e // PB miste p) i (nd e // PB pind @@ -1854,8 +2113,7 @@ _konfl) i (kt 'i // PB stressed L08) i (L06 i // PB skib tv) i (v i // PB tvivl v) i (gt e // PB vigtig - ev) i (g i // PB evigt, evindelig - værd) ig i // PB silent g + ev) ig i // PB evigt, evindelig v) i (l_+ e // PB vil hv) i (l+ i // PB hvil hv) i (lk+ e // PB hvilken @@ -1880,8 +2138,23 @@ _polit) i 'i // PB politi, politik - stressed i all) igevel 'i@vEl // PB stressed i - alligevel _band) i (t 'i // PB bandit _vedl) i (ge 'i // PB vedligeholde +dispon) i (bel 'i // PB stressed + eksig) i (bel 'i // PB stressed + fleks) i (bel 'i // PB stressed + fung) i (bel 'i // PB stressed + horr) i (bel 'i // PB stressed +irrevers) i (bel 'i // PB stressed +kompat) i (bel 'i // PB stressed +konvert) i (bel 'i // PB stressed + pen) i (bel 'i // PB stressed +perfekt) i (bel 'i // PB stressed + plaus) i (bel 'i // PB stressed +revers) i (bel 'i // PB stressed + sens) i (bel 'i // PB stressed +suggest) i (bel 'i // PB stressed + vis) i (bel 'i // PB stressed _medl) i (denhed 'i // PB medlidenhed - stressed - _omkr) i (ng 'e? // PB stressed e in 'omkring' + _omkr) i (ng 'e // PB stressed e in 'omkring' kn) i (p e? // PB knippel kn) i (v i // PB kniv _min) i (ster_ 'i // PB minister - stressed i @@ -1889,7 +2162,10 @@ _polit) i 'i // PB politi, politik - stressed i _re) i (ster 'i // PB register - stressed ii r) i (st e // PB brist, rist d) ie (sel i // PB dieselolie - k) io (sk jV // PB kiosk + k) io (sk jV // PB kiosk + tr) i (ck e // PB trick + r) i (bs e // PB +_franc) i (sco 'i // PB // PB put stress on the syllable before final 'ium' - words in da_list &) ium ($p_alt =iOm // territorium @@ -1903,13 +2179,13 @@ _polit) i 'i // PB politi, politik - stressed i // PB stressed i in words with final -mi in da_list &m) i ($p_alt ''i // økonomi + &m) i (sk$p_alt =i // stress on the previous syllable - økonomisk // PB stressed i in words with final -il in da_list &) il ($p_alt 'il // pædofil r) i (si e // PB risikere r) i (siko i // PB risiko -// r) i (sl e // risle p) i (ll e // PB pille lat) i (nis i // PB latinisme k) i (et 'i // PB Tyrkiet @@ -1923,6 +2199,7 @@ _rapsod) i 'i // PB rapsodi _abbed) i 'i // PB _ortopæd) i 'i // PB ortopædi swah) i (li 'i // PB stressed i +_hæmor) i (d 'i // PB hæmorider // stressed final i _akromegal) i 'i _anomal) i 'i @@ -1967,6 +2244,7 @@ _terap) i 'i &s) i ($p_alt 'i // fantasi, afasi v) i (sk e // PB viskelæder + v) i (sne e // PB l) i (e j r) i (gt e // PB rigtigt l) ig (g+ e // PB ligge - only one g @@ -1980,6 +2258,7 @@ _terap) i 'i des) ign ain ingen) i (ør ant) igone 'igon@ // PB Antigone - Greek name + image imidZ .group in @@ -1993,6 +2272,7 @@ _terap) i 'i .group is // PB words ending with -ist in da_list with $alt - stressed i &) ist ($p_alt ''ist // bassist + &) ist (ik$p_altS4 ist''ik // journalistik .group it // PB words with final -it - stressed i @@ -2031,13 +2311,20 @@ _sport) iv 'iw j j j (aw dZ - j (ack dZ + ja (ck dZ& + jerry dZeri // PB j (ob dZ j (ohn dZ + joe dZOu + jackie dZ&ki // PB + junkie dZVnki // PB + jo (ckey dZV // PB _) j (im_ dZ // PB + jimmy dZemi // PB _) j (eff dZ // PB j (azz dZ // PB je (t dZE // PB jetfly + ø) j (et j // PB øjet, overtøjet j (ungl dZ // PB jungle _) jersey (_ dZW:si // PB New Jersey _) jersey (s_ dZW:si // PB New Jerseys @@ -2048,6 +2335,7 @@ _sport) iv 'iw en) j (ambe S // PB enjambement ro) j (ekt S // projekt a) j (ou S // ajour + j (ongl S // PB jonglør j (ournal S // PB journal ma) j (or j' // PB major j (uice dZ //PB juice @@ -2068,9 +2356,15 @@ _sport) iv 'iw kk k kanterel kant@r'&#l // PB kumquat kVmkwVd // PB + kakerlak kak@l'ak // PB &) kvarter kvarter // PB kommandokvarter s) k g + _spe) k (takk ' // silent k, stresssed a - spektakkel + _spe) k (takl ' // silent k, stressed a - spektakler + spe) k (takk // silent k - spektakkel + spe) k (takl // silent k - spektakler &) k k // after stressed vowel + _) kate (_ kEjt // PB name // &) kk g .group l // PB l changed to l/3 in ph_danish @@ -2085,12 +2379,14 @@ _sport) iv 'iw &) log (i$p_alt log' // mytologi // PB nouns in da_list with final -let - stressed e - &) let ($p_alt l'et // amulet + &) let ($p_alt l'Et // amulet + &) let (t$p_alt l'E // avoid double t - toilettet s) l l/2 // PB add a bit more to l after s f) l l/2 // PB add a bit more to l after f b) l l/2 // PB add a bit more to l after b &) ld (er l // PB silent d - anmelder + sø) lv l // PB silent v se) lv l // PB selv, selvfølgelig, selvhjælp se) lv (e lv // PB selve, selvet bo) ld ld @@ -2099,9 +2395,12 @@ _sport) iv 'iw leger lajV // PB leger legem lE@m // PB legemsdel lotion l3uSjn // PB håndlotion - levere lev'eV // PB -// lever lev'er // PB + lorraine loRE:n // PB name + he) lg (e lj // PB Helge, helgen +// levere lev'eV // PB + _) lee (_ li: // PB the name Lee @) levere leveV // PB + ley li // PB volley .group m m m // PB m? -> m @@ -2109,9 +2408,12 @@ _sport) iv 'iw m (A m gour) mand %mAN // PB gourmand _gour) mand m''AN // PB gourment + _) mannequin m&n@k'EN // PB + mannequin m&n@kEN // PB _) mere (_ mer // PB mere matine m&tin'e // PB _) meget (_ ma:j@D // PB meget + _) megen (_ ma:j@n // PB megen _) medea med'E:& // PB Medea montgomery mVndg'Vmri // PB mareridt mA:@rit // PB @@ -2127,6 +2429,8 @@ _sport) iv 'iw miguel _^_ES // PB madero _^_ES // PB money mVni // PB + makeup mEjk'Vb // PB + madagaskar m&d&g'&sk& // PB .group me // PB General rule for words with -ment @@ -2194,7 +2498,7 @@ _posse) ment m'AN // PB possement _raffine) ment m'AN // PB raffinement _ressenti) ment m'AN // PB ressentiment _ræsonne) ment m'AN // PB ræsonnement -_signale) ment m'AN // PB signalement +_signale) ment m''AN // PB signalement _sorti) ment m'AN // PB sortiment _supple) ment m'AN // PB supplement _tempera) ment m'AN // PB temperament @@ -2208,6 +2512,7 @@ _bombarde) ment m'AN // PB bombardement // PB words with final -ni in da_list - stressed i &) ni ($p_alt+ 'ni // ironi &) ni (sk$p_alt+ =ni // ironisk - stress on pervious syllable before sk +_harmo) nika =nik& // PB stressed o // PB nouns with final -ner ("er" has been removed) in da_list // stressed previous syllable @@ -2230,6 +2535,7 @@ _bombarde) ment m'AN // PB bombardement _) naiv n&'iv // PB naiv @) naiv n&iv // PB bundnaiv _) new (_ %nju // PB + newzealand njus'el&n // PB .group nd // PB general rule: nd = [n] after a vowel @@ -2238,9 +2544,17 @@ _bombarde) ment m'AN // PB bombardement // exceptions A) nd (el nd // PB andel, ejendel e) nd (elig n // PB endelig + ve) ndig ndi // PB udvendig + å) nd (eli n // PB åndelig ha) nd (el n // PB + y) ndig ndi // PB ke) nd (el nd // PB kendelse + spe) nd (er nd // PB spendere + svi) nd (el n // PB + nd (om nd // PB ejendom + nd (ød nd // PB stendød bi) nd (e n // PB forbindelse + mi) nd (e n // PB mindelund u) nde (l n // PB silent de - misundelig ble) nd (e nd // PB blender ba) nd (it nd // PB bandit @@ -2248,6 +2562,8 @@ _bombarde) ment m'AN // PB bombardement mi) nde (li n // PB almindelig ele) nd (ig nd // PB nødve) nd (ig nd // PB + vi) nd (u nd // PB vindue + i) nd (oki nd // PB Indokina evi) nde (li n@ // PB evindelig y) nd (el n // PB begyndelse ba) nd (el n // PB forbandelse @@ -2259,6 +2575,7 @@ _bombarde) ment m'AN // PB bombardement u) nd (re nd // PB beundre va) nd (re nd // PB vandretur _i) nd (er+ nd // inder + i) nd (erst+ n // PB marska) nd nd // PB marskandiser _bagi) nd nd // PB Bagindien adde) nd nd @@ -2281,46 +2598,32 @@ subtrahe) nd nd sta) nd (ar nd // PB standard - keep the d i) nd (eks nd i) nd (i nd // PB Indien, individ, indianer + ti) nd (in n // PB tinding vi) nd (in n // PB udvinding i) nd (imellem n // exception i) nd (erl+ n // PB inderlig eku) nd nd .group ng - ng (_ N - A) ng (e_ N // mange, penge - A) ng (et_ N // ringet - A) ng (ede_ N // ringede - A) ng (ene_ N // PB pengene - A) ng (er_ N // PB hænger - A) ng (en_ N // PB ingen - A) ng (el N // PB engel - A) ng (ning_ N // PB hængning - ng (s N - - _a) ng (A ng + ng (_ N // general rule - ting, ring + A) ng (e N // general rule - mange, penge + allo) ng (e NS // PB + _ri) ng (o ng // PB Ringo - name + hæ) ng N // PB hængning + pi) ng N // PB pingvin + ng (s N // magengs + _a) ng (A ng // PB do we need this one? cha) ng (ement Nsj // PB changement ora) nge Nsj3 // PB orange ng (a ng - ng (i ng i) ng (s N - u) ng (e N - ba) ng (e N - fa) ng (e =N - fi) ng (er =N + fi) nger =NV _fi) ng (ere ng // PB fingeret + fi) ng (eren+ N // PB fi) ng (re =N - fu) ng (er Ng -// ga) ng (e N - la) ng (e N - li) ng (e N - læ) ng (e N - ru) ng (e N - se) ng (e N - ti) ng (e N + fu) ng (er Ng // fungere ti) ng (ent Ng - træ) ng (e N - arra) ng NS + arra) ng NS // arrangere .group o @@ -2346,16 +2649,24 @@ elektr) o (de 'o peri) o (de 'o oo u: //PB English words like 'pool' + h) ood u:d // PB Robin Hood + r) o (bin V // PB k) oor (d oV:? // PB koordinat _biot) o (p 'o // PB stressed _isot) o (p 'o // PB stressed o (L06 V // PN op, opdrage, obstruere + o (pi o // PB opium + _t) o (bak o' // PB tobak + vide) o o // PB videobånd gl) o o // PB global - kn) o (b o // PB + kn) o (L06 o // PB knob, knop + h) o (lding Ou // PB holdingselskab + br) occ (oli Vk // PB helik) o (pt 'V // PB stressed - helikopter p) o (pu o // PB populær p) o (t V // PB potte - p) o (tA o // PB potage + d) o (nald V // PB name + p) o (tag o // PB potage o (per o // PB opera sk) o o // PB skopudser _sk) o (d V // PB skod @@ -2370,22 +2681,30 @@ elektr) o (de 'o sj) o (f o // PB sjofel o (be o // PB oberst, koben r) o (L06 o // PB problem + pr) o (p V // PB blodprop kr) o (p V // PB - gr) o (g V // PB groggy + gr) ogg Vg // PB groggy + gr) og Vg // PB grog + k) og (t Vg // PB + hvalr) o (s V // PB _eur) o (pa 'o // PB stressed dr) o (p V // PB droppe r) o (nt V // PB front er) o (p V // PB herop + o (lm V // PB olm, holm _) obo ob'o // PB Ca) o (s V // PB kaos Laos r) o (ma o // PB romantik - or (g+ V: // PB sorg, morgen + org (+ V:w // PB sorg, morgen, Norge + ge) org (ine og // PB + o (rga+ V // PB organ r) or (g oR // PB rorgænger kont) o (r 'o // PB kontor - stressed korrid) o (r 'o // PB labrad) o (r 'V // PB mete) o (r 'o // PB matad) o (r 'o // PN + sam) o (a 'o // PB katastr) o (fe 'o: // PB katastrofe lit) o (te 'o: // PB stressed en) o (rm 'V // PB stressed @@ -2406,16 +2725,23 @@ mening) oko (k ok'V // PB meningokokker h) o (ll V // PB Holland _horis) o (n 'V // PB horisont o (nt V // PB dont - n) o (n V // PB nonne, nonkombattant + n) o (n V // PB nonne, nonkombattant _kan) o (n 'o // PB stressed kan) o (n o // PB not stressed after a syllable o (dds V: // PB odds o (sse V // PB tosse, nosse + m) o (sset o // PB j) o (b V // PB job mon) o (k 'V // PB monokel - stressed - ov (A+ Vu // PB over, oven + ov (e+ Vu // PB over, oven + t) ov (er ov // PB tatovere + k) ov (end ov // PB kovending + ov (ærn+ ov // autoværn h) ov (+ Vu // hov, sove - ov (_+ Vw // PB sjov, lov, skov + ov (+ Vw // PB sjov, lov, skov + o (vi+ o // PB pseudovidenskabelig + tr) o (v o // PB troværdig + sk) ov (tur Vw // PB l) ov (_mig_ ow // PB from the verb "at love" ov (s_+ Vw // PB sjovs, lovs, skovs ov (t_+ Vw // PB sjovt @@ -2424,8 +2750,13 @@ _horis) o (n 'V // PB horisont ov (p Vw // PB lovprise v) ov (e Ov // PB vove o (fC V // PB ofte - n) ov (+ ov // PB nova, november + skiz) o (fren o // PB + n) ov (++ ov // PB nova, november _C) o (k 'V // PB beginning with 1 consonant followed by o and k: sok, nok, kok + k) o (kos o // PB + p) o (ka o // PB pokal + p) o (ker o // PB + bet) on VN // PB betonen k) o (ke O // PB koket d) o (ku o // PB dokument ch) o (ko o // PN chokolade @@ -2433,6 +2764,8 @@ _horis) o (n 'V // PB horisont o (mf V // PB omformulere _m) o (rt V // PB mortadel o (k V // PB okker, lok + kr) o (k o // PB krokus + v) o (ke o // PB provokere r) o (ke o // PB neurokemi o (ktob %o // PB stressed next syllable - oktober fr) o o // PB frokost @@ -2440,8 +2773,10 @@ _horis) o (n 'V // PB horisont f) o (kA o // PB fokus, fokal o (ka o // PB lokal, polal o (rk V // PB orke orkester + f) o (s V // PB fosfat g) o (dt V // PB godt, godte k) or (p V: // PB korps + k) or (pi or // PB korpige k) o (rre V // PB korrekt g) od (tr oD // PB godtroende g) od (tAg oD // PB godtage, godtog @@ -2456,26 +2791,31 @@ _horis) o (n 'V // PB horisont s) orer 'o:V // PB professorer L08) o (f V // PB stof l) o (ft V // loft + l) o (dr V // PB lodret _l) o (g_ V // PB log l) o (gg V // PB logge på + l) o (gbog Vg // PB o (lf V // PB golf, Adolf b) o (ll V // PB bolle - l) o (ve+ ou // PB love + l) ov (e+ ou // PB love l) ondon VndVn // PB London od_ VD // PB - od, vod, skod odd (A VD // PB - odder - only this word k) ors V:s // PB kors, korsage c) o (rs V // PB corsage k) o (lL06 V // PB kolbe + k) o (gl V // PB kogle bistr) o 'o // PB stressed o in 'bistro' er) o (b 'o // PB erobre - stressed o _er) o (t 'o // PB erot - stressed o _pil) o (t 'o // PB stressed - pilot _idi) o (t 'o // PB stressed _matr) o (s 'o // PB stressed +_metad) o (n 'o PB stressed + ang) o (la 'o // PB stressed L09) o (va o // PB nova, renovation - r) o (vA+ ov // PB provokere - h) o (ved o: // PB hoved + pr) o (vA+ o // PB provokere + h) oved o:@D // PB hoved tr) o o // PB tro kn) o (tt V // PB knotten kn) o (tn V // PB knotne @@ -2486,15 +2826,21 @@ _horis) o (n 'V // PB horisont p) olish VliS // PB møbelpolish tr) o (kl V // PB trokle tr) o (p V // PB trop + tr) o (po o // PB antropolog tr) o (pi o // PB tropisk tr) o (pe o // PB troperne t) or V // PB faktor + t) or (n or // PB + t) or (ny V // PB tornyster t) or (e o // PB faktorer t) or (en V // PB faktoren, doktoren oy (+ 'Vj // PB destroyer, royal, loyal + _f) oyer O@j'e // PB + f) oyer O@je // PB st) o (r+ o // PB stor - p) o (r O // PB porno + p) o (r O // PB porno _m) o (C o // PB m + o + consonant: mor, mord, + m) ontana Vnt'&n& // PB m) o (ms V // PB m) o (kk V // PB mokke, mokka m) o (nitor V // PB @@ -2511,18 +2857,26 @@ _horis) o (n 'V // PB horisont t) oi o& // PB toilet d) o (k o // PB dokument l) o (kA o // PB lokal + bl) o (k V // PB blokere + br) o (d V // PB brod, brodne + br) o (de o // PB broder, brodere k) o (ka o // PB kokasse, kokain s) o (pr o // PB sopran oregonpine VregVn||pajn // PB + oklahoma okl&h'om& // PB c) ogn (ac VN // PB b) o (m o // PB bombe L11) o (m V // PB gommen, brudgom, kom, velkommen + k) o (mi o // PB komiker L11) o (ma o // PB koma, narkoman L11) o (mman o // PB kommando p) o (m V // PB pomp Xl) o (m V // PB lom, lomme, blomst pl) o (m o // PB exception from the rule above (Xl) o (m) - plombe o (m V // PB om, ensom VERY BROAD + kr) o (m o // PB krom + o (mi o // PB sodomi + f) o (m o // PB nymfoman fot) o o // PB r) o (mA o // PB romer b) o (mu V // PB bomuld @@ -2547,11 +2901,20 @@ _horis) o (n 'V // PB horisont o (se o: // PB rose, skose, pose h) o (spice V // PB hospice C) o (st V // PB post, moster + komp) o (st 'V // PB stressed + r) o (st o // PB rost + pr) o (sta V // PB prostata + fr) o (st V // PB + f) oged o:@D // PB silent g k) o (sC V // PB kosmisk + kok) o (s o // PB kokosnød k) o (st o // PB kost (broom) Problem with kost = food k) o (ste V // PB verb - koste = brooms will be mispronounced + k) o (stbar V // PB + bek) o (st V // OB bekostning frok) o (st V // PB - pr) o (s o // PB prostitueret + omk) o (st V // PB omkostninger + pr) o (sti o // PB prostitueret st) o (mi o // PB stomi h) o (st o // PB host Cl) o (t V // PB flot @@ -2572,6 +2935,7 @@ _astron) out awd // PM oun aVn // PB discount kl) oge ow,@ nark) o (tik 'o // PB narkotika, narkotisk + _ansj) o (s 'o // PB stressed ul) o (v 'V // PB stressed o - ulovlig h) o (ng V // PB Hongkong k) o (mmu o // PB kommunisme @@ -2582,6 +2946,7 @@ _filos) o (fi_ o' // PB _filos) o (fisk 'o //PB mem) oire o'A: // PB memoire(r) aprop) o (s 'o // PB + r) oastbeef Ousdbif // PB roastbeef // PB final -ol words in da_list - stressed o &) ol ($p_alt+ 'ol // parabol @@ -2590,6 +2955,7 @@ _filos) o (fisk 'o //PB &h) ol (i$p_alt+ 'ol // alkoholisk &ok) ol ($p_alt+ 'Vl // protokol &t) ol ($p_alt+ 'Vl // chatol + &nt) ol ($p_alt+ 'ol // mentol &tr) ol ($p_alt 'Vl // kontrol &tr) ol (e$p_alt 'ol // petroleum &tr) ol (l$p_alt 'o // kontrollere @@ -2601,6 +2967,7 @@ _filos) o (fisk 'o //PB L11) o (ld V // PB kold, gold ravi) o (li 'o // PB stressed o j) o (l V // PB jolle, fjols, fjolle + p) o (llen V // PB pollen kj) o (l o // PB kjole kj) o (ld V // PB skjold L06) o (ld V // PB bold @@ -2616,11 +2983,14 @@ _filos) o (fisk 'o //PB h) o (lo o // PB hologram h) o (le // PB hole s) o (ld V // PB solde - s) o (lgt V // PB solgt - exception + s) olgt Vlt // PB solgt - exception tr) o (ld V // PB trold kn) o (ld V // PB knold sn) o (t V // PB snot + h) otdog VtdVg // PB + _h) o (t_ V // PB or (l O: // PB orlov + oscar VskA // PB .group on @@ -2650,14 +3020,18 @@ dødvægtt) on Vn kol) onn 'Vn // kolonne - only one n, stressed kompagn) on VN orl) on Vn - maked) on 'on // PB makedoner +_maked) on 'on // PB makedoner perl) on Vn @sal) on VN @tal) on VN + _sæs) on 'VN tefl) on Vn t) on (_ Vn // ton, kiloton + t) on (ic Vn // PB t) on (s_ Vn // PB tons + t) on (sv Vn // PB tonsvis alf) on (s 'VN // PB alfons + f) ond Vnd // PB ball) on 'VN on (du Vn // ondulere @@ -2669,7 +3043,7 @@ kompagn) on VN enf) or 'V // PB k) or (t V:? // PB kort m) orge V:3 // PB morgen - dek) or 'V:r // PB dekor + dek) or (_ 'V:r // PB dekor rapp) or (t 'V: // PB rapport f) or (t V:? // PB fort m) or (f V: // PB morfar @@ -2680,7 +3054,7 @@ kompagn) on VN _) or V // PB orientere orm orm // PB n) or (m O // PB - st) or (m O:? // PB + st) or (m O: // PB b) or (t Vr // PB bortforklare or (al oR // PB oral _esk) or (te 'V: // PB eskorte @@ -2708,7 +3082,7 @@ _kondens) or =V _process) or =V _profess) or =V _provis) or =V -_revsi) or =V +_revis) or =V _success) or =V // PB when "ord" means 'word', the d isn't pronunced @@ -2717,9 +3091,11 @@ _success) or =V k) ord (el Vrd // PB kordel hv) ord (an Vrd // PB hvordan m) ord (A ord // PB morder + m) ord (et oR // PB mordet f) ord (æ Vd' // PB fordærve f) ord (ø Vd' // PB fordømme ord (en+ Vrd // PB orden, ordensmagt + t) ord (en ord // PB j) ord (en oV // PB fjorden jorden ord (entlig+ 'Vrd // PB overordentlig - stressed ord (ne+ Vrd // PB ordne @@ -2742,7 +3118,10 @@ _success) or =V &t) orium ($p_alt 'oiOm // don't spoil the -ium rule - laboratorium // PB no stress on initial 'for' - 1.550 words. - _f) or (@+ %V +// Secondary stress on the next syllable after a syllable. + _f) or (@+ %V // PB fork'ølet + f) or (@ V, // PB s'ommerfork,ølet + // exceptions to initial 'for' below - 'for' means "front/fore" _f) or (a_ 'V // PB fora (plur. of 'forum') _f) or (an_ 'V // PB foran @@ -2772,6 +3151,7 @@ _success) or =V _f) or (dæk_ 'V // PB fordæk _f) or (dæks 'V // PB fordæks _f) or (dækkene 'V // PB fordækkene + _f) or (dør 'OR // PB _f) ore (+ '0:@ // PB foreberinge, foregribe _f) ore (n V'e: // PB forene, forening _f) or (el_ or // PB forel @@ -2846,7 +3226,7 @@ _success) or =V _f) or (mand 'V // PB formand, formandsskifte _f) or (mbar 'V // PB formbar _f) or (mbrød 'V // PB formbrød - _f) or (me 'V // PB forme + _f) or (me+ 'V // PB forme _f) or (melig 'V // PB formelig _f) ormer (_ 'VrmV // PB former - problem with "formér" _f) or (mfast 'Vr // PB formfast @@ -2982,6 +3362,7 @@ _success) or =V _) på (ske p'O // PB not a prefix - påske &) p (_ p // PB hjælp p (syk // psykolog [s,ykol'o] + sym) p (tom // PB silent p pipeline pajplajn // PB pitchpine peTSpa:jn // pb praline pRAlin'e // PB @@ -2991,6 +3372,7 @@ _success) or =V protegé prod@S'e // PB protegé _) passager p&s&sj'er // PB passager peanut pi:nVd // PB + pseu sWw // PB pseudo .group ph @@ -3006,12 +3388,16 @@ _success) or =V .group r r R + rr R rickshaw rekSV: // PB rickshaw rickshawer rekSV:V // PB rickshawer + _) reservoir resErvo'a: // PB + reservoir resErvoa: // PB recut rikVd // PB - reggae REgEj - rioja ri'Vk& - ramirez _^_ES + reggae REgEj // PB + rioja ri'Vk& // PB wine + ramirez _^_ES // PB name + reece ri:s // PB name r (K r // not followed by a vowel hve) r r // PB hver b) r r // bror @@ -3021,9 +3407,11 @@ _success) or =V he) r (_ r // PB her e) re (s 3 // PB jeres, deres @) re (_ V // PB "re" ending a word - være, sejre + _ent) re (_ R'e // PB entre bu) rd (eK rd A) r (er_N // silent r - skærer - &) re (_N V // silent r - skære + A) re (_N V // silent r - skære + g) re (_ rV // PB yngre sa) rd (el rd // PB sardel ga) rd (e rd // PB garde ve) rd (eKK rd @@ -3048,6 +3436,8 @@ transpo) r (t //PB transport s s ss s sc s // PB scene + me) sc (al sk // PB + sco (t skV // PB Scotland Yard // PB/JD s suffix - $alt words in da_list // 2-3.000 words end with s, so this cannot be a general suffix. // There would be too many exceptions. @@ -3095,7 +3485,9 @@ franci) sc (o sk // PB Francisco si (on S // PB changed from "s (ion S" - division s (j s sch S // PB changed from [s(ch] - gullasch + sh (erif S // PB schweiz svajts + sioux su: // PB red indian al) s (ace 's // PB Alsace (French region) _) sion si:Vn // PB Sion, Sions kirke shine sjajn@ // PB @@ -3129,6 +3521,9 @@ franci) sc (o sk // PB Francisco _) sig (_selv saj // PB noget for sig selv for_) sig (_ saj // PB se noget for sig fra_) sig (_ saj // PB slå fra sig + stå_) sig (_ saj // PB stå sig godt med + slå_) sig (_ saj // PB + slår_) sig (_ saj // PB _) sig (_alene saj // PB klare sig alene vende_) sig (_ saj // PB erklære_) sig (_ saj // PB @@ -3136,9 +3531,11 @@ erklære_) sig (_ saj // PB hygge_) sig (_ saj // PB skød_) sig (_ saj // PB tog_) sig (_ saj // PB + ør_) sig (_ saj // PB klør sig, gør sig _) sig (_ud_ saj // PB rode sig ud i _) sig (_af_ saj // PB tage sig af ak_) sig (_ saj // PB drak sig fuld + gik_) sig (_ saj // PB gik sig en tur s) s // PB use [sV] instead pf [sO] @@ -3171,7 +3568,8 @@ kompromi) s ' // PB stress added tt t _) t (_ te: // the letter T _) t (_shirt t'i:% // PB T-shirt - e) tt (@ t|t // PB ettiden, ettal + e) tt (id t|t // PB ettiden + e) tt (al t|t // PB ettal le) tt (e t // PB slette p) t t // PB toptitel s) t d // PB stor @@ -3181,9 +3579,11 @@ kompromi) s ' // PB stress added ve) t (er t // PB veteran vi) t (er t // PB inviter teress (ant tr@s // PB interessant - in) teresse t@r'&s@ // PB interesse + in) teresse t@r'as@ // PB interesse + in) teresser t@r'asV // PB interesse in) teresseret tr3s'er@D // PB interesseret in) teresserer tr3s'erV // PB interesserer + in) teressere tr3s'erV // PB interessere // er) t d // PB kuffert r) t (e t // PB abortering re) t (+ t // ret @@ -3210,6 +3610,9 @@ glemen) t (al t tennessee tEn@si // PB teenage ti:nEdZ // PB teenager ti:nEdZV // PB + tracy trEjsi // PB + tombstone tu:msdoun // PB + town tAwn // PB // PB final -tek - stressed e _apo) tek t'ek _biblio) tek t'ek @@ -3281,6 +3684,7 @@ meningi) ti (s =ti ti (on+ S // bastion, station ti (øs+ S // tendentiøs pa) ti (ent S // PB patient + kvo) ti (en S // PB kvotient r) til tel // PP hertil, dertil _poli) ti (k t'i // PB politik @@ -3296,10 +3700,12 @@ meningi) ti (s =ti u (gle+ u // ugle u (hyre+ u u (enig+ u' + u (denfor+ u // PB u (dgrundelig+ u // PB + u (imodståelig u // PB u (ni++ u // uniform, universitet u (den u // udenfor - u (ng+ 0 + u (ng++ 0 u (ge++ u // ugerne u (r++ u // ur, urrem, uret _) u (retfæ++P1 u // uretfærdig - prefix @@ -3338,6 +3744,7 @@ meningi) ti (s =ti // PB final -ut in da_list - stressed u &) ut ($p_alt 'ut // rekrut + &) ut (t$p_alt 'u // rekrutter - avoid double t // PB most of the words with ud-: [uD] - udpege _) ud (@@+P2 ''uD @@ -3351,10 +3758,14 @@ meningi) ti (s =ti _) ud (øbt+P2 ud _) ud (ød+P2 ud // udødelig _) ud (åd+P2 ud - + _) ud (en+ uD u (nK u u (nL08 O // PB kunst br) unch VnS // PB + ketch) u (p V // PB + s) ui (te wi // PB + st) u (nt V // PB stuntman + b) urg (er Wg // PB u (ng O // PB ung u (mK O _) usa (_ u:|es|'& // PB @@ -3362,16 +3773,26 @@ meningi) ti (s =ti s) ur (fe 3: // PB surfe, surfer s) ur (fb 3: // PB surfbræt u (nd O // PB underligt, undtage + p) u (nd u // PB pund _sek) u (nd 'O // PB stressed _glas) u (r 'u // PB stressed _abs) u (rd 'u // PB stressed + _fig) u (r 'u // PB stressed + _harp) u (n 'u // PB stressed l) u (f 0 // PB luft +// l) u (gt 0 // PB +// b) u (gt 0 // PB +// fr) u (gt 0 // PB +// f) u (gt 0 // PB fugt + m) u (L11 0 // PB mug + C) u (gt 0 // frugt, fugt, lugt + sl) u (gt u // PB + b) u (gta u // PB bugtasler l) u (n_ u // PB lun l) u (ne u // PB lune l) u (nte 0 // PB lunte l) u (ka u // Lukas h) u (nd u // PB hund - u (gt 0 // PB fugt r) u (s u r) u (st O // PB udrustning ue (_ u: // PB due, vindue, statue @@ -3403,6 +3824,8 @@ centrif) u (g 'u // PB stressed k) u (l O // PB kulmine hovedk) u (ls u // PB k) u (ld u // PB kulde + omk) u (ld 'u // PB + imp) u (ls 'u // PB stressed k) u (le u // PB kule sk) u (ll+ u // PB skulle k) u (lt u // PB kultur @@ -3417,6 +3840,7 @@ hovedk) u (ls u // PB sn) u (L06 0 // PB snup s) u (L06 0 // PB suppe u (nk 0 // PB sunket + h) u (n u // PB hunkøn s) u (per u // PB s) u (k 0 // PB suk, sukker sk) u (f 0 // PB skuffe @@ -3431,6 +3855,7 @@ hovedk) u (ls u // PB d) u (ft 0 // PB duft f) u (n+ 0 // PB funktion, karpunkel p) u (k 0 // PB pukle + p) u (lv 0 // PB pulver _r) u (b_ O // PB rub n) u (l 0 // PB nul _r) u (bbe O // PB rubbe, rubbet @@ -3446,6 +3871,8 @@ hovedk) u (ls u // PB val) u (ta 'u // PB stressed _der) u (d 'u // PB stressed - derud r) u u + r) u (p O // PB korrupt + gr) u (p u // PB gruppe r) u (m O s) u (cc y b) u (dget y @@ -3454,7 +3881,9 @@ hovedk) u (ls u // PB parf) u (me 'y // PB proced) u (re y proven) u y - nat) u (rel y // PB naturel + nat) u (rel_ y // PB naturel + _kost) u (me 'y // PB + kost) u (me y // PB s) u (rrel Y // PB surreel s) u (rrea y // PB surrrealistisk t) u (berkul y // PB tuberkulose @@ -3470,7 +3899,7 @@ proven) u y .group v v v vv v - o) v (A // PB love - handled by group o +// o) v (A // PB love - handled by group o L09o) v (A v // OV nova renovation pro) v (ence v // PB Provence in France i) v (l u // PB tvivl @@ -3510,6 +3939,10 @@ proven) u y w (assermannprøve v // PB wassermannprøve wien vin // PB wienerbrød weekend wi:gEnd // PB + wisconsin wesk'Vnsen + wright _^_EN // PB + willie wili // PB + _) wild wAjld .group x @@ -3523,7 +3956,8 @@ proven) u y y y - r) yg (_ @k // PB ryg + r) yg (_ @k // PB ryg (noun "back") - problem with "ryg" (verb) = "smoke" + r) yg (_en y // PB "ryg en cigar" r) yg (C '@k, // PB rygrad r) y (s W // PB ryste fr) y (s y // PB fryse @@ -3538,9 +3972,10 @@ proven) u y sm) y (k W // PB smykke lib) y i // // PB Libyen l) y (st @ // PB problem with lyst = blond, light coloured + l) y (stre Y // PB lystre + _l) y (ste_ y // PB &l) y (st y // PB åbenlyst - fl) y y (+ // PB flystøtte -// till) y (kke 'W // tillykke - stressed y + fl) y y // PB flystøtte L08) y (t W // PB spyt, skyts sk) y (ti y // PB Skytien, skytisk sk) y (ter y // PB skyter @@ -3557,18 +3992,20 @@ _molek) y (le 'y // PB stressed n) y (t Y // PB nyt n) y (tt W // PB nytte, benytte n) y (k W: // PB nyk - kn) y (t W: // PB tilknytte + kn) y (tt W: // PB tilknytte + kn) y (t y // PB knyt k) y (s W // PB kys k) yss Ws // PB kysse k) y (se y: // PB kyse y (nK W // PB changed from Y to W - synge, ynde - s) y (nsk y // PB + s) y (ns y // PB s) y (nl y // PB synlig s) y (nkr y // PB synkron s) y (nt y // PB syntes s) y (nkroc W // PB synkrocyklotron y (ng+ W // PB syng, yngre l) y (n y // PB lyn + kl) y (nk W // PB klynke pl) y (n W // PB plyndre fl) y (t_ W // PB flyt fl) y (tt W // PB flytte @@ -3582,7 +4019,12 @@ _molek) y (le 'y // PB stressed yacht jagd // PB lystyacht york JV:k // PB yankee j&nki // PB + bill) y i // PB + luc) y i // PB ken) y (a j // PB + kan) y (le 'Y // PB stressed + _kab) y (s 'Y // PB stressed + _kah) y (t 'Y // PB stressed d) y (_ i b) y (A y n) y (A y @@ -3600,35 +4042,42 @@ _molek) y (le 'y // PB stressed // PB nouns ending with -ær in da_list - stressed last syllable &) ær ($p_alt 'Er // elementær - æ (CK E - r) æ (d a // PB forræder +// æ (CK E + r) æ (dd a // PB forræder + pr) ædi ED // PB prædiken æ (bK E // PB dræb, slæb æ (bt &# // PB dræbt sl) æ (L06 E // PB slæbt tr) æ (d+ E // PB træde tr) æ (n &# // PB trænge tr) æ (ne E // PB træne - 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 + dr) æ (n E // PB dræne +// 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 pr) æ (k E // PB præke bl) ære EV // PB blærerøv gr) æ (ken E // Grækenland skr) æ (dd a // PB skrædder br) æ (dd a // PB brædder br) æ (t &# // PB bræt + dr) æ (gtig &# // PB nederdrægtig pr) æ (st & // PB præst tr) æ (t & // PB træt tr) æ (f &# // PB træffe gr) æ (n & // PB grænse - gr) æ (s & // PB græs + gr) æ (s &# // PB græs gr) æ (d &# // PB græde f) æ (re 'E: // PB affære, atmosfære, sfære gev) æ (r 'E // PB gevær besv) æ (r 'E // PB besvær afh) æ (ngig 'E: // PB stressed e _pal) æ 'E // PB stressed +_porcel) æ (n 'E // PB stressed + _pygm) æ 'E // PB stressed t) æge E:j@ // PB tæge t) æe (r E // PB tæer pr) æ (ge E: @@ -3636,6 +4085,7 @@ _molek) y (le 'y // PB stressed ærger E:ruV // PB sværger ævl Eul // PB majest) æ (t 'E // PB stressed æ + ærinde ERn@ // PB .group ø // røveren [V] faldt på røven [W#] og skød [W] en møgkælling [Vj] @@ -3645,6 +4095,8 @@ majest) æ (t 'E // PB stressed æ ff) ø (r 'W // PB stressed in 'chauffør' _milj) ø 'W // PB stressed - miljø obsk) ø (n 'W: // PB stressed + _nev) ø 'W // PB stressed + _am) ø (be 'W // PB stressed g) ø (r '@: h) ø (j V ø (je W# // PB øje @@ -3652,6 +4104,7 @@ majest) æ (t 'E // PB stressed æ øjer W#jV // PB bøjer ø (jn W# // PB øjne l) øg 'Vj // løgn, løg + g) øg (l Vj // PB gøgler l) ø (s W C) ø (j W# // PB søjle, bøjle L09) ø (g V // PB m => L09 (m + n) - møg @@ -3672,7 +4125,7 @@ majest) æ (t 'E // PB stressed æ ø (re_ W: // PB køre r) ø (ver W# // PB røver r) ø (v W# // PB røv - k) ø (d W // PB skød, kød + k) ød WD // PB skød, kød _) øg (_ Wj // PB 'øg' noun and verb d) øg (n Vj øj+ V:j // PB changet from [Oj] @@ -3692,7 +4145,7 @@ majest) æ (t 'E // PB stressed æ ovenp) å (_ 'O // PB stressed r) å (d+ O: // PB råd r) å (dn+ V // PB rådne - r) å (dd V // PB rådden + r) å (dd+ V // PB rådden tr) å (dt V // PB overtrådt r) å (dg+ V // PB rådgive ård O:? // PB gårdmand, bondegård - silent d @@ -3703,10 +4156,15 @@ majest) æ (t 'E // PB stressed æ s) å (_snart V // PB s) å (_få V // PB s) å (kald V // PB såkaldt + s) å (mænd V // PB + jas) å (_ 'V // PB jaså alts) å V // PN altså hvorn) år 'O? // PB hvornår - stressed +uimodst) å (elig 'O // PB stressed + forh) åbentlig 'ObEntli // PB stressed h) år V:? // PB hår, hård bl) å (@ V // PB blåbær, blågrå + bl) å (t V // PB å (nd V // PB hånd, ånd, bånd l) å (r V p) å (s V // PB påstand @@ -3718,11 +4176,13 @@ majest) æ (t 'E // PB stressed æ L08r) å (t V // PB skråt m) å (t V // PB måtte _p) å V // PB påmontere + t) å (lmo V // PB tålmodig _p) åse Vse // PB påse r) å (t V // PB gråt r) å (bt V // PB råbte - år V:? // PB år, står + år V: // PB år, står åre V3 // PB tåre + å (lti V // PB måltid .group $ dVlV // PB changed from [dVlar] @@ -3730,4 +4190,5 @@ majest) æ (t 'E // PB stressed æ ï 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/dict_phonemes b/dictsource/dict_phonemes index 39abe29f..e4ed037f 100644 --- a/dictsource/dict_phonemes +++ b/dictsource/dict_phonemes @@ -62,7 +62,7 @@ W# y Y * - : ? b B d D dZ f g h j J k l l/2 l/3 m n N p r R -s S t T tS v w +s S t T tS v w z Dictionary hu_dict diff --git a/dictsource/en_list b/dictsource/en_list index 5607dfa3..cf40be9e 100644 --- a/dictsource/en_list +++ b/dictsource/en_list @@ -792,6 +792,7 @@ chloroplast $1 chocolate tS0kl@t cholera k0l@r@ cholesterol k@lEst@r0l +chorizo tSOr'i:zoU chromosome kroUm@soUm ciao tSaU cigar sI2gA@ @@ -1003,6 +1004,7 @@ dose doUs dosage doUsI2dZ dramatic dr@matIk drawer drO@ +dreamt drEmpt drier draI3 driest draI|@st duet dju:'Et @@ -1221,6 +1223,7 @@ havoc hav@k hasty heIstI hatred heItrI2d hazardous haz3d@s +headfirst $2 heh hEh hehe hi:h'i: heifer hEf@ @@ -1492,6 +1495,7 @@ metaphor mEt@fO@ metallic mEt'alIk miaou mi:'aU miaow mi:'aU +mic maIk mica maIk@ microorganism maIkroU'O@g@nIz@m midday m,Idd'eI @@ -1759,6 +1763,7 @@ preset pri:sEt prestige prEst'i:Z ?3 pretense pri:tEns pretext pri:tEkst +pretrial pri:tr'aI|@L pretty prItI privation praIv'eIS@n privilege prIvI2lI2dZ @@ -3096,6 +3101,7 @@ thy ,DaI thine ,DaIn me ,mi: $only +me mi: $atstart $atend him ,hIm $only us ,Vz $only us $abbrev $allcaps diff --git a/dictsource/fr_list b/dictsource/fr_list index f6827ba2..a017f035 100644 --- a/dictsource/fr_list +++ b/dictsource/fr_list @@ -24,7 +24,7 @@ // 2006-11-18 Gilles Casse // -// Updated 2010-06-11 Michel Such +// Updated 2010-06-15 Michel Such // // * Numbers, a few abbreviations and exceptions. // @@ -778,7 +778,7 @@ zut zyt exocet E2gzosEt fret fr'Et budget bydZE2 -hamlet hamlEt +hamlet _|amlEt knesset knesEt lazaret lazarE2 margaret margarEt @@ -884,7 +884,7 @@ contentions kO~tA~tjO~z2 dations datjO~z2 désertions dezErtjO~z2 $verb exploitions EksplwatjO~z2 -heurtions hYrtjO~z2 +heurtions _|WrtjO~z2 partions partjO~z2 rations ratjO~z2 $verb tentions tA~tjO~z2 diff --git a/dictsource/fr_rules b/dictsource/fr_rules index 621cb397..ee26f30c 100644 --- a/dictsource/fr_rules +++ b/dictsource/fr_rules @@ -1,1457 +1,1460 @@ -// French translation rules for Espeak - -// *************************************************************************** -// * Copyright (C) 2005 to 2010 by Jonathan Duddington * -// * email: jonsd@users.sourceforge.net * -// * * -// * This program is free software; you can redistribute it and/or modify * -// * it under the terms of the GNU General Public License as published by * -// * the Free Software Foundation; either version 3 of the License, or * -// * (at your option) any later version. * -// * * -// * This program is distributed in the hope that it will be useful, * -// * but WITHOUT ANY WARRANTY; without even the implied warranty of * -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -// * GNU General Public License for more details. * -// * * -// * You should have received a copy of the GNU General Public License * -// * along with this program; if not, see: * -// * . * -// ***************************************************************************/ - -// This file is UTF-8 encoded - -// 2006-11-18 Gilles Casse -// -// Updated: 2010-06-12 Michel Such -// - -// Letter classes: -// A all vowels: a e i o u y â ä é ê è î ï ô ö ù û -// C all consonants -// Y front vowels: e i y é ê è î -// K not a vowel (i.e. consonant, space, ) - -.replace -œ oe -î i -à a - - -.L01 d e l n r t u -.L02 b c d f g h k p t v -.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 - - -.group a - ae (_ e // reggae vitae - aen A~ // caen (diff Cicero: aA~) - ae aE // maestro - aim (K E~ // faim - 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... - 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 (m a // programmation - _) am (n am // amnistie - am (n a // condamner - - _L04) an (_ an - an (n_ a - _h) an (_ an - _) anti (@@P4 A~ti - _) arché (@P5 arke // archéologue - _) archéo (@P6 arkeo // archéologue - _) arch (aP4 ark // archange - _) arch (oP4 ark // archonte - _) anarcho (@P7 anarko // anarchosyndicalisme - - a (nnA a // manne - an (K A~ // ancien, élan - an (h an - @@m) an (_ an // tennisman - zm) an (_ an // jazzman - L02m) an (_ an - lism) an (_ A~ // talisman - ulm) an (_ A~ // musulman - _caïm) an (_ A~ // caïman - _C) aon (_ A~ // faon, paon, taon - s) aoul (_ u // saoul - s) aou (le u // saoule - août ut // août - août (i aus // aoûtien - aut (_ ot2 - a (ô // saune - au o2 // au, aux - aud (_ o // chaud -_C) aud (_ o2d // Maud - au (l_ o // Paul - au (re_ o // dinosaure - _) audio (@P5 o2dio - _) auto (@P4 o2to - _) autom (n otO - bb) aye (X ei // abbaye - ay (C E // aymé - ay Ej // paye - ay (_ E2 // display - Xl) ayer (X E2jWr // player, layer - w) an (_ an - a a // bateau - -// group a: English section - sm) all _^_en // small, smaller - a (wC _^_en - - -.group b - bb b // abbé - om) b (_ // plomb applomb - b b // aube - -// 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 - _) c' (P2v s // s - cch k // bacchanale - cc (Y ks // accéder - cc k // occuper - _) c (d se - _) ch (arism k // charisme, charismatique - _) ch (irop k // chiroptère - a) ch (_ k // almanach - ar) c (ti // arctique - e) ch (_ k // varech - ni) ch (_ k - _A) ch (o_ k // écho - mani) ch (é k // manichéisme - wi) ch tS // sandwich - mito) ch (o k // mitochondrie - _eu) ch (ari k // eucharistie - or) ch (esC k // orchestre - or) ch (iC k // orchidée - _) ch (ao k // chaos, chaotique - _) ch (orA k // chorale - _) ch (oriz S - _) ch (oro S - ch (r k // chrétien - _) chrono (@P6 krono - ch (l k - ch (n k - ch (s k - ch (to k - ch S // chien - ck k // nickel - cqu k // grecque - cq k // pecq - s) c (Y - x) c (Y - c (Y s // cède - _) cyber (P5 sibEr - Can) c (_ // banc - Con) c (_ // tronc, jonc - _don) c (_ k // donc - cler) c (_ // leclerc - tchou) c (_ - taba) c (_ - toma) c (_ - se) c (ond g // seconde secondaire - c k // recoin donc - - cient (_ sit2 // ils appr�ient, remercient. - effi) cient sjA~ // coefficient - défi) cient sjA~ // déficient - cast (_S4 kast // podcast - casts (_S5 kast // podcasts - _) clown klun - -// group c: English section - n) ch (_ _^_en // french - ch (ment _^_en // attachment - cut (_ _^_en // cut, shortcut - - -.group ç - - ç s // rançon - _) ç' (P2v s - - -.group d - dd d // addition - _) d' (P2 d - _ban) d (_ d - _lan) d (_ d // land - _stan) d (_ d // stand - an) d (_ - _san) d (_ d - - _gran) d (_ t2 // grand ami, grand marchand - Cen) d (_ t2 - Con) d (_ - con) d (_ t2 - quen) d (_ t2 - r) d (_ - _har) d (_ d - lor) d (_ d - oi) d (_ - ou) d (_ - - dt (_ t // Schmidt - _ni) d (_ // nid - d d // don bled - _expé) dien (t_ djA~ // expédient -V_expé) dien (t_ di // expédient -_ingré) dien (t_ djA~ // ingrédient - dien (t_ di // étudient (verbe) - _) dendro (@P6 dE~dro - -// group d: English section - day (_ _^_en - _) devic _^_en - dle (X _^_en // bundle, handle - - -.group e - -// Define use of the final 'e' in french - 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 - 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 - _f) em (me a // femme - i) e (mA // remerciement, d�ploiement - A) e (rA // remerciera - tch) e (rX Y - @) em (me a // patiemment - em (b A~ // décembre - em (mACC A~ // emmancher - em (mACAC A~ // emmagasiner - em (ma E2 // 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 - _flam) en (c E~ // flamenco - _) en (A A~n // enivrer - - C) en (d_ A~ // comprend dépend - od) en (dr E~ // rhododendron - qu) en (d_ A~ - - pati) en A~ // patient patience - en (nu A~ // ennui - en (nA E // penne ennemi - - é) en (_ E~ // européen - - Ci) en (nA E // mienne - - éC) en (t_ A~ // récent différent élément - équ) en (t_ A~ // fréquent, conséquent - étic) en (t_ A~ // réticent - - _C) en (t_ A~ // cent vent lent dent - cc) en (t_ A~ // accent - Asc) en (t_ A~ // luminescent - _dol) en (t_ A~ // dolent - ol) en (t_ A~ // somnolent, violent - Vol) en (t_ // somnolent, violent - Xol) ent (_ t2 // volent - eul) ent (_ t2 // veulent - ul) en (t_ A~ // turbulent - Ccul) ent (_ t2 - Vul) ent (_ t2 - imCoC) en (t_ A~ // impotent - inCoC) en (t_ A~ // innocent, indolent - -XACcid) en (t_ A~ // accident, occident - - _ag) en (t_ A~ // agent - _ard) en (t_ A~ // ardent - _arg) en (t_ A~ // argent - _urg) en (t_ A~ // urgent - V_urg) ent (_ t2 // urgent (verbe) - - _émin) en (t_ A~ // éminent - immin) en (t_ A~ // imminent - oémin) en (t_ A~ // proéminent - jac) en (t_ A~ // sous-jacent, adjacent - _lat) en (t_ A~ // latent - - ig) ent (_ t2 - ilig) ent (_ A~t2 - llig) ent (_ A~t2 - ndig) ent (_ A~t2 - tang) ent (_ A~t2 // tangent - @@ing) en (t_ A~ // astreingent, contingentindigent - - man) en (t_ A~ // permanent - _pat) en (t_ A~ // patent - rmam) en (t_ A~ // firmament - verg) en (t_ A~ // convergent, divergent - Vverg) ent (_ t2 // convergent, divergent (verbe) - - _serg) en (t_ A~ // sergent -CACCim) en (t_ A~ // condiment, gentiment - dim) en (t_ A~ // rudiment - Agim) en (t_ A~ // régiment - Alim) en (t_ A~ // poliment - inim) en (t_ A~ // infiniment - manim) en (t_ A~ // maniment - onim) en (t_ A~ // boniment - plim) en (t_ A~ // compliment - Atim) en (t_ A~ // bâtiment - _cim) en (t_ A~ // ciment - _pim) en (t_ A~ // piment - gm) en (t_ A~ // fragment - Asim) en (t_ A~ // quasiment - - ertin) en (t_ A~ // pertinent, impertinent - ontin) en (t_ A~ // continent, incontinent - _sArm) en (t_ A~ // sarment, serment - erm) en (t_ A~ // ferment - Vferm) ent (_ t2 // ferment, referment (verbe) - XArp) en (t_ A~ // arpent, serpent - CArr) en (t_ A~ // conncurrent, torrent - Cerr) ent (_ t2 // ils serrent -_appar) en (t_ A~ // apparent - spar) en (t_ A~ // transparent - _par) en (t_ A~ // parent - V_par) ent (_ t2 // parent (verbe) - _var) en (t_ A~ // varent - mitt) en (t_ A~ // intermittent - énit) en (t_ A~ // pénitent - tourm) en (t_ A~ // tourment - Cflu) en (t_ A~ // affluent, confluent - VCflu) ent (_ t2 // refluent, influent (verbe) - - _tal) en (t_ A~ // talent - ival) en (t_ A~ // équivalent - Vival) ent (_ t2 // équivalent (verbe) - xcell) en (t_ A~ // excellent -Vxcell) ent (_ t2 // excellent - - iCam) en (t_ A~ - mm) en (t_ A~ - em) en (t_ A~ // lentement - mom) en (t_ A~ // moment - Aaim) en (t_ A~ - Caim) en (t_ A~ - dum) en (t_ A~ - gum) en (t_ A~ - jum) en (t_ A~ - oCum) en (t_ A~ - rum) en (t_ A~ - - éCid) en (t_ A~ - VéCid) ent (_ t2 - Xtrid) en (t_ A~ - _flor) en (t_ A~ - _laur) en (t_ A~ -_mécont) en (t_ A~ - _cont) en (t_ A~ -_Vcont) ent (_ t2 - éC) en (t_ A~ // compétent - _souv) en (t_ A~ // souvent - Cud) en (t_ A~ - - _couv) en (tS3f A~ // le couvent -V_couv) en (t_ // elles couvent -s_couv) en (t_ // elles couvent - - ent (_ t2 // étaient mangent - A) ent (_ t2 // étaient mangent - - Ci) en (K E~ // rien, lien - Ci) en (c A~ // science - - AA) en (_ E~ - C) en (_ En // amen, abdomen, golden - C) en (to_ En // memento - nc) ens (_ A~ // encens - xam) en (_ E~ // examen - - en (s_ A~ - en (CA A~ // pentathlon - en (CC A~ // entre - sp) ens (_ Ens // suspens - éC) ens (_ A~z2 // dépens démens - - _C) er (_ Er // fer - _Ch) er (_ Er // cher - _env) er (_ Er - _hi) er (_ Er // hier - _fi) er (_ Er // fier - _hiv) er (X Er // hiver - Cst) er (X Er // hamster - _cart) er (X Er // carter - _cutt) er (X Er // cutter - tain) er (X Er // container - _ti) er (_ Er - ack) er (K Yr - ock) er (K Er - rock) er (K Yr - - er (_ e // parler léger - er (s_ e - - i) e (rt_ E // requiert - - d) e (ssus_ @ // dessus - - _d) es (bA e - _d) es (jA e // Desjardins - _d) es (nA e - _d) es (qA e // desquels - - _l) es (qA e // lesquels - - _m) es (dA e // mesdames - _m) es (nA e - Am) es (dA e - Am) es (nA e // Dumesnil - - d) esh (A ez // Deshormeaux - - _r) e (ss @ // ressembler - _r) e (ssu e // ressusciter - _r) e (stra @ - _r) e (stro @ - _r) e (stru @ // restructurer - -) est (_ Est // -est - - dg) et (_ Et // Bridget, gadget - k) et (_ Et - tick) et (_ E2 - m) et (_ Et2 - - eu Y // eu - _) eu (ss y // eu - - _) eut (_ yt2 - eut (_ Yt2 - _) extra (uP5 E2kstra - _) extra (CP5 E2kstra - _) eû y // eût - eû Y: // jeûne - - ey (_ E2 // dahomey - ey (C E2 // ceylan - ey Ej // asseye - - ez (_ ez2 // nez mangez chez - - g) e (A // mangeons - g) eu Y // 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 (rr+++ E - - e @ // menue - _) e (CA e - _) e (xC++ E2 - Cr) eam Im - Cr) eamer ImWr - Cl) eaner InWr - vert) e (rX W - eï (K 'Ej - _y) en (_ En - iew) er (X er2 - _m) e (ga e - - -// 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 - ed (_ _^_en - ee _^_en // meeting - efore (_ _^_en // before - eing (_ _^_en // being, boeing - eive _^_en // receive - eld (_ _^_en // field - _) enter (_ _^_en // enter - _) enhan _^_en - qu) est (_ _^_en // request - qu) este (X_ _^_en // requested, requester - _) even (X _^_en // forever, however - _) ever _^_en // forever, however - oC) ever _^_en // forever, however - _) eye _^_en - - -.group è - - Z) ème iEm - è E - ès (_ E - Ar) ès (_ Es - m) ès (_ Es - n) ès (_ Es - p) ès (_ Es - - -.group ë - u) ë // ambiguë - ë E // citroën noël - - -.group f - f f - f (f - _ner) f (X - _neu) f (_ans v // liaison: neuf ans - _neu) f (_heures v - -// group f: English section - _) fire _^_en - fly _^_en - _) frame _^_en - fter (_ _^_en - - -.group g - g g - g (Y Z - - su) gg (Y gZ // suggérer suggestif - gg g // agglomérer - ai) gni n^ // craignions châtaignier - gn nj // agneau -_wa) gner (_ gnEr - gni n^i // signifier - gn (e_ n^ - gn (_ n^ - gn (eCA nj@- - gn (ie n // compagnie - dia) g (no g - _a) g (no g -_quatrevin) gts (_ z2 - - vin) gt (_A t // liaison: vingt ans - - vin) gt (_un - vin) gt (_deux t - vin) gt (_trois t //liaison: vingt-trois - vin) gt (_quatr t - vin) gt (_cinq t - vin) gt (_six t - vin) gt (_sept t - vin) gt (_huit t - vin) gt (_neuf t - vin) gt (_neuvi t - - gt (_ // vingt doigts - An) gt (A t // vingtaine doigté - - gu (i g // anguille - ai) gui (l gyi // aiguillage - in) gui (s gyi // linguiste - g (C g - - _ran) g (_ // rang - _san) g (_ // sang - étan) g (_ // étang - _lon) g (_ // long - bour) g (_ // Strasbourg - - g (_ g // grog gag goulag - -// group g: English section - _) game (X _^_en - girl _^_en // girl - gy (_ _^_en - - -.group h - _) h _| - _) h (abi // habit, habilleur - _) h (allo // hallogène - _) h (ame // hameçon - _) h (andr // handroïde - _) h (arm // harmonie - _) h (el // hellène - _) h (ect // hectare - _) h (erb // herbe - _) h (é - _) h (éris _| - _) h (éro _| - _) h (eure // heure - _) h (iber // hibernation - _) hi (A _|j // hier - _) h (ippo // hippodrome - _) h (iro // hirondelle - _) h (ist // histoire - _) h (iv // hiver - _) h (omm // homme - _) h (onn // honneur - _) h (ô // hôpital - _) h (os // hostile - _) h (ora // horaire - _) h (orip // horipeau - _) h (oriz // horizon - _) h (oro // horoscope - _) h (orlo // horloge - _) h (orr // horreur - _) h (uil // huile - _) h (uiss // huissier - _) h (uitr // huître - _) h (umA // humain - _) h (umC // humble - _) hy (A j - haus (_ o2s //blockhaus - heim (_ ajm - _) h (y // hypermarché - _) hyper (@P5 ipEr - _) hyper (_ ipEr - _) hypra (@P5 ipra - h // ahuri - -// group h: English section - _) half _^_en - here (_ _^_en // here - - -.group i - i i // cri - - C) i (erA i - C) ien (t_ i - dév) ien (t_ i - t) ien (K_ jE~ // tient - v) ien (K_ jE~ // vient - at) ien (t_ jA~ // patient - cip) ien (C jA~ // récipient - cl) ien (C iA~ // client - mol) ien (C jA~ // émolient - vén) ien (C jA~ // inconvénient - 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 - aigu) ill ij // aiguille - anqu) ill il // tranquille - c) ill (i il - dist) ill il // distiller - _L05) ill il // Lille, mille, ville, william - osc) ill il // osciller - gu) ill ij // guillaume - qu) ill ij // quille - A) ill j // caillou - C) ill ij // famille - a) il (_ j // bail - e) il (_ j - gt) i (m aj - u) il (_ j // deuil - L01_f) ils (_ is // fils (enfant) - - 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 (s iN - ing (to iN - _) infra (sP5 E~fra - _) inter (@@P5 E~tEr - _) interr (A E~tEr - _) inter (_ E~t'Er - _) inter (ne_ E~t'Er - _) intra (neP5 E~tra - _) intra (uP5 E~tra - C) is (_ i - Kir) is (_ is - bor) is (_ is - dor) is (_ is - tor) is (_ is - fl) irt Wrt - otl) i (neX aj - onl) i (ne_ aj - offl) i (ne_ aj - dr) i (ve aj - pr) int (_ int - -// group i: English section - ibuter (X _^_en - iev _^_en - ife (_ _^_en - igh _^_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 - ram_f) i (le _^_en - -.group ï - ï i // naïf - A) ï (_ j - A) ïe (_ j - A) ï (lA j - - - ïn (K E~ // coïncidence - ma) ïs (_ is // maïs - - - -.group j - j Z // adjoint joujoux - _) j' (P2v Z - _) jazz dZaz - _) j (obK dZ - _) j (ohK dZ - _) jusqu' (P6 Zysk - - -.group k - k k // kafka - - -// group k: English section - ke (_ _^_en // make, take - ke (s_ _^_en // makes, takes - ke (rX _^_en // maker - ke (nX _^_en // taken - -.group l - l l // lit - ll l // aller - _) l' (P2 l - au) lt // hérault - uCi) l (_ // outil, fusil - nti) l (_ // gentil - nti) lh j // gentilhomme - ui) ll j // juillet - _) lorsqu' (P7 lorsk - -// group l: English section - less (_ _^_en // noiseless - _) live _^_en - @) loud (_ _^_en - ll (X _^_en - - -.group m - m m // film - mm m // pomme - _) m' (P2v m - _) mc (@P2 mak - _) ms (P2 EmEs - master (_S6 mastYr - -// group m: English section - _) mail (_ _^_en // mailer - mov (ieX _^_en // move, movy - - -.group n - n n // une - nn n - ng (_ N - - _) n' (P2v n - _wAC) ner (_ nEr - - _) n (_° nymero - _) neuro (@@P5 nYro - _) nvda (P4 Envedea - - -.group o - br) oc (_ o // broc - cr) oc (_ o // escroc - on (n o - ls) on (_ on - Cst) on (_ on - _) os (_ os - _v) os (gY o2 - s_) os (_ o - x_) os (_ o - o (t_ o - - oe (ll wa // moelleux - oe (i Y // oeil - _) oe (C Y // oesophage - _ph) oe (C e // phoetus - _ph) oe (n_ Y // phoen - oeu Y // voeu - oeud Y // noeud - oeufs (_ Y // oeufs boeufs - oeu (x Yz2 // voeux coeur - o (eC o // coefficient - _) oi (gnon o // oignons - oin (C wE~ - oin (_ wE~ // coin - oi wa // poil - oê (l wa // poêle - om (C O~ // bombe - om (m o // nommer - om (ni om // omnibus - n) om (X O~ // nom - om (_ om // www.web.com - s) om (n om - - on (K O~ // mon - on (t_ O~t2 // mont vont sont - _m) ont (pAC O~ // Montpellier - _m) ont (m O~ - _m) ont (rAal O~ // Montreal - onsh (A O~z // bonshommes - onh (A on // bonhomme - _) on (z _|O~ // onze, onzi�me - - _c) on (_ O~ // no comment - 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 - z) oo o // zoo - z) oo (C oo // zoologue - z) oo (m u // zoom - _gal) op (_ o // galop - - _sir) op (_ o // sirop - - v) ost (_ o // Prévost - _C) oup (_ u // coup, loup - - - ou u // hibou brouillard - ou (in w // pingouin - oue (mA u // dvvouement - _) ou (at _|u // ouate - où u // où - oû u // coûter - oy (A waj // noyer voyelles - _b) oy (co oj // boycott - _c) oy (o oi // coyote - _y) o (y o - oy wa - o (_ o // zorro allégro - o (z_ o // berlioz - o o - _sC) ot ot - - -// group o: English section - oa (X _^_en // approach, load - oa (_ oa - oa (s_ oa - oa (CerX _^_en - oach _^_en - old (er_ _^_en // folder, older - C) oing (_ _^_en // going - oo (Ce _^_en // boomer - oo (k _^_en // book, cook - oo (st _^_en // booster - oo (X _^_en // pool - C) oot _^_en // bootable football - _) one _^_en - oun (C _^_en // bounce, found - _) over _^_en // over - ow (e _^_en // flower, power - ow (X _^_en - oy (X _^_en // boy, toy - - -.group ô - ôt (_ o2 // rôt - ô o2 // cône - - -.group p - p p // pas - _) para (pCP4 para - _) photo (@P5 foto - _) poly (@P4 poli - _) post (KP4 post - _) post (ACCP4 post - _) pseudo (@P6 psYdo - p (p // appliquer - pays pE2iz2 // pays, paysage - ph f // phrase - - m) ps (_ // temps champs - r) ps (_ // corps - - cham) p (_ // champ - - cam) p (_ // camp - - dra) p (_ // drap - _) psych (@P5 psik - _) psych (iCP5 psiS - _) psych (AA_P5 psiS - - ba) p (t // baptiser - com) p (t // compte - - C) pt (_ // prompt exempt - - se) pt (_ t // sept - se) pt (iè t // septième - scul) p (t // sculpture - _) puisqu' (P7 pyisk - -// group p: English section - pad (_ _^_en - plug _^_en // plug - printer (_ _^_en // printer - - -.group q - q k // coq - _) qu' (AP3 k - _) qua (d kwa // quadrature - _) qua (tA kwa // quaternaire - _) quan (tA kwA~ // quantique - _) qua (drill ka // quadriller - _a) qua kwa // aquarium - _a) qu (if ku // aquifère - _A) qui (dist kyi // équidistant - _A) qui (lat kyi // équilatéral - _C) qua kwa // squale square - _A) qua kwa // équateur - dé) qua kwa // adequate - _) qua (rtz kwa // quartz - qu k // quatre - _) que (_ k@ // que - n) q (_ k // cinq cent - -// group q: English section - quick _^_en // quick, quickly - - -.group r - - _su) rr rr // surréaliste - cou) rr rr // courrai - mou) rr rr // mourrai - cou) rr (i r // courrier - cou) rr (o r // courroie - r r // rien - rr r - _) radio (@P5 radio - -// group r: English section - _) real _^_en - resen _^_en - rst (_ _^_en - _) rule _^_en - - -.group s - s s // verser sien - - s (_S1 z2 - stein (_ Stajn - - _) s' (P2v s // s'amène - _) s' (esXP2v s // s'amène - sç s // immisça - sch (ie sk // schierzo - sch (iz sk // schizophrène - sch (ol sk - sch (oo sk - schu Su - - sch S // schéma - dé) sh (A z // déshabiller - sh S // shérif - ss s // assez - - ai) s (em s // vraisemblable - aCè) s (_ s - nè) s (_ s - kansa) s (_ s // Kansas, Arkansas - ub) s (is z // subsister - tran) s (A z // transition - tran) s (e s // transe - tran) s (ub s // transubstantiation - A) s (A z // baiser - A) s (oft s // microsoft - A) s (ol_ s // tournesol - _) socio (@P5 sosio - _) super (@@P5 sypEr - _) super (_ sypEr - _) supra (@P5 sypra - batro) s (_ s - océro) s (_ s - scien (t siA~ // conscient scientifique - sql (_S3 EskyEl - - _u) s (_ s - Cu) s (_ - Abu) s (_ s - _Abu) s (_ - mbu) s (_ s -_cACpu) s (_ s - Acu) s (_ s - docu) s (_ - écu) s (_ - asu) s (_ s - odu) s (_ s - gu) s (_ s - igu) s (_ // aigus - iu) s (_ s // radius - ïu) s (_ s // laïus - Culu) s (_ s // cumulus - plu) s (_ z2 // plus, surplus - ylu) s (_ s // stylus - mu) s (_ s - _mu) s (_ - ému) s (_ - opu) s (_ s // opus, octopus - Aru) s (_ s // virus - aru) s (_ // disparus - ouru) s (_ // courus - Anu) s (_ s // bonus, tonus - enu) s (_ // menus, venus - psu) s (_ s // lapsus - cessu) s (_ s // processus - - atu) s (_ s // stratus motus - ctu) s (_ s // cactus - etu) s (_ s - aitu) s (_ - itu) s (_ s - ltu) s (_ s // altus - otu) s (_ s // motus - Cutu) s (_ s - - _tou) s (_ s - - s (b z // sbire - s (d z - s (g z - s (j z - s (v z - _tou) s (_Ces_ - _tou) s (_des_ s - _tou) s (_Cos_ - _tou) s (_leurs_ - -// group s: English section - CA) sh (_ _^_en // punish - sh (_ _^_en - sh (Ap _^_en // shop, ship - sh (At _^_en // shut, shot - _) sky _^_en - _) smil _^_en // smile, smiley - spy _^_en - - -.group t - t t // bataille - _) t (_ te - -) t (- t2 - _) t' (P2v t - Vn) t (_ t2 - A) t (- t2 - VCi) t (_ t2 - t (_ - peti) t (_ t2 - _) th t // thon - 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 - n) t (_ - r) t (_ - - aul) t (_ // Renault - grani) t (_ t - - _) télé (@P4 tele - _) tele tele - _) thermo (@P6 tErmo - - tt t // attitude - - s) th (m // asthme - th t // théorie - hui) t (_ t3 // huit - - _) t t // tien tiers - an) t (ia t // Santiago - C) t (ieu s // contentieux - - t (io_ s // ratio - - Ama) t (ieX s // diplomatie - a) t (ia s // spatial - en) t (ia s // confidentialit� - lbu) t (iA s // balbutiait - r) t (ia s // impartial - ini) t (iA s // initier - p) t (ia s // nuptial - an) t (iat s // transsubstantiation - - t (ion s // programmation - V) t (ion t // verbes - ache) t (ion t // achetions, rachetions - ai) t (ion t // souhaitions, traitions - oi) t (ion t // boitions - si) t (ion s // position - chan) t (ion t // chantions, d�chantions - Cisi) t (ion t // visitions - ci) t (ions t // citions - comp) t (ions t // comptions, escomptions - CAnc) t (ion s // fonctionner, ponctionner - Ce) t (ions t // jetions, rejetions - Vec) t (ion t // respections - Vep) t (ion t // respections - éCi) t (ions t // hésitions, héritions - éti) t (ion s // pétition - Vé) t (ion t // répétions - habi) t (ions t // habitions - imi) t (ions t // imitions, limitions - VAu) t (ion t // ajoutions - lu) t (ion s // févolution - Apor) t (ion t // emportions, exportions - opor) t (ion s // proportion - Cpor) t (ion t // emportions, exportions - sor) t (ion t // sortions - rê) t (ion t // arrêtions, apprêtions - - s) t (ion t // gestion - _ta) t (ion t // tation - sen) t (ion_ t // sentions, ressentions - t) t (ion t // combattions - - t (iel s // partiel - t (ieu s // ambitieux - t (iAm s // patiemment - - mar) t (ien s // martien vénitienne - a) t (ien s - i) t (ien s - o) t (ien s - - ipé) t (ieX s - amé) t (ieX s - nu) t (ieX s // minutie - ni) tien (t_ si - bu) tien (t_ si - - cra) t (ieX s // démocratie - - ner) t (ie s // inertie - - _ce) t (_ t -_transA) t (_ t - -// group t: English section - C) th (_ _^_en // month - _) th (eX _^_en // the, then - _) th (aX _^_en // than, that - _) time _^_en - tle (_ _^_en - too _^_en - ttl _^_en - try (_ _^_en // try, country - sCar) t (_ _^_en // smart, start - sCar) t (er_ _^_en // starter - _) tun (AX _^_en - - -.group u - u y // cruel nuage brut - ui yi // nuit, fuite - uin (K yE~ // juin - _s) u (rfX Y - _bl) u (ff Y - _s) u (rfeX Y - uy (A yij - - C) ucci utSi // capuccino - c) ueill Yj // cueillir - c) ueil (_ Yj // recueil - _g) ua wa - ag) ua (X wa - Ctig) ua (_ wa - _c) ul (_ y - _) ultra (P5 yltra - g) u (ay u - g) ueill Yj // orgueilleux - haïk) u (X u - - C) u (bX Y // hub, club - C) u (gX Y // bug, mug - _n) u (rse Y // 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~ - un (C W~ // emprunt lundi - un (n y // tunnel - CC) un (_ W~ // brun - uc) un (_ W~n2 // aucun - un (_ W~n2 // un avion - _h) un (_ W~ // hun - - fl) ux (_ y // flux, reflux - g) u (A // fatigue - g) u (ï y // ambiguïté - g) u (ë y // ambiguë - uz (z Y - -// group u: English section - _b) usi _^_en // business, businessman - C) ui (ce _^_en // produice, juice - umber (_ _^_en - ump (_ _^_en - unch _^_en - under _^_en // under, understand, thunder - _C) un (_ _^_en - _C) un (ny _^_en - _) up (C _^_en // upper, update - up (_ _^_en // setup - urn (X _^_en // burn, turn - ust (_ _^_en // just, trust - - -.group ü - ü y - üs (_ ys - üm (_ om - ül (_ yll - - -.group v - v v - vers (_ vErz2 - dri) ver (X vYr - view (X vju - _) view (A vjuv - -// group v: English section - voice (X _^_en - void (_ _^_en - vy (_ _^_en - - -.group w - w w - _) w (A _|w - w (ag v // wagon - wa (ve_ wE:j // wave - wa (re_ wE: // hardware software - -// group w: English section - e) w (K _^_en - _) wan _^_en - wr _^_en // write - way _^_en // way, away - _) wir _^_en // wire - winn _^_en // winner - wise _^_en - with _^_en - wor _^_en - - -.group x - x ks - xx ks - _) x (A gz // xylophone - _) x (CP1 iks // xylophone - xml (_S3 _|iksEmEl - e) x (A gz // exagérer exemple - L03e) x (A ks // annexe, vexer - _ine) x (A gz - _e) x (h gz // exhumer - - ai) x (_ // voix paix prix - oi) x (_ - ri) x (_ - - _soi) x (A s // soixante - - Au) x (_ z2 // faux feux choux - - _au) x (quel // auxquels - - _di) x (_neuf z // liaison: dix-neuf - _di) x (_ z3 - _si) x (_neu s // liaison: six-neuf - _si) x (_ z3 - - di) x (iè z // dixième - si) x (iè z // sixième - deu) x (iè z // deuxième - - -.group y - y i // cryogénique myope - _) y (A _|j // yak - _) y (eu j // yeux - _) yacht _^_en // yacht, yachtman - - _) yahoo (P5 ja'u - ym (K E~ // tympan - y (nn i - y (nA i - X) ys (_ is - yx (_ iks - - yn E~ // laryngite - - -.group z - z z - t) z s // tzigane - t) zer (_ zEr - C) zer (_ zWr - - -.group -// accented characters, these could have their own groups if they need more rules - â a: - ñ n^ - - é e // été - ê E // fête - - ö o // angström - û y: // fûtes - ü y // bülcher - - -// symbols that are normally spoken when reading text - , (D pilk:u - $ dolar - ° d@gre - _n_) ° // n° - - - - - - - - - +// French translation rules for Espeak + +// *************************************************************************** +// * Copyright (C) 2005 to 2010 by Jonathan Duddington * +// * email: jonsd@users.sourceforge.net * +// * * +// * This program is free software; you can redistribute it and/or modify * +// * it under the terms of the GNU General Public License as published by * +// * the Free Software Foundation; either version 3 of the License, or * +// * (at your option) any later version. * +// * * +// * This program is distributed in the hope that it will be useful, * +// * but WITHOUT ANY WARRANTY; without even the implied warranty of * +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +// * GNU General Public License for more details. * +// * * +// * You should have received a copy of the GNU General Public License * +// * along with this program; if not, see: * +// * . * +// ***************************************************************************/ + +// This file is UTF-8 encoded + +// 2006-11-18 Gilles Casse +// +// Updated: 2010-06-18 Michel Such +// + +// Letter classes: +// A all vowels: a e i o u y â ä é ê è î ï ô ö ù û +// C all consonants +// Y front vowels: e i y é ê è î +// K not a vowel (i.e. consonant, space, ) + +.replace +œ oe +î i +à a + + +.L01 d e l n r t u +.L02 b c d f g h k p t v +.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 + + +.group a + ae (_ e // reggae vitae + aen A~ // caen (diff Cicero: aA~) + ae aE // maestro + aim (K E~ // faim + 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... + 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 (m a // programmation + _) am (n am // amnistie + am (n a // condamner + + _L04) an (_ an + an (n_ a + _h) an (_ an + _) anti (@@P4 A~ti + _) arché (@P5 arke // archéologue + _) archéo (@P6 arkeo // archéologue + _) arch (aP4 ark // archange + _) arch (oP4 ark // archonte + _) anarcho (@P7 anarko // anarchosyndicalisme + + a (nnA a // manne + an (K A~ // ancien, élan + an (h an + @@m) an (_ an // tennisman + zm) an (_ an // jazzman + L02m) an (_ an + lism) an (_ A~ // talisman + ulm) an (_ A~ // musulman + _caïm) an (_ A~ // caïman + _C) aon (_ A~ // faon, paon, taon + s) aoul (_ u // saoul + s) aou (le u // saoule + août ut // août + août (i aus // aoûtien + aut (_ ot2 + a (ô // saune + au o2 // au, aux + aud (_ o // chaud +_C) aud (_ o2d // Maud + au (l_ o // Paul + au (re_ o // dinosaure + _) audio (@P5 o2dio + _) auto (@P4 o2to + _) autom (n otO + bb) aye (X ei // abbaye + ay (C E // aymé + ay Ej // paye + ay (_ E2 // display + Xl) ayer (X E2jWr // player, layer + h) am (_S2 am + w) an (_ an + a a // bateau + +// group a: English section + sm) all _^_en // small, smaller + a (wC _^_en + + +.group b + bb b // abbé + om) b (_ // plomb applomb + b b // aube + +// 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 + _) c' (P2v s // s + cch k // bacchanale + cc (Y ks // accéder + cc k // occuper + _) c (d se + _) ch (arism k // charisme, charismatique + _) ch (irop k // chiroptère + a) ch (_ k // almanach + ar) c (ti // arctique + e) ch (_ k // varech + ni) ch (_ k + _A) ch (o_ k // écho + mani) ch (é k // manichéisme + wi) ch tS // sandwich + mito) ch (o k // mitochondrie + _eu) ch (ari k // eucharistie + or) ch (esC k // orchestre + or) ch (iC k // orchidée + _) ch (ao k // chaos, chaotique + _) ch (orA k // chorale + _) ch (oriz S + _) ch (oro S + ch (r k // chrétien + _) chrono (@P6 krono + ch (l k + ch (n k + ch (s k + ch (to k + ch S // chien + ck k // nickel + cqu k // grecque + cq k // pecq + s) c (Y + x) c (Y + c (Y s // cède + _) cyber (P5 sibEr + Can) c (_ // banc + Con) c (_ // tronc, jonc + _don) c (_ k // donc + cler) c (_ // leclerc + tchou) c (_ + taba) c (_ + toma) c (_ + se) c (ond g // seconde secondaire + c k // recoin donc + + cient (_ sit2 // ils appr�ient, remercient. + effi) cient sjA~ // coefficient + défi) cient sjA~ // déficient + cast (_S4 kast // podcast + casts (_S5 kast // podcasts + _) clown klun + +// group c: English section + n) ch (_ _^_en // french + ch (ment _^_en // attachment + cut (_ _^_en // cut, shortcut + + +.group ç + + ç s // rançon + _) ç' (P2v s + + +.group d + dd d // addition + _) d' (P2 d + _ban) d (_ d + _lan) d (_ d // land + _stan) d (_ d // stand + an) d (_ + _san) d (_ d + + _gran) d (_ t2 // grand ami, grand marchand + Cen) d (_ t2 + Con) d (_ + con) d (_ t2 + quen) d (_ t2 + r) d (_ + _har) d (_ d + lor) d (_ d + oi) d (_ + ou) d (_ + + dt (_ t // Schmidt + _ni) d (_ // nid + d d // don bled + _expé) dien (t_ djA~ // expédient +V_expé) dien (t_ di // expédient +_ingré) dien (t_ djA~ // ingrédient + dien (t_ di // étudient (verbe) + _) dendro (@P6 dE~dro + +// group d: English section + day (_ _^_en + _) devic _^_en + dle (X _^_en // bundle, handle + + +.group e + +// Define use of the final 'e' in french + 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 + 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 + _f) em (me a // femme + i) e (mA // remerciement, d�ploiement + A) e (rA // remerciera + tch) e (rX Y + @) em (me a // patiemment + em (b A~ // décembre + em (mACC A~ // emmancher + em (mACAC A~ // emmagasiner + em (ma E2 // 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 + _flam) en (c E~ // flamenco + _) en (A A~n // enivrer + + C) en (d_ A~ // comprend dépend + od) en (dr E~ // rhododendron + qu) en (d_ A~ + + pati) en A~ // patient patience + en (nu A~ // ennui + en (nA E // penne ennemi + + é) en (_ E~ // européen + + Ci) en (nA E // mienne + + éC) en (t_ A~ // récent différent élément + équ) en (t_ A~ // fréquent, conséquent + étic) en (t_ A~ // réticent + + _C) en (t_ A~ // cent vent lent dent + cc) en (t_ A~ // accent + Asc) en (t_ A~ // luminescent + _dol) en (t_ A~ // dolent + ol) en (t_ A~ // somnolent, violent + Vol) en (t_ // somnolent, violent + Xol) ent (_ t2 // volent + eul) ent (_ t2 // veulent + ul) en (t_ A~ // turbulent + Ccul) ent (_ t2 + Vul) ent (_ t2 + imCoC) en (t_ A~ // impotent + inCoC) en (t_ A~ // innocent, indolent + +XACcid) en (t_ A~ // accident, occident + + _ag) en (t_ A~ // agent + _ard) en (t_ A~ // ardent + _arg) en (t_ A~ // argent + _urg) en (t_ A~ // urgent + V_urg) ent (_ t2 // urgent (verbe) + + _émin) en (t_ A~ // éminent + immin) en (t_ A~ // imminent + oémin) en (t_ A~ // proéminent + jac) en (t_ A~ // sous-jacent, adjacent + _lat) en (t_ A~ // latent + + ig) ent (_ t2 + ilig) ent (_ A~t2 + llig) ent (_ A~t2 + ndig) ent (_ A~t2 + tang) ent (_ A~t2 // tangent + @@ing) en (t_ A~ // astreingent, contingentindigent + + man) en (t_ A~ // permanent + _pat) en (t_ A~ // patent + rmam) en (t_ A~ // firmament + verg) en (t_ A~ // convergent, divergent + Vverg) ent (_ t2 // convergent, divergent (verbe) + + _serg) en (t_ A~ // sergent +CACCim) en (t_ A~ // condiment, gentiment + dim) en (t_ A~ // rudiment + Agim) en (t_ A~ // régiment + Alim) en (t_ A~ // poliment + inim) en (t_ A~ // infiniment + manim) en (t_ A~ // maniment + onim) en (t_ A~ // boniment + plim) en (t_ A~ // compliment + Atim) en (t_ A~ // bâtiment + _cim) en (t_ A~ // ciment + _pim) en (t_ A~ // piment + gm) en (t_ A~ // fragment + Asim) en (t_ A~ // quasiment + + ertin) en (t_ A~ // pertinent, impertinent + ontin) en (t_ A~ // continent, incontinent + _sArm) en (t_ A~ // sarment, serment + erm) en (t_ A~ // ferment + Vferm) ent (_ t2 // ferment, referment (verbe) + XArp) en (t_ A~ // arpent, serpent + CArr) en (t_ A~ // conncurrent, torrent + Cerr) ent (_ t2 // ils serrent +_appar) en (t_ A~ // apparent + spar) en (t_ A~ // transparent + _par) en (t_ A~ // parent + V_par) ent (_ t2 // parent (verbe) + _var) en (t_ A~ // varent + mitt) en (t_ A~ // intermittent + énit) en (t_ A~ // pénitent + tourm) en (t_ A~ // tourment + Cflu) en (t_ A~ // affluent, confluent + VCflu) ent (_ t2 // refluent, influent (verbe) + + _tal) en (t_ A~ // talent + ival) en (t_ A~ // équivalent + Vival) ent (_ t2 // équivalent (verbe) + xcell) en (t_ A~ // excellent +Vxcell) ent (_ t2 // excellent + + iCam) en (t_ A~ + mm) en (t_ A~ + em) en (t_ A~ // lentement + mom) en (t_ A~ // moment + Aaim) en (t_ A~ + Caim) en (t_ A~ + dum) en (t_ A~ + gum) en (t_ A~ + jum) en (t_ A~ + oCum) en (t_ A~ + rum) en (t_ A~ + + éCid) en (t_ A~ + VéCid) ent (_ t2 + Xtrid) en (t_ A~ + _flor) en (t_ A~ + _laur) en (t_ A~ +_mécont) en (t_ A~ + _cont) en (t_ A~ +_Vcont) ent (_ t2 + éC) en (t_ A~ // compétent + _souv) en (t_ A~ // souvent + Cud) en (t_ A~ + + _couv) en (tS3f A~ // le couvent +V_couv) en (t_ // elles couvent +s_couv) en (t_ // elles couvent + + ent (_ t2 // étaient mangent + A) ent (_ t2 // étaient mangent + + Ci) en (K E~ // rien, lien + Ci) en (c A~ // science + + AA) en (_ E~ + C) en (_ En // amen, abdomen, golden + C) en (to_ En // memento + nc) ens (_ A~ // encens + xam) en (_ E~ // examen + + en (s_ A~ + en (CA A~ // pentathlon + en (CC A~ // entre + sp) ens (_ Ens // suspens + éC) ens (_ A~z2 // dépens démens + + _C) er (_ Er // fer + _Ch) er (_ Er // cher + _env) er (_ Er + _hi) er (_ Er // hier + _fi) er (_ Er // fier + _hiv) er (X Er // hiver + Cst) er (X Er // hamster + _cart) er (X Er // carter + _cutt) er (X Er // cutter + tain) er (X Er // container + _ti) er (_ Er + ack) er (K Yr + ock) er (K Er + rock) er (K Yr + + er (_ e // parler léger + er (s_ e + + i) e (rt_ E // requiert + + d) e (ssus_ @ // dessus + + _d) es (bA e + _d) es (jA e // Desjardins + _d) es (nA e + _d) es (qA e // desquels + + _l) es (qA e // lesquels + + _m) es (dA e // mesdames + _m) es (nA e + Am) es (dA e + Am) es (nA e // Dumesnil + + d) esh (A ez // Deshormeaux + + _r) e (ss @ // ressembler + _r) e (ssu e // ressusciter + _r) e (stra @ + _r) e (stro @ + _r) e (stru @ // restructurer + -) est (_ Est // -est + + dg) et (_ Et // Bridget, gadget + k) et (_ Et + tick) et (_ E2 + m) et (_ Et2 + + eu Y // eu + _) eu (ss y // eu + + _) eut (_ yt2 + eut (_ Yt2 + _) extra (uP5 E2kstra + _) extra (CP5 E2kstra + _) eû y // eût + eû Y: // jeûne + + ey (_ E2 // dahomey + ey (C E2 // ceylan + ey Ej // asseye + + ez (_ ez2 // nez mangez chez + + g) e (A // mangeons + g) eu Y // 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 (rr+++ E + + e @ // menue + _) e (CA e + _) e (xC++ E2 + Cr) eam Im + Cr) eamer ImWr + Cl) eaner InWr + vert) e (rX W + eï (K 'Ej + _y) en (_ En + iew) er (X er2 + _m) e (ga e + + +// 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 + ed (_ _^_en + ee _^_en // meeting + efore (_ _^_en // before + eing (_ _^_en // being, boeing + eive _^_en // receive + eld (_ _^_en // field + _) enter (_ _^_en // enter + _) enhan _^_en + qu) est (_ _^_en // request + qu) este (X_ _^_en // requested, requester + _) even (X _^_en // forever, however + _) ever _^_en // forever, however + oC) ever _^_en // forever, however + _) eye _^_en + + +.group è + + Z) ème iEm + è E + ès (_ E + Ar) ès (_ Es + m) ès (_ Es + n) ès (_ Es + p) ès (_ Es + + +.group ë + u) ë // ambiguë + ë E // citroën noël + + +.group f + f f + f (f + _ner) f (X + _neu) f (_ans v // liaison: neuf ans + _neu) f (_heures v + +// group f: English section + _) fire _^_en + fly _^_en + _) frame _^_en + fter (_ _^_en + + +.group g + g g + g (Y Z + + su) gg (Y gZ // suggérer suggestif + gg g // agglomérer + ai) gni n^ // craignions châtaignier + gn nj // agneau +_wa) gner (_ gnEr + gni n^i // signifier + gn (e_ n^ + gn (_ n^ + gn (eCA nj@- + gn (ie n // compagnie + dia) g (no g + _a) g (no g +_quatrevin) gts (_ z2 + + vin) gt (_A t // liaison: vingt ans + + vin) gt (_un + vin) gt (_deux t + vin) gt (_trois t //liaison: vingt-trois + vin) gt (_quatr t + vin) gt (_cinq t + vin) gt (_six t + vin) gt (_sept t + vin) gt (_huit t + vin) gt (_neuf t + vin) gt (_neuvi t + + gt (_ // vingt doigts + An) gt (A t // vingtaine doigté + + gu (i g // anguille + ai) gui (l gyi // aiguillage + in) gui (s gyi // linguiste + g (C g + + _ran) g (_ // rang + _san) g (_ // sang + étan) g (_ // étang + _lon) g (_ // long + bour) g (_ // Strasbourg + + g (_ g // grog gag goulag + +// group g: English section + _) game (X _^_en + girl _^_en // girl + gy (_ _^_en + + +.group h + _) h _| + _) h (abi // habit, habilleur + _) h (allo // hallogène + _) h (ame // hameçon + _) h (andr // handroïde + _) h (arm // harmonie + _) h (el // hellène + _) h (ect // hectare + _) h (erb // herbe + _) h (é + _) h (éris _| + _) h (éro _| + _) h (eure // heure + _) h (iber // hibernation + _) hi (A _|j // hier + _) h (ippo // hippodrome + _) h (iro // hirondelle + _) h (ist // histoire + _) h (iv // hiver + _) h (omm // homme + _) h (onn // honneur + _) h (ô // hôpital + _) h (os // hostile + _) h (ora // horaire + _) h (orip // horipeau + _) h (oriz // horizon + _) h (oro // horoscope + _) h (orlo // horloge + _) h (orr // horreur + _) h (uil // huile + _) h (uiss // huissier + _) h (uitr // huître + _) h (umA // humain + _) h (umC // humble + _) hy (A j + haus (_ o2s //blockhaus + heim (_ ajm + _) h (y // hypermarché + _) hyper (@P5 ipEr + _) hyper (_ ipEr + _) hypra (@P5 ipra + h // ahuri + +// group h: English section + _) half _^_en + here (_ _^_en // here + + +.group i + i i // cri + + C) i (erA i + C) ien (t_ i + dév) ien (t_ i + t) ien (K_ jE~ // tient + v) ien (K_ jE~ // vient + at) ien (t_ jA~ // patient + cip) ien (C jA~ // récipient + cl) ien (C iA~ // client + mol) ien (C jA~ // émolient + vén) ien (C jA~ // inconvénient + 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 + aigu) ill ij // aiguille + anqu) ill il // tranquille + c) ill (i il + dist) ill il // distiller + _L05) ill il // Lille, mille, ville, william + osc) ill il // osciller + gu) ill ij // guillaume + qu) ill ij // quille + A) ill j // caillou + C) ill ij // famille + a) il (_ j // bail + e) il (_ j + gt) i (m aj + u) il (_ j // deuil + L01_f) ils (_ is // fils (enfant) + + 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 (h ing + ing (s iN + ing (to iN + _) infra (sP5 E~fra + _) inter (@@P5 E~tEr + _) interr (A E~tEr + _) inter (_ E~t'Er + _) inter (ne_ E~t'Er + _) intra (neP5 E~tra + _) intra (uP5 E~tra + C) is (_ i + Kir) is (_ is + bor) is (_ is + dor) is (_ is + tor) is (_ is + fl) irt Wrt + otl) i (neX aj + onl) i (ne_ aj + offl) i (ne_ aj + dr) i (ve aj + pr) int (_ int + +// group i: English section + ibuter (X _^_en + iev _^_en + ife (_ _^_en + igh _^_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 + ram_f) i (le _^_en + +.group ï + ï i // naïf + A) ï (_ j + A) ïe (_ j + A) ï (lA j + + + ïn (K E~ // coïncidence + ma) ïs (_ is // maïs + + + +.group j + j Z // adjoint joujoux + _) j' (P2v Z + _) jazz dZaz + _) j (obK dZ + _) j (ohK dZ + _) jusqu' (P6 Zysk + + +.group k + k k // kafka + + +// group k: English section + ke (_ _^_en // make, take + ke (s_ _^_en // makes, takes + ke (rX _^_en // maker + ke (nX _^_en // taken + +.group l + l l // lit + ll l // aller + _) l' (P2 l + au) lt // hérault + uCi) l (_ // outil, fusil + nti) l (_ // gentil + nti) lh j // gentilhomme + ui) ll j // juillet + _) lorsqu' (P7 lorsk + +// group l: English section + less (_ _^_en // noiseless + _) live _^_en + @) loud (_ _^_en + ll (X _^_en + + +.group m + m m // film + mm m // pomme + _) m' (P2v m + _) mc (@P2 mak + _) ms (P2 EmEs + master (_S6 mastYr + +// group m: English section + _) mail (_ _^_en // mailer + mov (ieX _^_en // move, movy + + +.group n + n n // une + nn n + ng (_ N + ngh ng + + _) n' (P2v n + _wAC) ner (_ nEr + + _) n (_° nymero + _) neuro (@@P5 nYro + _) nvda (P4 Envedea + + +.group o + br) oc (_ o // broc + cr) oc (_ o // escroc + on (n o + ls) on (_ on + Cst) on (_ on + _) os (_ os + _v) os (gY o2 + s_) os (_ o + x_) os (_ o + o (t_ o + + oe (ll wa // moelleux + oe (i Y // oeil + _) oe (C Y // oesophage + _ph) oe (C e // phoetus + _ph) oe (n_ Y // phoen + oeu Y // voeu + oeud Y // noeud + oeufs (_ Y // oeufs boeufs + oeu (x Yz2 // voeux coeur + o (eC o // coefficient + _) oi (gnon o // oignons + oin (C wE~ + oin (_ wE~ // coin + oi wa // poil + oê (l wa // poêle + om (C O~ // bombe + om (m o // nommer + om (ni om // omnibus + n) om (X O~ // nom + om (_ om // www.web.com + s) om (n om + + on (K O~ // mon + on (t_ O~t2 // mont vont sont + _m) ont (pAC O~ // Montpellier + _m) ont (m O~ + _m) ont (rAal O~ // Montreal + onsh (A O~z // bonshommes + onh (A on // bonhomme + _) on (z _|O~ // onze, onzi�me + + _c) on (_ O~ // no comment + 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 + z) oo o // zoo + z) oo (C oo // zoologue + z) oo (m u // zoom + _gal) op (_ o // galop + + _sir) op (_ o // sirop + + v) ost (_ o // Prévost + _C) oup (_ u // coup, loup + + + ou u // hibou brouillard + ou (in w // pingouin + oue (mA u // dvvouement + _) ou (at _|u // ouate + où u // où + oû u // coûter + oy (A waj // noyer voyelles + _b) oy (co oj // boycott + _c) oy (o oi // coyote + _y) o (y o + oy wa + o (_ o // zorro allégro + o (z_ o // berlioz + o o + _sC) ot ot + + +// group o: English section + oa (X _^_en // approach, load + oa (_ oa + oa (s_ oa + oa (CerX _^_en + oach _^_en + old (er_ _^_en // folder, older + C) oing (_ _^_en // going + oo (Ce _^_en // boomer + oo (k _^_en // book, cook + oo (st _^_en // booster + oo (X _^_en // pool + C) oot _^_en // bootable football + _) one _^_en + oun (C _^_en // bounce, found + _) over _^_en // over + ow (e _^_en // flower, power + ow (X _^_en + oy (X _^_en // boy, toy + + +.group ô + ôt (_ o2 // rôt + ô o2 // cône + + +.group p + p p // pas + _) para (pCP4 para + _) photo (@P5 foto + _) poly (@P4 poli + _) post (KP4 post + _) post (ACCP4 post + _) pseudo (@P6 psYdo + p (p // appliquer + pays pE2iz2 // pays, paysage + ph f // phrase + + m) ps (_ // temps champs + r) ps (_ // corps + + cham) p (_ // champ + + cam) p (_ // camp + + dra) p (_ // drap + _) psych (@P5 psik + _) psych (iCP5 psiS + _) psych (AA_P5 psiS + + ba) p (t // baptiser + com) p (t // compte + + C) pt (_ // prompt exempt + + se) pt (_ t // sept + se) pt (iè t // septième + scul) p (t // sculpture + _) puisqu' (P7 pyisk + +// group p: English section + pad (_ _^_en + plug _^_en // plug + printer (_ _^_en // printer + + +.group q + q k // coq + _) qu' (AP3 k + _) qua (d kwa // quadrature + _) qua (tA kwa // quaternaire + _) quan (tA kwA~ // quantique + _) qua (drill ka // quadriller + _a) qua kwa // aquarium + _a) qu (if ku // aquifère + _A) qui (dist kyi // équidistant + _A) qui (lat kyi // équilatéral + _C) qua kwa // squale square + _A) qua kwa // équateur + dé) qua kwa // adequate + _) qua (rtz kwa // quartz + qu k // quatre + _) que (_ k@ // que + n) q (_ k // cinq cent + +// group q: English section + quick _^_en // quick, quickly + + +.group r + + _su) rr rr // surréaliste + cou) rr rr // courrai + mou) rr rr // mourrai + cou) rr (i r // courrier + cou) rr (o r // courroie + r r // rien + rr r + _) radio (@P5 radio + +// group r: English section + _) real _^_en + resen _^_en + rst (_ _^_en + _) rule _^_en + + +.group s + s s // verser sien + + s (_S1 z2 + stein (_ Stajn + + _) s' (P2v s // s'amène + _) s' (esXP2v s // s'amène + sç s // immisça + sch (ie sk // schierzo + sch (iz sk // schizophrène + sch (ol sk + sch (oo sk + schu Su + + sch S // schéma + dé) sh (A z // déshabiller + sh S // shérif + ss s // assez + + ai) s (em s // vraisemblable + aCè) s (_ s + nè) s (_ s + kansa) s (_ s // Kansas, Arkansas + ub) s (is z // subsister + tran) s (A z // transition + tran) s (e s // transe + tran) s (ub s // transubstantiation + A) s (A z // baiser + A) s (oft s // microsoft + A) s (ol_ s // tournesol + _) socio (@P5 sosio + _) super (@@P5 sypEr + _) super (_ sypEr + _) supra (@P5 sypra + batro) s (_ s + océro) s (_ s + scien (t siA~ // conscient scientifique + sql (_S3 EskyEl + + _u) s (_ s + Cu) s (_ + Abu) s (_ s + _Abu) s (_ + mbu) s (_ s +_cACpu) s (_ s + Acu) s (_ s + docu) s (_ + écu) s (_ + asu) s (_ s + odu) s (_ s + gu) s (_ s + igu) s (_ // aigus + iu) s (_ s // radius + ïu) s (_ s // laïus + Culu) s (_ s // cumulus + plu) s (_ z2 // plus, surplus + ylu) s (_ s // stylus + mu) s (_ s + _mu) s (_ + ému) s (_ + opu) s (_ s // opus, octopus + Aru) s (_ s // virus + aru) s (_ // disparus + ouru) s (_ // courus + Anu) s (_ s // bonus, tonus + enu) s (_ // menus, venus + psu) s (_ s // lapsus + cessu) s (_ s // processus + + atu) s (_ s // stratus motus + ctu) s (_ s // cactus + etu) s (_ s + aitu) s (_ + itu) s (_ s + ltu) s (_ s // altus + otu) s (_ s // motus + Cutu) s (_ s + + _tou) s (_ s + + s (b z // sbire + s (d z + s (g z + s (j z + s (v z + _tou) s (_Ces_ + _tou) s (_des_ s + _tou) s (_Cos_ + _tou) s (_leurs_ + +// group s: English section + CA) sh (_ _^_en // punish + sh (_ _^_en + sh (Ap _^_en // shop, ship + sh (At _^_en // shut, shot + _) sky _^_en + _) smil _^_en // smile, smiley + spy _^_en + + +.group t + t t // bataille + _) t (_ te + -) t (- t2 + _) t' (P2v t + Vn) t (_ t2 + A) t (- t2 + VCi) t (_ t2 + t (_ + peti) t (_ t2 + _) th t // thon + 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 + n) t (_ + r) t (_ + + aul) t (_ // Renault + grani) t (_ t + + _) télé (@P4 tele + _) tele tele + _) thermo (@P6 tErmo + + tt t // attitude + + s) th (m // asthme + th t // théorie + hui) t (_ t3 // huit + + _) t t // tien tiers + an) t (ia t // Santiago + C) t (ieu s // contentieux + + t (io_ s // ratio + + Ama) t (ieX s // diplomatie + a) t (ia s // spatial + en) t (ia s // confidentialit� + lbu) t (iA s // balbutiait + r) t (ia s // impartial + ini) t (iA s // initier + p) t (ia s // nuptial + an) t (iat s // transsubstantiation + + t (ion s // programmation + V) t (ion t // verbes + ache) t (ion t // achetions, rachetions + ai) t (ion t // souhaitions, traitions + oi) t (ion t // boitions + si) t (ion s // position + chan) t (ion t // chantions, d�chantions + Cisi) t (ion t // visitions + ci) t (ions t // citions + comp) t (ions t // comptions, escomptions + CAnc) t (ion s // fonctionner, ponctionner + Ce) t (ions t // jetions, rejetions + Vec) t (ion t // respections + Vep) t (ion t // respections + éCi) t (ions t // hésitions, héritions + éti) t (ion s // pétition + Vé) t (ion t // répétions + habi) t (ions t // habitions + imi) t (ions t // imitions, limitions + VAu) t (ion t // ajoutions + lu) t (ion s // févolution + Apor) t (ion t // emportions, exportions + opor) t (ion s // proportion + Cpor) t (ion t // emportions, exportions + sor) t (ion t // sortions + rê) t (ion t // arrêtions, apprêtions + + s) t (ion t // gestion + _ta) t (ion t // tation + sen) t (ion_ t // sentions, ressentions + t) t (ion t // combattions + + t (iel s // partiel + t (ieu s // ambitieux + t (iAm s // patiemment + + mar) t (ien s // martien vénitienne + a) t (ien s + i) t (ien s + o) t (ien s + + ipé) t (ieX s + amé) t (ieX s + nu) t (ieX s // minutie + ni) tien (t_ si + bu) tien (t_ si + + cra) t (ieX s // démocratie + + ner) t (ie s // inertie + + _ce) t (_ t +_transA) t (_ t + +// group t: English section + C) th (_ _^_en // month + _) th (eX _^_en // the, then + _) th (aX _^_en // than, that + _) time _^_en + tle (_ _^_en + too _^_en + ttl _^_en + try (_ _^_en // try, country + sCar) t (_ _^_en // smart, start + sCar) t (er_ _^_en // starter + _) tun (AX _^_en + + +.group u + u y // cruel nuage brut + ui yi // nuit, fuite + uin (K yE~ // juin + _s) u (rfX Y + _bl) u (ff Y + _s) u (rfeX Y + uy (A yij + + C) ucci utSi // capuccino + c) ueill Yj // cueillir + c) ueil (_ Yj // recueil + _g) ua wa + ag) ua (X wa + Ctig) ua (_ wa + _c) ul (_ y + _) ultra (P5 yltra + g) u (ay u + g) ueill Yj // orgueilleux + haïk) u (X u + + C) u (bX Y // hub, club + C) u (gX Y // bug, mug + _n) u (rse Y // 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~ + un (C W~ // emprunt lundi + un (n y // tunnel + CC) un (_ W~ // brun + uc) un (_ W~n2 // aucun + un (_ W~n2 // un avion + _h) un (_ W~ // hun + + fl) ux (_ y // flux, reflux + g) u (A // fatigue + g) u (ï y // ambiguïté + g) u (ë y // ambiguë + uz (z Y + +// group u: English section + _b) usi _^_en // business, businessman + C) ui (ce _^_en // produice, juice + umber (_ _^_en + ump (_ _^_en + unch _^_en + under _^_en // under, understand, thunder + _C) un (_ _^_en + _C) un (ny _^_en + _) up (C _^_en // upper, update + up (_ _^_en // setup + urn (X _^_en // burn, turn + ust (_ _^_en // just, trust + + +.group ü + ü y + üs (_ ys + üm (_ om + ül (_ yll + + +.group v + v v + vers (_ vErz2 + dri) ver (X vYr + view (X vju + _) view (A vjuv + +// group v: English section + voice (X _^_en + void (_ _^_en + vy (_ _^_en + + +.group w + w w + _) w (A _|w + w (ag v // wagon + wa (ve_ wE:j // wave + wa (re_ wE: // hardware software + +// group w: English section + e) w (K _^_en + _) wan _^_en + wr _^_en // write + way _^_en // way, away + _) wir _^_en // wire + winn _^_en // winner + wise _^_en + with _^_en + wor _^_en + + +.group x + x ks + xx ks + _) x (A gz // xylophone + _) x (CP1 iks // xylophone + xml (_S3 _|iksEmEl + e) x (A gz // exagérer exemple + L03e) x (A ks // annexe, vexer + _ine) x (A gz + _e) x (h gz // exhumer + + ai) x (_ // voix paix prix + oi) x (_ + ri) x (_ + + _soi) x (A s // soixante + + Au) x (_ z2 // faux feux choux + + _au) x (quel // auxquels + + _di) x (_neuf z // liaison: dix-neuf + _di) x (_ z3 + _si) x (_neu s // liaison: six-neuf + _si) x (_ z3 + + di) x (iè z // dixième + si) x (iè z // sixième + deu) x (iè z // deuxième + + +.group y + y i // cryogénique myope + _) y (A _|j // yak + _) y (eu j // yeux + _) yacht _^_en // yacht, yachtman + + _) yahoo (P5 ja'u + ym (K E~ // tympan + y (nn i + y (nA i + X) ys (_ is + yx (_ iks + + yn E~ // laryngite + + +.group z + z z + t) z s // tzigane + t) zer (_ zEr + C) zer (_ zWr + + +.group +// accented characters, these could have their own groups if they need more rules + â a: + ñ n^ + + é e // été + ê E // fête + + ö o // angström + û y: // fûtes + ü y // bülcher + + +// symbols that are normally spoken when reading text + , (D pilk:u + $ dolar + ° d@gre + _n_) ° // n° + + + + + + + + + diff --git a/dictsource/pt_rules b/dictsource/pt_rules index 742387dd..cdb2f7a3 100644 --- a/dictsource/pt_rules +++ b/dictsource/pt_rules @@ -746,9 +746,7 @@ r) u (_A u u (A_ 'u - ui 'uI - ui (_ uI - ui (s 'uI + ui uI u (iu w u (iCK u uy uI diff --git a/dictsource/ta_rules b/dictsource/ta_rules index 0c1e49d6..b0ddd3fc 100644 --- a/dictsource/ta_rules +++ b/dictsource/ta_rules @@ -393,7 +393,7 @@ _) ட (வல t.V _) ட (வர t.V _) ட (ேப t. - _) ட (ாக்ஸி t. + _) டாக (்ஸி t.a:k .group ண ண n.V @@ -597,6 +597,7 @@ _) த (ொம் d _) த (ோசை d _) த (ோஷ d + _) த (ுபாய d //endsort //sort @@ -671,6 +672,7 @@ _பார்வ) த (ி t ச) த (்ரு t த) த (்ரூப t பா) த (்ரூம t + _ப) த (ஞ்சலி tV //endsort @@ -989,13 +991,11 @@ _முகத்தின்_) ப (ாவ b சிறு) ப (ிள்ளை p ஆண்) ப (ிள்ளை p பெண்) ப (ிள்ளை p - பூம்) ப (ுகார p ம்) ப (ுரா b இன்) ப (ுற b _துன்) ப (ுற b ப (ுறK p மண்) ப (ுழு p - பூம்) ப (ுஹார p ம்) ப (ூர b ராம்) ப (ூர p அ) ப (ூர்வ b diff --git a/phsource/b/br b/phsource/b/br new file mode 100755 index 00000000..2a1b9981 Binary files /dev/null and b/phsource/b/br differ diff --git a/phsource/b/xbr b/phsource/b/xbr new file mode 100644 index 00000000..558a8779 Binary files /dev/null and b/phsource/b/xbr differ diff --git a/phsource/compile_report b/phsource/compile_report index 18280327..71bfc9d3 100644 --- a/phsource/compile_report +++ b/phsource/compile_report @@ -53,7 +53,7 @@ consonants 9 115 id 15 125 sq 33 126 hy 23 117 - da 23 119 + da 24 120 rw 15 130 ml 13 150 ne 18 156 @@ -82,6 +82,7 @@ b/bu [b] base b/xb [b] base [b] fr [bh] hi +b/xbr [b] fr d/d [d] base [d[] base [d] base2 @@ -139,6 +140,7 @@ d/xd [d] base [d] sq d/xd3 [dh] hi d/xd_pzd [d;] pl +d/xdr [d] fr d/xdz [dz] consonants d/x_tap [t#] en [*] pt @@ -220,6 +222,7 @@ g/xg [g] base [g] cy [g] fr [g] es +g/xgr [g] fr h/h_ [h] base [h] fi [] la @@ -338,7 +341,7 @@ l/l_ [l/] base l/l_@ [l/3] base [l/] fr l/l@ [l#] base - [ߵ ] base + [߸ ] base [l] fr [l/2] fr l/L1_aL [l/] base @@ -364,13 +367,13 @@ l/L2_uL [l/2] base l/l_3 [l/] de l/l_4 [ll] sq l/la [l#] base - [ߵ ] base + [߸ ] base [l] fr [l/2] fr l/l_a [l/3] base [l/] fr l/le [l#] base - [ߵ ] base + [߸ ] base [l] fr [l/2] fr l/l_e [l/3] base @@ -380,7 +383,7 @@ l/L_eL_af [&] af l/l_front [L] sq l/l_front_ [l/4] sq l/li [l#] base - [ߵ ] base + [߸ ] base [l] fr [l/2] fr [l] zh @@ -392,14 +395,14 @@ ll/_ll [L] bg l/l_long [l] base [l] fr l/lo [l#] base - [ߵ ] base + [߸ ] base [l] fr [l/2] fr l/l_o [l/3] base [l/] fr l^/l_rfx [l.] base l/lu [l#] base - [ߵ ] base + [߸ ] base [l] fr [l/2] fr l/l_u [l/3] base @@ -617,8 +620,8 @@ ufric/f [f] base ufric/f_ [f] base [f] fr [f] pl -ufric/l# [l#] is -ufric/ll [l#] base +ufric/l# [l#] base + [l#] is ufric/s [s] base [s] fr [z2] fr @@ -923,6 +926,7 @@ vdiph/ai [aI] base2 [a:I] vi [aI] id [aI] hy + [aI] da vdiph/ai_2 [aI] en [aI] cy [aY] cy @@ -1939,51 +1943,51 @@ vwl_en_us/oor [0] en-us vwl_en_us/or [o@] en-us [O:] en-sc vwl_en_us/ur [U@] en-us -vwl_fr/@2r [ߵ ] fr -vwl_fr/a2r [ߵ ] fr -vwl_fr/aa2r [ߵ ] fr +vwl_fr/@2r [߸ ] fr +vwl_fr/a2r [߸ ] fr +vwl_fr/aa2r [߸ ] fr vwl_fr/br [r/2] fr -vwl_fr/e2r [ߵ ] fr -vwl_fr/e_2r [ߵ ] fr -vwl_fr/ee2r [ߵ ] fr -vwl_fr/i2r [ߵ ] fr +vwl_fr/e2r [߸ ] fr +vwl_fr/e_2r [߸ ] fr +vwl_fr/ee2r [߸ ] fr +vwl_fr/i2r [߸ ] fr vwl_fr/j [j/] fr -vwl_fr/o2r [ߵ ] fr -vwl_fr/oo2r [ߵ ] fr +vwl_fr/o2r [߸ ] fr +vwl_fr/oo2r [߸ ] fr vwl_fr/r [r] fr [r/2] fr vwl_fr/r_ [r/] fr vwl_fr/r_@ [r/] fr -vwl_fr/r@ [ߵ ] fr +vwl_fr/r@ [߸ ] fr vwl_fr/@R [x] pt-pt -vwl_fr/r@2 [ߵ ] fr +vwl_fr/r@2 [߸ ] fr vwl_fr/@R2 [R] fr-ca -vwl_fr/ra [ߵ ] fr +vwl_fr/ra [߸ ] fr vwl_fr/r_a [r/] fr -vwl_fr/raa [ߵ ] fr -vwl_fr/re [ߵ ] fr +vwl_fr/raa [߸ ] fr +vwl_fr/re [߸ ] fr vwl_fr/r_e [r/] fr -vwl_fr/re2 [ߵ ] fr -vwl_fr/ree [ߵ ] fr -vwl_fr/ri [ߵ ] fr +vwl_fr/re2 [߸ ] fr +vwl_fr/ree [߸ ] fr +vwl_fr/ri [߸ ] fr vwl_fr/r_i [r/] fr -vwl_fr/rj [ߵ ] fr +vwl_fr/rj [߸ ] fr vwl_fr/r_n [r/] fr -vwl_fr/ro [ߵ ] fr +vwl_fr/ro [߸ ] fr vwl_fr/r_o [r/] fr -vwl_fr/roo [ߵ ] fr +vwl_fr/roo [߸ ] fr vwl_fr/rr [r/] fr -vwl_fr/ru [ߵ ] fr +vwl_fr/ru [߸ ] fr vwl_fr/r_u [r/] fr -vwl_fr/rw [ߵ ] fr -vwl_fr/ry [ߵ ] fr +vwl_fr/rw [߸ ] fr +vwl_fr/ry [߸ ] fr vwl_fr/r_y [r/] fr vwl_fr/tr [r/2] fr vwl_fr/trr [r/] fr -vwl_fr/u2r [ߵ ] fr +vwl_fr/u2r [߸ ] fr vwl_fr/wa [w] fr [w/] fr -vwl_fr/y2r [ߵ ] fr +vwl_fr/y2r [߸ ] fr vwl_hi/l-voc [l-] base [l-] sk [l:] sk diff --git a/phsource/d/xdr b/phsource/d/xdr new file mode 100644 index 00000000..87715dbf Binary files /dev/null and b/phsource/d/xdr differ diff --git a/phsource/envelope/i_risefall b/phsource/envelope/i_risefall new file mode 100644 index 00000000..f8a7771d --- /dev/null +++ b/phsource/envelope/i_risefall @@ -0,0 +1,11 @@ +ENVELOPE +0 60 +5 63 +22 92 +31 100 +41 95 +85 12 +90 5 +100 0 + + diff --git a/phsource/envelope/i_risefall2 b/phsource/envelope/i_risefall2 new file mode 100644 index 00000000..159d53ad --- /dev/null +++ b/phsource/envelope/i_risefall2 @@ -0,0 +1,6 @@ +ENVELOPE +0 0 +45 95 +100 0 + + diff --git a/phsource/g/gr b/phsource/g/gr new file mode 100755 index 00000000..3222a127 Binary files /dev/null and b/phsource/g/gr differ diff --git a/phsource/g/xgr b/phsource/g/xgr new file mode 100644 index 00000000..1d6ab49b Binary files /dev/null and b/phsource/g/xgr differ diff --git a/phsource/intonation b/phsource/intonation new file mode 100644 index 00000000..0a6b7e73 --- /dev/null +++ b/phsource/intonation @@ -0,0 +1,124 @@ +tune s1 +prehead 46 57 +headenv fall 16 +head 4 80 50 -8 -5 +headextend 0 63 38 13 0 +nucleus0 fall 64 8 +nucleus fall 70 18 24 12 +endtune + +tune c1 +prehead 46 57 +headenv fall 16 +head 4 80 46 -8 -5 +headextend 0 63 38 13 0 +nucleus0 fall-rise 80 18 +nucleus fall-rise2 78 22 34 52 +endtune + +tune q1 +prehead 46 57 +headenv fall 16 +head 4 75 43 -7 0 +headextend 25 63 38 13 0 +nucleus0 fall-rise 88 22 +nucleus fall-rise2 82 22 34 66 +endtune + +tune e1 +prehead 46 57 +headenv fall 16 +head 3 90 50 -9 0 +headextend 16 82 50 32 16 +nucleus0 fall 92 8 +nucleus fall 92 80 76 8 +endtune + + +// PB Tunes for the Danish intonation +// full-stop "." - punktum +tune s2 +prehead 46 57 +headenv fall 16 +head 4 65 60 -8 -5 +headextend 0 53 38 13 0 +nucleus0 fall 44 28 +nucleus fall 50 42 34 28 // sidste ord før punktu + +onset 75 -5 -5 +endtune + +// comma "," - komma +tune c2 +prehead 46 57 +headenv fall 16 +head 4 65 50 -8 -5 +headextend 0 63 38 13 0 +nucleus0 rise 60 42 +nucleus rise 55 42 34 52 // sidste tal: slutniveau +endtune + +// question mark "?" - spørgsmålste + +tune q2 +prehead 40 75 +headenv fall 16 +head 4 75 43 -7 0 //head 4 35 43 -7 0 +headextend 25 63 38 13 0 +nucleus0 rise 70 50 // første tal: slutniveaue + +nucleus rise 35 45 60 70 // sidste tal: slutniveau +endtune + +// exclamation mark "!" - udråbsteg + +tune e2 +prehead 46 57 +headenv fall 16 +head 3 90 50 -9 0 +headextend 16 82 50 32 16 +nucleus0 fall 92 8 +nucleus fall 92 80 76 8 +endtune + + + +// Tunes for the French intonation +// full-stop "." - point +tune s3 +prehead 46 57 +headenv fall 16 +head 4 80 50 -8 -5 +headextend 0 63 38 13 0 +nucleus0 fall 64 8 +nucleus fall 70 18 24 12 +endtune + +// comma "," - virgule +tune c3 +prehead 46 57 +headenv fall 16 +head 4 80 30 -5 -15 +headextend 25 63 38 13 0 +nucleus0 fall-rise 75 40 +endtune + +// question mark "?" - point d'interrogation +tune q3 +prehead 46 57 +headenv fall 16 +head 4 75 43 -7 0 +headextend 25 63 38 13 0 +nucleus0 fall-rise 88 22 +nucleus fall-rise2 82 22 34 66 +endtune + +// exclamation mark "!" - point d'exclamation +tune e3 +prehead 46 57 +headenv fall 16 +head 3 90 50 -9 0 +headextend 16 82 50 32 16 +nucleus0 fall 92 8 +nucleus fall 92 80 76 8 +endtune diff --git a/phsource/klatt/b b/phsource/klatt/b new file mode 100644 index 00000000..1c07382e Binary files /dev/null and b/phsource/klatt/b differ diff --git a/phsource/klatt/bh b/phsource/klatt/bh new file mode 100644 index 00000000..a2f93d9a Binary files /dev/null and b/phsource/klatt/bh differ diff --git a/phsource/klatt/dz_pzd b/phsource/klatt/dz_pzd new file mode 100644 index 00000000..7d4ae9b9 Binary files /dev/null and b/phsource/klatt/dz_pzd differ diff --git a/phsource/klatt/dz_pzd_ b/phsource/klatt/dz_pzd_ new file mode 100644 index 00000000..107fd829 Binary files /dev/null and b/phsource/klatt/dz_pzd_ differ diff --git a/phsource/klatt/m b/phsource/klatt/m new file mode 100644 index 00000000..043eb7c4 Binary files /dev/null and b/phsource/klatt/m differ diff --git a/phsource/klatt/m-syl b/phsource/klatt/m-syl new file mode 100644 index 00000000..93c59a27 Binary files /dev/null and b/phsource/klatt/m-syl differ diff --git a/phsource/klatt/m_ b/phsource/klatt/m_ new file mode 100644 index 00000000..f65b8d96 Binary files /dev/null and b/phsource/klatt/m_ differ diff --git a/phsource/klatt/n b/phsource/klatt/n new file mode 100644 index 00000000..e75f2d47 Binary files /dev/null and b/phsource/klatt/n differ diff --git a/phsource/klatt/n-syl b/phsource/klatt/n-syl new file mode 100644 index 00000000..6ed0778c Binary files /dev/null and b/phsource/klatt/n-syl differ diff --git a/phsource/klatt/n^ b/phsource/klatt/n^ new file mode 100644 index 00000000..42c95625 Binary files /dev/null and b/phsource/klatt/n^ differ diff --git a/phsource/klatt/n^@ b/phsource/klatt/n^@ new file mode 100644 index 00000000..d5ca4432 Binary files /dev/null and b/phsource/klatt/n^@ differ diff --git a/phsource/klatt/nn b/phsource/klatt/nn new file mode 100644 index 00000000..9ca180ff Binary files /dev/null and b/phsource/klatt/nn differ diff --git a/phsource/klatt/nr b/phsource/klatt/nr new file mode 100644 index 00000000..50fb6054 Binary files /dev/null and b/phsource/klatt/nr differ diff --git a/phsource/klatt/qq b/phsource/klatt/qq new file mode 100644 index 00000000..f85b29da Binary files /dev/null and b/phsource/klatt/qq differ diff --git a/phsource/klatt/qqh b/phsource/klatt/qqh new file mode 100644 index 00000000..ed4cf1fb Binary files /dev/null and b/phsource/klatt/qqh differ diff --git a/phsource/klatt/qqh_ b/phsource/klatt/qqh_ new file mode 100644 index 00000000..5a0bf819 Binary files /dev/null and b/phsource/klatt/qqh_ differ diff --git a/phsource/klatt/tap2 b/phsource/klatt/tap2 new file mode 100644 index 00000000..dd5ae1c9 Binary files /dev/null and b/phsource/klatt/tap2 differ diff --git a/phsource/klatt/v b/phsource/klatt/v new file mode 100644 index 00000000..41900804 Binary files /dev/null and b/phsource/klatt/v differ diff --git a/phsource/klatt/v_ b/phsource/klatt/v_ new file mode 100644 index 00000000..fe8b309e Binary files /dev/null and b/phsource/klatt/v_ differ diff --git a/phsource/klatt/x_tap b/phsource/klatt/x_tap new file mode 100644 index 00000000..b2e00e64 Binary files /dev/null and b/phsource/klatt/x_tap differ diff --git a/phsource/klatt/zh b/phsource/klatt/zh new file mode 100644 index 00000000..bb19e53d Binary files /dev/null and b/phsource/klatt/zh differ diff --git a/phsource/klatt/zh_ b/phsource/klatt/zh_ new file mode 100644 index 00000000..a022a562 Binary files /dev/null and b/phsource/klatt/zh_ differ diff --git a/phsource/l/L2_oL b/phsource/l/L2_oL index 583e4133..1f66489e 100644 Binary files a/phsource/l/L2_oL and b/phsource/l/L2_oL differ diff --git a/phsource/l/l_front b/phsource/l/l_front new file mode 100644 index 00000000..e2bd8a60 Binary files /dev/null and b/phsource/l/l_front differ diff --git a/phsource/l/l_front_ b/phsource/l/l_front_ new file mode 100644 index 00000000..ee5a14c8 Binary files /dev/null and b/phsource/l/l_front_ differ diff --git a/phsource/ph_danish b/phsource/ph_danish index 3c2796c1..7f7e54d3 100644 --- a/phsource/ph_danish +++ b/phsource/ph_danish @@ -114,6 +114,13 @@ phoneme W# FMT(vowel/V) endphoneme +phoneme aI + vowel starttype #a endtype #i + length 250 + FMT(vdiph/ai) +endphoneme + + // CONSONANTS // PB added l/3 diff --git a/phsource/ph_english b/phsource/ph_english index 79b02eb5..03fd06e3 100644 --- a/phsource/ph_english +++ b/phsource/ph_english @@ -383,7 +383,7 @@ endphoneme phoneme aI@ vowel starttype #a endtype #@ - length 270 + length 280 IfNextVowelAppend(r-) FMT(vwl_en/aI@) endphoneme @@ -391,7 +391,7 @@ endphoneme phoneme aU@ vowel starttype #a endtype #@ - length 270 + length 280 IfNextVowelAppend(r-) FMT(vwl_en/aU@) endphoneme diff --git a/phsource/ph_english_n b/phsource/ph_english_n index b5c495f4..6bd8c21c 100644 --- a/phsource/ph_english_n +++ b/phsource/ph_english_n @@ -239,7 +239,7 @@ endphoneme phoneme aI@ vowel starttype #a endtype #@ - length 270 + length 280 IfNextVowelAppend(r-) FMT(vwl_en/aI@) endphoneme @@ -247,7 +247,7 @@ endphoneme phoneme aU@ vowel starttype #a endtype #@ - length 270 + length 280 IfNextVowelAppend(r-) FMT(vwl_en/aU@) endphoneme diff --git a/phsource/ph_english_wm b/phsource/ph_english_wm index 64c8d4f2..68bfd4a0 100644 --- a/phsource/ph_english_wm +++ b/phsource/ph_english_wm @@ -222,7 +222,7 @@ endphoneme phoneme aI@ vowel starttype #a endtype #@ - length 270 + length 280 IfNextVowelAppend(r-) FMT(vwl_en/ooi@) endphoneme @@ -230,7 +230,7 @@ endphoneme phoneme aU@ vowel starttype #a endtype #@ - length 270 + length 280 IfNextVowelAppend(r-) FMT(vwl_en/aU@) endphoneme diff --git a/phsource/ph_french b/phsource/ph_french index 72de3c7b..83088f52 100644 --- a/phsource/ph_french +++ b/phsource/ph_french @@ -1,7 +1,7 @@ //==================================================== // French //==================================================== -// Updated 2010-06-12 Michel Such +// Updated 2010-06-16 Michel Such phoneme #l virtual // Used for l and l/ @@ -80,8 +80,7 @@ phoneme r vcd uvl frc nopause rhotic starttype #r endtype #r - Vowelin f1=1 f2=1600 -500 500 f3=-200 100 len=65 - Vowelout f1=1 f2=1200 -400 800 f3=200 100 len=60 + Vowelin f1=0 f2=1500 -400 400 f3=-400 80 lengthmod 7 IF nextPh(isNotVowel) THEN @@ -148,7 +147,7 @@ endphoneme phoneme r/2 liquid rhotic uvl nopause starttype #r endtype #r - Vowelin f1=1 f2=1600 -500 500 f3=-200 100 len=65 amp=8 + Vowelin f1=0 f2=1500 -400 400 f3=-400 80 CALL post_r IF prevPhW(f) OR prevPhW(k) OR prevPhW(p) OR prevPhW(s) OR prevPhW(t) OR prevPhW(S) THEN @@ -163,7 +162,7 @@ endphoneme phoneme l - liquid nopause + liquid starttype #l endtype #l lengthmod 7 @@ -639,7 +638,11 @@ phoneme b ENDIF IF PreVoicing THEN - FMT(b/xb) + IF nextPhW(#r) THEN + FMT(b/xbr) + ELSE + FMT(b/xb) + ENDIF ENDIF IF nextPh(isPause2) OR nextPh(l) THEN @@ -663,7 +666,11 @@ phoneme d Vowelout f1=2 f2=1700 -300 300 f3=-100 80 IF PreVoicing THEN - FMT(d/xd) + IF nextPhW(#r) THEN + FMT(d/xdr) + ELSE + FMT(d/xd) + ENDIF ENDIF IF nextPh(isPause2) THEN @@ -699,7 +706,11 @@ phoneme g Vowelout f1=1 f2=2300 250 300 f3=-300 80 brk IF PreVoicing THEN - FMT(g/xg) + IF nextPhW(#r) THEN + FMT(g/xgr) + ELSE + FMT(g/xg) + ENDIF ENDIF IF nextPh(isPause2) THEN diff --git a/phsource/ph_nahuatl b/phsource/ph_nahuatl new file mode 100644 index 00000000..cb78c70a --- /dev/null +++ b/phsource/ph_nahuatl @@ -0,0 +1,16 @@ + +//==================================================== +// Nahuatl (classical) +//==================================================== + +phoneme : // lengthens the previous vowel by 'length' + virtual + length 300 +endphoneme + +phoneme e + vowel starttype #e endtype #e + length 170 + FMT(vowel/e_mid2) +endphoneme + diff --git a/phsource/ph_tamil b/phsource/ph_tamil index 67e85187..fc527e51 100644 --- a/phsource/ph_tamil +++ b/phsource/ph_tamil @@ -80,7 +80,10 @@ endphoneme phoneme u vowel starttype #u endtype #u length 110 - ChangeIfNotStressed(U) + IF prevPhW(isVel) THEN + ELSE + ChangeIfNotStressed(U) + ENDIF FMT(vowel/u_6) endphoneme diff --git a/phsource/phonemes b/phsource/phonemes index 47d17e42..4b282afa 100644 --- a/phsource/phonemes +++ b/phsource/phonemes @@ -1487,7 +1487,7 @@ phoneme l# // Lateral fricative (eg. Welsh "ll") VowelEnding(l/xl, -40) ENDIF - WAV(ufric/ll, 60) + WAV(ufric/l#, 60) endphoneme @@ -1720,6 +1720,12 @@ phonemetable da base include ph_danish + + +// The following lines are experimental, for future additions. +// These langauges are not in a usable state. +// These lines can be deleted. + phonemetable rw base2 include ph_kinyarwanda @@ -1738,7 +1744,6 @@ include ph_nepali //phonemetable mr hi //include ph_marathi - //phonemetable eu base2 //include ph_basque diff --git a/phsource/r/@_ b/phsource/r/@_ new file mode 100644 index 00000000..a9d5c9f1 Binary files /dev/null and b/phsource/r/@_ differ diff --git a/phsource/r/V_ b/phsource/r/V_ new file mode 100644 index 00000000..349d2b78 Binary files /dev/null and b/phsource/r/V_ differ diff --git a/phsource/r/V_2_ b/phsource/r/V_2_ new file mode 100644 index 00000000..2f189216 Binary files /dev/null and b/phsource/r/V_2_ differ diff --git a/phsource/r/aa b/phsource/r/aa new file mode 100644 index 00000000..b183fbfa Binary files /dev/null and b/phsource/r/aa differ diff --git a/phsource/r3/r_ru.wav b/phsource/r3/r_ru.wav new file mode 100644 index 00000000..62879a02 Binary files /dev/null and b/phsource/r3/r_ru.wav differ diff --git a/phsource/r3/r_ru2 b/phsource/r3/r_ru2 new file mode 100644 index 00000000..69c5c1d8 Binary files /dev/null and b/phsource/r3/r_ru2 differ diff --git a/phsource/ufric/l#.wav b/phsource/ufric/l#.wav index ceb588f3..f4884e8f 100644 Binary files a/phsource/ufric/l#.wav and b/phsource/ufric/l#.wav differ diff --git a/phsource/ustop/t_short_.wav b/phsource/ustop/t_short_.wav new file mode 100644 index 00000000..c00831e6 Binary files /dev/null and b/phsource/ustop/t_short_.wav differ diff --git a/phsource/vdiph/aau_6 b/phsource/vdiph/aau_6 new file mode 100644 index 00000000..899d3cc3 Binary files /dev/null and b/phsource/vdiph/aau_6 differ diff --git a/phsource/vwl_de/uu_@ b/phsource/vwl_de/uu_@ new file mode 100644 index 00000000..221ccb3f Binary files /dev/null and b/phsource/vwl_de/uu_@ differ diff --git a/phsource/vwl_en_us/aU@ b/phsource/vwl_en_us/aU@ new file mode 100644 index 00000000..63ee0e09 Binary files /dev/null and b/phsource/vwl_en_us/aU@ differ diff --git a/phsource/vwl_fr/br b/phsource/vwl_fr/br index 8c79113d..4e22dced 100644 Binary files a/phsource/vwl_fr/br and b/phsource/vwl_fr/br differ diff --git a/phsource/vwl_fr/e_2r b/phsource/vwl_fr/e_2r new file mode 100755 index 00000000..e58e63b7 Binary files /dev/null and b/phsource/vwl_fr/e_2r differ diff --git a/phsource/vwl_fr/r b/phsource/vwl_fr/r index 3e6e6ae4..78e9d068 100644 Binary files a/phsource/vwl_fr/r and b/phsource/vwl_fr/r differ diff --git a/phsource/vwl_ru/ii- b/phsource/vwl_ru/ii- new file mode 100644 index 00000000..42f2be53 Binary files /dev/null and b/phsource/vwl_ru/ii- differ diff --git a/src/Makefile b/src/Makefile index dfaaa6f9..d760954f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -49,12 +49,12 @@ endif speak_SOURCES = speak.cpp compiledict.cpp dictionary.cpp intonation.cpp \ readclause.cpp setlengths.cpp numbers.cpp synth_mbrola.cpp \ - synthdata.cpp synthesize.cpp translate.cpp \ + synthdata.cpp synthesize.cpp translate.cpp mbrowrap.cpp \ tr_languages.cpp voices.cpp wavegen.cpp phonemelist.cpp klatt.cpp libespeak_SOURCES = speak_lib.cpp compiledict.cpp dictionary.cpp intonation.cpp \ readclause.cpp setlengths.cpp numbers.cpp synth_mbrola.cpp \ - synthdata.cpp synthesize.cpp translate.cpp \ + synthdata.cpp synthesize.cpp translate.cpp mbrowrap.cpp \ tr_languages.cpp voices.cpp wavegen.cpp phonemelist.cpp \ espeak_command.cpp event.cpp fifo.cpp $(WAVE) debug.cpp klatt.cpp diff --git a/src/Makefile.espeakedit b/src/Makefile.espeakedit index 926c265f..861676bd 100644 --- a/src/Makefile.espeakedit +++ b/src/Makefile.espeakedit @@ -1,20 +1,27 @@ -SRCS=\ - compiledata.cpp compiledict.cpp debug.cpp dictionary.cpp espeak_command.cpp espeakedit.cpp \ - event.cpp extras.cpp fifo.cpp formantdlg.cpp intonation.cpp klatt.cpp menus.cpp numbers.cpp \ - options.cpp phonemelist.cpp prosodydisplay.cpp readclause.cpp setlengths.cpp speak_lib.cpp \ - spect.cpp spectdisplay.cpp spectseq.cpp synthdata.cpp synthesize.cpp synth_mbrola.cpp \ - translate.cpp transldlg.cpp tr_languages.cpp voicedlg.cpp voices.cpp vowelchart.cpp wave.cpp \ - wavegen.cpp +# Makefile for 'espeakedit' program + +SRCS= compiledata.cpp compiledict.cpp debug.cpp dictionary.cpp espeak_command.cpp \ + espeakedit.cpp event.cpp extras.cpp fifo.cpp formantdlg.cpp intonation.cpp \ + klatt.cpp mbrowrap.cpp menus.cpp numbers.cpp options.cpp phonemelist.cpp \ + prosodydisplay.cpp readclause.cpp setlengths.cpp speak_lib.cpp spect.cpp \ + spectdisplay.cpp spectseq.cpp synthdata.cpp synthesize.cpp synth_mbrola.cpp \ + translate.cpp transldlg.cpp tr_languages.cpp voicedlg.cpp voices.cpp vowelchart.cpp \ + wave.cpp wavegen.cpp OBJS=$(patsubst %.cpp,%.o,$(SRCS)) -WX_LIBS = -pthread -lwx_gtk2u_xrc-2.6 -lwx_gtk2u_qa-2.6 -lwx_gtk2u_html-2.6 -lwx_gtk2u_adv-2.6 -lwx_gtk2u_core-2.6 -lwx_baseu_xml-2.6 -lwx_baseu_net-2.6 -lwx_baseu-2.6 +WX_LIBS = -pthread -lwx_gtk2u_xrc-2.6 -lwx_gtk2u_qa-2.6 -lwx_gtk2u_html-2.6 \ + -lwx_gtk2u_adv-2.6 -lwx_gtk2u_core-2.6 -lwx_baseu_xml-2.6 -lwx_baseu_net-2.6 -lwx_baseu-2.6 LIBS=-lstdc++ -lportaudio -CPPFLAGS = -Wall -g -fexceptions -I/usr/lib/wx/include/gtk2-unicode-release-2.6 -I/usr/include/wx-2.6 -DGTK_NO_CHECK_CASTS -D__WXGTK__ -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -D_LARGEFILE_SOURCE=1 -DNO_GCC_PRAGMA -D_ESPEAKEDIT +CPPFLAGS = -Wall -g -fexceptions -I/usr/lib/wx/include/gtk2-unicode-release-2.6 + -I/usr/include/wx-2.6 \ + -DGTK_NO_CHECK_CASTS -D__WXGTK__ -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES + -D_LARGEFILE_SOURCE=1 -DNO_GCC_PRAGMA -D_ESPEAKEDIT -CXXFLAGS = -O2 -g0 -Wall -g -fexceptions -I/usr/lib/wx/include/gtk2-unicode-release-2.6 -I/usr/include/wx-2.6 -DGTK_NO_CHECK_CASTS -D__WXGTK__ -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -D_LARGEFILE_SOURCE=1 -DNO_GCC_PRAGMA -D_ESPEAKEDIT +CXXFLAGS = -O2 -g0 -Wall -g -fexceptions -I/usr/lib/wx/include/gtk2-unicode-release-2.6 -I/usr/include/wx-2.6 \ + -DGTK_NO_CHECK_CASTS -D__WXGTK__ -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -D_LARGEFILE_SOURCE=1 -DNO_GCC_PRAGMA -D_ESPEAKEDIT all: espeakedit diff --git a/src/compiledata.cpp b/src/compiledata.cpp index d05bff6b..09d462c2 100644 --- a/src/compiledata.cpp +++ b/src/compiledata.cpp @@ -1744,12 +1744,12 @@ static int LoadWavefile(FILE *f, const char *fname) sr2 = Read4Bytes(f); fseek(f,40,SEEK_SET); - if((sr1 != samplerate) || (sr2 != sr1*2)) + if((sr1 != samplerate_native) || (sr2 != sr1*2)) { #ifdef PLATFORM_WINDOWS - if(sr1 != samplerate) + if(sr1 != samplerate_native) { - fprintf(f_errors,"Wrong samplerate %d, wants %d\n",sr1,samplerate); + fprintf(f_errors,"Wrong samplerate %d, wants %d\n",sr1,samplerate_native); error("Wrong samplerate: %s",fname); } if(sr2 != sr1*2) @@ -1764,7 +1764,7 @@ static int LoadWavefile(FILE *f, const char *fname) if((fd_temp = mkstemp(fname_temp)) >= 0) { close(fd_temp); - sprintf(command,"sox \"%s%s.wav\" -r %d -c 1 -w %s polyphase\n",path_source,fname,samplerate,fname_temp); + sprintf(command,"sox \"%s%s.wav\" -r %d -c 1 -w %s polyphase\n",path_source,fname,samplerate_native,fname_temp); if(system(command) < 0) { error("Failed to resample: %s",command); diff --git a/src/espeak.cpp b/src/espeak.cpp index 205a25d5..37e601a3 100644 --- a/src/espeak.cpp +++ b/src/espeak.cpp @@ -66,8 +66,10 @@ static const char *help_text = "\t directory. specifies the language\n" "--path=\"\"\n" "\t Specifies the directory containing the espeak-data directory\n" +"--pho\n" +"\t Write mbrola phoneme data (.pho) to stdout, or to the file in --phonout\n" "--phonout=\"\"\n" -"\t Write output from -x -X commands, and mbrola phoneme data, to this file\n" +"\t Write phoneme output from -x -X and --pho to this file\n" "--punct=\"\"\n" "\t Speak the names of punctuation characters during speaking. If\n" "\t = is omitted, all punctuation is spoken.\n" @@ -87,6 +89,7 @@ int samplerate; int quiet = 0; unsigned int samples_total = 0; unsigned int samples_split = 0; +unsigned int samples_split_seconds = 0; unsigned int wavefile_count = 0; FILE *f_wavfile = NULL; @@ -218,15 +221,18 @@ int OpenWavFile(char *path, int rate) else f_wavfile = fopen(path,"wb"); - if(f_wavfile != NULL) + if(f_wavfile == NULL) { - fwrite(wave_hdr,1,24,f_wavfile); - Write4Bytes(f_wavfile,rate); - Write4Bytes(f_wavfile,rate * 2); - fwrite(&wave_hdr[32],1,12,f_wavfile); - return(0); + fprintf(stderr,"Can't write to: '%s'\n",path); + return(1); } - return(1); + + + fwrite(wave_hdr,1,24,f_wavfile); + Write4Bytes(f_wavfile,rate); + Write4Bytes(f_wavfile,rate * 2); + fwrite(&wave_hdr[32],1,12,f_wavfile); + return(0); } // end of OpenWavFile @@ -266,25 +272,40 @@ static int SynthCallback(short *wav, int numsamples, espeak_EVENT *events) return(0); } - if(samples_split > 0) + while(events->type != 0) { - // start a new WAV file when this limit is reached, at the next sentence boundary - while(events->type != 0) + if(events->type == espeakEVENT_SAMPLERATE) { - if((events->type == espeakEVENT_SENTENCE) && (samples_total > samples_split)) + samplerate = events->id.number; + samples_split = samples_split_seconds * samplerate; + } + else + if(events->type == espeakEVENT_SENTENCE) + { + // start a new WAV file when the limit is reached, at this sentence boundary + if((samples_split > 0) && (samples_total > samples_split)) { CloseWavFile(); samples_total = 0; + wavefile_count++; } - events++; } + events++; } if(f_wavfile == NULL) { - sprintf(fname,"%s_%.2d%s",wavefile,++wavefile_count,filetype); - if(OpenWavFile(fname, samplerate) != 0) - return(1); + if(samples_split > 0) + { + sprintf(fname,"%s_%.2d%s",wavefile,wavefile_count+1,filetype); + if(OpenWavFile(fname, samplerate) != 0) + return(1); + } + else + { + if(OpenWavFile(wavefile, samplerate) != 0) + return(1); + } } if(numsamples > 0) @@ -332,7 +353,8 @@ int main (int argc, char **argv) {"stdout", no_argument, 0, 0x105}, {"split", optional_argument, 0, 0x106}, {"path", required_argument, 0, 0x107}, - {"phonout", required_argument, 0, 0x108}, + {"phonout", required_argument, 0, 0x108}, + {"pho", no_argument, 0, 0x109}, {0, 0, 0, 0} }; @@ -360,7 +382,8 @@ int main (int argc, char **argv) int wordgap = -1; int option_capitals = -1; int option_punctuation = -1; - int option_phonemes = -1; + int option_phonemes = 0; + int option_mbrola_phonemes = 0; int option_linelength = 0; int option_waveout = 0; @@ -550,9 +573,9 @@ int main (int argc, char **argv) case 0x106: // -- split if(optarg2 == NULL) - samples_split = 30; // default 30 minutes + samples_split = 30 * 60; // default 30 minutes else - samples_split = atoi(optarg2); + samples_split = atoi(optarg2) * 60; break; case 0x107: // --path @@ -566,6 +589,10 @@ int main (int argc, char **argv) } break; + case 0x109: // --pho + option_mbrola_phonemes = 8; + break; + default: exit(0); } @@ -576,7 +603,7 @@ int main (int argc, char **argv) { // writing to a file (or no output), we can use synchronous mode samplerate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS,0,data_path,0); - samples_split = (samplerate * samples_split) * 60; + samples_split = samplerate * samples_split_seconds; espeak_SetSynthCallback(SynthCallback); if(samples_split) @@ -589,12 +616,6 @@ int main (int argc, char **argv) *extn = 0; } } - else - if(option_waveout) - { - if(OpenWavFile(wavefile,samplerate) != 0) - exit(4); - } } else { @@ -641,7 +662,7 @@ int main (int argc, char **argv) espeak_SetParameter(espeakLINELENGTH,option_linelength,0); if(option_punctuation == 2) espeak_SetPunctuationList(option_punctlist); - espeak_SetPhonemeTrace(option_phonemes,f_phonemes_out); + espeak_SetPhonemeTrace(option_phonemes | option_mbrola_phonemes,f_phonemes_out); if(filename[0]==0) { diff --git a/src/espeakedit.cpp b/src/espeakedit.cpp index b84d0b1b..788927a2 100644 --- a/src/espeakedit.cpp +++ b/src/espeakedit.cpp @@ -129,8 +129,6 @@ char param[80]; if(argc > 1) { -extern void VoiceReset(int control); - p = argv[1]; j = 0; while((param[j] = p[j]) != 0) j++; diff --git a/src/mbrolib.h b/src/mbrolib.h deleted file mode 100644 index 0616b464..00000000 --- a/src/mbrolib.h +++ /dev/null @@ -1,205 +0,0 @@ -#ifndef MBROLIB_H -#define MBROLIB_H - -/* - * mbrolib: mbrola wrapper. - * - * Copyright (C) 2007 Gilles Casse - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * -*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/* < types */ - -/** Parameters */ - -typedef struct { - int ignore_error; /* 1=Ignore any fatal error or unknown diphone */ - char comment_char; /* Comment character */ - float volume_ratio; /* Volume ratio */ - float frequency_ratio; /* Applied to pitch points */ - float time_ratio; /* Applied to phone durations */ -} mbrolib_parameter; - - -/** Returned errors */ - -typedef enum { - MBROLIB_OK=0, - MBROLIB_DATABASE_NOT_INSTALLED, - MBROLIB_INVAL, - MBROLIB_OUT_OF_MEMORY, - MBROLIB_OUT_OF_RANGE, - MBROLIB_READ_ERROR, - MBROLIB_WRITE_ERROR -} MBROLIB_ERROR; - - - -/** Gender */ - -typedef enum { - MBROLIB_FEMALE, - MBROLIB_MALE -} MBROLIB_GENDER; - - - -/** Voice descriptor */ - -typedef struct { - char *name; /* name (for example: "en1") */ - char *filename; /* database pathname (for example: "/usr/share/mbrola/voices/en1) */ - int rate; /* database sample rate */ - MBROLIB_GENDER gender; - const char *language; /* Language and optional dialect qualifier in ascii (e.g. en, fr_ca). */ -} mbrolib_voice; - -/* > */ - - -/** Initialization, returns a new handle. - First function. - - @param the_sample_rate: output rate in Hz (for example 22050). If 0, keep the original database rate. - - @return handle (or NULL if error). -*/ -void* mbrolib_init( int sample_rate); -typedef void* (t_mbrolib_init)(int); - - -/** Returns the list of the installed mbrola databases. - The databases are searched according to the MBROLA_PATH environment variable if set, - or under a default path otherwise (see MBROLA_PATH in mbrolib.c). - - An array of voices is returned. The last item is set to NULL. - The caller must not free the returned items or the array. - - @param the_handle previously given by mbrolib_init. - - @return An array of voices. -*/ -const mbrolib_voice ** mbrolib_list_voices( void* the_handle); -typedef const mbrolib_voice ** (t_mbrolib_list_voices)(void*); - - - -/** Set voice - - @param the_handle. - - @param the_database (for example, "en1"). - - @return error code (MBROLIB_OK, MBROLIB_DATABASE_NOT_INSTALLED, MBROLIB_INVAL). - -*/ -MBROLIB_ERROR mbrolib_set_voice( void* the_handle, const char* the_name); -typedef MBROLIB_ERROR (t_mbrolib_set_voice)( void*, const char*); - - - -/** Get the current database parameters. - The caller supplies a pointer to an already allocated structure. - - @param the_handle previously given by mbrolib_init. - - @param the_parameters: pointer to the structure. - - @return error code (MBROLIB_OK, MBROLIB_INVAL). -*/ -MBROLIB_ERROR mbrolib_get_parameter(void* the_handle, mbrolib_parameter* the_parameter); -typedef MBROLIB_ERROR (t_mbrolib_get_parameter)(void*, mbrolib_parameter*); - - - -/** Set the database parameters using the supplied data. - - @param the_handle previously given by mbrolib_init. - - @param the_parameters: pointer to the wished parameters. - - @return error code (MBROLIB_OK, MBROLIB_INVAL). -*/ -MBROLIB_ERROR mbrolib_set_parameter(void* the_handle, const mbrolib_parameter* the_parameter); -typedef MBROLIB_ERROR (t_mbrolib_set_parameter)(void*, const mbrolib_parameter*); - - - -/** Write the mbrola phonemes in the internal buffer. - - @param the_handle. - - @param the_mbrola_phonemes. - - @param the_size in bytes. - - @return error code (MBROLIB_OK, MBROLIB_INVAL, MBROLIB_WRITE_ERROR, MBROLIB_READ_ERROR). -*/ -MBROLIB_ERROR mbrolib_write(void* the_handle, const char* the_mbrola_phonemes, size_t the_size); -typedef MBROLIB_ERROR (t_mbrolib_write)(void*, const char*, size_t); - - - -/** Read n bytes of the output samples. - - @param the_handle. - - @param the_samples (raw audio data, 16bits, mono). - - @param the_size max number of int16 to read. - - @param the_size number of int16 read. - - @return error code (MBROLIB_OK, MBROLIB_INVAL, MBROLIB_READ_ERROR). - -*/ -MBROLIB_ERROR mbrolib_read(void* the_handle, short* the_samples, int the_max_size, int* the_read_size); -typedef MBROLIB_ERROR (t_mbrolib_read)(void*, short*, int, int*); - - - -/** Flush - - @param the_handle. - -*/ -void mbrolib_flush(void* the_handle); -typedef void (t_mbrolib_flush)(void*); - - - -/** Release the handle - - @param the_handle. - - @return error code (MBROLIB_OK, MBROLIB_INVAL). - -*/ -MBROLIB_ERROR mbrolib_terminate(void* the_handle); -typedef MBROLIB_ERROR (t_mbrolib_terminate)(void*); - - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/mbrowrap.cpp b/src/mbrowrap.cpp new file mode 100644 index 00000000..e7673127 --- /dev/null +++ b/src/mbrowrap.cpp @@ -0,0 +1,578 @@ +/* + * mbrowrap -- A wrapper library around the mbrola binary + * providing a subset of the API from the Windows mbrola DLL. + * + * Copyright (C) 2010 by Nicolas Pitre + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mbrowrap.h" + + +/* + * mbrola instance parameters + */ + +enum mbr_state { + MBR_INACTIVE = 0, + MBR_IDLE, + MBR_NEWDATA, + MBR_AUDIO, + MBR_WEDGED +}; + +static enum mbr_state mbr_state; + +static char *mbr_voice_path; +static int mbr_cmd_fd, mbr_audio_fd, mbr_error_fd, mbr_proc_stat; +static pid_t mbr_pid; +static int mbr_samplerate; +static float mbr_volume = 1.0; +static char mbr_errorbuf[160]; + +struct datablock { + struct datablock *next; + int done; + int size; + char buffer[1]; /* 1 or more, dynamically allocated */ +}; + +static struct datablock *mbr_pending_data_head, *mbr_pending_data_tail; + +/* + * Private support code. + */ + +static void log(const char *msg, ...) +{ + va_list params; + + va_start(params, msg); + vfprintf(stderr, msg, params); + fputc('\n', stderr); + va_end(params); +} + +static void err(const char *err, ...) +{ + va_list params; + + va_start(params, err); + vsnprintf(mbr_errorbuf, sizeof(mbr_errorbuf), err, params); + va_end(params); + log("mbrola error: \"%s\"", mbr_errorbuf); +} + +static int create_pipes(int p1[2], int p2[2], int p3[2]) +{ + int error=0; + + if (pipe(p1) != -1) { + if (pipe(p2) != -1) { + if (pipe(p3) != -1) { + return 0; + } else + error = errno; + close(p2[0]); + close(p2[1]); + } else + error = errno; + close(p1[0]); + close(p1[1]); + } + + err("pipe(): %s", strerror(error)); + return -1; +} + +static void close_pipes(int p1[2], int p2[2], int p3[2]) +{ + close(p1[0]); + close(p1[1]); + close(p2[0]); + close(p2[1]); + close(p3[0]); + close(p3[1]); +} + +static int start_mbrola(const char *voice_path) +{ + int error, p_stdin[2], p_stdout[2], p_stderr[2]; + char charbuf[20]; + + if (mbr_state != MBR_INACTIVE) { + err("mbrola init request when already initialized"); + return -1; + } + + error = create_pipes(p_stdin, p_stdout, p_stderr); + if (error) + return -1; + + mbr_pid = fork(); + + if (mbr_pid == -1) { + error = errno; + close_pipes(p_stdin, p_stdout, p_stderr); + err("fork(): %s", strerror(error)); + return -1; + } + + if (mbr_pid == 0) { + int i; + + if (dup2(p_stdin[0], 0) == -1 || + dup2(p_stdout[1], 1) == -1 || + dup2(p_stderr[1], 2) == -1) { + snprintf(mbr_errorbuf, sizeof(mbr_errorbuf), + "dup2(): %s\n", strerror(errno)); + write(p_stderr[1], mbr_errorbuf, strlen(mbr_errorbuf)); + _exit(1); + } + + for (i = p_stderr[1]; i > 2; i--) + close(i); + signal(SIGHUP, SIG_IGN); + signal(SIGINT, SIG_IGN); + signal(SIGQUIT, SIG_IGN); + signal(SIGTERM, SIG_IGN); + + snprintf(charbuf, sizeof(charbuf), "%g", mbr_volume); + execlp("mbrola", "mbrola", "-e", "-v", charbuf, + voice_path, "-", "-.wav", (char *)NULL); + /* if execution reaches this point then the exec() failed */ + snprintf(mbr_errorbuf, sizeof(mbr_errorbuf), + "mbrola: %s\n", strerror(errno)); + write(2, mbr_errorbuf, strlen(mbr_errorbuf)); + _exit(1); + } + + snprintf(charbuf, sizeof(charbuf), "/proc/%d/stat", mbr_pid); + mbr_proc_stat = open(charbuf, O_RDONLY); + if (mbr_proc_stat == -1) { + error = errno; + close_pipes(p_stdin, p_stdout, p_stderr); + waitpid(mbr_pid, NULL, 0); + mbr_pid = 0; + err("/proc is unaccessible: %s", strerror(error)); + return -1; + } + + signal(SIGPIPE, SIG_IGN); + + if (fcntl(p_stdin[1], F_SETFL, O_NONBLOCK) == -1 || + fcntl(p_stdout[0], F_SETFL, O_NONBLOCK) == -1 || + fcntl(p_stderr[0], F_SETFL, O_NONBLOCK) == -1) { + error = errno; + close_pipes(p_stdin, p_stdout, p_stderr); + waitpid(mbr_pid, NULL, 0); + mbr_pid = 0; + err("fcntl(): %s", strerror(error)); + return -1; + } + + mbr_cmd_fd = p_stdin[1]; + mbr_audio_fd = p_stdout[0]; + mbr_error_fd = p_stderr[0]; + close(p_stdin[0]); + close(p_stdout[1]); + close(p_stderr[1]); + + mbr_state = MBR_IDLE; + return 0; +} + +static void stop_mbrola(void) +{ + if (mbr_state == MBR_INACTIVE) + return; + close(mbr_proc_stat); + close(mbr_cmd_fd); + close(mbr_audio_fd); + close(mbr_error_fd); + if (mbr_pid) { + kill(mbr_pid, SIGTERM); + waitpid(mbr_pid, NULL, 0); + mbr_pid = 0; + } + mbr_state = MBR_INACTIVE; +} + +static void free_pending_data(void) +{ + struct datablock *p, *head = mbr_pending_data_head; + while (head) { + p = head; + head = head->next; + free(p); + } + mbr_pending_data_head = NULL; + mbr_pending_data_tail = NULL; +} + +static int mbrola_has_errors(void) +{ + int result, error; + + result = read(mbr_error_fd, mbr_errorbuf, sizeof(mbr_errorbuf)-1); + + if (result == -1) { + if (errno == EAGAIN) + return 0; + err("read(error): %s", strerror(errno)); + return -1; + } + + if (result != 0) { + mbr_errorbuf[result] = 0; + if (mbr_errorbuf[result - 1] == '\n') + mbr_errorbuf[result - 1] = 0; + /* inhibit the reset signal message */ + if (strncmp(mbr_errorbuf, "Got a reset signal", 18) == 0) { + mbr_errorbuf[0] = 0; + return 0; + } + /* don't consider this fatal at this point */ + error = 0; + } else { + /* EOF on stderr, assume mbrola died. */ + pid_t pid; + int status, len; + const char *msg; + char msgbuf[80]; + + pid = waitpid(mbr_pid, &status, WNOHANG); + if (!pid) { + msg = "mbrola closed stderr and did not exit"; + } else { + mbr_pid = 0; + if (WIFSIGNALED(status)) { + int sig = WTERMSIG(status); + snprintf(msgbuf, sizeof(msgbuf), + "mbrola died by signal %d", sig); + msg = msgbuf; + } else if (WIFEXITED(status)) { + int exst = WEXITSTATUS(status); + snprintf(msgbuf, sizeof(msgbuf), + "mbrola exited with status %d", exst); + msg = msgbuf; + } else { + msg = "mbrola died and wait status is weird"; + } + } + len = strlen(mbr_errorbuf); + if (!len) + snprintf(mbr_errorbuf, sizeof(mbr_errorbuf), "%s", msg); + else + snprintf(mbr_errorbuf+len, sizeof(mbr_errorbuf)-len, + ", (%s)", msg); + error = -1; + } + + log("mbrola error: \"%s\"", mbr_errorbuf); + return error; +} + +static int send_to_mbrola(const char *cmd) +{ + ssize_t result; + int len; + + if (!mbr_pid) + return -1; + + len = strlen(cmd); + result = write(mbr_cmd_fd, cmd, len); + + if (result == -1) { + int error = errno; + if (error == EPIPE && mbrola_has_errors()) { + return -1; + } else if (error == EAGAIN) { + result = 0; + } else { + err("write(): %s", strerror(error)); + return -1; + } + } + + if (result != len) { + struct datablock *data; + data = (struct datablock *)malloc(sizeof(*data) + len - result); + if (data) { + data->next = NULL; + data->done = 0; + data->size = len - result; + memcpy(data->buffer, cmd + result, len - result); + result = len; + if (!mbr_pending_data_head) + mbr_pending_data_head = data; + else + mbr_pending_data_tail->next = data; + mbr_pending_data_tail = data; + } + } + + return result; +} + +static int mbrola_is_idle(void) +{ + char *p; + char buffer[20]; /* looking for "12345 (mbrola) S" so 20 is plenty*/ + + /* look in /proc to determine if mbrola is still running or sleeping */ + if (lseek(mbr_proc_stat, 0, SEEK_SET) != 0) + return 0; + if (read(mbr_proc_stat, buffer, sizeof(buffer)) != sizeof(buffer)) + return 0; + p = (char *)memchr(buffer, ')', sizeof(buffer)); + if (!p || (unsigned)(p - buffer) >= sizeof(buffer) - 2) + return 0; + return (p[1] == ' ' && p[2] == 'S'); +} + +static ssize_t receive_from_mbrola(void *buffer, size_t bufsize) +{ + int result, wait = 1; + size_t cursize = 0; + + if (!mbr_pid) + return -1; + + do { + struct pollfd pollfd[3]; + nfds_t nfds = 0; + int idle; + + pollfd[0].fd = mbr_audio_fd; + pollfd[0].events = POLLIN; + nfds++; + + pollfd[1].fd = mbr_error_fd; + pollfd[1].events = POLLIN; + nfds++; + + if (mbr_pending_data_head) { + pollfd[2].fd = mbr_cmd_fd; + pollfd[2].events = POLLOUT; + nfds++; + } + + idle = mbrola_is_idle(); + result = poll(pollfd, nfds, idle ? 0 : wait); + if (result == -1) { + err("poll(): %s", strerror(errno)); + return -1; + } + if (result == 0) { + if (idle) { + mbr_state = MBR_IDLE; + break; + } else { + if (wait >= 5000 * (4-1)/4) { + mbr_state = MBR_WEDGED; + err("mbrola process is stalled"); + break; + } else { + wait *= 4; + continue; + } + } + } + wait = 1; + + if (pollfd[1].revents && mbrola_has_errors()) + return -1; + + if (mbr_pending_data_head && pollfd[2].revents) { + struct datablock *head = mbr_pending_data_head; + char *data = head->buffer + head->done; + int left = head->size - head->done; + result = write(mbr_cmd_fd, data, left); + if (result == -1) { + int error = errno; + if (error == EPIPE && mbrola_has_errors()) + return -1; + err("write(): %s", strerror(error)); + return -1; + } + if (result != left) { + head->done += result; + } else { + mbr_pending_data_head = head->next; + free(head); + if (!mbr_pending_data_head) + mbr_pending_data_tail = NULL; + else + continue; + } + } + + if (pollfd[0].revents) { + char *curpos = (char *)buffer + cursize; + size_t space = bufsize - cursize; + ssize_t obtained = read(mbr_audio_fd, curpos, space); + if (obtained == -1) { + err("read(): %s", strerror(errno)); + return -1; + } + cursize += obtained; + mbr_state = MBR_AUDIO; + } + } while (cursize < bufsize); + + return cursize; +} + +/* + * API functions. + */ + +int init_MBR(const char *voice_path) +{ + int error, result; + unsigned char wavhdr[45]; + + error = start_mbrola(voice_path); + if (error) + return -1; + + result = send_to_mbrola("#\n"); + if (result != 2) { + stop_mbrola(); + return -1; + } + + /* we should actually be getting only 44 bytes */ + result = receive_from_mbrola(wavhdr, 45); + if (result != 44) { + err("unable to get .wav header from mbrola"); + stop_mbrola(); + return -1; + } + + /* parse wavhdr to get mbrola voice samplerate */ + if (memcmp(wavhdr, "RIFF", 4) != 0 || + memcmp(wavhdr+8, "WAVEfmt ", 8) != 0) { + err("mbrola did not return a .wav header"); + stop_mbrola(); + return -1; + } + mbr_samplerate = wavhdr[24] + (wavhdr[25]<<8) + + (wavhdr[26]<<16) + (wavhdr[27]<<24); + //log("mbrola: voice samplerate = %d", mbr_samplerate); + + /* remember the voice path for setVolumeRatio_MBR() */ + if (mbr_voice_path != voice_path) { + free(mbr_voice_path); + mbr_voice_path = strdup(voice_path); + } + + return 0; +} + +void close_MBR(void) +{ + stop_mbrola(); + free_pending_data(); + free(mbr_voice_path); + mbr_voice_path = NULL; + mbr_volume = 1.0; +} + +int reset_MBR() +{ + int result, success = 1; + char dummybuf[4096]; + + if (mbr_state == MBR_IDLE) + return 1; + if (!mbr_pid) + return 0; + if (kill(mbr_pid, SIGUSR1) == -1) + success = 0; + free_pending_data(); + result = write(mbr_cmd_fd, "\n#\n", 3); + if (result != 3) + success = 0; + do { + result = read(mbr_audio_fd, dummybuf, sizeof(dummybuf)); + } while (result > 0); + if (result != -1 || errno != EAGAIN) + success = 0; + if (!mbrola_has_errors() && success) + mbr_state = MBR_IDLE; + return success; +} + +int read_MBR(void *buffer, int nb_samples) +{ + int result = receive_from_mbrola(buffer, nb_samples * 2); + if (result > 0) + result /= 2; + return result; +} + +int write_MBR(const char *data) +{ + mbr_state = MBR_NEWDATA; + return send_to_mbrola(data); +} + +int flush_MBR(void) +{ + return send_to_mbrola("\n#\n") == 3; +} + +int getFreq_MBR(void) +{ + return mbr_samplerate; +} + +void setVolumeRatio_MBR(float value) +{ + if (value == mbr_volume) + return; + mbr_volume = value; + if (mbr_state != MBR_IDLE) + return; + /* + * We have no choice but to kill and restart mbrola with + * the new argument here. + */ + stop_mbrola(); + init_MBR(mbr_voice_path); +} + +int lastErrorStr_MBR(char *buffer, int bufsize) +{ + int result = snprintf(buffer, bufsize, "%s", mbr_errorbuf); + return result >= bufsize ? (bufsize - 1) : result; +} + +void resetError_MBR(void) +{ + mbr_errorbuf[0] = 0; +} diff --git a/src/mbrowrap.h b/src/mbrowrap.h new file mode 100644 index 00000000..0409507c --- /dev/null +++ b/src/mbrowrap.h @@ -0,0 +1,108 @@ +/* + * mbrowrap -- A wrapper library around the mbrola binary + * providing a subset of the API from the Windows mbrola DLL. + * + * Copyright (C) 2010 by Nicolas Pitre + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef MBROWRAP_H +#define MBROWRAP_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* + * Initialize mbrola. The 'voice_path' argument must contain the + * path and file name to the mbrola voice database to be used. Returned + * value is 0 on success, or an error code otherwise (currently only -1 + * is returned. If not successful, lastErrorStr_MBR() will provide the + * error reason. If this is successful, then close_MBR() must be called + * before init_MBR() can be called again. + */ +int init_MBR(const char *voice_path); + +/* + * Stop mbrola and release any resources. It is necessary to call + * this after a successful call to init_MBR() before init_MBR() can be + * called again. + */ +void close_MBR(void); + +/* + * Stop any ongoing processing and flush all buffers. After this call + * any synthesis request will start afresh. A non-zero value is returned + * on success, or 0 on failure. If not successful, lastErrorStr_MBR() will + * provide the error reason. + */ +int reset_MBR(); + +/* + * Return at most 'nb_samples' audio samples into 'buffer'. The returned + * value is the actual number of samples returned, or -1 on error. + * If not successful, lastErrorStr_MBR() will provide the error reason. + * Samples are always 16-bit little endian. + */ +int read_MBR(void *buffer, int nb_samples); + +/* + * Write a NULL terminated string of phoneme in the input buffer. + * Return the number of chars actually written, or -1 on error. + * If not successful, lastErrorStr_MBR() will provide the error reason. + */ +int write_MBR(const char *data); + +/* + * Send a flush command to the mbrola input stream. + * This is currently similar to write_MBR("#\n"). Return 1 on success + * or 0 on failure. If not successful, lastErrorStr_MBR() will provide + * the error reason. + */ +int flush_MBR(void); + +/* + * Return the audio sample frequency of the used voice database. + */ +int getFreq_MBR(void); + +/* + * Overall volume. + */ +void setVolumeRatio_MBR(float value); + +/* + * Copy into 'buffer' at most 'bufsize' bytes from the latest error + * message. This may also contain non-fatal errors from mbrola. The + * returned value is the actual number of bytes copied. When no error + * message is pending then an empty string is returned. Consecutive + * calls to lastErrorStr_MBR() will return the same message unless it + * is explicitly cleared with resetError_MBR(). + */ +int lastErrorStr_MBR(char *buffer, int bufsize); + +/* + * Clear any pending error message. + */ +void resetError_MBR(void); + +/* + * Tolerance to missing diphones (always active so this is ignored) + */ +static inline void setNoError_MBR(int no_error) { } + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/setlengths.cpp b/src/setlengths.cpp index 8261813b..43bd3c7c 100644 --- a/src/setlengths.cpp +++ b/src/setlengths.cpp @@ -140,7 +140,6 @@ void SetSpeed(int control) int s1; int wpm; int wpm2; - int test=0; speed.loud_consonants = 0; speed.min_sample_len = 450; @@ -172,43 +171,6 @@ void SetSpeed(int control) speed.loud_consonants = (wpm - 360) / 8; } -#ifdef deleted - if(wpm >= 450) - { - // TEST - speed1 = 6; - speed2 = speed3 = 5; - speed.pause_factor = 12; - speed.clause_pause_factor = 15; - speed.wav_factor = 70; - speed.lenmod_factor = 53; - speed.min_sample_len = 400; - return; - } - if(wpm > 390) - { - // TEST - speed1 = 6; - speed2 = speed3 = 5; - speed.pause_factor = 13; - speed.clause_pause_factor = 15; - - if(wpm >= 440) - { - speed.wav_factor = 72 - (wpm - 440)/4; - speed.lenmod_factor = 60 - (wpm - 440)/2; - speed.min_sample_len = 420 - (wpm - 440); - } - else - { - speed.wav_factor = 74; - speed.lenmod_factor = 65 - (wpm - 400)/10; - speed.min_sample_len = 450 - (wpm - 400)/2; - } - return; - } -#endif - wpm2 = wpm; if(wpm > 359) wpm2 = 359; if(wpm < 80) wpm2 = 80; @@ -269,9 +231,6 @@ void SetSpeed(int control) speed.min_sample_len = 420 - (wpm - 440); } - if(test > 0) - speed.wav_factor = test; - speed.pause_factor = (256 * s1)/115; // full speed adjustment, used for pause length speed.clause_pause_factor = 0; diff --git a/src/speak.cpp b/src/speak.cpp index 7f100867..144aeb5f 100644 --- a/src/speak.cpp +++ b/src/speak.cpp @@ -98,8 +98,10 @@ static const char *help_text = "\t directory. specifies the language\n" "--path=\"\"\n" "\t Specifies the directory containing the espeak-data directory\n" +"--pho\n" +"\t Write mbrola phoneme data (.pho) to stdout, or to the file in --phonout\n" "--phonout=\"\"\n" -"\t Write output from -x -X commands, and mbrola phoneme data, to this file\n" +"\t Write phoneme output from -x -X and --pho to this file\n" "--punct=\"\"\n" "\t Speak the names of punctuation characters during speaking. If\n" "\t = is omitted, all punctuation is spoken.\n" @@ -214,7 +216,9 @@ void DisplayVoices(FILE *f_out, char *language) } // end of DisplayVoices - +void WVoiceChanged(voice_t *wvoice) +{ +} static int OpenWaveFile(const char *path, int rate) //================================================= @@ -472,7 +476,8 @@ int main (int argc, char **argv) {"stdout", no_argument, 0, 0x105}, {"split", optional_argument, 0, 0x106}, {"path", required_argument, 0, 0x107}, - {"phonout", required_argument, 0, 0x108}, + {"phonout", required_argument, 0, 0x108}, + {"pho", no_argument, 0, 0x109}, {0, 0, 0, 0} }; @@ -702,6 +707,10 @@ int main (int argc, char **argv) } break; + case 0x109: // --pho + option_mbrola_phonemes = 8; + break; + default: exit(0); } diff --git a/src/speak_lib.cpp b/src/speak_lib.cpp index 77428ad6..9683f3f1 100644 --- a/src/speak_lib.cpp +++ b/src/speak_lib.cpp @@ -59,6 +59,9 @@ static unsigned int my_unique_identifier=0; static void* my_user_data=NULL; static espeak_AUDIO_OUTPUT my_mode=AUDIO_OUTPUT_SYNCHRONOUS; static int synchronous_mode = 1; +static int out_samplerate = 0; +static int voice_samplerate = 22050; + t_espeak_callback* synth_callback = NULL; int (* uri_callback)(int, const char *, const char *) = NULL; int (* phoneme_callback)(const char *) = NULL; @@ -66,6 +69,13 @@ int (* phoneme_callback)(const char *) = NULL; char path_home[N_PATH_HOME]; // this is the espeak-data directory +void WVoiceChanged(voice_t *wvoice) +{//================================= +// Voice change in wavegen + voice_samplerate = wvoice->samplerate; +} + + #ifdef USE_ASYNC static int dispatch_audio(short* outbuf, int length, espeak_EVENT* event) @@ -85,6 +95,34 @@ static int dispatch_audio(short* outbuf, int length, espeak_EVENT* event) { case AUDIO_OUTPUT_PLAYBACK: { + int event_type=0; + int event_data=0; + if(event) + { + event_type = event->type; + event_data = event->id.number; + } + + if(event_type == espeakEVENT_SAMPLERATE) + { + voice_samplerate = event->id.number; + + if(out_samplerate != voice_samplerate) + { + if(out_samplerate != 0) + { + // sound was previously open with a different sample rate + wave_close(my_audio); + sleep(1); + } + out_samplerate = voice_samplerate; + wave_init(voice_samplerate); + wave_set_callback_is_output_enabled( fifo_is_command_enabled); + my_audio = wave_open("alsa"); + event_init(); + } + } + if (outbuf && length && a_wave_can_be_played) { wave_write (my_audio, (char*)outbuf, 2*length); @@ -220,17 +258,13 @@ static void select_output(espeak_AUDIO_OUTPUT output_type) my_audio = NULL; synchronous_mode = 1; option_waveout = 1; // inhibit portaudio callback from wavegen.cpp + out_samplerate = 0; switch(my_mode) { case AUDIO_OUTPUT_PLAYBACK: + // wave_init() is now called just before the first wave_write() synchronous_mode = 0; -#ifdef USE_ASYNC - wave_init(); - wave_set_callback_is_output_enabled( fifo_is_command_enabled); - my_audio = wave_open("alsa"); - event_init(); -#endif break; case AUDIO_OUTPUT_RETRIEVAL: @@ -734,19 +768,21 @@ ENTER("espeak_Initialize"); return(EE_INTERNAL_ERROR); option_phonemes = 0; + option_mbrola_phonemes = 0; option_phoneme_events = (options & 1); - SetVoiceByName("default"); + VoiceReset(0); +// SetVoiceByName("default"); for(param=0; param @@ -64,7 +60,7 @@ PROCVV reset_MBR; PROCIV lastError_MBR; PROCVCI lastErrorStr_MBR; PROCVI setNoError_MBR; -PROCVI setFreq_MBR; +PROCIV getFreq_MBR; PROCVF setVolumeRatio_MBR; @@ -103,13 +99,11 @@ void unload_MBR() } #endif // windows -#endif // USE_MBROLA_LIB static MBROLA_TAB *mbrola_tab = NULL; static int mbrola_control = 0; - - +int option_mbrola_phonemes; espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int srate) @@ -133,37 +127,35 @@ espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int } sprintf(path,"%s/mbrola/%s",path_home,mbrola_voice); -#ifdef USE_MBROLA_LIB +#ifdef PLATFORM_POSIX + if(GetFileLength(path) <= 0) + { + // mbrola voice file not found, look in /usr/share + sprintf(path,"/usr/share/mbrola/%s",mbrola_voice); + } +#endif #ifdef PLATFORM_WINDOWS if(load_MBR() == FALSE) // load mbrola.dll return(EE_INTERNAL_ERROR); +#endif if(init_MBR(path) != 0) // initialise the required mbrola voice return(EE_NOT_FOUND); setNoError_MBR(1); // don't stop on phoneme errors -#else - mb_handle = mbrolib_init(srate); - mbrolib_parameter m_parameters; - - if(mb_handle == NULL) - return(EE_INTERNAL_ERROR); - - MBROLIB_ERROR a_status = mbrolib_set_voice(mb_handle, mbrola_voice); - if(a_status != MBROLIB_OK) - return(EE_NOT_FOUND); -#endif // not windows -#endif // USE_MBROLA_LIB // read eSpeak's mbrola phoneme translation data, eg. en1_phtrans sprintf(path,"%s/mbrola_ph/%s",path_home,phtrans); size = GetFileLength(path); - if((f_in = fopen(path,"r")) == NULL) + if((f_in = fopen(path,"r")) == NULL) { + close_MBR(); return(EE_NOT_FOUND); + } if((mbrola_tab = (MBROLA_TAB *)realloc(mbrola_tab,size)) == NULL) { fclose(f_in); + close_MBR(); return(EE_INTERNAL_ERROR); } @@ -176,26 +168,16 @@ espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int fread(mbrola_tab,size,1,f_in); fclose(f_in); - -#ifdef USE_MBROLA_LIB -#ifdef PLATFORM_WINDOWS setVolumeRatio_MBR((float)(mbrola_control & 0xff) /16.0f); -#else - mbrolib_get_parameter(mb_handle,&m_parameters); - m_parameters.ignore_error = 1; - m_parameters.volume_ratio = (float)(mbrola_control & 0xff) /16.0; - mbrolib_set_parameter(mb_handle,&m_parameters); -#endif // not windows -#endif // USE_MBROLA_LIB - - option_quiet = 1; +// srate = getFreq_MBR(); samplerate = srate; if(srate == 22050) SetParameter(espeakVOICETYPE,0,0); else SetParameter(espeakVOICETYPE,1,0); strcpy(mbrola_name,mbrola_voice); - mbrola_delay = 3800; // improve synchronization of events +// mbrola_delay = 3800; // improve synchronization of events + mbrola_delay = 1000; // improve synchronization of events return(EE_OK); } // end of LoadMbrolaTable @@ -383,155 +365,10 @@ static char *WritePitch(int env, int pitch1, int pitch2, int split, int final) } // end of WritePitch -#ifdef USE_MBROLA_LIB - -static void MbrolaMarker(int type, int char_posn, int length, int value) -{//===================================================================== - - MarkerEvent(type,(char_posn & 0xffffff) | (length << 24),value,outbuf); - -} - - -static void MbrolaEmbedded(int &embix, int sourceix) -{//================================================= - // There were embedded commands in the text at this point - unsigned int word; // bit 7=last command for this word, bits 5,6 sign, bits 0-4 command - unsigned int value; - int command; - int sign=0; - - do { - word = embedded_list[embix++]; - value = word >> 8; - command = word & 0x1f; - - if((word & 0x60) == 0x60) - sign = -1; - else - if((word & 0x60) == 0x40) - sign = 1; - - if(command < N_EMBEDDED_VALUES) - { - if(sign == 0) - embedded_value[command] = value; - else - embedded_value[command] += (value * sign); - } - - switch(command & 0x1f) - { - case EMBED_M: // named marker - MbrolaMarker(espeakEVENT_MARK, (sourceix & 0x7ff) + clause_start_char, 0, value); - break; - } - } while ((word & 0x80) == 0); -} - - -#ifdef PLATFORM_WINDOWS -static int MbrolaSynth(char *p_mbrola) -{//=================================== -// p_mbrola is a string of mbrola pho lines - Windows - int len; - int finished; - int result=0; - - if(synth_callback == NULL) - return(1); - - if(p_mbrola == NULL) - flush_MBR(); - else - result = write_MBR(p_mbrola); - - - finished = 0; - while(!finished && ((len = read_MBR((short *)outbuf, outbuf_size/2)) > 0)) - { - out_ptr = outbuf + len*2; - - if(event_list) - { - event_list[event_list_ix].type = espeakEVENT_LIST_TERMINATED; // indicates end of event list - event_list[event_list_ix].user_data = 0; - } - count_samples += len; - finished = synth_callback((short *)outbuf, len, event_list); - event_list_ix=0; - } - - if(finished) - { - // cancelled by user, discard any unused mbrola speech - flush_MBR(); - while((len = read_MBR((short *)outbuf, outbuf_size/2)) > 0); - } - return(finished); -} // end of SynthMbrola -#else - -static int MbrolaSynth(char *p_mbrola) -{//=================================== -// p_mbrola is a string of mbrola pho lines - Linux - -// This is wrong -// It must be called from WavegenFill() - - int len; - int finished; - int result=0; - - if(synth_callback == NULL) - return(1); - - if(p_mbrola == NULL) - mbrolib_flush(mb_handle); - else - result = mbrolib_write(mb_handle,p_mbrola,strlen(p_mbrola)); - - - finished = 0; - while(!finished && (mbrolib_read(mb_handle, (short *)out_ptr, (out_end - out_ptr)/2, &len) == MBROLIB_OK)) - { - if(len == 0) - break; - - out_ptr += (len*2); - - if(event_list) - { - event_list[event_list_ix].type = espeakEVENT_LIST_TERMINATED; // indicates end of event list - event_list[event_list_ix].user_data = 0; - } - count_samples += len; - finished = synth_callback((short *)outbuf, len, event_list); - event_list_ix=0; - } - - if(finished) - { - // cancelled by user, discard any unused mbrola speech - mbrolib_flush(mb_handle); - while(mbrolib_read(mb_handle, (short *)outbuf, outbuf_size/2, &len) == MBROLIB_OK) - { - if(len == 0) - break; - } - } - return(finished); -} // end of SynthMbrola -#endif // not windows -#endif // USE_MBROLA_LIB - - - -void MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, FILE *f_mbrola) -{//====================================================================== +int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbrola) +{//================================================================================= // Generate a mbrola pho file unsigned int name; - int phix; int len; int len1; PHONEME_TAB *ph; @@ -552,21 +389,21 @@ void MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, FILE *f_mbrola) char buf[80]; char mbr_buf[120]; -#ifdef USE_MBROLA_LIB - int embedded_ix=0; - int word_count=0; + static int phix; + static int embedded_ix; + static int word_count; - event_list_ix = 0; - out_ptr = outbuf; -#ifdef PLATFORM_WINDOWS - setNoError_MBR(1); // don't stop on phoneme errors -#endif -#else -// fprintf(f_mbrola,";; v=%.2f\n",(float)(mbrola_control & 0xff)/16.0); // ;; v= has no effect on mbrola -#endif + if (!resume) { + phix = 1; + embedded_ix = 0; + word_count = 0; + } - for(phix=1; phix < n_phonemes; phix++) + while (phix < n_phonemes) { + if (WcmdqFree() < MIN_WCMDQ) + return 1; + mbr_buf[0] = 0; p = &plist[phix]; @@ -576,24 +413,24 @@ void MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, FILE *f_mbrola) ph_prev = plist[phix-1].ph; ph_next = plist[phix+1].ph; -#ifdef USE_MBROLA_LIB if(p->synthflags & SFLAG_EMBEDDED) { - MbrolaEmbedded(embedded_ix, p->sourceix); + DoEmbedded(embedded_ix, p->sourceix); } - if(p->newword & 4) - MbrolaMarker(espeakEVENT_SENTENCE, (p->sourceix & 0x7ff) + clause_start_char, 0, count_sentences); + if(p->newword & 4) + DoMarker(espeakEVENT_SENTENCE, (p->sourceix & 0x7ff) + clause_start_char, 0, count_sentences); if(p->newword & 1) - MbrolaMarker(espeakEVENT_WORD, (p->sourceix & 0x7ff) + clause_start_char, p->sourceix >> 11, clause_start_word + word_count++); -#endif + DoMarker(espeakEVENT_WORD, (p->sourceix & 0x7ff) + clause_start_char, p->sourceix >> 11, clause_start_word + word_count++); name = GetMbrName(p,ph,ph_prev,ph_next,&name2,&len_percent,&control); if(control & 1) phix++; - if(name == 0) + if(name == 0) { + phix++; continue; // ignore this phoneme + } if((ph->type == phPAUSE) && (name == ph->mnemonic)) { @@ -607,9 +444,7 @@ void MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, FILE *f_mbrola) else len = (80 * speed.wav_factor)/256; -#ifdef USE_MBROLA_LIB - MbrolaMarker(espeakEVENT_PHONEME, (p->sourceix & 0x7ff) + clause_start_char, 0, ph->mnemonic); -#endif + DoMarker(espeakEVENT_PHONEME, (p->sourceix & 0x7ff) + clause_start_char, 0, ph->mnemonic); sprintf(buf,"%s\t",WordToString(name)); strcat(mbr_buf,buf); @@ -720,6 +555,7 @@ void MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, FILE *f_mbrola) if(pause) { + len += PauseLength(pause,0); sprintf(buf,"_ \t%d\n",PauseLength(pause,0)); strcat(mbr_buf,buf); pause = 0; @@ -731,39 +567,78 @@ void MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, FILE *f_mbrola) } else { -#ifdef USE_MBROLA_LIB - if(MbrolaSynth(mbr_buf) != 0) - return; -#endif + int res = write_MBR(mbr_buf); + if (res < 0) + return 0; /* don't get stuck on error */ + if (res == 0) + return 1; + wcmdq[wcmdq_tail][0] = WCMD_MBROLA_DATA; + wcmdq[wcmdq_tail][1] = len; + WcmdqInc(); } + + phix++; } -#ifdef USE_MBROLA_LIB - MbrolaSynth(NULL); -#endif + if(!f_mbrola) + { + flush_MBR(); + + // flush the mbrola output buffer + wcmdq[wcmdq_tail][0] = WCMD_MBROLA_DATA; + wcmdq[wcmdq_tail][1] = 500; + WcmdqInc(); + } + + return 0; } // end of MbrolaTranslate -#ifdef TEST_MBROLA - -static PHONEME_LIST mbrola_phlist; -static int mbrola_n_ph; -static int mbrola_phix; - - -int MbrolaFill(int fill_zeros) -{//=========================== -} - int MbrolaGenerate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) {//================================================================== - if(resume == 0) + FILE *f_mbrola = NULL; + + if(*n_ph == 0) + return(0); + + if(option_mbrola_phonemes) { - mbrola_phlist = phoneme_list; - mbrola_n_ph = n_ph; - mbrola_phix = 0; + // send mbrola data to a file, not to the mbrola library + f_mbrola = f_trans; } - resume(0); // finished phoneme list + int again = MbrolaTranslate(phoneme_list, *n_ph, resume, f_mbrola); + if (!again) + *n_ph = 0; + return again; +} + + +int MbrolaFill(int length, int resume) +{//=================================== +// Read audio data from Mbrola (length is in milisecs) + + static int n_samples; + int req_samples, result; + + if (!resume) + n_samples = samplerate * length / 1000; + + req_samples = (out_end - out_ptr)/2; + if (req_samples > n_samples) + req_samples = n_samples; + result = read_MBR((short *)out_ptr, req_samples); + if (result <= 0) + return 0; + out_ptr += result*2; + n_samples -= result; + return n_samples ? 1 : 0; +} + + +void MbrolaReset(void) +{//=================== +// Reset the Mbrola engine and flush the pending audio + + reset_MBR(); } -#endif diff --git a/src/synthdata.cpp b/src/synthdata.cpp index da4f5b20..5334e5a9 100644 --- a/src/synthdata.cpp +++ b/src/synthdata.cpp @@ -35,7 +35,7 @@ #include "translate.h" #include "wave.h" -const char *version_string = "1.43.46 20.Jun.10"; +const char *version_string = "1.43.48 28.Jun.10"; const int version_phdata = 0x014342; int option_device_number = -1; diff --git a/src/synthesize.cpp b/src/synthesize.cpp index c37fbf09..7f739401 100644 --- a/src/synthesize.cpp +++ b/src/synthesize.cpp @@ -135,7 +135,7 @@ static void EndPitch(int voice_break) syllable_centre = -1; memset(vowel_transition,0,sizeof(vowel_transition)); } -} // end of Synthesize::EndPitch +} // end of EndPitch @@ -152,7 +152,7 @@ static void DoAmplitude(int amp, unsigned char *amp_env) q[2] = (long)amp_env; q[3] = amp; WcmdqInc(); -} // end of Synthesize::DoAmplitude +} // end of DoAmplitude @@ -181,7 +181,7 @@ static void DoPitch(unsigned char *env, int pitch1, int pitch2) q[2] = (long)env; q[3] = (pitch1 << 16) + pitch2; WcmdqInc(); -} // end of Synthesize::DoPitch +} // end of DoPitch @@ -223,7 +223,7 @@ static void DoPause(int length, int control) wcmdq[wcmdq_tail][1] = len; WcmdqInc(); last_frame = NULL; -} // end of Synthesize::DoPause +} // end of DoPause extern int seq_len_adjust; // temporary fix to advance the start point for playing the wav sample @@ -253,9 +253,9 @@ static int DoSample2(int index, int which, int std_length, int control, int leng else { // increase consonant amplitude at high speeds, depending on the peak consonant amplitude - x = ((35 - wav_scale) * speed.loud_consonants); - if(x < 0) x = 0; - wav_scale = (wav_scale * (x+256))/256; +// x = ((35 - wav_scale) * speed.loud_consonants); +// if(x < 0) x = 0; +// wav_scale = (wav_scale * (x+256))/256; } if(std_length > 0) @@ -383,32 +383,6 @@ static int DoSample2(int index, int which, int std_length, int control, int leng } // end of DoSample2 -#ifdef deleted -int DoSample(PHONEME_TAB *ph1, PHONEME_TAB *ph2, int which, int length_mod, int amp) -{//====================== ========================================================== - int index; - int match_level; - int amp2; - int result; - - EndPitch(1); - index = LookupSound(ph1,ph2,which & 0xff,&match_level,0); - if((index & 0x800000) == 0) - return(0); // not wavefile data - - amp2 = wavefile_amp; - if(amp != 0) - amp2 = (amp * wavefile_amp)/20; - - if(amp == -1) - amp2 = amp; - - result = DoSample2(index,which,length_mod,0,amp2); - last_frame = NULL; - return(result); -} // end of DoSample -#endif - int DoSample3(PHONEME_DATA *phdata, int length_mod, int amp) {//========================================================= @@ -1198,8 +1172,8 @@ if(which==1) -static void DoMarker(int type, int char_posn, int length, int value) -{//================================================================= +void DoMarker(int type, int char_posn, int length, int value) +{//========================================================== // This could be used to return an index to the word currently being spoken // Type 1=word, 2=sentence, 3=named marker, 4=play audio, 5=end wcmdq[wcmdq_tail][0] = WCMD_MARKER; @@ -1208,7 +1182,7 @@ static void DoMarker(int type, int char_posn, int length, int value) wcmdq[wcmdq_tail][3] = value; WcmdqInc(); -} // end of Synthesize::DoMarker +} // end of DoMarker void DoVoiceChange(voice_t *v) @@ -1224,8 +1198,8 @@ void DoVoiceChange(voice_t *v) } -static void DoEmbedded(int &embix, int sourceix) -{//============================================= +void DoEmbedded(int &embix, int sourceix) +{//====================================== // There were embedded commands in the text at this point unsigned int word; // bit 7=last command for this word, bits 5,6 sign, bits 0-4 command unsigned int value; @@ -1305,14 +1279,12 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) PHONEME_DATA phdata_tone; FMT_PARAMS fmtp; -#ifdef TEST_MBROLA - if(mbrola_name[0] != 0) - return(MbrolaGenerate(phoneme_list,n_ph,resume)); -#endif - if(option_quiet) return(0); + if(mbrola_name[0] != 0) + return(MbrolaGenerate(phoneme_list,n_ph,resume)); + if(resume == 0) { ix = 1; @@ -1899,20 +1871,6 @@ int SpeakNextClause(FILE *f_in, const void *text_in, int control) return(1); } - if(mbrola_name[0] != 0) - { -#ifdef USE_MBROLA_LIB - MbrolaTranslate(phoneme_list,n_phoneme_list,NULL); -#else - { - FILE *f_mbrola; - if((f_mbrola = f_trans) == stderr) - f_mbrola = stdout; - MbrolaTranslate(phoneme_list,n_phoneme_list,f_mbrola); - } -#endif - } - Generate(phoneme_list,&n_phoneme_list,0); WavegenOpenSound(); diff --git a/src/synthesize.h b/src/synthesize.h index e87178c2..29438122 100644 --- a/src/synthesize.h +++ b/src/synthesize.h @@ -462,6 +462,7 @@ extern unsigned char pitch_adjust_tab[MAX_PITCH_VALUE+1]; #define WCMD_MARKER 10 #define WCMD_VOICE 11 #define WCMD_EMBEDDED 12 +#define WCMD_MBROLA_DATA 13 #define N_WCMDQ 160 @@ -557,8 +558,12 @@ espeak_ERROR SetVoiceByName(const char *name); espeak_ERROR SetVoiceByProperties(espeak_VOICE *voice_selector); espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int srate); void SetParameter(int parameter, int value, int relative); -void MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, FILE *f_mbrola); -//int MbrolaSynth(char *p_mbrola); +int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbrola); +int MbrolaGenerate(PHONEME_LIST *phoneme_list, int *n_ph, int resume); +int MbrolaFill(int length, int resume); +void MbrolaReset(void); +void DoEmbedded(int &embix, int sourceix); +void DoMarker(int type, int char_posn, int length, int value); //int DoSample(PHONEME_TAB *ph1, PHONEME_TAB *ph2, int which, int length_mod, int amp); int DoSample3(PHONEME_DATA *phdata, int length_mod, int amp); int DoSpect2(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, PHONEME_LIST *plist, int modulation); diff --git a/src/tr_english.cpp b/src/tr_english.cpp deleted file mode 100644 index 6367df31..00000000 --- a/src/tr_english.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2005 to 2007 by Jonathan Duddington * - * email: jonsd@users.sourceforge.net * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write see: * - * . * - ***************************************************************************/ - -#include "StdAfx.h" - diff --git a/src/tr_languages.cpp b/src/tr_languages.cpp index bd43959d..cecdff88 100644 --- a/src/tr_languages.cpp +++ b/src/tr_languages.cpp @@ -881,7 +881,6 @@ SetLengthMods(tr,3); // all equal static const short stress_lengths_nl[8] = {160,135, 210,210, 0, 0, 260,280}; tr->langopts.stress_rule = STRESSPOSN_1L; - tr->langopts.vowel_pause = 1; tr->langopts.vowel_pause = 0x30; // ?? tr->langopts.param[LOPT_DIERESES] = 1; tr->langopts.param[LOPT_PREFIXES] = 1; diff --git a/src/translate.h b/src/translate.h index b4f0b1d3..f3bbd0e9 100644 --- a/src/translate.h +++ b/src/translate.h @@ -545,6 +545,7 @@ extern int option_tone_flags; extern int option_waveout; extern int option_quiet; extern int option_phonemes; +extern int option_mbrola_phonemes; extern int option_phoneme_events; extern int option_linelength; // treat lines shorter than this as end-of-clause extern int option_multibyte; diff --git a/src/voice.h b/src/voice.h index 3f842c38..75c9337a 100644 --- a/src/voice.h +++ b/src/voice.h @@ -41,6 +41,7 @@ typedef struct { int formant_factor; // adjust nominal formant frequencies by this because of the voice's pitch (256ths) int consonant_amp; // amplitude of unvoiced consonants int consonant_ampv; // amplitude of the noise component of voiced consonants + int samplerate; int klattv[8]; // parameters used by Wavegen @@ -77,6 +78,8 @@ espeak_VOICE *SelectVoiceByName(espeak_VOICE **voices, const char *name); voice_t *LoadVoice(const char *voice_name, int control); voice_t *LoadVoiceVariant(const char *voice_name, int variant); void DoVoiceChange(voice_t *v); +void WVoiceChanged(voice_t *wvoice); void WavegenSetVoice(voice_t *v); void ReadTonePoints(char *string, int *tone_pts); +void VoiceReset(int control); diff --git a/src/voices.cpp b/src/voices.cpp index 5e519f15..40200de2 100644 --- a/src/voices.cpp +++ b/src/voices.cpp @@ -408,6 +408,7 @@ void VoiceReset(int tone_only) voice->voicing = 64; voice->consonant_amp = 100; voice->consonant_ampv = 100; + voice->samplerate = 22050; memset(voice->klattv,0,sizeof(voice->klattv)); memset(speed.fast_settings,0,sizeof(speed.fast_settings)); @@ -921,6 +922,7 @@ voice_t *LoadVoice(const char *vname, int control) phtrans[0] = 0; sscanf(p,"%s %s %d",name,phtrans,&srate); LoadMbrolaTable(name,phtrans,srate); + voice->samplerate = srate; } break; diff --git a/src/wave.cpp b/src/wave.cpp index 364dcf57..56602be3 100644 --- a/src/wave.cpp +++ b/src/wave.cpp @@ -56,15 +56,16 @@ enum {ONE_BILLION=1000000000}; static t_wave_callback* my_callback_is_output_enabled=NULL; #define N_WAV_BUF 10 -#define SAMPLE_RATE 22050 +#define MAX_SAMPLE_RATE 22050 #define FRAMES_PER_BUFFER 512 -#define BUFFER_LENGTH (SAMPLE_RATE*2*sizeof(uint16_t)) -#define THRESHOLD (BUFFER_LENGTH/5) +#define BUFFER_LENGTH (MAX_SAMPLE_RATE*2*sizeof(uint16_t)) +//#define THRESHOLD (BUFFER_LENGTH/5) static char myBuffer[BUFFER_LENGTH]; static char* myRead=NULL; static char* myWrite=NULL; static int out_channels=1; static int my_stream_could_start=0; +static int wave_samplerate; static int mInCallbackFinishedState = false; #if (USE_PORTAUDIO == 18) @@ -168,89 +169,89 @@ static int pa_callback(void *inputBuffer, void *outputBuffer, PaStreamCallbackFlags flags, void *userData ) #endif { - int aResult=0; // paContinue - char* aWrite = myWrite; - size_t n = out_channels*sizeof(uint16_t)*framesPerBuffer; + int aResult=0; // paContinue + char* aWrite = myWrite; + size_t n = out_channels*sizeof(uint16_t)*framesPerBuffer; - myReadPosition += framesPerBuffer; - SHOW("pa_callback > myReadPosition=%u, framesPerBuffer=%lu (n=0x%x) \n",(int)myReadPosition, framesPerBuffer, n); + myReadPosition += framesPerBuffer; + SHOW("pa_callback > myReadPosition=%u, framesPerBuffer=%lu (n=0x%x) \n",(int)myReadPosition, framesPerBuffer, n); - if (aWrite >= myRead) - { - if((size_t)(aWrite - myRead) >= n) + if (aWrite >= myRead) { - memcpy(outputBuffer, myRead, n); - myRead += n; + if((size_t)(aWrite - myRead) >= n) + { + memcpy(outputBuffer, myRead, n); + myRead += n; + } + else + { + SHOW_TIME("pa_callback > underflow"); + aResult=1; // paComplete; + mInCallbackFinishedState = true; + size_t aUsedMem=0; + aUsedMem = (size_t)(aWrite - myRead); + if (aUsedMem) + { + memcpy(outputBuffer, myRead, aUsedMem); + } + char* p = (char*)outputBuffer + aUsedMem; + memset(p, 0, n - aUsedMem); + // myReadPosition += aUsedMem/(out_channels*sizeof(uint16_t)); + myRead = aWrite; + } } - else + else // myRead > aWrite { - SHOW_TIME("pa_callback > underflow"); - aResult=1; // paComplete; - mInCallbackFinishedState = true; - size_t aUsedMem=0; - aUsedMem = (size_t)(aWrite - myRead); - if (aUsedMem) - { - memcpy(outputBuffer, myRead, aUsedMem); - } - char* p = (char*)outputBuffer + aUsedMem; - memset(p, 0, n - aUsedMem); - // myReadPosition += aUsedMem/(out_channels*sizeof(uint16_t)); - myRead = aWrite; - } - } - else // myRead > aWrite - { - if ((size_t)(myBuffer + BUFFER_LENGTH - myRead) >= n) - { - memcpy(outputBuffer, myRead, n); - myRead += n; - } - else if ((size_t)(aWrite + BUFFER_LENGTH - myRead) >= n) - { - int aTopMem = myBuffer + BUFFER_LENGTH - myRead; - if (aTopMem) - { - SHOW("pa_callback > myRead=0x%x, aTopMem=0x%x\n",(int)myRead, (int)aTopMem); - memcpy(outputBuffer, myRead, aTopMem); - } - int aRest = n - aTopMem; - if (aRest) - { - SHOW("pa_callback > myRead=0x%x, aRest=0x%x\n",(int)myRead, (int)aRest); - char* p = (char*)outputBuffer + aTopMem; - memcpy(p, myBuffer, aRest); - } - myRead = myBuffer + aRest; - } - else - { - SHOW_TIME("pa_callback > underflow"); - aResult=1; // paComplete; + if ((size_t)(myBuffer + BUFFER_LENGTH - myRead) >= n) + { + memcpy(outputBuffer, myRead, n); + myRead += n; + } + else if ((size_t)(aWrite + BUFFER_LENGTH - myRead) >= n) + { + int aTopMem = myBuffer + BUFFER_LENGTH - myRead; + if (aTopMem) + { + SHOW("pa_callback > myRead=0x%x, aTopMem=0x%x\n",(int)myRead, (int)aTopMem); + memcpy(outputBuffer, myRead, aTopMem); + } + int aRest = n - aTopMem; + if (aRest) + { + SHOW("pa_callback > myRead=0x%x, aRest=0x%x\n",(int)myRead, (int)aRest); + char* p = (char*)outputBuffer + aTopMem; + memcpy(p, myBuffer, aRest); + } + myRead = myBuffer + aRest; + } + else + { + SHOW_TIME("pa_callback > underflow"); + aResult=1; // paComplete; - int aTopMem = myBuffer + BUFFER_LENGTH - myRead; - if (aTopMem) - { - SHOW("pa_callback > myRead=0x%x, aTopMem=0x%x\n",(int)myRead, (int)aTopMem); - memcpy(outputBuffer, myRead, aTopMem); - } - int aRest = aWrite - myBuffer; - if (aRest) - { - SHOW("pa_callback > myRead=0x%x, aRest=0x%x\n",(int)myRead, (int)aRest); - char* p = (char*)outputBuffer + aTopMem; - memcpy(p, myBuffer, aRest); - } + int aTopMem = myBuffer + BUFFER_LENGTH - myRead; + if (aTopMem) + { + SHOW("pa_callback > myRead=0x%x, aTopMem=0x%x\n",(int)myRead, (int)aTopMem); + memcpy(outputBuffer, myRead, aTopMem); + } + int aRest = aWrite - myBuffer; + if (aRest) + { + SHOW("pa_callback > myRead=0x%x, aRest=0x%x\n",(int)myRead, (int)aRest); + char* p = (char*)outputBuffer + aTopMem; + memcpy(p, myBuffer, aRest); + } - size_t aUsedMem = aTopMem + aRest; - char* p = (char*)outputBuffer + aUsedMem; - memset(p, 0, n - aUsedMem); - // myReadPosition += aUsedMem/(out_channels*sizeof(uint16_t)); - myRead = aWrite; + size_t aUsedMem = aTopMem + aRest; + char* p = (char*)outputBuffer + aUsedMem; + memset(p, 0, n - aUsedMem); + // myReadPosition += aUsedMem/(out_channels*sizeof(uint16_t)); + myRead = aWrite; + } } - } - SHOW("pa_callback > myRead=%x\n",(int)myRead); + SHOW("pa_callback > myRead=%x\n",(int)myRead); // #if USE_PORTAUDIO == 18 @@ -288,7 +289,7 @@ static int pa_callback(void *inputBuffer, void *outputBuffer, #endif - return(aResult); + return(aResult); //#endif } // end of WaveCallBack @@ -335,7 +336,7 @@ static int wave_open_sound() out_channels = 1; #if USE_PORTAUDIO == 18 - // err = Pa_OpenDefaultStream(&pa_stream,0,1,paInt16,SAMPLE_RATE,FRAMES_PER_BUFFER,N_WAV_BUF,pa_callback,(void *)userdata); + // err = Pa_OpenDefaultStream(&pa_stream,0,1,paInt16,wave_samplerate,FRAMES_PER_BUFFER,N_WAV_BUF,pa_callback,(void *)userdata); PaDeviceID playbackDevice = Pa_GetDefaultOutputDeviceID(); @@ -351,7 +352,7 @@ static int wave_open_sound() paInt16, NULL, /* general parameters */ - SAMPLE_RATE, FRAMES_PER_BUFFER, 0, + wave_samplerate, FRAMES_PER_BUFFER, 0, //paClipOff | paDitherOff, paNoFlag, pa_callback, (void *)userdata); @@ -376,12 +377,12 @@ static int wave_open_sound() paInt16, NULL, /* general parameters */ - SAMPLE_RATE, FRAMES_PER_BUFFER, 0, + wave_samplerate, FRAMES_PER_BUFFER, 0, //paClipOff | paDitherOff, paNoFlag, pa_callback, (void *)userdata); // err = Pa_OpenDefaultStream(&pa_stream,0,2,paInt16, -// SAMPLE_RATE, +// wave_samplerate, // FRAMES_PER_BUFFER, // N_WAV_BUF,pa_callback,(void *)userdata); SHOW("wave_open_sound > Pa_OpenDefaultStream(2): err=%d (%s)\n",err, Pa_GetErrorText(err)); @@ -395,7 +396,7 @@ static int wave_open_sound() &pa_stream, NULL, /* no input */ &myOutputParameters, - SAMPLE_RATE, + wave_samplerate, framesPerBuffer, paNoFlag, // paClipOff | paDitherOff, @@ -410,7 +411,7 @@ static int wave_open_sound() &pa_stream, NULL, /* no input */ &myOutputParameters, - SAMPLE_RATE, + wave_samplerate, framesPerBuffer, paNoFlag, // paClipOff | paDitherOff, @@ -427,14 +428,14 @@ static int wave_open_sound() &pa_stream, NULL, /* no input */ &myOutputParameters, - SAMPLE_RATE, + wave_samplerate, framesPerBuffer, paNoFlag, // paClipOff | paDitherOff, pa_callback, (void *)userdata); - // err = Pa_OpenDefaultStream(&pa_stream,0,2,paInt16,(double)SAMPLE_RATE,FRAMES_PER_BUFFER,pa_callback,(void *)userdata); + // err = Pa_OpenDefaultStream(&pa_stream,0,2,paInt16,(double)wave_samplerate,FRAMES_PER_BUFFER,pa_callback,(void *)userdata); } mInCallbackFinishedState = false; #endif @@ -526,7 +527,7 @@ static void select_device(const char* the_api) defaultAlsaIndex = hostInfo->defaultOutputDevice; const PaDeviceInfo *deviceInfo = Pa_GetDeviceInfo( defaultAlsaIndex ); update_output_parameters(defaultAlsaIndex, deviceInfo); - if (Pa_IsFormatSupported(NULL, &myOutputParameters, SAMPLE_RATE) == 0) + if (Pa_IsFormatSupported(NULL, &myOutputParameters, wave_samplerate) == 0) { SHOW( "select_device > ALSA (default), name=%s (#%d)\n", deviceInfo->name, defaultAlsaIndex); selectedIndex = defaultAlsaIndex; @@ -541,7 +542,7 @@ static void select_device(const char* the_api) update_output_parameters(i, deviceInfo); - if (Pa_IsFormatSupported(NULL, &myOutputParameters, SAMPLE_RATE) == 0) + if (Pa_IsFormatSupported(NULL, &myOutputParameters, wave_samplerate) == 0) { SHOW( "select_device > ALSA, name=%s (#%d)\n", deviceInfo->name, i); @@ -613,12 +614,13 @@ void wave_set_callback_is_output_enabled(t_wave_callback* cb) // //samplerate,out_ptr); +// WVoiceChanged(wvoice); } @@ -1797,11 +1801,6 @@ int WavegenFill(int fill_zeros) static int resume=0; static int echo_complete=0; -#ifdef TEST_MBROLA - if(mbrola_name[0] != 0) - return(MbrolaFill(fill_zeros)); -#endif - while(out_ptr < out_end) { if(WcmdqUsed() <= 0) @@ -1904,6 +1903,10 @@ int WavegenFill(int fill_zeros) case WCMD_EMBEDDED: SetEmbedded(q[1],q[2]); break; + + case WCMD_MBROLA_DATA: + result = MbrolaFill(length, resume); + break; } if(result==0)