Browse Source

[1.39.22]

*_list files, allow words in all-capitals which imply $allcaps attribute.
Voices: Look for voices also in espeak-data/voices/test.
lang=eo: Adjust syllable lengths.  Use break between word (word_gap=1).
wave.cpp: Fixes to copyBuffer(), wave_write().


git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@201 d46cf337-b52f-0410-862d-fd96e6ae7743
master
jonsd 16 years ago
parent
commit
084cd2c17d

+ 6
- 2
dictsource/af_rules View File

buiten (ste bYyt@n // restore default stress: buitenste/-s buiten (ste bYyt@n // restore default stress: buitenste/-s
buiten (t bYyt@n // restore default stress: buitentoe/buitentyds buiten (t bYyt@n // restore default stress: buitentoe/buitentyds
buiten bYyt@n' // buitendien/buitensporig buiten bYyt@n' // buitendien/buitensporig
buite b'Yyt@ // buitelandse/buitestander/buitew�eld
buite bYyt@ // buitelandse/buitestander/buitewêreld/trekkerbuiteband
bul (ga b%ul // fix stress and u sound: Bulgaarse/Bulgare bul (ga b%ul // fix stress and u sound: Bulgaarse/Bulgare
bulle (tin b%ul@ // fix stress and u sound: bulletin and compounds bulle (tin b%ul@ // fix stress and u sound: bulletin and compounds
bur (lesk b%Wr // move default stress: burlesk/-e bur (lesk b%Wr // move default stress: burlesk/-e
CAnn) e (CA @ // banneling/sinnebeeld/spinnekop/-rak CAnn) e (CA @ // banneling/sinnebeeld/spinnekop/-rak
ies) e (b @ // fix e sound: dinamiesebinding/ekonomiesebemagtiging ies) e (b @ // fix e sound: dinamiesebinding/ekonomiesebemagtiging
&At) e (be@ @ // fix e sound: batebestuur/sekuriteitebeurs/soldateberoep, etc.
&At) e (bA@ @ // fix e sound: batebestuur/sekuriteitebeurs/soldatebbaadjie/geslotebaan, etc.
Aw) e (bA @ // fix e sound: briewebesteller/diewebende/newebedoeling/skewebek/stywebeen Aw) e (bA @ // fix e sound: briewebesteller/diewebende/newebedoeling/skewebek/stywebeen
@C) e (bo @ // compounds with boek/boer/boog/boom/bol/bord/borsel/bos/ grondbonebotter/kamdebo... @C) e (bo @ // compounds with boek/boer/boog/boom/bol/bord/borsel/bos/ grondbonebotter/kamdebo...
@C) e (bu @ // briewebus/ereburger/novellebundel/urinebuis/woedebui @C) e (bu @ // briewebus/ereburger/novellebundel/urinebuis/woedebui
prakti (syn pr%akt%i // move default stress: praktisien and compounds and plural prakti (syn pr%akt%i // move default stress: praktisien and compounds and plural
_) prak (tyk pr%ak // stress: praktyk and compounds _) prak (tyk pr%ak // stress: praktyk and compounds
prefek prifEk // fix vowel sounds: prefek/-te/-tuur and compounds prefek prifEk // fix vowel sounds: prefek/-te/-tuur and compounds
pre (histo pre@ // fix pre sound: prehistories/-e
pre (lud pr@ // fix stress and e sound: prelude/-s/(ge)preludeer pre (lud pr@ // fix stress and e sound: prelude/-s/(ge)preludeer
pre (mier pr@ // move default stress and fix e sound: premier and compounds pre (mier pr@ // move default stress and fix e sound: premier and compounds
pre (nata pr,e@ // fix e sound: prenataal/-tale pre (nata pr,e@ // fix e sound: prenataal/-tale
proble (mati pr%Obl@ // fix vowel sounds: problematies/-e/problematiek proble (mati pr%Obl@ // fix vowel sounds: problematies/-e/problematiek
profesie prOf@s'i // fix vowel sounds and move stress profesie prOf@s'i // fix vowel sounds and move stress
profit (e pr%Of@t // fix stress and vowel sounds: profiteer/-tering profit (e pr%Of@t // fix stress and vowel sounds: profiteer/-tering
progester (o pr%o@x2%Est@r // fix e sound: progesteroon(-aanvulling/-behandeling/-tekort)
pro (gram pr%u // fix stress and o sound: program/-e/ontwikkelingsprogram pro (gram pr%u // fix stress and o sound: program/-e/ontwikkelingsprogram
programme (ring pr%ux2r%ame@ // fix e sound and stress: (rekenaar)programmering(staal), etc. programme (ring pr%ux2r%ame@ // fix e sound and stress: (rekenaar)programmering(staal), etc.
pro (gress pr%o@ // fix stress and o sound: progressie/-f/-we pro (gress pr%o@ // fix stress and o sound: progressie/-f/-we
sekwe (strA s%Ekw@ // fix e sounds: sekwestrasie/sekwestreer and compounds sekwe (strA s%Ekw@ // fix e sounds: sekwestrasie/sekwestreer and compounds
bloed) se (l s& // fix e sound: (wit)bloedsel(le)(telling and similar compounds bloed) se (l s& // fix e sound: (wit)bloedsel(le)(telling and similar compounds
heuning) se (lK s& // fix e sound: heuningsel/-le heuning) se (lK s& // fix e sound: heuningsel/-le
liggaam) se (lK s& // fix e sound: liggaamsel/-le
sela (kant s%e@l@ // fix stress and vowel sounds: selakant/-e sela (kant s%e@l@ // fix stress and vowel sounds: selakant/-e
selder (y s%&ld@r // move default stress: seldery and compounds selder (y s%&ld@r // move default stress: seldery and compounds
&) sele (_ s'e@l@ &) sele (_ s'e@l@
staties st'A:tis staties st'A:tis
sta (tutA st%a // fix stress and a sound: statute/statutêr sta (tutA st%a // fix stress and a sound: statute/statutêr
steding ste@d@N // besteding and compounds steding ste@d@N // besteding and compounds
ste (ke_ ste@ // fix e sound: by-/mes-/proefsteke
C) steker ste@k@r // e sound: (aan/dop/kwaad/rugsteker/-s/-y, etc. C) steker ste@k@r // e sound: (aan/dop/kwaad/rugsteker/-s/-y, etc.
_ne) stel st@l // fix e sound: nestel/-end _ne) stel st@l // fix e sound: nestel/-end
wor) stel st@l //worstel e sound in compounds wor) stel st@l //worstel e sound in compounds

+ 3
- 1
dictsource/de_rules View File

_) erob (er %E*o:b _) erob (er %E*o:b
@) esen (_ e:z@n @) esen (_ e:z@n
@) ett (_ 'Et @) ett (_ 'Et
eum (_ 'e:Um
@@) eum (_ =e:Um
@) eur (_ 'Y:* @) eur (_ 'Y:*
euse (_ 'Y:z@ euse (_ 'Y:z@
eusen (_ 'Y:z@n eusen (_ 'Y:z@n
_) i (llu %I _) i (llu %I
_) i (mag I _) i (mag I
r) i (na_ 'i: r) i (na_ 'i:
@) ing (_N _^_EN
// @) ing (_N _^_EN
_) in (k %In _) in (k %In
_) inter Int@* _) inter Int@*
&) in (_ i2n &) in (_ i2n

+ 13
- 0
dictsource/dict_phonemes View File

** b d dZ f g h j ** b d dZ f g h j
k l m n p R3 s S k l m n p R3 s S
t tS ts v x z Z t tS ts v x z Z


Dictionary kn_dict

a a: aI aU e E e: i
I i: o o: r- u u: V
y

: b c ch d d. dZ f
g h j J k kh l l.
m n N n. n^ p ph R
R2 s s. S; t t. t.h th
tS v w z

+ 24
- 7
phsource/compile_report View File

57 phoneme tables
58 phoneme tables
new total new total
base 101 101 base 101 101
base2 24 120 base2 24 120
da 15 131 da 15 131
sq 23 129 sq 23 129
ml 13 141 ml 13 141
kn 15 141
bn 59 147 bn 59 147
ne 23 151 ne 23 151
lv 28 123 lv 28 123
hy 16 114
hy 17 115
om 18 118 om 18 118


Data file Used by Data file Used by
[x] pt [x] pt
[R2] lv [R2] lv
r3/r_u [(u)] base r3/r_u [(u)] base
r3/r_ulv [r"] hy
r3/r_uvl [r"] hy
r3/rx [*] base r3/rx [*] base
[r/] base [r/] base
[r/] af [r/] af
[aU] la [aU] la
[aau] zhy [aau] zhy
vdiph/aau_3 [aU] hi vdiph/aau_3 [aU] hi
[aU] kn
[aU] bn [aU] bn
[aU] ne [aU] ne
vdiph/aau_4 [aU] vi vdiph/aau_4 [aU] vi
[aI] pt [aI] pt
[a:I] vi [a:I] vi
[aI] id [aI] id
[aI] kn
[aI] hy [aI] hy
vdiph/ai_2 [aI] cy vdiph/ai_2 [aI] cy
[aY] cy [aY] cy
[V] cy [V] cy
[@4] hi [@4] hi
[@] ml [@] ml
[@] kn
[@4] bn [@4] bn
[@] hy [@] hy
vowel/@- [@-] base vowel/@- [@-] base
[&] sv [&] sv
[&] bn [&] bn
[&:] bn [&:] bn
[&] lv
[&:] lv
vowel/0 [0] en vowel/0 [0] en
[O] hi [O] hi
[O] pt [O] pt
[&] is [&] is
[a/] sw [a/] sw
[a/] sq [a/] sq
[a] kn
vowel/a_3 [a] en_sc vowel/a_3 [a] en_sc
[a/] en_sc [a/] en_sc
[A:] en_sc [A:] en_sc
[a] tr [a] tr
[a] sq [a] sq
[a:] ml [a:] ml
[a:] kn
vowel/a_6 [a] fr vowel/a_6 [a] fr
[a2] fr [a2] fr
vowel/aa [a] fi vowel/aa [a] fi
[@/] hi [@/] hi
[@] zh [@] zh
[@] bn [@] bn
[V] ne
[@/] ne [@/] ne
vowel/e [e] base2 vowel/e [e] base2
[e:] en [e:] en
[e] da [e] da
[e] ml [e] ml
[e:] ml [e:] ml
[e:] kn
[e] ne [e] ne
vowel/e# [I] en_sc vowel/e# [I] en_sc
[I2] en_sc [I2] en_sc
vowel/ee_6 [&] sk vowel/ee_6 [&] sk
[E3] sv [E3] sv
[E] ku [E] ku
[&] lv
[&:] lv
vowel/e_mid [E] en_rp vowel/e_mid [E] en_rp
[e] jbo [e] jbo
[E] fr [E] fr
[E2] id [E2] id
[E] da [E] da
[E] bn [E] bn
[e] lv
[e] hy [e] hy
vowel/e_mid2 [E] af vowel/e_mid2 [E] af
[E] de [E] de
[e] sw [e] sw
[e] tr [e] tr
[E] ko [E] ko
[e] kn
[e] lv
[e:] lv [e:] lv
[E] om [E] om
vowel/@_fnt [@] en_wi vowel/@_fnt [@] en_wi
[i#] rw [i#] rw
[i] ko [i] ko
[i:] ml [i:] ml
[i:] kn
[i] ne [i] ne
[i] hy [i] hy
[i:] om [i:] om
[i] fr [i] fr
[i:] fr [i:] fr
[i:] sk [i:] sk
[i] lv
[i:] lv [i:] lv
vowel/i_4 [i] fi vowel/i_4 [i] fi
[i] hu [i] hu
[i] ku [i] ku
[i] id [i] id
[i] ml [i] ml
[i] kn
[i] lv
vowel/i#_6 [i.] zh vowel/i#_6 [i.] zh
vowel/i_7 [i] pl vowel/i_7 [i] pl
vowel/i#_7 [i[] zh vowel/i#_7 [i[] zh
[i] sq [i] sq
[e#] sq [e#] sq
[y] ml [y] ml
[y] kn
vowel/ii_2 [i] zh vowel/ii_2 [i] zh
vowel/ii#_2 [y] pl vowel/ii#_2 [y] pl
vowel/ii_3 [I] cy vowel/ii_3 [I] cy
[o#] rw [o#] rw
[o] ml [o] ml
[o:] ml [o:] ml
[o] kn
[o:] kn
[o] bn [o] bn
[o] hy [o] hy
vowel/o_2 [o:] cy vowel/o_2 [o:] cy
[u] id [u] id
[u] ml [u] ml
[u:] ml [u:] ml
[u] kn
[u:] kn
[u] bn [u] bn
[u:] om [u:] om
vowel/u# [u:] en_sc vowel/u# [u:] en_sc
[U] om [U] om
vowel/u_unr [u-] ko vowel/u_unr [u-] ko
vowel/V [3] en_sc vowel/V [3] en_sc
[V] ne
vowel/V_2 [V] en vowel/V_2 [V] en
[a] af [a] af
[V] ru [V] ru

+ 7
- 7
phsource/ph_esperanto View File



phoneme i phoneme i
vowel starttype (i) endtype (i) vowel starttype (i) endtype (i)
length 160
length 170
formants vowel/i formants vowel/i
linkout ; linkout ;
endphoneme endphoneme


phoneme aU phoneme aU
vowel starttype (a) endtype (u) vowel starttype (a) endtype (u)
length 240
length 230
formants vdiph/au_4 formants vdiph/au_4
endphoneme endphoneme




phoneme eU phoneme eU
vowel starttype (e) endtype (u) vowel starttype (e) endtype (u)
length 240
length 230
formants vdiph/eu formants vdiph/eu
endphoneme endphoneme




phoneme aI phoneme aI
vowel starttype (a) endtype (i) vowel starttype (a) endtype (i)
length 260
length 240
formants vdiph/ai formants vdiph/ai
endphoneme endphoneme




phoneme eI phoneme eI
vowel starttype (e) endtype (i) vowel starttype (e) endtype (i)
length 250
length 230
formants vdiph/eei_2 formants vdiph/eei_2
endphoneme endphoneme




phoneme OI phoneme OI
vowel starttype (o) endtype (i) vowel starttype (o) endtype (i)
length 260
length 240
formants vdiph/ooi formants vdiph/ooi
endphoneme endphoneme




phoneme uI phoneme uI
vowel starttype (u) endtype (i) vowel starttype (u) endtype (i)
length 250
length 230
formants vdiph/ui formants vdiph/ui
endphoneme endphoneme



+ 3
- 0
phsource/phonemes View File

phonemetable ml hi phonemetable ml hi
include ph_malayalam include ph_malayalam


phonemetable kn hi
include ph_kannada

phonemetable bn hi phonemetable bn hi
include ph_bengali include ph_bengali



BIN
phsource/vwl_zh/ing View File


+ 1
- 1
src/compiledata.cpp View File

float total; float total;
float pkheight; float pkheight;
int marker1_set=0; int marker1_set=0;
int frame_vowelbreak;
int frame_vowelbreak=NULL;
SpectFrame *fr; SpectFrame *fr;
wxString path_sep = _T("/"); wxString path_sep = _T("/");



+ 32
- 5
src/compiledict.cpp View File

int len_phonetic; int len_phonetic;
int text_not_phonemes; // this word specifies replacement text, not phonemes int text_not_phonemes; // this word specifies replacement text, not phonemes
unsigned int wc; unsigned int wc;
int all_upper_case;
char *mnemptr; char *mnemptr;
char *comment; char *comment;
word[ix] = 0; word[ix] = 0;
} }
else else
if((word[0] & 0x80)==0) // 7 bit ascii only
if(word[0] != '_')
{ {
// If first letter is uppercase, convert to lower case. (Only if it's 7bit ascii)
// ??? need to consider utf8 here
word[0] = tolower(word[0]);
// convert to lower case, and note if the word is all-capitals
int c2;

all_upper_case = 1;
p = word;
for(p=word;;)
{
// this assumes that the lower case char is the same length as the upper case char
// OK, except for Turkish "I", but use towlower() rather than towlower2()
ix = utf8_in(&c2,p,0);
if(c2 == 0)
break;
if(iswupper(c2))
{
utf8_out(towlower(c2),p);
}
else
{
all_upper_case = 0;
}
p += ix;
}
if(all_upper_case)
{
flag_codes[n_flag_codes++] = BITNUM_FLAG_ALLCAPS;
}
} }


len_word = strlen(word); len_word = strlen(word);
} }
break; break;


case '$': // obsolete, replaced by S
fprintf(f_log,"%5d: $ now not allowed, use S for suffix",linenum);
error_count++;
break;
case 'P': case 'P':
sxflags |= SUFX_P; // Prefix, now drop through to Suffix sxflags |= SUFX_P; // Prefix, now drop through to Suffix
case '$': // obsolete, replaced by S
case 'S': case 'S':
output[ix++] = RULE_ENDING; output[ix++] = RULE_ENDING;
value = 0; value = 0;

+ 37
- 31
src/dictionary.cpp View File

int distance_left; int distance_left;
int lg_pts; int lg_pts;
int n_bytes; int n_bytes;
int add_points;


MatchRecord match; MatchRecord match;
static MatchRecord best; static MatchRecord best;
continue; continue;
} }


add_points = 0;

switch(match_type) switch(match_type)
{ {
case 0: case 0:


if((letter == rb) || ((letter==(unsigned char)REPLACED_E) && (rb=='e'))) if((letter == rb) || ((letter==(unsigned char)REPLACED_E) && (rb=='e')))
{ {
match.points += 21;
add_points = 21;
consumed++; consumed++;
} }
else else
lg_pts = 20; lg_pts = 20;
if(letter_group==2) if(letter_group==2)
lg_pts = 19; // fewer points for C, general consonant lg_pts = 19; // fewer points for C, general consonant
match.points += (lg_pts-distance_right);
add_points = (lg_pts-distance_right);
post_ptr += letter_xbytes; post_ptr += letter_xbytes;
} }
else else
letter_group = *rule++ - 'A'; letter_group = *rule++ - 'A';
if((n_bytes = IsLetterGroup(post_ptr-1,letter_group,0)) >0) if((n_bytes = IsLetterGroup(post_ptr-1,letter_group,0)) >0)
{ {
match.points += (20-distance_right);
add_points = (20-distance_right);
post_ptr += (n_bytes-1); post_ptr += (n_bytes-1);
} }
else else
case RULE_NOTVOWEL: case RULE_NOTVOWEL:
if(!IsLetter(letter_w,0)) if(!IsLetter(letter_w,0))
{ {
match.points += (20-distance_right);
add_points = (20-distance_right);
post_ptr += letter_xbytes; post_ptr += letter_xbytes;
} }
else else
case RULE_DIGIT: case RULE_DIGIT:
if(IsDigit(letter_w)) if(IsDigit(letter_w))
{ {
match.points += (20-distance_right);
add_points = (20-distance_right);
post_ptr += letter_xbytes; post_ptr += letter_xbytes;
} }
else else
if(langopts.tone_numbers) if(langopts.tone_numbers)
{ {
// also match if there is no digit // also match if there is no digit
match.points += (20-distance_right);
add_points = (20-distance_right);
post_ptr--; post_ptr--;
} }
else else
case RULE_NONALPHA: case RULE_NONALPHA:
if(!iswalpha(letter_w)) if(!iswalpha(letter_w))
{ {
match.points += (21-distance_right);
add_points = (21-distance_right);
post_ptr += letter_xbytes; post_ptr += letter_xbytes;
} }
else else


case RULE_DOUBLE: case RULE_DOUBLE:
if(letter == last_letter) if(letter == last_letter)
match.points += (21-distance_right);
add_points = (21-distance_right);
else else
failed = 1; failed = 1;
break; break;


case RULE_ALT1: case RULE_ALT1:
if(dict_flags & FLAG_ALT_TRANS) if(dict_flags & FLAG_ALT_TRANS)
match.points++;
add_points = 1;
else else
failed = 1; failed = 1;
break; break;
case '-': case '-':
if((letter == '-') || ((letter == ' ') && (word_flags & FLAG_HYPHEN_AFTER))) if((letter == '-') || ((letter == ' ') && (word_flags & FLAG_HYPHEN_AFTER)))
{ {
match.points += (22-distance_right); // one point more than match against space
add_points = (22-distance_right); // one point more than match against space
} }
else else
failed = 1; failed = 1;
p += utf8_in(&letter_w,p,0); p += utf8_in(&letter_w,p,0);
} }
if(syllable_count <= 0) if(syllable_count <= 0)
match.points+= (19-distance_right);
add_points = (19-distance_right);
else else
failed = 1; failed = 1;
} }
p += utf8_in(&letter_w,p,0); p += utf8_in(&letter_w,p,0);
} }
if(!failed) if(!failed)
match.points += (19-distance_right);
add_points = (19-distance_right);
} }
break; break;


case RULE_INC_SCORE: case RULE_INC_SCORE:
match.points += 20; // force an increase in points
add_points = 20; // force an increase in points
break; break;


case RULE_DEL_FWD: case RULE_DEL_FWD:
if(word_flags & FLAG_SUFFIX_REMOVED) if(word_flags & FLAG_SUFFIX_REMOVED)
failed = 1; // a suffix has been removed failed = 1; // a suffix has been removed
else else
match.points++;
add_points = 1;
break; break;


default: default:
if(letter == rb) if(letter == rb)
{ {
if(letter == RULE_SPACE) if(letter == RULE_SPACE)
match.points += (21-distance_right);
add_points = (21-distance_right);
else else
match.points += (21-distance_right);
add_points = (21-distance_right);
} }
else else
failed = 1; failed = 1;
lg_pts = 20; lg_pts = 20;
if(letter_group==2) if(letter_group==2)
lg_pts = 19; // fewer points for C, general consonant lg_pts = 19; // fewer points for C, general consonant
match.points += (lg_pts-distance_left);
add_points = (lg_pts-distance_left);
pre_ptr -= letter_xbytes; pre_ptr -= letter_xbytes;
} }
else else
letter_group = *rule++ - 'A'; letter_group = *rule++ - 'A';
if((n_bytes = IsLetterGroup(pre_ptr-letter_xbytes,letter_group,1)) >0) if((n_bytes = IsLetterGroup(pre_ptr-letter_xbytes,letter_group,1)) >0)
{ {
match.points += (20-distance_right);
add_points = (20-distance_right);
pre_ptr -= (n_bytes-1); pre_ptr -= (n_bytes-1);
} }
else else
case RULE_NOTVOWEL: case RULE_NOTVOWEL:
if(!IsLetter(letter_w,0)) if(!IsLetter(letter_w,0))
{ {
match.points += (20-distance_left);
add_points = (20-distance_left);
pre_ptr -= letter_xbytes; pre_ptr -= letter_xbytes;
} }
else else


case RULE_DOUBLE: case RULE_DOUBLE:
if(letter == last_letter) if(letter == last_letter)
match.points += (21-distance_left);
add_points = (21-distance_left);
else else
failed = 1; failed = 1;
break; break;
case RULE_DIGIT: case RULE_DIGIT:
if(IsDigit(letter_w)) if(IsDigit(letter_w))
{ {
match.points += (21-distance_left);
add_points = (21-distance_left);
pre_ptr -= letter_xbytes; pre_ptr -= letter_xbytes;
} }
else else
case RULE_NONALPHA: case RULE_NONALPHA:
if(!iswalpha(letter_w)) if(!iswalpha(letter_w))
{ {
match.points += (21-distance_right);
add_points = (21-distance_right);
pre_ptr -= letter_xbytes; pre_ptr -= letter_xbytes;
} }
else else
syllable_count++; /* number of syllables to match */ syllable_count++; /* number of syllables to match */
} }
if(syllable_count <= word_vowel_count) if(syllable_count <= word_vowel_count)
match.points+= (19-distance_left);
add_points = (19-distance_left);
else else
failed = 1; failed = 1;
break; break;


case RULE_STRESSED: case RULE_STRESSED:
if(word_stressed_count > 0) if(word_stressed_count > 0)
match.points += 19;
add_points = 19;
else else
failed = 1; failed = 1;
break; break;
p -= utf8_in(&letter_w,p,1); p -= utf8_in(&letter_w,p,1);
} }
if(!failed) if(!failed)
match.points += 3;
add_points = 3;
} }
break; break;


case RULE_IFVERB: case RULE_IFVERB:
if(expect_verb) if(expect_verb)
match.points += 1;
add_points = 1;
else else
failed = 1; failed = 1;
break; break;


case RULE_CAPITAL: case RULE_CAPITAL:
if(word_flags & FLAG_FIRST_UPPER) if(word_flags & FLAG_FIRST_UPPER)
match.points += 1;
add_points = 1;
else else
failed = 1; failed = 1;
break; break;
{ {
if(*p == '.') if(*p == '.')
{ {
match.points +=50;
add_points = 50;
break; break;
} }
} }
case '-': case '-':
if((letter == '-') || ((letter == ' ') && (word_flags & FLAG_HYPHEN))) if((letter == '-') || ((letter == ' ') && (word_flags & FLAG_HYPHEN)))
{ {
match.points += (22-distance_right); // one point more than match against space
add_points = (22-distance_right); // one point more than match against space
} }
else else
failed = 1; failed = 1;
if(letter == rb) if(letter == rb)
{ {
if(letter == RULE_SPACE) if(letter == RULE_SPACE)
match.points += 4;
add_points = 4;
else else
match.points += (21-distance_left);
add_points = (21-distance_left);
} }
else else
failed = 1; failed = 1;
} }
break; break;
} }

