Browse Source

[1.46.36]

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-fd96e6ae7743
master
jonsd 12 years ago
parent
commit
9172b74343

+ 6
- 6
dictsource/dict_phonemes View File

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

+ 2
- 0
dictsource/en_list View File

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

+ 9
- 4
dictsource/en_rules View File

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@

+ 1323
- 1323
dictsource/pt_list
File diff suppressed because it is too large
View File


+ 1068
- 1045
dictsource/pt_rules
File diff suppressed because it is too large
View File


+ 758
- 740
dictsource/vi_rules
File diff suppressed because it is too large
View File


+ 1
- 1
espeak-data/voices/en/en-us View File



replace 03 I i replace 03 I i
replace 03 I2 i replace 03 I2 i
replace 03 @ @/

+ 46
- 44
phsource/compile_report View File

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

BIN
phsource/n/nri View File


BIN
phsource/n/nro View File


BIN
phsource/n/nru View File


+ 4
- 7
phsource/ph_english_us View File

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 #@

+ 5
- 8
phsource/ph_pt_brazil View File

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

+ 16
- 6
phsource/ph_vietnam View File

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

+ 6
- 7
phsource/phonemes View File

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




BIN
phsource/vdiph2/uw_6 View File


BIN
phsource/vowel/oe View File


+ 4
- 2
platforms/big_endian/espeak-phoneme-data.c View File



// 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))

+ 1
- 0
platforms/windows/espeakedit/src/speech.h View File

#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

+ 1
- 0
platforms/windows/espeakedit/src_copy/speech.h View File

#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

+ 93
- 50
src/compiledata.cpp View File

#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");
}
} }



+ 0
- 4
src/dictionary.cpp View File



// 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]);

+ 28
- 12
src/espeakedit.cpp View File

#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:

+ 20
- 20
src/extras.cpp View File

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))
{ {

+ 1
- 0
src/main.h View File



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,

+ 2
- 1
src/menus.cpp View File

/*************************************************************************** /***************************************************************************
* 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();

+ 26
- 26
src/numbers.cpp View File

/*************************************************************************** /***************************************************************************
* 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);
}
}
} }
} }



+ 7
- 14
src/options.cpp View File

/*************************************************************************** /***************************************************************************
* 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"));

+ 88
- 3
src/prosodydisplay.cpp View File

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);
} }


+ 1
- 8
src/readclause.cpp View File

{ {
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;

+ 4
- 3
src/speak.cpp View File

/*************************************************************************** /***************************************************************************
* 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();

+ 4
- 2
src/speak_lib.cpp View File

{//=============================== {//===============================
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(&current_voice_selected,0,sizeof(current_voice_selected)); memset(&current_voice_selected,0,sizeof(current_voice_selected));
SetVoiceStack(NULL, ""); SetVoiceStack(NULL, "");

+ 20
- 7
src/synthdata.cpp View File

#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





+ 7
- 2
src/synthesize.cpp View File

/*************************************************************************** /***************************************************************************
* 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:

+ 6
- 3
src/synthesize.h View File

/*************************************************************************** /***************************************************************************
* 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);

+ 2
- 0
src/translate.cpp View File

} }


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
{ {

+ 4
- 2
src/transldlg.cpp View File

/*************************************************************************** /***************************************************************************
* 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)
{ {

Loading…
Cancel
Save