mirror of
https://github.com/rhasspy/espeak-ng.git
synced 2026-11-08 23:47:27 +00:00
[1.46.22]
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-fd96e6ae7743
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
+54
-2
@@ -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
|
||||
|
||||
+21
-33
@@ -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"
|
||||
|
||||
+33
-26
@@ -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
|
||||
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");
|
||||
break;
|
||||
|
||||
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");
|
||||
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))
|
||||
case 5: // lang=bs,hr,sr
|
||||
if(teens == 0)
|
||||
{
|
||||
// for Polish language - two forms of plural!
|
||||
return("0MA");
|
||||
if((value % 10) == 1)
|
||||
return("1M");
|
||||
if(((value % 10) >= 2) && ((value % 10) <= 4))
|
||||
return("0MA");
|
||||
}
|
||||
|
||||
if((translator->langopts.numbers2 & 0x80) &&
|
||||
((value % 10)==1))
|
||||
{
|
||||
return("1MA");
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
return("0M");
|
||||
}
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+2
-2
@@ -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)
|
||||
|
||||
+8
-10
@@ -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;
|
||||
|
||||
|
||||
+2
-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
|
||||
|
||||
|
||||
+6
-3
@@ -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
|
||||
|
||||
+22
-4
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user