if(failed == 0)
match.points += add_points;
} }


if(failed == 2) if(failed == 2)

+ 8
- 0
src/setlengths.cpp View File

} }


// calc length modifier // calc length modifier
if(next->ph->code == phonPAUSE_VSHORT)
{
// ignore very short pause
next = next2;
next2 = next3;
next3 = &phoneme_list[ix+4];
}

if(more_syllables==0) if(more_syllables==0)
{ {
len = langopts.length_mods0[next2->ph->length_mod *10+ next->ph->length_mod]; len = langopts.length_mods0[next2->ph->length_mod *10+ next->ph->length_mod];

+ 1
- 1
src/synthdata.cpp View File

#include "translate.h" #include "translate.h"
#include "wave.h" #include "wave.h"


const char *version_string = "1.39.18 06.Nov.08";
const char *version_string = "1.39.22 10.Nov.08";
const int version_phdata = 0x013900; const int version_phdata = 0x013900;


int option_device_number = -1; int option_device_number = -1;

+ 13
- 4
src/tr_languages.cpp View File

#define OFFSET_DEVANAGARI 0x900 #define OFFSET_DEVANAGARI 0x900
#define OFFSET_BENGALI 0x980 #define OFFSET_BENGALI 0x980
#define OFFSET_TAMIL 0xb80 #define OFFSET_TAMIL 0xb80
#define OFFSET_KANNADA 0xc80
#define OFFSET_MALAYALAM 0xd00 #define OFFSET_MALAYALAM 0xd00
#define OFFSET_KOREAN 0x1100 #define OFFSET_KOREAN 0x1100




case L('e','o'): case L('e','o'):
{ {
static const short stress_lengths_eo[8] = {145, 180, 200, 190, 0, 0, 300, 320};
static const short stress_lengths_eo[8] = {145, 145, 200, 170, 0, 0, 320, 340};
static const unsigned char stress_amps_eo[] = {16,14, 20,20, 20,24, 24,22 }; static const unsigned char stress_amps_eo[] = {16,14, 20,20, 20,24, 24,22 };
static const wchar_t eo_char_apostrophe[2] = {'l',0}; static const wchar_t eo_char_apostrophe[2] = {'l',0};
tr->charset_a0 = charsets[3]; // ISO-8859-3 tr->charset_a0 = charsets[3]; // ISO-8859-3
tr->char_plus_apostrophe = eo_char_apostrophe; tr->char_plus_apostrophe = eo_char_apostrophe;


tr->langopts.vowel_pause = 1;
tr->langopts.word_gap = 1;
tr->langopts.stress_rule = 2; tr->langopts.stress_rule = 2;
tr->langopts.stress_flags = 0x6 | 0x10; tr->langopts.stress_flags = 0x6 | 0x10;
tr->langopts.unstressed_wd1 = 1;
tr->langopts.unstressed_wd1 = 3;
tr->langopts.unstressed_wd2 = 2; tr->langopts.unstressed_wd2 = 2;


tr->langopts.numbers = 0x1409 + NUM_ROMAN; tr->langopts.numbers = 0x1409 + NUM_ROMAN;


case L('h','y'): // Armenian case L('h','y'): // Armenian
{ {
static const short stress_lengths_hy[8] = {250, 200, 250, 250, 0, 0, 250, 250};
static const char hy_vowels[] = {0x31, 0x35, 0x37, 0x38, 0x3b, 0x48, 0x55, 0}; static const char hy_vowels[] = {0x31, 0x35, 0x37, 0x38, 0x3b, 0x48, 0x55, 0};
static const char hy_consonants[] = {0x32,0x33,0x34,0x36,0x39,0x3a,0x3c,0x3d,0x3e,0x3f, static const char hy_consonants[] = {0x32,0x33,0x34,0x36,0x39,0x3a,0x3c,0x3d,0x3e,0x3f,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x56,0}; 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x56,0};
tr = new Translator(); tr = new Translator();
SetupTranslator(tr,stress_lengths_hy,NULL);
tr->langopts.stress_rule = 3; // default stress on final syllable tr->langopts.stress_rule = 3; // default stress on final syllable


tr->letter_bits_offset = OFFSET_ARMENIAN; tr->letter_bits_offset = OFFSET_ARMENIAN;
memset(tr->letter_bits,0,sizeof(tr->letter_bits)); memset(tr->letter_bits,0,sizeof(tr->letter_bits));
SetLetterBits(tr,LETTERGP_A,hy_vowels); SetLetterBits(tr,LETTERGP_A,hy_vowels);
SetLetterBits(tr,LETTERGP_C,hy_consonants); SetLetterBits(tr,LETTERGP_C,hy_consonants);
tr->langopts.max_initial_consonants = 4;
tr->langopts.max_initial_consonants = 6;
} }
break; break;




case L('t','a'): // Tamil case L('t','a'): // Tamil
case L('m','l'): // Malayalam case L('m','l'): // Malayalam
case L('k','n'): // Kannada
{ {
static const short stress_lengths_ta[8] = {200, 200, 210, 210, 0, 0, 230, 230}; static const short stress_lengths_ta[8] = {200, 200, 210, 210, 0, 0, 230, 230};
static const unsigned char stress_amps_ta[8] = {18,18, 18,18, 20,20, 22,22 }; static const unsigned char stress_amps_ta[8] = {18,18, 18,18, 20,20, 22,22 };
{ {
tr->letter_bits_offset = OFFSET_MALAYALAM; tr->letter_bits_offset = OFFSET_MALAYALAM;
} }
else
if(name2 == L('k','n'))
{
tr->letter_bits_offset = OFFSET_KANNADA;
}
tr->langopts.param[LOPT_WORD_MERGE] = 1; // don't break vowels betwen words tr->langopts.param[LOPT_WORD_MERGE] = 1; // don't break vowels betwen words
SetIndicLetters(tr); // call this after setting OFFSET_ SetIndicLetters(tr); // call this after setting OFFSET_
} }

+ 1
- 0
src/translate.h View File

#define FLAG_VERB_EXT 0x100 /* extend the 'verb follows' */ #define FLAG_VERB_EXT 0x100 /* extend the 'verb follows' */
#define FLAG_CAPITAL 0x200 /* pronunciation if initial letter is upper case */ #define FLAG_CAPITAL 0x200 /* pronunciation if initial letter is upper case */
#define FLAG_ALLCAPS 0x400 // only if the word is all capitals #define FLAG_ALLCAPS 0x400 // only if the word is all capitals
#define BITNUM_FLAG_ALLCAPS 0x2a
#define FLAG_ACCENT 0x800 // character name is base-character name + accent name #define FLAG_ACCENT 0x800 // character name is base-character name + accent name
#define FLAG_HYPHENATED 0x1000 // multiple-words, but needs hyphen between parts 1 and 2 #define FLAG_HYPHENATED 0x1000 // multiple-words, but needs hyphen between parts 1 and 2
#define BITNUM_FLAG_HYPHENATED 0x2c #define BITNUM_FLAG_HYPHENATED 0x2c

+ 6
- 0
src/voices.cpp View File

langname[1] = voicename[1]; langname[1] = voicename[1];
langname[2] = 0; langname[2] = 0;
sprintf(buf,"%s%s%c%s",path_voices,langname,PATHSEP,voicename); sprintf(buf,"%s%s%c%s",path_voices,langname,PATHSEP,voicename);

if(GetFileLength(buf) <= 0)
{
// look in "test" sub-directory
sprintf(buf,"%stest%c%s",path_voices,PATHSEP,voicename);
}
} }
} }



