Fixes for different sample rates. Fix bug in 1.46.36 where pause at end of a sentence was missing. git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@303 d46cf337-b52f-0410-862d-fd96e6ae7743master
ts; v w x z Z Z; | ts; v w x z Z Z; | ||||
Dictionary pt_dict 2013-02-19 | |||||
Dictionary pt_dict 2013-02-20 | |||||
& &/ &U~ &~ @ @- a A | & &/ &U~ &~ @ @- a A | ||||
aI aU e E eI EI eU EU | aI aU e E eI EI eU EU |
[l/] fr | [l/] fr | ||||
l/l_@ [l/3] base | l/l_@ [l/3] base | ||||
[l/] fr | [l/] fr | ||||
l/l@ [L¸j] base | |||||
l/l@ [h6s] base | |||||
[l#] base | [l#] base | ||||
[l] fr | [l] fr | ||||
[l/2] fr | [l/2] fr | ||||
l/L2_uL [l/2] base | l/L2_uL [l/2] base | ||||
l/l_3 [l/] de | l/l_3 [l/] de | ||||
l/l_4 [ll] sq | l/l_4 [ll] sq | ||||
l/la [L¸j] base | |||||
l/la [h6s] base | |||||
[l#] base | [l#] base | ||||
[l] fr | [l] fr | ||||
[l/2] fr | [l/2] fr | ||||
[K] tn | [K] tn | ||||
l/l_a [l/3] base | l/l_a [l/3] base | ||||
[l/] fr | [l/] fr | ||||
l/le [L¸j] base | |||||
l/le [h6s] base | |||||
[l#] base | [l#] base | ||||
[l] fr | [l] fr | ||||
[l/2] fr | [l/2] fr | ||||
[&:] af | [&:] af | ||||
l/l_front [L] sq | l/l_front [L] sq | ||||
l/l_front_ [l/4] sq | l/l_front_ [l/4] sq | ||||
l/li [L¸j] base | |||||
l/li [h6s] base | |||||
[l#] base | [l#] base | ||||
[l] fr | [l] fr | ||||
[l/2] fr | [l/2] fr | ||||
ll/_ll [L] base | ll/_ll [L] base | ||||
l/l_long [l] base | l/l_long [l] base | ||||
[l] fr | [l] fr | ||||
l/lo [L¸j] base | |||||
l/lo [h6s] base | |||||
[l#] base | [l#] base | ||||
[l/2] fr | [l/2] fr | ||||
[K] nso | [K] nso | ||||
[l;] lt | [l;] lt | ||||
[l] ru | [l] ru | ||||
[l^] ru | [l^] ru | ||||
l/lu [L¸j] base | |||||
l/lu [h6s] base | |||||
[l#] base | [l#] base | ||||
[l] fr | [l] fr | ||||
[l/2] fr | [l/2] fr | ||||
vwl_en_us/or [o@] en-us | vwl_en_us/or [o@] en-us | ||||
[O:] en-sc | [O:] en-sc | ||||
vwl_en_us/ur [U@] en-us | vwl_en_us/ur [U@] en-us | ||||
vwl_fr/@2r [L¸j] fr | |||||
vwl_fr/a2r [L¸j] fr | |||||
vwl_fr/aa2r [L¸j] fr | |||||
vwl_fr/@2r [] fr | |||||
vwl_fr/a2r [] fr | |||||
vwl_fr/aa2r [] fr | |||||
vwl_fr/br [r/2] fr | vwl_fr/br [r/2] fr | ||||
vwl_fr/e2r [L¸j] fr | |||||
vwl_fr/e_2r [L¸j] fr | |||||
vwl_fr/ee2r [L¸j] fr | |||||
vwl_fr/i2r [L¸j] fr | |||||
vwl_fr/e2r [] fr | |||||
vwl_fr/e_2r [] fr | |||||
vwl_fr/ee2r [] fr | |||||
vwl_fr/i2r [] fr | |||||
vwl_fr/j [j/] fr | vwl_fr/j [j/] fr | ||||
vwl_fr/lo [l] fr | vwl_fr/lo [l] fr | ||||
vwl_fr/o2r [L¸j] fr | |||||
vwl_fr/oo2r [L¸j] fr | |||||
vwl_fr/o2r [] fr | |||||
vwl_fr/oo2r [] fr | |||||
vwl_fr/r [r] fr | vwl_fr/r [r] fr | ||||
[r/2] fr | [r/2] fr | ||||
vwl_fr/r_ [r/] fr | vwl_fr/r_ [r/] fr | ||||
vwl_fr/r_@ [r/] fr | vwl_fr/r_@ [r/] fr | ||||
vwl_fr/r@ [L¸j] fr | |||||
vwl_fr/r@ [] fr | |||||
vwl_fr/@R [x] pt-pt | vwl_fr/@R [x] pt-pt | ||||
vwl_fr/r@2 [L¸j] fr | |||||
vwl_fr/r@2 [] fr | |||||
vwl_fr/@R2 [R] fr-ca | vwl_fr/@R2 [R] fr-ca | ||||
vwl_fr/ra [L¸j] fr | |||||
vwl_fr/ra [] fr | |||||
vwl_fr/r_a [r/] fr | vwl_fr/r_a [r/] fr | ||||
vwl_fr/raa [L¸j] fr | |||||
vwl_fr/re [L¸j] fr | |||||
vwl_fr/raa [] fr | |||||
vwl_fr/re [] fr | |||||
vwl_fr/r_e [r/] fr | vwl_fr/r_e [r/] fr | ||||
vwl_fr/re2 [L¸j] fr | |||||
vwl_fr/ree [L¸j] fr | |||||
vwl_fr/ri [L¸j] fr | |||||
vwl_fr/re2 [] fr | |||||
vwl_fr/ree [] fr | |||||
vwl_fr/ri [] fr | |||||
vwl_fr/r_i [r/] fr | vwl_fr/r_i [r/] fr | ||||
vwl_fr/rj [L¸j] fr | |||||
vwl_fr/rj [] fr | |||||
vwl_fr/r_n [r/] fr | vwl_fr/r_n [r/] fr | ||||
vwl_fr/ro [L¸j] fr | |||||
vwl_fr/ro [] fr | |||||
vwl_fr/r_o [r/] fr | vwl_fr/r_o [r/] fr | ||||
vwl_fr/roo [L¸j] fr | |||||
vwl_fr/roo [] fr | |||||
vwl_fr/rr [r/] fr | vwl_fr/rr [r/] fr | ||||
vwl_fr/ru [L¸j] fr | |||||
vwl_fr/ru [] fr | |||||
vwl_fr/r_u [r/] fr | vwl_fr/r_u [r/] fr | ||||
vwl_fr/rw [L¸j] fr | |||||
vwl_fr/ry [L¸j] fr | |||||
vwl_fr/rw [] fr | |||||
vwl_fr/ry [] fr | |||||
vwl_fr/r_y [r/] fr | vwl_fr/r_y [r/] fr | ||||
vwl_fr/tr [r/2] fr | vwl_fr/tr [r/2] fr | ||||
vwl_fr/trr [r/] fr | vwl_fr/trr [r/] fr | ||||
vwl_fr/u2r [L¸j] fr | |||||
vwl_fr/u2r [] fr | |||||
vwl_fr/wa [w] fr | vwl_fr/wa [w] fr | ||||
[w/] fr | [w/] fr | ||||
vwl_fr/y2r [L¸j] fr | |||||
vwl_fr/y2r [] fr | |||||
vwl_hi/l-voc [l-] base | vwl_hi/l-voc [l-] base | ||||
[l] lt | [l] lt | ||||
[l-] sk | [l-] sk |
vowel starttype #@ endtype #@ | vowel starttype #@ endtype #@ | ||||
ipa ɐU+0303 | ipa ɐU+0303 | ||||
length 180 | length 180 | ||||
IF thisPh(isStressed) THEN | |||||
IF thisPh(isFinalVowel) THEN | |||||
FMT(vnasal/W_n) | FMT(vnasal/W_n) | ||||
ELSE | ELSE | ||||
FMT(vnasal/a#_n) | FMT(vnasal/a#_n) |
15,15,15,15,15}; // 370 | 15,15,15,15,15}; // 370 | ||||
// wav_factor adjustments for speeds 350 to 450 | // wav_factor adjustments for speeds 350 to 450 | ||||
// Use this to calibrate speed for wpm 350-450 | |||||
// Use this to calibrate speed for wpm 350-450 | |||||
static unsigned char wav_factor_350[] = { | static unsigned char wav_factor_350[] = { | ||||
120, 121, 120, 119, 119, // 350 | 120, 121, 120, 119, 119, // 350 | ||||
118, 118, 117, 116, 116, // 355 | 118, 118, 117, 116, 116, // 355 | ||||
speed.min_sample_len = 420 - (wpm - 440); | speed.min_sample_len = 420 - (wpm - 440); | ||||
} | } | ||||
// adjust for different sample rates | |||||
speed.min_sample_len = (speed.min_sample_len * samplerate_native) / 22050; | |||||
speed.pause_factor = (256 * s1)/115; // full speed adjustment, used for pause length | speed.pause_factor = (256 * s1)/115; // full speed adjustment, used for pause length | ||||
speed.clause_pause_factor = 0; | speed.clause_pause_factor = 0; | ||||
if((amp >= 0) && (amp <= 20)) | if((amp >= 0) && (amp <= 20)) | ||||
{ | { | ||||
option_amplitude = (amplitude_factor[amp] * 480)/256; | |||||
option_amplitude = (amplitude_factor[amp] * 480)/256; | |||||
} | } | ||||
} | } | ||||
#endif | #endif | ||||
case phPAUSE: | case phPAUSE: | ||||
last_pitch = 0; | last_pitch = 0; | ||||
break; | break; | ||||
case phSTOP: | case phSTOP: | ||||
last_pitch = 0; | last_pitch = 0; | ||||
if(prev->type == phFRICATIVE) | if(prev->type == phFRICATIVE) | ||||
p->amp = tr->stress_amps[0]; // unless changed later | p->amp = tr->stress_amps[0]; // unless changed later | ||||
p->length = 256; // TEMPORARY | p->length = 256; // TEMPORARY | ||||
min_drop = 0; | min_drop = 0; | ||||
if(p->newword) | if(p->newword) | ||||
{ | { | ||||
if(prev->type==phLIQUID) | if(prev->type==phLIQUID) | ||||
if((prev->type==phVOWEL) || (prev->type == phLIQUID)) | if((prev->type==phVOWEL) || (prev->type == phLIQUID)) | ||||
{ | { | ||||
p->length = prev->length; | p->length = prev->length; | ||||
if(p->type == phLIQUID) | if(p->type == phLIQUID) | ||||
{ | { | ||||
p->length = speed1; | p->length = speed1; | ||||
} | } | ||||
if(next->type == phVSTOP) | if(next->type == phVSTOP) | ||||
{ | { | ||||
p->length = (p->length * 160)/100; | p->length = (p->length * 160)/100; | ||||
next->synthflags &= ~SFLAG_SEQCONTINUE; | next->synthflags &= ~SFLAG_SEQCONTINUE; | ||||
if(next->type == phNASAL && next2->type != phVOWEL) | if(next->type == phNASAL && next2->type != phVOWEL) | ||||
next->synthflags |= SFLAG_SEQCONTINUE; | next->synthflags |= SFLAG_SEQCONTINUE; | ||||
if(next->type == phLIQUID) | if(next->type == phLIQUID) | ||||
{ | { | ||||
next->synthflags |= SFLAG_SEQCONTINUE; | next->synthflags |= SFLAG_SEQCONTINUE; | ||||
if(next2->type == phVOWEL) | if(next2->type == phVOWEL) | ||||
{ | { | ||||
next->synthflags &= ~SFLAG_SEQCONTINUE; | next->synthflags &= ~SFLAG_SEQCONTINUE; |
#include "translate.h" | #include "translate.h" | ||||
#include "wave.h" | #include "wave.h" | ||||
const char *version_string = "1.46.36 20.Feb.13"; | |||||
const char *version_string = "1.46.37 20.Feb.13"; | |||||
const int version_phdata = 0x014636; | const int version_phdata = 0x014636; | ||||
int option_device_number = -1; | int option_device_number = -1; |
DoPause(0,0); // isolate from the previous clause | DoPause(0,0); // isolate from the previous clause | ||||
} | } | ||||
while(ix < (*n_ph)) | |||||
while((ix < (*n_ph)) && (ix < N_PHONEME_LIST-2)) | |||||
{ | { | ||||
p = &phoneme_list[ix]; | p = &phoneme_list[ix]; | ||||
prev = &phoneme_list[ix-1]; | prev = &phoneme_list[ix-1]; | ||||
next = &phoneme_list[ix+1]; | next = &phoneme_list[ix+1]; | ||||
next2 = &phoneme_list[ix+2]; | next2 = &phoneme_list[ix+2]; | ||||
if(next2->ph == NULL) | |||||
break; | |||||
if(p->synthflags & SFLAG_EMBEDDED) | if(p->synthflags & SFLAG_EMBEDDED) | ||||
{ | { |
voice->voicing = 64; | voice->voicing = 64; | ||||
voice->consonant_amp = 100; | voice->consonant_amp = 100; | ||||
voice->consonant_ampv = 100; | voice->consonant_ampv = 100; | ||||
voice->samplerate = 22050; | |||||
voice->samplerate = samplerate_native; | |||||
memset(voice->klattv,0,sizeof(voice->klattv)); | memset(voice->klattv,0,sizeof(voice->klattv)); | ||||
speed.fast_settings[0] = 450; | speed.fast_settings[0] = 450; | ||||
if(tone_only) | if(tone_only) | ||||
break; | break; | ||||
priority = DEFAULT_LANGUAGE_PRIORITY; | priority = DEFAULT_LANGUAGE_PRIORITY; | ||||
language_name[0] = 0; | language_name[0] = 0; | ||||
sscanf(p,"%s %d",language_name,&priority); | sscanf(p,"%s %d",language_name,&priority); | ||||
if(strcmp(language_name,"variant") == 0) | if(strcmp(language_name,"variant") == 0) | ||||
break; | break; | ||||
len = strlen(language_name) + 2; | len = strlen(language_name) + 2; | ||||
// check for space in languages[] | // check for space in languages[] | ||||
if(len < (sizeof(voice_languages)-langix-1)) | if(len < (sizeof(voice_languages)-langix-1)) | ||||
{ | { | ||||
voice_languages[langix] = priority; | voice_languages[langix] = priority; | ||||
strcpy(&voice_languages[langix+1],language_name); | strcpy(&voice_languages[langix+1],language_name); | ||||
langix += len; | langix += len; | ||||
} | } | ||||
// only act on the first language line | // only act on the first language line | ||||
if(language_set == 0) | if(language_set == 0) | ||||
{ | { | ||||
strcpy(new_dictionary,language_type); | strcpy(new_dictionary,language_type); | ||||
strcpy(phonemes_name,language_type); | strcpy(phonemes_name,language_type); | ||||
SelectPhonemeTableName(phonemes_name); | SelectPhonemeTableName(phonemes_name); | ||||
if(new_translator != NULL) | if(new_translator != NULL) | ||||
DeleteTranslator(new_translator); | DeleteTranslator(new_translator); | ||||
new_translator = SelectTranslator(translator_name); | new_translator = SelectTranslator(translator_name); | ||||
langopts = &new_translator->langopts; | langopts = &new_translator->langopts; | ||||
} | } | ||||
{ | { | ||||
// voice variant name, not number | // voice variant name, not number | ||||
sprintf(variant_name, "%s%s", variant_prefix, p); | sprintf(variant_name, "%s%s", variant_prefix, p); | ||||
} | |||||
} | |||||
} | } | ||||
} | } | ||||
if(variant_num > 0) | if(variant_num > 0) | ||||
{ | { | ||||
if(variant_num < 10) | if(variant_num < 10) | ||||
{ | { | ||||
// no language is specified. Get language from the named voice | // no language is specified. Get language from the named voice | ||||
static char buf[60]; | static char buf[60]; | ||||
if(voice_select2.name == NULL) | if(voice_select2.name == NULL) | ||||
{ | { | ||||
if((voice_select2.name = voice_select2.identifier) == NULL) | if((voice_select2.name = voice_select2.identifier) == NULL) | ||||
voice_select2.name = "default"; | voice_select2.name = "default"; | ||||
} | } | ||||
strncpy0(buf,voice_select2.name,sizeof(buf)); | strncpy0(buf,voice_select2.name,sizeof(buf)); | ||||
variant_name = ExtractVoiceVariantName(buf,0,0); | variant_name = ExtractVoiceVariantName(buf,0,0); | ||||
} | } | ||||
if(skip==0) | if(skip==0) | ||||
{ | { | ||||
voices2[ix2++] = vp; | |||||
voices2[ix2++] = vp; | |||||
} | } | ||||
for(j=0; (j < vp->xx1) && (n_variants < N_VOICE_VARIANTS);) | for(j=0; (j < vp->xx1) && (n_variants < N_VOICE_VARIANTS);) | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
// a regular line, add it to the voices list | |||||
// a regular line, add it to the voices list | |||||
if((f_voice = fopen(fname,"r")) == NULL) | if((f_voice = fopen(fname,"r")) == NULL) | ||||
continue; | continue; | ||||
// pass voice file name within the voices directory | // pass voice file name within the voices directory | ||||
voice_data = ReadVoiceFile(f_voice, fname+len_path_voices, &buf[20]); | voice_data = ReadVoiceFile(f_voice, fname+len_path_voices, &buf[20]); | ||||
fclose(f_voice); | fclose(f_voice); | ||||
else | else | ||||
if(ftype > 0) | if(ftype > 0) | ||||
{ | { | ||||
// a regular line, add it to the voices list | |||||
// a regular line, add it to the voices list | |||||
if((f_voice = fopen(fname,"r")) == NULL) | if((f_voice = fopen(fname,"r")) == NULL) | ||||
continue; | continue; | ||||
// pass voice file name within the voices directory | // pass voice file name within the voices directory | ||||
voice_data = ReadVoiceFile(f_voice, fname+len_path_voices, FindFileData.cFileName); | voice_data = ReadVoiceFile(f_voice, fname+len_path_voices, FindFileData.cFileName); | ||||
fclose(f_voice); | fclose(f_voice); | ||||
else | else | ||||
if(ftype > 0) | if(ftype > 0) | ||||
{ | { | ||||
// a regular line, add it to the voices list | |||||
// a regular line, add it to the voices list | |||||
if((f_voice = fopen(fname,"r")) == NULL) | if((f_voice = fopen(fname,"r")) == NULL) | ||||
continue; | continue; | ||||
// pass voice file name within the voices directory | // pass voice file name within the voices directory | ||||
voice_data = ReadVoiceFile(f_voice, fname+len_path_voices, ent->d_name); | voice_data = ReadVoiceFile(f_voice, fname+len_path_voices, ent->d_name); | ||||
fclose(f_voice); | fclose(f_voice); |