From af5209f741430dfee9986e0656d6d91df1508b9c Mon Sep 17 00:00:00 2001 From: jonsd Date: Mon, 3 Nov 2008 01:37:45 +0000 Subject: [PATCH] [1.39.14] Provide Viseme events on the Windows SAPI5 interface. git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@199 d46cf337-b52f-0410-862d-fd96e6ae7743 --- dictsource/af_list | 13 +-- dictsource/af_rules | 17 +++- dictsource/cs_rules | 5 -- dictsource/de_rules | 7 ++ dictsource/dict_phonemes | 86 +++++++++++-------- dictsource/en_list | 9 +- dictsource/en_rules | 7 +- dictsource/fr_list | 3 +- dictsource/fr_rules | 25 ++++-- dictsource/sk_rules | 5 -- phsource/compile_report | 36 +++++++- phsource/ph_french | 1 + phsource/phonemes | 3 + phsource/vdiph2/ie_2 | Bin 1980 -> 6240 bytes phsource/vdiph2/uaa | Bin 0 -> 7275 bytes phsource/vowel/& | Bin 6237 -> 6237 bytes phsource/vowel/a_6 | Bin 0 -> 12455 bytes phsource/vowel/aa_9 | Bin 0 -> 2153 bytes platforms/windows/windows_sapi/ttsengobj.cpp | 83 ++++++++++++++++-- src/numbers.cpp | 8 +- src/speak.cpp | 2 +- src/synthdata.cpp | 2 +- src/tr_languages.cpp | 18 +++- 23 files changed, 250 insertions(+), 80 deletions(-) create mode 100644 phsource/vdiph2/uaa create mode 100755 phsource/vowel/a_6 create mode 100644 phsource/vowel/aa_9 diff --git a/dictsource/af_list b/dictsource/af_list index e259bfc2..84689b17 100755 --- a/dictsource/af_list +++ b/dictsource/af_list @@ -148,6 +148,7 @@ _roman rum'eIns@ // Place names +afganistan afg'anistan alaska al'aska algerië alx2'e@re@:@- antwerpen antv&rp@n @@ -160,6 +161,7 @@ bermuda $2 bethlehem bEt_liEm boedapest budapEst boekarest bukarEst +bolivië bul'Ivi:@ bonnievale _^_EN brittanje $2 brooklyn _^_EN @@ -196,6 +198,7 @@ hermon $1 hirosjima hiruS'ima israel IsraI:l italië it'A:li;@ +kalafong kalaf'ON kanada kanad%a kanaän kA:nA:an kaïro ka_'iru @@ -309,6 +312,7 @@ der d@r derick dErik deventer d'e@v@nt@r diana dij'A:na +donaldson _^_EN du $u (du pisanie) du||pis'A:ni (du plessis) du||pl@s'i @@ -640,6 +644,8 @@ dis $u aangaande $2 aanstaande $2 adagio ad'A:dZi;%@U +afgaanse afg'A:ns@ +afgane afg'A:n@ africana $3 afkere afke@r@ agamemnon ax2am'EmnOn @@ -650,14 +656,12 @@ algaande $2 alge alx2@ algehele alx2@h,e@l@ allegro al'Egru -alles al@s almiskie $3 alom al_'Om alreeds $2 alternatiewe $4 amen A:mEn anale an'A:l@ -//###anatomie $4 $only asof asOf asook %as_o@k aspris $2 @@ -674,7 +678,7 @@ bene be@n@ beswil bEsv@l besnedene b@sne@d@n@ bestes bEst@s -beta be@ta +beta be@ta $only bewe be@v@ bewend be@v@nt bewering b@ve@rIN @@ -766,7 +770,6 @@ hokaai hOkAI hoofsaaklik $2 hoogedele ho@x2 _e@d@l@ hosanna hus'ana -//###huigelary $4 ibis $1 idee $2 @@ -941,7 +944,6 @@ sinagoge s@n@x2o@x2@ senatore s@nat'o@r@ singenot sInx2@nOt sir _^_EN -skares skA:r@s skepsele skEps@l@ skuldelas skWld@las s'n s@n $u @@ -1003,7 +1005,6 @@ verse f&:rs@ vers f&:rs verste f&rst@ verte f&rt@ -vertes f&rt@s verweg f&:rv&x2 via via volheid $1 diff --git a/dictsource/af_rules b/dictsource/af_rules index acd4203f..331b34a9 100755 --- a/dictsource/af_rules +++ b/dictsource/af_rules @@ -68,7 +68,6 @@ a (riA 'A: // akwarium/barium/estuarium/herbarium/seminaria a (ristokr %a // shorten 1st a: aristokrasie/-kraat/-krate/-kraties arm (last %ar@-m // move default stress: armlastig/-e - @C) as (_ as // shorten final a of words ending in -as: rigtingvas/jonkmanskas, etc. C) asie 'A:si @@@@) asie A:s%i oub) asie A:si // restore default stress: oubasie/-s @@ -256,6 +255,7 @@ ar (seen %ar ar (tikel %ar // stress: artikel and compounds artiku %art%ik%y // stress and vowel sounds: artikulasie/artikuleer + @C) as (_ as // shorten final a of words ending in -as: rigtingvas/jonkmanskas, etc. _) a (sië A: // fix stress and a sound: Asië/-r/-rs _) a (strA %a // astrant/astrale/astraal artille (rie %art@l@ // stress and vowel sounds: artillerie and compounds @@ -854,6 +854,7 @@ CAC) e (CC @ // fix e sound: nalatenskap/wapenstilstand CAC) e (C% E // beesfilette/nougesette/onderbesette/voortgesette juwel) e (C @ // fix e sound: juwelekissie and similar compounds + fontein) e (C @_ // fix e sound: Fonteinesirkel/-wisselaar, etc. kening) e (@ @ // fix e sound: rekeningeklerk/-navraag and similar narkos) e (C @ // fix e sound: narkosedood/-gas/-masker/-middel/-rekords, etc. ooi) e (C @ // fix e sound: dooiepunt/ooievaar and similar @@ -1048,7 +1049,7 @@ AAv) eer e@r // restore default stress: pouveer/makouveer/horlosieveer/kraaiveer/rooiveer w) eer e@r // stress may vary in words containing weer: lugafweer/donderweer u) eer 'e@r // aktueer/konstrueer/salueer, etc. - effek %e@fEk // move default stress and fix e sound: effek/-te/-tief + effek (K %ifEk // move default stress and fix e sound: effek/-te/-tief/rimpeleffek eienaardig %eI@nA:rd@x2 // move default stress: eienaardig/-ste @) ein (dig 'eIn // nimmereindige/nimmereindigend eind (eks eInt_ // fix d sound and make short pause: eindeksamen/-s and compounds @@ -1967,6 +1968,11 @@ j j j (j ja (broer jA: // fix a sound: jabroer/-s + _) jag (A j''ax2_ // fix stress and a sound: jagavontuur/-ekspedisie/-entoesias/-eskader/-instink... + jag (end jA:x2 // but long a in jagend/-e and compounds + jag (er jA:x2 // long a in jager and compounds + jag (ing jA:x2 // long a in (ver)jaging and similar + jaguar jagwar // fix a, g and u sounds: jaguar and compounds _) ja (CobA j%a // fix stress and a sound: Jacoba/Jacobus/Jakobus jakaranda j%ak%ar'anda //jakaranda and compounds jakopewer j%ak%Ope@v@r_ // fix stress and vowel sounds: jakopewer/-oë @@ -3374,6 +3380,7 @@ profesie prOf@s'i // fix vowel sounds and move stress profit (e pr%Of@t // fix stress and vowel sounds: profiteer/-tering pro (gram pr%u // fix stress and o sound: program/-e/ontwikkelingsprogram + programme (ring pr%ux2r%ame@ // fix e sound and stress: (rekenaar)programmering(staal), etc. pro (gress pr%o@ // fix stress and o sound: progressie/-f/-we pro (CA pr%u // probeer/produk/proses/professie/provinsie produk (A pr%udWk_ // fix u sound, pause: produkopsies/-uitstalling, etc. @@ -3510,6 +3517,7 @@ regime (_ r@Zi:m // regime/-s and compounds regi (ment r@x2@ // fix stress and e and i sounds: regement/-e and compounds regimen (ta@ r%Ex2%im%En // fix stress: regimentaal/-tale + regi (sseuC r@x2@ // fix stress and e sound: (film-/kuns-/mede-/musiek-/oorklankings-)regisseur/-sseuse reg (ist r@x2 // registrasie/-nommer/register/bevolkingsregister regle (ment r@x2l@ // fix stress and e sounds: reglement/-e and compounds regverdig r&x2f'&rd@x2 // regverdig/onregverdige/regverdigheid - verwyder uit af_list @@ -3576,6 +3584,7 @@ .group s s s s (s + @) s (_S1q s // to correctly handle plurals of propernames in af_list: Jouberts, etc. @@@) s (_S1 s // to correctly handle plural s i) s (_ s // exceptions to rule: @@@) s (_S1 s se (_ s@ //the word se and some ending in se @@ -3630,7 +3639,7 @@ seroto (ni s%Er@t%u // fix stress and vowel sounds: serotonien(vlakke, etc.) sitrus s'itr%Ws_ //i sound and stress in compounds - saamge (P6 s'A:mx2@ // saamgepers/-de/saamgetel/saamgeêet + _) saam (P4 s'A:m // saamgepers/-de/saamgetel/saamgeêet/saampers saamgee sA:mx2e@ // fix ee in saamgee; see rule: saamge (P6 sabot (A s%ab%ut // sabotasie/saboteer safari s%afA:r%i // fix 1st a: safari/safaripak, etc. @@ -4029,10 +4038,12 @@ straa) t (j t // split tj sound: straat(jas/-joggie/-jonge/-joernaal) ui) tj tj // uitjaag/uitjou/uitjubel ui) tjie ci // beskuitjie/fluitjie/ruitjie/uitjie, etc. + @) tjoernali tj%urn%al@ // fix stress, split t/j: front-/koerant-/sport-/vryskutjoernalis, etc. _) th (@@ t @) th (C t // drop h: Bothma/Neethling and similar _) theu t''Y@ // Theuns/Theunis _) th _^_EN // if only one vowel character + @) thy (_ _^_EN // words and names ending in -thy are English: Cathy, etc. @) th (_N _^_EN @) tion (_ _^_EN //words ending in tion is English @) tions (_ _^_EN //words ending in tions is English diff --git a/dictsource/cs_rules b/dictsource/cs_rules index fc8e3368..90dd0a05 100644 --- a/dictsource/cs_rules +++ b/dictsource/cs_rules @@ -384,11 +384,6 @@ synchro) ni ni qu kv .group r -// r r -// A) r (A * -// C) r (A @-* -// rr *r -// right rajt K) r (K r- r R diff --git a/dictsource/de_rules b/dictsource/de_rules index 0728fd5b..18581869 100644 --- a/dictsource/de_rules +++ b/dictsource/de_rules @@ -589,6 +589,13 @@ &) ie (r_ 'i: u) ie (r_ _|'i: &) ie (rlich 'i: + bank) ie (r I'e: + barr) ie (r I'e: + financ) ie (r I'e: + hotel) ie (r I'e: + prem) ie (r I'e: + hyg) ie (n I'e: + ital) ie (n I'e: d) ienst i:nst r) ien (@ IEn &) ien (_ =I@n diff --git a/dictsource/dict_phonemes b/dictsource/dict_phonemes index b01f3d00..73c43d05 100644 --- a/dictsource/dict_phonemes +++ b/dictsource/dict_phonemes @@ -15,6 +15,19 @@ n N p r s S t tS v w x2 z Z +Dictionary bn_dict + +& a a: a~ e E e~ i +I i: i:~ i~ l- o O o: +o~ O~ r- U u u: u:~ u~ + +* b B c C ch d d. +g h j J k kh l m +n N n. n^ p ph Q r +r. s S s. t t. t.h th +tS x z + + Dictionary cs_dict @- a a: aU e e: eI eU @@ -277,6 +290,34 @@ n^ p r R s S t tS ts tS; v x z Z +Dictionary ml_dict + +a a: aI aU e E e: i +I i: o o: r- u u: V +y + +: b c ch d d. dZ f +g h j J k kh l l. +m n N n. n^ p ph R +R2 s s. S; t t. t.h th +tS v w z z. + + +Dictionary ne_dict + +@ @- @2 @3 a a: aI aU +a~ e E e: E: E~ e~ i +I i: i~ l- o O o: O: +o~ O~ r- U u u: u~ V + +- : b c ch d d. f +g h H j J k kh l +l. m n N n. n^ p ph +Q q r r. s S s. t +T t. t.h th v w x z +z. + + Dictionary nl_dict 8 @ @- A a: E e: EI @@ -470,42 +511,13 @@ l m n N p r s t tS v w z -Dictionary ml_dict +Dictionary lv_dict -a a: aI aU e E e: i -I i: o o: r- u u: V -y +a a: ai au e e: ei i +i: ie iu o o: oi u u: +ui uo -: b c ch d d. dZ f -g h j J k kh l l. -m n N n. n^ p ph R -R2 s s. S; t t. t.h th -tS v w z z. - - -Dictionary bn_dict - -& a a: a~ e E e~ i -I i: i:~ i~ l- o O o: -o~ O~ r- U u u: u:~ u~ - -* b B c C ch d d. -g h j J k kh l m -n N n. n^ p ph Q r -r. s S s. t t. t.h th -tS x z - - -Dictionary ne_dict - -@ @- @2 @3 a a: aI aU -a~ e E e: E: E~ e~ i -I i: i~ l- o O o: O: -o~ O~ r- U u u: u~ V - -- : b c ch d d. f -g h H j J k kh l -l. m n N n. n^ p ph -Q q r r. s S s. t -T t. t.h th v w x z -z. +b c d dZ f g h j +J k l l^ m n N n^ +p R R2 s S t tS ts +v z Z diff --git a/dictsource/en_list b/dictsource/en_list index 8208a1e8..3fd2a2b8 100644 --- a/dictsource/en_list +++ b/dictsource/en_list @@ -350,6 +350,9 @@ prof $dot rev $dot st $dot +// not abbreviations when all-caps +all O:l $allcaps +no noU $allcaps // MAIN WORD DICTIONARY @@ -451,7 +454,6 @@ alfalfa alf'alf@ alias eIli@s alibi al@baI alkali alk@laI -all O:l $allcaps // not abbrev. allay a2leI allegiance a2li:dZ@ns allele a2li:l @@ -597,6 +599,7 @@ barometer b@r0mI2t3 barrage barA:Z basis beIsIs bass beIs +baste beIst bastion basti@n batman batman bayou baIu: @@ -937,6 +940,7 @@ edit EdIt edition I2dIS@n edwardian Edw'O@di@n efile i:faIl +egg Eg // egging eh eI el ,El electricity I2lEktr'IsI2tI @@ -1795,6 +1799,7 @@ saline seIlaIn san ,san sardine $2 satan seIt@n +satanist seIt@nIst saucepan sO:sp@n saudi saUdI says sEz @@ -1852,6 +1857,7 @@ sierra sI'e@r@ signage saInI2dZ sikh si:k silhouette sI2lUw'Et +silo saIloU simon saIm@n simultaneous $3 singly sINglI $verbf @@ -2421,7 +2427,6 @@ Denise d@ni:s Derek dErIk Dinah daIn@ Dominic d0mI2nIk -Donald d0n@Ld Doris d0rIs Dougall du:g@L Dylan dIl@n diff --git a/dictsource/en_rules b/dictsource/en_rules index f54493f9..af32f659 100644 --- a/dictsource/en_rules +++ b/dictsource/en_rules @@ -29,6 +29,8 @@ // ?7 Scottish // ?8 Use full vowel, not schwa in some word endings +.L01 l r + .replace ff ff // ligature fi fi @@ -2348,7 +2350,7 @@ _) exc (e %Eks exc (i %Eks exc (elle Eks - ex (e+ Eks + C) ex (e Eks exe (cutio EksI ex (erc Eks _) ex (A %Egz @@ -2533,6 +2535,7 @@ @) i (butive 'I @) i (butor 'I &) i (c_ =I + &) i (ciCe_ =I &) i (ca_ =I &) ico (_ =I2koU &) i (cal =I @@ -3714,6 +3717,7 @@ pers) on @n pers) on (i '0n postp) on 'oUn + on (ald 0n d) on (at %oUn on (an_ oUn _) on (io Vn @@ -4322,6 +4326,7 @@ rhyth rID _) rm ,A@Em rrhoea r'i@ + _) ru (bL01 ru: _) run (a rVn _) run (o rVn _) rw r%U diff --git a/dictsource/fr_list b/dictsource/fr_list index 7b5fddf2..90a01cc1 100755 --- a/dictsource/fr_list +++ b/dictsource/fr_list @@ -24,7 +24,7 @@ // 2006-11-18 Gilles Casse // -// Updated 2008-10-13 Michel Such +// Updated 2008-10-24 Michel Such // // * Numbers, a few abbreviations and exceptions. // @@ -268,6 +268,7 @@ anpe $abbrev api $abbrev avh aveaS bd boulevard $text +brltty $abbrev cci $abbrev cio $abbrev ctrl control $text $pause diff --git a/dictsource/fr_rules b/dictsource/fr_rules index 698d1f13..ab3b5237 100755 --- a/dictsource/fr_rules +++ b/dictsource/fr_rules @@ -23,7 +23,7 @@ // 2006-11-18 Gilles Casse // -// Updated: 2008-10-16 Michel Such +// Updated: 2008-11-01 Michel Such // // Letter classes: @@ -70,6 +70,8 @@ a (nnA a // manne an (K A~ // ancien, élan + @@m) an (_ an // tennisman + lism) an (_ A~ // talisman _C) aon (_ A~ // faon, paon, taon s) aoul (_ u // saoul s) aou (le u // saoule @@ -83,6 +85,7 @@ _) auto (@P4 oto _) autom (n otO _) au (treX o2 + bb) aye (X ei // abbaye p) a (ys E // pays paysage ay (C E // aymé ay Ej // paye @@ -116,9 +119,11 @@ cc (Y ks // accéder cc k // occuper _) ch (arism k // charisme, charismatique + _) ch (irop k // chiroptère a) ch (_ k // almanach e) ch (_ k // varech _A) ch (o_ k // écho + mani) ch (é k // manichéisme _eu) ch (ari k // eucharistie or) ch (esC k // orchestre or) ch (iC k // orchidée @@ -230,6 +235,7 @@ _) ç' (P2v s CC) 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 @@ -248,18 +254,18 @@ _) ç' (P2v s em (p A~ en (_ A~n2 // en en (hA A~n // enharmonique - en (A A~n // enivrer +_) 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 - X) en (nu A~ // ennui - - C) en (A @n // menu - + 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 @@ -579,6 +585,7 @@ _) ç' (P2v s vin) gt (_sept t vin) gt (_huit t vin) gt (_neuf t + vin) gt (_neuvi t gt (_ // vingt doigts @@ -794,7 +801,6 @@ _) half _^_en _) n' (P2v n - A) ng (_ N // parking meeting nn n // panne _) n (_° nymero _) neuro (@@P5 nYro @@ -990,6 +996,7 @@ mou) rr rr // mourrai s s // verser sien s (_S1 z2 + stein (_ Stajn _) s' (P2v s // s'amène _) s' (esXP2v s // s'amène @@ -1079,7 +1086,6 @@ _tou) s (_leurs_ _) sky _^_en _) smil _^_en // smile, smiley spy _^_en - sy (_ _^_en .group t @@ -1280,7 +1286,8 @@ Vn) t (_ t2 x ks xs ks // lexique lexicaux vox e) x (A gz // exagérer exemple - le) x (i ks + Ce) x (i ks + ine) x (i gz _e) x (h gz // exhumer ai) x (_ // voix paix prix diff --git a/dictsource/sk_rules b/dictsource/sk_rules index c69a34f4..7fb5e064 100644 --- a/dictsource/sk_rules +++ b/dictsource/sk_rules @@ -346,11 +346,6 @@ _administratív) n (e n qu kv .group r -// r r -// A) r (A * -// C) r (A @-* -// rr *r - K) r (K r- r R rr R diff --git a/phsource/compile_report b/phsource/compile_report index 69c362b0..ace72ff4 100644 --- a/phsource/compile_report +++ b/phsource/compile_report @@ -1,4 +1,4 @@ -54 phoneme tables +55 phoneme tables new total base 100 100 base2 24 119 @@ -54,6 +54,7 @@ ml 13 139 bn 59 145 ne 14 141 + lv 26 121 Data file Used by b/b [b] base @@ -578,6 +579,7 @@ r3/r_trill [R2] base [R] sk [r*] sr [x] pt + [R] lv r3/r_trill2 [R] base [r] cy [R] hr @@ -591,6 +593,7 @@ r3/r_trill.wav [R2] base [R] sk [r*] sr [x] pt + [R] lv r3/r_u [(u)] base r3/rx [*] base [r/] base @@ -780,6 +783,7 @@ ustop/k_ [k] base [k] sw [k] sq [kh] bn + [k] lv ustop/ki [c] base [k] base [k] base2 @@ -797,6 +801,7 @@ ustop/ki [c] base [c] tr [J] ku [c] ku + [k] lv ustop/kl [k] base [k] base2 [k] en @@ -809,6 +814,7 @@ ustop/kl [k] base [k] zhy [k] sw [kh] bn + [k] lv ustop/kr [k] base [k] base2 [k] en @@ -821,6 +827,7 @@ ustop/kr [k] base [k] zhy [k] sw [kh] bn + [k] lv ustop/k_unasp [k] base [k] base2 [k] fi @@ -832,6 +839,7 @@ ustop/k_unasp [k] base [k`] ko [k] sq [k] bn + [k] lv ustop/k_unasp_ [k] zh ustop/null [?] base ustop/p [p] base @@ -860,6 +868,7 @@ ustop/pl [p] base [p] sq [p] bn [ph] bn + [p] lv ustop/pr [p] base [p] base2 [p] fi @@ -884,6 +893,7 @@ ustop/p_unasp [p] base [p`] ko [p] sq [p] bn + [p] lv ustop/p_unasp_ [p] base2 [p] fi [p] hi @@ -893,6 +903,7 @@ ustop/p_unasp_ [p] base2 [p;] ro [p] sq [p] bn + [p] lv ustop/q [q] base ustop/q_u [q] base ustop/t [t] base @@ -913,6 +924,7 @@ ustop/t_ [t] base [t] sq [t.] bn [t.h] bn + [t] lv ustop/t_dnt [t] base [t[] base [t] base2 @@ -950,6 +962,7 @@ ustop/ts [ts] base2 [ts;] ro [z] zhy [tsh] zh + [ts] lv ustop/tsh [tS] base [c] zhy ustop/tsh_ [tS] base @@ -964,6 +977,7 @@ ustop/t_short [t] fr [t] el [t] sq [t.] bn + [t] lv ustop/tsh_pzd [tS;] zh ustop/tsh_pzd_unasp [tS;] zh ustop/tsh_sr [tS] sr @@ -1012,6 +1026,7 @@ vdiph2/i@ [i@] en_n vdiph2/i@_2 [i@] en_wm vdiph2/ie [i@] en_wi [ie] fi +vdiph2/ie_2 [ie] lv vdiph2/ii@ [i@] en [i@3] en vdiph2/ii@_3 [i@] vi @@ -1020,6 +1035,7 @@ vdiph2/iu [iU] base2 [iU] vi [iu] zhy vdiph2/iu_2 [iu] fi + [iu] lv vdiph2/iu_3 [iu] af vdiph2/iu_4 [Iu] cy [Yu] cy @@ -1033,6 +1049,7 @@ vdiph2/o_oo [o@] en_wi [o] zh vdiph2/u-@ [y@] vi vdiph2/u#@ [U@] en_sc +vdiph2/uaa [uo] lv vdiph2/uo [uo] fi vdiph2/uu@ [U@] en [U@] en_n @@ -1057,6 +1074,7 @@ vdiph/aai_2 [AI] af [AY] cy vdiph/aai_3 [ai] fi vdiph/aau [au] fi + [au] lv vdiph/aau_2 [aU] en_wi [aU] de [VU] nl @@ -1078,6 +1096,7 @@ vdiph/ai [aI] base2 [aI] pt [a:I] vi [aI] id + [ai] lv vdiph/ai_2 [aI] cy [aY] cy vdiph/ai_3 [aI] no @@ -1113,6 +1132,7 @@ vdiph/eei [EI] base2 vdiph/eei_2 [eI] eo [ei] fi [eI] id + [ei] lv vdiph/eei_3 [eI] sk [eI] ku vdiph/eeu [EU] pt @@ -1171,6 +1191,7 @@ vdiph/ooi [OI] en [oi] fi [OI] no [oi] zhy + [oi] lv vdiph/ooi_2 [OI] af vdiph/ooi_3 [OI] en_rp [aI] en_wm @@ -1193,6 +1214,7 @@ vdiph/ui [uI] base2 [ui] fi [uI] vi [ui] zhy + [ui] lv vdiph/u-i [yI] vi vdiph/ui_2 [uI] af vdiph/ui_3 [uI] cy @@ -1360,6 +1382,7 @@ vowel/& [a] en_rp [&] sv [&] bn [&:] bn + [&:] lv vowel/0 [0] en [O] hi [O] pt @@ -1421,6 +1444,7 @@ vowel/a# [a/] base2 [&/] pt [a#] rw [a/] rw + [&] lv vowel/a_2 [a] base2 [a] en_wi [A:] en_wi @@ -1472,6 +1496,7 @@ vowel/a_5 [a:] ta [a] tr [a] sq [a:] ml + [a] lv vowel/a_6 [a] fr [a2] fr vowel/aa [a] fi @@ -1489,6 +1514,7 @@ vowel/aa_2 [A:] en [A] zh vowel/aa_3 [A:] af [A] sq + [a:] lv vowel/aa_4 [O:] en_us [A:] sv [O] vi @@ -1604,6 +1630,7 @@ vowel/e_mid [E] en_rp [E2] id [E] da [E] bn + [e] lv vowel/e_mid2 [E] af [E] de [E2] de @@ -1617,6 +1644,7 @@ vowel/e_mid2 [E] af [e] sw [e] tr [E] ko + [e:] lv vowel/@_fnt [@] en_wi [@2] en_wi [@2] hr @@ -1657,6 +1685,8 @@ vowel/i_3 [i] af [i] fr [i:] fr [i:] sk + [i] lv + [i:] lv vowel/i_4 [i] fi [i] hu [I] it @@ -1825,6 +1855,8 @@ vowel/oo_1 [O:] en_n [o] hr [o] vi [O/] sq + [o] lv + [o:] lv vowel/oo_2 [0] en_sc [O] cy [o] cs @@ -1928,6 +1960,8 @@ vowel/uu# [U] ku vowel/uu_2 [U] base2 [U] de [U] tr + [u] lv + [u:] lv vowel/uu_3 [u] af [y] zh vowel/uu_4 [U] fi diff --git a/phsource/ph_french b/phsource/ph_french index 9a4c9382..4d67d23d 100644 --- a/phsource/ph_french +++ b/phsource/ph_french @@ -425,6 +425,7 @@ phoneme r beforenotvowel r/2 formants vwl_fr/@R3+r3/rx%30 after @2 vwl_fr/@R5+r3/rx%40 + after (u) vwl_fr/@R5+r3/rx%30 after (e) vwl_fr/@R4+r3/rx%20 endphoneme diff --git a/phsource/phonemes b/phsource/phonemes index 1cdd3b8c..7846f64f 100644 --- a/phsource/phonemes +++ b/phsource/phonemes @@ -1322,3 +1322,6 @@ include ph_bengali phonemetable ne hi include ph_nepali + +phonemetable lv base +include ph_latvian diff --git a/phsource/vdiph2/ie_2 b/phsource/vdiph2/ie_2 index e30350a1bc80786a9f07e67c96ec2688c5231f07..916c2c78cf36fdc66cdd53c4ce08ae1ff15e8658 100644 GIT binary patch literal 6240 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 KM|#=vy#52p{r9c_ diff --git a/phsource/vdiph2/uaa b/phsource/vdiph2/uaa new file mode 100644 index 0000000000000000000000000000000000000000..cc3c0ad06ebcd7d64294e27cde0c19a307d3d06c GIT binary patch literal 7275 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 literal 0 HcmV?d00001 diff --git a/phsource/vowel/& b/phsource/vowel/& index ac60abe5ac193021ee8d97dfe3126239b502f520..dbc90895f1ad111d23007c2d5aca5f694102907c 100644 GIT binary patch delta 62 zcmca>aMwT}IKb68B-k~Ok%56hjg28@qkt<5qr>Jf7H$@%1KgXFIk-UFJRW8iPB)+u MAOLc!1Rk>k0M#80r~m)} delta 62 zcmca>aMwT}IKb68B-k~Ok%56hjg29Gqkt<5W5eb!7H$@%2A<8y99$r79uG4Mrz21a L5CFMV0*~1N-SG}5 diff --git a/phsource/vowel/a_6 b/phsource/vowel/a_6 new file mode 100755 index 0000000000000000000000000000000000000000..a6f4e24a00f81d0589d1f04f9cfccb7de5e557a8 GIT binary patch literal 12455 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 pmRS*5Ul_J literal 0 HcmV?d00001 diff --git a/platforms/windows/windows_sapi/ttsengobj.cpp b/platforms/windows/windows_sapi/ttsengobj.cpp index d4f341ef..88463b93 100755 --- a/platforms/windows/windows_sapi/ttsengobj.cpp +++ b/platforms/windows/windows_sapi/ttsengobj.cpp @@ -23,13 +23,12 @@ #include "src/speak_lib.h" #include "stdio.h" - - #define CTRL_EMBEDDED 1 CTTSEngObj *m_EngObj; ISpTTSEngineSite* m_OutputSite; FILE *f_log2=NULL; +ULONGLONG event_interest; extern int AddNameData(const char *name, int wide); extern void InitNamedata(void); @@ -49,6 +48,10 @@ char *path_install = NULL; unsigned long audio_offset = 0; unsigned long audio_latest = 0; +int prev_phoneme = 0; +int prev_phoneme_position = 0; +unsigned long prev_phoneme_time = 0; + unsigned int gBufSize = 0; wchar_t *TextBuf=NULL; @@ -65,6 +68,48 @@ int frag_count=0; FRAG_OFFSET *frag_offsets = NULL; +int VisemeCode(unsigned int phoneme_name) +{//====================================== +// Convert eSpeak phoneme name into a SAPI viseme code + + int ix; + unsigned int ph; + unsigned int ph_name; + +#define PH(c1,c2) (c2<<8)+c1 // combine two characters into an integer for phoneme name + + const unsigned char initial_to_viseme[128] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,19, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, + 4, 2,18,16,17, 4,18,20,12, 6,16,20,14,21,20, 3, + 21,20,13,16,17, 4, 1, 5,20, 7,16, 0, 0, 0, 0, 0, + 0, 1,21,16,19, 4,18,20,12, 6, 6,20,14,21,19, 8, + 21,20,13,15,19, 7,18, 7,20, 7,15, 0, 0, 0, 0, 0 }; + + const unsigned int viseme_exceptions[] = { + PH('a','I'), 11, + PH('a','U'), 9, + PH('O','I'), 10, + PH('t','S'), 16, + PH('d','Z'), 16, + PH('_','|'), 255, + 0 + }; + + ph_name = phoneme_name & 0xffff; + for(ix=0; (ph = viseme_exceptions[ix]) != 0; ix+=2) + { + if(ph == ph_name) + { + return(viseme_exceptions[ix+1]); + } + } + return(initial_to_viseme[phoneme_name & 0x7f]); +} + + int SynthCallback(short *wav, int numsamples, espeak_EVENT *events); int SynthCallback(short *wav, int numsamples, espeak_EVENT *events) @@ -73,6 +118,8 @@ int SynthCallback(short *wav, int numsamples, espeak_EVENT *events) wchar_t *tailptr; unsigned int text_offset; int length; + int phoneme_duration; + int this_viseme; espeak_EVENT *event; #define N_EVENTS 100 @@ -86,7 +133,7 @@ int SynthCallback(short *wav, int numsamples, espeak_EVENT *events) m_EngObj->CheckActions(m_OutputSite); // return the events - for(event=events; event->type != 0; event++) + for(event=events; (event->type != 0) && (n_Events < N_EVENTS); event++) { audio_latest = event->audio_position + audio_offset; @@ -121,6 +168,28 @@ int SynthCallback(short *wav, int numsamples, espeak_EVENT *events) Event->lParam = (long)event->id.name; Event->wParam = wcstol((wchar_t *)event->id.name,&tailptr,10); } + if(event->type == espeakEVENT_PHONEME) + { + if(event_interest & SPEI_VISEME) + { + phoneme_duration = audio_latest - prev_phoneme_time; + + // ignore some phonemes (which translate to viseme=255) + if((this_viseme = VisemeCode(event->id.number)) != 255) + { + Event = &Events[n_Events++]; + Event->eEventId = SPEI_VISEME; + Event->elParamType = SPET_LPARAM_IS_UNDEFINED; + Event->ullAudioStreamOffset = ((prev_phoneme_position + audio_offset) * srate)/10; // ms -> bytes + Event->lParam = phoneme_duration << 16 | this_viseme; + Event->wParam = VisemeCode(prev_phoneme); + + prev_phoneme = event->id.number; + prev_phoneme_time = audio_latest; + prev_phoneme_position = event->audio_position; + } + } + } #ifdef deleted if(event->type == espeakEVENT_SENTENCE) { @@ -286,7 +355,7 @@ STDMETHODIMP CTTSEngObj::SetObjectToken(ISpObjectToken * pToken) gEmphasis = 0; gSayas = 0; - espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS,100,path_install,0); + espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS,100,path_install,1); espeak_SetVoiceByName(voice); espeak_SetSynthCallback(SynthCallback); @@ -654,7 +723,7 @@ STDMETHODIMP CTTSEngObj::Speak( DWORD dwSpeakFlags, m_ullAudioOff = 0; m_OutputSite = pOutputSite; - + pOutputSite->GetEventInterest(&event_interest); xVolume = gVolume; xSpeed = gSpeed; @@ -694,6 +763,10 @@ STDMETHODIMP CTTSEngObj::Speak( DWORD dwSpeakFlags, } audio_latest = 0; + prev_phoneme = 0; + prev_phoneme_time = 0; + prev_phoneme_position = 0; + size = ProcessFragList(pTextFragList,TextBuf,pOutputSite,&n_text_frag); if(size > 0) diff --git a/src/numbers.cpp b/src/numbers.cpp index e44ec7df..fb71b5a3 100644 --- a/src/numbers.cpp +++ b/src/numbers.cpp @@ -966,7 +966,13 @@ int Translator::LookupNum3(int value, char *ph_out, int suppress_null, int thous Lookup("_0C",ph_100); - if((hundreds >= 10) && (((langopts.numbers & 0x0800) == 0) || (hundreds != 19))) + if(((langopts.numbers & 0x0800) != 0) && (hundreds == 19)) + { + // speak numbers such as 1984 as years: nineteen-eighty-four +// ph_100[0] = 0; // don't say "hundred", we also need to surpess "and" + } + else + if(hundreds >= 10) { ph_digits[0] = 0; diff --git a/src/speak.cpp b/src/speak.cpp index 88fbf02b..1b536cd1 100755 --- a/src/speak.cpp +++ b/src/speak.cpp @@ -429,7 +429,7 @@ static void StopSpeak(int unused) int *flag; int val; }; - static int optind; + int optind; static int optional_argument; static const char *arg_opts = "afklpsvw"; // which options have arguments static char *opt_string=""; diff --git a/src/synthdata.cpp b/src/synthdata.cpp index a64fbeaa..b86d1199 100755 --- a/src/synthdata.cpp +++ b/src/synthdata.cpp @@ -35,7 +35,7 @@ #include "translate.h" #include "wave.h" -const char *version_string = "1.39.12 24.Oct.08"; +const char *version_string = "1.39.14 02.Nov.08"; const int version_phdata = 0x013900; int option_device_number = -1; diff --git a/src/tr_languages.cpp b/src/tr_languages.cpp index 9c8ad60d..9e2fca92 100644 --- a/src/tr_languages.cpp +++ b/src/tr_languages.cpp @@ -121,6 +121,9 @@ Translator *SelectTranslator(const char *name) int name2 = 0; Translator *tr; + static const unsigned char stress_amps_sk[8] = {16,16, 20,20, 20,24, 24,22 }; + static const short stress_lengths_sk[8] = {190,190, 210,210, 0,0, 210,210}; + // convert name string into a word of up to 4 characters, for the switch() while(*name != 0) name2 = (name2 << 8) + *name++; @@ -552,6 +555,19 @@ SetLengthMods(tr,3); // all equal } break; + case L('l','v'): // latvian + { + tr = new Translator(); + SetupTranslator(tr,stress_lengths_sk,stress_amps_sk); + + tr->langopts.stress_rule = 0; + tr->langopts.spelling_stress = 1; + tr->charset_a0 = charsets[4]; // ISO-8859-4 + tr->langopts.numbers = 0x409; + tr->langopts.stress_flags = 0x16; + } + break; + case L('m','k'): // Macedonian { static wchar_t vowels_cyrillic[] = {0x440, // also include 'р' [R] @@ -673,8 +689,6 @@ SetLengthMods(tr,3); // all equal case L('s','k'): // Slovak case L('c','s'): // Czech { - static const unsigned char stress_amps_sk[8] = {16,16, 20,20, 20,24, 24,22 }; - static const short stress_lengths_sk[8] = {190,190, 210,210, 0,0, 210,210}; static const char *sk_voiced = "bdgjlmnrvwzaeiouy"; tr = new Translator();