From 9099061844b222553e5932d59cc8a5725bf226f7 Mon Sep 17 00:00:00 2001 From: jonsd Date: Sun, 6 May 2007 23:58:57 +0000 Subject: [PATCH] Fix samplerate for ufric/xx, ufric/sx_sv, x/g2. Don't read all the voice files on start, wait until they are needed. Added 'W' code to _rules files to mean: further letters follow while spelling a word. Lang=fr replace [r] with [R], shorten [R] slightly git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@4 d46cf337-b52f-0410-862d-fd96e6ae7743 --- dictsource/en_list | 3 + dictsource/en_rules | 6 + dictsource/fr_list | 269 ++++++++++++++-------------- dictsource/fr_rules | 8 +- dictsource/pt_list | 65 ++++--- dictsource/pt_rules | 150 ++++++++-------- phsource/ufric/sx_sv.wav | Bin 8504 -> 4274 bytes phsource/ufric/xx.wav | Bin 5484 -> 5494 bytes phsource/vnasal/o_n3 | Bin 0 -> 7280 bytes phsource/vnasal/vowelchart.png | Bin 19947 -> 20108 bytes phsource/vwl_fr/@R | Bin 1318 -> 1318 bytes phsource/vwl_fr/@R2 | Bin 1319 -> 1319 bytes phsource/x/g2.wav | Bin 1324 -> 1326 bytes src/compiledict.cpp | 3 + src/numbers.cpp | 7 +- src/readclause.cpp | 4 +- src/synthdata.cpp | 2 +- src/translate.h | 2 +- src/voices.cpp | 318 ++++++++++++++++++--------------- 19 files changed, 455 insertions(+), 382 deletions(-) create mode 100644 phsource/vnasal/o_n3 diff --git a/dictsource/en_list b/dictsource/en_list index 78ddf5e9..a0c117eb 100644 --- a/dictsource/en_list +++ b/dictsource/en_list @@ -1190,9 +1190,11 @@ monotone m0n@toUn monsieur m@sj3: ?5 monsieur m@sjVR mony mVnI2 // monies, monied +moped moUpEd moraine m@reIn morale m@ral morass m0r'as +morose m@r'oUs mosquito m0sk'i:toU motel moUt'El motif moUt'i:f @@ -1895,6 +1897,7 @@ zulu zu:lu: Altrincham O:ltrIN@m Anglesey aNg@LsI2 Argyle A@g'aIl +Argyll A@g;aIl Bacup beIk@p Berwick bErIk Betws bEtUs diff --git a/dictsource/en_rules b/dictsource/en_rules index 00a580db..48ad09e9 100644 --- a/dictsource/en_rules +++ b/dictsource/en_rules @@ -1280,6 +1280,7 @@ ch (ord k an) ch (or k o) ch (_ k + oo) ch (_ tS _ta) ch k ta) ch tS sta) ch S @@ -1605,6 +1606,7 @@ acB) e (_ I2 e (Cic_ E e (Cical 'E + e (Cium i: t) ech (_ Ek m) e (chanic I @@) eble (_ @b@L @@ -1860,6 +1862,7 @@ eir e@ w) eir i@ l) ei (s E + th) ei (sC i:I _s) eis (m aIz f) ei (t_ I ei (th aI @@ -3211,6 +3214,7 @@ _) mobile moUbaIl im) mobile moUbaIl mobile m@bi:l + mono (ga m@n'0 mo (noto m@ _) mono m0noU mon (opol m@n @@ -3503,6 +3507,8 @@ _id) ol (a 0l petr) ol (_ @L s) ol (em 0l + s) ol (ic @l + s) ol (il @l t) ol (er 0l m) ol (ec @l m) ol (ecule 0l diff --git a/dictsource/fr_list b/dictsource/fr_list index 3cd4d0c8..c7e26130 100755 --- a/dictsource/fr_list +++ b/dictsource/fr_list @@ -12,23 +12,23 @@ // "letter" name, then include the letter name here, with the letter // prefixed by a _ character. -_à a:aksA~grav -â a:aksA~sirkO~flEks -ä a:trema +_à a:aksA~gRav +â a:aksA~siRkO~flEks +ä a:tRema ç sesedij -ë @:trema +ë @:tRema é @:aksA~Egy -è @:aksA~grav -ê @:aksA~sirkO~flEks -ï i:trema -ë @:trema +è @:aksA~gRav +ê @:aksA~siRkO~flEks +ï i:tRema +ë @:tRema ñ Entilde -ô o:aksA~sirkO~flEks -ö o:trema -ù u:aksA~grav -û u:aksA~sirkO~flEks -ü u:trema -_y i:gr'Ek +ô o:aksA~siRkO~flEks +ö o:tRema +ù u:aksA~gRav +û u:aksA~siRkO~flEks +ü u:tRema +_y i:gR'Ek @@ -41,57 +41,57 @@ _?? sE~b'OL ! Eksklamassj'O~ _" gijm'E _# dj'Ez -_$ dOl'ar -_% purs'A~ +_$ dOl'aR +_% puRs'A~ _& e -_' apOstr'Of -_( 'uvr@-parA~t'Ez -_) f'Erm parA~t'Ez -_* astErisk: +_' apOstR'Of +_( 'uvR@-paRA~t'Ez +_) f'ERm paRA~t'Ez +_* astERisk: _+ plys -_, virg'yl -_- tir'E +_, viRg'yl +_- tiR'E _. pw'E~ _/ sl'aS _: d'Ypw'E~ -_; pw'E~virg'yl -_< E~ferj'Wr +_; pw'E~viRg'yl +_< E~feRj'WR _= eg'al -_> syperj'Wr +_> sypeRj'WR _? kEstj'O~ _@ at -_[ uvr@-_kroS'E +_[ uvR@-_kRoS'E _\ b'aksl'aS -_] f'Erm_kroS'E -_^ sirkOnfl'Eks +_] f'ERm_kRoS'E +_^ siRkOnfl'Eks __ sulin^'e -_` aks'A~_gr'av -_{ uvr_akOl'ad -_| b'ar -_} f'Erm_akOl'ad +_` aks'A~_gR'av +_{ uvR_akOl'ad +_| b'aR +_} f'ERm_akOl'ad _~ tild'e _¢ sEnt _¥ i;'En -_£ l'ivr -_° d@gr'e +_£ l'ivR +_° d@gR'e _± pl'yz_'u_mw'E~ -_× myltip@-lj'e_p'ar -_÷ diviz'e_p'ar -_¼ W~_k'ar +_× myltip@-lj'e_p'aR +_÷ diviz'e_p'aR +_¼ W~_k'aR _½ W~_d@m'i -_¾ trw'a k'ar -_© _^_k'0pIr,aIt_^_ -_® r@Zistr'@d_m'ark +_¾ tRw'a k'aR +_© _^_k'0pIR,aIt_^_ +_® R@ZistR'@d_m'aRk // numeric -_0 zer'o +_0 zeR'o _1 W~ _2 d'Y -_3 trw'a -_4 k'atr +_3 tRw'a +_4 k'atR _5 s'E~c _6 s'is six siz2 @@ -102,8 +102,8 @@ _10 d'is dix diz2 _11 O~z _12 d'uz -_13 tr'Ez -_14 kat'Orz +_13 tR'Ez +_14 kat'ORz _15 k'E~z _16 s'Ez _17 d'is:'Et @@ -112,17 +112,17 @@ _19 d'is:n'@f _20 v'E~ _21 v'E~te:E~ _22 v'E~td'Y -_23 v'E~t:trw'a -_24 v'E~tk'atr +_23 v'E~t:tRw'a +_24 v'E~tk'atR _25 v'E~ts'E~c _26 v'E~ts'is _27 v'E~ts'Et _28 v'E~tw^it _29 v'E~tn'@f -_3X tr'A~t -_31 tr'A~te:E~ -_4X kar'A~t -_41 kar'A~te:E~ +_3X tR'A~t +_31 tR'A~te:E~ +_4X kaR'A~t +_41 kaR'A~te:E~ _5X sE~k'A~t _51 sE~k'A~te:E~ _6X swas'A~t @@ -130,31 +130,31 @@ _61 swas'A~te:E~ _7X swas'A~t:d'is _71 swas'A~te:O~z _72 swas'A~t:d'uz -_73 swas'A~t:tr'Ez -_74 swas'A~t:kat'Orz +_73 swas'A~t:tR'Ez +_74 swas'A~t:kat'ORz _75 swas'A~t:k'E~z _76 swas'A~t:s'Ez _77 swas'A~t:d'is:'Et _78 swas'A~t:d'is:'w^it _79 swas'A~t:d'is:n'@f -_8X k'atr@v'E~ -_80 k'atr@v'E~z2 -_9X k'atr@v'E~d'is -_91 k'atr@v'E~:O~z -_92 k'atr@v'E~:d'uz -_93 k'atr@v'E~:tr'Ez -_94 k'atr@v'E~:kat'Orz -_95 k'atr@v'E~:k'E~z -_96 k'atr@v'E~:s'Ez -_97 k'atr@v'E~:d'is:'Et -_98 k'atr@v'E~:d'is:'w^it -_99 k'atr@v'E~:d'is:n'@f +_8X k'atR@v'E~ +_80 k'atR@v'E~z2 +_9X k'atR@v'E~d'is +_91 k'atR@v'E~:O~z +_92 k'atR@v'E~:d'uz +_93 k'atR@v'E~:tR'Ez +_94 k'atR@v'E~:kat'ORz +_95 k'atR@v'E~:k'E~z +_96 k'atR@v'E~:s'Ez +_97 k'atR@v'E~:d'is:'Et +_98 k'atR@v'E~:d'is:'w^it +_99 k'atR@v'E~:d'is:n'@f _0C s'A~ _1C0 s'A~t2 _0M1 m'il _1M1 m'il _0M2 milj'O~ -_0M3 milj'ar +_0M3 milj'aR _0and e _dpt pw'E~ @@ -167,9 +167,9 @@ abc 'a b'e s'e ac 'a s'e api 'a p'e 'i cio s'e'i;'o -ctrl kO~tr'ol -dept depart@m'A~ -etc etseter'a +ctrl kO~tR'ol +dept depaRt@m'A~ +etc etseteR'a hmm h@m ibm 'i:b'e:'Em ip 'i:p'e @@ -179,31 +179,30 @@ mbrola Em'bRola mlle mad@mwaz'El mme mad'am mr m@sj'Y -p.s pOstkript'Om -ratp 'Er:'a:t'e:p'e +p.s pOstkRipt'Om +ratp 'ER:'a:t'e:p'e s.t.p s'il:t'@:pl'E s.v.p s'il:v'u:pl'E st s'E~ ste s'E~t stp s'il:t'@:pl'E svp s'il:v'u:pl'E -url 'y:'Er:'El +url 'y:'ER:'El usb 'y:'Es:'be utf y:te:Ef xfce iksEfse@ -xy 'iks:igr'Ek +xy 'iks:igR'Ek ii d'Y $abbrev // roman numerals -iii trw'a $abbrev -iv k'atr $abbrev +iii tRw'a $abbrev +iv k'atR $abbrev -dr dOkt'Wr $dot $capital +dr dOkt'WR $dot $capital prof $dot -// numbers // articles le $u $nounf @@ -348,8 +347,8 @@ tout $u // Letters which can be words //=========================== -à a:aksA~grav $atend -y i:gr'Ek $atend +à a:aksA~gRav $atend +y i:gR'Ek $atend @@ -357,15 +356,15 @@ y i:gr'Ek $atend scient si bénéficient benefisi $verb -président prezidA~t2 -président prezidt2 $verb +président pRezidA~t2 +président pRezidt2 $verb // MAIN WORD DICTIONARY //********************* -monsieur m@sjY // monsieur -montréal mO~real // Montréal +monsieur m@sjY +montréal mO~Real (il y a) ili;a $u (il y) ili $u (n'est ce pas) nEspa @@ -385,7 +384,7 @@ montréal mO~real // Montréal bus bys echo Eko fils fis -mars mars +mars maRs pays pEi sens sA~s c'est sEt2 $u @@ -403,45 +402,43 @@ open OpEn espeak ispik nvda $abbrev outlook autluk -reader Rid'Wr -potentiomètre pOtA~sjOmEtr +reader Rid'WR +potentiomètre pOtA~sjOmEtR processus pROsEsys // ut (t is said) août ut azimut azim'yt -brut br'yt +brut bR'yt but by $verb but byt connecticut kOnEktikyt helmut Elmut mazout mazut out aut -rut ryt -scorbut skOrbyt +rut Ryt +scorbut skORbyt scout skut scouts skut stout staut -uppercut ypErkyt +uppercut ypERkyt ut yt zut syt // et (t is said) -//Downing_street -//Dun_and_Bradstreet bridget bRidZEt exocet EgzOsEt fret fR'Et gadget gadZEt hamlet amlEt -internet E~tErnEt +internet E~tERnEt jacket ZakEt knesset knEsEt -lazaret lazarEt -margaret margarEt +lazaret lazaREt +margaret maRgaREt net nEt offset OfsEt pickpocket pikpOkEt @@ -453,38 +450,38 @@ soviet sOvjEt // ct (ct are not said) aspect aspE aspects aspE -circonspect circO~spE -irrespect irEspE -prospect prOspE -respect rEspE +circonspect ciRcO~spE +irrespect iREspE +prospect pROspE +respect REspE suspect syspE // st (t is not said) -prévost prevo +prévost pRevo // urt (t is said) -kurt kurt -yaourt jaurt -yoghourt yogurt -yogourt yogurt +kurt kuRt +yaourt jauRt +yoghourt yoguRt +yogourt yoguRt // ort (t said) -short SOrt +short SORt // art (t said) -stewart stiwart -steward stiwart -stuttgart Stutgart -hart art -kart kart -smart smart +stewart stiwaRt +steward stiwaRt +stuttgart StutgaRt +hart aRt +kart kaRt +smart smaRt // irt -flirt fl@rt -(sweat shirt) swEtS@rt -tee-shirt tiS@rt +flirt fl@Rt +(sweat shirt) swEtS@Rt +tee-shirt tiS@Rt -parfum parfW~ +parfum paRfW~ forum fOR@m // words from other languages @@ -520,9 +517,9 @@ yacht jot // tions (tjO~ instead of sjO~) achetions aS@tjO~z2 ajoutions aZutjO~z2 -apportions apOrtjO~z2 -apprêtions aprEtjO~z2 -arrêtions arEtjO~z2 +apportions apORtjO~z2 +apprêtions apREtjO~z2 +arrêtions aREtjO~z2 assistions asistjO~ bastions bastjO~z2 battions batjO~z2 @@ -538,39 +535,39 @@ digestions diZEstjO~z2 discutions diskytjO~z2 doutions dutjO~z2 débutions debytjO~z2 -désertions dezErtjO~z2 +désertions dezERtjO~z2 détentions detA~tjO~z2 escomptions EskO~tjO~z2 existions EgzistjO~z2 exploitions EksplwatjO~z2 -exportions EkspOrtjO~z2 +exportions EkspORtjO~z2 gestions ZEstjO~z2 habitions abitjO~z2 -heurtions @rtjO~z2 +heurtions @RtjO~z2 indigestions E~diZEstjO~z2 insistions E~sistjO~z2 jetions Z@tjO~z2 limitions limitjO~z2 manifestions manifEstjO~z2 -méritions meritjO~z2 -partions partjO~z2 -pressentions prEsA~tjO~z2 -présentions prezA~tjO~z2 -prêtions prEtjO~z2 +méritions meRitjO~z2 +partions paRtjO~z2 +pressentions pREsA~tjO~z2 +présentions pRezA~tjO~z2 +prêtions pREtjO~z2 quittions kitjO~z2 -rations ratjO~z2 -redoutions r@dutjO~z2 -regrettions r@grEtjO~z2 -représentions r@prezA~tjO~z2 -respections rEspEktjO~z2 -ressentions r@sA~tjO~z2 -restions rEstjO~z2 -répétions repetjO~z2 +rations RatjO~z2 +redoutions R@dutjO~z2 +regrettions R@gREtjO~z2 +représentions R@pRezA~tjO~z2 +respections REspEktjO~z2 +ressentions R@sA~tjO~z2 +restions REstjO~z2 +répétions RepetjO~z2 sentions sA~tjO~z2 -sortions sOrtjO~z2 +sortions sORtjO~z2 souhaitions suEtjO~z2 soumettions sumEtjO~z2 -supportions sypOrtjO~z2 +supportions sypORtjO~z2 tentions tA~tjO~z2 traitions tREtjO~z2 votions vOtjO~z2 $u diff --git a/dictsource/fr_rules b/dictsource/fr_rules index 9642ca84..7a10c6e0 100755 --- a/dictsource/fr_rules +++ b/dictsource/fr_rules @@ -248,8 +248,8 @@ _r) e (stru @ // restructurer -) est (_ Est // -est - Cr) es (_C @ - rC) es (_C @ // fortes dames + @Cr) es (_C =@ + rC) es (_C =@ // fortes dames ') eu (_ y // eu eu (r_ W // peur @@ -278,8 +278,8 @@ _CC) e (_ @ _qu) e (_ @ // que - Cr) e (_C @ // quatre pattes - rC) e (_C @ + @Cr) e (_C =@ // quatre pattes + rC) e (_C =@ e (_ // montre diff --git a/dictsource/pt_list b/dictsource/pt_list index f2087c1b..5ce9a12f 100755 --- a/dictsource/pt_list +++ b/dictsource/pt_list @@ -34,23 +34,28 @@ _?? s'imbolu _. p'oNtu _! ,eskl&mas'&U~ -_" 'asp&s -_# k,ardZin'aU +?1 _" 'asp&S +?2 _" 'asp&s +?1 _# k,ardin'al +?2 _# k,ardZin'aU _$ s,if@-*'&U~ _% pors'eINtu _& 'e -_' ap'Ost@-*,ofu +?1 _' ap'Ost@-*,ofy +?2 _' ap'Ost@-*,ofu _( ,ab@-*ipa*'eINtezi _) f,ES&pa*'eINtezi _* ,aste*'isku -_+ m'aIs +?1 _+ m'aIS +?2 _+ m'aIs _, v'irgul& _- 'ifeIN _/ b'aQ& _: d,oIsp'oNtus _; p,oNtu_iv'irgul& _< men'Or -_= igw'aU +?1 _= igw'al +?2 _= igw'aU _> maI'Or _? ,iNtex,ogas'&U~ _@ ax'ob& @@ -61,12 +66,15 @@ _^ s,irkuNfl'Eksu __ s,ublin^'adu _` g@-*'avi _{ ,ab@-*iS'avi -_| b,ax&v,ertSik'aU +?1 _| b,ax&v,ertSik'al +?2 _| b,ax&v,ertSik'aU _} f,ES&S'avi -_~ tS'iU +?1 _~ t'il +?2 _~ tS'iU _¡ ,eskl&mas,&U~,iNvertS'id& _¿ ,iNtex,ogas,&U~,iNvertS'id& -_" 'ab@-*i;'asp&z d'upl&s +?1 _" 'ab@-*i;'asp&S d'upl&S +?2 _" 'ab@-*i;'asp&z d'upl&s // numeric @@ -155,10 +163,25 @@ _0Z3 mil'Ezim& // 1000ths // ABBREVIATIONS //************** -(http ://) ag,atete'pe_ -a.c ,as'e +abadv $abbrev +a.c 'as'e +adsl $abbrev +apedv $abbrev +?1 apedv ,a,pe,,E,de've +bios b'i,OS d.c d,es'e -etc ,ets'Ete*& +cpu $abbrev +//?1 cpu ,se,pe'u +?1 cpuc ,se,pe,u'se +edp $abbrev +?1 etc ,ets'Et:r& +?2 etc ,ets'Ete*& +?2 (http ://) ag,atete'pe_ +nvda $abbrev +unts $abbrev +unts $abbrev +?1 usb ,u,Esy'be +?2 usb $abbrev // articles @@ -516,7 +539,7 @@ era 'Er& abacaxi abakaSi axé aSE elixir eliSir -?1fixe fiSe +?1 fixe fiSe lixo l'iSu roxo x'oSu @@ -524,9 +547,9 @@ roxo x'oSu ?1 alt 'alt ?1 bacalhau b,&k&lj'aU ?1 caps k'aps -?1 ctrl k'oNt:r'Ol + ctrl k'oNt:r,Ol ?1 delete dil'i:t -?1 design diz'aIn //? In Brasilian Portuguese +?1 design diz'aIn ?1 down d'aUn ?1 download d'aUnloUd ?1 escape Sk'eIpy @@ -541,8 +564,7 @@ layout l'eI,aUt ?1 mail meIl ?2 mail m'eja ?1 menu mEnU -?1 num _^_EN -?1 ok Ok'eI + ok Ok'eI ?1 pause p'au:z ?1 page p'eIdZ ?1 scroll _^_EN @@ -562,18 +584,20 @@ alan 'al@n ?1 access 'aksEs debian d'Ebj&~N espeak isp'i:k -speak spi:k +espeakedit isp'i:k,Ed,it firefox f'ai@foks ?1 hal hal ?1 jaws dZ'au:z -?1 linux l'inUks +?1 linux l,in'uks ?2 linux l'inuks openoffice 'opeIN|'Ofis -?1 reader r'i:d&@ +?1 reader _^_EN slackware sl'akwe@ +speak spi:k suse z'u:ts@ ubuntu ub'untu -unix j'u:niks +?1 unix ,u:n'iks +?2 unix j'u:niks ?1 windows _^_EN @@ -625,3 +649,4 @@ ronchi r'OnCi: vogel f'o:g@l volkmann f'Olkman + diff --git a/dictsource/pt_rules b/dictsource/pt_rules index a6ff94e6..0ce44a3c 100755 --- a/dictsource/pt_rules +++ b/dictsource/pt_rules @@ -13,6 +13,7 @@ .group a _) a (_ a + _) a (_W 'a // in an acronym a a &) a (_ =& // in final unstressed syllable &) a (s_ =& @@ -25,7 +26,7 @@ a (C_ & a (r_ 'a -?1 p) a (d_ =E +?1 p) a (d_ =E a (CC_ & ?1 al (_ 'al // eg: Portugal, capital, etc. ?2 al (K aU @@ -38,6 +39,7 @@ an (K &~N a (nhA &~ am (_ =&U~ +?1 a (z_ 'a //eg: paz, rapaz, capaz, etc... ai aI ai (s aI @@ -133,7 +135,7 @@ ?2 el (K EU ?2 elh elj -?1 e (rtA_ 'E // Eg: Alberto, aberta, etc... +?1 e (rtA_ 'E // Eg: Alberto, aberta, etc... em (C eIm en (K eIN enh en^ @@ -152,24 +154,26 @@ eu (s eU e (uCK e -?1 _) es (C@@ S // drop initial "e". -?1 _) e (f i // efectuar, etc. -?1 C) e (cC 'E // eg: seleccionar, efectuar, selecção, etc... -?1 C) e (ã i // leão, panteão, etc. -?1 C) e (a i // oceano, etc. -?1 _C) e (CACA =y //definições. -?1 _C) e (CCACAr =y // desligar. -?1 _C) e (CKAr =y // fechar -?1 _C) e (CCACAr =y // terminar. -?1 _C) e (CACC =y // recicla, reciclagem, etc... -?1 _f) e (rrament =y // ferramenta, ferramentas. -?1 hip) e (r ,E // eg: hiper -?1 sup) e (r ,E // super -?1 int) e (rC 'E // Interno -?1 int) e (rr E // Interno -?1 n) e (t ,E // eg: net - -?1 e (l_ ,E +?1 _) es (C@@ S // drop initial "e". +?1 _) e (f i // efectuar, etc. +?1 _n) e (nhu i // eg: nenhum, nenhuma, nenhuns, nenhumas. +?1 C) e (cC ,E // eg: seleccionar, efectuar, etc... +?1 C) ecç 'E's // eg: selecção, etc... +?1 C) e (ã i // leão, panteão, etc. +?1 C) e (a i // oceano, etc. +?1 _C) e (CACA y //definições. +?1 _C) e (CCACAr y // desligar. +?1 C) e (CCAC y // eg: deslocamento, etc... +?1 _C) e (CKAr y // fechar +?1 _C) e (CCACAr y // terminar. +?1 _C) e (CACC y // recicla, reciclagem, etc... +?1 _f) e (rrament y // ferramenta, ferramentas. +?1 hip) e (r ,E // eg: hiper +?1 sup) e (r ,E // super +?1 int) e (rC 'E // Interno +?1 int) e (rr E // eg: Enterra +?1 n) e (t ,E // eg: net +?1 e (l_ ,E // eg: possível, manuel, etc... .group é @@ -197,8 +201,8 @@ .group f -?1 _) f (_ Ef; // individual letter -?1 _) f (__ Ef // individual letter at end-of-word +?1 _) f (_W Ef; // within an acronym +?1 _) f (_ Ef // individual letter or end-of-acronym _) f (_ 'Efe f f f (f @@ -206,6 +210,7 @@ .group g ?1 _) g (_ ge +?1 _) g (_W Ze // within an acronym _) g (_ Ze g g g (g @@ -216,7 +221,8 @@ .group h - _) h (_ ag'a +?1 _) h (_ &g'a +?2 _) h (_ ag'a h // silent @@ -262,8 +268,8 @@ úC) i (A_ j úCC) i (A_ j -?1 @) ing (_ _^_EN -?1 @) ings (_ _^_EN +?1 @) ing (_ _^_EN +?1 @) ings (_ _^_EN .group í @@ -282,14 +288,14 @@ .group k ?1 _) k (_ k'ap& -?2 _) k (_ ka +?2 _) k (_ ka k k k (k .group l -?1 _) l (_ El; // individual letter -?1 _) l (__ El // individual letter at end-of-word +?1 _) l (_W El; // within an acronym +?1 _) l (_ El _) l (_ 'Ele l l l (l @@ -299,16 +305,16 @@ .group m -?1 _) m (_ Em; -?1 _) m (__ Em +?1 _) m (_W 'Em; +?1 _) m (_ Em _) m (_ 'eme m m m (m .group n -?1 _) n (_ En; -?1 _) n (__ En +?1 _) n (_W 'En +?1 _) n (_ En _) n (_ 'ene n n n (n @@ -327,37 +333,33 @@ oi (s oI o (iCK o oo u -?1 v) oo (_ ow +?1 C) oo (_ ow // eg: voo, enjoo, etc... oy OI o (Ca_ O -?1 o (Cá_ 'O -?1 o (Cé_ 'O -?1 o (Cí_ 'O -?1 o (Có_ 'O -?1 o (Cú_ 'O ?1 ol (_ Ol ?2 ol (K Ow ?2 olh olj -?1 om (_ 'om -?2 om (_ oN +?1 om (_ 'om +?2 om (_ oN o (ma_ o -?1 om (C 'om -?2 om (C om +?1 om (C 'om +?2 om (C om on (K oN o (na_ o onh on^ o (rmA_ O o (rmAC O -?1 oz (_ OS -?2 oz (_ Oz +?1 oz (_ OS +?2 oz (_ Oz o (zes_ O o (ra_ O o (ras_ O -?1 _C) o (CACACC =u // Documento, documentação, etc. -?1 _C) o (CCAC =u // formatar, formato. +?1 _) o (C O // eg: olá, orla, opção, etc... +?1 _C) o (CACACC u // Documento, documentação, etc. +?1 C) o (CCAC u // formatar, formato. .group ô @@ -415,18 +417,18 @@ .group r -?1 _) r (_ 'Err; // individual letter -?1 _) r (__ 'Err // individual letter at end-of-word +?1 _) r (_W 'Err; // within an acronym +?1 _) r (_ 'Err _) r (_ 'Exe _) r (_\$ xe'aU // currency r r -?1 A) r (A :r -?2 A) r (A * -?1 A) r (_A :r -?2 A) r (_A * +?1 A) r (A :r +?2 A) r (A * +?1 A) r (_A :r +?2 A) r (_A * rr x -?1 C) r (A :r -?2 C) r (A @-* +?1 C) r (A :r +?2 C) r (A @-* _) r x l) r x n) r x @@ -435,18 +437,18 @@ .group s -?1 _) s (_ 'Ess|; [s]+[;] not [s;] phoneme -?1 _) s (__ 'Ess - _) s (_ 'Ese +?1 _) s (_W 'Es|; within an acronym [s]+[;] not [s;] phoneme +?1 _) s (_ 'Es +?2 _) s (_ 'Ese s s ss s sc (Y s sç s A) s (A z -?1 s (_ S -?2 s (_ s - s (_A z // next word starts with vowel - s (_G z // next word starts with voiced consonant +?1 @) s (_ S +?2 @) s (_ s + @) s (_A z // next word starts with vowel + @) s (_G z // next word starts with voiced consonant A) s (_S1 s A) s (_AS1 z // next word starts with vowel @@ -466,8 +468,8 @@ ?2 t (i tS ?2 t (í tS ?2 t (e_ tS -?1 th _^_EN -?1 tion (_ _^_EN +?1 th _^_EN +?1 tion (_ _^_EN .group u @@ -507,14 +509,15 @@ .group w - _) w (_ d'ablju +?1 _) w (_ d'&bl,iu +?2 _) w (_ d'ablju w w -?1 w (_ _^_EN +?1 w (_ _^_EN .group x -?1 _) x (_ SiS -?2 _) x (_ Sis +?1 _) x (_ SiS +?2 _) x (_ Sis x (A S A) x (A ks e) x (A z @@ -532,7 +535,8 @@ .group y - _) y (_ 'ipsiloN +?1 _) y (_ 'ipsil,ON +?2 _) y (_ 'ipsiloN y i y (A j @@ -541,16 +545,17 @@ _) z (_ ze z z z (z -?1 z (_ S -?2 z (_ s - z (_A z - z (_G z +?1 @) z (_ S +?2 @) z (_ s + @) z (_A z + @) z (_G z ?1 A) z (C S ?1 A) z (G+ Z ?1 A) z (_C S ?1 A) z (_G+ Z + .group ç s _) ç (_ s'esed'il^& @@ -600,3 +605,4 @@ + diff --git a/phsource/ufric/sx_sv.wav b/phsource/ufric/sx_sv.wav index f7b1f35029f41b6daeda2fc187dfb5ffb76a38da..0ce284dd920f5d581b108aa1ff6776f6b5445eec 100644 GIT binary patch literal 4274 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 literal 8504 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 aF}N0d2}&S&<#AKcQA=HAx6dZTef=LJU3QfK diff --git a/phsource/ufric/xx.wav b/phsource/ufric/xx.wav index 1961985697b13987c775bc840422abcd9f7e05f7..b4d8a751c0c9757e87c7a4aa7c6f47b31e166f90 100644 GIT binary patch literal 5494 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 kv3oV2-zn7Pp`0L1?et<8 diff --git a/phsource/vnasal/o_n3 b/phsource/vnasal/o_n3 new file mode 100644 index 0000000000000000000000000000000000000000..96c431e5166ac8af83afacc8fa3ea58e6a7b7953 GIT binary patch literal 7280 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 literal 0 HcmV?d00001 diff --git a/phsource/vnasal/vowelchart.png b/phsource/vnasal/vowelchart.png index d3964727bb11fe5a44cf12bce6b44b981bb7e2be..84f36af1c2a903fb380f9927d2ccc1fb2be0edd1 100644 GIT binary patch literal 20108 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

DAtYU^={*HQX)xzYt%wUy^QXP) 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≈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 delta 30 mcmZ3+wTx?mHWN$FMqOP-#uJ;P866l|Sb7*3HqU2jX956+pa?_& diff --git a/phsource/vwl_fr/@R2 b/phsource/vwl_fr/@R2 index 3f354338ba4c15fcc833ffde3b8065f937591509..5614f07c7eff17f958f9a067a3fa828457d587e4 100644 GIT binary patch delta 24 gcmZ3^wVZ21G$Z4d%`uD)j4aIW|Nq~-fT^7c0B#luM*si- delta 24 gcmZ3^wVZ21G$Z4Q%`uD)j4UiY3=EqWFtsxQ0AExF`v3p{ diff --git a/phsource/x/g2.wav b/phsource/x/g2.wav index 318c1f19caabefb1a7bc2074deb95f839b6b337b..9b10f839f994891428b847827bd231cbaa5b4174 100644 GIT binary patch literal 1326 zcmWMmYfu$b5dQXDd^V1Z8RMgTA|>Vv6`e_Kl!qoLg$iP0a*HWVO*4FuiD+p)(p1Jl zO*G9i=qe^U`9u*5(zr6I^paGfRECl;29&*FacJ}PY*^Rp~km<;_JM|r1r2Tb|^|QUqk|_Y&J9`$ZwNcX%VwNM* zSlpIX+%IkTka?UbdnL%Mkj)6^IwsSHB1GY3yoy=8fI>8Cv7Xm*Epio4xi0dthL5tP?DyZgB{DCeg)e;r@I0&bm?*i^40b8_>hB6YFvL9DCoC{EaB3{z(sCYs~;|Tgn zB`cZ6TAeAkO{SdX78))w13Z7?4L-~H?rkrUWPsElnbz(K+^~Z<4qjbp@3Ij4OpR>e zCQIwH$=D#pvdk1<7rV2H1sn}8YmqH0q_Zd+HB~FLnNP!_3>m!2U0lL1-5-^lpr!g2 zzt?yuW}uF9dERc+!~7asG0L$b6{+a0UOmJpDU@8vFpJGllkQ>{$t`?=k*LB$)S?e2 zYo?vxGNSoNf3?eT%+t{`(G1}vZHJRCx=N{K5^O#YF(F(ZSYgBLGu+N8LJik&^hZ4} zv&>f6g{Y8t9T%t$++bVA+Y{WNbM;ztJb%({LE%9^nyL8Qj+7XwHeJmKQ)lu#w>;-e zTZiOt{DD23XQlbXWOK8Q)!n?y$5Er9nrAb#rS`LH`IYS-fF0Gm-%ip(e&h)^P2#sR za2!USLKXWl$LtGg=}9*I@U5F>Ii?{5333Kg;l(Q&ivkWulb&V_57`K&Ge>vZ!FomO zS>%xO^BZlCvkZ}6T;4GRP%o+Ym!&v>ddG@$_#3mO1l^>K@uP|NHG{br#^db5J*?no z?1Msmo6{UZB}{a;-`46<{ZzADe`R_^J8>&pBL&Z6p~E}PG4D;J;XK+(iEMS)g_?De zU)lN1 z7~oE)!33mmrRM4#$Bj#NwvA$>n|F5xI}I;#OfAP9!_k|bT1thJkrwPv%DtYl?moaAIB zYvm*-t6NzsW38-_tRxx9%2+FFB}qoI(*3{px!338&-eY`_x+yt_q;v7B@%VlfIoie z`!)4wG*$sXY+d~hT>J|-RAA`-=zZ9o8+gtlySc$IMp20*GOV{fge@(VEk;_erBDdQ z{XARIp%j~~ZY!As^t!F_H9Qs;Kxm{Oq87Xqd zZw3>=jJ8?D8MN^ZQhrA}bxs4n>#x`#-O`G;TIZ_}W0VJaiM(uLz*WhzJm;cpX(JZ+ zMkeK^YnR6;<1%}Bfh_vbV{3rblEjI=)_vX97|xNU!!$-2MVhOu(Hfrddu-wm@A*zQ zw1MkE-U4B-YaXEzyNMY5qs!n&PVl%LmXhc{;7j57s|P232UEG^H5Sq z=mT`Q1^FZ~Y4R2RmM_yO4x)%PKVo+(O}#K1{Vh()EHc4DP^L==f}gmjJCJ$kHVIOigp^uiZ?UXOxZ z{jBleFev?39qenZp1G%P)|K-}t7R2AZ16ExQ3&^iKD!<47{!~Ivg(W=0ZuWeuNfE* z8Q!$BEx)4ASki+3VqaNSp@~;4=n9XF&MtBI2k%joZ}`APyh9$NX2Ufjql5!oNL;R? zgMqGMjDK0zyDat-w&7CinBk0dqS2}^`DLSVSbKTE2P%mrHrFpe@L*{QRvkwX+X zqgkyq=DS$bbM_-)5vLKiS{rQoJi)0saaH~{pT$v&RWxHm#-!eKpEjLKEb!EHd12?> zmSa*EZBB&w!4LZmHgk`atg>k^qJ!qxes=Pnw(2dLJZBu^Q~qE*n4vk9A5lU|D&)2) Mw_voice_name[0] != 0) - strcpy(voice_name, sp->voice_name); +// if(sp->voice_name[0] != 0) + strcpy(voice_name, sp->voice_name); // don't inherit name from previous levels ?? if(sp->language[0] != 0) strcpy(language, sp->language); if(sp->voice_gender != 0) diff --git a/src/synthdata.cpp b/src/synthdata.cpp index b844ffb4..9b4d02c7 100755 --- a/src/synthdata.cpp +++ b/src/synthdata.cpp @@ -35,7 +35,7 @@ #include "translate.h" #include "wave.h" -const char *version_string = "1.24.02 04.May.07"; +const char *version_string = "1.24.03 06.May.07"; const int version_phdata = 0x012201; int option_device_number = -1; diff --git a/src/translate.h b/src/translate.h index fe6025e3..c49114e2 100755 --- a/src/translate.h +++ b/src/translate.h @@ -46,7 +46,7 @@ #define FLAG_CAPITAL 0x8000 /* pronunciation if initial letter is upper case */ #define FLAG_DOT 0x10000 /* ignore '.' after word (abbreviation) */ -#define FLAG_ABBREV 0x20000 /* use this pronunciation rather than split into letters */ +#define FLAG_ABBREV 0x20000 // spell as letters, even with a vowel, OR use specified pronunciation rather than split into letters #define FLAG_STEM 0x40000 // must have a suffix #define FLAG_DOUBLING 0x80000 // doubles the following consonant diff --git a/src/voices.cpp b/src/voices.cpp index 3c18e5b9..82afd18f 100755 --- a/src/voices.cpp +++ b/src/voices.cpp @@ -61,6 +61,7 @@ static espeak_VOICE *voices_list[N_VOICES_LIST]; static int len_path_voices; espeak_VOICE *voice_selected = NULL; +espeak_VOICE *first_voice = NULL; char voice_name[40]; @@ -209,6 +210,143 @@ void ReadTonePoints(char *string, int *tone_pts) } + + +static espeak_VOICE *ReadVoiceFile(FILE *f_in, const char *fname, const char*leafname) +{//=================================================================================== +// Read a Voice file, allocate a VOICE_DATA and set data from the +// file's language, gender, name lines + + char linebuf[120]; + char vname[80]; + char vgender[80]; + char vlanguage[80]; + char languages[300]; // allow space for several alternate language names and priorities + + + unsigned int len; + int langix = 0; + int n_languages = 0; + char *p; + espeak_VOICE *voice_data; + int priority; + int age; + int n_variants = 3; // default, number of variants of this voice before using another voice + int gender; + +#ifdef PLATFORM_WINDOWS + if(memcmp(leafname,"mb-",3) == 0) + { + // check whether the mbrola speech data is present for this voice + memcpy(vname,&leafname[3],3); + vname[3] = 0; + sprintf(linebuf,"%s/mbrola/%s",path_home,vname); + + if(GetFileLength(linebuf) <= 0) + return(0); + } +#endif + + vname[0] = 0; + vgender[0] = 0; + age = 0; + + while(fgets(linebuf,sizeof(linebuf),f_in) != NULL) + { + linebuf[strlen(linebuf)-1] = 0; + + if(memcmp(linebuf,"name",4)==0) + { + p = &linebuf[4]; + while(isspace(*p)) p++; + strncpy0(vname,p,sizeof(vname)); + } + else + if(memcmp(linebuf,"language",8)==0) + { + priority = DEFAULT_LANGUAGE_PRIORITY; + vlanguage[0] = 0; + + sscanf(&linebuf[8],"%s %d",vlanguage,&priority); + len = strlen(vlanguage) + 2; + // check for space in languages[] + if(len < (sizeof(languages)-langix-1)) + { + languages[langix] = priority; + + strcpy(&languages[langix+1],vlanguage); + langix += len; + n_languages++; + } + } + else + if(memcmp(linebuf,"gender",6)==0) + { + sscanf(&linebuf[6],"%s %d",vgender,&age); + } + else + if(memcmp(linebuf,"variants",8)==0) + { + sscanf(&linebuf[8],"%d",&n_variants); + } + } + languages[langix++] = 0; + + gender = LookupMnem(genders,vgender); + + if(n_languages == 0) + { +#ifdef deleted +// Read voice variant files +// Don't use this, instead preset the variants_* arrays + + // no language is specified, this voice file only affects the voice characteristics + if(memcmp(leafname,"!variant",8)==0) + { + if(((variant = atoi(&leafname[8])) > 0) && (strlen(variants_either) < N_VOICE_VARIANTS)) + { + char string[2]; + string[0] = variant; + string[1] = 0; + strcat(variants_either,string); + if(gender == 1) + strcat(variants_male,string); + if(gender == 2) + strcat(variants_female,string); + } + } +#endif + return(NULL); // no language lines in the voice file + } + + p = (char *)calloc(sizeof(espeak_VOICE) + langix + strlen(fname) + strlen(vname) + 3, 1); + voice_data = (espeak_VOICE *)p; + p = &p[sizeof(espeak_VOICE)]; + + memcpy(p,languages,langix); + voice_data->languages = p; + + strcpy(&p[langix],fname); + voice_data->identifier = &p[langix]; + voice_data->name = &p[langix]; + + if(vname[0] != 0) + { + langix += strlen(fname)+1; + strcpy(&p[langix],vname); + voice_data->name = &p[langix]; + } + + voice_data->age = age; + voice_data->gender = gender; + voice_data->variant = 0; + voice_data->xx1 = n_variants; + return(voice_data); +} // end of ReadVoiceFile + + + + void VoiceReset(int tone_only) {//=========================== // Set voice to the default values @@ -379,6 +517,7 @@ voice_t *LoadVoice(char *vname, int control) char phonemes_name[40]; char *language_type; char buf[200]; + char path_voices[140]; char langname[4]; int stress_amps[8]; @@ -392,7 +531,8 @@ voice_t *LoadVoice(char *vname, int control) if(voicename[0]==0) strcpy(voicename,"default"); - sprintf(buf,"%s%cvoices%c%s",path_home,PATHSEP,PATHSEP,voicename); + sprintf(path_voices,"%s%cvoices%c",path_home,PATHSEP,PATHSEP); + sprintf(buf,"%s%s",path_voices,voicename); if(GetFileLength(buf) <= 0) { @@ -400,10 +540,15 @@ voice_t *LoadVoice(char *vname, int control) langname[0] = voicename[0]; langname[1] = voicename[1]; langname[2] = 0; - sprintf(buf,"%s%cvoices%c%s%c%s",path_home,PATHSEP,PATHSEP,langname,PATHSEP,voicename); + sprintf(buf,"%s%s%c%s",path_voices,langname,PATHSEP,voicename); } f_voice = fopen(buf,"r"); + if(first_voice == NULL) + { + first_voice = ReadVoiceFile(f_voice,buf+len_path_voices,voicename); + rewind(f_voice); + } language_type = "en"; // default if(f_voice == NULL) @@ -776,7 +921,7 @@ static int ScoreVoice(espeak_VOICE *voice_spec, int spec_n_parts, int spec_lang_ p = voice->languages; // list of languages+dialects for which this voice is suitable - if(voice_spec->languages == NULL) + if(spec_n_parts == 0) { score = 100; } @@ -836,10 +981,18 @@ static int ScoreVoice(espeak_VOICE *voice_spec, int spec_n_parts, int spec_lang_ if(score == 0) return(0); - if((voice_spec->name != NULL) && (strcmp(voice_spec->name,voice->name)==0)) + if(voice_spec->name != NULL) { - // match on voice name - score += 400; + if(strcmp(voice_spec->name,voice->name)==0) + { + // match on voice name + score += 500; + } + else + if(strcmp(voice_spec->name,voice->identifier)==0) + { + score += 400; + } } if(((voice_spec->gender == 1) || (voice_spec->gender == 2)) && @@ -886,14 +1039,15 @@ static int SetVoiceScores(espeak_VOICE *voice_select, espeak_VOICE **voices) int ix; int score; int nv; // number of candidates - int n_parts=1; + int n_parts=0; int lang_len=0; char *p; espeak_VOICE *vp; // count number of parts in the specified language - if(voice_select->languages != NULL) + if((voice_select->languages != NULL) && (voice_select->languages[0] != 0)) { + n_parts = 1; lang_len = strlen(voice_select->languages); for(p = voice_select->languages; *p != 0; p++) { @@ -901,7 +1055,6 @@ static int SetVoiceScores(espeak_VOICE *voice_select, espeak_VOICE **voices) n_parts++; } } - // select those voices which match the specified language nv = 0; for(ix=0; ix 0) && (strlen(variants_either) < N_VOICE_VARIANTS)) - { - char string[2]; - string[0] = variant; - string[1] = 0; - strcat(variants_either,string); - if(gender == 1) - strcat(variants_male,string); - if(gender == 2) - strcat(variants_female,string); - } - } -#endif - return(NULL); // no language lines in the voice file - } - - p = (char *)calloc(sizeof(espeak_VOICE) + langix + strlen(fname) + strlen(vname) + 3, 1); - voice_data = (espeak_VOICE *)p; - p = &p[sizeof(espeak_VOICE)]; - - memcpy(p,languages,langix); - voice_data->languages = p; - - strcpy(&p[langix],fname); - voice_data->identifier = &p[langix]; - voice_data->name = &p[langix]; - - if(vname[0] != 0) - { - langix += strlen(fname)+1; - strcpy(&p[langix],vname); - voice_data->name = &p[langix]; - } - - voice_data->age = age; - voice_data->gender = gender; - voice_data->variant = 0; - voice_data->xx1 = n_variants; - return(voice_data); -} // end of ReadVoiceFile - - static espeak_VOICE *SelectVoiceByName(espeak_VOICE **voices, const char *name) {//============================================================================ int ix; @@ -1212,7 +1232,7 @@ void GetVoices(const char *path) FILE *f_voice; espeak_VOICE *voice_data; int ftype; - char fname[80]; + char fname[140]; #ifdef PLATFORM_RISCOS #else @@ -1305,7 +1325,7 @@ espeak_ERROR SetVoiceByName(const char *name) espeak_VOICE *v; int variant=0; char *p; - char buf[80]; + static char buf[60]; strncpy0(buf,name,sizeof(buf)); if((p = strchr(buf,'+')) != NULL) @@ -1315,6 +1335,14 @@ espeak_ERROR SetVoiceByName(const char *name) variant = atoi(p+1); } +// first check for a voice with this filename + if(LoadVoice(buf,1) != NULL) + { + voice_selected = first_voice; + WavegenSetVoice(voice); + return(EE_OK); + } + if(n_voices_list == 0) espeak_ListVoices(NULL); // create the voices list @@ -1358,7 +1386,7 @@ ESPEAK_API const espeak_VOICE **espeak_ListVoices(espeak_VOICE *voice_spec) int ix; static espeak_VOICE *voices[N_VOICES_LIST]; char selected_voice_id[80]; - char path_voices[80]; + char path_voices[130]; // free previous voice list data if((voice_selected != NULL) && (voice_selected->identifier != NULL))