+ 144
- 115
src/wave.cpp View File

//> //>
//<copyBuffer //<copyBuffer


static size_t copyBuffer(char* dest, char* src, size_t theSizeInBytes)
{
size_t bytes_written=0;
if(out_channels==1)
{
SHOW("copyBuffer > memcpy %x (%d bytes)\n", (int)myWrite, theSizeInBytes);
memcpy(dest, src, theSizeInBytes);
bytes_written = theSizeInBytes;
}
else
{
SHOW("copyBuffer > memcpy %x (%d bytes)\n", (int)myWrite, 2*theSizeInBytes);
unsigned int i;
uint16_t* a_dest = (uint16_t*)dest;
uint16_t* a_src = (uint16_t*)src;
for(i=0; i<theSizeInBytes/2; i++)
{
a_dest[2*i] = a_src[i];
a_dest[2*i + 1] = a_src[i];
}
bytes_written = 2*theSizeInBytes;
}
return bytes_written;

static size_t copyBuffer(char* dest, char* src, const size_t theSizeInBytes)
{
size_t bytes_written = 0;
unsigned int i = 0;
uint16_t* a_dest = NULL;
uint16_t* a_src = NULL;
if ((src != NULL) && dest != NULL)
{
// copy for one channel (mono)?
if(out_channels==1)
{
SHOW("copyBuffer > 1 channel > memcpy %x (%d bytes)\n", (int)myWrite, theSizeInBytes);
memcpy(dest, src, theSizeInBytes);
bytes_written = theSizeInBytes;
}
else // copy for 2 channels (stereo)
{
SHOW("copyBuffer > 2 channels > memcpy %x (%d bytes)\n", (int)myWrite, theSizeInBytes);
i = 0;
a_dest = (uint16_t* )dest;
a_src = (uint16_t* )src;
for(i=0; i<theSizeInBytes/2; i++)
{
a_dest[2*i] = a_src[i];
a_dest[2*i+1] = a_src[i];
}
bytes_written = 2*theSizeInBytes;
} // end if(out_channels==1)
} // end if ((src != NULL) && dest != NULL)
return bytes_written;
} }


