espeakedit: Prosody window now shows the FMT() or WAV() filename and the standard length of the selected phoneme. Added the ability to produce speech at different sample rates. To use rates other than the default 22050Hz, the phoneme data must be recompiled. This needs the "sox" program to be available. (sox.sourceforge.net). espeakedit: Added menu option to compile the phoneme data at a specified sample rate (rather than the default 22050Hz). phondata: Includes the value of the sample rate at which the data was compiled. Language changes: pt. git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@302 d46cf337-b52f-0410-862d-fd96e6ae7743master
ts v x z | ts v x z | ||||
Dictionary en_dict 2013-02-13 | |||||
Dictionary en_dict 2013-02-20 | |||||
0 0# 3 3: @ @- @2 @5 | 0 0# 3 3: @ @- @2 @5 | ||||
@L a a# A: A@ aa aI aI3 | @L a a# A: A@ aa aI aI3 | ||||
ts; v w x z Z Z; | ts; v w x z Z Z; | ||||
Dictionary pt_dict 2013-02-14 | |||||
Dictionary pt_dict 2013-02-19 | |||||
& &/ &U~ &~ @ @- a A | & &/ &U~ &~ @ @- a A | ||||
aI aU e E eI EI eU EU | aI aU e E eI EI eU EU | ||||
v w z Z | v w z Z | ||||
Dictionary vi_dict 2013-02-10 | |||||
Dictionary vi_dict 2013-02-16 | |||||
@ @: @:I @:U @I @U a a: | @ @: @:I @:U @I @U a a: | ||||
a:I a:U aI aU e E eU EU | a:I a:U aI aU e E eU EU | ||||
i i@ iU o O o# O# o& | |||||
o@ OI oI u u@ uI y y@ | |||||
yI | |||||
i i@ iE iU o O o# O# | |||||
o& o@ OI oI u u@ uI y | |||||
y@ yI | |||||
b c cr d D f g h | b c cr d D f g h | ||||
j J J^ k kh l m n | j J J^ k kh l m n |
conches k0ntSI#z | conches k0ntSI#z | ||||
concierge k0nsI'e@Z | concierge k0nsI'e@Z | ||||
concise k0#ns'aIs | concise k0#ns'aIs | ||||
conclave $1 | |||||
conduct $1 | conduct $1 | ||||
conduct $verb | conduct $verb | ||||
cone koUn | cone koUn | ||||
deliberate dI2lIb@r@t | deliberate dI2lIb@r@t | ||||
delicate dElI2k@t | delicate dElI2k@t | ||||
delimit dI2lImIt // delimited | delimit dI2lImIt // delimited | ||||
delivery $alt2 | |||||
demolish dI2m0lIS | demolish dI2m0lIS | ||||
demon di:m@n | demon di:m@n | ||||
demoness di:m@nEs | demoness di:m@nEs |
di (ox d%aI | di (ox d%aI | ||||
_) di (s@ dI2 | _) di (s@ dI2 | ||||
_) di (sa@ ,dI | _) di (sa@ ,dI | ||||
_) di (sarm dI2 | |||||
_) disa (p ,dIs@ | _) disa (p ,dIs@ | ||||
di (sast dI2 | di (sast dI2 | ||||
di (sbe@ ,dI | di (sbe@ ,dI | ||||
er (ve 3: | er (ve 3: | ||||
s) er (van 3: | s) er (van 3: | ||||
ery (_ @r%i | ery (_ @r%i | ||||
?3 ery (_++$w_alt2 @rI | |||||
?3 @@AC) ery (_ e@ri | ?3 @@AC) ery (_ e@ri | ||||
ery (A 3j | ery (A 3j | ||||
_v) ery ErI2 | _v) ery ErI2 | ||||
gue (_ g | gue (_ g | ||||
gu (e g | gu (e g | ||||
_) gu (i g | _) gu (i g | ||||
_) gui (dA gaI | |||||
guide (@ gaId | |||||
_) g (yn g | _) g (yn g | ||||
o) g (y_ g | o) g (y_ g | ||||
g (ynous_ =dZ | g (ynous_ =dZ | ||||
inter (est Intr | inter (est Intr | ||||
interfer Int@f'i@3 | interfer Int@f'i@3 | ||||
_) int (erio+ %Int | _) int (erio+ %Int | ||||
_) inter (n_ %Int3: | |||||
_) inter (nK %Int3: | |||||
_) inter (nal %Int3: | _) inter (nal %Int3: | ||||
_) inter (pr %Int3: | _) inter (pr %Int3: | ||||
_) inter (pol@ %Int3: | _) inter (pol@ %Int3: | ||||
pull) ov oUv | pull) ov oUv | ||||
m) ov (A u:v | m) ov (A u:v | ||||
n) ov (el 0v | n) ov (el 0v | ||||
p) over (@ 0v@ | |||||
p) over (@ 0v3 | |||||
pr) ov (e# u:v | pr) ov (e# u:v | ||||
gr) ov (el 0v | gr) ov (el 0v | ||||
tr) ov (er 0v | tr) ov (er 0v | ||||
_) re (i@P2 r,i: | _) re (i@P2 r,i: | ||||
_) rei (c raI | _) rei (c raI | ||||
_) rei (l raI | _) rei (l raI | ||||
_) rei (s raI | |||||
_) re (iss r%i: | |||||
_) rele (g rElI2 | _) rele (g rElI2 | ||||
rele (nt rI2lE | rele (nt rI2lE | ||||
rele (v rElI# | rele (v rElI# | ||||
1_) st (_ | 1_) st (_ | ||||
_) st (_ s@nt | _) st (_ s@nt | ||||
stein staIn | stein staIn | ||||
ti) ssue Su: | |||||
_) s (u s | _) s (u s | ||||
ss (ue S | |||||
ssue Su: | |||||
ssur S3 | ssur S3 | ||||
a) ssur SU@ | a) ssur SU@ | ||||
a) ssure S'U@ | a) ssure S'U@ |
replace 03 I i | replace 03 I i | ||||
replace 03 I2 i | replace 03 I2 i | ||||
replace 03 @ @/ | |||||
base2 26 125 | base2 26 125 | ||||
en 54 156 | en 54 156 | ||||
en-n 33 156 | en-n 33 156 | ||||
en-us 40 157 | |||||
en-us 39 156 | |||||
en-sc 41 158 | en-sc 41 158 | ||||
en-rp 34 156 | en-rp 34 156 | ||||
en-wm 31 156 | en-wm 31 156 | ||||
es-la 1 125 | es-la 1 125 | ||||
ca 11 127 | ca 11 127 | ||||
an 4 125 | an 4 125 | ||||
pt 30 141 | |||||
pt-pt 20 141 | |||||
pt 29 140 | |||||
pt-pt 20 140 | |||||
ro 36 148 | ro 36 148 | ||||
el 10 125 | el 10 125 | ||||
grc 12 129 | grc 12 129 | ||||
sv 22 129 | sv 22 129 | ||||
no 28 134 | no 28 134 | ||||
is 42 141 | is 42 141 | ||||
vi 52 146 | |||||
vi 53 147 | |||||
zhy 41 138 | zhy 41 138 | ||||
zh 64 155 | zh 64 155 | ||||
sw 9 110 | sw 9 110 | ||||
[l/] fr | [l/] fr | ||||
l/l_@ [l/3] base | l/l_@ [l/3] base | ||||
[l/] fr | [l/] fr | ||||
l/l@ [hFp] base | |||||
l/l@ [L¸j] base | |||||
[l#] base | [l#] base | ||||
[l] fr | [l] fr | ||||
[l/2] fr | [l/2] fr | ||||
l/L2_uL [l/2] base | l/L2_uL [l/2] base | ||||
l/l_3 [l/] de | l/l_3 [l/] de | ||||
l/l_4 [ll] sq | l/l_4 [ll] sq | ||||
l/la [hFp] base | |||||
l/la [L¸j] base | |||||
[l#] base | [l#] base | ||||
[l] fr | [l] fr | ||||
[l/2] fr | [l/2] fr | ||||
[K] tn | [K] tn | ||||
l/l_a [l/3] base | l/l_a [l/3] base | ||||
[l/] fr | [l/] fr | ||||
l/le [hFp] base | |||||
l/le [L¸j] base | |||||
[l#] base | [l#] base | ||||
[l] fr | [l] fr | ||||
[l/2] fr | [l/2] fr | ||||
[&:] af | [&:] af | ||||
l/l_front [L] sq | l/l_front [L] sq | ||||
l/l_front_ [l/4] sq | l/l_front_ [l/4] sq | ||||
l/li [hFp] base | |||||
l/li [L¸j] base | |||||
[l#] base | [l#] base | ||||
[l] fr | [l] fr | ||||
[l/2] fr | [l/2] fr | ||||
ll/_ll [L] base | ll/_ll [L] base | ||||
l/l_long [l] base | l/l_long [l] base | ||||
[l] fr | [l] fr | ||||
l/lo [hFp] base | |||||
l/lo [L¸j] base | |||||
[l#] base | [l#] base | ||||
[l/2] fr | [l/2] fr | ||||
[K] nso | [K] nso | ||||
[l;] lt | [l;] lt | ||||
[l] ru | [l] ru | ||||
[l^] ru | [l^] ru | ||||
l/lu [hFp] base | |||||
l/lu [L¸j] base | |||||
[l#] base | [l#] base | ||||
[l] fr | [l] fr | ||||
[l/2] fr | [l/2] fr | ||||
[n] zh | [n] zh | ||||
n/n_ [n] base | n/n_ [n] base | ||||
n/n@ [n] base | n/n@ [n] base | ||||
[n.] base | |||||
[n] fr | [n] fr | ||||
[n#] is | [n#] is | ||||
[n] zh | [n] zh | ||||
[n;] lt | [n;] lt | ||||
[n#] ru | [n#] ru | ||||
n/na [n] base | n/na [n] base | ||||
[n.] base | |||||
[n] fr | [n] fr | ||||
[n#] is | [n#] is | ||||
[n] zh | [n] zh | ||||
[n;] lt | [n;] lt | ||||
[n#] ru | [n#] ru | ||||
n/ne [n] base | n/ne [n] base | ||||
[n.] base | |||||
[n] fr | [n] fr | ||||
[n#] is | [n#] is | ||||
[n] zh | [n] zh | ||||
[n;] lt | [n;] lt | ||||
[n#] ru | [n#] ru | ||||
n/ni [n] base | n/ni [n] base | ||||
[n.] base | |||||
[n] fr | [n] fr | ||||
[n#] is | [n#] is | ||||
[n] zh | [n] zh | ||||
[n;] lt | [n;] lt | ||||
[n#] ru | [n#] ru | ||||
n/no [n] base | n/no [n] base | ||||
[n.] base | |||||
[n] fr | [n] fr | ||||
[n#] is | [n#] is | ||||
[n] zh | [n] zh | ||||
n/_nr [n.] base | n/_nr [n.] base | ||||
n/nr_ [n.] base | n/nr_ [n.] base | ||||
n/nr@ [n.] base | |||||
n/nra [n.] base | |||||
n/nre [n.] base | |||||
n/nri [n.] base | |||||
n/nro [n.] base | |||||
n/nru [n.] base | |||||
n/n-syl [n-] base | n/n-syl [n-] base | ||||
n^/n^u [n^] base | n^/n^u [n^] base | ||||
[n;] lt | [n;] lt | ||||
[n#] ru | [n#] ru | ||||
n/nu [n] base | n/nu [n] base | ||||
[n.] base | |||||
[n] fr | [n] fr | ||||
[n#] is | [n#] is | ||||
[n] zh | [n] zh | ||||
vietnam/_c [kh] vi | vietnam/_c [kh] vi | ||||
vietnam/ch [c] vi | vietnam/ch [c] vi | ||||
vietnam/dd [d] vi | vietnam/dd [d] vi | ||||
vietnam/ie_2 [iE] vi | |||||
vietnam/oe [o&] vi | vietnam/oe [o&] vi | ||||
vietnam/th [t] vi | vietnam/th [t] vi | ||||
vietnam/tr [cr] vi | vietnam/tr [cr] vi | ||||
[e~] hi | [e~] hi | ||||
[e~] pt | [e~] pt | ||||
vnasal/ii_n [I~] hi | vnasal/ii_n [I~] hi | ||||
[i] vi | |||||
vnasal/i_n [i~] pt | vnasal/i_n [i~] pt | ||||
vnasal/i_n2 [i~] hi | vnasal/i_n2 [i~] hi | ||||
vnasal/oi_n [oI~] pt | vnasal/oi_n [oI~] pt | ||||
vnasal/V_n [V~] hi | vnasal/V_n [V~] hi | ||||
vnasal/W_n [E~] fr | vnasal/W_n [E~] fr | ||||
[W~] fr | [W~] fr | ||||
[&2~] pt | |||||
[&~] pt | |||||
[E~] ht | [E~] ht | ||||
voc/bh [B] base | voc/bh [B] base | ||||
voc/dh [D] base | voc/dh [D] base | ||||
[@] nl | [@] nl | ||||
[@] no | [@] no | ||||
vowel/@_6 [@] en | vowel/@_6 [@] en | ||||
[@] en-us | |||||
[W] fr | [W] fr | ||||
[W2] fr | [W2] fr | ||||
vowel/8 [o-] zh | vowel/8 [o-] zh | ||||
[@] pa | [@] pa | ||||
[V] pa | [V] pa | ||||
[@] si | [@] si | ||||
vowel/@_low2 [@/] en-us | |||||
[@2] en-us | |||||
vowel/@_low2 [@2] en-us | |||||
vowel/o [o] base2 | vowel/o [o] base2 | ||||
[o:] en | [o:] en | ||||
[oU] en-n | [oU] en-n | ||||
vwl_en_us/or [o@] en-us | vwl_en_us/or [o@] en-us | ||||
[O:] en-sc | [O:] en-sc | ||||
vwl_en_us/ur [U@] en-us | vwl_en_us/ur [U@] en-us | ||||
vwl_fr/@2r [] fr | |||||
vwl_fr/a2r [] fr | |||||
vwl_fr/aa2r [] fr | |||||
vwl_fr/@2r [L¸j] fr | |||||
vwl_fr/a2r [L¸j] fr | |||||
vwl_fr/aa2r [L¸j] fr | |||||
vwl_fr/br [r/2] fr | vwl_fr/br [r/2] fr | ||||
vwl_fr/e2r [] fr | |||||
vwl_fr/e_2r [] fr | |||||
vwl_fr/ee2r [] fr | |||||
vwl_fr/i2r [] fr | |||||
vwl_fr/e2r [L¸j] fr | |||||
vwl_fr/e_2r [L¸j] fr | |||||
vwl_fr/ee2r [L¸j] fr | |||||
vwl_fr/i2r [L¸j] fr | |||||
vwl_fr/j [j/] fr | vwl_fr/j [j/] fr | ||||
vwl_fr/lo [l] fr | vwl_fr/lo [l] fr | ||||
vwl_fr/o2r [] fr | |||||
vwl_fr/oo2r [] fr | |||||
vwl_fr/o2r [L¸j] fr | |||||
vwl_fr/oo2r [L¸j] fr | |||||
vwl_fr/r [r] fr | vwl_fr/r [r] fr | ||||
[r/2] fr | [r/2] fr | ||||
vwl_fr/r_ [r/] fr | vwl_fr/r_ [r/] fr | ||||
vwl_fr/r_@ [r/] fr | vwl_fr/r_@ [r/] fr | ||||
vwl_fr/r@ [] fr | |||||
vwl_fr/r@ [L¸j] fr | |||||
vwl_fr/@R [x] pt-pt | vwl_fr/@R [x] pt-pt | ||||
vwl_fr/r@2 [] fr | |||||
vwl_fr/r@2 [L¸j] fr | |||||
vwl_fr/@R2 [R] fr-ca | vwl_fr/@R2 [R] fr-ca | ||||
vwl_fr/ra [] fr | |||||
vwl_fr/ra [L¸j] fr | |||||
vwl_fr/r_a [r/] fr | vwl_fr/r_a [r/] fr | ||||
vwl_fr/raa [] fr | |||||
vwl_fr/re [] fr | |||||
vwl_fr/raa [L¸j] fr | |||||
vwl_fr/re [L¸j] fr | |||||
vwl_fr/r_e [r/] fr | vwl_fr/r_e [r/] fr | ||||
vwl_fr/re2 [] fr | |||||
vwl_fr/ree [] fr | |||||
vwl_fr/ri [] fr | |||||
vwl_fr/re2 [L¸j] fr | |||||
vwl_fr/ree [L¸j] fr | |||||
vwl_fr/ri [L¸j] fr | |||||
vwl_fr/r_i [r/] fr | vwl_fr/r_i [r/] fr | ||||
vwl_fr/rj [] fr | |||||
vwl_fr/rj [L¸j] fr | |||||
vwl_fr/r_n [r/] fr | vwl_fr/r_n [r/] fr | ||||
vwl_fr/ro [] fr | |||||
vwl_fr/ro [L¸j] fr | |||||
vwl_fr/r_o [r/] fr | vwl_fr/r_o [r/] fr | ||||
vwl_fr/roo [] fr | |||||
vwl_fr/roo [L¸j] fr | |||||
vwl_fr/rr [r/] fr | vwl_fr/rr [r/] fr | ||||
vwl_fr/ru [] fr | |||||
vwl_fr/ru [L¸j] fr | |||||
vwl_fr/r_u [r/] fr | vwl_fr/r_u [r/] fr | ||||
vwl_fr/rw [] fr | |||||
vwl_fr/ry [] fr | |||||
vwl_fr/rw [L¸j] fr | |||||
vwl_fr/ry [L¸j] fr | |||||
vwl_fr/r_y [r/] fr | vwl_fr/r_y [r/] fr | ||||
vwl_fr/tr [r/2] fr | vwl_fr/tr [r/2] fr | ||||
vwl_fr/trr [r/] fr | vwl_fr/trr [r/] fr | ||||
vwl_fr/u2r [] fr | |||||
vwl_fr/u2r [L¸j] fr | |||||
vwl_fr/wa [w] fr | vwl_fr/wa [w] fr | ||||
[w/] fr | [w/] fr | ||||
vwl_fr/y2r [] fr | |||||
vwl_fr/y2r [L¸j] fr | |||||
vwl_hi/l-voc [l-] base | vwl_hi/l-voc [l-] base | ||||
[l] lt | [l] lt | ||||
[l-] sk | [l-] sk |
vowel starttype #@ endtype #@ | vowel starttype #@ endtype #@ | ||||
ipa ɚ | ipa ɚ | ||||
unstressed | unstressed | ||||
length 210 | |||||
length 200 | |||||
IfNextVowelAppend(r-) | IfNextVowelAppend(r-) | ||||
FMT(vwl_en_us/3_us) | FMT(vwl_en_us/3_us) | ||||
endphoneme | endphoneme | ||||
IF nextPh(isRhotic) THEN | IF nextPh(isRhotic) THEN | ||||
ChangePhoneme(3) | ChangePhoneme(3) | ||||
ENDIF | ENDIF | ||||
IF thisPh(isWordEnd) THEN | |||||
FMT(vowel/@_6) | |||||
ENDIF | |||||
FMT(vowel/@_4) | FMT(vowel/@_4) | ||||
endphoneme | 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 | phoneme @2 // Schwa, changes to I before a vowel | ||||
vowel starttype #@ endtype #@ | vowel starttype #@ endtype #@ |
vowel starttype #@ endtype #@ | vowel starttype #@ endtype #@ | ||||
ipa ɐU+0303 | ipa ɐU+0303 | ||||
length 180 | length 180 | ||||
FMT(vnasal/a#_n) | |||||
IF thisPh(isStressed) THEN | |||||
FMT(vnasal/W_n) | |||||
ELSE | |||||
FMT(vnasal/a#_n) | |||||
ENDIF | |||||
endphoneme | endphoneme | ||||
phoneme &U~ | phoneme &U~ | ||||
endphoneme | endphoneme | ||||
// TESTING | |||||
phoneme &2~ | |||||
vowel starttype #@ endtype #@ | |||||
ipa ɐU+0303 | |||||
length 200 | |||||
FMT(vnasal/W_n) | |||||
endphoneme |
IF prevPhW(w) THEN | IF prevPhW(w) THEN | ||||
VowelStart(w/wi) | VowelStart(w/wi) | ||||
ENDIF | ENDIF | ||||
FMT(vowel/i_4) | |||||
IF nextPh(n^) OR nextPh(c) THEN | |||||
FMT(vnasal/ii_n) | |||||
ELSE | |||||
FMT(vowel/i_4) | |||||
ENDIF | |||||
endphoneme | endphoneme | ||||
phoneme O | phoneme O | ||||
vowel starttype #o endtype #o | vowel starttype #o endtype #o | ||||
IF nextPh(kh) THEN | |||||
length 95 | |||||
IF nextPh(kh) OR nextPh(N) THEN | |||||
length 110 | |||||
ELSE | ELSE | ||||
length 200 | length 200 | ||||
ENDIF | ENDIF | ||||
phoneme o | phoneme o | ||||
vowel starttype #o endtype #o | vowel starttype #o endtype #o | ||||
IF nextPh(kh) THEN | |||||
length 95 | |||||
IF nextPh(kh) OR nextPh(N) THEN | |||||
length 110 | |||||
ELSE | ELSE | ||||
length 200 | length 200 | ||||
ENDIF | ENDIF | ||||
phoneme u@ | phoneme u@ | ||||
vowel starttype #u endtype #@ | vowel starttype #u endtype #@ | ||||
length 200 | |||||
length 150 //200 | |||||
FMT(vdiph2/uu@) | FMT(vdiph2/uu@) | ||||
endphoneme | endphoneme | ||||
FMT(vietnam/oe) | FMT(vietnam/oe) | ||||
endphoneme | endphoneme | ||||
phoneme iE // iê : viết, giệc | |||||
vowel starttype #i endtype #e | |||||
length 190 | |||||
FMT(vietnam/ie_2) | |||||
endphoneme | |||||
phoneme kh | phoneme kh | ||||
vls vel frc | vls vel frc | ||||
lengthmod 3 | lengthmod 3 |
ENDIF | ENDIF | ||||
NextVowelStarts | 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 | EndSwitch | ||||
IF prevPh(isNotVowel) AND nextPhW(isLiquid) THEN | IF prevPh(isNotVowel) AND nextPhW(isLiquid) THEN | ||||
phonemetable kl base | phonemetable kl base | ||||
include ph_greenlandic | include ph_greenlandic | ||||
// 20.02.13 Add samplerate 4-bytes at start of phondata | |||||
// 14.09.10 Recognize long and short frames in phondata | // 14.09.10 Recognize long and short frames in phondata | ||||
// 02.09.10 Fix: Q sections were omitted from the converted 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. | // 13.08.10 jonsd: Added Q lines. Use Address to set the displacement in phondata file. | ||||
exit (1); | 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); | fwrite(buf_4, 4, 1, out); | ||||
while (fgets (line, sizeof(line), mfest)) | while (fgets (line, sizeof(line), mfest)) |
#define INCLUDE_KLATT | #define INCLUDE_KLATT | ||||
#define INCLUDE_MBROLA | #define INCLUDE_MBROLA | ||||
#define INCLUDE_SONIC | #define INCLUDE_SONIC | ||||
#define _ESPEAKEDIT | |||||
#include <windows.h> | #include <windows.h> | ||||
#define PLATFORM_WINDOWS | #define PLATFORM_WINDOWS |
#define INCLUDE_KLATT | #define INCLUDE_KLATT | ||||
#define INCLUDE_MBROLA | #define INCLUDE_MBROLA | ||||
#define INCLUDE_SONIC | #define INCLUDE_SONIC | ||||
#define _ESPEAKEDIT | |||||
#include <windows.h> | #include <windows.h> | ||||
#define PLATFORM_WINDOWS | #define PLATFORM_WINDOWS |
#include "wx/wfstream.h" | #include "wx/wfstream.h" | ||||
#include "wx/dir.h" | #include "wx/dir.h" | ||||
#include "wx/filename.h" | #include "wx/filename.h" | ||||
#include <wx/numdlg.h> | |||||
#include "speak_lib.h" | #include "speak_lib.h" | ||||
#include "main.h" | #include "main.h" | ||||
extern void DisplayErrorFile(const char *fname); | extern void DisplayErrorFile(const char *fname); | ||||
extern int utf8_out(unsigned int c, char *buf); | extern int utf8_out(unsigned int c, char *buf); | ||||
extern void DrawEnvelopes(); | extern void DrawEnvelopes(); | ||||
extern void ReadPhondataManifest(); | |||||
char path_source[sizeof(path_home)+20]; | char path_source[sizeof(path_home)+20]; | ||||
instn_category = (instn >> 12) & 0xf; | instn_category = (instn >> 12) & 0xf; | ||||
data1 = instn & 0xff; | data1 = instn & 0xff; | ||||
type2 = (instn >> 8) & 0xf; | 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) | switch(instn_category) | ||||
{ | { | ||||
static int count_frames = 0; | static int count_frames = 0; | ||||
static int error_count = 0; | static int error_count = 0; | ||||
static int resample_count = 0; | static int resample_count = 0; | ||||
static int resample_fails = 0; | |||||
static int then_count = 0; | static int then_count = 0; | ||||
static int after_if = 0; | static int after_if = 0; | ||||
const char *data_path; | const char *data_path; | ||||
int prev_table; | int prev_table; | ||||
int prev_mnemonic; | int prev_mnemonic; | ||||
char fname[sizeof(path_source)+20]; | |||||
if(f_report == NULL) | if(f_report == NULL) | ||||
return; | return; | ||||
int max = 0; | int max = 0; | ||||
int length; | int length; | ||||
int sr1, sr2; | int sr1, sr2; | ||||
int failed; | |||||
int len; | |||||
int resample_wav = 0; | int resample_wav = 0; | ||||
const char *fname2; | |||||
char fname_temp[100]; | char fname_temp[100]; | ||||
char msg[120]; | |||||
int scale_factor=0; | int scale_factor=0; | ||||
fseek(f,24,SEEK_SET); | fseek(f,24,SEEK_SET); | ||||
if((sr1 != samplerate_native) || (sr2 != sr1*2)) | if((sr1 != samplerate_native) || (sr2 != sr1*2)) | ||||
{ | { | ||||
#ifdef PLATFORM_WINDOWS | |||||
if(sr1 != samplerate_native) | |||||
{ | |||||
fprintf(f_errors,"Wrong samplerate %d, wants %d\n",sr1,samplerate_native); | |||||
error("Wrong samplerate: %s",fname); | |||||
} | |||||
if(sr2 != sr1*2) | |||||
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) | |||||
{ | { | ||||
error("Not mono: %s",fname); | |||||
close(fd_temp); | |||||
} | } | ||||
#else | #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); | |||||
} | |||||
} | |||||
strcpy(fname_temp,tmpnam(NULL)); | |||||
#endif | |||||
if(GetFileLength(fname_temp) <= 0) | |||||
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) | |||||
{ | { | ||||
error("Failed to resample: %s",command); | |||||
remove(fname_temp); | |||||
return(0); | |||||
sprintf(msg, "Can't resample (%d to %d): %s", sr1, samplerate_native, fname); | |||||
error("%s", msg); | |||||
} | } | ||||
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" | |||||
} | |||||
#endif | |||||
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); | displ = ftell(f_phdata); | ||||
p_start[2] = n_bytes >> 8; // index of next table | p_start[2] = n_bytes >> 8; // index of next table | ||||
p_start[3] = n_bytes; | 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 | } // end of CompileEquivalents | ||||
case kINCLUDE: | case kINCLUDE: | ||||
NextItem(tSTRING); | NextItem(tSTRING); | ||||
sprintf(buf,"%s%s",path_source,item_string); | sprintf(buf,"%s%s",path_source,item_string); | ||||
if((stack_ix < N_STACK) && (f = fopen_log(f_errors,buf,"rb")) != NULL) | if((stack_ix < N_STACK) && (f = fopen_log(f_errors,buf,"rb")) != NULL) | ||||
{ | { | ||||
fprintf(f_errors,"include %s\n",item_string); | fprintf(f_errors,"include %s\n",item_string); | ||||
n_envelopes = 0; | n_envelopes = 0; | ||||
error_count = 0; | error_count = 0; | ||||
resample_count = 0; | |||||
memset(markers_used,0,sizeof(markers_used)); | memset(markers_used,0,sizeof(markers_used)); | ||||
f_errors = stderr; | f_errors = stderr; | ||||
// write a word so that further data doesn't start at displ=0 | // write a word so that further data doesn't start at displ=0 | ||||
Write4Bytes(f_phdata,version_phdata); | Write4Bytes(f_phdata,version_phdata); | ||||
Write4Bytes(f_phdata,samplerate_native); | |||||
Write4Bytes(f_phindex,version_phdata); | Write4Bytes(f_phindex,version_phdata); | ||||
memset(ref_hash_tab,0,sizeof(ref_hash_tab)); | memset(ref_hash_tab,0,sizeof(ref_hash_tab)); | ||||
fclose(f_phtab); | fclose(f_phtab); | ||||
fclose(f_phcontents); | fclose(f_phcontents); | ||||
LoadPhData(); | |||||
LoadVoice(voice_name2,0); | |||||
LoadPhData(NULL); | |||||
if(gui_flag != 0) | |||||
LoadVoice(voice_name2,0); | |||||
CompileReport(); | CompileReport(); | ||||
report_dict = CompileAllDictionaries(); | report_dict = CompileAllDictionaries(); | ||||
fprintf(stderr,"%s\n",fname); | fprintf(stderr,"%s\n",fname); | ||||
} | } | ||||
ReadPhondataManifest(); | |||||
} // end of CompilePhonemeData | } // end of CompilePhonemeData | ||||
char buf[sizeof(path_source)+120]; | char buf[sizeof(path_source)+120]; | ||||
error_count = 0; | error_count = 0; | ||||
resample_count = 0; | |||||
sprintf(fname_errors,"%s%s",path_source,"error_intonation"); | sprintf(fname_errors,"%s%s",path_source,"error_intonation"); | ||||
if((f_errors = fopen(fname_errors,"w")) == NULL) | if((f_errors = fopen(fname_errors,"w")) == NULL) | ||||
{ | { | ||||
DisplayErrorFile(fname_errors); | DisplayErrorFile(fname_errors); | ||||
} | } | ||||
LoadPhData(); | |||||
LoadPhData(NULL); | |||||
} // end of CompileIntonation | } // end of CompileIntonation | ||||
void CompilePhonemeData() | void CompilePhonemeData() | ||||
{ | { | ||||
WavegenInit(22050, 0); | |||||
WavegenSetVoice(voice); | |||||
CompilePhonemeData2("phonemes"); | 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"); | |||||
} | |||||
} | } | ||||
// set up indices into data_dictrules | // set up indices into data_dictrules | ||||
InitGroups(tr); | 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 | // set up hash table for data_dictlist | ||||
p = &(tr->data_dictlist[8]); | p = &(tr->data_dictlist[8]); |
#include "prosodydisplay.h" | #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" | "Licensed under GNU General Public License version 3\n" | ||||
"http://espeak.sourceforge.net/"; | "http://espeak.sourceforge.net/"; | ||||
#endif | |||||
static const char *about_string = "<font size=0><b>espeakedit </b> %s<br>Author: Jonathan Duddington (c) 2009<br>" | static const char *about_string = "<font size=0><b>espeakedit </b> %s<br>Author: Jonathan Duddington (c) 2009<br>" | ||||
"<a href=\"http://espeak.sourceforge.net/\">http://espeak.sourceforge.net</a><br>" | "<a href=\"http://espeak.sourceforge.net/\">http://espeak.sourceforge.net</a><br>" | ||||
extern void init_z(); | extern void init_z(); | ||||
extern void CompilePhonemeData(void); | extern void CompilePhonemeData(void); | ||||
extern void CompileSampleRate(void); | |||||
extern void CompileMbrola(); | extern void CompileMbrola(); | ||||
extern void CompileIntonation(); | extern void CompileIntonation(); | ||||
extern void InitSpectrumDisplay(); | extern void InitSpectrumDisplay(); | ||||
if((strcmp(param,"--help")==0) || (strcmp(param,"-h")==0)) | 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); | exit(0); | ||||
} | } | ||||
ConfigInit(); | ConfigInit(); | ||||
VoiceReset(0); | |||||
WavegenSetVoice(voice); | |||||
WavegenInitSound(); | |||||
if(strcmp(param,"--compile")==0) | if(strcmp(param,"--compile")==0) | ||||
{ | { | ||||
LoadPhData(NULL); | |||||
samplerate_native = samplerate = 22050; | |||||
CompilePhonemeData(); | CompilePhonemeData(); | ||||
CompileIntonation(); | CompileIntonation(); | ||||
exit(0); | |||||
} | } | ||||
exit(0); | |||||
} | } | ||||
ConfigInit(); | ConfigInit(); | ||||
EVT_MENU(MENU_PATH3, MyFrame::OnOptions) | EVT_MENU(MENU_PATH3, MyFrame::OnOptions) | ||||
EVT_MENU(MENU_PATH4, MyFrame::OnOptions) | EVT_MENU(MENU_PATH4, MyFrame::OnOptions) | ||||
EVT_MENU(MENU_COMPILE_PH, MyFrame::OnTools) | 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, MyFrame::OnTools) | ||||
EVT_MENU(MENU_COMPILE_DICT_DEBUG, MyFrame::OnTools) | EVT_MENU(MENU_COMPILE_DICT_DEBUG, MyFrame::OnTools) | ||||
EVT_MENU(MENU_FORMAT_DICTIONARY, MyFrame::OnTools) | EVT_MENU(MENU_FORMAT_DICTIONARY, MyFrame::OnTools) | ||||
int error_flag = 0; | int error_flag = 0; | ||||
int result; | int result; | ||||
int param; | int param; | ||||
int srate; | |||||
notebook = new wxNotebook(this, ID_NOTEBOOK, wxDefaultPosition, wxSize(312,760)); | notebook = new wxNotebook(this, ID_NOTEBOOK, wxDefaultPosition, wxSize(312,760)); | ||||
// notebook->AddPage(voicedlg,_T("Voice"),FALSE); | // notebook->AddPage(voicedlg,_T("Voice"),FALSE); | ||||
SetSize(pos.x, pos.y, size.GetWidth(), size.GetHeight()); | SetSize(pos.x, pos.y, size.GetWidth(), size.GetHeight()); | ||||
LoadConfig(); | LoadConfig(); | ||||
WavegenInitSound(); | |||||
if((result = LoadPhData()) != 1) | |||||
if((result = LoadPhData(&srate)) != 1) | |||||
{ | { | ||||
if(result == -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")); | wxLogError(_T("Failed to read espeak-data/phontab,phondata,phonindex\nPath = ")+wxString(path_home,wxConvLocal)+_T("\n\nThe 'eSpeak' package needs to be installed")); | ||||
wxLogError(_T("Wrong version of espeak-data at:\n")+ wxString(path_home,wxConvLocal)+_T("\nVersion 0x%x (expects 0x%x)"),result,version_phdata); | 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; | error_flag = 1; | ||||
srate = 22050; | |||||
} | } | ||||
WavegenInit(srate,0); | |||||
WavegenInitSound(); | |||||
f_trans = stdout; | f_trans = stdout; | ||||
option_ssml = 1; | option_ssml = 1; | ||||
void MyFrame::SetVoiceTitle(char *voice_name) | void MyFrame::SetVoiceTitle(char *voice_name) | ||||
{//========================================== | {//========================================== | ||||
char buf[100]; | 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)) | if((data_menu != NULL) && (translator != NULL)) | ||||
{ | { | ||||
sprintf(buf,"Compile &dictionary '%s'",translator->dictionary_name); | sprintf(buf,"Compile &dictionary '%s'",translator->dictionary_name); | ||||
case MENU_COMPILE_PH: | case MENU_COMPILE_PH: | ||||
CompilePhonemeData(); | CompilePhonemeData(); | ||||
SetVoiceTitle(voice_name2); | |||||
break; | |||||
case MENU_COMPILE_PH2: | |||||
CompileSampleRate(); | |||||
SetVoiceTitle(voice_name2); | |||||
break; | break; | ||||
case MENU_COMPILE_MBROLA: | case MENU_COMPILE_MBROLA: |
else | else | ||||
if(type==espeakEVENT_PHONEME) | 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 | fprintf(f_events,"[%s]\n",WordToString(events->id.number)); //old version, only 4 characters bytes | ||||
// memcpy(buf, events->id.string, 8); | // memcpy(buf, events->id.string, 8); | ||||
// buf[8] = 0; | // buf[8] = 0; | ||||
#define N_CHARS 34 | #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 | |||||
continue; /* indicates unrecognised phoneme */ | continue; /* indicates unrecognised phoneme */ | ||||
if((ph = phoneme_tab[phcode]) == NULL) | if((ph = phoneme_tab[phcode]) == NULL) | ||||
continue; | continue; | ||||
if((ph->type == phSTRESS) && (ph->std_length <= 4) && (ph->program == 0)) | if((ph->type == phSTRESS) && (ph->std_length <= 4) && (ph->program == 0)) | ||||
{ | { | ||||
if(ph->std_length > 2) | if(ph->std_length > 2) | ||||
else | else | ||||
if(mnem != 0) | if(mnem != 0) | ||||
{ | { | ||||
while((c = (mnem & 0xff)) != 0) | |||||
while((c = (mnem & 0xff)) != 0) | |||||
{ | { | ||||
*outptr++ = c; | *outptr++ = c; | ||||
mnem = mnem >> 8; | mnem = mnem >> 8; | ||||
path_dir1 = wxFileName(fname_lex).GetPath(); | path_dir1 = wxFileName(fname_lex).GetPath(); | ||||
strcpy(buf_out, path_dir1.mb_str(wxConvLocal)); | strcpy(buf_out, path_dir1.mb_str(wxConvLocal)); | ||||
sprintf(buf, "%s/IT_errors", buf_out); | sprintf(buf, "%s/IT_errors", buf_out); | ||||
if((f_out = fopen(buf,"w")) == NULL) | if((f_out = fopen(buf,"w")) == NULL) | ||||
{ | { | ||||
str = wxString(buf, wxConvLocal); | str = wxString(buf, wxConvLocal); | ||||
if((p = strstr(buf,"//")) != NULL) | if((p = strstr(buf,"//")) != NULL) | ||||
*p = 0; | *p = 0; | ||||
if((sscanf(buf,"%s %s",word,temp)) < 2) | if((sscanf(buf,"%s %s",word,temp)) < 2) | ||||
continue; | continue; | ||||
fputc(*p, f_listx); // omit secondary stress marks | fputc(*p, f_listx); // omit secondary stress marks | ||||
} | } | ||||
fputc('\n',f_listx); | fputc('\n',f_listx); | ||||
} | } | ||||
else | else | ||||
if((stress_posn1 != stress_posn2) && (stress_posn1 > 0) && (stress_posn2 > 0)) | if((stress_posn1 != stress_posn2) && (stress_posn1 > 0) && (stress_posn2 > 0)) | ||||
return; | return; | ||||
} | } | ||||
path_dir1 = wxFileName(fname).GetPath(); | path_dir1 = wxFileName(fname).GetPath(); | ||||
if((f_out = fopen("compare_de","w")) == NULL) | if((f_out = fopen("compare_de","w")) == NULL) | ||||
{ | { | ||||
wxLogError(_T("Can't write file ")); | wxLogError(_T("Can't write file ")); | ||||
FILE *f_in; | FILE *f_in; | ||||
FILE *f_out; | FILE *f_out; | ||||
char word[80]; | char word[80]; | ||||
char word_in[80]; | char word_in[80]; | ||||
char phonemes[N_WORD_PHONEMES]; | char phonemes[N_WORD_PHONEMES]; | ||||
if(done) | if(done) | ||||
n_out++; | n_out++; | ||||
} | |||||
} | |||||
n_words++; | n_words++; | ||||
} | } | ||||
len = strlen(suffix); | len = strlen(suffix); | ||||
if(len >= (wlen-2)) | if(len >= (wlen-2)) | ||||
continue; | continue; | ||||
if(ru_stress > (vcount - suffixes[sfx].syllables)) | if(ru_stress > (vcount - suffixes[sfx].syllables)) | ||||
continue; | continue; | ||||
if(strcmp(suffix,&word[wlen-len])==0) | if(strcmp(suffix,&word[wlen-len])==0) | ||||
{ | { | ||||
strcpy(word2,word); | strcpy(word2,word); | ||||
// skip leading spaces, numbers, etc | // skip leading spaces, numbers, etc | ||||
if(feof(f_in)) break; | if(feof(f_in)) break; | ||||
} | } | ||||
// read utf8 bytes until a space, number or punctuation | // read utf8 bytes until a space, number or punctuation | ||||
ix = 0; | ix = 0; | ||||
while(!feof(f_in) && (c >= 'A') && (ix < sizeof(buf)-1)) | while(!feof(f_in) && (c >= 'A') && (ix < sizeof(buf)-1)) | ||||
} | } | ||||
buf[ix++] = 0; | buf[ix++] = 0; | ||||
buf[ix] = 0; | buf[ix] = 0; | ||||
// the buf may contain non-alphabetic characters | // the buf may contain non-alphabetic characters | ||||
j = 0; | j = 0; | ||||
n_chars = 0; | n_chars = 0; | ||||
} | } | ||||
} | } | ||||
fclose(f_in); | fclose(f_in); | ||||
} // end of CountWordFreq | } // end of CountWordFreq | ||||
free(p); | free(p); | ||||
} | } | ||||
fclose(f_out); | fclose(f_out); | ||||
} // end of Make WorkFreqList | } // end of Make WorkFreqList | ||||
// Interpolation table to translate from words-per-minute to internal speed | // Interpolation table to translate from words-per-minute to internal speed | ||||
// words-per-minute values (measured) | // words-per-minute values (measured) | ||||
static float wpm1[N_WPM] = | 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 | // 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 }; | {0,253,200, 170, 140, 125, 110, 95, 85, 75, 55, 40, 35, 30, 25, 20, 15, 10, 5 }; | ||||
unsigned char speed_lookup[290]; | unsigned char speed_lookup[290]; | ||||
#ifdef deleted | #ifdef deleted | ||||
void Test2() | void Test2() | ||||
{ | { | ||||
// | |||||
// | |||||
char buf[120]; | char buf[120]; | ||||
FILE *f; | FILE *f; | ||||
FILE *f_out; | FILE *f_out; | ||||
f = fopen("/home/jsd1/speechdata/text/test.txt","r"); | f = fopen("/home/jsd1/speechdata/text/test.txt","r"); | ||||
if(f==NULL) | if(f==NULL) | ||||
return; | return; | ||||
while(!feof(f) && (ix < sizeof(textbuf)-2)) | while(!feof(f) && (ix < sizeof(textbuf)-2)) | ||||
{ | { |
MENU_PROSODY, | MENU_PROSODY, | ||||
MENU_COMPILE_PH, | MENU_COMPILE_PH, | ||||
MENU_COMPILE_PH2, | |||||
MENU_COMPILE_DICT, | MENU_COMPILE_DICT, | ||||
MENU_COMPILE_DICT_DEBUG, | MENU_COMPILE_DICT_DEBUG, | ||||
MENU_FORMAT_DICTIONARY, | MENU_FORMAT_DICTIONARY, |
/*************************************************************************** | /*************************************************************************** | ||||
* Copyright (C) 2005 to 2010 by Jonathan Duddington * | |||||
* Copyright (C) 2005 to 2013 by Jonathan Duddington * | |||||
* email: [email protected] * | * email: [email protected] * | ||||
* * | * * | ||||
* This program is free software; you can redistribute it and/or modify * | * This program is free software; you can redistribute it and/or modify * | ||||
// DATA MENU | // DATA MENU | ||||
data_menu = new wxMenu; | data_menu = new wxMenu; | ||||
data_menu->Append(MENU_COMPILE_PH, _("Compile &phoneme data")); | 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, _("Compile &dictionary")); | ||||
data_menu->Append(MENU_COMPILE_DICT_DEBUG, _("Compile dictionary (debu&g)")); | data_menu->Append(MENU_COMPILE_DICT_DEBUG, _("Compile dictionary (debu&g)")); | ||||
data_menu->AppendSeparator(); | data_menu->AppendSeparator(); |
/*************************************************************************** | /*************************************************************************** | ||||
* Copyright (C) 2005 to 2011 by Jonathan Duddington * | |||||
* Copyright (C) 2005 to 2013 by Jonathan Duddington * | |||||
* email: [email protected] * | * email: [email protected] * | ||||
* * | * * | ||||
* This program is free software; you can redistribute it and/or modify * | * This program is free software; you can redistribute it and/or modify * | ||||
if((letter >= 0x250) && (letter <= 0x2a8)) | if((letter >= 0x250) && (letter <= 0x2a8)) | ||||
{ | { | ||||
accent_data = letter_accents_250[letter - 0x250]; | accent_data = letter_accents_250[letter - 0x250]; | ||||
} | |||||
} | |||||
if(accent_data != 0) | if(accent_data != 0) | ||||
{ | { | ||||
// if the $accent flag is set for this letter, use the accents table (below) | // if the $accent flag is set for this letter, use the accents table (below) | ||||
dict_flags[1] = 0; | dict_flags[1] = 0; | ||||
if(Lookup(tr, &single_letter[1], ph_buf3) == 0) | if(Lookup(tr, &single_letter[1], ph_buf3) == 0) | ||||
{ | { | ||||
single_letter[1] = ' '; | single_letter[1] = ' '; | ||||
if((ph_buf[0]==0) && !iswspace(letter)) | if((ph_buf[0]==0) && !iswspace(letter)) | ||||
Lookup(tr, "_??", ph_buf); | Lookup(tr, "_??", ph_buf); | ||||
if(ph_buf[0] != 0) | if(ph_buf[0] != 0) | ||||
{ | { | ||||
// speak the hexadecimal number of the character code | // speak the hexadecimal number of the character code | ||||
static const char *roman_numbers = "ixcmvld"; | static const char *roman_numbers = "ixcmvld"; | ||||
static int roman_values[] = {1,10,100,1000,5,50,500}; | static int roman_values[] = {1,10,100,1000,5,50,500}; | ||||
acc = 0; | acc = 0; | ||||
prev = 0; | prev = 0; | ||||
subtract = 0x7fff; | subtract = 0x7fff; | ||||
if(isdigit(word[0])) | if(isdigit(word[0])) | ||||
return(0); // eg. 'xx2' | return(0); // eg. 'xx2' | ||||
acc += prev; | acc += prev; | ||||
if(acc < tr->langopts.min_roman) | if(acc < tr->langopts.min_roman) | ||||
return(0); | return(0); | ||||
static const char *M_Variant(int value) | static const char *M_Variant(int value) | ||||
{//==================================== | {//==================================== | ||||
// returns M, or perhaps MA or MB for some cases | // returns M, or perhaps MA or MB for some cases | ||||
int teens = 0; | int teens = 0; | ||||
if(((value % 100) > 10) && ((value % 100) < 20)) | if(((value % 100) > 10) && ((value % 100) < 20)) | ||||
if(found_value == 0) | if(found_value == 0) | ||||
{ | { | ||||
if((value % 100) >= 20) | |||||
if((value % 100) >= 20) | |||||
{ | { | ||||
Lookup(tr, "_0of", ph_of); | Lookup(tr, "_0of", ph_of); | ||||
} | } | ||||
if(is_ordinal) | if(is_ordinal) | ||||
{ | { | ||||
strcpy(ph_ordinal, ph_ordinal2); | strcpy(ph_ordinal, ph_ordinal2); | ||||
if(control & 4) | if(control & 4) | ||||
{ | { | ||||
sprintf(string,"_%d%cx",value,ord_type); // LANG=hu, special word for 1. 2. when there are no higher digits | sprintf(string,"_%d%cx",value,ord_type); // LANG=hu, special word for 1. 2. when there are no higher digits | ||||
} | } | ||||
found_ordinal = found; | found_ordinal = found; | ||||
} | } | ||||
if(found == 0) | if(found == 0) | ||||
{ | { | ||||
if(control & 2) | if(control & 2) | ||||
} | } | ||||
} | } | ||||
} | } | ||||
// no, speak as tens+units | // no, speak as tens+units | ||||
if((control & 0x10) && (value < 10)) | if((control & 0x10) && (value < 10)) | ||||
{ | { | ||||
// speak leading zero | // speak leading zero | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
if((is_ordinal) && | |||||
if((is_ordinal) && | |||||
((units == 0) || (tr->langopts.numbers & NUM_SWAP_TENS) || (tr->langopts.numbers2 & NUM2_MULTIPLE_ORDINAL))) | ((units == 0) || (tr->langopts.numbers & NUM_SWAP_TENS) || (tr->langopts.numbers2 & NUM2_MULTIPLE_ORDINAL))) | ||||
{ | { | ||||
sprintf(string,"_%dX%c", tens, ord_type); | sprintf(string,"_%dX%c", tens, ord_type); | ||||
sprintf(string,"_%dX", tens); | sprintf(string,"_%dX", tens); | ||||
Lookup(tr, string, ph_tens); | Lookup(tr, string, ph_tens); | ||||
} | } | ||||
if((ph_tens[0] == 0) && (tr->langopts.numbers & NUM_VIGESIMAL)) | if((ph_tens[0] == 0) && (tr->langopts.numbers & NUM_VIGESIMAL)) | ||||
{ | { | ||||
// tens not found, (for example) 73 is 60+13 | // tens not found, (for example) 73 is 60+13 | ||||
sprintf(string,"_%dX", tens & 0xfe); | sprintf(string,"_%dX", tens & 0xfe); | ||||
Lookup(tr, string, ph_tens); | Lookup(tr, string, ph_tens); | ||||
} | } | ||||
ph_digits[0] = 0; | ph_digits[0] = 0; | ||||
if(units > 0) | if(units > 0) | ||||
{ | |||||
{ | |||||
found = 0; | found = 0; | ||||
if((control & 2) && (digit_lookup[0] != 0)) | if((control & 2) && (digit_lookup[0] != 0)) | ||||
{ | { | ||||
// we have an entry for this digit (possibly together with the next word) | // we have an entry for this digit (possibly together with the next word) | ||||
} | } | ||||
} | } | ||||
} | } | ||||
if((is_ordinal) && (found_ordinal == 0) && (ph_ordinal[0] == 0)) | if((is_ordinal) && (found_ordinal == 0) && (ph_ordinal[0] == 0)) | ||||
{ | { | ||||
if((value >= 20) && (((value % 10) == 0) || (tr->langopts.numbers & NUM_SWAP_TENS))) | if((value >= 20) && (((value % 10) == 0) || (tr->langopts.numbers & NUM_SWAP_TENS))) | ||||
if(ph_ordinal[0] == 0) | if(ph_ordinal[0] == 0) | ||||
Lookup(tr, "_ord", ph_ordinal); | Lookup(tr, "_ord", ph_ordinal); | ||||
} | } | ||||
if((tr->langopts.numbers & (NUM_SWAP_TENS | NUM_AND_UNITS)) && (ph_tens[0] != 0) && (ph_digits[0] != 0)) | if((tr->langopts.numbers & (NUM_SWAP_TENS | NUM_AND_UNITS)) && (ph_tens[0] != 0) && (ph_digits[0] != 0)) | ||||
{ | { | ||||
Lookup(tr, "_0and", ph_and); | Lookup(tr, "_0and", ph_and); | ||||
{ | { | ||||
if((next_phtype = phoneme_tab[(unsigned int)(ph_digits[0])]->type) == phSTRESS) | if((next_phtype = phoneme_tab[(unsigned int)(ph_digits[0])]->type) == phSTRESS) | ||||
next_phtype = phoneme_tab[(unsigned int)(ph_digits[1])]->type; | next_phtype = phoneme_tab[(unsigned int)(ph_digits[1])]->type; | ||||
if((phoneme_tab[(unsigned int)(ph_tens[ix])]->type == phVOWEL) && (next_phtype == phVOWEL)) | if((phoneme_tab[(unsigned int)(ph_tens[ix])]->type == phVOWEL) && (next_phtype == phVOWEL)) | ||||
ph_tens[ix] = 0; | ph_tens[ix] = 0; | ||||
} | } | ||||
sprintf(string,"_%dC0",hundreds); | sprintf(string,"_%dC0",hundreds); | ||||
found = Lookup(tr, string, ph_digits); | found = Lookup(tr, string, ph_digits); | ||||
} | } | ||||
if(!found) | if(!found) | ||||
{ | { | ||||
sprintf(string,"_%dC",hundreds); | sprintf(string,"_%dC",hundreds); | ||||
found = Lookup(tr, string, ph_digits); // is there a specific pronunciation for n-hundred ? | found = Lookup(tr, string, ph_digits); // is there a specific pronunciation for n-hundred ? | ||||
} | } | ||||
if(found) | if(found) | ||||
{ | { | ||||
ph_100[0] = 0; | ph_100[0] = 0; | ||||
x = 8; // use variant (feminine) for before thousands and millions | 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) | 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 | ph_hundred_and[0] = 0; // don't put 'and' after 'hundred' if there's 'and' between tens and units | ||||
// this is an ordinal suffix | // this is an ordinal suffix | ||||
ordinal = 2; | ordinal = 2; | ||||
flags[0] |= FLAG_SKIPWORDS; | flags[0] |= FLAG_SKIPWORDS; | ||||
skipwords = 1; | |||||
skipwords = 1; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
break; | break; | ||||
n_digits++; | n_digits++; | ||||
strcat(ph_out, buf1); | strcat(ph_out, buf1); | ||||
} | |||||
} | |||||
} | } | ||||
} | } | ||||
/*************************************************************************** | /*************************************************************************** | ||||
* Copyright (C) 2005 to 2007 by Jonathan Duddington * | |||||
* Copyright (C) 2005 to 2013 by Jonathan Duddington * | |||||
* email: [email protected] * | * email: [email protected] * | ||||
* * | * * | ||||
* This program is free software; you can redistribute it and/or modify * | * This program is free software; you can redistribute it and/or modify * | ||||
for(ix=0; ix < 1; ix++) | for(ix=0; ix < 1; ix++) | ||||
delete m_lab[ix]; | delete m_lab[ix]; | ||||
delete m_samplerate; | delete m_samplerate; | ||||
delete m_save; | delete m_save; | ||||
delete m_close; | delete m_close; | ||||
{//=========================================== | {//=========================================== | ||||
int id; | int id; | ||||
int value; | int value; | ||||
switch(id = event.GetId()) | switch(id = event.GetId()) | ||||
{ | { | ||||
case wxID_SAVE: | case wxID_SAVE: | ||||
value = GetNumeric(m_samplerate); | value = GetNumeric(m_samplerate); | ||||
if(value > 0) WavegenInit(value,0); | if(value > 0) WavegenInit(value,0); | ||||
Destroy(); | Destroy(); | ||||
break; | break; | ||||
void ConfigInit() | void ConfigInit() | ||||
{//============== | {//============== | ||||
long value; | |||||
wxString string; | wxString string; | ||||
wxString basedir; | wxString basedir; | ||||
const char *path_base; | const char *path_base; | ||||
#ifdef PLATFORM_WINDOWS | #ifdef PLATFORM_WINDOWS | ||||
int found = 0; | int found = 0; | ||||
char buf[200]; | char buf[200]; | ||||
{ | { | ||||
sprintf(path_home,"%s\\espeak-data",path_base); | sprintf(path_home,"%s\\espeak-data",path_base); | ||||
if(GetFileLength(path_home) == -2) | if(GetFileLength(path_home) == -2) | ||||
found = 1; // an espeak-data directory exists | |||||
found = 1; // an espeak-data directory exists | |||||
} | } | ||||
if(found == 0) | if(found == 0) | ||||
if(pRegKey->Exists() ) | if(pRegKey->Exists() ) | ||||
{ | { | ||||
wxString RegVal; | wxString RegVal; | ||||
pRegKey->QueryValue(_T("Path"),RegVal); | |||||
pRegKey->QueryValue(_T("Path"),RegVal); | |||||
strncpy0(buf,RegVal.mb_str(wxConvLocal),sizeof(buf)); | strncpy0(buf,RegVal.mb_str(wxConvLocal),sizeof(buf)); | ||||
path_base = buf; | path_base = buf; | ||||
} | } | ||||
wxFileConfig *pConfig = new wxFileConfig(_T("espeakedit")); | wxFileConfig *pConfig = new wxFileConfig(_T("espeakedit")); | ||||
wxFileConfig::Set(pConfig); | 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 | 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("/spectload"),&path_spectload,basedir+_T("/phsource")); | ||||
pConfig->Read(_T("/spectload2"),&path_spectload2,basedir+_T("/phsource")); | pConfig->Read(_T("/spectload2"),&path_spectload2,basedir+_T("/phsource")); |
static wxPen PEN_PHSTRESSED(wxColour(80,80,196),3,wxSOLID); | static wxPen PEN_PHSTRESSED(wxColour(80,80,196),3,wxSOLID); | ||||
static wxPen PEN_PHSTRESSED2(wxColour(160,160,255),2,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) | ProsodyDisplay::ProsodyDisplay(wxWindow *parent, const wxPoint& pos, const wxSize& size) | ||||
: wxScrolledWindow(parent, -1, pos, size, | : wxScrolledWindow(parent, -1, pos, size, | ||||
wxSUNKEN_BORDER | wxNO_FULL_REPAINT_ON_RESIZE) | wxSUNKEN_BORDER | wxNO_FULL_REPAINT_ON_RESIZE) | ||||
int ix; | int ix; | ||||
wxString string; | wxString string; | ||||
ReadPhondataManifest(); | |||||
menu_envelopes = new wxMenu; | menu_envelopes = new wxMenu; | ||||
// entries match those in envelope_data[] in intonation.cpp | // entries match those in envelope_data[] in intonation.cpp | ||||
int ix; | int ix; | ||||
const char *name = "?"; | const char *name = "?"; | ||||
char buf[120]; | char buf[120]; | ||||
char len_string[20]; | |||||
if(index < 0) return; | if(index < 0) return; | ||||
} | } | ||||
y1 = p->pitch1; | y1 = p->pitch1; | ||||
y2 = p->pitch2; | 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)); | wxLogStatus(wxString(buf,wxConvLocal)); | ||||
} | } | ||||
adding_page = 2; // work around for wxNotebook bug (version 2.8.7) | adding_page = 2; // work around for wxNotebook bug (version 2.8.7) | ||||
screenpages->AddPage(prosodycanvas, _T("Prosody"), true); | screenpages->AddPage(prosodycanvas, _T("Prosody"), true); | ||||
} | } | ||||
{ | { | ||||
int ix; | int ix; | ||||
int fd_temp; | int fd_temp; | ||||
const char *resample; | |||||
int header[3]; | int header[3]; | ||||
char command[sizeof(fname2)+sizeof(fname2)+40]; | char command[sizeof(fname2)+sizeof(fname2)+40]; | ||||
fclose(f); | fclose(f); | ||||
f = NULL; | f = NULL; | ||||
if(header[2] == samplerate) | |||||
resample = ""; | |||||
else | |||||
resample = "polyphase"; | |||||
strcpy(fname_temp,"/tmp/espeakXXXXXX"); | strcpy(fname_temp,"/tmp/espeakXXXXXX"); | ||||
if((fd_temp = mkstemp(fname_temp)) >= 0) | if((fd_temp = mkstemp(fname_temp)) >= 0) | ||||
{ | { | ||||
close(fd_temp); | 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) | if(system(command) == 0) | ||||
{ | { | ||||
fname = fname_temp; | fname = fname_temp; |
/*************************************************************************** | /*************************************************************************** | ||||
* Copyright (C) 2005 to 2007 by Jonathan Duddington * | |||||
* Copyright (C) 2005 to 2013 by Jonathan Duddington * | |||||
* email: [email protected] * | * email: [email protected] * | ||||
* * | * * | ||||
* This program is free software; you can redistribute it and/or modify * | * This program is free software; you can redistribute it and/or modify * | ||||
{//======================== | {//======================== | ||||
int param; | int param; | ||||
int result; | int result; | ||||
int srate = 22050; // default sample rate | |||||
// It seems that the wctype functions don't work until the locale has been set | // 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 | // to something other than the default "C". Then, not only Latin1 but also the | ||||
#endif | #endif | ||||
WavegenInit(22050,0); // 22050 | |||||
if((result = LoadPhData()) != 1) | |||||
if((result = LoadPhData(&srate)) != 1) | |||||
{ | { | ||||
if(result == -1) | if(result == -1) | ||||
{ | { | ||||
else | else | ||||
fprintf(stderr,"Wrong version of espeak-data 0x%x (expects 0x%x) at %s\n",result,version_phdata,path_home); | fprintf(stderr,"Wrong version of espeak-data 0x%x (expects 0x%x) at %s\n",result,version_phdata,path_home); | ||||
} | } | ||||
WavegenInit(srate,0); | |||||
LoadConfig(); | LoadConfig(); | ||||
SetVoiceStack(NULL, ""); | SetVoiceStack(NULL, ""); | ||||
SynthesizeInit(); | SynthesizeInit(); |
{//=============================== | {//=============================== | ||||
int param; | int param; | ||||
int result; | int result; | ||||
int srate = 22050; // default sample rate 22050 Hz | |||||
err = EE_OK; | err = EE_OK; | ||||
LoadConfig(); | LoadConfig(); | ||||
WavegenInit(22050,0); // 22050 | |||||
if((result = LoadPhData()) != 1) | |||||
if((result = LoadPhData(&srate)) != 1) // reads sample rate from espeak-data/phontab | |||||
{ | { | ||||
if(result == -1) | if(result == -1) | ||||
{ | { | ||||
else | else | ||||
fprintf(stderr,"Wrong version of espeak-data 0x%x (expects 0x%x) at %s\n",result,version_phdata,path_home); | 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)); | memset(¤t_voice_selected,0,sizeof(current_voice_selected)); | ||||
SetVoiceStack(NULL, ""); | SetVoiceStack(NULL, ""); |
#include "translate.h" | #include "translate.h" | ||||
#include "wave.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.36 20.Feb.13"; | |||||
const int version_phdata = 0x014636; | |||||
int option_device_number = -1; | int option_device_number = -1; | ||||
FILE *f_logespeak = NULL; | FILE *f_logespeak = NULL; | ||||
} // end of ReadPhFile | } // end of ReadPhFile | ||||
int LoadPhData() | |||||
{//============= | |||||
int LoadPhData(int *srate) | |||||
{//======================== | |||||
int ix; | int ix; | ||||
int n_phonemes; | int n_phonemes; | ||||
int version; | int version; | ||||
int result = 1; | int result = 1; | ||||
int length; | int length; | ||||
int rate; | |||||
unsigned char *p; | unsigned char *p; | ||||
int *pw; | int *pw; | ||||
return(-1); | return(-1); | ||||
if((tunes = (TUNE *)ReadPhFile((void *)(tunes),"intonations",&length)) == NULL) | if((tunes = (TUNE *)ReadPhFile((void *)(tunes),"intonations",&length)) == NULL) | ||||
return(-1); | return(-1); | ||||
wavefile_data = (unsigned char *)phondata_ptr; | |||||
wavefile_data = (unsigned char *)phondata_ptr; | |||||
n_tunes = length / sizeof(TUNE); | 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++) | for(ix=0; ix<4; ix++) | ||||
{ | { | ||||
version += (wavefile_data[ix] << (ix*8)); | version += (wavefile_data[ix] << (ix*8)); | ||||
rate += (wavefile_data[ix+4] << (ix*8)); | |||||
} | } | ||||
if(version != version_phdata) | if(version != version_phdata) | ||||
if(phoneme_tab_number >= n_phoneme_tables) | if(phoneme_tab_number >= n_phoneme_tables) | ||||
phoneme_tab_number = 0; | phoneme_tab_number = 0; | ||||
if(srate != NULL) | |||||
*srate = rate; | |||||
return(result); | return(result); | ||||
} // end of LoadPhData | } // end of LoadPhData | ||||
phdata->pd_param[i_LENGTH_MOD] = ph->length_mod; | phdata->pd_param[i_LENGTH_MOD] = ph->length_mod; | ||||
if(ph->program == 0) | if(ph->program == 0) | ||||
{ | |||||
return; | return; | ||||
} | |||||
end_flag = 0; | end_flag = 0; | ||||
memcpy(&worddata->prev_vowel, &plist[0], sizeof(PHONEME_LIST)); | memcpy(&worddata->prev_vowel, &plist[0], sizeof(PHONEME_LIST)); | ||||
} | } | ||||
#ifdef _ESPEAKEDIT | |||||
plist->std_length = phdata->pd_param[i_SET_LENGTH]; | 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 | } // end of InterpretPhoneme | ||||
/*************************************************************************** | /*************************************************************************** | ||||
* Copyright (C) 2005 to 2010 by Jonathan Duddington * | |||||
* Copyright (C) 2005 to 2013 by Jonathan Duddington * | |||||
* email: [email protected] * | * email: [email protected] * | ||||
* * | * * | ||||
* This program is free software; you can redistribute it and/or modify * | * This program is free software; you can redistribute it and/or modify * | ||||
// list of phonemes in a clause | // list of phonemes in a clause | ||||
int n_phoneme_list=0; | int n_phoneme_list=0; | ||||
PHONEME_LIST phoneme_list[N_PHONEME_LIST]; | |||||
PHONEME_LIST phoneme_list[N_PHONEME_LIST+1]; | |||||
int mbrola_delay; | int mbrola_delay; | ||||
char mbrola_name[20]; | char mbrola_name[20]; | ||||
prev = &phoneme_list[ix-1]; | prev = &phoneme_list[ix-1]; | ||||
next = &phoneme_list[ix+1]; | next = &phoneme_list[ix+1]; | ||||
next2 = &phoneme_list[ix+2]; | next2 = &phoneme_list[ix+2]; | ||||
if(next2->ph == NULL) | |||||
break; | |||||
if(p->synthflags & SFLAG_EMBEDDED) | if(p->synthflags & SFLAG_EMBEDDED) | ||||
{ | { | ||||
{ | { | ||||
case phPAUSE: | case phPAUSE: | ||||
DoPause(p->length,0); | DoPause(p->length,0); | ||||
#ifdef _ESPEAKEDIT | |||||
p->std_length = p->ph->std_length; | |||||
#endif | |||||
break; | break; | ||||
case phSTOP: | case phSTOP: |
/*************************************************************************** | /*************************************************************************** | ||||
* Copyright (C) 2005 to 2007 by Jonathan Duddington * | |||||
* Copyright (C) 2005 to 2013 by Jonathan Duddington * | |||||
* email: [email protected] * | * email: [email protected] * | ||||
* * | * * | ||||
* This program is free software; you can redistribute it and/or modify * | * This program is free software; you can redistribute it and/or modify * | ||||
unsigned char newword; // bit 0=start of word, bit 1=end of clause, bit 2=start of sentence | unsigned char newword; // bit 0=start of word, bit 1=end of clause, bit 2=start of sentence | ||||
unsigned char pitch1; | unsigned char pitch1; | ||||
unsigned char pitch2; | unsigned char pitch2; | ||||
#ifdef _ESPEAKEDIT | |||||
unsigned char std_length; | unsigned char std_length; | ||||
unsigned int phontab_addr; | |||||
#endif | |||||
} PHONEME_LIST; | } PHONEME_LIST; | ||||
// list of phonemes in a clause | // list of phonemes in a clause | ||||
extern int n_phoneme_list; | 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 int embedded_list[]; | ||||
extern unsigned char env_fall[128]; | extern unsigned char env_fall[128]; | ||||
frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, int *n_frames, PHONEME_LIST *plist); | frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, int *n_frames, PHONEME_LIST *plist); | ||||
unsigned char *LookupEnvelope(int ix); | unsigned char *LookupEnvelope(int ix); | ||||
int LoadPhData(); | |||||
int LoadPhData(int *srate); | |||||
void SynthesizeInit(void); | void SynthesizeInit(void); | ||||
int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume); | int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume); |
} | } | ||||
MakePhonemeList(tr, clause_pause, new_sentence); | 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 | if(embedded_count) // ???? is this needed | ||||
{ | { |
/*************************************************************************** | /*************************************************************************** | ||||
* Copyright (C) 2005 to 2007 by Jonathan Duddington * | |||||
* Copyright (C) 2005 to 2013 by Jonathan Duddington * | |||||
* email: [email protected] * | * email: [email protected] * | ||||
* * | * * | ||||
* This program is free software; you can redistribute it and/or modify * | * This program is free software; you can redistribute it and/or modify * | ||||
if((n_ph_list + n_phoneme_list) >= N_PH_LIST) | 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); | memcpy(&ph_list[n_ph_list],phoneme_list,sizeof(PHONEME_LIST)*n_phoneme_list); | ||||
n_ph_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(); | t_phonetic->Clear(); | ||||
if(option_phonemes == 2) | if(option_phonemes == 2) | ||||
{ | { |