diff --git a/dictsource/en_list b/dictsource/en_list index ec42a441..37fa1abb 100644 --- a/dictsource/en_list +++ b/dictsource/en_list @@ -1022,6 +1022,7 @@ concerto k@ntS'e@toU conches k0ntSI#z concierge k0nsI'e@Z concise k0#ns'aIs +conclave $1 conduct $1 conduct $verb cone koUn @@ -1136,6 +1137,7 @@ deli dElI deliberate dI2lIb@r@t delicate dElI2k@t delimit dI2lImIt // delimited +delivery $alt2 demolish dI2m0lIS demon di:m@n demoness di:m@nEs diff --git a/dictsource/en_rules b/dictsource/en_rules index 8a1af8a6..3aaa5016 100644 --- a/dictsource/en_rules +++ b/dictsource/en_rules @@ -1771,6 +1771,7 @@ di (ox d%aI _) di (s@ dI2 _) di (sa@ ,dI + _) di (sarm dI2 _) disa (p ,dIs@ di (sast dI2 di (sbe@ ,dI @@ -2467,6 +2468,7 @@ er (ve 3: s) er (van 3: ery (_ @r%i +?3 ery (_++$w_alt2 @rI ?3 @@AC) ery (_ e@ri ery (A 3j _v) ery ErI2 @@ -2745,6 +2747,8 @@ gue (_ g gu (e g _) gu (i g + _) gui (dA gaI + guide (@ gaId _) g (yn g o) g (y_ g g (ynous_ =dZ @@ -3262,7 +3266,7 @@ inter (est Intr interfer Int@f'i@3 _) int (erio+ %Int - _) inter (n_ %Int3: + _) inter (nK %Int3: _) inter (nal %Int3: _) inter (pr %Int3: _) inter (pol@ %Int3: @@ -4576,7 +4580,7 @@ pull) ov oUv m) ov (A u:v n) ov (el 0v - p) over (@ 0v@ + p) over (@ 0v3 pr) ov (e# u:v gr) ov (el 0v tr) ov (er 0v @@ -4942,6 +4946,8 @@ _) re (i@P2 r,i: _) rei (c raI _) rei (l raI + _) rei (s raI + _) re (iss r%i: _) rele (g rElI2 rele (nt rI2lE rele (v rElI# @@ -5122,9 +5128,8 @@ 1_) st (_ _) st (_ s@nt stein staIn - ti) ssue Su: _) s (u s - ss (ue S + ssue Su: ssur S3 a) ssur SU@ a) ssure S'U@ diff --git a/dictsource/pt_list b/dictsource/pt_list index 09ec4a4a..d2a6ccfc 100644 --- a/dictsource/pt_list +++ b/dictsource/pt_list @@ -325,7 +325,7 @@ elas $u+ me $u // reflexive te $u -nos $u +nos $u $nounf la $u lo $u las $u @@ -335,35 +335,31 @@ los $u ?2 este $u+ $nounf 'estSi // this ?2 estes $u+ $nounf 'estSis // these ?2 esta 'Est& $u+ $nounf +?2 nesta $u+ $nounf ?2 neste $u+ $nounf n'estSi //in this -?2 nestes $u+ n'estSis //in these ?2 esse $u+ $nounf 'esi // that essa 'Es& $u+ -desse d'esy $u+ -nesse n'esy $u+ +desse $u+ $nounf +desta $nounf +nesse n'esy $u+ $nounf aquele &k'ely $u+ $nounf // that -aquela $u+ +aquela $u+ $nounf daquele d&k'ely $u+ $nounf +daquela $u+ $nounf que $u // pronunciation is in pt_rules // possessive adjectives -meu $u+ $nounf -minha $u+ -meus $u+ -minhas $u+ +meu $u+ $nounf // meus +minha $u+ $nounf // minhas teu $u+ $nounf -tua $u+ -teus $u+ -tuas $u+ +tua $u+ $nounf seu $u+ $nounf -sua $u+ -seus $u+ -suas $u+ -?2 nosso $u+ // n'OsU -?2 nossa $u+ n'Os& -?2 nossos $u+ n'OsUs -?2 nossas $u+ n'Os&s +sua $u+ $nounf +?2 nosso $u+ $nounf // n'OsU +?2 nossa $u+ $nounf n'Os& +?2 nossos $u+ $nounf n'OsUs +?2 nossas $u+ $nounf n'Os&s dele dely $u1+ dela $u+ deles $u+ @@ -371,11 +367,11 @@ delas $u+ nele nely $u1+ // prepositions -de $u // of,from +de $u $nounf // of,from do $u $nounf da $u $nounf -dos $u -das $u +dos $u $nounf +das $u $nounf dum $u duma $u duns $u @@ -383,19 +379,15 @@ dumas $u em $u // in,on,at no nu $u $nounf -na $u -?2 nos nus# $u -nas $u +na $u $nounf num $u numa $u nuns $u numas $u -por $u // by,for,through -pelo $u -?2 pela $u p'el& -pelos $u -?2 pelas $u p'el&s +por $u $nounf // by,for,through +pelo $u $nounf +?2 pela $u $nounf p'el& ao $u à ,a: @@ -418,7 +410,6 @@ com $u // with ?2 até $u // until ?2 desde $u // from,since ?2 entre // between,among -?2 por $u // by,for,through sobre $alt2 // on,above,about ?2 sob // under,below ?2 debaixo // under,below @@ -625,19 +616,6 @@ alguns $u // some algumas $u // some não n,&U~ $strend // not -// Words with two possible pronounciations -jogo Z'OgU $verb -gosto g'OstU $verb -começo kom'EsU $verb -almoço aUm'OsU $verb -retorno xet'OrnU $verb -acordo &k'OrdU $verb -governo gov'ernU $noun -?2 olho 'oljU $noun -?4 olho 'ol^U $noun -?2 colher kolj'Er $noun -?4 colher kol^'Er $noun - // MAIN WORD DICTIONARY //********************* @@ -648,6 +626,7 @@ abacaxi abakaSy abordo $alt aborto $alt $verb acerto $alt2 $noun +acordo $alt $verb acertos $alt2 acervo $alt2 adepto $alt @@ -659,27 +638,22 @@ alcateia $alt alferes $alt algozes $alt alicerce $alt -amanheça $alt2 -amanheço $alt2 -amanhecesse $alt2 +almoço $alt $verb amarelo $alt ameba $alt amores $alt2 -anoitecesse $alt2 -anoiteça $alt2 -anoiteço $alt2 apego $alt2 $noun apelo $alt $verb aposto $alt $verb apreço $alt2 aperto $alt2 $noun apoio $alt $verb -aprendeste $alt2 aprovo $alt arredores $alt arremesso $alt2 $noun arroz $alt2 assembleia $alt +ateia $alt aterro $alt2 $noun atmosfera $alt atrozes $alt @@ -687,12 +661,10 @@ austera $alt austero $alt autora $alt2 axé aSE -bebeste $alt2 +baqueta $alt2 beco $alt2 belo $alt besta $alt2 -bezerra $alt2 -bezerro $alt2 bilhete $alt2 boca $alt2 bochecha $alt2 @@ -712,71 +684,73 @@ cachorra $alt2 caderneta $alt2 camiseta $alt2 cantora $alt2 +capacete $alt2 caractere $alt caramelo $alt careta $alt2 carreta $alt2 +carroça $alt casebre $alt castelo $alt cateto $alt2 catorze $alt2 cebola $alt2 cefaleia $alt -cerca $alt $verb cerco $alt $verb cesta $alt2 cesto $alt2 chamego $alt2 chefe $alt +checam $alt +cheque $alt chinelo $alt choro $alt2 $noun +chovesse $alt2 chupeta $alt2 clamores $alt2 coco $alt2 cofre $alt +cogumelo $alt coice $alt2 colabore $alt -colheste $alt2 +colete $alt2 +colchete $alt2 +colher $alt $verb +colheres $alt $noun colmeia $alt colore $alt começo $alt2 $noun comodo $alt2 -comera $alt2 -comeres $alt2 -comeste $alt2 concerto $alt2 $noun concordo $alt conforto $alt $verb -conheceste $alt2 -conheço $alt2 consolo $alt2 $noun contivermos $alt +controle $alt2 $noun +controlo $alt2 $noun copa $alt copo $alt coreia $alt corneta $alt2 cornos $alt corpos $alt -correste $alt2 corto $alt corveta $alt2 corvos $alt coto $alt2 -couber $alt -couberem $alt couberdes $alt -couberes $alt +coubermos $alt cratera $alt crede $alt2 cresce $alt crescem $alt der $alt +derdes $alt desapego $alt2 $noun descabelo $alt desce $alt descem $alt descordo $alt -descova $alt2 desespero $alt2 $noun desfecho $alt2 desprezo $alt $verb @@ -808,27 +782,29 @@ envelope $alt envolto $alt2 enxerto $alt2 $noun epopeia $alt +erga $alt2 +ergam $alt2 +ergo $alt2 eritreia $alt erro $alt2 $noun erros $alt2 esboço $alt $verb escopeta $alt2 +escova $alt2 $noun escroto $alt2 esforço $alt $verb esforços $alt esgoto $alt2 $noun +esgotos $alt2 esperma $alt espeto $alt2 $noun espiroqueta $alt2 espoleta $alt2 esposa $alt2 -esqueceste $alt2 esqueleto $alt2 estiverdes $alt -estiveres $alt estivermos $alt estrela $alt2 -estremeceste $alt2 estrofe $alt estorno $alt $verb estorvo $alt $verb @@ -844,24 +820,25 @@ farofa $alt febre $alt feitora $alt2 fera $alt -fere $alt -ferem $alt ferozes $alt fezes $alt ?1 fixe fiSy +fizerdes $alt fizermos $alt +foda $alt2 $verb folga $alt fogos $alt foguete $alt2 foice $alt2 forca $alt2 forças $alt2 -fores $alt2 +fordes $alt2 +fores $alt2 forro $alt $verb fosse $alt2 -fossem $alt2 frevo $alt2 galera $alt +galileia $alt gameta $alt2 geleia $alt gelo $alt $verb @@ -870,24 +847,29 @@ gesso $alt2 golpe $alt gonorreia $alt gorda $alt2 +gosto $alt $verb gota $alt2 +governo $alt2 $noun gozo $alt $verb graveto $alt2 -grego $alt2 grelha $alt -grega $alt2 groselha $alt grosso $alt2 grozo $alt $verb +hemorroida $alt hoje $alt2 +horrores $alt2 +houverdes $alt houvermos $alt ideia $alt insonoro $alt +interesse $alt2 $noun joga $alt -jogam $alt -jogos $alt +jogam$alt +jogo $alt $verb +jogos $alt jogue $alt -joguem $alt +joguem $alt joguete $alt2 lambreta $alt2 lebre $alt @@ -899,6 +881,7 @@ maleta $alt2 mantiverdes $alt mantiveres $alt mantivermos $alt +marcelo $alt marmelo $alt marreta $alt2 martelo $alt @@ -906,11 +889,15 @@ merda $alt megera $alt melo $alt mentora $alt2 +meta $alt $noun +meteoro $alt metro $alt mexa m'eS& mexi meS'i mexo m'eSU +minueto $alt2 miolo $alt2 +miolos $alt moeda $alt modo $alt modos $alt @@ -930,24 +917,25 @@ mulheres $alt mureta $alt2 mutreta $alt2 namoro $alt2 $noun -naquele $alt2 -negra $alt2 -negro $alt2 +naquela $nounf +naquele $alt2 $nounf +nervo $alt2 novos $alt obstetra $alt obsoleta $alt2 obsoleto $alt2 -pbvivera $alt +obtivera $alt obtivermos $alt odisseia $alt onu $1 +olho $alt2 $noun +osso $alt2 +ossos $alt opereta $alt2 ordens $alt -osso $alt2 ostra $alt2 ovos $alt pachorra $alt2 -padeceste $alt2 paexa paeSa palacete $alt2 palheta $alt2 @@ -961,14 +949,12 @@ pelego $alt2 pelo $alt $verb perde $alt perdem $alt -perede $alt2 pesa $alt pesam $alt pesque $alt pesquem $alt -peso $alt -peso $alt2 $noun -piloto $alt2 +peso $alt $verb +piloto $alt2 $noun pintora $alt2 pirueta $alt2 plateia $alt @@ -984,14 +970,14 @@ poxa p'oS& preta $alt2 preto $alt2 primavera $alt -profere $alt -proferem $alt provo $alt puder $alt -punheta $alt +puderdes $alt +pudermos $alt puserdes $alt quarteto $alt2 quinteto $alt2 +quiserdes $alt quisermos $alt recomeço $alt2 $noun recordo $alt @@ -1008,19 +994,28 @@ remorso $alt reprovo $alt resolve $alt resolvem $alt +retorno $alt $verb rixa x'iS& rocha $alt rock $alt rogas $alt +rola $alt2 $noun rolo $alt2 $noun +rosna $alt +rosnam $alt +rosne $alt +rosnem $alt +rosno $alt rumores $alt2 saleta $alt2 sarjeta $alt severa $alt severo $alt seborreia $alt -seco $alt2 $noun -secos $alt2 +seca $alt2 $noun +secas $alt2 +seco $alt2 +seco $alt $verb selo $alt $verb selvagem seUv'aZeIN sexteto $alt2 @@ -1056,17 +1051,18 @@ tapete $alt2 tempero $alt2 $noun teta $alt2 tetra $alt -tiver $alt -tivera $alt -tiveres $alt +tiverdes $alt tivermos $alt tocha $alt toga $alt tola $alt2 tolo $alt2 +tolhe $alt +tolhem $alt topo $alt $verb torno $alt $verb -torres $alt2 +torre $alt2 $noun +torres $alt2 tortos $alt traqueia $alt travesso $alt2 @@ -1076,16 +1072,18 @@ troco $alt2 $noun tropa $alt tropeço $alt2 $noun trombeta $alt2 +tumores $alt2 valeta $alt2 vanessa $alt2 velozes $alt -verbo $alt verme $alt vierem $alt violeta $alt2 +violoncelo $alt voga $alt vozes $alt xarope $alt +xeque $alt zelo $alt $verb zero $alt zorra $alt2 diff --git a/dictsource/pt_rules b/dictsource/pt_rules index 96702e44..7a1a327f 100644 --- a/dictsource/pt_rules +++ b/dictsource/pt_rules @@ -58,7 +58,7 @@ an (K+ &~N anh (A &~n^ am (_ =&U~ -?1 a (z_ 'a //eg: paz, rapaz, capaz, etc... + a (z_ 'a //eg: paz, rapaz, capaz, etc... ?1 C) acç 'a's // eg: selecção, etc... ai aI @@ -178,7 +178,7 @@ e (ctA_ E e (ctAm_ E e (çA_ E - e (çAm_ E + e (çAm_ E e (de_ E e (dem_ E @@ -304,7 +304,7 @@ ?1 _n) e (nhu i // eg: nenhum, nenhuma, nenhuns, nenhumas. ?1 e (la_ 'E // eg: cadela, janela, vela, etc... ?1 C) e (cC ,E // eg: seleccionar, efectuar, etc... -?1 C) ecç 'E's // eg: selecção, etc... +?1 C) ecç 'Es // eg: selecção, etc... ?1 C) e (ã i // leão, panteão, etc. ?1 C) e (a i // oceano, etc. ?1 C) e (o 'i // eg: geologia, etc... @@ -342,110 +342,138 @@ ?1 l) e (ta 'E // eg: bicicleta, atleta. - sf) e (ra_ E // esfera, biosfera - + sf) e (ra_ E // esfera, biosfera + //sort - _fiz) e (L05_ E - _exag) e (L05_ E - _houv) e (L05_ E - _perd) e (L05_ e - _soub) e (L05_ E - _rend) e (L06_ e - _vend) e (L06_ e - _atend) e (L06_ e + _com) e (L05_ e + fiz) e (L05_ E + _coub) e (L05_ E + _exag) e (L05_ E + _houv) e (L05_ E + _perd) e (L05_ e + _soub) e (L05_ E + tiv) e (L05_ E // es- +_atend) e (L06_ e _compreend) e (L06_ e -_entend) e (L06_ e -_estend) e (L06_ e -respond) e (L06_ e // cor- - com) e (L07_ e - _bat) e (L07_ e - _beb) e (L07_ e - _tem) e (L07_ e - _viv) e (L07_ e - colh) e (L07_ e // & es- - _corr) e (L07_ e - _eleg) e (L07_ e - _morr) e (L07_ e - _perd) e (L07_ e - _sofr) e (L07_ e - _torc) e (L07_ e - _venc) e (L07_ e - _adoec) e (L07_ e - _aperd) e (L07_ e - _merec) e (L07_ e - conhec) e (L07_ e // & re- - entend) e (L07_ e - preend) e (L07_ e // sur- com- - respond) e (L07_ e // cor- -_convenc) e (L07_ e +_entend) e (L06_ e +_estend) e (L06_ e + _rend) e (L06_ e + _vend) e (L06_ e +respond) e (L06_ e // cor- +_aborrec) e (L07_ e +_adoec) e (L07_ e +_amanhec) e (L07_ e +_anoitec) e (L07_ e +_arrepend) e (L07_ e + _beb) e (L07_ e + _com) e (L07_ e +_defend) e (L07_ e +_depend) e (L07_ e + _eleg) e (L07_ e +_enlouquec) e (L07_ e _entristec) e (L07_ e -_envaidec) e (L07_ e -_escond) e (L07_ e -_obedec) e (L07_ e -interromp) e (L07_ e -intromet) e (L07_ e - qu) e (brL04_ E - _hosp) e (dL03_ E - _estr) ei (L03_ EI - _inv) e (jL04_ E - _dec) e (pL04_ E - _p) e (quL02_ E - _s) e (quL02_ E - l) e (que_ E - _imp) e (rL03_ E - _reit) e (rL03_ E - _g) e (rL04_ E - _op) e (rL04_ E - _qu) e (rL04_ E - _alt) e (rL04_ E - _sup) e (rL04_ E - _tol) e (rL04_ E - _coop) e (rL04_ E - _temp) e (rL04_ E - _) e (rguL02_ E - _alb) e (rguL02_ E - _enx) e (rguL02_ E - _inv) e (rtL03_ e - _f) e (rvL03_ e - _p) e (scL03_ E - _m) e (sclL04 E - _l) e (ssL02_ e - _esp) e (ssL03_ e - _m) e (tL03_ e - _com) e (tL03_ e - _rem) e (tL03_ e - _derr) e (tL03_ e - _prom) e (tL03_ e - _subm) e (tL03_ e -_comprom) e (tL03_ e - _sol) e (trL03_ E - _pen) e (trL04_ E - scr) e (vL03_ e // e- in- pre- ree- - _atr) e (vL03_ e - _descr) e (vL03_ e - _pr) e (zL04_ E - _embel) e (zL04_ E - par) e (çL01_ e // pareça, apareça - _acont) e (çL01_ e - _arref) e (çL01_ e - _ado) e (çL03_ e - _aqu) e (çL03_ e - _car) e (çL03_ e - _mer) e (çL03_ e - _pad) e (çL03_ e - _per) e (çL03_ e - _esqu) e (çL03_ e - _obed) e (çL03_ e - _ofer) e (çL03_ e - _aborr) e (çL03_ e -_compar) e (çL03_ e -_desapar) e (çL03_ e -_enfraqu) e (çL03_ e -_enriqu) e (çL03_ e -_envaid) e (çL03_ e -_esclar) e (çL03_ e -_reapar) e (çL03_ e -_reconh) e (çL03_ e +_envaidec) e (L07_ e +_envelhec) e (L07_ e + _ergu) e (L07_ e +_esclarec) e (L07_ e +_escond) e (L07_ e +_escurec) e (L07_ e +_esquec) e (L07_ e +_interromp) e (L07_ e + _mord) e (L07_ e + _morr) e (L07_ e +_obedec) e (L07_ e + _perd) e (L07_ e + _sofr) e (L07_ e + _tem) e (L07_ e +aprend) e (L07_ e // re- + bat) e (L07_ e // re- com- + ced) e (L07_ e // pro- con- su- + colh) e (L07_ e // & es- +conhec) e (L07_ e // & re- des- + corr) e (L07_ e // per- con- in- so- dis- +entend) e (L07_ e + merec) e (L07_ e // des- + met) e (L07_ e // co- pro- arre- re- intro- compro- sub- + padec) e (L07_ e // com- + parec) e (L07_ e // a- rea- com- desa- +preend) e (L07_ e // sur- com- +respond) e (L07_ e // cor- + torc) e (L07_ e // con- + venc) e (L07_ e // con- + vert) e (L07_ e // in- re- con- + viv) e (L07_ e // re- + qu) e (brL04_ E + _hosp) e (dL03_ E + _gr) e (gL03_ e + _n) e (grL03_ e + _estr) ei (L03_ EI + _inv) e (jL04_ E + _dec) e (pL04_ E + _s) e (quL02_ E + _p) e (quL02_ E + l) e (que_ E + _imp) e (rL03_ E + _reit) e (rL03_ E + _g) e (rL04_ E + _op) e (rL04_ E + _qu) e (rL04_ E + _alt) e (rL04_ E + _sup) e (rL04_ E + _tol) e (rL04_ E + _coop) e (rL04_ E + _temp) e (rL04_ E + _ven) e (rL04_ E + _v) e (rbL03_ E + _h) e (rdL04_ E + _) e (rguL02_ E + _alb) e (rguL02_ E + _enx) e (rguL02_ E + _bez) e (rrL03_ e + _inv) e (rtL03_ e + _f) e (rvL03_ e + _p) e (scL03_ E + _m) e (sclL04 E + _l) e (ssL02_ e + _esp) e (ssL03_ e + _m) e (tL03_ e + _com) e (tL03_ e + prom) e (tL03_ e // com- + _derr) e (tL03_ e + _rem) e (tL03_ e + _sol) e (trL03_ E + _pen) e (trL04_ E + _atr) e (vL03_ e + scr) e (vL03_ e // e- in- pre- ree- de- + _pr) e (zL04_ E +_embel) e (zL04_ E +_acont) e (çL01_ e +_arref) e (çL01_ e + _aqu) e (çL03_ e + _car) e (çL03_ e +_estrem) e (çL03_ e + _mer) e (çL03_ e + _pad) e (çL03_ e // com- + _per) e (çL03_ e + par) e (çL03_ e // a- re- com- rea- desa- + _esqu) e (çL03_ e + _obed) e (çL03_ e + _ofer) e (çL03_ e + abast) e (çL03_ e // re- +_aborr) e (çL03_ e +_fortal) e (çL03_ e + _ado) e (çL03_ e +_amanh) e (çL03_ e +_anoit) e (çL03_ e +_enfraqu) e (çL03_ e +_enlouqu) e (çL03_ e +_enriqu) e (çL03_ e +_entrist) e (çL03_ e +_envaid) e (çL03_ e +_envelh) e (çL03_ e +_esclar) e (çL03_ e + _forn) e (çL03_ e + conh) e (çL03_ e // re- //endsort @@ -626,7 +654,7 @@ _reconh) e (çL03_ e oi oI oi ($w_alt OI oi ($w_alt2++ oI - oi (a_ OI // ?? + oi (a_ OI // ?? oi (cA_ OI oi (de_ OI oi (s oI @@ -662,7 +690,7 @@ _reconh) e (çL03_ e o (ltAm_ O o (sA_ O - o (so_N o // not for osos_ + o (so_N o // not for osos_ o (sAm_ O o (ssA_ O @@ -751,9 +779,8 @@ _desabr) o (chL04_ O _rev) o (lvL02_ O _desenv) o (lvL02_ O _ent) o (pL02_ O - c) o (rrL01_ o // escorra, incorra, corra, recorra + c) o (rrL01_ o // escorra, incorra, corra, recorra _m) o (rrL01_ o - _r) o (snL01_ O _c) o (spL02_ O p) ostos (_ Ost=Us# // dispostos etc. //endsort @@ -893,8 +920,8 @@ _desenv) o (lvL02_ O r) u (_A u u (A_ 'u - u (am_ 'u - u (em_ 'u + u (am_ 'u + u (em_ 'u ui uI ui (_ 'uI u (iu w diff --git a/dictsource/vi_rules b/dictsource/vi_rules index 6e8db88f..fa8ef8d3 100644 --- a/dictsource/vi_rules +++ b/dictsource/vi_rules @@ -1,740 +1,758 @@ -// replace combining (tone) accents with single characters -.replace -à à -á á -ả ả -ã ã -ạ ạ - - -ằ ằ -ắ ắ -ẳ ẳ -ẵ ẵ -ặ ặ - -ầ ầ -ấ ấ -ẩ ẩ -ẫ ẫ -ậ ậ - -è è -é é -ẻ ẻ -ẽ ẽ -ẹ ẹ - -ề ề -ế ế -ể ể -ễ ễ -ệ ệ - -ì ì -í í -ỉ ỉ -ĩ ĩ -ị ị - -ò ò -ó ó -ỏ ỏ -õ õ -ọ ọ - -ồ ồ -ố ố -ổ ổ -ỗ ỗ -ộ ộ - -ờ ờ -ớ ớ -ở ở -ỡ ỡ -ợ ợ - -ù ù -ú ú -ủ ủ -ũ ũ -ụ ụ - -ừ ừ -ứ ứ -ử ử -ữ ữ -ự ự - -ỳ ỳ -ý ý -ỷ ỷ -ỹ ỹ -ỵ ỵ - - -//================================ -// Consonants -//================================ - -.group b - b b - _) b _b - -.group c - c g //k - c (_ kh - ch c // try [tS;] [tS] [c] - -.group d - d J^ // try [z] [J] [dZ] [dZ;] [J^] - -.group đ - đ d - _) đ _d - -.group f - f f - - -.group g - g Q // try [g] [Q] - gh Q // or [g] [Q] - g (i J^ // try [D] [z] [j] [J^] [z;] [J] [dZ] - g (ì J^ - g (í J^ - g (ỉ J^ - g (ĩ J^ - g (ị J^ - gi J^ - -.group h - h h - - -.group j - j Z - - -.group k - k k - k (_ kh - kh x - -.group l - l l - -.group m - m m - -.group n - n n - ng N - ngh N - nh n^ - -.group ñ - ñ n^ - -.group p - p p - ph f - -.group q - q k - q (_ kh - qu w //kw - -.group r - r z. // try [z] [z.] [r] [z;] - -.group s - s s. // try [s.] [s] [S] - -.group t - t t[ - th t - tr cr // try [cr] [tr] [tS;] [tS] [c] [dZ] [dz;] - -.group v - v v - -.group w - w w - -.group x - x s - -.group z - z z - - -//================================ -// Vowels -//================================ - -.group a - a a: - ai a:I - aì a:I2 - aí a:I3 - aỉ a:I4 - aĩ a:I5 - aị a:I6 - ay aI - aỳ aI2 - aý aI3 - aỷ aI4 - aỹ aI5 - aỵ aI6 - ao a:U - aò a:U2 - aó a:U3 - aỏ a:U4 - aõ a:U5 - aọ a:U6 - au aU - aù aU2 - aú aU3 - aủ aU4 - aũ aU5 - aụ aU6 - -.group à - à a:2 - ài a:I2 - ày aI2 - ào a:U2 - àu aU2 - -.group á - á a:3 - ái a:I3 - áy aI3 - áo a:U3 - áu aU3 - -.group ả - ả a:4 - ải a:I4 - ảy aI4 - ảo a:U4 - ảu aU4 - -.group ã - ã a:5 - ãi a:I5 - ãy aI5 - ão a:U5 - ãu aU5 - -.group ạ - ạ a:6 - ại a:I6 - ạy aI6 - ạo a:U6 - ạu aU6 - -//================================ -.group ă - ă a - -.group ằ - ằ a2 - -.group ắ - ắ a3 - -.group ẳ - ẳ a4 - -.group ẵ - ẵ a5 - -.group ặ - ặ a6 - -//================================= -.group â - â @ - ây @I - âu @U - -.group ầ - ầ @2 - ầy @I2 - ầu @U2 - -.group ấ - ấ @3 - ấy @I3 - ấu @U3 - -.group ẩ - ẩ @4 - ẩy @I4 - ẩu @U4 - -.group ẫ - ẫ @5 - ẫy @I5 - ẫu @U5 - -.group ậ - ậ @6 - ậy @I6 - ậu @U6 - -//=========================== -.group e - e E - eo EU - eò EU2 - eó EU3 - eỏ EU4 - eỗ EU5 - eọ EU6 - -.group è - è E2 - èo EU2 - -.group é - é E3 - éo EU3 - -.group ẻ - ẻ E4 - ẻo EU4 - -.group ẽ - ẽ E5 - ẽo EU5 - -.group ẹ - ẹ E6 - ẹo EU6 - -//============================ - -.group ê - ê e - êu eU - -.group ề - ề e2 - ều eU2 - -.group ế - ế e3 - ếu eU3 - -.group ể - ể e4 - ểu eU4 - -.group ễ - ễ e5 - ễu eU5 - -.group ệ - ệ e6 - ệu eU6 - - -//============================ -.group i - i i - i (A j - ia i@ - ià i@2 - iá i@3 - iả i@4 - iã i@5 - iạ i@6 - iê i@ - iề i@2 - iế i@3 - iể i@4 - iễ i@5 - iệ i@6 - iu iU - iù iU2 - iú iU3 - iủ iU4 - iũ iU5 - iụ iU6 -// iêu i@U - -.group ì - ì i2 - ì (A j2 - ìa i@2 - ìu iU2 - -.group í - í i3 - í (A j3 - ía i@3 - íu iU3 - -.group ỉ - ỉ i4 - ỉ (A j4 - ỉa i@4 - ỉu iU4 - -.group ĩ - ĩ i5 - ĩ (A j5 - ĩa i@5 - ĩu iU5 - -.group ị - ị i6 - ị (A j6 - ịa i@6 - ịu iU6 - - - -//========================= -.group o - o O - oa o@ // modify oa sound example: hoa,khoa // o (A w - oi OI - oì OI2 - oí OI3 - oỉ OI4 - oĩ OI5 - oị OI6 - ong O# - oe o& // Adding oe sound example: lóe sáng,toét mắt -.group ò - ò O2 - òi OI2 - òa o@2 //ò (A w2 - òng O#2 - òe o&2 - -.group ó - ó O3 - ói OI3 - óa o@3 //ó (A w3 - óng O#3 - óe o&3 - -.group ỏ - ỏ O4 - ỏi OI4 - ỏa o@4 //ỏ (A w4 - ỏng O#4 - ỏe o&4 - -.group õ - õ O5 - õi OI5 - õa o@5 //õ (A w5 - õng O#5 - õe o&5 - -.group ọ - ọ O6 - ọi OI6 - ọa o@6 //ọ (A w6 - ọng O#6 - ọe o&6 - - -//============================= -.group ô - ô o - ôi oI - ông o# // ông sound - -.group ồ - ồ o2 - ồi oI2 - ồng o#2 - -.group ố - ố o3 - ối oI3 - ống o#3 - -.group ổ - ổ o4 - ổi oI4 - ổng o#4 - -.group ỗ - ỗ o5 - ỗi oI5 - ỗng o#5 - -.group ộ - ộ o6 - ội oI6 - ộng o#6 - - - -//============================= -.group ơ - ơ @: - ơi @:I - ơu @:U - -.group ờ - ờ @:2 - ời @:I2 - ờu @:U2 - -.group ớ - ớ @:3 - ới @:I3 - ớu @:U3 - -.group ở - ở @:4 - ởi @:I4 - ởu @:U4 - -.group ỡ - ỡ @:5 - ỡi @:I5 - ỡu @:U5 - -.group ợ - ợ @:6 - ợi @:I6 - ợu @:U6 - - - -//============================= -.group u - u u - u (A w - A) u w - ui uI - uì uI2 - uí uI3 - uỉ uI4 - uĩ uI5 - uị uI6 - ua u@ - uà u@2 - uá u@3 - uả u@4 - uã u@5 - uạ u@6 - uô u@ - uồ u@2 - uố u@3 - uổ u@4 - uỗ u@5 - uộ u@6 - uôi u@j - uồi u@j2 - uối u@j3 - uổi u@j4 - uỗi u@j5 - uội u@j6 - //ung u# -.group ù - ù u2 - ù (A w2 - ùi uI2 - ùa u@2 - //ùng u#2 - -.group ú - ú u3 - ú (A w3 - úi uI3 - úa u@3 - //úng u#3 - -.group ủ - ủ u4 - ủ (A w4 - ủi uI4 - ủa u@4 - //ủng u#4 - -.group ũ - ũ u5 - ũ (A w5 - ũi uI5 - ũa u@5 - //ũng u#5 - -.group ụ - ụ u6 - ụ (A w6 - ụi uI6 - ụa u@6 - //ụng u#6 - -//============================= -.group ư - ư y - ưi yI - ưa y@ - ươ y@ - ườ y@2 - ướ y@3 - ưở y@4 - ưỡ y@5 - ượ y@6 - ưu yw - ươi y@j - ười y@j2 - ưới y@j3 - ưởi y@j4 - ưỡi y@j5 - ượi y@j6 - ươu y@w - ườu y@w2 - ướu y@w3 - ưởu y@w4 - ưỡu y@w5 - ượu y@w6 - -.group ừ - ừ y2 - ừi yI2 - ừa y@2 - ừu yw2 - -.group ứ - ứ y3 - ứi yI3 - ứa y@3 - ứu yw3 - -.group ử - ử y4 - ửi yI4 - ửa y@4 - ửu yw4 - -.group ữ - ữ y5 - ữi yI5 - ữa y@5 - ữu yw5 - -.group ự - ự y6 - ựi yI6 - ựa y@6 - ựu yw6 - - - -.group y - y i - y (A j - ya i@ - yà i@2 - yá i@3 - yả i@4 - yã i@5 - yạ i@6 - yê i@ - yề i@2 - yế i@3 - yể i@4 - yễ i@5 - yệ i@6 -// yêu i@U - -.group ỳ - ỳ i2 - ỳ (A j2 - ỳa i@2 - -.group ý - ý i3 - ý (A j3 - ýa i@3 - -.group ỷ - ỷ i4 - ỷ (A j4 - ỷa i@4 - -.group ỹ - ỹ i5 - ỹ (A j5 - ỹa i@5 - -.group ỵ - ỵ i6 - ỵ (A j6 - ỵa i@6 - -.group 0xce // Greek letters -// 0xce is the first byte of the utf-8 code for these characters - - α a:1n_|f'a:1 - ά a:1n_|f'a:1 - β b'e1_|t['a:1 - γ Q'a:1_|m'a:1 - δ J'E1n_|t['a:1 - ε E1p_|s'i1_|l'O1n - έ E1p_|s'i1_|l'O1n - ζ D'e1_|t['a:1 - η e1_|t['a:1 - ή e1_|t['a:1 - θ t'e1_|t['a:1 - ι i1_|'o1_|t['a:1 - ί i1_|'o1_|t['a:1 - κ k'a:1p_|p'a:1 - λ l'a1m_|_d'a:1 - μ mw'i1 - ν nw'i1 - ξ s'i7 - ο o1_|m'i1_|kz.'O7n - -.group 0xcf // Greek letters - - π p'i1 - ρ z.'o1 - σ s'i3c_|m'a:1 - ς s'i3c_|m'a:1 - τ t['o1 - υ u1p_|s'i1_|l'O1n - ύ u1p_|s'i1_|l'O1n - φ f'i1 - χ c'i1 - ψ ps'i1 - ω o1_|m'e1_|Q'a:7 - ώ o1_|m'e1_|Q'a:7 - ό o1_|m'i1_|kz.'O7n - - -.group - % f'@2n||cr'am - ! _:c'@3m_|t'a:7n_: - ! (\! -// : koUl@n - D_) h (_DD_ D'@:2 // omit colon in time, eg: 2:30 - $ d'o||l'a - != x'o#_|_b'a2N_ - >= l'@:3n_|h'@:1n_|hw,a6kh_b'a2N - <= n^'O4_|h'@:1n_|hw,a6kh_b'a2N - - - __) - (_D cr'y2 - A_) - (_D _ - C_) - (_D _ - - - . c'@3m_ - . (. _: - \.) . - +// replace combining (tone) accents with single characters +.replace +à à +á á +ả ả +ã ã +ạ ạ + + +ằ ằ +ắ ắ +ẳ ẳ +ẵ ẵ +ặ ặ + +ầ ầ +ấ ấ +ẩ ẩ +ẫ ẫ +ậ ậ + +è è +é é +ẻ ẻ +ẽ ẽ +ẹ ẹ + +ề ề +ế ế +ể ể +ễ ễ +ệ ệ + +ì ì +í í +ỉ ỉ +ĩ ĩ +ị ị + +ò ò +ó ó +ỏ ỏ +õ õ +ọ ọ + +ồ ồ +ố ố +ổ ổ +ỗ ỗ +ộ ộ + +ờ ờ +ớ ớ +ở ở +ỡ ỡ +ợ ợ + +ù ù +ú ú +ủ ủ +ũ ũ +ụ ụ + +ừ ừ +ứ ứ +ử ử +ữ ữ +ự ự + +ỳ ỳ +ý ý +ỷ ỷ +ỹ ỹ +ỵ ỵ + + +//================================ +// Consonants +//================================ + +.group b + b b + _) b _b + +.group c + c g //k + c (_ kh + ch c // try [tS;] [tS] [c] + + +.group d + d J^ // try [z] [J] [dZ] [dZ;] [J^] + +.group đ + đ d + _) đ _d + +.group f + f f + + +.group g + g Q // try [g] [Q] + gh Q // or [g] [Q] + //g (i J^ // try [D] [z] [j] [J^] [z;] [J] [dZ] + //g (ì J^ + //g (í J^ + //g (ỉ J^ + //g (ĩ J^ + //g (ị J^ + gi J^ +?1 giết J^'iE3g + giết J^'iE3t[ + giếc J^'iE3kh +?1 giệt J^'iE6g + giệt J^'iE6t[ + giệc J^'iE6kh + +.group h + h h + + +.group j + j Z + + +.group k + k k + k (_ kh + kh x + +.group l + l l + +.group m + m m + +.group n + n n +?1 n (_ N //n + ng N + ngh N + nh n^ + +.group ñ + ñ n^ + +.group p + p p + ph f + +.group q + q k + q (_ kh + qu w //kw + +.group r + r z. // try [z] [z.] [r] [z;] + +.group s + s s. // try [s.] [s] [S] + +.group t + t t[ +?1 t (_ g + th t + tr cr // try [cr] [tr] [tS;] [tS] [c] [dZ] [dz;] + +.group v + v v + +.group w + w w + +.group x + x s + +.group z + z z + + + + +//================================ +// Vowels +//================================ + +.group a + a a: + ai a:I + aì a:I2 + aí a:I3 + aỉ a:I4 + aĩ a:I5 + aị a:I6 + ay aI + aỳ aI2 + aý aI3 + aỷ aI4 + aỹ aI5 + aỵ aI6 + ao a:U + aò a:U2 + aó a:U3 + aỏ a:U4 + aõ a:U5 + aọ a:U6 + au aU + aù aU2 + aú aU3 + aủ aU4 + aũ aU5 + aụ aU6 + +.group à + à a:2 + ài a:I2 + ày aI2 + ào a:U2 + àu aU2 + +.group á + á a:3 + ái a:I3 + áy aI3 + áo a:U3 + áu aU3 + +.group ả + ả a:4 + ải a:I4 + ảy aI4 + ảo a:U4 + ảu aU4 + +.group ã + ã a:5 + ãi a:I5 + ãy aI5 + ão a:U5 + ãu aU5 + +.group ạ + ạ a:6 + ại a:I6 + ạy aI6 + ạo a:U6 + ạu aU6 + +//================================ +.group ă + ă a + +.group ằ + ằ a2 + +.group ắ + ắ a3 + +.group ẳ + ẳ a4 + +.group ẵ + ẵ a5 + +.group ặ + ặ a6 + +//================================= +.group â + â @ + ây @I + âu @U1 + +.group ầ + ầ @2 + ầy @I2 + ầu @U2 + +.group ấ + ấ @3 + ấy @I3 + ấu @U3 + +.group ẩ + ẩ @4 + ẩy @I4 + ẩu @U4 + +.group ẫ + ẫ @5 + ẫy @I5 + ẫu @U5 + +.group ậ + ậ @6 + ậy @I6 + ậu @U6 + +//=========================== +.group e + e E + eo EU + eò EU2 + eó EU3 + eỏ EU4 + eỗ EU5 + eọ EU6 + +.group è + è E2 + èo EU2 + +.group é + é E3 + éo EU3 + +.group ẻ + ẻ E4 + ẻo EU4 + +.group ẽ + ẽ E5 + ẽo EU5 + +.group ẹ + ẹ E6 + ẹo EU6 + +//============================ + +.group ê + ê e + êu eU1 + +.group ề + ề e2 + ều eU2 + +.group ế + ế e3 + ếu eU3 + +.group ể + ể e4 + ểu eU4 + +.group ễ + ễ e5 + ễu eU5 + +.group ệ + ệ e6 + ệu eU6 + + + +//============================ +.group i + i i + i (A j + ia i@ + ià i@2 + iá i@3 + iả i@4 + iã i@5 + iạ i@6 + iê iE + iề iE2 + iế iE3 + iể iE4 + iễ iE5 + iệ iE6 + iu iU + iù iU2 + iú iU3 + iủ iU4 + iũ iU5 + iụ iU6 + iêu iU + iều iU2 + iếu iU3 + iểu iU4 + iễu iU5 + iệu iU6 + +.group ì + ì i2 + ì (A j2 + ìa i@2 + ìu iU2 + +.group í + í i3 + í (A j3 + ía i@3 + íu iU3 + +.group ỉ + ỉ i4 + ỉ (A j4 + ỉa i@4 + ỉu iU4 + +.group ĩ + ĩ i5 + ĩ (A j5 + ĩa i@5 + ĩu iU5 + +.group ị + ị i6 + ị (A j6 + ịa i@6 + ịu iU6 + + + +//========================= +.group o + o O + oa o@ // modify oa sound example: hoa,khoa // o (A w + oi OI + oì OI2 + oí OI3 + oỉ OI4 + oĩ OI5 + oị OI6 + ong O# + oe o& // Adding oe sound example: lóe sáng,toét mắt + +.group ò + ò O2 + òi OI2 + òa o@2 //ò (A w2 + òng O#2 + òe o&2 + +.group ó + ó O3 + ói OI3 + óa o@3 //ó (A w3 + óng O#3 + óe o&3 + +.group ỏ + ỏ O4 + ỏi OI4 + ỏa o@4 //ỏ (A w4 + ỏng O#4 + ỏe o&4 + +.group õ + õ O5 + õi OI5 + õa o@5 //õ (A w5 + õng O#5 + õe o&5 + +.group ọ + ọ O6 + ọi OI6 + ọa o@6 //ọ (A w6 + ọng O#6 + ọe o&6 + + +//============================= +.group ô + ô o + ôi oI + ông o# // ông sound + +.group ồ + ồ o2 + ồi oI2 + ồng o#2 + +.group ố + ố o3 + ối oI3 + ống o#3 + +.group ổ + ổ o4 + ổi oI4 + ổng o#4 + +.group ỗ + ỗ o5 + ỗi oI5 + ỗng o#5 + +.group ộ + ộ o6 + ội oI6 + ộng o#6 + + + +//============================= +.group ơ + ơ @: + ơi @:I + ơu @:U + +.group ờ + ờ @:2 + ời @:I2 + ờu @:U2 + +.group ớ + ớ @:3 + ới @:I3 + ớu @:U3 + +.group ở + ở @:4 + ởi @:I4 + ởu @:U4 + +.group ỡ + ỡ @:5 + ỡi @:I5 + ỡu @:U5 + +.group ợ + ợ @:6 + ợi @:I6 + ợu @:U6 + + + +//============================= +.group u + u u + u (A w + A) u w + ui uI + uì uI2 + uí uI3 + uỉ uI4 + uĩ uI5 + uị uI6 + ua u@ + uà u@2 + uá u@3 + uả u@4 + uã u@5 + uạ u@6 + uô u@ + uồ u@2 + uố u@3 + uổ u@4 + uỗ u@5 + uộ u@6 + uôi u@j + uồi u@j2 + uối u@j3 + uổi u@j4 + uỗi u@j5 + uội u@j6 + //ung u# +.group ù + ù u2 + ù (A w2 + ùi uI2 + ùa u@2 + //ùng u#2 + +.group ú + ú u3 + ú (A w3 + úi uI3 + úa u@3 + //úng u#3 + +.group ủ + ủ u4 + ủ (A w4 + ủi uI4 + ủa u@4 + //ủng u#4 + +.group ũ + ũ u5 + ũ (A w5 + ũi uI5 + ũa u@5 + //ũng u#5 + +.group ụ + ụ u6 + ụ (A w6 + ụi uI6 + ụa u@6 + //ụng u#6 + +//============================= +.group ư + ư y + ưi yI + ưa y@ + ươ y@ + ườ y@2 + ướ y@3 + ưở y@4 + ưỡ y@5 + ượ y@6 + ưu yw + ươi y@j + ười y@j2 + ưới y@j3 + ưởi y@j4 + ưỡi y@j5 + ượi y@j6 + ươu y@w + ườu y@w2 + ướu y@w3 + ưởu y@w4 + ưỡu y@w5 + ượu y@w6 + +.group ừ + ừ y2 + ừi yI2 + ừa y@2 + ừu yw2 + +.group ứ + ứ y3 + ứi yI3 + ứa y@3 + ứu yw3 + +.group ử + ử y4 + ửi yI4 + ửa y@4 + ửu yw4 + +.group ữ + ữ y5 + ữi yI5 + ữa y@5 + ữu yw5 + +.group ự + ự y6 + ựi yI6 + ựa y@6 + ựu yw6 + + + +.group y + y i + y (A j + ya i@ + yà i@2 + yá i@3 + yả i@4 + yã i@5 + yạ i@6 + yê i@ + yề i@2 + yế i@3 + yể i@4 + yễ i@5 + yệ i@6 + // yêu i@U + +.group ỳ + ỳ i2 + ỳ (A j2 + ỳa i@2 + +.group ý + ý i3 + ý (A j3 + ýa i@3 + +.group ỷ + ỷ i4 + ỷ (A j4 + ỷa i@4 + +.group ỹ + ỹ i5 + ỹ (A j5 + ỹa i@5 + +.group ỵ + ỵ i6 + ỵ (A j6 + ỵa i@6 + +.group 0xce // Greek letters +// 0xce is the first byte of the utf-8 code for these characters + + α a:1n_|f'a:1 + ά a:1n_|f'a:1 + β b'e1_|t['a:1 + γ Q'a:1_|m'a:1 + δ J'E1n_|t['a:1 + ε E1p_|s'i1_|l'O1n + έ E1p_|s'i1_|l'O1n + ζ D'e1_|t['a:1 + η e1_|t['a:1 + ή e1_|t['a:1 + θ t'e1_|t['a:1 + ι i1_|'o1_|t['a:1 + ί i1_|'o1_|t['a:1 + κ k'a:1p_|p'a:1 + λ l'a1m_|_d'a:1 + μ mw'i1 + ν nw'i1 + ξ s'i7 + ο o1_|m'i1_|kz.'O7n + +.group 0xcf // Greek letters + + π p'i1 + ρ z.'o1 + σ s'i3c_|m'a:1 + ς s'i3c_|m'a:1 + τ t['o1 + υ u1p_|s'i1_|l'O1n + ύ u1p_|s'i1_|l'O1n + φ f'i1 + χ c'i1 + ψ ps'i1 + ω o1_|m'e1_|Q'a:7 + ώ o1_|m'e1_|Q'a:7 + ό o1_|m'i1_|kz.'O7n + + +.group + % f'@2n||cr'am + ! _:c'@3m_|t'a:7n_: + ! (\! +// : koUl@n + D_) h (_DD_ D'@:2 // omit colon in time, eg: 2:30 + $ d'o||l'a + != x'o#_|_b'a2N_ + >= l'@:3n_|h'@:1n_|hw,a6kh_b'a2N + <= n^'O4_|h'@:1n_|hw,a6kh_b'a2N + + + __) - (_D cr'y2 + A_) - (_D _ + C_) - (_D _ + + + . c'@3m_ + . (. _: + \.) . + diff --git a/espeak-data/voices/en/en-us b/espeak-data/voices/en/en-us index 7673b3bc..fd86703c 100644 --- a/espeak-data/voices/en/en-us +++ b/espeak-data/voices/en/en-us @@ -14,4 +14,4 @@ stressAmp 17 16 19 19 19 19 21 19 replace 03 I i replace 03 I2 i -replace 03 @ @/ + diff --git a/espeak-data/voices/vi-hue b/espeak-data/voices/vi-hue new file mode 100644 index 00000000..83849f89 --- /dev/null +++ b/espeak-data/voices/vi-hue @@ -0,0 +1,12 @@ +name vietnam_hue +language vi-hue +phonemes vi-hue +dictrules 1 +gender male + +words 1 +pitch 82 118 //80 118 +//breath 75 75 60 40 15 10 + //breathw 150 150 200 200 400 400 + voicing 90 //18 + flutter 20 diff --git a/phsource/n/nri b/phsource/n/nri index e2188db1..0a086bc1 100644 Binary files a/phsource/n/nri and b/phsource/n/nri differ diff --git a/phsource/n/nro b/phsource/n/nro index 9b503c3a..1b0e6885 100644 Binary files a/phsource/n/nro and b/phsource/n/nro differ diff --git a/phsource/n/nru b/phsource/n/nru index 890c4923..0a2577d3 100644 Binary files a/phsource/n/nru and b/phsource/n/nru differ diff --git a/phsource/ph_english_us b/phsource/ph_english_us index c15b7ddd..5b2b64cc 100644 --- a/phsource/ph_english_us +++ b/phsource/ph_english_us @@ -8,7 +8,7 @@ phoneme 3 // Schwa, used for rhotic schwa in American vowel starttype #@ endtype #@ ipa ɚ unstressed - length 210 + length 200 IfNextVowelAppend(r-) FMT(vwl_en_us/3_us) endphoneme @@ -21,15 +21,12 @@ phoneme @ // Schwa IF nextPh(isRhotic) THEN ChangePhoneme(3) ENDIF + IF thisPh(isWordEnd) THEN + FMT(vowel/@_6) + ENDIF FMT(vowel/@_4) endphoneme -phoneme @/ // Schwa, end of word - vowel starttype #@ endtype #@ - unstressed - length 130 - FMT(vowel/@_low2) -endphoneme phoneme @2 // Schwa, changes to I before a vowel vowel starttype #@ endtype #@ diff --git a/phsource/ph_pt_brazil b/phsource/ph_pt_brazil index a6bba543..e7f233db 100644 --- a/phsource/ph_pt_brazil +++ b/phsource/ph_pt_brazil @@ -39,7 +39,11 @@ phoneme &~ vowel starttype #@ endtype #@ ipa ɐU+0303 length 180 - FMT(vnasal/a#_n) + IF thisPh(isFinalVowel) THEN + FMT(vnasal/W_n) + ELSE + FMT(vnasal/a#_n) + ENDIF endphoneme phoneme &U~ @@ -224,10 +228,3 @@ phoneme * endphoneme -// TESTING -phoneme &2~ - vowel starttype #@ endtype #@ - ipa ɐU+0303 - length 200 - FMT(vnasal/W_n) -endphoneme diff --git a/phsource/ph_vietnam b/phsource/ph_vietnam index eef7563f..52a9e567 100644 --- a/phsource/ph_vietnam +++ b/phsource/ph_vietnam @@ -85,14 +85,18 @@ phoneme i IF prevPhW(w) THEN VowelStart(w/wi) ENDIF - FMT(vowel/i_4) + IF nextPh(n^) OR nextPh(c) THEN + FMT(vnasal/ii_n) +ELSE +FMT(vowel/i_4) +ENDIF endphoneme phoneme O vowel starttype #o endtype #o - IF nextPh(kh) THEN - length 95 + IF nextPh(kh) OR nextPh(N) THEN + length 110 ELSE length 200 ENDIF @@ -101,8 +105,8 @@ endphoneme phoneme o vowel starttype #o endtype #o - IF nextPh(kh) THEN - length 95 + IF nextPh(kh) OR nextPh(N) THEN + length 110 ELSE length 200 ENDIF @@ -286,7 +290,7 @@ endphoneme phoneme u@ vowel starttype #u endtype #@ - length 200 + length 150 //200 FMT(vdiph2/uu@) endphoneme @@ -317,6 +321,12 @@ phoneme o& FMT(vietnam/oe) endphoneme +phoneme iE // iê : viết, giệc + vowel starttype #i endtype #e + length 190 + FMT(vietnam/ie_2) +endphoneme + phoneme kh vls vel frc lengthmod 3 diff --git a/phsource/ph_vietnam_hue b/phsource/ph_vietnam_hue new file mode 100644 index 00000000..373364b0 --- /dev/null +++ b/phsource/ph_vietnam_hue @@ -0,0 +1,49 @@ + +//==================================================== +// Vietnamese Phonemes - Make Huế Dialect +//==================================================== + + +phoneme 1 // ngang tone: level + stress + Tone(30, 2, envelope/p_level, NULL) // similar Hue dialect tone +endphoneme + + +phoneme 2 // huyền tone: low falling + stress + Tone(20, 25, envelope/p_fall,envelope/vi_6amp) // NULL) //20 8 +endphoneme + + +phoneme 3 // sắc Tone(rising + stress + Tone(2, 10, envelope/p_rise, NULL) // 25 50 45 75 +endphoneme + + +phoneme 4 // hỏi Tone(curve (dipping rising) + stress + Tone(20, 5, envelope/p_512,NULL) //Tone(55, 5, envelope/p_fallrise, NULL) //30 5 m 55 5 +endphoneme + + +phoneme 5 // ngã tone: broken (creaking rising) + stress + Tone(50,2, envelope/p_214, envelope/vi_5amp) // 28,58 m20 85 +endphoneme + + +phoneme 6 // nặng Tone(drop (constricted) + stress + //length 150 // ignore because it make too short sound 75 // reduce the length of the vowel + Tone(25, 10, envelope/p_512, envelope/vi_6amp) // 40 20 +endphoneme + + +phoneme 7 // Tone(1 (ngang) at end of clause + stress + Tone(5, 40, envelope/p_level, NULL) //Tone(99, 50, envelope/p_fall, NULL) // 40 20 +endphoneme + + diff --git a/phsource/phonemes b/phsource/phonemes index b83cf47b..2c050525 100644 --- a/phsource/phonemes +++ b/phsource/phonemes @@ -771,12 +771,12 @@ phoneme n. ENDIF NextVowelStarts - VowelStart(n/n@) - VowelStart(n/na) - VowelStart(n/ne) - VowelStart(n/ni) - VowelStart(n/no) - VowelStart(n/nu) + VowelStart(n/nr@) + VowelStart(n/nra) + VowelStart(n/nre) + VowelStart(n/nri) + VowelStart(n/nro) + VowelStart(n/nru) EndSwitch IF prevPh(isNotVowel) AND nextPhW(isLiquid) THEN @@ -1936,4 +1936,3 @@ include ph_korean phonemetable kl base include ph_greenlandic - diff --git a/phsource/vdiph2/uw_6 b/phsource/vdiph2/uw_6 index 6b9b4210..823e327a 100644 Binary files a/phsource/vdiph2/uw_6 and b/phsource/vdiph2/uw_6 differ diff --git a/phsource/vietnam/ie_2 b/phsource/vietnam/ie_2 new file mode 100644 index 00000000..c58f7d60 Binary files /dev/null and b/phsource/vietnam/ie_2 differ diff --git a/phsource/vowel/oe b/phsource/vowel/oe index ef6388b8..c27427bf 100644 Binary files a/phsource/vowel/oe and b/phsource/vowel/oe differ diff --git a/platforms/big_endian/espeak-phoneme-data.c b/platforms/big_endian/espeak-phoneme-data.c index 8d7ca32f..847ff358 100644 --- a/platforms/big_endian/espeak-phoneme-data.c +++ b/platforms/big_endian/espeak-phoneme-data.c @@ -1,5 +1,5 @@ - +// 20.02.13 Add samplerate 4-bytes at start of phondata // 14.09.10 Recognize long and short frames in phondata // 02.09.10 Fix: Q sections were omitted from the converted phondata // 13.08.10 jonsd: Added Q lines. Use Address to set the displacement in phondata file. @@ -235,7 +235,9 @@ void swap_phondata (const char *infile, const char *outfile, exit (1); } - xread = fread(buf_4, 4, 1, in); + xread = fread(buf_4, 4, 1, in); // version number + fwrite(buf_4, 4, 1, out); + xread = fread(buf_4, 4, 1, in); // sample rate fwrite(buf_4, 4, 1, out); while (fgets (line, sizeof(line), mfest)) diff --git a/src/compiledata.cpp b/src/compiledata.cpp index d3312a11..4e83fa7a 100644 --- a/src/compiledata.cpp +++ b/src/compiledata.cpp @@ -27,6 +27,7 @@ #include "wx/wfstream.h" #include "wx/dir.h" #include "wx/filename.h" +#include #include "speak_lib.h" #include "main.h" @@ -45,6 +46,7 @@ extern void FindPhonemesUsed(void); extern void DisplayErrorFile(const char *fname); extern int utf8_out(unsigned int c, char *buf); extern void DrawEnvelopes(); +extern void ReadPhondataManifest(); char path_source[sizeof(path_home)+20]; @@ -465,7 +467,7 @@ return; instn_category = (instn >> 12) & 0xf; data1 = instn & 0xff; type2 = (instn >> 8) & 0xf; - fprintf(f_out, " %.3x: %.4x %s",pc-prog_buf,instn,instn_category_string[instn_category]); + fprintf(f_out, " %.3x: %.4x %s",(unsigned int)(pc-prog_buf),instn,instn_category_string[instn_category]); switch(instn_category) { @@ -644,6 +646,7 @@ static int duplicate_references = 0; static int count_frames = 0; static int error_count = 0; static int resample_count = 0; +static int resample_fails = 0; static int then_count = 0; static int after_if = 0; @@ -738,7 +741,6 @@ static void CompileReport(void) const char *data_path; int prev_table; int prev_mnemonic; - char fname[sizeof(path_source)+20]; if(f_report == NULL) return; @@ -1791,8 +1793,12 @@ static int LoadWavefile(FILE *f, const char *fname) int max = 0; int length; int sr1, sr2; + int failed; + int len; int resample_wav = 0; + const char *fname2; char fname_temp[100]; + char msg[120]; int scale_factor=0; fseek(f,24,SEEK_SET); @@ -1802,53 +1808,67 @@ static int LoadWavefile(FILE *f, const char *fname) if((sr1 != samplerate_native) || (sr2 != sr1*2)) { -#ifdef PLATFORM_WINDOWS - if(sr1 != samplerate_native) + int fd_temp; + char command[sizeof(path_source)+200]; + + failed = 0; + +#ifdef PLATFORM_POSIX + strcpy(fname_temp,"/tmp/espeakXXXXXX"); + if((fd_temp = mkstemp(fname_temp)) >= 0) { - fprintf(f_errors,"Wrong samplerate %d, wants %d\n",sr1,samplerate_native); - error("Wrong samplerate: %s",fname); - } - if(sr2 != sr1*2) - { - error("Not mono: %s",fname); + close(fd_temp); } #else - { - int fd_temp; - char command[sizeof(path_source)+200]; - strcpy(fname_temp,"/tmp/espeakXXXXXX"); - if((fd_temp = mkstemp(fname_temp)) >= 0) - { - close(fd_temp); - sprintf(command,"sox \"%s%s.wav\" -c1 -t wav %s rate -h %d\n",path_source,fname,fname_temp,samplerate_native); - if(system(command) < 0) - { - error("Failed to resample: %s",command); - remove(fname_temp); - return(0); - } - } - - if(GetFileLength(fname_temp) <= 0) - { - error("Failed to resample: %s",command); - remove(fname_temp); - return(0); - } - - f = fopen(fname_temp,"rb"); - if(f == NULL) - { - error("Can't read temp file: %s",fname_temp); - return(0); - } - if(f_report != NULL) - fprintf(f_report, "resampled %s\n", fname); - resample_count++; - resample_wav = 1; - fseek(f,40,SEEK_SET); // skip past the WAV header, up to before "data length" - } + strcpy(fname_temp,tmpnam(NULL)); #endif + + fname2 = fname; + len = strlen(fname); + if(strcmp(&fname[len-4], ".wav") == 0) + { + strcpy(msg, fname); + msg[len-4] = 0; + fname2 = msg; + } + + sprintf(command,"sox \"%s%s.wav\" -r %d -c1 -t wav %s\n",path_source,fname2,samplerate_native, fname_temp); + if(system(command) < 0) + { + failed = 1; + } + + + if(failed || (GetFileLength(fname_temp) <= 0)) + { + if(resample_fails < 2) + error("Resample command failed: %s", command); + resample_fails++; + + if(sr1 != samplerate_native) + { + sprintf(msg, "Can't resample (%d to %d): %s", sr1, samplerate_native, fname); + error("%s", msg); + } + else + { + error("WAV file is not mono: %s", fname); + } + remove(fname_temp); + return(0); + } + + f = fopen(fname_temp,"rb"); + if(f == NULL) + { + error("Can't read temp file: %s",fname_temp); + return(0); + } + if(f_report != NULL) + fprintf(f_report, "resampled %s\n", fname); + resample_count++; + resample_wav = 1; + fseek(f,40,SEEK_SET); // skip past the WAV header, up to before "data length" } displ = ftell(f_phdata); @@ -3321,8 +3341,11 @@ static void CompileEquivalents() p_start[2] = n_bytes >> 8; // index of next table p_start[3] = n_bytes; - LoadVoice(voice_name2,0); // reset the original phoneme table - LoadVoiceVariant(save_voice_name,0); + if(gui_flag != 0) + { + LoadVoice(voice_name2,0); // reset the original phoneme table + LoadVoiceVariant(save_voice_name,0); + } } // end of CompileEquivalents @@ -3362,6 +3385,7 @@ static void CompilePhonemeFiles() case kINCLUDE: NextItem(tSTRING); sprintf(buf,"%s%s",path_source,item_string); + if((stack_ix < N_STACK) && (f = fopen_log(f_errors,buf,"rb")) != NULL) { fprintf(f_errors,"include %s\n",item_string); @@ -3421,6 +3445,7 @@ make_envs(); n_envelopes = 0; error_count = 0; + resample_count = 0; memset(markers_used,0,sizeof(markers_used)); f_errors = stderr; @@ -3534,6 +3559,7 @@ memset(markers_used,0,sizeof(markers_used)); // write a word so that further data doesn't start at displ=0 Write4Bytes(f_phdata,version_phdata); + Write4Bytes(f_phdata,samplerate_native); Write4Bytes(f_phindex,version_phdata); memset(ref_hash_tab,0,sizeof(ref_hash_tab)); @@ -3555,9 +3581,10 @@ fprintf(f_errors,"\nRefs %d, Reused %d\n",count_references,duplicate_references fclose(f_phtab); fclose(f_phcontents); - LoadPhData(); - LoadVoice(voice_name2,0); + LoadPhData(NULL); + if(gui_flag != 0) + LoadVoice(voice_name2,0); CompileReport(); report_dict = CompileAllDictionaries(); @@ -3595,6 +3622,8 @@ fprintf(f_errors,"\nRefs %d, Reused %d\n",count_references,duplicate_references fprintf(stderr,"%s\n",fname); } + + ReadPhondataManifest(); } // end of CompilePhonemeData @@ -3759,7 +3788,6 @@ void CompileIntonation() char buf[sizeof(path_source)+120]; error_count = 0; - resample_count = 0; sprintf(fname_errors,"%s%s",path_source,"error_intonation"); if((f_errors = fopen(fname_errors,"w")) == NULL) @@ -4036,7 +4064,7 @@ void CompileIntonation() { DisplayErrorFile(fname_errors); } - LoadPhData(); + LoadPhData(NULL); } // end of CompileIntonation @@ -4044,7 +4072,22 @@ void CompileIntonation() void CompilePhonemeData() { + WavegenInit(22050, 0); + WavegenSetVoice(voice); CompilePhonemeData2("phonemes"); - return; +} + + +void CompileSampleRate() +{ + long value; + value = wxGetNumberFromUser(_T("Compile phoneme data with a specified sample rate"), _T("Sample rate"), _T("Resample (needs sox)"), 22050, 5000, 48000); + + if(value > 1000) + { + WavegenInit(value, 0); + WavegenSetVoice(voice); + CompilePhonemeData2("phonemes"); + } } diff --git a/src/dictionary.cpp b/src/dictionary.cpp index fd42583a..b2cada40 100644 --- a/src/dictionary.cpp +++ b/src/dictionary.cpp @@ -300,10 +300,6 @@ int LoadDictionary(Translator *tr, const char *name, int no_error) // set up indices into data_dictrules InitGroups(tr); - if(tr->groups1[0] == NULL) - { - fprintf(stderr,"Error in %s_rules, no default rule group\n",name); - } // set up hash table for data_dictlist p = &(tr->data_dictlist[8]); diff --git a/src/espeakedit.cpp b/src/espeakedit.cpp index 39e26b60..b6f9baf6 100644 --- a/src/espeakedit.cpp +++ b/src/espeakedit.cpp @@ -43,11 +43,11 @@ #include "prosodydisplay.h" -#ifdef deleted -static const char *about_string = "espeakedit: %s\nAuthor: Jonathan Duddington (c) 2009\n\n" + +static const char *about_string2 = "espeakedit: %s\nAuthor: Jonathan Duddington (c) 2009\n\n" "Licensed under GNU General Public License version 3\n" "http://espeak.sourceforge.net/"; -#endif + static const char *about_string = "espeakedit %s
Author: Jonathan Duddington (c) 2009
" "http://espeak.sourceforge.net
" @@ -63,6 +63,7 @@ extern void DictionarySort(const char *dictname); extern void init_z(); extern void CompilePhonemeData(void); +extern void CompileSampleRate(void); extern void CompileMbrola(); extern void CompileIntonation(); extern void InitSpectrumDisplay(); @@ -133,22 +134,21 @@ if(argc > 1) if((strcmp(param,"--help")==0) || (strcmp(param,"-h")==0)) { - printf(about_string,espeak_Info(NULL)); - printf(help_text); + printf(about_string2,espeak_Info(NULL)); + printf("%s", help_text); exit(0); } ConfigInit(); - VoiceReset(0); - WavegenSetVoice(voice); - WavegenInitSound(); if(strcmp(param,"--compile")==0) { + LoadPhData(NULL); + samplerate_native = samplerate = 22050; CompilePhonemeData(); CompileIntonation(); - exit(0); } + exit(0); } ConfigInit(); @@ -205,6 +205,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(MENU_PATH3, MyFrame::OnOptions) EVT_MENU(MENU_PATH4, MyFrame::OnOptions) EVT_MENU(MENU_COMPILE_PH, MyFrame::OnTools) + EVT_MENU(MENU_COMPILE_PH2, MyFrame::OnTools) EVT_MENU(MENU_COMPILE_DICT, MyFrame::OnTools) EVT_MENU(MENU_COMPILE_DICT_DEBUG, MyFrame::OnTools) EVT_MENU(MENU_FORMAT_DICTIONARY, MyFrame::OnTools) @@ -266,6 +267,7 @@ MyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title, c int error_flag = 0; int result; int param; + int srate; notebook = new wxNotebook(this, ID_NOTEBOOK, wxDefaultPosition, wxSize(312,760)); // notebook->AddPage(voicedlg,_T("Voice"),FALSE); @@ -301,9 +303,8 @@ MyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title, c SetSize(pos.x, pos.y, size.GetWidth(), size.GetHeight()); LoadConfig(); - WavegenInitSound(); - if((result = LoadPhData()) != 1) + if((result = LoadPhData(&srate)) != 1) { if(result == -1) wxLogError(_T("Failed to read espeak-data/phontab,phondata,phonindex\nPath = ")+wxString(path_home,wxConvLocal)+_T("\n\nThe 'eSpeak' package needs to be installed")); @@ -311,7 +312,10 @@ MyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title, c wxLogError(_T("Wrong version of espeak-data at:\n")+ wxString(path_home,wxConvLocal)+_T("\nVersion 0x%x (expects 0x%x)"),result,version_phdata); error_flag = 1; + srate = 22050; } + WavegenInit(srate,0); + WavegenInitSound(); f_trans = stdout; option_ssml = 1; @@ -350,7 +354,13 @@ MyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title, c void MyFrame::SetVoiceTitle(char *voice_name) {//========================================== char buf[100]; - SetTitle(AppName + _T(" - ") + wxString(voice_name,wxConvLocal) + _T(" voice")); + + if(samplerate_native == 22050) + sprintf(buf, " - %s voice", voice_name); + else + sprintf(buf, " - %s voice %dHz", voice_name, samplerate_native); + SetTitle(AppName + wxString(buf,wxConvLocal)); + if((data_menu != NULL) && (translator != NULL)) { sprintf(buf,"Compile &dictionary '%s'",translator->dictionary_name); @@ -738,6 +748,12 @@ void MyFrame::OnTools(wxCommandEvent& event) case MENU_COMPILE_PH: CompilePhonemeData(); + SetVoiceTitle(voice_name2); + break; + + case MENU_COMPILE_PH2: + CompileSampleRate(); + SetVoiceTitle(voice_name2); break; case MENU_COMPILE_MBROLA: diff --git a/src/extras.cpp b/src/extras.cpp index 5f056464..a04e4704 100644 --- a/src/extras.cpp +++ b/src/extras.cpp @@ -135,7 +135,7 @@ int TestSynthCallback(short *wav, int numsamples, espeak_EVENT *events) else if(type==espeakEVENT_PHONEME) { - char buf[10]; +// char buf[10]; fprintf(f_events,"[%s]\n",WordToString(events->id.number)); //old version, only 4 characters bytes // memcpy(buf, events->id.string, 8); // buf[8] = 0; @@ -206,7 +206,7 @@ static const unsigned short KOI8_R[0x60] = { #define N_CHARS 34 -#define PH(c1,c2) (c2<<8)+c1 // combine two characters into an integer for phoneme name +#define PH(c1,c2) (c2<<8)+c1 // combine two characters into an integer for phoneme name @@ -236,7 +236,7 @@ static void DecodePhonemes2(const char *inptr, char *outptr) continue; /* indicates unrecognised phoneme */ if((ph = phoneme_tab[phcode]) == NULL) continue; - + if((ph->type == phSTRESS) && (ph->std_length <= 4) && (ph->program == 0)) { if(ph->std_length > 2) @@ -281,7 +281,7 @@ static void DecodePhonemes2(const char *inptr, char *outptr) else if(mnem != 0) { - while((c = (mnem & 0xff)) != 0) + while((c = (mnem & 0xff)) != 0) { *outptr++ = c; mnem = mnem >> 8; @@ -363,7 +363,7 @@ void Lexicon_It(int pass) path_dir1 = wxFileName(fname_lex).GetPath(); strcpy(buf_out, path_dir1.mb_str(wxConvLocal)); sprintf(buf, "%s/IT_errors", buf_out); - + if((f_out = fopen(buf,"w")) == NULL) { str = wxString(buf, wxConvLocal); @@ -412,7 +412,7 @@ void Lexicon_It(int pass) if((p = strstr(buf,"//")) != NULL) *p = 0; - + if((sscanf(buf,"%s %s",word,temp)) < 2) continue; @@ -522,7 +522,7 @@ void Lexicon_It(int pass) fputc(*p, f_listx); // omit secondary stress marks } fputc('\n',f_listx); - + } else if((stress_posn1 != stress_posn2) && (stress_posn1 > 0) && (stress_posn2 > 0)) @@ -706,7 +706,7 @@ void Lexicon_De() return; } path_dir1 = wxFileName(fname).GetPath(); - + if((f_out = fopen("compare_de","w")) == NULL) { wxLogError(_T("Can't write file ")); @@ -934,7 +934,7 @@ void Lexicon_Bg() FILE *f_in; FILE *f_out; - + char word[80]; char word_in[80]; char phonemes[N_WORD_PHONEMES]; @@ -1101,7 +1101,7 @@ if(n_stress > 1) n_stress = 1; if(done) n_out++; - } + } n_words++; } @@ -1383,10 +1383,10 @@ void Lexicon_Ru() len = strlen(suffix); if(len >= (wlen-2)) continue; - + if(ru_stress > (vcount - suffixes[sfx].syllables)) continue; - + if(strcmp(suffix,&word[wlen-len])==0) { strcpy(word2,word); @@ -1547,7 +1547,7 @@ void CountWordFreq(wxString path, wcount **hashtab) // skip leading spaces, numbers, etc if(feof(f_in)) break; } - + // read utf8 bytes until a space, number or punctuation ix = 0; while(!feof(f_in) && (c >= 'A') && (ix < sizeof(buf)-1)) @@ -1557,7 +1557,7 @@ void CountWordFreq(wxString path, wcount **hashtab) } buf[ix++] = 0; buf[ix] = 0; - + // the buf may contain non-alphabetic characters j = 0; n_chars = 0; @@ -1583,7 +1583,7 @@ void CountWordFreq(wxString path, wcount **hashtab) } } fclose(f_in); - + } // end of CountWordFreq @@ -1645,7 +1645,7 @@ void MakeWordFreqList() free(p); } fclose(f_out); - + } // end of Make WorkFreqList @@ -2129,9 +2129,9 @@ void SetSpeedTab(void) // Interpolation table to translate from words-per-minute to internal speed // words-per-minute values (measured) static float wpm1[N_WPM] = - {0, 82, 96, 108, 124, 134, 147, 162, 174, 189, 224, 259, 273, 289, 307, 326, 346, 361, 370 }; + {0, 82, 96, 108, 124, 134, 147, 162, 174, 189, 224, 259, 273, 289, 307, 326, 346, 361, 370 }; // corresponding internal speed values - static float wpm2[N_WPM] = + static float wpm2[N_WPM] = {0,253,200, 170, 140, 125, 110, 95, 85, 75, 55, 40, 35, 30, 25, 20, 15, 10, 5 }; unsigned char speed_lookup[290]; @@ -2245,7 +2245,7 @@ void CharsetToUnicode(const char *charset) #ifdef deleted void Test2() { -// +// char buf[120]; FILE *f; FILE *f_out; @@ -2299,7 +2299,7 @@ if(control==2) f = fopen("/home/jsd1/speechdata/text/test.txt","r"); if(f==NULL) return; - + while(!feof(f) && (ix < sizeof(textbuf)-2)) { diff --git a/src/main.h b/src/main.h index 0402f15b..f9a8a12f 100644 --- a/src/main.h +++ b/src/main.h @@ -136,6 +136,7 @@ enum { MENU_PROSODY, MENU_COMPILE_PH, + MENU_COMPILE_PH2, MENU_COMPILE_DICT, MENU_COMPILE_DICT_DEBUG, MENU_FORMAT_DICTIONARY, diff --git a/src/menus.cpp b/src/menus.cpp index b405b71a..917f4899 100644 --- a/src/menus.cpp +++ b/src/menus.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005 to 2010 by Jonathan Duddington * + * Copyright (C) 2005 to 2013 by Jonathan Duddington * * email: jonsd@users.sourceforge.net * * * * This program is free software; you can redistribute it and/or modify * @@ -90,6 +90,7 @@ wxMenuBar *MakeMenu(int type, const char *dict_name) // DATA MENU data_menu = new wxMenu; data_menu->Append(MENU_COMPILE_PH, _("Compile &phoneme data")); + data_menu->Append(MENU_COMPILE_PH2, _("Change sample &rate")); data_menu->Append(MENU_COMPILE_DICT, _("Compile &dictionary")); data_menu->Append(MENU_COMPILE_DICT_DEBUG, _("Compile dictionary (debu&g)")); data_menu->AppendSeparator(); diff --git a/src/numbers.cpp b/src/numbers.cpp index 1c757a56..45d4a27c 100644 --- a/src/numbers.cpp +++ b/src/numbers.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005 to 2011 by Jonathan Duddington * + * Copyright (C) 2005 to 2013 by Jonathan Duddington * * email: jonsd@users.sourceforge.net * * * * This program is free software; you can redistribute it and/or modify * @@ -439,7 +439,7 @@ void LookupAccentedLetter(Translator *tr, unsigned int letter, char *ph_buf) if((letter >= 0x250) && (letter <= 0x2a8)) { accent_data = letter_accents_250[letter - 0x250]; - } + } if(accent_data != 0) { @@ -555,7 +555,7 @@ void LookupLetter(Translator *tr, unsigned int letter, int next_byte, char *ph_b // if the $accent flag is set for this letter, use the accents table (below) dict_flags[1] = 0; - + if(Lookup(tr, &single_letter[1], ph_buf3) == 0) { single_letter[1] = ' '; @@ -682,7 +682,7 @@ int TranslateLetter(Translator *tr, char *word, char *phonemes, int control) if((ph_buf[0]==0) && !iswspace(letter)) Lookup(tr, "_??", ph_buf); - + if(ph_buf[0] != 0) { // speak the hexadecimal number of the character code @@ -876,7 +876,7 @@ int TranslateRoman(Translator *tr, char *word, char *ph_out, WORD_TAB *wtab) static const char *roman_numbers = "ixcmvld"; static int roman_values[] = {1,10,100,1000,5,50,500}; - + acc = 0; prev = 0; subtract = 0x7fff; @@ -926,7 +926,7 @@ int TranslateRoman(Translator *tr, char *word, char *ph_out, WORD_TAB *wtab) if(isdigit(word[0])) return(0); // eg. 'xx2' - + acc += prev; if(acc < tr->langopts.min_roman) return(0); @@ -989,7 +989,7 @@ int TranslateRoman(Translator *tr, char *word, char *ph_out, WORD_TAB *wtab) static const char *M_Variant(int value) {//==================================== // returns M, or perhaps MA or MB for some cases - + int teens = 0; if(((value % 100) > 10) && ((value % 100) < 20)) @@ -1078,7 +1078,7 @@ static int LookupThousands(Translator *tr, int value, int thousandplex, int thou if(found_value == 0) { - if((value % 100) >= 20) + if((value % 100) >= 20) { Lookup(tr, "_0of", ph_of); } @@ -1203,7 +1203,7 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out if(is_ordinal) { strcpy(ph_ordinal, ph_ordinal2); - + if(control & 4) { sprintf(string,"_%d%cx",value,ord_type); // LANG=hu, special word for 1. 2. when there are no higher digits @@ -1216,7 +1216,7 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out } found_ordinal = found; } - + if(found == 0) { if(control & 2) @@ -1250,9 +1250,9 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out } } } - + // no, speak as tens+units - + if((control & 0x10) && (value < 10)) { // speak leading zero @@ -1266,8 +1266,8 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out } else { - - if((is_ordinal) && + + if((is_ordinal) && ((units == 0) || (tr->langopts.numbers & NUM_SWAP_TENS) || (tr->langopts.numbers2 & NUM2_MULTIPLE_ORDINAL))) { sprintf(string,"_%dX%c", tens, ord_type); @@ -1287,7 +1287,7 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out sprintf(string,"_%dX", tens); Lookup(tr, string, ph_tens); } - + if((ph_tens[0] == 0) && (tr->langopts.numbers & NUM_VIGESIMAL)) { // tens not found, (for example) 73 is 60+13 @@ -1295,12 +1295,12 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out sprintf(string,"_%dX", tens & 0xfe); Lookup(tr, string, ph_tens); } - + ph_digits[0] = 0; if(units > 0) - { + { found = 0; - + if((control & 2) && (digit_lookup[0] != 0)) { // we have an entry for this digit (possibly together with the next word) @@ -1350,7 +1350,7 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out } } } - + if((is_ordinal) && (found_ordinal == 0) && (ph_ordinal[0] == 0)) { if((value >= 20) && (((value % 10) == 0) || (tr->langopts.numbers & NUM_SWAP_TENS))) @@ -1358,7 +1358,7 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out if(ph_ordinal[0] == 0) Lookup(tr, "_ord", ph_ordinal); } - + if((tr->langopts.numbers & (NUM_SWAP_TENS | NUM_AND_UNITS)) && (ph_tens[0] != 0) && (ph_digits[0] != 0)) { Lookup(tr, "_0and", ph_and); @@ -1381,7 +1381,7 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out { if((next_phtype = phoneme_tab[(unsigned int)(ph_digits[0])]->type) == phSTRESS) next_phtype = phoneme_tab[(unsigned int)(ph_digits[1])]->type; - + if((phoneme_tab[(unsigned int)(ph_tens[ix])]->type == phVOWEL) && (next_phtype == phVOWEL)) ph_tens[ix] = 0; } @@ -1563,13 +1563,13 @@ static int LookupNum3(Translator *tr, int value, char *ph_out, int suppress_null sprintf(string,"_%dC0",hundreds); found = Lookup(tr, string, ph_digits); } - + if(!found) { sprintf(string,"_%dC",hundreds); found = Lookup(tr, string, ph_digits); // is there a specific pronunciation for n-hundred ? } - + if(found) { ph_100[0] = 0; @@ -1632,7 +1632,7 @@ static int LookupNum3(Translator *tr, int value, char *ph_out, int suppress_null x = 8; // use variant (feminine) for before thousands and millions } - if(LookupNum2(tr, tensunits, x | control & 0x100, buf2) != 0) + if(LookupNum2(tr, tensunits, x | (control & 0x100), buf2) != 0) { if(tr->langopts.numbers & NUM_SINGLE_AND) ph_hundred_and[0] = 0; // don't put 'and' after 'hundred' if there's 'and' between tens and units @@ -1791,7 +1791,7 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned // this is an ordinal suffix ordinal = 2; flags[0] |= FLAG_SKIPWORDS; - skipwords = 1; + skipwords = 1; } } } @@ -2052,7 +2052,7 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned break; n_digits++; strcat(ph_out, buf1); - } + } } } diff --git a/src/options.cpp b/src/options.cpp index 23a35c5f..5936111d 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * Copyright (C) 2005 to 2013 by Jonathan Duddington * * email: jonsd@users.sourceforge.net * * * * This program is free software; you can redistribute it and/or modify * @@ -79,7 +79,7 @@ Options::~Options() for(ix=0; ix < 1; ix++) delete m_lab[ix]; - + delete m_samplerate; delete m_save; delete m_close; @@ -89,13 +89,13 @@ void Options::OnCommand(wxCommandEvent& event) {//=========================================== int id; int value; - + switch(id = event.GetId()) { case wxID_SAVE: value = GetNumeric(m_samplerate); if(value > 0) WavegenInit(value,0); - + Destroy(); break; @@ -120,11 +120,10 @@ void ConfigSetPaths() void ConfigInit() {//============== - long value; wxString string; wxString basedir; const char *path_base; - + #ifdef PLATFORM_WINDOWS int found = 0; char buf[200]; @@ -134,7 +133,7 @@ void ConfigInit() { sprintf(path_home,"%s\\espeak-data",path_base); if(GetFileLength(path_home) == -2) - found = 1; // an espeak-data directory exists + found = 1; // an espeak-data directory exists } if(found == 0) @@ -142,7 +141,7 @@ void ConfigInit() if(pRegKey->Exists() ) { wxString RegVal; - pRegKey->QueryValue(_T("Path"),RegVal); + pRegKey->QueryValue(_T("Path"),RegVal); strncpy0(buf,RegVal.mb_str(wxConvLocal),sizeof(buf)); path_base = buf; } @@ -161,12 +160,6 @@ void ConfigInit() wxFileConfig *pConfig = new wxFileConfig(_T("espeakedit")); wxFileConfig::Set(pConfig); - pConfig->Read(_T("/samplerate"),&value,22050); -#ifdef PLATFORM_WINDOWS - value = 22050; -#endif - WavegenInit(value,0); - basedir = wxString(path_base,wxConvLocal); // this is only used to set defaults for other paths if they are not in the config file pConfig->Read(_T("/spectload"),&path_spectload,basedir+_T("/phsource")); pConfig->Read(_T("/spectload2"),&path_spectload2,basedir+_T("/phsource")); diff --git a/src/prosodydisplay.cpp b/src/prosodydisplay.cpp index db31955d..4bb49ec1 100644 --- a/src/prosodydisplay.cpp +++ b/src/prosodydisplay.cpp @@ -50,6 +50,86 @@ static wxPen PEN_PHSELECTED(wxColour(255,0,0),2,wxSOLID); static wxPen PEN_PHSTRESSED(wxColour(80,80,196),3,wxSOLID); static wxPen PEN_PHSTRESSED2(wxColour(160,160,255),2,wxSOLID); + + + +typedef struct { + unsigned int value; + char *name; +} NAMETAB; + +NAMETAB *manifest = NULL; +int n_manifest; + +const char *LookupManifest(unsigned int addr) +{//============================================= + int ix; + + if(manifest != NULL) + { + for(ix=0; ix < n_manifest; ix++) + { + if(manifest[ix].value == addr) + return(manifest[ix].name); + if(manifest[ix].value > addr) + break; + } + } + return(""); +} + + +void ReadPhondataManifest() +{//========================= +// Read the phondata-manifest file + FILE *f; + int n_lines=0; + int ix; + char *p; + unsigned int value; + char buf[sizeof(path_home)+40]; + char name[120]; + + sprintf(buf,"%s%c%s",path_home,PATHSEP,"phondata-manifest"); + if((f = fopen(buf, "r")) == NULL) + return; + + while(fgets(buf, sizeof(buf), f) != NULL) + n_lines++; + + rewind(f); + + if(manifest != NULL) + { + for(ix=0; ix < n_manifest; ix++) + free(manifest[ix].name); + } + + if((manifest = (NAMETAB *)realloc(manifest, n_lines * sizeof(NAMETAB))) == NULL) + return; + + n_manifest = 0; + while(fgets(buf, sizeof(buf), f) != NULL) + { + if(!isalpha(buf[0])) + continue; + + if(sscanf(&buf[2], "%x %s", &value, name) == 2) + { + if((p = (char *)malloc(strlen(name)+1)) != NULL) + { + strcpy(p, name); + manifest[n_manifest].value = value; + manifest[n_manifest].name = p; + n_manifest++; + } + } + } + fclose(f); +} + + + ProsodyDisplay::ProsodyDisplay(wxWindow *parent, const wxPoint& pos, const wxSize& size) : wxScrolledWindow(parent, -1, pos, size, wxSUNKEN_BORDER | wxNO_FULL_REPAINT_ON_RESIZE) @@ -76,6 +156,7 @@ void InitProsodyDisplay() int ix; wxString string; + ReadPhondataManifest(); menu_envelopes = new wxMenu; // entries match those in envelope_data[] in intonation.cpp @@ -142,6 +223,7 @@ void ProsodyDisplay::SelectPh(int index) int ix; const char *name = "?"; char buf[120]; + char len_string[20]; if(index < 0) return; @@ -162,8 +244,12 @@ void ProsodyDisplay::SelectPh(int index) } y1 = p->pitch1; y2 = p->pitch2; - sprintf(buf,"Stress %s%d Amp %2d StdLength %2d LengthMod %2d Pitch %3d %3d %s PhFlags %.2x ", - emphasized,p->stresslevel&0x7,p->amp,p->std_length*2, p->length,y1,y2,name,p->ph->phflags); + len_string[0] = 0; + if(p->std_length > 0) + sprintf(len_string," Length %d", p->std_length*2); + + sprintf(buf,"Stress %s%d Amp %2d LengthMod %2d Pitch %3d %3d %s PhFlags %.2x [%s%s]", + emphasized,p->stresslevel&0x7,p->amp, p->length,y1,y2,name,p->ph->phflags, LookupManifest(p->phontab_addr), len_string); wxLogStatus(wxString(buf,wxConvLocal)); } @@ -625,4 +711,3 @@ void MyFrame::OnProsody(wxCommandEvent& WXUNUSED(event)) adding_page = 2; // work around for wxNotebook bug (version 2.8.7) screenpages->AddPage(prosodycanvas, _T("Prosody"), true); } - diff --git a/src/readclause.cpp b/src/readclause.cpp index d80fa556..4c833770 100644 --- a/src/readclause.cpp +++ b/src/readclause.cpp @@ -741,7 +741,6 @@ static int LoadSoundFile(const char *fname, int index) { int ix; int fd_temp; - const char *resample; int header[3]; char command[sizeof(fname2)+sizeof(fname2)+40]; @@ -755,17 +754,11 @@ static int LoadSoundFile(const char *fname, int index) fclose(f); f = NULL; - if(header[2] == samplerate) - resample = ""; - else - resample = "polyphase"; - strcpy(fname_temp,"/tmp/espeakXXXXXX"); if((fd_temp = mkstemp(fname_temp)) >= 0) { close(fd_temp); -// sprintf(fname_temp,"%s.wav",tmpnam(NULL)); - sprintf(command,"sox \"%s\" -r %d -w -s -c1 %s %s\n", fname, samplerate, fname_temp, resample); + sprintf(command,"sox \"%s\" -r %d -c1 -t wav %s\n", fname, samplerate, fname_temp); if(system(command) == 0) { fname = fname_temp; diff --git a/src/setlengths.cpp b/src/setlengths.cpp index fdc7ebc8..4dffac0e 100644 --- a/src/setlengths.cpp +++ b/src/setlengths.cpp @@ -104,7 +104,7 @@ static unsigned char pause_factor_350[] = { 15,15,15,15,15}; // 370 // wav_factor adjustments for speeds 350 to 450 -// Use this to calibrate speed for wpm 350-450 +// Use this to calibrate speed for wpm 350-450 static unsigned char wav_factor_350[] = { 120, 121, 120, 119, 119, // 350 118, 118, 117, 116, 116, // 355 @@ -275,6 +275,9 @@ void SetSpeed(int control) speed.min_sample_len = 420 - (wpm - 440); } +// adjust for different sample rates +speed.min_sample_len = (speed.min_sample_len * samplerate_native) / 22050; + speed.pause_factor = (256 * s1)/115; // full speed adjustment, used for pause length speed.clause_pause_factor = 0; @@ -463,7 +466,7 @@ void SetAmplitude(int amp) if((amp >= 0) && (amp <= 20)) { - option_amplitude = (amplitude_factor[amp] * 480)/256; + option_amplitude = (amplitude_factor[amp] * 480)/256; } } #endif @@ -606,7 +609,7 @@ void CalcLengths(Translator *tr) case phPAUSE: last_pitch = 0; break; - + case phSTOP: last_pitch = 0; if(prev->type == phFRICATIVE) @@ -710,7 +713,7 @@ void CalcLengths(Translator *tr) p->amp = tr->stress_amps[0]; // unless changed later p->length = 256; // TEMPORARY min_drop = 0; - + if(p->newword) { if(prev->type==phLIQUID) @@ -733,12 +736,12 @@ void CalcLengths(Translator *tr) if((prev->type==phVOWEL) || (prev->type == phLIQUID)) { p->length = prev->length; - + if(p->type == phLIQUID) { p->length = speed1; } - + if(next->type == phVSTOP) { p->length = (p->length * 160)/100; @@ -963,11 +966,11 @@ if(p->type != phVOWEL) next->synthflags &= ~SFLAG_SEQCONTINUE; if(next->type == phNASAL && next2->type != phVOWEL) next->synthflags |= SFLAG_SEQCONTINUE; - + if(next->type == phLIQUID) { next->synthflags |= SFLAG_SEQCONTINUE; - + if(next2->type == phVOWEL) { next->synthflags &= ~SFLAG_SEQCONTINUE; diff --git a/src/speak.cpp b/src/speak.cpp index 35d756da..661df32c 100644 --- a/src/speak.cpp +++ b/src/speak.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * Copyright (C) 2005 to 2013 by Jonathan Duddington * * email: jonsd@users.sourceforge.net * * * * This program is free software; you can redistribute it and/or modify * @@ -397,6 +397,7 @@ static int initialise(void) {//======================== int param; int result; + int srate = 22050; // default sample rate // It seems that the wctype functions don't work until the locale has been set // to something other than the default "C". Then, not only Latin1 but also the @@ -412,8 +413,7 @@ static int initialise(void) #endif - WavegenInit(22050,0); // 22050 - if((result = LoadPhData()) != 1) + if((result = LoadPhData(&srate)) != 1) { if(result == -1) { @@ -423,6 +423,7 @@ static int initialise(void) else fprintf(stderr,"Wrong version of espeak-data 0x%x (expects 0x%x) at %s\n",result,version_phdata,path_home); } + WavegenInit(srate,0); LoadConfig(); SetVoiceStack(NULL, ""); SynthesizeInit(); diff --git a/src/speak_lib.cpp b/src/speak_lib.cpp index 6c8e8dc4..78feaff8 100644 --- a/src/speak_lib.cpp +++ b/src/speak_lib.cpp @@ -377,11 +377,12 @@ static int initialise(int control) {//=============================== int param; int result; + int srate = 22050; // default sample rate 22050 Hz err = EE_OK; LoadConfig(); - WavegenInit(22050,0); // 22050 - if((result = LoadPhData()) != 1) + + if((result = LoadPhData(&srate)) != 1) // reads sample rate from espeak-data/phontab { if(result == -1) { @@ -394,6 +395,7 @@ static int initialise(int control) else fprintf(stderr,"Wrong version of espeak-data 0x%x (expects 0x%x) at %s\n",result,version_phdata,path_home); } + WavegenInit(srate,0); memset(¤t_voice_selected,0,sizeof(current_voice_selected)); SetVoiceStack(NULL, ""); diff --git a/src/synthdata.cpp b/src/synthdata.cpp index b68fd46b..245291b6 100644 --- a/src/synthdata.cpp +++ b/src/synthdata.cpp @@ -35,8 +35,8 @@ #include "translate.h" #include "wave.h" -const char *version_string = "1.46.35 14.Feb.13"; -const int version_phdata = 0x014631; +const char *version_string = "1.46.37 20.Feb.13"; +const int version_phdata = 0x014636; int option_device_number = -1; FILE *f_logespeak = NULL; @@ -108,13 +108,14 @@ static char *ReadPhFile(void *ptr, const char *fname, int *size) } // end of ReadPhFile -int LoadPhData() -{//============= +int LoadPhData(int *srate) +{//======================== int ix; int n_phonemes; int version; int result = 1; int length; + int rate; unsigned char *p; int *pw; @@ -126,14 +127,16 @@ int LoadPhData() return(-1); if((tunes = (TUNE *)ReadPhFile((void *)(tunes),"intonations",&length)) == NULL) return(-1); - wavefile_data = (unsigned char *)phondata_ptr; + wavefile_data = (unsigned char *)phondata_ptr; n_tunes = length / sizeof(TUNE); - // read the version number from the first 4 bytes of phondata - version = 0; + // read the version number and sample rate from the first 8 bytes of phondata + version = 0; // bytes 0-3, version number + rate = 0; // bytes 4-7, sample rate for(ix=0; ix<4; ix++) { version += (wavefile_data[ix] << (ix*8)); + rate += (wavefile_data[ix+4] << (ix*8)); } if(version != version_phdata) @@ -163,6 +166,8 @@ int LoadPhData() if(phoneme_tab_number >= n_phoneme_tables) phoneme_tab_number = 0; + if(srate != NULL) + *srate = rate; return(result); } // end of LoadPhData @@ -970,7 +975,9 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ phdata->pd_param[i_LENGTH_MOD] = ph->length_mod; if(ph->program == 0) + { return; + } end_flag = 0; @@ -1215,7 +1222,13 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ memcpy(&worddata->prev_vowel, &plist[0], sizeof(PHONEME_LIST)); } +#ifdef _ESPEAKEDIT plist->std_length = phdata->pd_param[i_SET_LENGTH]; + if(phdata->sound_addr[0] != 0) + plist->phontab_addr = phdata->sound_addr[0]; // FMT address + else + plist->phontab_addr = phdata->sound_addr[1]; // WAV address +#endif } // end of InterpretPhoneme diff --git a/src/synthesize.cpp b/src/synthesize.cpp index d4e6a769..5db0db9e 100644 --- a/src/synthesize.cpp +++ b/src/synthesize.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005 to 2010 by Jonathan Duddington * + * Copyright (C) 2005 to 2013 by Jonathan Duddington * * email: jonsd@users.sourceforge.net * * * * This program is free software; you can redistribute it and/or modify * @@ -40,7 +40,7 @@ static void SmoothSpect(void); // list of phonemes in a clause int n_phoneme_list=0; -PHONEME_LIST phoneme_list[N_PHONEME_LIST]; +PHONEME_LIST phoneme_list[N_PHONEME_LIST+1]; int mbrola_delay; char mbrola_name[20]; @@ -1377,7 +1377,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) DoPause(0,0); // isolate from the previous clause } - while(ix < (*n_ph)) + while((ix < (*n_ph)) && (ix < N_PHONEME_LIST-2)) { p = &phoneme_list[ix]; @@ -1448,6 +1448,9 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) { case phPAUSE: DoPause(p->length,0); +#ifdef _ESPEAKEDIT + p->std_length = p->ph->std_length; +#endif break; case phSTOP: diff --git a/src/synthesize.h b/src/synthesize.h index 6a83b8da..b56edfe6 100644 --- a/src/synthesize.h +++ b/src/synthesize.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * Copyright (C) 2005 to 2013 by Jonathan Duddington * * email: jonsd@users.sourceforge.net * * * * This program is free software; you can redistribute it and/or modify * @@ -220,7 +220,10 @@ typedef struct { unsigned char newword; // bit 0=start of word, bit 1=end of clause, bit 2=start of sentence unsigned char pitch1; unsigned char pitch2; +#ifdef _ESPEAKEDIT unsigned char std_length; + unsigned int phontab_addr; +#endif } PHONEME_LIST; @@ -435,7 +438,7 @@ extern PHONEME_TAB *phoneme_tab[N_PHONEME_TAB]; // list of phonemes in a clause extern int n_phoneme_list; -extern PHONEME_LIST phoneme_list[N_PHONEME_LIST]; +extern PHONEME_LIST phoneme_list[N_PHONEME_LIST+1]; extern unsigned int embedded_list[]; extern unsigned char env_fall[128]; @@ -510,7 +513,7 @@ unsigned int LookupSound(PHONEME_TAB *ph1, PHONEME_TAB *ph2, int which, int *mat frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, int *n_frames, PHONEME_LIST *plist); unsigned char *LookupEnvelope(int ix); -int LoadPhData(); +int LoadPhData(int *srate); void SynthesizeInit(void); int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume); diff --git a/src/translate.cpp b/src/translate.cpp index 440fe841..9b708cee 100644 --- a/src/translate.cpp +++ b/src/translate.cpp @@ -3382,6 +3382,8 @@ if((c == '/') && (tr->langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(pre } MakePhonemeList(tr, clause_pause, new_sentence); + phoneme_list[N_PHONEME_LIST].ph = NULL; // recognize end of phoneme_list array, in Generate() + phoneme_list[N_PHONEME_LIST].sourceix = 1; if(embedded_count) // ???? is this needed { diff --git a/src/transldlg.cpp b/src/transldlg.cpp index c095a4e3..a71fa1ff 100644 --- a/src/transldlg.cpp +++ b/src/transldlg.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * Copyright (C) 2005 to 2013 by Jonathan Duddington * * email: jonsd@users.sourceforge.net * * * * This program is free software; you can redistribute it and/or modify * @@ -503,13 +503,15 @@ void TranslDlg::OnCommand(wxCommandEvent& event) if((n_ph_list + n_phoneme_list) >= N_PH_LIST) { - n_phoneme_list = N_PH_LIST - n_ph_list - n_phoneme_list; + n_phoneme_list = N_PH_LIST - n_ph_list; } memcpy(&ph_list[n_ph_list],phoneme_list,sizeof(PHONEME_LIST)*n_phoneme_list); n_ph_list += n_phoneme_list; } + ph_list[N_PH_LIST].ph = NULL; // to recognize overrun off list (in Generate() ) + t_phonetic->Clear(); if(option_phonemes == 2) { diff --git a/src/voices.cpp b/src/voices.cpp index 79732c72..3c177033 100644 --- a/src/voices.cpp +++ b/src/voices.cpp @@ -410,7 +410,7 @@ void VoiceReset(int tone_only) voice->voicing = 64; voice->consonant_amp = 100; voice->consonant_ampv = 100; - voice->samplerate = 22050; + voice->samplerate = samplerate_native; memset(voice->klattv,0,sizeof(voice->klattv)); speed.fast_settings[0] = 450; @@ -674,24 +674,24 @@ voice_t *LoadVoice(const char *vname, int control) if(tone_only) break; - + priority = DEFAULT_LANGUAGE_PRIORITY; language_name[0] = 0; - + sscanf(p,"%s %d",language_name,&priority); if(strcmp(language_name,"variant") == 0) break; - + len = strlen(language_name) + 2; // check for space in languages[] if(len < (sizeof(voice_languages)-langix-1)) { voice_languages[langix] = priority; - + strcpy(&voice_languages[langix+1],language_name); langix += len; } - + // only act on the first language line if(language_set == 0) { @@ -701,10 +701,10 @@ voice_t *LoadVoice(const char *vname, int control) strcpy(new_dictionary,language_type); strcpy(phonemes_name,language_type); SelectPhonemeTableName(phonemes_name); - + if(new_translator != NULL) DeleteTranslator(new_translator); - + new_translator = SelectTranslator(translator_name); langopts = &new_translator->langopts; } @@ -1059,10 +1059,10 @@ static char *ExtractVoiceVariantName(char *vname, int variant_num, int add_dir) { // voice variant name, not number sprintf(variant_name, "%s%s", variant_prefix, p); - } + } } } - + if(variant_num > 0) { if(variant_num < 10) @@ -1421,13 +1421,13 @@ char const *SelectVoice(espeak_VOICE *voice_select, int *found) { // no language is specified. Get language from the named voice static char buf[60]; - + if(voice_select2.name == NULL) { if((voice_select2.name = voice_select2.identifier) == NULL) voice_select2.name = "default"; } - + strncpy0(buf,voice_select2.name,sizeof(buf)); variant_name = ExtractVoiceVariantName(buf,0,0); @@ -1492,7 +1492,7 @@ char const *SelectVoice(espeak_VOICE *voice_select, int *found) } if(skip==0) { - voices2[ix2++] = vp; + voices2[ix2++] = vp; } for(j=0; (j < vp->xx1) && (n_variants < N_VOICE_VARIANTS);) @@ -1579,10 +1579,10 @@ static void GetVoices(const char *path) } else { - // a regular line, add it to the voices list + // a regular line, add it to the voices list if((f_voice = fopen(fname,"r")) == NULL) continue; - + // pass voice file name within the voices directory voice_data = ReadVoiceFile(f_voice, fname+len_path_voices, &buf[20]); fclose(f_voice); @@ -1617,10 +1617,10 @@ static void GetVoices(const char *path) else if(ftype > 0) { - // a regular line, add it to the voices list + // a regular line, add it to the voices list if((f_voice = fopen(fname,"r")) == NULL) continue; - + // pass voice file name within the voices directory voice_data = ReadVoiceFile(f_voice, fname+len_path_voices, FindFileData.cFileName); fclose(f_voice); @@ -1660,7 +1660,7 @@ static void GetVoices(const char *path) else if(ftype > 0) { - // a regular line, add it to the voices list + // a regular line, add it to the voices list if((f_voice = fopen(fname,"r")) == NULL) { LOGE("Unble to load voice file '%s': %s", fname, strerror(errno));