//> //>


size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize) size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize)
{ {
ENTER("wave_write");
size_t bytes_written = 0;
size_t bytes_to_write = (out_channels==1) ? theSize : theSize*2;
my_stream_could_start = 0;

if(pa_stream == NULL)
{
SHOW_TIME("wave_write > wave_open_sound\n");
if (0 != wave_open_sound())
ENTER("wave_write");
size_t bytes_written = 0;
// space in ringbuffer for the sample needed: 1x mono channel but 2x for 1 stereo channel
size_t bytes_to_write = (out_channels==1) ? theSize : theSize*2;
my_stream_could_start = 0;
if(pa_stream == NULL)
{ {
SHOW_TIME("wave_write > wave_open_sound fails!");
return 0;
}
my_stream_could_start=1;
}
else if (!wave_is_busy(NULL))
{
my_stream_could_start = 1;
}
assert(BUFFER_LENGTH >= bytes_to_write);

if (myWrite >= myBuffer + BUFFER_LENGTH)
{
myWrite = myBuffer;
}

size_t aTotalFreeMem=0;
char* aRead = myRead;
SHOW("wave_write > aRead=%x, myWrite=%x\n", (int)aRead, (int)myWrite);

while (1)
{
if (my_callback_is_output_enabled
&& (0==my_callback_is_output_enabled()))
{
SHOW_TIME("wave_write > my_callback_is_output_enabled: no!");
return 0;
SHOW_TIME("wave_write > wave_open_sound\n");
if (0 != wave_open_sound())
{
SHOW_TIME("wave_write > wave_open_sound fails!");
return 0;
}
my_stream_could_start=1;
} }

aRead = myRead;

if (myWrite >= aRead)
else if (!wave_is_busy(NULL))
{ {
aTotalFreeMem = aRead + BUFFER_LENGTH - myWrite;
my_stream_could_start = 1;
} }
else
assert(BUFFER_LENGTH >= bytes_to_write);
if (myWrite >= myBuffer + BUFFER_LENGTH)
{ {
aTotalFreeMem = aRead - myWrite;
}

if (aTotalFreeMem>1)
myWrite = myBuffer;
} // end if (myWrite >= myBuffer + BUFFER_LENGTH)
size_t aTotalFreeMem=0;
char* aRead = myRead;
SHOW("wave_write > aRead=%x, myWrite=%x\n", (int)aRead, (int)myWrite);
while (1)
{ {
// -1 because myWrite must be different of aRead
// otherwise buffer would be considered as empty
aTotalFreeMem -= 1;
}

if (aTotalFreeMem >= bytes_to_write)
if (my_callback_is_output_enabled && (0==my_callback_is_output_enabled()))
{
SHOW_TIME("wave_write > my_callback_is_output_enabled: no!");
return 0;
}
aRead = myRead;
// write pointer is before read pointer?
if (myWrite >= aRead)
{
aTotalFreeMem = aRead + BUFFER_LENGTH - myWrite;
}
else // read pointer is before write pointer!
{
aTotalFreeMem = aRead - myWrite;
} // end if (myWrite >= aRead)
if (aTotalFreeMem>1)
{
// -1 because myWrite must be different of aRead
// otherwise buffer would be considered as empty
aTotalFreeMem -= 1;
} // end if (aTotalFreeMem>1)
if (aTotalFreeMem >= bytes_to_write)
{
break;
} // end if (aTotalFreeMem >= bytes_to_write)
//SHOW_TIME("wave_write > wait");
SHOW("wave_write > wait: aTotalFreeMem=%d\n", aTotalFreeMem);
SHOW("wave_write > aRead=%x, myWrite=%x\n", (int)aRead, (int)myWrite);
usleep(10000);
} // end while (1)
aRead = myRead;
// write pointer is ahead the read pointer?
if (myWrite >= aRead)
{ {
break;
}
// SHOW_TIME("wave_write > wait");
SHOW("wave_write > wait: aTotalFreeMem=%d\n", aTotalFreeMem);
SHOW("wave_write > aRead=%x, myWrite=%x\n", (int)aRead, (int)myWrite);
usleep(10000);
}

aRead = myRead;

if (myWrite >= aRead)
{
SHOW_TIME("wave_write > myWrite > aRead");
size_t aFreeMem = myBuffer + BUFFER_LENGTH - myWrite;
if (aFreeMem >= bytes_to_write)
SHOW_TIME("wave_write > myWrite >= aRead");
// determine remaining free memory to the end of the ringbuffer
size_t aFreeMem = myBuffer + BUFFER_LENGTH - myWrite;
// is enough linear space available (regardless 1 or 2 channels)?
if (aFreeMem >= bytes_to_write)
{
// copy direct - no wrap around at end of ringbuffer needed
myWrite += copyBuffer(myWrite, theMono16BitsWaveBuffer, theSize);
}
else // not enough linear space available
{
// 2 channels (stereo)?
if (out_channels == 2)
{
// copy with wrap around at the end of ringbuffer
const size_t bytes_written = copyBuffer(myWrite, theMono16BitsWaveBuffer, aFreeMem/2);
myWrite = myBuffer;
myWrite += copyBuffer(myWrite, theMono16BitsWaveBuffer+aFreeMem/2, theSize - aFreeMem/2);
}
else // 1 channel (mono)
{
// copy with wrap around at the end of ringbuffer
const size_t bytes_written = copyBuffer(myWrite, theMono16BitsWaveBuffer, aFreeMem);
myWrite = myBuffer;
myWrite += copyBuffer(myWrite, theMono16BitsWaveBuffer+aFreeMem, theSize - aFreeMem);
} // end if (out_channels == 2)
} // end if (aFreeMem >= bytes_to_write)
} // if (myWrite >= aRead)
else // read pointer is ahead the write pointer
{ {
myWrite += copyBuffer(myWrite, theMono16BitsWaveBuffer, theSize);
}
else
SHOW_TIME("wave_write > myWrite <= aRead");
myWrite += copyBuffer(myWrite, theMono16BitsWaveBuffer, theSize);
} // end if (myWrite >= aRead)
bytes_written = bytes_to_write;
myWritePosition += theSize/sizeof(uint16_t); // add number of samples
if (my_stream_could_start && (get_used_mem() >= out_channels * sizeof(uint16_t) * FRAMES_PER_BUFFER))
{ {
int bytes_written = copyBuffer(myWrite, theMono16BitsWaveBuffer, aFreeMem);
myWrite = myBuffer;
myWrite += copyBuffer(myWrite, theMono16BitsWaveBuffer+aFreeMem, bytes_to_write-bytes_written);
}
}
else
{
SHOW_TIME("wave_write > myWrite <= aRead");
myWrite += copyBuffer(myWrite, theMono16BitsWaveBuffer, theSize);
}

bytes_written = theSize;
myWritePosition += theSize/sizeof(uint16_t); // add number of samples

if (my_stream_could_start && (get_used_mem() >= out_channels * sizeof(uint16_t) * FRAMES_PER_BUFFER))
{
start_stream();
}

SHOW_TIME("wave_write > LEAVE");

return bytes_written;
start_stream();
} // end if (my_stream_could_start && (get_used_mem() >= out_channels * sizeof(uint16_t) * FRAMES_PER_BUFFER))
SHOW_TIME("wave_write > LEAVE");
return bytes_written;
} }


//> //>

Loading…
Cancel
Save