Fix: Events callback, fix word length information for words with multibyte characters. Fix: Re-translating a word in a different language after the first langauge has started speaking individual letters, gave silence. Announce punctuation. If character name is not defined, use English. Announce punctuation. Fix pitch of the voice which announces punctuation characters. [[Phonemes]] text input. Allow the language-switch phoneme eg. [[_^_EN hEloU _^_FR]] in the input. git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@152 d46cf337-b52f-0410-862d-fd96e6ae7743master
@@ -43,9 +43,9 @@ x z | |||
Dictionary de_dict | |||
3 @ @- a A A: aI aU | |||
E E2 E: e: EI I i2 i: | |||
O o: OY U u: W y y: | |||
Y: | |||
E E2 E: e: EI I i2 I: | |||
i: O o: OY U u: W y | |||
y: Y: | |||
* : ; b C C2 d D | |||
dZ f g h j k l m | |||
@@ -88,8 +88,8 @@ r R s t ts v z Z | |||
Dictionary es_dict | |||
@- a aI aU e E eI eU | |||
i o O oI u | |||
a aI aU e E eI eU i | |||
o O oI u | |||
* ** : b B d D f | |||
g j J J^ k l m n | |||
@@ -116,10 +116,10 @@ i i: o O O~ u W w^i | |||
W~ y Y | |||
* : ; b c d dZ f | |||
g h j k l L m n | |||
N n2 n^ p p2 r R s | |||
S t t2 tS v w z Z | |||
z2 z3 | |||
g h j k l m n N | |||
n2 n^ p p2 r R s S | |||
t t2 tS v w z Z z2 | |||
z3 | |||
Dictionary hi_dict | |||
@@ -281,7 +281,7 @@ u U uI u~ y | |||
g h j k l l^ m n | |||
N n^ p Q r R r- s | |||
S s# s; t T tS ts v | |||
w x z Z | |||
w w2 x z Z | |||
Dictionary ro_dict | |||
@@ -340,10 +340,10 @@ Dictionary zh_dict | |||
i i. i[ iou N- o o- ou | |||
u uai y | |||
(u) : f h j k kh l | |||
m n N p ph r s s. | |||
S; t th ts ts. ts. tS; tS; | |||
tsh v w x z z. | |||
: f j k kh l m n | |||
N p ph r R s s. S; | |||
t th ts ts. ts. tS; tS; tsh | |||
v w x z z. | |||
Dictionary jbo_dict | |||
@@ -417,7 +417,7 @@ Dictionary rw_dict | |||
a e i o u | |||
* b B c d dZ f g | |||
h j J k l m n N | |||
n^ p q s S S; t tS | |||
w x z | |||
* : b B c d dZ f | |||
g h j J k l m n | |||
N n^ p q s S S; t | |||
tS v w x z |
@@ -57,6 +57,7 @@ _?? sImb@L | |||
_#9 tab | |||
_#32 speIs | |||
_ hA@dspeIs // U+00A0 no-break-space | |||
_! Ekskl@m'eIS@n | |||
_" kwoUts | |||
_# haS | |||
@@ -65,8 +66,8 @@ _% p3s'Ent | |||
?5 _% pVRs'Ent | |||
_& amp@sand | |||
_' praIm | |||
_( ElbrakIt | |||
_) A@brakIt | |||
_( lEftbrakIt | |||
_) raItbrakIt | |||
_* ast@rIsk | |||
_+ plVs | |||
_, k0m@ | |||
@@ -80,24 +81,72 @@ _= i:kw@Lz | |||
_> A@aNg@L | |||
_? kwEstS@n | |||
_@ at|saIn | |||
_[ Elskwe@ | |||
_[ lEftskwe@ | |||
_\ bakstroUk | |||
_] A@skwe@ | |||
_] raItskwe@ | |||
_^ s3:kVmfl,Eks | |||
?5 _^ sIRkVmfl,Eks | |||
__ 'Vnd3sk,o@ | |||
_` bakpraIm | |||
_{ ElbreIs | |||
_{ lEftbreIs | |||
_| vi:b'A@ | |||
_} A@breIs | |||
_} raItbreIs | |||
_~ tIld@ | |||
_¡ I2nv3:tI2dEkskl@m'eIS@n | |||
_¦ broUk@nb'A@ | |||
_¨ daIa2r'i:sI2s | |||
_ª fEmI2nI2n'O@dI2n@L | |||
_« lEft'ang@LkwoUts | |||
_ makr0n | |||
_² su:p@skrIptt'u: | |||
_³ su:p@skrIptT'ri: | |||
_´ a2kju:taksEnt | |||
_· mId@Ld0t | |||
_¸ sEd'Il@ | |||
_¹ su:p@skrIptw'0n | |||
_º maskjUlI2n'O@dI2n@L | |||
_» raIt'ang@LkwoUts | |||
_¿ I2nv3:tI2dkw'EstS@n | |||
_‐ haIf@n | |||
_‑ haIf@n | |||
_‒ daS | |||
_– daS | |||
_— EmdaS | |||
_― h0rIz,0nt@Lb'A@ | |||
_‖ d,Vb@Lb'A@ | |||
_‘ lEftkwoUt | |||
_’ raItkwoUt | |||
_‚ loUkwoUt | |||
_‛ lEftkwoUt | |||
_“ lEftkwoUts | |||
_” raItkwoUts | |||
_„ loUkwoUts | |||
_‟ lEftkwoUts | |||
_† dag3 | |||
_‡ dVb@Ldag3 | |||
_• bUlI2t | |||
_‣ bUlI2t | |||
_․ d0t | |||
_‥ tu:d0ts | |||
_… I2lIpsI2s | |||
_‰ p3:m'i:l | |||
_′ praIm | |||
_″ dVb@LpraIm | |||
_‴ trIp@LpraIm | |||
_‼ Ekskla2m'eIS@nz | |||
_₠ jU@roU | |||
¢ sEnts | |||
£ paUnd | |||
¥ jEn | |||
₨ ru:pi: | |||
₩ w0n | |||
§ sEkS@n | |||
_¶ par@graf // in en_rules | |||
¶ par@graf // in en_rules | |||
¤ kVr@nsI2saIn | |||
© k0pI2raIt | |||
® rEdZIst3d | |||
° dI2gri:z | |||
− maIn@s | |||
± plVs@maIn@s | |||
@@ -110,7 +159,14 @@ _¶ par@graf // in en_rules | |||
€ jU@roUz | |||
♯ SA@p | |||
♭ flat | |||
¬ n0t_|saIn | |||
ə SwA: | |||
æ eI'i: | |||
ɛ oUp@n'i: | |||
ɔ oUp@n'oU | |||
ð ED | |||
ʃ ES | |||
ʒ EZ | |||
// numeric | |||
@@ -1112,6 +1168,7 @@ leant lEnt | |||
leapt lEpt | |||
lego lEgoU | |||
leisure l'EZ3 | |||
lemme lElI // let me | |||
lemonade $3 | |||
leo li:oU | |||
leopard lEp@d | |||
@@ -2625,7 +2682,7 @@ although OlD'oU $pause | |||
and %and $pause $only | |||
as ,az $pause $only | |||
(as is) ,az,Iz $pause | |||
(as it is) azIt'Iz_ | |||
(as it is) ,azIt,Iz $u+ | |||
because bIk'Vz $pause | |||
once $pause | |||
or %O@ $pause $only | |||
@@ -2717,7 +2774,7 @@ like laIk $strend2 | |||
// ?6 'one' = [wVn], 'of' = [Vv] | |||
?6 noone noUwVn | |||
?6 anyone EnIwVn | |||
?6 everyone EvrIwVn |
@@ -5130,7 +5130,7 @@ | |||
μ m'ju:_ | |||
ν n'ju:_ | |||
ξ ks'aI_ | |||
ο oUm'aIkr0n_ | |||
ο 'oUmIkr0n_ | |||
.group 0xcf // Greek letters | |||
@@ -5146,7 +5146,7 @@ | |||
ψ ps'aI_ | |||
ω 'oUmIg@_ | |||
ώ 'oUmIg@_ | |||
ό oUm'aIkr0n_ | |||
ό 'oUmIkr0n_ | |||
// default group for "non of the above" | |||
@@ -5171,6 +5171,7 @@ | |||
ž Z | |||
þ T | |||
ð D | |||
ñ n^ | |||
\\ bakstroUk | |||
@@ -5226,5 +5227,4 @@ | |||
%%) % (_ _:: | |||
// extra symbols (mostly in en_list) | |||
¶ par@graf | |||
¶¶ par@grafs |
@@ -1,6 +1,5 @@ | |||
// This file is UTF-8 encoded | |||
// Numbers | |||
_0 nul | |||
_1 'unu |
@@ -15,27 +15,27 @@ _; p,untoik'oma | |||
_: d,Osp'untOs | |||
_! TE*R'aRaDmi**aTj'On | |||
_? TE*R'aRintE*R,oQaTj'On | |||
_¡ aB@-*'iRaDmi**aTj'On | |||
_¿ aB@-*'iRintE*R,oQaTj'On | |||
_¡ aB**'iRaDmi**aTj'On | |||
_¿ aB**'iRintE*R,oQaTj'On | |||
_= iQw'al | |||
_< men'ORke | |||
_> maJ^'ORke | |||
_' apOst@-*'ofo | |||
_' apOst**'ofo | |||
_" kom'iJ^as | |||
_+ s'iQnOdesum'aR | |||
_$ dolar | |||
_# almoaD'iJ^a | |||
_* aste*'isko | |||
_- gJ^On | |||
__ suB@-*aJ^'aDo | |||
__ suB**aJ^'aDo | |||
_/ ba*Ra | |||
_\ b'a*RaimbERt'iDa | |||
_` aT'EntOg@-*'aBe | |||
_( ,aB@-*epa**'Entesis | |||
_` aT'EntOg**'aBe | |||
_( ,aB**epa**'Entesis | |||
_) Tj,E*Rapa**'Entesis | |||
_[ ,aB@-*ekORtS'ete | |||
_[ ,aB**ekORtS'ete | |||
_] Tj,E*RakORtS'ete | |||
_{ ,aB@-*eJ^'aBe | |||
_{ ,aB**eJ^'aBe | |||
_} Tj,E*RaJ^'aBe | |||
_« kom'iJ^as||iTkJ^'ERDas | |||
_» kom'iJ^as||dE**'EtSas | |||
@@ -47,7 +47,7 @@ _» kom'iJ^as||dE**'EtSas | |||
@ a*R'oBa | |||
/ ba*Ra | |||
© kopi*R'aIt | |||
£ liB@-*as | |||
£ liB**as | |||
¶ p'a*Rafo | |||
§ sEkTj'On | |||
@@ -56,8 +56,8 @@ _» kom'iJ^as||dE**'EtSas | |||
_0 Te*o | |||
_1 'uno | |||
_2 d'Os | |||
_3 t@-*'es | |||
_4 kw'at@-*o | |||
_3 t**'es | |||
_4 kw'at**o | |||
_5 T'inko | |||
_6 s'eIs | |||
_7 sj'ete | |||
@@ -66,12 +66,12 @@ _9 nw'eve | |||
_1X dj'ET | |||
_11 'OnTe | |||
_12 d'oTe | |||
_13 t@-*'eTe | |||
_13 t**'eTe | |||
_14 kat'ORTe | |||
_15 k'inTe | |||
_20 v'eInte | |||
_2X v'eInt | |||
_3X t@-*'eInta | |||
_3X t**'eInta | |||
_4X kwa*'Enta | |||
_5X Tinkw'Enta | |||
_6X sEs'Enta | |||
@@ -339,8 +339,8 @@ _o o | |||
o o $atend | |||
v uve | |||
x Ekis | |||
_y ,ig@-*'iEQa | |||
y ,ig@-*'iEQa $atend | |||
_y ,ig**'iEQa | |||
y ,ig**'iEQa $atend | |||
ch tSe | |||
ll Ejje | |||
á 'a||aTEntw'aDa |
@@ -6,6 +6,7 @@ | |||
// ?2 Latin America | |||
.L01 j w l r d g n m | |||
.L02 b d g n m // change [s] to [z] before these | |||
.group a | |||
_) a (_ a | |||
@@ -38,6 +39,7 @@ | |||
_) d (_ de | |||
d D | |||
_) d d | |||
l) d d | |||
m) d d | |||
n) d d | |||
@@ -142,7 +144,7 @@ | |||
r R | |||
_) r R | |||
A) r (A ** | |||
C) r (A @-* | |||
C) r (A ** | |||
rr *R | |||
@@ -150,6 +152,8 @@ | |||
_) s (_ Ese | |||
s s | |||
&) s (_S1 s | |||
s (L02 z | |||
s (gY s | |||
.group t | |||
@@ -199,7 +203,7 @@ | |||
.group y | |||
_) y (_ ,ig@-*'iEQa | |||
_) y (_ ,ig**'iEQa | |||
y i | |||
_) y J | |||
_m) y J |
@@ -65,7 +65,7 @@ _y i:gR'Ek | |||
//_cap k,ap@-t@L | |||
_?A lEt@ | |||
_?? sE~b'OL | |||
_?? sE~b'Oll | |||
_#9 tabylasjO~ | |||
_#32 Espas | |||
@@ -229,9 +229,11 @@ prof $dot | |||
// articles | |||
le $u $nounf | |||
le $u $verb $verbextend | |||
la $u $nounf | |||
la $u $verb $verbextend | |||
les lez2 $u $nounf | |||
?2 les lez2 $u $nounf | |||
les lez2 $u $verb $verbextend | |||
un $u $nounf | |||
une $u $nounf | |||
@@ -278,7 +280,15 @@ lui $u $verbf | |||
ce $u $nounf | |||
cette $u $nounf | |||
ces sEz2 $u $nounf | |||
ces sez2 $u $nounf | |||
ceci $verbf | |||
cela $verbf | |||
(celle ci) sEl||si $verbf | |||
(celle là) sEl||la $verbf | |||
(ceux ci) sY||si $verbf | |||
(ceux là) sY||la $verbf | |||
(celles ci) sEl||si $verbf | |||
(celles là) sEl||la $verbf | |||
// possessives | |||
ma $u+ $nounf | |||
@@ -292,16 +302,21 @@ son $u+ $nounf | |||
ses sez2 $u+ $nounf | |||
notre $u+ $nounf | |||
votre $u+ $nounf | |||
leur $u+ | |||
leur $u+ $nounf | |||
leur $u+ $verb $verbextend | |||
(la leur) la||l@r $u+ $verbf | |||
(le leur) l@||l@r $u+ $verbf | |||
nos $u+ $nounf | |||
vos $u+ $nounf | |||
leurs $u+ | |||
leurs $u+ $nounf | |||
leurs $u+ $verb $verbextend | |||
(les leur) le||l@r $u+ $verbf | |||
(les leurs) le||l@r $u+ $verbf | |||
// prepositions | |||
de $u $nounf | |||
du $u+ $nounf | |||
des dez2 $u $nounf | |||
?2 des dez2 $u+ $nounf | |||
à $u | |||
@@ -321,7 +336,7 @@ avec $u | |||
sans $u | |||
sous $u | |||
entre $u $brk | |||
contre $u $brk | |||
contre $u | |||
durant $brk | |||
@@ -385,8 +400,7 @@ couvent k'uvt2 $verb | |||
dessus d@sy | |||
dessous d@su | |||
divers divErz2 | |||
parent paR'A~ | |||
parent p'art2 $verb | |||
hareng _!arA~ | |||
pastis pastis | |||
poing pwE~ | |||
ressent r@s'A~t2 | |||
@@ -438,6 +452,7 @@ sus sy $verb | |||
vénus venys | |||
gens ZA~ | |||
mens mA~z2 | |||
sens sA~s | |||
sens sA~z2 $verb | |||
@@ -636,4 +651,3 @@ vincent vE~sA~ | |||
@@ -4,7 +4,7 @@ | |||
// 2006-11-18 Gilles Casse <[email protected]> | |||
// | |||
// Updated: 2008-02-24 Michel Such <[email protected]> | |||
// Updated: 2008-02-26 Michel Such <[email protected]> | |||
// | |||
// * The rules are based on Cicero TTS. | |||
// Y | |||
@@ -140,6 +140,10 @@ | |||
_noeu) d (_ // noeud | |||
r) d (_ // lourd placard | |||
d d // don bled | |||
_expé) dien (t_ djA~ // expédient | |||
V_expé) dien (t_ di // expédient | |||
_ingré) dien (t_ djA~ // ingrédient | |||
dien (t_ di // étudient (verbe) | |||
// group d: English section | |||
day (_ _^_en | |||
@@ -176,7 +180,6 @@ | |||
C) en (d_ A~ // comprend dépend | |||
od) en (dr E~ // rhododendron | |||
C) en (ds_ A~ | |||
cipi) en (C A~ // récipient | |||
qu) en (d_ A~ | |||
qu) en (ds_ A~ | |||
@@ -194,7 +197,9 @@ | |||
_C) en (t_ A~ // cent vent lent dent | |||
cc) en (t_ A~ // accent | |||
Asc) en (t_ A~ // luminescent | |||
dol) en (t_ A~ // dolent | |||
_dol) en (t_ A~ // dolent | |||
ol) en (t_ A~ // somnolent, violent | |||
Vol) en (t_ // somnolent, violent | |||
imCoC) en (t_ A~ // impotent | |||
inCoC) en (t_ A~ // innocent, indolent | |||
@@ -210,13 +215,21 @@ | |||
oémin) en (t_ A~ // proéminent | |||
jac) en (t_ A~ // sous-jacent, adjacent | |||
_lat) en (t_ A~ // latent | |||
lig) en (t_ A~ // intelligent | |||
@@Cig) en (t_ A~ // intransigent, intelligent | |||
_dilig) en (t_ A~ // diligent | |||
XACig) en (t_ A~ // dirigent, exigent | |||
VXACig) en (t_ // dirigent, exigent (verbe) | |||
flig) en (t_ A~ // affligent | |||
Vflig) en (t_ // infligent (verbe) | |||
Xig) en (t_ // figent, pigent | |||
oblig) en (t_ A~ // obligent, d‚sobligent | |||
Voblig) en (t_ // obligent (verbe) | |||
man) en (t_ A~ // permanent | |||
ndig) en (t_ A~ // indigent | |||
@@ing) en (t_ A~ // astreingent, contingentindigent | |||
_pat) en (t_ A~ // patent | |||
rmam) en (t_ A~ // firmament | |||
xig) en (t_ A~ // exigent | |||
Vxig) en (t_ // exigent | |||
éCerg) en (t_ A~ // détergent | |||
V_éCerg) en (t_ // émergent | |||
verg) en (t_ A~ // convergent, divergent | |||
@@ -234,21 +247,26 @@ | |||
Atim) en (t_ A~ // bâtiment | |||
_cim) en (t_ A~ // ciment | |||
_pim) en (t_ A~ // piment | |||
ertin) en (t_ A~ // pertinent, impertinent | |||
ontin) en (t_ A~ // continent, incontinent | |||
erm) en (t_ A~ // ferment, serment | |||
Vferm) en (t_ // ferment, referment (verbe) | |||
Arp) en (t_ A~ // arpent, serpent | |||
CArr) en (t_ A~ // conncurrent, torrent | |||
_appar) en (t_ A~ // apparent | |||
spar) en (t_ A~ // transparent | |||
_par) en (t_ A~ // parent | |||
V_par) en (t_ // parent (verbe) | |||
_var) en (t_ A~ // varent | |||
mitt) en (t_ A~ // intermittent | |||
énit) en (t_ A~ // pénitent | |||
tourm) en (t_ A~ // tourment | |||
ti) en (t_ E~ // retient | |||
ati) en (t_ A~ // patient | |||
oti) en (t_ A~ // quotient | |||
vi) en (t_ E~ | |||
Cflu) en (t_ A~ // affluent, confluent | |||
VCflu) en (t_ // refluent, influent (verbe) | |||
al) en (t_ A~ // talent équivalent | |||
Vival) en (t_ // équivalent (verbe) | |||
xcell) en (t_ A~ // excellent | |||
nn) en (t_ t2 // prennent, viennent, sonnent | |||
@@ -281,7 +299,7 @@ | |||
en (t_ // étaient mangent | |||
Ci) en (_ E~ // viendra | |||
Ci) en (C E~ // tien | |||
Ci) en (C E~ // viendra | |||
Ci) en (c A~ // science | |||
@@ -435,11 +453,11 @@ | |||
ed (_ _^_en | |||
_) edit _^_en | |||
ee _^_en // meeting | |||
eing _^_en // being, goeing | |||
eing (_ _^_en // being, boeing | |||
eive _^_en // receive | |||
ej _^_en | |||
eld (_ _^_en // field | |||
enter (_ _^_en // enter, center | |||
_) enter (_ _^_en // enter | |||
_) enhan _^_en | |||
ack) et (_ _^_en // racket, packet | |||
ock) et (_ _^_en // rocket, pocket | |||
@@ -605,6 +623,15 @@ _) half _^_en | |||
i i // cri | |||
ie (ment i // remerciement balbutiement | |||
C) ien (t_ i | |||
dév) ien (t_ i | |||
t) ien (t_ jE~ // vient | |||
v) ien (t_ jE~ // tient | |||
at) ien (t_ jA~ // patient | |||
cip) ien (C jA~ // récipient | |||
vén) ien (C jA~ // inconvénient | |||
ot) ien (t_ jA~ // quotient | |||
i (es_ i // parties | |||
i (e_ i | |||
i (A j // fermier portier patio renier | |||
@@ -688,7 +715,7 @@ _) half _^_en | |||
mm m // pomme | |||
// group m: English section | |||
mail (A _^_en // mailer | |||
_) mail (_ _^_en // mailer | |||
mov (A _^_en // move, movy | |||
@@ -971,9 +998,9 @@ C) te (_ t@- // patte | |||
a) t (ia s // spatial | |||
en) t (ia s // confidentialit� | |||
u) t (ia s // balbutiait | |||
bu) t (iA s // balbutiait | |||
r) t (ia s // impartial | |||
i) t (ia s // initia | |||
ini) t (i s // initier | |||
p) t (ia s // nuptial | |||
an) t (iat s // transsubstantiation | |||
@@ -993,8 +1020,9 @@ C) te (_ t@- // patte | |||
pa) t (ien s | |||
o) t (ien s | |||
Cu) t (ie_ s // minutie | |||
Cu) t (ies_ s | |||
Cu) t (ieX s // minutie | |||
ni) tien (t_ si | |||
bu) tien (t_ si | |||
cra) t (ie_ s // démocratie | |||
cra) t (ies_ s |
@@ -8,6 +8,7 @@ | |||
// Replace Latin characters by same-shape Greek characters | |||
.replace | |||
′ ' | |||
a α // Latin->Greek | |||
o ο | |||
v ν | |||
@@ -26,6 +27,32 @@ T Τ | |||
Y Υ | |||
X Χ | |||
// replace Latin characters by Greek equivalents | |||
th θ | |||
ph φ | |||
kh χ | |||
ps ψ | |||
b β | |||
g γ | |||
d δ | |||
e ε | |||
z ζ | |||
q η // (long e; not standard transliteration but may be easier to type than η) | |||
i ι | |||
k κ | |||
l λ | |||
m μ | |||
n ν | |||
x ξ | |||
p π | |||
r ρ | |||
s σ | |||
t τ | |||
u υ | |||
y υ | |||
w ω // (long o; not standard transliteration but may be easier to type | |||
// alpha | |||
ά ὰ // tonos | |||
ά ὰ // oxia | |||
@@ -161,184 +188,175 @@ X Χ | |||
.group α | |||
α a | |||
αι aI | |||
αὶ 'aI | |||
αυ aU | |||
αὺ 'aU | |||
αhι haI | |||
αhὶ 'haI | |||
αhυ haU | |||
αhὺ 'haU | |||
α a | |||
αι aI | |||
αὶ 'aI | |||
αυ aU | |||
αὺ 'aU | |||
αhι haI | |||
αhὶ 'haI | |||
αhυ haU | |||
αhὺ 'haU | |||
.group β | |||
β b | |||
β b | |||
.group γ | |||
γ g | |||
γγ Ng | |||
γ g | |||
γγ Ng | |||
.group δ | |||
δ d | |||
δ d | |||
.group ε | |||
ε e | |||
ει e: | |||
εὶ 'e: | |||
ευ eU | |||
εὺ 'eU | |||
εhι he: | |||
εhὶ 'he: | |||
εhυ heU | |||
εhὺ 'heU | |||
ε e | |||
ει e: | |||
εὶ 'e: | |||
ευ eU | |||
εὺ 'eU | |||
εhι he: | |||
εhὶ 'he: | |||
εhυ heU | |||
εhὺ 'heU | |||
.group ζ | |||
ζ z | |||
ζ z | |||
.group η | |||
η E: | |||
ηι EI: | |||
ηὶ 'EI: | |||
ηυ EU: | |||
ηὺ 'EU: | |||
ηhι hEI: | |||
ηhὶ 'hEI: | |||
ηhυ hEU: | |||
ηhὺ 'hEU: | |||
η E: | |||
ηι EI: | |||
ηὶ 'EI: | |||
ηυ EU: | |||
ηὺ 'EU: | |||
ηhι hEI: | |||
ηhὶ 'hEI: | |||
ηhυ hEU: | |||
ηhὺ 'hEU: | |||
.group θ | |||
θ T | |||
θ T | |||
.group ι | |||
ι i | |||
ι i | |||
.group ϊ | |||
ϊ i | |||
ϊ i | |||
.group κ | |||
κ k | |||
κ k | |||
.group λ | |||
λ l | |||
λ l | |||
.group μ | |||
μ m | |||
μ m | |||
.group ν | |||
ν n | |||
ν n | |||
.group ξ | |||
ξ ks | |||
ξ ks | |||
.group ο | |||
ο o | |||
οι oI | |||
οὶ 'oI | |||
ου u: | |||
οὺ 'u: | |||
οhι hoI | |||
οhὶ 'hoI | |||
οhυ hu: | |||
οhὺ 'hu: | |||
ο o | |||
οι oI | |||
οὶ 'oI | |||
ου u: | |||
οὺ 'u: | |||
οhι hoI | |||
οhὶ 'hoI | |||
οhυ hu: | |||
οhὺ 'hu: | |||
.group π | |||
π p | |||
π p | |||
.group ρ | |||
ρ R | |||
ρ R | |||
.group ς | |||
ς s | |||
ς s | |||
.group σ | |||
σ s | |||
σ s | |||
.group τ | |||
τ t | |||
τ t | |||
.group υ | |||
υ y | |||
υι yI | |||
υὶ 'yI | |||
υhι hyI | |||
υhὶ 'hyI | |||
υ y | |||
υι yI | |||
υὶ 'yI | |||
υhι hyI | |||
υhὶ 'hyI | |||
.group ϋ | |||
ϋ y | |||
ϋι yI | |||
ϋὶ 'yI | |||
ϋhι hyI | |||
ϋhὶ 'hyI | |||
ϋ y | |||
ϋι yI | |||
ϋὶ 'yI | |||
ϋhι hyI | |||
ϋhὶ 'hyI | |||
.group φ | |||
φ f | |||
φ f | |||
.group χ | |||
χ x | |||
χ x | |||
.group ψ | |||
ψ ps | |||
ψ ps | |||
.group ω | |||
ω O: | |||
ωι OI: | |||
ωὶ 'OI: | |||
ωυ OU: | |||
ωὺ 'OU: | |||
ωhι hOI: | |||
ωhὶ 'hOI: | |||
ωhυ hOU: | |||
ωhὺ 'hOU: | |||
ω O: | |||
ωι OI: | |||
ωὶ 'OI: | |||
ωυ OU: | |||
ωὺ 'OU: | |||
ωhι hOI: | |||
ωhὶ 'hOI: | |||
ωhυ hOU: | |||
ωhὺ 'hOU: | |||
.group h // dasia (rough breathing) | |||
h h | |||
h h | |||
.group | |||
ὰ 'a | |||
ᾳ aI: | |||
ᾲ 'aI: | |||
ὲ 'e | |||
ὴ 'E: | |||
ῃ EI: | |||
ῂ 'EI: | |||
ὶ 'i | |||
ῒ 'i | |||
ὸ 'o | |||
ὺ 'y | |||
ῢ 'y | |||
ὼ 'O: | |||
ῳ OI: | |||
ῲ 'OI: | |||
ὰ 'a | |||
ᾳ aI: | |||
ᾲ 'aI: | |||
ὲ 'e | |||
ὴ 'E: | |||
ῃ EI: | |||
ῂ 'EI: | |||
ὶ 'i | |||
ῒ 'i | |||
ὸ 'o | |||
ὺ 'y | |||
ῢ 'y | |||
ὼ 'O: | |||
ῳ OI: | |||
ῲ 'OI: | |||
' = // apostrophe used as tonos, stress on previous syllable |
@@ -34,8 +34,8 @@ x Sis# | |||
_cap maI'uskulU | |||
_?A l'etR& | |||
_?? s'imbolU | |||
_?A l'etR&_ | |||
_?? s'imbolU_ | |||
_. p'oNtU | |||
_! ,eskl&mas'&U~ |
@@ -55,7 +55,7 @@ | |||
க (் g | |||
்) க ga | |||
்) க (B g | |||
_) க kV | |||
_) க ka | |||
_) க (B k | |||
க்க k:a | |||
க்க (B k: | |||
@@ -78,7 +78,7 @@ | |||
ட d.a | |||
ட (B d. | |||
_) ட t.V | |||
_) ட t.a | |||
_) ட (B t. | |||
ட்ட t.a | |||
ட்ட (B t. | |||
@@ -88,7 +88,7 @@ | |||
த da | |||
த (B d | |||
_) த tV | |||
_) த ta | |||
_) த (B t | |||
த்த t:a | |||
த்த (B t: | |||
@@ -101,7 +101,7 @@ | |||
ப ba | |||
ப (B b | |||
_) ப pV | |||
_) ப pa | |||
_) ப (B p | |||
ப்ப p:a | |||
ப்ப (B p: |
@@ -82,7 +82,7 @@ language). | |||
.group c | |||
c tsh | |||
ch ts.h | |||
ch (+ ts.h | |||
@) c (K _^_EN | |||
.group d | |||
@@ -150,6 +150,7 @@ language). | |||
.group l | |||
l l | |||
@) l (K _^_EN | |||
@) l (v l | |||
.group m | |||
m m | |||
@@ -188,7 +189,7 @@ language). | |||
.group s | |||
s s | |||
sh s. | |||
sh (+ s. | |||
@) s (K _^_EN | |||
.group t | |||
@@ -239,7 +240,7 @@ language). | |||
n) ve yE //üe | |||
.group w | |||
// @) w (K _^_EN | |||
@) w (K _^_EN | |||
wa wA //wa wan wang | |||
wai wai | |||
wa1i wai55 | |||
@@ -270,7 +271,7 @@ language). | |||
.group z | |||
z ts | |||
zh ts. | |||
zh (+ ts. | |||
@) z (K _^_EN | |||
//tone number |
@@ -1,55 +1,55 @@ | |||
50 phoneme tables | |||
new total | |||
base 99 99 | |||
base2 24 118 | |||
en 53 147 | |||
en_n 30 147 | |||
en_us 34 147 | |||
en_sc 39 149 | |||
en_rp 34 147 | |||
en_wm 30 147 | |||
en_wi 30 147 | |||
af 38 131 | |||
cy 29 125 | |||
de 33 126 | |||
eo 13 111 | |||
jbo 4 112 | |||
fi 40 130 | |||
fr 44 125 | |||
fr_ca 11 125 | |||
hi 51 136 | |||
ta 16 139 | |||
hu 23 115 | |||
nl 28 122 | |||
pl 15 110 | |||
sk 29 128 | |||
cs 6 128 | |||
hr 20 133 | |||
mk 3 134 | |||
sr 14 133 | |||
ru 38 129 | |||
it 17 121 | |||
la 21 117 | |||
es 9 119 | |||
es_la 1 119 | |||
pt 27 134 | |||
pt_pt 20 134 | |||
ro 36 142 | |||
el 8 118 | |||
grc 12 123 | |||
sv 25 121 | |||
no 28 125 | |||
is 32 124 | |||
vi 42 137 | |||
zhy 40 132 | |||
zh 65 149 | |||
sw 14 108 | |||
th 50 142 | |||
id 14 120 | |||
tr 18 123 | |||
ku 13 120 | |||
ja 7 104 | |||
rw 12 123 | |||
base 98 98 | |||
base2 24 117 | |||
en 51 144 | |||
en_n 30 144 | |||
en_us 34 144 | |||
en_sc 39 146 | |||
en_rp 34 144 | |||
en_wm 30 144 | |||
en_wi 30 144 | |||
af 38 130 | |||
cy 29 124 | |||
de 33 125 | |||
eo 13 110 | |||
jbo 4 111 | |||
fi 40 129 | |||
fr 44 124 | |||
fr_ca 11 124 | |||
hi 51 135 | |||
ta 16 138 | |||
hu 23 114 | |||
nl 28 121 | |||
pl 15 109 | |||
sk 29 127 | |||
cs 6 127 | |||
hr 20 132 | |||
mk 3 133 | |||
sr 14 132 | |||
ru 38 128 | |||
it 17 120 | |||
la 21 116 | |||
es 9 118 | |||
es_la 1 118 | |||
pt 27 133 | |||
pt_pt 20 133 | |||
ro 36 141 | |||
el 8 117 | |||
grc 12 122 | |||
sv 25 120 | |||
no 28 124 | |||
is 32 123 | |||
vi 42 136 | |||
zhy 40 131 | |||
zh 65 148 | |||
sw 14 107 | |||
th 50 141 | |||
id 14 119 | |||
tr 18 122 | |||
ku 13 119 | |||
ja 7 103 | |||
rw 12 122 | |||
Data file Used by | |||
b/b [b] base | |||
@@ -501,6 +501,7 @@ r3/rx [*] base | |||
r3/rz_cs [R^] sk | |||
[R^/] sk | |||
r3/@tap [**] base | |||
r3/@tap2 [**] base | |||
r/r [r] base | |||
[r-] base | |||
[r] en_sc | |||
@@ -1024,7 +1025,6 @@ vdiph/@u_3 [@U] ro | |||
vdiph/@u_en [oU] en | |||
[@U] id | |||
vdiph/ui [uI] base2 | |||
[uI] en | |||
[uI] eo | |||
[ui] fi | |||
[uI] vi | |||
@@ -1083,8 +1083,7 @@ vnasal/oo_n2 [O~] hi | |||
vnasal/u_n [u~] hi | |||
[u~] pt | |||
[u] zh | |||
vnasal/W_n [W~] en | |||
[E~] fr | |||
vnasal/W_n [E~] fr | |||
[W~] fr | |||
voc/bh [B] base | |||
voc/dh [D] base | |||
@@ -1455,8 +1454,7 @@ vowel/i_5 [i:] en_sc | |||
vowel/i#_5 [y] pt_pt | |||
[i/] pt_pt | |||
[y] ro | |||
vowel/i_6 [i:] en_us | |||
[i] ta | |||
vowel/i_6 [i] ta | |||
[i] hr | |||
[i] id | |||
[i] tr | |||
@@ -1464,6 +1462,7 @@ vowel/i_6 [i:] en_us | |||
vowel/i#_6 [i.] zh | |||
vowel/i#_7 [i[] zh | |||
vowel/i_en [i:] en | |||
[i:] en_us | |||
[i:] fr | |||
[i] vi | |||
vowel/i_fnt [i:] en_wi |
@@ -292,7 +292,7 @@ endphoneme | |||
phoneme e@ | |||
vowel starttype (e) endtype (@) | |||
length 220 | |||
length 230 | |||
formants vowel/ee_1 | |||
linkout r- | |||
endphoneme | |||
@@ -361,13 +361,6 @@ formants vdiph/eu | |||
endphoneme | |||
phoneme uI | |||
vowel starttype (u) endtype (i) | |||
length 240 | |||
formants vdiph/ui | |||
endphoneme | |||
phoneme IR // used for "ir" when [3:] is split (Scottish) | |||
vowel starttype (@) endtype (@) | |||
length 190 | |||
@@ -405,13 +398,6 @@ phoneme O~ | |||
endphoneme | |||
phoneme W~ | |||
vowel starttype (@) endtype (@) | |||
length 260 | |||
formants vnasal/W_n | |||
endphoneme | |||
phoneme y: | |||
vowel starttype (u) endtype (u) | |||
length 220 |
@@ -136,7 +136,7 @@ endphoneme | |||
phoneme i: | |||
vowel starttype (i) endtype (i) | |||
length 170 | |||
formants vowel/i_6 | |||
formants vowel/i_en | |||
linkout ; | |||
endphoneme | |||
@@ -31,7 +31,6 @@ phonemenumber 24 _:: // long pause | |||
phonemenumber 25 t# // reduced version of [t] | |||
phonemenumber 26 '! // stress - emphasized | |||
phonemenumber 27 _;_ // clause pause | |||
phonemenumber 28 _^^ // Change language + phoneme table number | |||
// The base phoneme table contains the utility phonemes, the consonants, | |||
// and a schwa. The vowels are defined in the language specific phoneme | |||
@@ -150,13 +149,6 @@ phoneme _^_ // Change dictionary (followed by language-code in ascii | |||
lengthmod 1 | |||
endphoneme | |||
phoneme _^^ // Change phoneme table (followed by phoneme table number) | |||
pause | |||
starttype _ endtype _ | |||
length 1 | |||
lengthmod 1 | |||
endphoneme | |||
phoneme _X1 // a language specific action | |||
pause | |||
starttype _ endtype _ | |||
@@ -605,9 +597,7 @@ phoneme ** // TEST flap | |||
vowelout f1=3 f2=1600 -300 300 f3=-300 80 rms=35 len=15 | |||
vowelin f1=2 f2=1600 -300 300 f3=-100 80 len=20 | |||
formants r3/@tap | |||
// vowelin f1=3 f2=1600 -300 300 f3=-300 80 | |||
// before (i) r3/@tap_i+r3/rx | |||
// before (e) r3/@tap_i+r3/rx | |||
after (e) r3/@tap2 | |||
endphoneme | |||
@@ -434,11 +434,18 @@ char *EncodePhonemes(char *p, char *outptr, unsigned char *bad_phoneme) | |||
while(!isspace(c = *p++) && (c != 0)) | |||
*outptr++ = tolower(c); | |||
*outptr = 0; | |||
if(strcmp(p_lang,"en")==0) | |||
if(c == 0) | |||
{ | |||
*p_lang = 0; // don't need "en", it's assumed by default | |||
if(strcmp(p_lang,"en")==0) | |||
{ | |||
*p_lang = 0; // don't need "en", it's assumed by default | |||
return(p); | |||
} | |||
} | |||
else | |||
{ | |||
*outptr++ = '|'; // more phonemes follow, terminate language string with separator | |||
} | |||
return(p); | |||
} | |||
break; | |||
} | |||
@@ -2302,10 +2309,10 @@ int Translator::TranslateRules(char *p_start, char *phonemes, int ph_size, char | |||
while(((c = *p) != ' ') && (c != 0)) | |||
{ | |||
if(IsAlpha(wc)) | |||
any_alpha++; | |||
wc_prev = wc; | |||
wc_bytes = utf8_in(&wc,p,0); | |||
if(IsAlpha(wc)) | |||
any_alpha++; | |||
n = groups2_count[c]; | |||
if(IsDigit(wc) && ((langopts.tone_numbers == 0) || !any_alpha)) | |||
@@ -2424,11 +2431,23 @@ int Translator::TranslateRules(char *p_start, char *phonemes, int ph_size, char | |||
if(match1.points == 0) | |||
{ | |||
static const char str_unknown[4] = {phonCAPITAL,phonCAPITAL,phonCAPITAL,0}; | |||
if(((any_alpha > 0) || (p[wc_bytes-1] > ' ')) && !iswpunct(wc)) | |||
if(iswalpha(wc)) | |||
{ | |||
// an unrecognised character in a word, indicate with clicks | |||
match1.phonemes = str_unknown; | |||
match1.points = 1; | |||
if((any_alpha > 1) || (p[wc_bytes-1] > ' ')) | |||
{ | |||
// an unrecognised character in a word, indicate with clicks | |||
match1.phonemes = str_unknown; | |||
match1.points = 1; | |||
} | |||
} | |||
else | |||
{ | |||
LookupLetter(wc, -1, ph_buf); | |||
if(ph_buf[0]) | |||
{ | |||
match1.phonemes = ph_buf; | |||
match1.points = 1; | |||
} | |||
} | |||
p += (wc_bytes-1); | |||
} |
@@ -45,6 +45,31 @@ void Translator::LookupLetter(unsigned int letter, int next_byte, char *ph_buf1) | |||
char ph_stress[2]; | |||
char ph_buf3[30]; | |||
ph_buf1[0] = 0; | |||
len = utf8_out(letter,&single_letter[2]); | |||
single_letter[len+2] = ' '; | |||
if(next_byte == -1) | |||
{ | |||
// speaking normal text, not individual characters | |||
if(Lookup(&single_letter[2],ph_buf1) != 0) | |||
return; | |||
single_letter[1] = '_'; | |||
if(Lookup(&single_letter[1],ph_buf3) != 0) | |||
return; // the character is specified as _* so ignore it when speaking normal text | |||
// check whether this character is specified for English | |||
SetTranslator2("en"); | |||
if(translator2->Lookup(&single_letter[2], ph_buf3) != 0) | |||
{ | |||
// yes, switch to English and re-translate the word | |||
sprintf(ph_buf1,"%c",phonSWITCH); | |||
} | |||
SelectPhonemeTable(voice->phoneme_tab_ix); // revert to original phoneme table | |||
return; | |||
} | |||
if((letter <= 32) || iswspace(letter)) | |||
{ | |||
// lookup space as _&32 etc. | |||
@@ -53,10 +78,6 @@ void Translator::LookupLetter(unsigned int letter, int next_byte, char *ph_buf1) | |||
return; | |||
} | |||
len = utf8_out(letter,&single_letter[2]); | |||
single_letter[len+2] = ' '; | |||
if(next_byte != ' ') | |||
next_byte = RULE_SPELLING; | |||
single_letter[3+len] = next_byte; // follow by space-space if the end of the word, or space-0x31 | |||
@@ -91,8 +112,8 @@ void Translator::LookupLetter(unsigned int letter, int next_byte, char *ph_buf1) | |||
int Translator::TranslateLetter(char *word, char *phonemes, int control) | |||
{//===================================================================== | |||
int Translator::TranslateLetter(char *word, char *phonemes, int control, int word_length) | |||
{//====================================================================================== | |||
// get pronunciation for an isolated letter | |||
// return number of bytes used by the letter | |||
// control 2=say-as glyphs, 3-say-as chars | |||
@@ -134,11 +155,17 @@ int Translator::TranslateLetter(char *word, char *phonemes, int control) | |||
return(0); | |||
} | |||
if(ph_buf[0] == 0) | |||
if((ph_buf[0] == 0) && (word_length == 1) && (translator_name != L('e','n'))) | |||
{ | |||
// ?? speak as English ?? | |||
sprintf(phonemes,"%c",phonSWITCH); | |||
return(0); | |||
// speak as English, check whether there is a translation for this character | |||
SetTranslator2("en"); | |||
translator2->LookupLetter(letter, word[n_bytes], ph_buf); | |||
SelectPhonemeTable(voice->phoneme_tab_ix); // revert to original phoneme table | |||
if(ph_buf[0] != 0) | |||
{ | |||
sprintf(phonemes,"%c",phonSWITCH); | |||
return(0); | |||
} | |||
} | |||
if(ph_buf[0] == 0) |
@@ -63,11 +63,11 @@ static const char *punct_stop = ".:!?"; // pitch fall if followed by space | |||
static const char *punct_close = ")]}>;'\""; // always pitch fall unless followed by alnum | |||
// alter tone for announce punctuation or capitals | |||
static const char *tone_punct_on = "\001+50R\001+10T"; // add reverberation, reduce low frequencies | |||
static const char *tone_punct_off = "\001R\001T"; | |||
static const char *tone_punct_on = "\0016T"; // add reverberation, lower pitch | |||
static const char *tone_punct_off = "\001T"; | |||
// punctuations symbols that can end a clause | |||
static const unsigned short punct_chars[] = {',','.','?','!',':',';', | |||
const unsigned short punct_chars[] = {',','.','?','!',':',';', | |||
0x2013, // en-dash | |||
0x2014, // em-dash | |||
0x2026, // elipsis | |||
@@ -477,22 +477,38 @@ static void UngetC(int c) | |||
} | |||
const char *WordToString2(unsigned int word) | |||
{//======================================== | |||
// Convert a language mnemonic word into a string | |||
int ix; | |||
static char buf[5]; | |||
char *p; | |||
p = buf; | |||
for(ix=3; ix>=0; ix--) | |||
{ | |||
if((*p = word >> (ix*8)) != 0) | |||
p++; | |||
} | |||
*p = 0; | |||
return(buf); | |||
} | |||
const char *Translator::LookupSpecial(const char *string) | |||
{//====================================================== | |||
const char *Translator::LookupSpecial(const char *string, char* text_out) | |||
{//====================================================================== | |||
unsigned int flags[2]; | |||
char phonemes[55]; | |||
char phonemes2[55]; | |||
static char buf[60]; | |||
char *string1 = (char *)string; | |||
if(LookupDictList(&string1,phonemes,flags,0,NULL)) | |||
{ | |||
SetWordStress(phonemes,flags[0],-1,0); | |||
DecodePhonemes(phonemes,phonemes2); | |||
sprintf(buf,"[[%s]] ",phonemes2); | |||
sprintf(text_out,"[[%s]]",phonemes2); | |||
option_phoneme_input = 1; | |||
return(buf); | |||
return(text_out); | |||
} | |||
return(NULL); | |||
} | |||
@@ -503,26 +519,78 @@ const char *Translator::LookupCharName(int c) | |||
// Find the phoneme string (in ascii) to speak the name of character c | |||
int ix; | |||
const char *p; | |||
static char buf[24]; | |||
unsigned int flags[2]; | |||
char single_letter[24]; | |||
char phonemes[60]; | |||
char phonemes2[60]; | |||
char *lang_name = NULL; | |||
char *string; | |||
static char buf[60]; | |||
buf[0] = '_'; | |||
ix = utf8_out(c,&buf[1]); | |||
buf[1+ix]=0; | |||
buf[0] = 0; | |||
flags[0] = 0; | |||
flags[1] = 0; | |||
single_letter[0] = 0; | |||
single_letter[1] = '_'; | |||
ix = utf8_out(c,&single_letter[2]); | |||
single_letter[2+ix]=0; | |||
if((p = LookupSpecial(buf)) == NULL) | |||
string = &single_letter[1]; | |||
if(LookupDictList(&string, phonemes, flags, 0, NULL) == 0) | |||
{ | |||
p = LookupSpecial(&buf[1]); | |||
// try _* then * | |||
string = &single_letter[2]; | |||
if(LookupDictList(&string, phonemes, flags, 0, NULL) == 0) | |||
{ | |||
// now try the rules | |||
single_letter[1] = ' '; | |||
TranslateRules(&single_letter[2], phonemes, sizeof(phonemes), NULL,0,0); | |||
} | |||
} | |||
if(p != NULL) | |||
return(p); | |||
if((p = LookupSpecial("_??")) == NULL) | |||
if((phonemes[0] == 0) && (translator_name != L('e','n'))) | |||
{ | |||
p = "symbol"; | |||
// not found, try English | |||
SetTranslator2("en"); | |||
string = &single_letter[1]; | |||
single_letter[1] = '_'; | |||
if(translator2->LookupDictList(&string, phonemes, flags, 0, NULL) == 0) | |||
{ | |||
string = &single_letter[2]; | |||
translator2->LookupDictList(&string, phonemes, flags, 0, NULL); | |||
} | |||
if(phonemes[0]) | |||
{ | |||
lang_name = "en"; | |||
} | |||
else | |||
{ | |||
SelectPhonemeTable(voice->phoneme_tab_ix); // revert to original phoneme table | |||
} | |||
} | |||
strcpy(buf,p); | |||
// sprintf(buf,"%s%d ",p,c); | |||
if(phonemes[0]) | |||
{ | |||
if(lang_name) | |||
{ | |||
translator2->SetWordStress(phonemes,flags[0],-1,0); | |||
DecodePhonemes(phonemes,phonemes2); | |||
sprintf(buf,"[[_^_%s %s _^_%s]]","en",phonemes2,WordToString2(translator_name)); | |||
SelectPhonemeTable(voice->phoneme_tab_ix); // revert to original phoneme table | |||
} | |||
else | |||
{ | |||
SetWordStress(phonemes,flags[0],-1,0); | |||
DecodePhonemes(phonemes,phonemes2); | |||
sprintf(buf,"[[%s]] ",phonemes2); | |||
} | |||
} | |||
else | |||
{ | |||
strcpy(buf,"[[(X1)(X1)(X1)]]"); | |||
} | |||
option_phoneme_input = 1; | |||
return(buf); | |||
} | |||
@@ -714,7 +782,9 @@ int Translator::AnnouncePunctuation(int c1, int c2, char *buf, int bufix) | |||
p = &buf[bufix]; | |||
if(punct_count==1) | |||
{ | |||
sprintf(p,"%s %s %s",tone_punct_on,punctname,tone_punct_off); | |||
} | |||
else | |||
if(punct_count < 4) | |||
{ | |||
@@ -1769,8 +1839,8 @@ int Translator::ReadClause(FILE *f_in, char *buf, unsigned short *charix, int n_ | |||
const char *p; | |||
wchar_t xml_buf[N_XML_BUF+1]; | |||
#define N_XML_BUF2 12 | |||
char buf2[N_XML_BUF2+2]; | |||
#define N_XML_BUF2 20 | |||
char xml_buf2[N_XML_BUF2+2]; // for &<name> and &<number> sequences | |||
static char ungot_string[N_XML_BUF2+4]; | |||
static int ungot_string_ix = -1; | |||
@@ -1859,26 +1929,26 @@ f_input = f_in; // for GetC etc | |||
c1 = c2; | |||
while(!Eof() && (iswalnum(c1) || (c1=='#')) && (n_xml_buf < N_XML_BUF2)) | |||
{ | |||
buf2[n_xml_buf++] = c1; | |||
xml_buf2[n_xml_buf++] = c1; | |||
c1 = GetC(); | |||
} | |||
buf2[n_xml_buf] = 0; | |||
xml_buf2[n_xml_buf] = 0; | |||
c2 = GetC(); | |||
sprintf(ungot_string,"%s%c%c",&buf2[0],c1,c2); | |||
sprintf(ungot_string,"%s%c%c",&xml_buf2[0],c1,c2); | |||
if(c1 == ';') | |||
{ | |||
if(buf2[0] == '#') | |||
if(xml_buf2[0] == '#') | |||
{ | |||
// character code number | |||
if(buf2[1] == 'x') | |||
found = sscanf(&buf2[2],"%x",(unsigned int *)(&c1)); | |||
if(xml_buf2[1] == 'x') | |||
found = sscanf(&xml_buf2[2],"%x",(unsigned int *)(&c1)); | |||
else | |||
found = sscanf(&buf2[1],"%d",&c1); | |||
found = sscanf(&xml_buf2[1],"%d",&c1); | |||
} | |||
else | |||
{ | |||
if((found = LookupMnem(xml_char_mnemonics,buf2)) != -1) | |||
if((found = LookupMnem(xml_char_mnemonics,xml_buf2)) != -1) | |||
{ | |||
c1 = found; | |||
if(c2 == 0) | |||
@@ -2050,14 +2120,15 @@ f_input = f_in; // for GetC etc | |||
clause_upper_count++; | |||
if((option_capitals == 2) && !iswupper(cprev)) | |||
{ | |||
p = LookupSpecial("_cap"); | |||
if(p != NULL) | |||
char text_buf[40]; | |||
char text_buf2[30]; | |||
if(LookupSpecial("_cap",text_buf2) != NULL) | |||
{ | |||
sprintf(buf2,"%s%s%s",tone_punct_on,p,tone_punct_off); | |||
j = strlen(buf2); | |||
sprintf(text_buf,"%s%s%s",tone_punct_on,text_buf2,tone_punct_off); | |||
j = strlen(text_buf); | |||
if((ix + j) < n_buf) | |||
{ | |||
strcpy(&buf[ix],buf2); | |||
strcpy(&buf[ix],text_buf); | |||
ix += j; | |||
} | |||
} | |||
@@ -2186,11 +2257,14 @@ if(option_ssml) parag=1; | |||
if(speech_parameters[espeakSILENCE]==1) | |||
continue; | |||
j = ix+1; | |||
ix += utf8_out(c1,&buf[ix]); // buf[ix++] = c1; | |||
if(!iswspace(c1) && !IsBracket(c1)) | |||
{ | |||
charix[ix] = count_characters - clause_start_char; | |||
while(j < ix) | |||
charix[j++] = 0xffff; // subsequent bytes of a multibyte character | |||
} | |||
ix += utf8_out(c1,&buf[ix]); // buf[ix++] = c1; | |||
if(((ix > (n_buf-20)) && !IsAlpha(c1) && !iswdigit(c1)) || (ix >= (n_buf-2))) | |||
{ |
@@ -35,7 +35,7 @@ | |||
#include "translate.h" | |||
#include "wave.h" | |||
const char *version_string = "1.31.18 25.Feb.08"; | |||
const char *version_string = "1.31.19 28.Feb.08"; | |||
const int version_phdata = 0x013105; | |||
int option_device_number = -1; |
@@ -51,7 +51,7 @@ | |||
#define EMBED_A 3 // amplitude/volume | |||
#define EMBED_R 4 // pitch range/expression | |||
#define EMBED_H 5 // echo/reverberation | |||
#define EMBED_T 6 // different tone | |||
#define EMBED_T 6 // different tone for announcing punctuation | |||
#define EMBED_I 7 // sound icon | |||
#define EMBED_S2 8 // speed (used in synthesize) | |||
#define EMBED_Y 9 // say-as commands | |||
@@ -274,5 +274,6 @@ int DoSample(PHONEME_TAB *ph1, PHONEME_TAB *ph2, int which, int length_mod, int | |||
int DoSpect(PHONEME_TAB *this_ph, PHONEME_TAB *prev_ph, PHONEME_TAB *next_ph, | |||
int which, PHONEME_LIST *plist, int modulation); | |||
int PauseLength(int pause); | |||
int LookupPhonemeTable(const char *name); | |||
void InitBreath(void); |
@@ -111,7 +111,7 @@ int Translator_English::Unpronouncable(char *word) | |||
if(c == '\'') | |||
apostrophe = 1; | |||
else | |||
if((c < 'a') || (c > 0x241)) | |||
if(!IsAlpha(c)) | |||
return(0); // letter (not vowel) outside Latin character range or apostrophe, abort test | |||
} | |||
if((vowel_posn > 5) || ((word[0]!='s') && (vowel_posn > 4))) |
@@ -752,7 +752,7 @@ if((wmark > 0) && (wmark < 8)) | |||
while(*wordx != ' ') | |||
{ | |||
wordx += TranslateLetter(wordx, phonemes,spell_word); | |||
wordx += TranslateLetter(wordx, phonemes,spell_word, word_length); | |||
posn++; | |||
if(phonemes[0] == phonSWITCH) | |||
{ | |||
@@ -779,7 +779,7 @@ if((wmark > 0) && (wmark < 8)) | |||
// This word looks "unpronouncable", so speak letters individually until we | |||
// find a remainder that we can pronounce. | |||
emphasize_allcaps = 0; | |||
wordx += TranslateLetter(wordx,phonemes,0); | |||
wordx += TranslateLetter(wordx,phonemes,0, word_length); | |||
posn++; | |||
if(phonemes[0] == phonSWITCH) | |||
{ | |||
@@ -825,12 +825,12 @@ if((wmark > 0) && (wmark < 8)) | |||
// characters not recognised, speak them individually | |||
utf8_in(&wc, wordx, 0); | |||
if(!iswpunct(wc)) | |||
if((word_length == 1) && IsAlpha(wc)) | |||
{ | |||
posn = 0; | |||
while(*wordx != ' ') | |||
{ | |||
wordx += TranslateLetter(wordx, phonemes, 4); | |||
wordx += TranslateLetter(wordx, phonemes, 4, word_length); | |||
posn++; | |||
if(phonemes[0] == phonSWITCH) | |||
{ | |||
@@ -1278,9 +1278,12 @@ int Translator::TranslateWord2(char *word, WORD_TAB *wtab, int pre_pause, int ne | |||
int first_phoneme = 1; | |||
int source_ix; | |||
int len; | |||
int ix; | |||
int sylimit; // max. number of syllables in a word to be combined with a preceding preposition | |||
const char *new_language; | |||
unsigned char bad_phoneme[4]; | |||
int word_copy_len; | |||
char word_copy[N_WORD_BYTES]; | |||
len = wtab->length; | |||
if(len > 31) len = 31; | |||
@@ -1355,11 +1358,42 @@ int Translator::TranslateWord2(char *word, WORD_TAB *wtab, int pre_pause, int ne | |||
if(word_flags & FLAG_PHONEMES) | |||
{ | |||
// The input is in phoneme mnemonics, not language text | |||
EncodePhonemes(word,word_phonemes,bad_phoneme); | |||
int c1; | |||
char lang_name[12]; | |||
if(memcmp(word,"_^_",3)==0) | |||
{ | |||
// switch languages | |||
word+=3; | |||
for(ix=0;;) | |||
{ | |||
c1 = *word++; | |||
if((c1==' ') || (c1==0)) | |||
break; | |||
lang_name[ix++] = tolower(c1); | |||
} | |||
lang_name[ix] = 0; | |||
if((ix = LookupPhonemeTable(lang_name)) > 0) | |||
{ | |||
SelectPhonemeTable(ix); | |||
word_phonemes[0] = phonSWITCH; | |||
word_phonemes[1] = ix; | |||
word_phonemes[2] = 0; | |||
} | |||
} | |||
else | |||
{ | |||
EncodePhonemes(word,word_phonemes,bad_phoneme); | |||
} | |||
flags = FLAG_FOUND; | |||
} | |||
else | |||
{ | |||
ix = 0; | |||
while((word_copy[ix] = word[ix]) != ' ') ix++; | |||
word_copy_len = ix; | |||
flags = translator->TranslateWord(word, next_pause, wtab); | |||
if((flags & FLAG_ALT2_TRANS) && ((sylimit = langopts.param[LOPT_COMBINE_WORDS]) > 0)) | |||
@@ -1420,6 +1454,8 @@ int Translator::TranslateWord2(char *word, WORD_TAB *wtab, int pre_pause, int ne | |||
if(p[0] == phonSWITCH) | |||
{ | |||
// this word uses a different language | |||
memcpy(word, word_copy, word_copy_len); | |||
new_language = (char *)(&p[1]); | |||
if(new_language[0]==0) | |||
new_language = "en"; | |||
@@ -1523,6 +1559,15 @@ int Translator::TranslateWord2(char *word, WORD_TAB *wtab, int pre_pause, int ne | |||
// Add the phonemes to the first stage phoneme list (ph_list2) | |||
ph = phoneme_tab[ph_code]; | |||
if(ph_code == phonSWITCH) | |||
{ | |||
ph_list2[n_ph_list2].phcode = ph_code; | |||
ph_list2[n_ph_list2].sourceix = 0; | |||
ph_list2[n_ph_list2].synthflags = embedded_flag; | |||
ph_list2[n_ph_list2++].tone_number = *p++; | |||
} | |||
else | |||
if(ph->type == phSTRESS) | |||
{ | |||
// don't add stress phonemes codes to the list, but give their stress | |||
@@ -1924,8 +1969,14 @@ void *Translator::TranslateClause(FILE *f_text, const void *vp_input, int *tone_ | |||
for(j=0; charix[j]==0; j++); | |||
words[0].sourceix = charix[j]; | |||
for(k=j; charix[k]!=0; k++); | |||
words[0].length = k-j; | |||
k = 0; | |||
while(charix[j] != 0) | |||
{ | |||
// count the number of characters (excluding multibyte continuation bytes) | |||
if(charix[j++] != 0xffff) | |||
k++; | |||
} | |||
words[0].length = k; | |||
while(!finished && (ix < (int)sizeof(sbuf))&& (n_ph_list2 < N_PHONEME_LIST-4)) | |||
{ | |||
@@ -2327,10 +2378,16 @@ if((c == '/') && (langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(prev_ou | |||
words[word_count].start = ix; | |||
words[word_count].flags = 0; | |||
for(j=source_index; charix[j] == 0; j++); | |||
for(j=source_index; charix[j] == 0; j++); // skip blanks | |||
words[word_count].sourceix = charix[j]; | |||
for(k=j; charix[k]!=0; k++); | |||
words[word_count].length = k-j; | |||
k = 0; | |||
while(charix[j] != 0) | |||
{ | |||
// count the number of characters (excluding multibyte continuation bytes) | |||
if(charix[j++] != 0xffff) | |||
k++; | |||
} | |||
words[word_count].length = k; | |||
word_flags = next_word_flags; | |||
next_word_flags = 0; |
@@ -417,7 +417,7 @@ public: | |||
private: | |||
int TranslateWord2(char *word, WORD_TAB *wtab, int pre_pause, int next_pause); | |||
int TranslateLetter(char *letter, char *phonemes, int control); | |||
int TranslateLetter(char *letter, char *phonemes, int control, int word_length); | |||
void SetSpellingStress(char *phonemes, int control, int n_chars); | |||
void WriteMnemonic(int *ix, int mnem); | |||
void MakePhonemeList(int post_pause, int new_sentence); | |||
@@ -427,7 +427,7 @@ private: | |||
int AnnouncePunctuation(int c1, int c2, char *buf, int ix); | |||
const char *LookupDict2(const char *word, const char *word2, char *phonetic, unsigned int *flags, int end_flags, WORD_TAB *wtab); | |||
const char *LookupSpecial(const char *string); | |||
const char *LookupSpecial(const char *string, char *text_out); | |||
const char *LookupCharName(int c); | |||
void LookupLetter(unsigned int letter, int next_byte, char *ph_buf); | |||
int LookupNum2(int value, int control, char *ph_out); | |||
@@ -539,6 +539,7 @@ extern char skip_marker[N_MARKER_LENGTH]; | |||
#define N_PUNCTLIST 60 | |||
extern wchar_t option_punctlist[N_PUNCTLIST]; // which punctuation characters to announce | |||
extern unsigned char punctuation_to_tone[INTONATION_TYPES][PUNCT_INTONATIONS]; | |||
extern const unsigned short punct_chars[]; // punctuation chars fo end-of-clause | |||
extern int speech_parameters[]; | |||
@@ -144,7 +144,7 @@ int wcmdq_head=0; | |||
int wcmdq_tail=0; | |||
// pitch,speed, | |||
int embedded_default[N_EMBEDDED_VALUES] = {0,50,170,100,50, 0,50, 0,170,0,0,0,0,0}; | |||
int embedded_default[N_EMBEDDED_VALUES] = {0,50,170,100,50, 0,0, 0,170,0,0,0,0,0}; | |||
static int embedded_max[N_EMBEDDED_VALUES] = {0,0x7fff,360,300,99,99,99, 0,360,0,0,0,0,4}; | |||
#define N_CALLBACK_IX N_WAV_BUF-2 // adjust this delay to match display with the currently spoken word | |||
@@ -813,6 +813,12 @@ static void WavegenSetEcho(void) | |||
amp = embedded_value[EMBED_H]; | |||
delay = 130; | |||
} | |||
if(embedded_value[EMBED_T] > 0) | |||
{ | |||
// announcing punctuation | |||
amp = embedded_value[EMBED_T] * 10; | |||
delay = 130; | |||
} | |||
if(delay == 0) | |||
amp = 0; | |||
@@ -1517,8 +1523,9 @@ void SetEmbedded(int control, int value) | |||
switch(command) | |||
{ | |||
case EMBED_P: | |||
case EMBED_T: | |||
WavegenSetEcho(); // and drop through to case P | |||
case EMBED_P: | |||
// adjust formants to give better results for a different voice pitch | |||
if((pitch_value = embedded_value[EMBED_P]) > MAX_PITCH_VALUE) | |||
pitch_value = MAX_PITCH_VALUE; | |||
@@ -1528,7 +1535,7 @@ void SetEmbedded(int control, int value) | |||
{ | |||
wvoice->freq[ix] = (wvoice->freq2[ix] * factor)/256; | |||
} | |||
factor = (embedded_value[EMBED_T] - 50)*2; | |||
factor = embedded_value[EMBED_T]*3; | |||
wvoice->height[0] = (wvoice->height2[0] * (256 - factor*2))/256; | |||
wvoice->height[1] = (wvoice->height2[1] * (256 - factor))/256; | |||
break; | |||
@@ -1623,6 +1630,7 @@ if(option_log_frames) | |||
if((pitch_value = embedded_value[EMBED_P]) > MAX_PITCH_VALUE) | |||
pitch_value = MAX_PITCH_VALUE; | |||
pitch_value -= embedded_value[EMBED_T]; // adjust tone for announcing punctuation | |||
if(pitch_value < 0) | |||
pitch_value = 0; | |||