<say-as tts:char>, if a character name is not defined, say its English name. phoneme tables, added beforenotvowel2 attribure for lang=tr lang=tr: initial draft git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@135 d46cf337-b52f-0410-862d-fd96e6ae7743master
@@ -42,6 +42,7 @@ _— g@d'ank@nSt@-*,IC | |||
_#9 t,abu:l'Ato:* | |||
_#32 l'e:*ts'aIC@n | |||
_?? zymb'o:l | |||
// Not Roman numbers | |||
v faU |
@@ -43,9 +43,9 @@ x z | |||
Dictionary de_dict | |||
3 @ @- a A A: aI aU | |||
E E2 E: e: EI I i2 I: | |||
i: O o: OY U u: W y | |||
y: Y: | |||
E E2 E: e: EI I i2 i: | |||
O o: OY U u: W y y: | |||
Y: | |||
* : ; b C C2 d D | |||
dZ f g h j k l m | |||
@@ -117,8 +117,9 @@ w^i W~ y Y | |||
* : ; b c d dZ f | |||
g h j k l L m n | |||
N n^ p r R s S t | |||
t2 tS v w z Z z2 z3 | |||
N n2 n^ p r R s S | |||
t t2 tS v w z Z z2 | |||
z3 | |||
Dictionary hi_dict | |||
@@ -281,7 +282,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 w2 x z Z | |||
w x z Z | |||
Dictionary ro_dict | |||
@@ -340,10 +341,10 @@ Dictionary zh_dict | |||
i i. i[ iou o o- ou u | |||
uai y | |||
: 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. | |||
(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. | |||
Dictionary jbo_dict | |||
@@ -390,3 +391,13 @@ x z | |||
Dictionary ja_dict | |||
Dictionary tr_dict | |||
a e E i I o O u | |||
u# W y Y | |||
: ; b d dZ f g h | |||
j k l m n p Q r | |||
R s S t tS v z Z |
@@ -92,6 +92,25 @@ _| vi:b'A@ | |||
_} A@breIs | |||
_~ tIld@ | |||
£ paUnd | |||
¥ jEn | |||
§ sEkS@n | |||
_¶ par@graf // in en_rules | |||
¤ kVr@nsI2saIn | |||
© k0pI2raIt | |||
° dI2gri:z | |||
− maIn@s | |||
± plVs@maIn@s | |||
µ maIkroU | |||
¼ a2kwO@t3 | |||
½ a2hA:f | |||
¾ Tri:kwO@t3 | |||
× taImz | |||
÷ dI2vaIdbaI | |||
€ jU@roUz | |||
♯ SA@p | |||
♭ flat | |||
ə SwA: | |||
// numeric | |||
@@ -2673,8 +2692,8 @@ than %Dan $only | |||
then DEn $verbf | |||
// these should be stressed at the start of a sentence | |||
which ,wItS $pause $strend2 $only $verbsf | |||
who ,hu: $verbsf $pause $strend2 $onlys | |||
which ,wItS $pause $strend2 $only $verbf | |||
who ,hu: $verbf $pause $strend2 $onlys | |||
whose ,hu:z $pause $only | |||
what ,w0t $strend2 $onlys | |||
how ,haU $strend2 $onlys |
@@ -5160,7 +5160,6 @@ | |||
ë E | |||
ï i: | |||
ö 3: | |||
?5 ö VR | |||
ü u: | |||
ç s | |||
ß s | |||
@@ -5178,7 +5177,6 @@ | |||
?3 \\ bakslaS | |||
?3 / slaS | |||
' | |||
£ paUnd | |||
! _:Ekskl@meIS@n_: | |||
!) ! | |||
? (? kwEstS@nmA@ks | |||
@@ -5227,22 +5225,6 @@ | |||
%) % (% | |||
%%) % (_ _:: | |||
// extra symbols | |||
¥ jEn | |||
§ sEkS@n | |||
// extra symbols (mostly in en_list) | |||
¶ par@graf | |||
¶¶ par@grafs | |||
¤ kVr@nsI2saIn | |||
© k0pI2raIt | |||
° dI2gri:z | |||
− maIn@s | |||
± plVs@maIn@s | |||
µ maIkroU | |||
¼ a2kwO@t3 | |||
½ a2hA:f | |||
¾ Tri:kwO@t3 | |||
× taImz | |||
÷ dI2vaIdbaI | |||
€ jU@roUz | |||
♯ SA@p | |||
♭ flat |
@@ -2,8 +2,54 @@ | |||
// This file in UTF8 encoded | |||
// letters | |||
ch tSe | |||
ll Ejje | |||
_cap m'aJ^us | |||
_?? s'imbolo | |||
_#32 Esp'aTjo | |||
// names of symbols | |||
_. punto | |||
_, koma | |||
_; 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 | |||
_= iQw'al | |||
_< mEn'oRke | |||
_> maJ^'oRke | |||
_' apost@-*'ofo | |||
_" kom'iJ^as | |||
_+ s'iQnodesum'aR | |||
_$ dolar | |||
_# almoaD'il^a | |||
_* astE*'isko | |||
_- gJ^on | |||
__ suB@-*aJ^'aDo | |||
_/ ba*Ra | |||
_\ b'a*RaimbERt'iDa | |||
_` aT'Entog@-*'aBe | |||
_( ,aB@-*epa**'EntEsis | |||
_) Tj,E*Rapa**'EntEsis | |||
_[ ,aB@-*ekoRtS'Ete | |||
_] Tj,E*RakoRtS'Ete | |||
_{ ,aB@-*eJ^'aBe | |||
_} Tj,E*RaJ^'aBe | |||
_« kom'iJ^as||iTkJ^'ERDas | |||
_» kom'iJ^as||dE**'EtSas | |||
^ TiRkumfl'Exo | |||
€ eU*o | |||
% porTj'Ento | |||
& ampERs'ant | |||
@ a*R'oBa | |||
/ ba*Ra | |||
© kopi*R'aIt | |||
£ liB@-*as | |||
¶ p'a*Rafo | |||
§ sEkTj'on | |||
// numbers | |||
@@ -291,8 +337,16 @@ v uve | |||
x Ekis | |||
_y ,ig@-*'iEQa | |||
y ,ig@-*'iEQa $atend | |||
ch tSe | |||
ll Ejje | |||
á 'a||aTEntw'aDa | |||
é 'e||aTEntw'aDa | |||
í 'i||aTEntw'aDa | |||
_ó 'o||aTEntw'aDa | |||
ó 'o||aTEntw'aDa $atend | |||
ú 'u||aTEntw'aDa | |||
ü ,uDjE**'Esis | |||
_. punto | |||
@@ -201,12 +201,6 @@ | |||
_)ñ (_ En^e | |||
$ d'olar | |||
€ eU*o | |||
% porTj'Ento | |||
& ampErs'ant | |||
@ a*R'oBa | |||
/ b'a*Ra | |||
© k,opi*R'aIt | |||
+ m'as | |||
_) ++ (_ masm'as |
@@ -63,9 +63,11 @@ _y i:gR'Ek | |||
// character names | |||
//_cap k,ap@-t@L | |||
_?A lEt@ | |||
_?? sE~b'OL | |||
//_cap k,ap@-t@L | |||
_?A lEt@ | |||
_?? sE~b'OL | |||
_#9 tabylasjO~ | |||
_#32 Espas | |||
_" gijmE | |||
_# djEz |
@@ -3,7 +3,7 @@ | |||
// 2006-11-18 Gilles Casse <[email protected]> | |||
// | |||
// Updated: 2008-01-29 Michel Such <[email protected]> | |||
// Updated: 2008-02-04 Michel Such <[email protected]> | |||
// | |||
// * The rules are based on Cicero TTS. | |||
// | |||
@@ -136,10 +136,9 @@ | |||
em (b A~ // décembre | |||
em (m A~ // emmancher | |||
em (p A~ | |||
en (_ A~ // en | |||
en (_ A~n2 // en | |||
en (hA A~n // enharmonique | |||
en (A A~n // enivrer | |||
en (_A A~n // en avion | |||
C) en (d_ A~ // comprend dépend | |||
C) en (ds_ A~ | |||
@@ -395,6 +394,7 @@ | |||
_) h (ac _! // hache | |||
_) h (ai _! // haine haillon | |||
_) h (al _! // halte | |||
_) h (amea _! // hameau | |||
_) h (amp _! // hampe | |||
_) h (an _! // hanche | |||
_) h (app _! // happer | |||
@@ -406,6 +406,7 @@ _) h (arp _! // harpe | |||
_) h (au _! // haut | |||
_) h (av _! // havre | |||
_) h (ern _! // hernie | |||
_) h (éro _! // héros, héron | |||
_) h (ers _! // herse | |||
_) h (eurt _! // heurter | |||
_) h (ibo _! // hibou | |||
@@ -655,6 +656,7 @@ mou) rr RR // mourrai | |||
A) s (oft s // microsoft | |||
y) s (A z // paysage | |||
CCan) s (A z // transition | |||
xpan) s (A s // expansion | |||
ibu) s (_ s | |||
@@ -758,8 +760,9 @@ C) te (_ t@- // patte | |||
um (b W~ // humble | |||
um (p W~ | |||
un (C W~ // emprunt lundi | |||
un (_ W~ // brun | |||
un (_A W~n // un avion | |||
C) un (_ W~ // brun | |||
uc) un (_ W~n2 // aucun | |||
un (_ W~n2 // un avion | |||
g) u (A // fatigue | |||
g) u (ï y // ambiguïté | |||
@@ -864,3 +867,4 @@ C) te (_ t@- // patte | |||
@@ -23,7 +23,7 @@ m e:m | |||
n En | |||
p pe: | |||
q ku-: | |||
r Err | |||
r E:R | |||
s Es | |||
t te: | |||
v ve: |
@@ -0,0 +1,71 @@ | |||
// This file is UTF8 encoded | |||
// Spelling-to-phoneme words for Turkish | |||
a a | |||
b be | |||
c dZE | |||
ç tSE | |||
d dE | |||
e E | |||
f fE | |||
g g;E | |||
ğ jumuS'ak||g;'E | |||
h hE | |||
ı u# | |||
i i | |||
j ZE | |||
k ka | |||
l lE | |||
m mE | |||
n nE | |||
o O | |||
ö W | |||
p pE | |||
q kvE | |||
r RE | |||
s sE | |||
ş SE | |||
t tE | |||
u u | |||
ü y | |||
v vE | |||
w dubElv'E | |||
x Eks | |||
y jE | |||
z zE | |||
_?? sEmb'Ol | |||
_0 su#fu#r | |||
_1 bir | |||
_2 iki | |||
_3 YtS | |||
_4 dWrt | |||
_5 beS | |||
_6 altu# | |||
_7 jedi | |||
_8 sekiz | |||
_9 dokuz | |||
_10 on | |||
_1X on | |||
_2X jirmi | |||
_3X otuz | |||
_4X ku#rk | |||
_5X elli | |||
_6X altmu#S | |||
_7X jetmiS | |||
_8X seksEn | |||
_9X doksan | |||
_0C jyz | |||
_0M1 bIn | |||
_0M2 miljon | |||
_0M3 miljar | |||
_dpt _virg,Yl | |||
// exceptions | |||
ankara $1 | |||
@@ -0,0 +1,108 @@ | |||
// Turkish translation rules | |||
// This file is UTF-8 encoded | |||
.group a | |||
a a | |||
.group b | |||
b b | |||
.group c | |||
c dZ | |||
.group ç | |||
ç tS | |||
.group d | |||
d d | |||
.group e | |||
e e | |||
.group f | |||
f f | |||
.group g | |||
g g | |||
.group ğ | |||
ğ Q | |||
A) ğ : | |||
.group h | |||
h h | |||
.group i | |||
i i | |||
.group ı | |||
ı u# | |||
.group j | |||
j Z | |||
.group k | |||
k k | |||
.group l | |||
l l | |||
.group m | |||
m m | |||
@) ma (_S2 m%a | |||
@) me (_S2 m%e | |||
@) mı (_S2 m%u# | |||
.group n | |||
n n | |||
.group o | |||
o o | |||
.group ö | |||
ö W | |||
.group p | |||
p p | |||
.group q | |||
q k | |||
.group r | |||
r r | |||
.group s | |||
s s | |||
.group ş | |||
ş S | |||
.group t | |||
t t | |||
.group u | |||
u u | |||
.group ü | |||
ü y | |||
.group v | |||
v v | |||
.group w | |||
w v | |||
.group x | |||
x ks | |||
.group y | |||
y j | |||
.group z | |||
z z | |||
.group | |||
$ dolar |
@@ -144,8 +144,8 @@ In rhotic accents, such as General American, the phonemes <code>[3:], [A@], [e@] | |||
<tr><td><code>[aU]</code><td>m<b>ou</b>th | |||
<tr><td><code>[oU]</code><td>g<b>oa</b>t | |||
<tr><td><code>[aI@]</code> | |||
<tr><td><code>[aU@]</code> | |||
<tr><td><code>[aI@]</code><td>sc<b>ie</b>nce | |||
<tr><td><code>[aU@]</code><td>h<b>our</b> | |||
</tbody> | |||
</table> | |||
@@ -3,3 +3,4 @@ language no | |||
language nb | |||
gender male | |||
intonation 4 |
@@ -0,0 +1,4 @@ | |||
name turkish-test | |||
language tr | |||
gender male | |||
@@ -1,51 +1,52 @@ | |||
46 phoneme tables | |||
47 phoneme tables | |||
new total | |||
base 98 98 | |||
base2 24 117 | |||
en 54 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 130 | |||
cy 29 124 | |||
de 33 125 | |||
eo 13 110 | |||
jbo 4 111 | |||
fi 40 129 | |||
fr 42 122 | |||
fr_ca 11 122 | |||
hi 50 134 | |||
ta 15 136 | |||
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 7 117 | |||
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 62 146 | |||
sw 14 107 | |||
th 50 141 | |||
id 14 119 | |||
ja 7 103 | |||
base 99 99 | |||
base2 24 118 | |||
en 54 148 | |||
en_n 30 148 | |||
en_us 34 148 | |||
en_sc 39 150 | |||
en_rp 34 148 | |||
en_wm 30 148 | |||
en_wi 30 148 | |||
af 38 131 | |||
cy 29 125 | |||
de 33 126 | |||
eo 13 111 | |||
jbo 4 112 | |||
fi 40 130 | |||
fr 43 124 | |||
fr_ca 11 124 | |||
hi 50 135 | |||
ta 15 137 | |||
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 7 118 | |||
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 62 147 | |||
sw 14 108 | |||
th 50 142 | |||
id 14 120 | |||
tr 14 123 | |||
ja 7 104 | |||
Data file Used by | |||
b/b [b] base | |||
@@ -402,6 +403,7 @@ n/_n [n] base | |||
[n;] ro | |||
[n] zh | |||
n/n_ [n] base | |||
[n2] fr | |||
[n;] ro | |||
n/n@ [(@)] base | |||
n/n#_ [n#] is | |||
@@ -1260,6 +1262,7 @@ vowel/a_5 [a:] ta | |||
[a] la | |||
[a] sv | |||
[a] sw | |||
[a] tr | |||
vowel/aa [a] fi | |||
[A] fr_ca | |||
[A] no | |||
@@ -1367,6 +1370,7 @@ vowel/e_mid [E] en_rp | |||
[E] is | |||
[E] id | |||
[E2] id | |||
[E] tr | |||
[e] ja | |||
vowel/e_mid2 [E] af | |||
[E] de | |||
@@ -1378,6 +1382,7 @@ vowel/e_mid2 [E] af | |||
[e] ro | |||
[e] el | |||
[e] sw | |||
[e] tr | |||
vowel/@_fnt [@] en_wi | |||
[@2] en_wi | |||
[@2] hr | |||
@@ -1432,6 +1437,7 @@ vowel/i_6 [i:] en_us | |||
[i] ta | |||
[i] hr | |||
[i] id | |||
[i] tr | |||
vowel/i#_7 [i[] zh | |||
vowel/i_en [i:] en | |||
[i:] fr | |||
@@ -1460,6 +1466,7 @@ vowel/ii_3 [I] cy | |||
[I] hr | |||
[I] sv | |||
[I] no | |||
[I] tr | |||
vowel/ii_4 [I] en | |||
[I2] en | |||
[I] en_n | |||
@@ -1519,9 +1526,11 @@ vowel/oe [W] en | |||
[W] af | |||
[W] de | |||
vowel/oe_2 [W] no | |||
[W] tr | |||
vowel/oe_4 [W] sv | |||
vowel/o_mid [O] fr | |||
[o] hu | |||
[o] tr | |||
vowel/oo [O:] en_sc | |||
[O] en_wi | |||
[O:] en_wi | |||
@@ -1536,6 +1545,7 @@ vowel/oo [O:] en_sc | |||
[O] th | |||
[O:] th | |||
[O] id | |||
[O] tr | |||
[o] ja | |||
vowel/oo_1 [O:] en_n | |||
[O:] en_rp | |||
@@ -1593,10 +1603,12 @@ vowel/u [u:] en_wi | |||
[u] id | |||
vowel/u# [u-] en | |||
[u:] en_sc | |||
[Y] tr | |||
vowel/u_2 [u1] fi | |||
[u] sk | |||
[U] hr | |||
[u] ro | |||
[u] tr | |||
vowel/u#_2 [u-] ta | |||
[u-] sv | |||
vowel/u_3 [yU] ro | |||
@@ -1608,6 +1620,7 @@ vowel/u_6 [U] pt_pt | |||
[u] pt_pt | |||
vowel/u#_6 [u:] en_us | |||
vowel/u_7 [u] vi | |||
vowel/u#_7 [u#] tr | |||
vowel/u_bck [u] base2 | |||
[U] cy | |||
[u] fi | |||
@@ -1634,6 +1647,7 @@ vowel/uu [U] en | |||
vowel/uu_2 [U] base2 | |||
[U] de | |||
[U] ta | |||
[U] tr | |||
vowel/uu_3 [u] af | |||
vowel/uu_4 [U] fi | |||
[U] sv | |||
@@ -1685,6 +1699,7 @@ vowel/y_3 [y] af | |||
vowel/y#_3 [W] is | |||
vowel/y_4 [y:] no | |||
vowel/y_5 [y:] sv | |||
[y] tr | |||
vowel/yy [y"] fr_ca | |||
[y] no | |||
vowel/yy_3 [y] sv |
@@ -276,6 +276,6 @@ phoneme t# // reduced [t] as in "city" | |||
vowelout f1=2 f2=1700 -300 300 f3=-100 80 | |||
formants d/tap2+x/d%70 | |||
after @ d/x_tap | |||
lengthmod 2 | |||
lengthmod 5 | |||
endphoneme | |||
@@ -266,6 +266,17 @@ phoneme l | |||
endphoneme | |||
phoneme n2 | |||
beforenotvowel NULL | |||
vcd alv nasal | |||
vowelout f1=2 f2=1700 -300 250 f3=-100 80 rms=20 brk | |||
length 100 | |||
lengthmod 4 | |||
formants n/n_ | |||
before _ n/n_ | |||
endphoneme | |||
phoneme p | |||
vls blb stop | |||
vowelin f1=0 f2=1000 -50 -100 f3=-200 80 amp=11 |
@@ -177,7 +177,6 @@ endphoneme | |||
phoneme Yy | |||
vowel starttype (@) endtype (u) | |||
length 270 | |||
long | |||
formants vwl_no/y#y | |||
endphoneme | |||
@@ -0,0 +1,93 @@ | |||
phoneme i | |||
vowel starttype (i) endtype (i) | |||
beforenotvowel2 I | |||
length 150 | |||
formants vowel/i_6 | |||
endphoneme | |||
phoneme I | |||
vowel starttype (i) endtype (i) | |||
length 150 | |||
formants vowel/ii_3 | |||
endphoneme | |||
phoneme y | |||
vowel starttype (u) endtype (u) | |||
beforenotvowel2 Y | |||
length 155 | |||
formants vowel/y_5 | |||
endphoneme | |||
phoneme Y | |||
vowel starttype (u) endtype (u) | |||
length 155 | |||
formants vowel/u# | |||
endphoneme | |||
phoneme e | |||
vowel starttype (e) endtype (e) | |||
beforenotvowel2 E | |||
length 180 | |||
formants vowel/e_mid2 | |||
endphoneme | |||
phoneme E | |||
vowel starttype (e) endtype (e) | |||
length 180 | |||
formants vowel/e_mid | |||
endphoneme | |||
phoneme W | |||
vowel starttype (@) endtype (@) | |||
length 180 | |||
formants vowel/oe_2 | |||
endphoneme | |||
phoneme a | |||
vowel starttype (a) endtype (a) | |||
length 190 | |||
formants vowel/a_5 | |||
endphoneme | |||
phoneme u | |||
vowel starttype (u) endtype (u) | |||
beforenotvowel2 U | |||
length 150 | |||
formants vowel/u_2 | |||
endphoneme | |||
phoneme U | |||
vowel starttype (u) endtype (u) | |||
length 150 | |||
formants vowel/uu_2 | |||
endphoneme | |||
phoneme u# | |||
vowel starttype (@) endtype (@) | |||
length 150 | |||
formants vowel/u#_7 | |||
endphoneme | |||
phoneme o | |||
vowel starttype (o) endtype (o) | |||
beforenotvowel2 O | |||
length 190 | |||
formants vowel/o_mid | |||
endphoneme | |||
phoneme O | |||
vowel starttype (o) endtype (o) | |||
length 190 | |||
formants vowel/oo | |||
endphoneme | |||
@@ -31,6 +31,7 @@ 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 | |||
@@ -149,6 +150,13 @@ 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 _ | |||
@@ -1268,5 +1276,8 @@ include ph_thai | |||
phonemetable id base2 | |||
include ph_indonesian | |||
phonemetable tr base2 | |||
include ph_turkish | |||
phonemetable ja base | |||
include ph_japanese |
@@ -58,21 +58,26 @@ | |||
#define tOLDNAME 14 | |||
#define tREDUCETO 15 | |||
#define tFIXEDCODE 16 | |||
#define tBEFOREVOWEL 17 | |||
#define tBEFOREVOWELPAUSE 18 | |||
#define tBEFORENOTVOWEL 19 | |||
#define tLINKOUT 20 | |||
#define tBEFORENOTVOWEL2 20 | |||
#define tSWITCHVOICING 21 | |||
#define tVOWELIN 22 | |||
#define tVOWELOUT 23 | |||
#define tAPPENDPH 24 // always insert another phoneme (linkout) after this one | |||
#define tIMPORTPH 25 | |||
#define tBEFOREPAUSE 26 | |||
#define tLINKOUT 23 | |||
#define tVOWELIN 24 | |||
#define tVOWELOUT 25 | |||
#define tAPPENDPH 26 // always insert another phoneme (linkout) after this one | |||
#define tIMPORTPH 27 | |||
#define tBEFOREPAUSE 28 | |||
#define tPHONEMENUMBER 29 | |||
#define tPHONEMETABLE 30 | |||
#define tINCLUDE 31 | |||
static const int flags_alternative[] = {phBEFOREVOWEL,phBEFOREVOWELPAUSE,phBEFORENOTVOWEL,phBEFORENOTVOWEL2,phSWITCHVOICING}; | |||
extern void Write4Bytes(FILE *f, int value); | |||
extern int Read4Bytes(FILE *f); | |||
extern void MakeVowelLists(void); | |||
@@ -230,16 +235,17 @@ static keywtab_t keywords[] = { | |||
{"length", 12}, | |||
{"longlength", 13}, | |||
{"reduceto", 15}, | |||
{"beforevowel", 17}, | |||
{"beforevowelpause", 18}, | |||
{"beforenotvowel",19}, | |||
{"linkout",20}, | |||
{"switchvoicing",21}, | |||
{"vowelin",22}, | |||
{"vowelout",23}, | |||
{"appendph",24}, | |||
{"import_phoneme",25}, | |||
{"beforepause",26}, | |||
{"beforevowel", tBEFOREVOWEL}, | |||
{"beforevowelpause", tBEFOREVOWELPAUSE}, | |||
{"beforenotvowel",tBEFORENOTVOWEL}, | |||
{"beforenotvowel2",tBEFORENOTVOWEL2}, | |||
{"linkout",tLINKOUT}, | |||
{"switchvoicing",tSWITCHVOICING}, | |||
{"vowelin",tVOWELIN}, | |||
{"vowelout",tVOWELOUT}, | |||
{"appendph",tAPPENDPH}, | |||
{"import_phoneme",tIMPORTPH}, | |||
{"beforepause",tBEFOREPAUSE}, | |||
// flags | |||
{"wavef", 0x2000000+phWAVE}, | |||
@@ -1374,18 +1380,12 @@ int Compile::CPhoneme() | |||
ph->phflags = (ph->phflags & 0xfffffff) + (value << 28); | |||
break; | |||
case tBEFORENOTVOWEL: | |||
ph->phflags |= phBEFORENOTVOWEL; // and drop through to tBEFOREVOWEL | |||
case tBEFOREVOWELPAUSE: | |||
ph->phflags |= phBEFOREVOWELPAUSE; | |||
case tBEFOREVOWEL: | |||
if((phcode = NextItem(tPHONEMEMNEM)) == -1) | |||
phcode = LookupPhoneme(item_string,1); | |||
ph->alternative_ph = phcode; | |||
break; | |||
case tBEFOREVOWELPAUSE: | |||
case tBEFORENOTVOWEL: | |||
case tBEFORENOTVOWEL2: | |||
case tSWITCHVOICING: | |||
ph->phflags |= phSWITCHVOICING; | |||
ph->phflags |= flags_alternative[item - tBEFOREVOWEL]; | |||
if((phcode = NextItem(tPHONEMEMNEM)) == -1) | |||
phcode = LookupPhoneme(item_string,1); | |||
ph->alternative_ph = phcode; |
@@ -1197,6 +1197,23 @@ void Translator::SetWordStress(char *output, unsigned int dictionary_flags, int | |||
} | |||
break; | |||
case 7: // LANG=tr, the last syllable for any vowel markes explicitly as unstressed | |||
if(stressed_syllable == 0) | |||
{ | |||
stressed_syllable = vowel_count - 1; | |||
for(ix=2; ix < vowel_count; ix++) | |||
{ | |||
if(vowel_stress[ix] == 1) | |||
{ | |||
stressed_syllable = ix-1; | |||
break; | |||
} | |||
} | |||
vowel_stress[stressed_syllable] = 4; | |||
max_stress = 4; | |||
} | |||
break; | |||
case 9: // mark all as stressed | |||
for(ix=1; ix<vowel_count; ix++) | |||
{ |
@@ -1160,7 +1160,7 @@ void Test2() | |||
const char* text1 = "Hello, World2 <mark name=\"mark2\"/>. This is the second sentence"; | |||
const char* text1 = "Hello world. Testing."; | |||
void TestTest(int control) | |||
{//======================= | |||
@@ -1200,10 +1200,10 @@ if(control==2) | |||
f_wavtest = OpenWaveFile3("/home/jsd1/speechdata/text/test.wav"); | |||
f_events = fopen("/home/jsd1/speechdata/text/events","w"); | |||
fprintf(f_events,"Type Audio Text Length Id\n"); | |||
fprintf(f_events,"Type Audio Text Length Id\n"); | |||
fclose(f_events); | |||
espeak_Initialize(AUDIO_OUTPUT_PLAYBACK,1000,NULL,0); | |||
espeak_Initialize(AUDIO_OUTPUT_RETRIEVAL,1000,NULL,1); | |||
espeak_SetSynthCallback(TestSynthCallback); | |||
espeak_SetUriCallback(TestUriCallback); | |||
@@ -31,6 +31,7 @@ | |||
#include "speech.h" | |||
#include "phoneme.h" | |||
#include "synthesize.h" | |||
#include "voice.h" | |||
#include "translate.h" | |||
@@ -44,6 +45,15 @@ void Translator::LookupLetter(int letter, int next_byte, char *ph_buf1) | |||
char ph_stress[2]; | |||
char ph_buf3[30]; | |||
if((letter <= 32) || iswspace(letter)) | |||
{ | |||
// lookup space as _&32 etc. | |||
sprintf(&single_letter[1],"_#%d ",letter); | |||
Lookup(&single_letter[1],ph_buf1); | |||
return; | |||
} | |||
len = utf8_out(letter,&single_letter[2]); | |||
single_letter[len+2] = ' '; | |||
@@ -89,11 +99,13 @@ int Translator::TranslateLetter(char *word, char *phonemes, int control) | |||
int n_bytes; | |||
int letter; | |||
int len; | |||
int phoneme_tab_en; | |||
char *p2; | |||
char *pbuf; | |||
char capital[20]; | |||
char ph_buf[50]; | |||
char ph_buf2[50]; | |||
char ph_buf[60]; | |||
char ph_buf2[60]; | |||
char ph_buf_en[60]; | |||
char hexbuf[6]; | |||
static char single_letter[10] = {0,0}; | |||
@@ -117,15 +129,6 @@ int Translator::TranslateLetter(char *word, char *phonemes, int control) | |||
} | |||
letter = towlower(letter); | |||
if((letter <= 32) || iswspace(letter)) | |||
{ | |||
// lookup space as _&32 etc. | |||
sprintf(&single_letter[1],"_#%d ",letter); | |||
Lookup(&single_letter[1],ph_buf); | |||
strcat(phonemes,ph_buf); | |||
return(n_bytes); | |||
} | |||
LookupLetter(letter, word[n_bytes], ph_buf); | |||
if(ph_buf[0] == phonSWITCH) | |||
@@ -133,6 +136,18 @@ int Translator::TranslateLetter(char *word, char *phonemes, int control) | |||
strcpy(phonemes,ph_buf); | |||
return(0); | |||
} | |||
if(ph_buf[0] == 0) | |||
{ | |||
phoneme_tab_en = SetTranslator2("en"); | |||
translator2->LookupLetter(letter, word[n_bytes], ph_buf_en); | |||
if(ph_buf_en[0] != 0) | |||
{ | |||
sprintf(ph_buf,"%c%c%s%c%c",phonSWITCH2, phoneme_tab_en + phonTOP, ph_buf_en, phonSWITCH2, voice->phoneme_tab_ix + phonTOP); | |||
} | |||
SelectPhonemeTable(voice->phoneme_tab_ix); // revert to original phoneme table | |||
} | |||
if(ph_buf[0] == 0) | |||
{ | |||
// character name not found | |||
@@ -166,8 +181,8 @@ int Translator::TranslateLetter(char *word, char *phonemes, int control) | |||
void Translator::SetSpellingStress(char *phonemes, int control) | |||
{//============================================================ | |||
void Translator::SetSpellingStress(char *phonemes, int control, int n_chars) | |||
{//========================================================================= | |||
// Individual letter names, reduce the stress of some. | |||
int ix; | |||
unsigned int c; | |||
@@ -188,7 +203,7 @@ void Translator::SetSpellingStress(char *phonemes, int control) | |||
count = 0; | |||
for(ix=0; (c = buf[ix]) != 0; ix++) | |||
{ | |||
if(c == phonSTRESS_P) | |||
if((c == phonSTRESS_P) && (n_chars > 1)) | |||
{ | |||
count++; | |||
@@ -45,18 +45,19 @@ | |||
#define phTRILL 0x80 | |||
#define phVOWEL2 0x100 // liquid that is considered a vowel | |||
#define phPALATAL 0x200 | |||
#define phLONG 0x1000 | |||
#define phAPPENDPH 0x2000 // always insert another phoneme (link_out) after this one | |||
#define phBRKAFTER 0x4000 // [*] add a post-pause | |||
#define phBEFOREPAUSE 0x8000 // replace with the link_out phoneme if the next phoneme is a pause | |||
#define phALTERNATIVE 0x0c00 // bits 10,11 specifying use of alternative_ph | |||
#define phALTERNATIVE 0x1c00 // bits 10,11,12 specifying use of alternative_ph | |||
#define phBEFOREVOWEL 0x0000 | |||
#define phBEFOREVOWELPAUSE 0x0400 | |||
#define phBEFORENOTVOWEL 0x0c00 | |||
#define phBEFORENOTVOWEL2 0x1000 | |||
#define phSWITCHVOICING 0x0800 | |||
#define phNONSYLLABIC 0x100000 // don't count this vowel as a syllable when finding the stress position | |||
#define phLONG 0x200000 | |||
// fixed phoneme code numbers, these can be used from the program code | |||
#define phonCONTROL 1 | |||
@@ -86,6 +87,8 @@ | |||
#define phonT_REDUCED 25 | |||
#define phonSTRESS_TONIC 26 | |||
#define phonPAUSE_CLAUSE 27 | |||
#define phonSWITCH2 28 | |||
#define phonTOP 28 // highest pre-defined phoneme number | |||
extern const unsigned char pause_phonemes[8]; // 0, vshort, short, pause, long, glottalstop | |||
@@ -395,6 +395,14 @@ void Translator::MakePhonemeList(int post_pause, int start_sentence) | |||
alternative = ph->alternative_ph; | |||
break; | |||
case phBEFORENOTVOWEL2: // LANG=tr | |||
if(((plist2+1)->sourceix != 0) || | |||
((next->type != phVOWEL) && ((phoneme_tab[(plist2+2)->phcode]->type != phVOWEL) || ((plist2+2)->sourceix != 0)))) | |||
{ | |||
alternative = ph->alternative_ph; | |||
} | |||
break; | |||
case phBEFOREVOWELPAUSE: | |||
if((next->type == phVOWEL) || (next->type == phPAUSE)) | |||
alternative = ph->alternative_ph; |
@@ -41,6 +41,7 @@ | |||
#endif | |||
#ifdef _ESPEAKEDIT | |||
#define USE_PORTAUDIO | |||
#define USE_ASYNC | |||
#define LOG_FRAMES // write keyframe info to log-espeakedit | |||
#endif |
@@ -35,8 +35,8 @@ | |||
#include "translate.h" | |||
#include "wave.h" | |||
const char *version_string = "1.31.04 30.Jan.08"; | |||
const int version_phdata = 0x013100; | |||
const char *version_string = "1.31.05 04.Feb.08"; | |||
const int version_phdata = 0x013105; | |||
int option_device_number = -1; | |||
@@ -669,15 +669,15 @@ SetLengthMods(tr,3); // all equal | |||
case L('t','r'): // Turkish | |||
{ | |||
static const unsigned char stress_amps_tr[8] = {16,16, 20,20, 20,24, 24,22 }; | |||
static const short stress_lengths_tr[8] = {180,150, 200,180, 0,0, 230,270}; | |||
static const short stress_lengths_tr[8] = {170,170, 190,170, 0,0, 250,270}; | |||
tr = new Translator(); | |||
SetupTranslator(tr,stress_lengths_tr,stress_amps_tr); | |||
tr->charset_a0 = charsets[9]; // ISO-8859-9 - Latin5 | |||
tr->langopts.stress_rule = 3; // stress on the last syllable | |||
tr->langopts.stress_rule = 7; // stress on the last syllable, before any explicitly unstressed syllable | |||
tr->langopts.numbers = 0x1009; | |||
tr->langopts.numbers = 0x1d09; | |||
tr->langopts.max_initial_consonants = 2; | |||
} | |||
break; |
@@ -38,7 +38,7 @@ | |||
Translator *translator = NULL; // the main translator | |||
static Translator *translator2 = NULL; // secondary translator for certain words | |||
Translator *translator2 = NULL; // secondary translator for certain words | |||
static char translator2_language[20] = {0}; | |||
FILE *f_trans = NULL; // phoneme output text | |||
@@ -750,6 +750,7 @@ if((wmark > 0) && (wmark < 8)) | |||
while(*wordx != ' ') | |||
{ | |||
wordx += TranslateLetter(wordx, phonemes,spell_word); | |||
posn++; | |||
if(phonemes[0] == phonSWITCH) | |||
{ | |||
// change to another language in order to translate this word | |||
@@ -757,7 +758,7 @@ if((wmark > 0) && (wmark < 8)) | |||
return(0); | |||
} | |||
} | |||
SetSpellingStress(phonemes,spell_word); | |||
SetSpellingStress(phonemes,spell_word,posn); | |||
} | |||
else | |||
if(found == 0) | |||
@@ -776,6 +777,7 @@ if((wmark > 0) && (wmark < 8)) | |||
// find a remainder that we can pronounce. | |||
emphasize_allcaps = 0; | |||
wordx += TranslateLetter(wordx,phonemes,0); | |||
posn++; | |||
if(phonemes[0] == phonSWITCH) | |||
{ | |||
// change to another language in order to translate this word | |||
@@ -798,7 +800,7 @@ if((wmark > 0) && (wmark < 8)) | |||
if(length > 0) | |||
wordx[-1] = ' '; // prevent this affecting the pronunciation of the pronuncable part | |||
} | |||
SetSpellingStress(phonemes,0); | |||
SetSpellingStress(phonemes,0,posn); | |||
// anything left ? | |||
if(*wordx != ' ') | |||
@@ -1164,6 +1166,39 @@ static int CountSyllables(unsigned char *phonemes) | |||
return(count); | |||
} | |||
int SetTranslator2(const char *new_language) | |||
{//========================================= | |||
// Set translator2 to a second language | |||
int new_phoneme_tab; | |||
if((new_phoneme_tab = SelectPhonemeTableName(new_language)) >= 0) | |||
{ | |||
if((translator2 != NULL) && (strcmp(new_language,translator2_language) != 0)) | |||
{ | |||
// we already have an alternative translator, but not for the required language, delete it | |||
delete translator2; | |||
translator2 = NULL; | |||
} | |||
if(translator2 == NULL) | |||
{ | |||
translator2 = SelectTranslator(new_language); | |||
strcpy(translator2_language,new_language); | |||
if(translator2->LoadDictionary(new_language,0) != 0) | |||
{ | |||
SelectPhonemeTable(voice->phoneme_tab_ix); // revert to original phoneme table | |||
new_phoneme_tab = -1; | |||
translator2_language[0] = 0; | |||
} | |||
} | |||
} | |||
return(new_phoneme_tab); | |||
} // end of SetTranslator2 | |||
int Translator::TranslateWord2(char *word, WORD_TAB *wtab, int pre_pause, int next_pause) | |||
{//====================================================================================== | |||
int flags=0; | |||
@@ -1199,27 +1234,31 @@ int Translator::TranslateWord2(char *word, WORD_TAB *wtab, int pre_pause, int ne | |||
if(word_flags & FLAG_EMBEDDED) | |||
{ | |||
embedded_flag = SFLAG_EMBEDDED; | |||
value = embedded_list[embedded_read] >> 8; | |||
switch(embedded_cmd = embedded_list[embedded_read] & 0x1f) | |||
do | |||
{ | |||
case EMBED_Y: | |||
option_sayas = value; | |||
break; | |||
case EMBED_F: | |||
option_emphasis = value; | |||
break; | |||
embedded_cmd = embedded_list[embedded_read++]; | |||
value = embedded_cmd >> 8; | |||
case EMBED_B: | |||
// break command | |||
if(value == 0) | |||
pre_pause = 0; // break=none | |||
else | |||
pre_pause += value; | |||
break; | |||
} | |||
while((embedded_list[embedded_read++] & 0x80) == 0); // read over the embedded commands for this word | |||
switch(embedded_cmd & 0x1f) | |||
{ | |||
case EMBED_Y: | |||
option_sayas = value; | |||
break; | |||
case EMBED_F: | |||
option_emphasis = value; | |||
break; | |||
case EMBED_B: | |||
// break command | |||
if(value == 0) | |||
pre_pause = 0; // break=none | |||
else | |||
pre_pause += value; | |||
break; | |||
} | |||
} while((embedded_cmd & 0x80) == 0); | |||
} | |||
if(word[0] == 0) | |||
@@ -1328,28 +1367,9 @@ int Translator::TranslateWord2(char *word, WORD_TAB *wtab, int pre_pause, int ne | |||
new_language = (char *)(&p[1]); | |||
if(new_language[0]==0) | |||
new_language = "en"; | |||
if((switch_phonemes = SelectPhonemeTableName(new_language)) >= 0) | |||
{ | |||
if((translator2 != NULL) && (strcmp(new_language,translator2_language) != 0)) | |||
{ | |||
// we already have an alternative translator, but not for the required language, delete it | |||
delete translator2; | |||
translator2 = NULL; | |||
} | |||
if(translator2 == NULL) | |||
{ | |||
translator2 = SelectTranslator(new_language); | |||
strcpy(translator2_language,new_language); | |||
switch_phonemes = SetTranslator2(new_language); | |||
if(translator2->LoadDictionary(new_language,0) != 0) | |||
{ | |||
SelectPhonemeTable(voice->phoneme_tab_ix); // revert to original phoneme table | |||
switch_phonemes = -1; | |||
translator2_language[0] = 0; | |||
} | |||
} | |||
} | |||
if(switch_phonemes >= 0) | |||
{ | |||
// re-translate the word using the new translator | |||
@@ -1488,6 +1508,12 @@ int Translator::TranslateWord2(char *word, WORD_TAB *wtab, int pre_pause, int ne | |||
srcix = source_ix+1; | |||
} | |||
else | |||
if(ph_code == phonSWITCH2) | |||
{ | |||
SetPlist2(&ph_list2[n_ph_list2],phonSWITCH); | |||
ph_list2[n_ph_list2++].tone_number = *p++ - phonTOP; // phoneme table number (phonTOP is added to avoid confusion with special phoneme numbers) | |||
} | |||
else | |||
if(ph_code == phonX1) | |||
{ | |||
// a language specific action |
@@ -416,7 +416,7 @@ public: | |||
private: | |||
int TranslateWord2(char *word, WORD_TAB *wtab, int pre_pause, int next_pause); | |||
int TranslateLetter(char *letter, char *phonemes, int control); | |||
void SetSpellingStress(char *phonemes, int control); | |||
void SetSpellingStress(char *phonemes, int control, int n_chars); | |||
void WriteMnemonic(int *ix, int mnem); | |||
void MakePhonemeList(int post_pause, int new_sentence); | |||
int SubstitutePhonemes(PHONEME_LIST2 *plist_out); | |||
@@ -541,6 +541,7 @@ extern unsigned char punctuation_to_tone[INTONATION_TYPES][PUNCT_INTONATIONS]; | |||
extern int speech_parameters[]; | |||
extern Translator *translator; | |||
extern Translator *translator2; | |||
extern const unsigned short *charsets[N_CHARSETS]; | |||
extern char dictionary_name[40]; | |||
extern char ctrl_embedded; // to allow an alternative CTRL for embedded commands | |||
@@ -554,6 +555,7 @@ extern int (* phoneme_callback)(const char *); | |||
extern void SetLengthMods(Translator *tr, int value); | |||
Translator *SelectTranslator(const char *name); | |||
int SetTranslator2(const char *name); | |||
int CompileDictionary(const char *dsource, const char *dict_name, FILE *log, char *err_name,int flags); | |||
void LoadConfig(void); | |||
int PhonemeCode(unsigned int mnem); |