lang=bs,hr,sr: fix for million numbers lang=fa, treat ZLNJ character as hyphen Dictionary changes to lang=pt git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@287 d46cf337-b52f-0410-862d-fd96e6ae7743master
@@ -175,7 +175,7 @@ l m n N p R s t | |||
T v x z | |||
Dictionary hbs_dict 2008-12-17 | |||
Dictionary hbs_dict 2012-08-08 | |||
& @ @2 a A a: aI aU | |||
e E e: i I i: l- o | |||
@@ -375,7 +375,7 @@ S s; S; t t; tS ts tS; | |||
ts; v w x z Z Z; | |||
Dictionary pt_dict 2012-07-25 | |||
Dictionary pt_dict 2012-08-08 | |||
& &/ &U~ &~ @ @- a A | |||
aI aU e E eI EI eU EU |
@@ -216,6 +216,7 @@ _tld t'ild& | |||
?2 _3C tR'ist'a_ | |||
?2 _4C tSetR'ist'o_ | |||
_6C S'Est'o | |||
_0M1 t'isUtS;& | |||
_0MA1 t'isUtS;e | |||
_1M1 t'isUtS;U | |||
@@ -226,22 +227,26 @@ _tld t'ild& | |||
?3 _0M1 h'il^ad& | |||
?3 _0MA1 h'il^ade | |||
?3 _1M1 h'il^adU | |||
_0M2 m'ilijUna | |||
_0MA2 m'ilijUna | |||
_1M2 m'ilijUn | |||
?4 _0M2 m'ilijOna | |||
?4 _0MA2 m'ilijOna | |||
?4 _1M2 m'ilijOn | |||
_0M3 m'iliaRdI | |||
_0MA3 m'iliaRde | |||
_1M3 m'iliaRdU | |||
?2 _0M3 milijArdI | |||
?2 _0MA3 milijArde | |||
?2 _1M3 milijArdU | |||
_0M4 b'ilijUna | |||
_1M4 b'ilijUn | |||
?4 _0M4 b'ilijOna | |||
?4 _1M4 b'ilijOn | |||
_dpt _:z'a*Ez_ | |||
_roman r*'imsko | |||
@@ -646,46 +646,79 @@ governo gov'ernU $noun | |||
acerto $alt2 $noun | |||
adore $alt | |||
albatrozes $alt | |||
alferes $alt | |||
algozes $alt | |||
atrozes $alt | |||
ameba $alt | |||
belo $alt | |||
besta $alt2 | |||
boca $alt2 | |||
bolo $alt2 | |||
borboleta $alt2 | |||
bordo $alt | |||
cabeça $alt2 | |||
casebre $alt | |||
catorze $alt2 | |||
cerca $alt $verb | |||
cerco $alt $verb | |||
chamego $alt2 | |||
chefe $alt | |||
chinelo $alt | |||
coco $alt2 | |||
começo $alt2 $noun | |||
comeres $alt2 | |||
conheço $alt2 | |||
copa $alt | |||
copo $alt | |||
cornos $alt | |||
corpos $alt | |||
corto $alt | |||
corvos $alt | |||
coto $alt2 | |||
couber $alt | |||
couberem $alt | |||
couberdes $alt | |||
couberes $alt | |||
der $alt | |||
descova $alt2 | |||
desfecho $alt2 | |||
dez $alt | |||
doce $alt2 | |||
descova $alt2 | |||
droga $alt | |||
enumerem $alt | |||
erro $alt2 $noun | |||
esforços $alt | |||
esperma $alt | |||
estrofe $alt | |||
estiverdes $alt | |||
estiveres $alt | |||
farofa $alt | |||
fere $alt | |||
ferem $alt | |||
fezes $alt | |||
fizer $alt | |||
fizerem $alt | |||
fizerdes $alt | |||
fizeres $alt | |||
fogos $alt | |||
fores $alt2 | |||
fosse $alt2 | |||
fossem $alt2 | |||
foste $alt2 | |||
frevo $alt2 | |||
gelo $alt $verb | |||
germe $alt | |||
grego $alt2 | |||
groselha $alt | |||
grosso $alt2 | |||
grozo $alt $verb | |||
hoje $alt2 | |||
joga $alt | |||
jogam $alt | |||
jogos $alt | |||
jogue $alt | |||
joguem $alt | |||
líderes $alt2 | |||
lopes $alt | |||
mantiverdes $alt | |||
@@ -693,8 +726,12 @@ mantiveres $alt | |||
mexa m'eS& | |||
mexi meS'i | |||
mexo m'eSU | |||
miolo $alt2 | |||
modo $alt | |||
modos $alt | |||
molho $alt $verb | |||
morcego $alt2 | |||
morda $alt2 | |||
mortos $alt | |||
?2 mulher mulj'Er | |||
?4 mulher mul^'Er | |||
@@ -702,17 +739,25 @@ mui mwi | |||
muito mw'iNtU // -s is included as a suffix | |||
muita mw'iNt& | |||
mulheres $alt | |||
negro $alt2 | |||
novos $alt | |||
onu $1 | |||
opereta $alt2 | |||
osso $alt2 | |||
ovos $alt | |||
paexa paeSa | |||
pedra $alt | |||
pelego $alt2 | |||
perdem $alt | |||
perede $alt2 | |||
pesa $alt | |||
pesam $alt | |||
pesque $alt | |||
pesquem $alt | |||
peso $alt | |||
peso $alt2 $noun | |||
portos $alt | |||
pose $alt2 | |||
povos $alt | |||
preto $alt2 | |||
profere $alt | |||
@@ -726,13 +771,15 @@ rogas $alt | |||
selvagem seUv'aZeIN | |||
soco $alt2 | |||
sofrem $alt | |||
sofres $alt | |||
sofre $alt | |||
sofreste $alt2 | |||
sopre $alt | |||
soprem $alt | |||
souber $alt | |||
souberdes $alt | |||
souberes $alt | |||
souberem $alt | |||
sugere $alt | |||
sugerem $alt | |||
suor swOr | |||
tapete $alt2 | |||
@@ -740,12 +787,17 @@ teta $alt2 | |||
tiver $alt | |||
tiveres $alt | |||
torres $alt2 | |||
tortos $alt | |||
travesso $alt2 | |||
trevo $alt2 | |||
troco $alt2 $noun | |||
tropeço $alt2 $noun | |||
vanessa $alt2 | |||
verbo $alt | |||
verme $alt | |||
vierem $alt | |||
violeta $alt2 | |||
vozes $alt | |||
// Close [o] | |||
?1 calculadora $alt2 |
@@ -14,6 +14,10 @@ | |||
// G a voiced consonant | |||
// K not a vowel | |||
// endings | |||
.L01 a am o | |||
.L02 a am e em o | |||
.group a | |||
_) a (_ a | |||
_) a (_W 'a // in an acronym | |||
@@ -330,6 +334,16 @@ | |||
?1 v) e (l_ ,E // eg: possível, amovível, disponível, etc... | |||
?1 l) e (ta 'E // eg: bicicleta, atleta. | |||
_com) e (tL01_ e | |||
_prom) e (tL01_ e | |||
_esqu) e (çL01_ e | |||
_derr) e (tL01_ e | |||
_atr) e (vL01_ e | |||
_f) e (rvL01_ e | |||
_per) e (çL01_ e | |||
_pad) e (çL01_ e | |||
_dec) e (pL02_ E | |||
_p) e (scL01_ E | |||
.group é | |||
é ''E | |||
@@ -614,6 +628,8 @@ | |||
?1 f) o (rmulá u // eg: formulário, formulários. | |||
?1 v) o (lt O | |||
_m) o (lhL02_ O | |||
.group ô | |||
ô ''o |
@@ -80,7 +80,7 @@ consonants 10 116 | |||
bo 10 152 | |||
kk 20 117 | |||
fa 9 110 | |||
ga 25 125 | |||
ga 21 125 | |||
Data file Used by | |||
b/b [b] base | |||
@@ -118,7 +118,6 @@ d/d [d] base | |||
[d] hr | |||
[d] sq | |||
[d] mt | |||
[d[] ga | |||
d/d_ [d] base | |||
[d[] base | |||
[d] base2 | |||
@@ -136,7 +135,6 @@ d/d_ [d] base | |||
[d] hr | |||
[d] sq | |||
[d] mt | |||
[d[] ga | |||
d/d_dnt [d] sr | |||
d/dr [*] base | |||
[d[] base | |||
@@ -156,7 +154,6 @@ d/dr [*] base | |||
[d] hr | |||
[d] sq | |||
[d] mt | |||
[d[] ga | |||
d/tap [*;] ro | |||
d/tap1 [*] base | |||
d/tap2 [t#] en | |||
@@ -182,7 +179,6 @@ d/xd [d] base | |||
[d] mt | |||
[dz] bo | |||
[dzh] bo | |||
[d[] ga | |||
d/xd3 [dh] hi | |||
d/xd_pzd [d^] et | |||
[d;] lt | |||
@@ -418,7 +414,7 @@ l/l_ [l] base | |||
[l/] fr | |||
l/l_@ [l/3] base | |||
[l/] fr | |||
l/l@ [höx] base | |||
l/l@ [hF{] base | |||
[l#] base | |||
[l] fr | |||
[l/2] fr | |||
@@ -452,7 +448,7 @@ l/L2_oL [l/2] base | |||
l/L2_uL [l/2] base | |||
l/l_3 [l/] de | |||
l/l_4 [ll] sq | |||
l/la [höx] base | |||
l/la [hF{] base | |||
[l#] base | |||
[l] fr | |||
[l/2] fr | |||
@@ -460,7 +456,7 @@ l/la [h | |||
[K] tn | |||
l/l_a [l/3] base | |||
[l/] fr | |||
l/le [höx] base | |||
l/le [hF{] base | |||
[l#] base | |||
[l] fr | |||
[l/2] fr | |||
@@ -472,7 +468,7 @@ l/L_eL_af [&] af | |||
[&:] af | |||
l/l_front [L] sq | |||
l/l_front_ [l/4] sq | |||
l/li [höx] base | |||
l/li [hF{] base | |||
[l#] base | |||
[l] fr | |||
[l/2] fr | |||
@@ -486,7 +482,7 @@ ll/ll [L] bg | |||
ll/_ll [L] bg | |||
l/l_long [l] base | |||
[l] fr | |||
l/lo [höx] base | |||
l/lo [hF{] base | |||
[l#] base | |||
[l/2] fr | |||
[K] nso | |||
@@ -497,7 +493,7 @@ l^/l_rfx [l.] base | |||
[l;] lt | |||
[l] ru | |||
[l^] ru | |||
l/lu [höx] base | |||
l/lu [hF{] base | |||
[l#] base | |||
[l] fr | |||
[l/2] fr | |||
@@ -813,14 +809,12 @@ ufric/tlh [K] nso | |||
[K] tn | |||
ufric/x [x] base | |||
[kh] vi | |||
[x] ga | |||
ufric/x2 [x2] af | |||
[x] ku | |||
[X] kk | |||
ufric/x_hr [x] base | |||
[x] hr | |||
[x] ru | |||
[x] ga | |||
ufric/x_sr [h#] sr | |||
[x#] sr | |||
ufric/xx [X] base | |||
@@ -951,14 +945,12 @@ ustop/t_dnt [t] base | |||
[t] lt | |||
[t] pl | |||
[t] hr | |||
[t[] ga | |||
ustop/t_dnt2 [t] base2 | |||
[d] kn | |||
ustop/t_hi [t[] base | |||
[t] et | |||
[t^] et | |||
[t`] am | |||
[t[] ga | |||
ustop/t_pzd [c] base | |||
[t^] et | |||
[t;] lt | |||
@@ -1046,6 +1038,7 @@ vdiph2/eo [eo] ro | |||
vdiph2/e_u [e[u] ro | |||
vdiph2/i@ [i@] en-n | |||
[i@] hy | |||
[i@] ga | |||
vdiph2/i@_2 [i@] en-wm | |||
vdiph2/ie [i@] en-wi | |||
[ie] fi | |||
@@ -1077,6 +1070,7 @@ vdiph2/oa [Oa] ro | |||
vdiph2/o_oo [o@] en-wi | |||
[O:] is | |||
[o] zh | |||
vdiph2/u@ [u@] ga | |||
vdiph2/u#@ [U@] en-sc | |||
vdiph2/uaa [uo] lt | |||
[uo] lv | |||
@@ -1231,6 +1225,7 @@ vdiph/eu_2 [eu] fi | |||
vdiph/@i [Yi] et | |||
[@I] vi | |||
[@:I] vi | |||
[@I] ga | |||
vdiph/&i [&i] fi | |||
[&i] et | |||
[aI] hi | |||
@@ -1290,6 +1285,7 @@ vdiph/@u [u:] en-wm | |||
[@:U] vi | |||
vdiph/@u_2 [oU] en-rp | |||
vdiph/@u_3 [@U] ro | |||
[@U] ga | |||
vdiph/@u_en [oU] en | |||
[@U] id | |||
vdiph/ui [uI] base2 | |||
@@ -1450,6 +1446,11 @@ vowel/@ [@] base | |||
[@] wo | |||
[@:] wo | |||
[@] te | |||
[@] ga | |||
[E#] ga | |||
[I#] ga | |||
[O#] ga | |||
[U#] ga | |||
vowel/@- [@-] base | |||
[r*] hr | |||
vowel/& [a] en-rp | |||
@@ -1610,6 +1611,7 @@ vowel/a#_3 [a#] en | |||
[a] sq | |||
[a/] sq | |||
[3] da | |||
[a#] ga | |||
vowel/a_4 [a] es | |||
[a] el | |||
[a] vi | |||
@@ -1653,10 +1655,6 @@ vowel/aa_2 [A:] en | |||
[A] zh | |||
[A@] tn | |||
[A:] ga | |||
[A0:] ga | |||
[A1:] ga | |||
[A9:] ga | |||
[0A:] ga | |||
vowel/aa_3 [A:] af | |||
[A] sq | |||
[A] prs | |||
@@ -1673,7 +1671,6 @@ vowel/aa_8 [0] en-us | |||
[A1] et | |||
[A] nl | |||
[a:] is | |||
[0] ga | |||
vowel/aa_9 [a] fi | |||
[a] et | |||
[a:] hi | |||
@@ -1782,7 +1779,6 @@ vowel/ee_5 [E] en | |||
[E] wo | |||
[E:] wo | |||
[E] tn | |||
[E] ga | |||
vowel/ee_6 [&] sk | |||
[E3] sv | |||
[E] ku | |||
@@ -1820,6 +1816,7 @@ vowel/e_mid [E] en-rp | |||
[E] prs | |||
[E] ht | |||
[e] si | |||
[E] ga | |||
vowel/e_mid2 [E] af | |||
[E] de | |||
[E2] de | |||
@@ -2001,7 +1998,6 @@ vowel/ii_6 [I] en-wm | |||
[i] wo | |||
vowel/ii_7 [i] en | |||
[i] sq | |||
[i] ga | |||
vowel/ii_8 [i] kk | |||
vowel/ii_final [i] en-us | |||
[i] en-rp | |||
@@ -2058,8 +2054,6 @@ vowel/o [o] base2 | |||
[o] te | |||
[o:] te | |||
[o] bo | |||
[o2] ga | |||
[o3] ga | |||
[o:] ga | |||
vowel/o_2 [o:] cy | |||
[o:] hi | |||
@@ -2118,7 +2112,6 @@ vowel/oo [o] base | |||
[o] prs | |||
[O] wo | |||
[O:] wo | |||
[O] ga | |||
vowel/oo_1 [O:] en-n | |||
[O:] en-rp | |||
[O@] en-rp | |||
@@ -2157,6 +2150,7 @@ vowel/oo_4 [O] base2 | |||
[O:] hi | |||
[O] it | |||
[O] pa | |||
[O] ga | |||
vowel/oo_5 [O] pl | |||
[O] is | |||
[O] sq | |||
@@ -2200,8 +2194,6 @@ vowel/u [u] base | |||
[u] ak | |||
[u:] wo | |||
[u] bo | |||
[u1] ga | |||
[u:] ga | |||
vowel/u# [u:] en-sc | |||
[Y] tr | |||
vowel/u_2 [u1] fi | |||
@@ -2273,6 +2265,7 @@ vowel/u_bck [u] base2 | |||
[u] ne | |||
[u] pa | |||
[u] mt | |||
[u:] ga | |||
vowel/u_bck2 [u] et | |||
[u] fr | |||
[u:] fr | |||
@@ -2280,13 +2273,13 @@ vowel/u_bck2 [u] et | |||
[u] es | |||
[u] ht | |||
[u] fa | |||
[U] ga | |||
vowel/u_bck3 [u:] et | |||
[u] kk | |||
vowel/uu [U] en | |||
[U] en-n | |||
[U] en-wm | |||
[U] tn | |||
[U] ga | |||
vowel/uu# [U] ku | |||
vowel/uu_2 [U] base2 | |||
[U] de | |||
@@ -2325,7 +2318,6 @@ vowel/V_3 [V] en-rp | |||
[V] pa | |||
vowel/V_4 [V] en-sc | |||
[V] da | |||
[V] ga | |||
vowel/V_6 [V] en-us | |||
[a#] lv | |||
vowel/y [y] base2 | |||
@@ -2381,11 +2373,9 @@ vowel/yy_4 [y] de | |||
[yI] is | |||
[y] hy | |||
vwl_af/@ [@] af | |||
[@] ga | |||
vwl_af/I [I] af | |||
vwl_af/r@ [@] af | |||
[I] af | |||
[@] ga | |||
vwl_de/uu_@ [UR] de | |||
vwl_en/aI@ [aI@] en | |||
[aI@] en-n | |||
@@ -2598,7 +2588,6 @@ x/d_ [d] base | |||
[d] is | |||
[d] sq | |||
[d] mt | |||
[d[] ga | |||
x/d_dnt [d[] base | |||
[d] base2 | |||
[d] fi | |||
@@ -2608,7 +2597,6 @@ x/d_dnt [d[] base | |||
[d] lt | |||
[d] pl | |||
[d] mt | |||
[d[] ga | |||
x/d_pzd [d^] et | |||
[d;] lt | |||
[d;] pl |
@@ -57,12 +57,14 @@ extern void RiscosOpenSound(); | |||
extern int WcmdqUsed(); | |||
extern void FreePhData(); | |||
extern void FreeDictionary(); | |||
extern void Write4Bytes(FILE *f, int value); | |||
extern int wcmdq_head; | |||
extern int wcmdq_tail; | |||
extern int current_source_index; | |||
FILE *f_text; | |||
FILE *f_wave = NULL; | |||
int (* uri_callback)(int, const char *, const char *) = NULL; | |||
int (* phoneme_callback)(const char *) = NULL; | |||
@@ -74,6 +76,7 @@ char textbuffile[L_tmpnam]; | |||
int sample_rate_index; // current value | |||
int current_voice_num=0; | |||
int n_voice_files = 0; | |||
int n_voice_variant_files = 0; | |||
// output sound buffer, 2 bytes per sample | |||
static unsigned short SoundBuf[4096]; | |||
@@ -82,7 +85,9 @@ static int callback_inhibit = 0; | |||
static int more_text=0; | |||
#define N_VOICE_NAMES 60 | |||
static char *voice_names[40]; | |||
#define N_VOICE_VARIANT_NAMES 30 | |||
static char *voice_names[N_VOICE_NAMES]; | |||
static char *voice_variant_names[N_VOICE_VARIANT_NAMES]; | |||
#define N_STATIC_BUF 8000 | |||
static char static_buf[N_STATIC_BUF]; | |||
@@ -108,7 +113,7 @@ static const char *help_text = | |||
"-p <integer>\n" | |||
"\t Pitch adjustment, 0 to 99, default is 50\n" | |||
"-s <integer>\n" | |||
"\t Speed in words per minute 80 to 370, default is 170\n" | |||
"\t Speed in words per minute 80 to 390, default is 170\n" | |||
"-v <voice name>\n" | |||
"\t Use voice file of this name from espeak-data/voices\n" | |||
"-w <wave file name>\n" | |||
@@ -125,9 +130,9 @@ static const char *help_text = | |||
"--punct=\"<characters>\"\n" | |||
"\t Speak the names of punctuation characters during speaking. If\n" | |||
"\t =<characters> is omitted, all punctuation is spoken.\n" | |||
//"--voices=<langauge>\n" | |||
//"\t List the available voices for the specified language.\n" | |||
//"\t If <language> is omitted, then list all voices.\n" | |||
"--voices=<language>\n" | |||
"\t List the available voices for the specified language.\n" | |||
"\t If <language> is omitted, then list all voices.\n" | |||
"-k <integer>\n" | |||
"\t Indicate capital letters with: 1=sound, 2=the word \"capitals\",\n" | |||
"\t higher values = a pitch increase (try -k20).\n"; | |||
@@ -163,10 +168,14 @@ int GetFileLength(const char *filename) | |||
} /* end of GetFileLength */ | |||
void MarkerEvent(int type, unsigned int char_position, int value, int value2, unsigned char *out_ptr) | |||
{ | |||
} | |||
void ReadVoiceNames2(char *directory) | |||
{//================================== | |||
int len; | |||
int path_len; | |||
int *type; | |||
char *p; | |||
_kernel_swi_regs regs; | |||
@@ -182,6 +191,8 @@ void ReadVoiceNames2(char *directory) | |||
regs.r[5] = sizeof(buf); | |||
regs.r[6] = 0; | |||
path_len = strlen(directory); | |||
while(regs.r[3] > 0) | |||
{ | |||
error = _kernel_swi(0x0c+os_X,®s,®s); /* OS_GBPB 10, read directory entries */ | |||
@@ -200,11 +211,21 @@ void ReadVoiceNames2(char *directory) | |||
} | |||
else | |||
{ | |||
p = Alloc(len+1); | |||
p = (char *)malloc(len+1); | |||
strcpy(p,&buf[20]); | |||
voice_names[n_voice_files++] = p; | |||
if(n_voice_files >= (N_VOICE_NAMES-1)) | |||
break; | |||
if(strcmp(&directory[path_len-3],".!v")==0) | |||
{ | |||
if(n_voice_variant_files >= (N_VOICE_VARIANT_NAMES-1)) | |||
continue; | |||
voice_variant_names[n_voice_variant_files++] = p; | |||
} | |||
else | |||
{ | |||
if(n_voice_files >= (N_VOICE_NAMES-1)) | |||
continue; | |||
voice_names[n_voice_files++] = p; | |||
} | |||
} | |||
} | |||
} | |||
@@ -214,13 +235,15 @@ void ReadVoiceNames() | |||
{//=================== | |||
char directory[sizeof(path_home)+10]; | |||
for(n_voice_files=0; n_voice_files<N_VOICE_NAMES; n_voice_files++) | |||
voice_names[n_voice_files] = NULL; | |||
n_voice_files = 0; | |||
n_voice_variant_files = 0; | |||
sprintf(directory,"%s.voices",path_home); | |||
ReadVoiceNames2(directory); | |||
voice_names[n_voice_files] = NULL; | |||
voice_variant_names[n_voice_variant_files] = NULL; | |||
} | |||
@@ -272,12 +295,90 @@ void Free(void **ptr) | |||
#endif | |||
static int OpenWaveFile(const char *path, int rate) | |||
//================================================= | |||
{ | |||
// Set the length of 0x7fffffff for --stdout | |||
// This will be changed to the correct length for -w (write to file) | |||
static unsigned char wave_hdr[44] = { | |||
'R','I','F','F',0,0,0,0,'W','A','V','E','f','m','t',' ', | |||
0x10,0,0,0,1,0,1,0, 9,0x3d,0,0,0x12,0x7a,0,0, | |||
2,0,0x10,0,'d','a','t','a', 0xff,0xff,0xff,0x7f}; | |||
if(path == NULL) | |||
return(2); | |||
if(strcmp(path,"stdout")==0) | |||
f_wave = stdout; | |||
else | |||
f_wave = fopen(path,"wb"); | |||
if(f_wave != NULL) | |||
{ | |||
fwrite(wave_hdr,1,24,f_wave); | |||
Write4Bytes(f_wave,rate); | |||
Write4Bytes(f_wave,rate * 2); | |||
fwrite(&wave_hdr[32],1,12,f_wave); | |||
return(0); | |||
} | |||
return(1); | |||
} // end of OpenWaveFile | |||
static void CloseWaveFile(int rate) | |||
//================================= | |||
{ | |||
unsigned int pos; | |||
if((f_wave == NULL) || (f_wave == stdout)) | |||
return; | |||
fflush(f_wave); | |||
pos = ftell(f_wave); | |||
fseek(f_wave,4,SEEK_SET); | |||
Write4Bytes(f_wave,pos - 8); | |||
fseek(f_wave,40,SEEK_SET); | |||
Write4Bytes(f_wave,pos - 44); | |||
fclose(f_wave); | |||
f_wave = NULL; | |||
} // end of CloseWaveFile | |||
void MarkerEvent(int type, unsigned int char_position, int value, unsigned char *out_ptr) | |||
{//====================================================================================== | |||
// Do nothing in the command-line version. | |||
} // end of MarkerEvent | |||
static int WavegenFile(void) | |||
{//========================= | |||
int finished; | |||
unsigned char wav_outbuf[1024]; | |||
out_ptr = out_start = wav_outbuf; | |||
out_end = wav_outbuf + sizeof(wav_outbuf); | |||
finished = WavegenFill(0); | |||
if(f_wave != NULL) | |||
{ | |||
fwrite(wav_outbuf, 1, out_ptr - wav_outbuf, f_wave); | |||
} | |||
return(finished); | |||
} // end of WavegenFile | |||
void FillSoundBuf(int size) | |||
@@ -314,7 +415,7 @@ int initialise(void) | |||
WavegenInit(22050,0); | |||
LoadPhData(); | |||
SetVoiceStack(NULL); | |||
SetVoiceStack(NULL, ""); | |||
SynthesizeInit(); | |||
return(0); | |||
} | |||
@@ -335,6 +436,7 @@ void speak_text_string(char *data, int terminator, int len, int wait, int voice_ | |||
regs.r[1] = (int)module_data; | |||
_kernel_swi(0x5f, ®s, ®s); | |||
option_endpause = 1; | |||
if((voice_num >= 0) && (voice_num != current_voice_num) && (voice_num < N_VOICE_NAMES)) | |||
{ | |||
@@ -465,7 +567,6 @@ void set_say_options(int reg2, int reg3) | |||
option_linelength = 0; | |||
option_phonemes = 0; | |||
option_waveout = 0; | |||
option_harmonic1 = 8; | |||
option_multibyte = 0; // auto | |||
option_capitals = 0; | |||
option_punctuation = 0; | |||
@@ -477,10 +578,13 @@ void set_say_options(int reg2, int reg3) | |||
void jsd_swi_functions(int *r) | |||
/****************************/ | |||
{ | |||
espeak_VOICE voice_select; | |||
switch(r[0]) | |||
{ | |||
case 0: /* major version */ | |||
r[0] = 3; | |||
r[0] = 4; | |||
r[1] = 331; | |||
break; | |||
case 1: /* register user */ | |||
@@ -499,6 +603,7 @@ void jsd_swi_functions(int *r) | |||
case 5: /* get table of voice names */ | |||
r[0] = (int)voice_names; | |||
r[1] = (int)voice_variant_names; | |||
break; | |||
case 6: /* update voice data, r1 = voice_number */ | |||
@@ -514,6 +619,15 @@ void jsd_swi_functions(int *r) | |||
// init_voice((char *)r[1]); | |||
break; | |||
case 8: | |||
// list voices, r[1] contains optional language name (or "variant") | |||
voice_select.languages = (char *)r[1]; | |||
voice_select.age = 0; | |||
voice_select.gender = 0; | |||
voice_select.name = NULL; | |||
r[0] = (int)espeak_ListVoices(&voice_select); | |||
break; | |||
default: | |||
r[0] = 0; | |||
r[1] = 0; | |||
@@ -529,8 +643,6 @@ _kernel_oserror *swi_handler(int swi_no, int *r, void *pw) | |||
{ | |||
int value; | |||
int q_length; | |||
int speed; | |||
int amp; | |||
value = r[0]; | |||
switch(swi_no) | |||
@@ -584,8 +696,7 @@ _kernel_oserror *swi_handler(int swi_no, int *r, void *pw) | |||
break; | |||
case 8: /* speed */ | |||
speed = (value * 160)/140; | |||
SetParameter(espeakRATE,speed,0); | |||
SetParameter(espeakRATE,value,0); | |||
break; | |||
case 9: /* word_gap */ | |||
@@ -601,8 +712,7 @@ _kernel_oserror *swi_handler(int swi_no, int *r, void *pw) | |||
break; | |||
case 13: /* volume */ | |||
amp = (value*45)/100; | |||
SetParameter(espeakVOLUME,amp,0); | |||
SetParameter(espeakVOLUME,value,0); | |||
WavegenSetVoice(voice); | |||
break; | |||
} | |||
@@ -614,7 +724,7 @@ _kernel_oserror *swi_handler(int swi_no, int *r, void *pw) | |||
void PitchAdjust(int pitch_adjustment) | |||
{//=================================== | |||
int ix, factor; | |||
extern unsigned char pitch_adjust_tab[MAX_PITCH_VALUE+1]; | |||
voice->pitch_base = (voice->pitch_base * pitch_adjust_tab[pitch_adjustment])/128; | |||
@@ -629,6 +739,72 @@ void PitchAdjust(int pitch_adjustment) | |||
void DisplayVoices(FILE *f_out, char *language) | |||
{//============================================ | |||
int ix; | |||
const char *p; | |||
int len; | |||
int count; | |||
int scores = 0; | |||
const espeak_VOICE *v; | |||
const char *lang_name; | |||
char age_buf[12]; | |||
const espeak_VOICE **voices; | |||
espeak_VOICE voice_select; | |||
static char genders[4] = {' ','M','F',' '}; | |||
if(language[0] == '=') | |||
{ | |||
// display only voices for the specified language, in order of priority | |||
voice_select.languages = &language[1]; | |||
voice_select.age = 0; | |||
voice_select.gender = 0; | |||
voice_select.name = NULL; | |||
voices = espeak_ListVoices(&voice_select); | |||
scores = 1; | |||
} | |||
else | |||
{ | |||
voices = espeak_ListVoices(NULL); | |||
} | |||
fprintf(f_out,"Pty Language Age/Gender VoiceName File Other Langs\n"); | |||
for(ix=0; (v = voices[ix]) != NULL; ix++) | |||
{ | |||
count = 0; | |||
p = v->languages; | |||
while(*p != 0) | |||
{ | |||
len = strlen(p+1); | |||
lang_name = p+1; | |||
if(v->age == 0) | |||
strcpy(age_buf," "); | |||
else | |||
sprintf(age_buf,"%3d",v->age); | |||
if(count==0) | |||
{ | |||
fprintf(f_out,"%2d %-12s%s%c %-17s %-11s ", | |||
p[0],lang_name,age_buf,genders[v->gender],v->name,v->identifier); | |||
} | |||
else | |||
{ | |||
fprintf(f_out,"(%s %d)",lang_name,p[0]); | |||
} | |||
count++; | |||
p += len+2; | |||
} | |||
// if(scores) | |||
// fprintf(f_out,"%3d ",v->score); | |||
fputc('\n',f_out); | |||
} | |||
} // end of DisplayVoices | |||
char *param_string(char **argp) | |||
{//============================ | |||
char *p; | |||
@@ -686,7 +862,6 @@ void command_line(char *arg_string, int wait) | |||
option_phonemes = 0; | |||
option_waveout = 0; | |||
option_quiet = 0; | |||
option_harmonic1 = 8; | |||
option_multibyte = 0; // auto | |||
option_capitals = 0; | |||
option_punctuation = 0; | |||
@@ -731,7 +906,7 @@ void command_line(char *arg_string, int wait) | |||
case 'm': | |||
option_ssml = 1; | |||
break; | |||
case 'p': | |||
pitch_adjustment = param_number(&p); | |||
break; | |||
@@ -762,7 +937,7 @@ void command_line(char *arg_string, int wait) | |||
wordgap = param_number(&p); | |||
SetParameter(espeakWORDGAP,wordgap,0); | |||
break; | |||
case 'v': | |||
strncpy0(voicename,param_string(&p),sizeof(voicename)); | |||
break; | |||
@@ -776,7 +951,13 @@ void command_line(char *arg_string, int wait) | |||
strncpy0(command,param_string(&p),sizeof(command)); | |||
if(memcmp(command,"compile=",8)==0) | |||
{ | |||
CompileDictionary(NULL,&command[8],NULL,NULL); | |||
CompileDictionary(NULL,&command[8],NULL,NULL,0); | |||
return; | |||
} | |||
else | |||
if(memcmp(command,"voices",6)==0) | |||
{ | |||
DisplayVoices(stdout,&command[6]); | |||
return; | |||
} | |||
else | |||
@@ -1075,7 +1256,7 @@ void terminate_module(void) | |||
{ | |||
RiscosCloseSound(); | |||
RemoveCallback(); | |||
delete translator; | |||
DeleteTranslator(translator); | |||
FreePhData(); | |||
} /* end of terminate_module */ | |||
@@ -1121,8 +1302,8 @@ _kernel_oserror *user_init(char *cmd_fail, int podule_base, void *pw) | |||
for(param=0; param<N_SPEECH_PARAM; param++) | |||
param_stack[0].parameter[param] = param_defaults[param]; | |||
SetParameter(espeakRATE,170,0); | |||
SetParameter(espeakVOLUME,65,0); | |||
SetParameter(espeakRATE,175,0); | |||
SetParameter(espeakVOLUME,70,0); | |||
WavegenSetVoice(voice); | |||
atexit(terminate_module); |
@@ -3,7 +3,7 @@ | |||
initialisation-code: user_init | |||
title-string: Speak | |||
help-string: Speak 3.30 Text to Speech (32 bit) | |||
help-string: Speak 3.46 Text to Speech (32 bit) | |||
swi-chunk-base-number: &4ad80 | |||
swi-handler-code: swi_handler |
@@ -28,6 +28,7 @@ | |||
//#define SPECT_EDITOR | |||
#define INCLUDE_KLATT | |||
#define INCLUDE_MBROLA | |||
#define INCLUDE_SONIC | |||
#include <windows.h> | |||
#define PLATFORM_WINDOWS |
@@ -28,6 +28,7 @@ | |||
//#define SPECT_EDITOR | |||
#define INCLUDE_KLATT | |||
#define INCLUDE_MBROLA | |||
#define INCLUDE_SONIC | |||
#include <windows.h> | |||
#define PLATFORM_WINDOWS |
@@ -36,6 +36,8 @@ | |||
#define NO_VARIADIC_MACROS | |||
#define INCLUDE_KLATT | |||
#define INCLUDE_MBROLA | |||
#define INCLUDE_SONIC | |||
// will look for espeak_data directory here, and also in user's home directory | |||
#define PATH_ESPEAK_DATA "/usr/share/espeak-data" |
@@ -39,6 +39,8 @@ | |||
#define LIBRARY | |||
#define INCLUDE_KLATT | |||
#define INCLUDE_MBROLA | |||
#define INCLUDE_SONIC | |||
// will look for espeak_data directory here, and also in user's home directory | |||
#define PATH_ESPEAK_DATA "/usr/share/espeak-data" |
@@ -41,6 +41,8 @@ | |||
//#define USE_NANOSLEEP | |||
#define INCLUDE_KLATT | |||
#define INCLUDE_MBROLA | |||
#define INCLUDE_SONIC | |||
// will look for espeak_data directory here, and also in user's home directory | |||
#define PATH_ESPEAK_DATA "/usr/share/espeak-data" |
@@ -984,39 +984,46 @@ int TranslateRoman(Translator *tr, char *word, char *ph_out, WORD_TAB *wtab) | |||
static const char *M_Variant(int value) | |||
{//==================================== | |||
// returns M, or perhaps MA for some cases | |||
// returns M, or perhaps MA or MB for some cases | |||
if(translator->translator_name == L('l','t')) | |||
int teens = 0; | |||
if(((value % 100) > 10) && ((value % 100) < 20)) | |||
teens = 1; | |||
switch((translator->langopts.numbers2 >> 6) & 0x7) | |||
{ | |||
// Lithuanian | |||
if((value % 10) == 1) | |||
case 1: // lang=ru use singular for xx1 except for x11 | |||
if((teens == 0) && ((value % 10) == 1)) | |||
return("1M"); | |||
break; | |||
case 2: // lang=cs,sk | |||
if((value >= 2) && (value <= 4)) | |||
return("0MA"); | |||
if(((value % 10) == 0) || ((value % 100) > 10) && ((value % 100) < 20)) | |||
{ | |||
return("0MB"); | |||
} | |||
return("0M"); | |||
} | |||
break; | |||
if((translator->langopts.numbers2 & 0x100) && (value >= 2) && (value <= 4)) | |||
return("0MA"); // Czech, Slovak | |||
else | |||
if(((value % 100) < 10) || ((value % 100) > 20)) // but not teens, 10 to 19 | |||
{ | |||
if ((translator->langopts.numbers2 & 0x40) && | |||
((value % 10)>=2) && | |||
((value % 10)<=4)) | |||
{ | |||
// for Polish language - two forms of plural! | |||
case 3: // lang=pl | |||
if((teens == 0) && (((value % 10) >= 2) && ((value % 10) <= 4))) | |||
return("0MA"); | |||
} | |||
break; | |||
case 4: // lang=lt | |||
if((teens == 1) || ((value % 10) == 0)) | |||
return("0MB"); | |||
if((value % 10) == 1) | |||
return("0MA"); | |||
break; | |||
if((translator->langopts.numbers2 & 0x80) && | |||
((value % 10)==1)) | |||
case 5: // lang=bs,hr,sr | |||
if(teens == 0) | |||
{ | |||
return("1MA"); | |||
if((value % 10) == 1) | |||
return("1M"); | |||
if(((value % 10) >= 2) && ((value % 10) <= 4)) | |||
return("0MA"); | |||
} | |||
break; | |||
} | |||
return("0M"); | |||
} |
@@ -1591,7 +1591,7 @@ static void SetProsodyParameter(int param_type, wchar_t *attr1, PARAM_STACK *sp) | |||
static int ReplaceKeyName(char *outbuf, int index, int &outix) | |||
{//=========================================================== | |||
// Replace some key-names by single characters, so they can be pronounced in different languages | |||
MNEM_TAB keynames[] = { | |||
static MNEM_TAB keynames[] = { | |||
{"space ",0xe020}, | |||
{"tab ", 0xe009}, | |||
{"underscore ", 0xe05f}, |
@@ -136,6 +136,8 @@ static int speed3 = 118; | |||
//#define TEST_SPEED | |||
#ifdef INCLUDE_SONIC | |||
void SetSpeed(int control) | |||
{//======================= | |||
int x; | |||
@@ -312,6 +314,147 @@ printf("%3d: speedf %d %d %d pause=%d %d wav=%d lenmod=%d %d\n",wpm,speed1, | |||
#endif | |||
} // end of SetSpeed | |||
#else // not using sonic speed-up | |||
void SetSpeed(int control) | |||
{//======================= | |||
// This is the earlier version of SetSpeed() before sonic speed-up was added | |||
int x; | |||
int s1; | |||
int wpm; | |||
int wpm2; | |||
speed.loud_consonants = 0; | |||
speed.min_sample_len = 450; | |||
speed.lenmod_factor = 110; // controls the effect of FRFLAG_LEN_MOD reduce length change | |||
speed.lenmod2_factor = 100; | |||
wpm = embedded_value[EMBED_S]; | |||
if(control == 2) | |||
wpm = embedded_value[EMBED_S2]; | |||
#ifdef TEST_SPEED | |||
if(wpm > 1000) | |||
{ | |||
// TESTING | |||
test = wpm / 1000; | |||
wpm = wpm % 1000; | |||
} | |||
#endif | |||
if(voice->speed_percent > 0) | |||
{ | |||
wpm = (wpm * voice->speed_percent)/100; | |||
} | |||
if(wpm > 450) | |||
wpm = 450; | |||
if(wpm > 360) | |||
{ | |||
speed.loud_consonants = (wpm - 360) / 8; | |||
} | |||
wpm2 = wpm; | |||
if(wpm > 359) wpm2 = 359; | |||
if(wpm < 80) wpm2 = 80; | |||
x = speed_lookup[wpm2-80]; | |||
if(wpm >= 380) | |||
x = 7; | |||
if(wpm >= 400) | |||
x = 6; | |||
if(control & 1) | |||
{ | |||
// set speed factors for different syllable positions within a word | |||
// these are used in CalcLengths() | |||
speed1 = (x * voice->speedf1)/256; | |||
speed2 = (x * voice->speedf2)/256; | |||
speed3 = (x * voice->speedf3)/256; | |||
if(x <= 7) | |||
{ | |||
speed1 = x; | |||
speed2 = speed3 = x - 1; | |||
} | |||
} | |||
if(control & 2) | |||
{ | |||
// these are used in synthesis file | |||
if(wpm > 350) | |||
{ | |||
speed.lenmod_factor = 85 - (wpm - 350) / 3; | |||
speed.lenmod2_factor = 60 - (wpm - 350) / 8; | |||
} | |||
else | |||
if(wpm > 250) | |||
{ | |||
speed.lenmod_factor = 110 - (wpm - 250)/4; | |||
speed.lenmod2_factor = 110 - (wpm - 250)/2; | |||
} | |||
s1 = (x * voice->speedf1)/256; | |||
if(wpm >= 170) | |||
speed.wav_factor = 110 + (150*s1)/128; // reduced speed adjustment, used for playing recorded sounds | |||
else | |||
speed.wav_factor = 128 + (128*s1)/130; // = 215 at 170 wpm | |||
if(wpm >= 350) | |||
{ | |||
speed.wav_factor = wav_factor_350[wpm-350]; | |||
} | |||
if(wpm >= 390) | |||
{ | |||
speed.min_sample_len = 450 - (wpm - 400)/2; | |||
if(wpm > 440) | |||
speed.min_sample_len = 420 - (wpm - 440); | |||
} | |||
speed.pause_factor = (256 * s1)/115; // full speed adjustment, used for pause length | |||
speed.clause_pause_factor = 0; | |||
if(wpm > 430) | |||
{ | |||
speed.pause_factor = 12; | |||
// speed.clause_pause_factor = 15; | |||
} | |||
else | |||
if(wpm > 400) | |||
{ | |||
speed.pause_factor = 13; | |||
// speed.clause_pause_factor = 15; | |||
} | |||
else | |||
if(wpm > 374) | |||
{ | |||
speed.pause_factor = 14; | |||
} | |||
else | |||
if(wpm > 350) | |||
{ | |||
speed.pause_factor = pause_factor_350[wpm - 350]; | |||
} | |||
if(speed.clause_pause_factor == 0) | |||
{ | |||
// restrict the reduction of pauses between clauses | |||
if((speed.clause_pause_factor = speed.pause_factor) < 16) | |||
speed.clause_pause_factor = 16; | |||
} | |||
} | |||
#ifdef TEST_SPEED | |||
//if(control==3) | |||
printf("%3d: speedf %d %d %d pause=%d %d wav=%d lenmod=%d %d\n",wpm,speed1,speed2,speed3, speed.pause_factor,speed.clause_pause_factor, speed.wav_factor,speed.lenmod_factor,speed.lenmod2_factor); | |||
#endif | |||
} // end of SetSpeed | |||
#endif // of INCLUDE_SONIC | |||
#ifdef deleted | |||
void SetAmplitude(int amp) |
@@ -20,11 +20,15 @@ | |||
#include "StdAfx.h" | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <string.h> | |||
#include <stdarg.h> | |||
#include "speech.h" | |||
#include "sonic.h" | |||
#ifdef INCLUDE_SONIC | |||
struct sonicStreamStruct { | |||
short *inputBuffer; | |||
@@ -965,3 +969,4 @@ int sonicChangeShortSpeed( | |||
sonicDestroyStream(stream); | |||
return numSamples; | |||
} | |||
#endif // INCLUDE_SONIC |
@@ -25,6 +25,7 @@ | |||
// conditional compilation options | |||
#define INCLUDE_KLATT | |||
#define INCLUDE_MBROLA | |||
#define INCLUDE_SONIC | |||
#if defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN | |||
#define ARCH_BIG |
@@ -35,7 +35,7 @@ | |||
#include "translate.h" | |||
#include "wave.h" | |||
const char *version_string = "1.46.21 25.Jul.12"; | |||
const char *version_string = "1.46.22 09.Aug.12"; | |||
const int version_phdata = 0x014600; | |||
int option_device_number = -1; | |||
@@ -975,7 +975,7 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ | |||
if(instn2 < 8) | |||
{ | |||
// ChangeIf | |||
if(StressCondition(tr, plist, instn2 & 7, 1)) | |||
if(StressCondition(tr, plist, instn2 & 7, 1) == true) | |||
{ | |||
phdata->pd_param[i_CHANGE_PHONEME] = instn & 0xff; | |||
end_flag = 1; // change phoneme, exit |
@@ -1237,6 +1237,7 @@ void DoPhonemeMarker(int type, int char_posn, int length, char *name) | |||
} // end of DoMarker | |||
#ifdef INCLUDE_SONIC | |||
void DoSonicSpeed(int value) | |||
{//========================= | |||
// value, multiplier * 1024 | |||
@@ -1244,6 +1245,7 @@ void DoSonicSpeed(int value) | |||
wcmdq[wcmdq_tail][1] = value; | |||
WcmdqInc(); | |||
} // end of DoSonicSpeed | |||
#endif | |||
void DoVoiceChange(voice_t *v) |
@@ -118,8 +118,8 @@ static const unsigned short chars_ignore_default[] = { | |||
0, 0 }; | |||
// alternatively, ignore characters but allow zero-width-non-joiner (lang-fa) | |||
static const unsigned short chars_ignore_fa[] = { | |||
0x200c, 0x0605, // zero width non-joiner, replace with not-used Arabic character code | |||
static const unsigned short chars_ignore_zwnj_hyphen[] = { | |||
0x200c, '-', // zero width non-joiner, replace with hyphen | |||
0x200d, 1, // zero width joiner | |||
0, 0 }; | |||
@@ -661,13 +661,11 @@ Translator *SelectTranslator(const char *name) | |||
case L('f','a'): // Farsi | |||
{ | |||
static const char fa_ZWNJ[] = {0x05, 0}; // use letter group G for ZWNJ U+200c | |||
tr->letter_bits_offset = OFFSET_ARABIC; | |||
tr->langopts.numbers = NUM_AND_UNITS | NUM_HUNDRED_AND; | |||
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words | |||
tr->chars_ignore = chars_ignore_fa; | |||
SetLetterBits(tr,LETTERGP_G,(char *)fa_ZWNJ); | |||
tr->chars_ignore = chars_ignore_zwnj_hyphen; // replace ZWNJ by hyphen | |||
} | |||
break; | |||
@@ -763,7 +761,7 @@ Translator *SelectTranslator(const char *name) | |||
tr->langopts.accents = 1; | |||
tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_DECIMAL_COMMA | NUM_THOUS_SPACE | NUM_DFRACTION_2 | NUM_ROMAN_CAPITALS; | |||
tr->langopts.numbers2 = 0x4a; // variant numbers before thousands,milliards | |||
tr->langopts.numbers2 = 0xa + NUM2_THOUSANDS_VAR5; // variant numbers before thousands,milliards | |||
tr->langopts.replace_chars = replace_cyrillic_latin; | |||
SetLetterVowel(tr,'y'); | |||
@@ -999,7 +997,7 @@ SetLengthMods(tr,3); // all equal | |||
tr->langopts.unstressed_wd2 = 2; | |||
tr->langopts.param[LOPT_DIERESES] = 1; | |||
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED | NUM_DFRACTION_4 | NUM_ORDINAL_DOT; | |||
tr->langopts.numbers2 = 0x100; | |||
tr->langopts.numbers2 = NUM2_THOUSANDS_VAR4; | |||
tr->langopts.max_roman = 5000; | |||
} | |||
break; | |||
@@ -1098,7 +1096,7 @@ SetLengthMods(tr,3); // all equal | |||
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x9; | |||
tr->langopts.max_initial_consonants = 7; // for example: wchrzczony :) | |||
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_DFRACTION_2; | |||
tr->langopts.numbers2 = 0x40; | |||
tr->langopts.numbers2 = NUM2_THOUSANDS_VAR3; | |||
tr->langopts.param[LOPT_COMBINE_WORDS] = 4 + 0x100; // combine 'nie' (marked with $alt2) with some 1-syllable (and 2-syllable) words (marked with $alt) | |||
SetLetterVowel(tr,'y'); | |||
} | |||
@@ -1170,7 +1168,7 @@ SetLengthMods(tr,3); // all equal | |||
tr->langopts.param[LOPT_COMBINE_WORDS] = 4; // combine some prepositions with the following word | |||
tr->langopts.numbers = NUM_OMIT_1_HUNDRED | NUM_DFRACTION_2 | NUM_ROMAN; | |||
tr->langopts.numbers2 = 0x100; | |||
tr->langopts.numbers2 = NUM2_THOUSANDS_VAR2; | |||
tr->langopts.thousands_sep = STRESSPOSN_1L; //no thousands separator | |||
tr->langopts.decimal_sep = ','; | |||
@@ -1478,7 +1476,7 @@ static void Translator_Russian(Translator *tr) | |||
tr->langopts.stress_flags = 0x0020; // waas 0x1010 | |||
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED; | |||
tr->langopts.numbers2 = 0xc2; // variant numbers before thousands | |||
tr->langopts.numbers2 = 0x2 + NUM2_THOUSANDS_VAR1; // variant numbers before thousands | |||
tr->langopts.phoneme_change = 1; | |||
tr->langopts.testing = 2; | |||
@@ -372,7 +372,7 @@ int IsAlpha(unsigned int c) | |||
{//======================== | |||
// Replacement for iswalph() which also checks for some in-word symbols | |||
const unsigned short extra_indic_alphas[] = { | |||
static const unsigned short extra_indic_alphas[] = { | |||
0xa70,0xa71, // Gurmukhi: tippi, addak | |||
0 }; | |||
@@ -1013,7 +1013,7 @@ if((wmark > 0) && (wmark < 8)) | |||
found = TranslateNumber(tr, word1, phonemes, dictionary_flags, wtab, 0); | |||
} | |||
if(!found & ((wflags & FLAG_UPPERS) != FLAG_FIRST_UPPER)) | |||
if(!found && ((wflags & FLAG_UPPERS) != FLAG_FIRST_UPPER)) | |||
{ | |||
// either all upper or all lower case | |||
@@ -446,10 +446,13 @@ typedef struct { | |||
#define NUM2_MULTIPLE_ORDINAL 0x1000 | |||
#define NUM2_ENGLISH_NUMERALS 0x2000 | |||
#define NUM2_THOUSANDS_VAR1 0x40 | |||
#define NUM2_THOUSANDS_VAR2 0x80 | |||
#define NUM2_THOUSANDS_VAR3 0xc0 | |||
#define NUM2_THOUSANDS_VAR4 0x100 | |||
#define NUM2_THOUSANDS_VAR5 0x140 | |||
// bits 1-4 use variant form of numbers before thousands,millions,etc. | |||
// bit6=(LANG=pl) two forms of plural, M or MA | |||
// bit7=(LANG-ru) use MB for 1 thousand, million, etc | |||
// bit8=(LANG=cs,sk) two forms of plural, M or MA | |||
// bits 6-8 use different forms of thousand, million, etc (M MA MB) | |||
// bit9=(LANG=rw) say "thousand" and "million" before its number, not after | |||
// bit12=(LANG=el,es) use ordinal form of hundreds and tens as well as units | |||
// bit13=(LANG=ne) speak (non-replaced) English numerals in English |
@@ -34,9 +34,10 @@ | |||
#include "phoneme.h" | |||
#include "synthesize.h" | |||
#include "voice.h" | |||
#include "sonic.h" | |||
//#undef INCLUDE_KLATT | |||
#ifdef INCLUDE_SONIC | |||
#include "sonic.h" | |||
#endif | |||
#ifdef USE_PORTAUDIO | |||
#include "portaudio.h" | |||
@@ -150,8 +151,10 @@ static PortAudioStream *pa_stream=NULL; | |||
static PaStream *pa_stream=NULL; | |||
#endif | |||
#ifdef INCLUDE_SONIC | |||
static sonicStream sonicSpeedupStream = NULL; | |||
double sonicSpeed = 1.0; | |||
#endif | |||
// 1st index=roughness | |||
// 2nd index=modulation_type | |||
@@ -295,11 +298,15 @@ void WcmdqStop() | |||
{//============= | |||
wcmdq_head = 0; | |||
wcmdq_tail = 0; | |||
#ifdef INCLUDE_SONIC | |||
if(sonicSpeedupStream != NULL) | |||
{ | |||
sonicDestroyStream(sonicSpeedupStream); | |||
sonicSpeedupStream = NULL; | |||
} | |||
#endif | |||
#ifdef USE_PORTAUDIO | |||
Pa_AbortStream(pa_stream); | |||
#endif | |||
@@ -1912,14 +1919,18 @@ int WavegenFill2(int fill_zeros) | |||
} | |||
wdata.n_mix_wavefile = 0; | |||
wdata.amplitude_fmt = 100; | |||
#ifdef INCLUDE_KLATT | |||
KlattReset(1); | |||
#endif | |||
result = PlaySilence(length,resume); | |||
break; | |||
case WCMD_WAVE: | |||
echo_complete = echo_length; | |||
wdata.n_mix_wavefile = 0; | |||
#ifdef INCLUDE_KLATT | |||
KlattReset(1); | |||
#endif | |||
result = PlayWave(length,resume,(unsigned char*)q[2], q[3] & 0xff, q[3] >> 8); | |||
break; | |||
@@ -1989,9 +2000,11 @@ int WavegenFill2(int fill_zeros) | |||
wdata.amplitude_fmt = 100; // percentage, but value=0 means 100% | |||
break; | |||
#ifdef INCLUDE_SONIC | |||
case WCMD_SONIC_SPEED: | |||
sonicSpeed = (double)q[1] / 1024; | |||
break; | |||
#endif | |||
} | |||
if(result==0) | |||
@@ -2009,6 +2022,7 @@ int WavegenFill2(int fill_zeros) | |||
} // end of WavegenFill2 | |||
#ifdef INCLUDE_SONIC | |||
/* Speed up the audio samples with libsonic. */ | |||
static int SpeedUp(short *outbuf, int length_in, int length_out, int end_of_text) | |||
{//============================================================================== | |||
@@ -2035,6 +2049,7 @@ static int SpeedUp(short *outbuf, int length_in, int length_out, int end_of_text | |||
} | |||
return sonicReadShortFromStream(sonicSpeedupStream, outbuf, length_out); | |||
} // end of SpeedUp | |||
#endif | |||
/* Call WavegenFill2, and then speed up the output samples. */ | |||
@@ -2042,16 +2057,18 @@ int WavegenFill(int fill_zeros) | |||
{//============================ | |||
int finished; | |||
unsigned char *p_start; | |||
int length; | |||
int max_length; | |||
p_start = out_ptr; | |||
// fill_zeros is ignored. It is now done in the portaudio callback | |||
finished = WavegenFill2(0); | |||
#ifdef INCLUDE_SONIC | |||
if(sonicSpeed > 1.0) | |||
{ | |||
int length; | |||
int max_length; | |||
max_length = (out_end - p_start); | |||
length = 2*SpeedUp((short *)p_start, (out_ptr-p_start)/2, max_length/2, finished); | |||
out_ptr = p_start + length; | |||
@@ -2059,6 +2076,7 @@ int WavegenFill(int fill_zeros) | |||
if(length >= max_length) | |||
finished = 0; // there may be more data to flush | |||
} | |||
#endif | |||
return finished; | |||
} // end of WavegenFill | |||