|
|
@@ -38,6 +38,10 @@ |
|
|
|
#include "synthesize.h" |
|
|
|
#include "translate.h" |
|
|
|
|
|
|
|
static void SetSpeedFactors(voice_t *voice, int x, int *speed1, int *speed2, int *speed3); |
|
|
|
static void SetSpeedMods(SPEED_FACTORS *speed, int voiceSpeedF1, int wpm, int x); |
|
|
|
static void SetSpeedMultiplier(int *x, int *wpm); |
|
|
|
|
|
|
|
extern int saved_parameters[]; |
|
|
|
|
|
|
|
// convert from words-per-minute to internal speed factor |
|
|
@@ -138,26 +142,26 @@ static int speed1 = 130; |
|
|
|
static int speed2 = 121; |
|
|
|
static int speed3 = 118; |
|
|
|
|
|
|
|
#if HAVE_SONIC_H |
|
|
|
|
|
|
|
void SetSpeed(int control) |
|
|
|
{ |
|
|
|
int x; |
|
|
|
int s1; |
|
|
|
int wpm; |
|
|
|
int wpm2; |
|
|
|
int wpm_value; |
|
|
|
double sonic; |
|
|
|
|
|
|
|
speed.min_sample_len = espeakRATE_MAXIMUM; |
|
|
|
speed.lenmod_factor = 110; // controls the effect of FRFLAG_LEN_MOD reduce length change |
|
|
|
speed.lenmod2_factor = 100; |
|
|
|
speed.min_pause = 5; |
|
|
|
|
|
|
|
wpm = embedded_value[EMBED_S]; |
|
|
|
if (control == 2) |
|
|
|
wpm = embedded_value[EMBED_S2]; |
|
|
|
|
|
|
|
#if HAVE_SONIC_H |
|
|
|
int wpm2; |
|
|
|
int wpm_value; |
|
|
|
double sonic; |
|
|
|
|
|
|
|
speed.min_pause = 5; |
|
|
|
|
|
|
|
wpm_value = wpm; |
|
|
|
|
|
|
|
if (voice->speed_percent > 0) |
|
|
@@ -191,176 +195,101 @@ void SetSpeed(int control) |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (wpm > espeakRATE_MAXIMUM) |
|
|
|
wpm = espeakRATE_MAXIMUM; |
|
|
|
|
|
|
|
wpm2 = wpm; |
|
|
|
if (wpm > 359) wpm2 = 359; |
|
|
|
if (wpm < espeakRATE_MINIMUM) wpm2 = espeakRATE_MINIMUM; |
|
|
|
x = speed_lookup[wpm2-espeakRATE_MINIMUM]; |
|
|
|
#else |
|
|
|
if (voice->speed_percent > 0) |
|
|
|
wpm = (wpm * voice->speed_percent)/100; |
|
|
|
#endif |
|
|
|
|
|
|
|
if (wpm >= 380) |
|
|
|
x = 7; |
|
|
|
if (wpm >= 400) |
|
|
|
x = 6; |
|
|
|
SetSpeedMultiplier(&x, &wpm); |
|
|
|
|
|
|
|
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; |
|
|
|
} |
|
|
|
SetSpeedFactors(voice, x, &speed1, &speed2, &speed3); |
|
|
|
} |
|
|
|
|
|
|
|
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 = espeakRATE_MAXIMUM - (wpm - 400)/2; |
|
|
|
if (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.clause_pause_factor = 0; |
|
|
|
|
|
|
|
if (wpm > 430) |
|
|
|
speed.pause_factor = 12; |
|
|
|
else if (wpm > 400) |
|
|
|
speed.pause_factor = 13; |
|
|
|
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; |
|
|
|
} |
|
|
|
SetSpeedMods(&speed, voice->speedf1, wpm, x); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
void SetSpeed(int control) |
|
|
|
{ |
|
|
|
// This is the earlier version of SetSpeed() before sonic speed-up was added |
|
|
|
int x; |
|
|
|
int s1; |
|
|
|
int wpm; |
|
|
|
static void SetSpeedMultiplier(int *x, int *wpm) { |
|
|
|
int wpm2; |
|
|
|
|
|
|
|
speed.min_sample_len = espeakRATE_MAXIMUM; |
|
|
|
speed.lenmod_factor = 110; // controls the effect of FRFLAG_LEN_MOD reduce length change |
|
|
|
speed.lenmod2_factor = 100; |
|
|
|
if (*wpm > espeakRATE_MAXIMUM) |
|
|
|
*wpm = espeakRATE_MAXIMUM; |
|
|
|
|
|
|
|
wpm = embedded_value[EMBED_S]; |
|
|
|
if (control == 2) |
|
|
|
wpm = embedded_value[EMBED_S2]; |
|
|
|
wpm2 = *wpm; |
|
|
|
if (*wpm > 359) wpm2 = 359; |
|
|
|
if (*wpm < espeakRATE_MINIMUM) { |
|
|
|
wpm2 = espeakRATE_MINIMUM; |
|
|
|
} |
|
|
|
|
|
|
|
if (voice->speed_percent > 0) |
|
|
|
wpm = (wpm * voice->speed_percent)/100; |
|
|
|
if (wpm > espeakRATE_MAXIMUM) |
|
|
|
wpm = espeakRATE_MAXIMUM; |
|
|
|
*x = speed_lookup[wpm2-espeakRATE_MINIMUM]; |
|
|
|
|
|
|
|
wpm2 = wpm; |
|
|
|
if (wpm > 359) wpm2 = 359; |
|
|
|
if (wpm < espeakRATE_MINIMUM) wpm2 = espeakRATE_MINIMUM; |
|
|
|
x = speed_lookup[wpm2-espeakRATE_MINIMUM]; |
|
|
|
if (*wpm >= 380) |
|
|
|
*x = 7; |
|
|
|
if (*wpm >= 400) |
|
|
|
*x = 6; |
|
|
|
} |
|
|
|
|
|
|
|
if (wpm >= 380) |
|
|
|
x = 7; |
|
|
|
if (wpm >= 400) |
|
|
|
x = 6; |
|
|
|
static void SetSpeedFactors(voice_t *voice, int x, int *speed1, int *speed2, int *speed3) { |
|
|
|
// 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 (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 (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; |
|
|
|
} |
|
|
|
static void SetSpeedMods(SPEED_FACTORS *speed, int voiceSpeedF1, int wpm, int x) { |
|
|
|
// 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 |
|
|
|
int s1 = (x * voiceSpeedF1)/256; |
|
|
|
|
|
|
|
if (wpm >= 350) |
|
|
|
speed.wav_factor = wav_factor_350[wpm-350]; |
|
|
|
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 >= 390) { |
|
|
|
speed.min_sample_len = espeakRATE_MAXIMUM - (wpm - 400)/2; |
|
|
|
if (wpm > 440) |
|
|
|
speed.min_sample_len = 420 - (wpm - 440); |
|
|
|
} |
|
|
|
if (wpm >= 350) |
|
|
|
speed->wav_factor = wav_factor_350[wpm-350]; |
|
|
|
|
|
|
|
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; |
|
|
|
else if (wpm > 400) |
|
|
|
speed.pause_factor = 13; |
|
|
|
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; |
|
|
|
} |
|
|
|
if (wpm >= 390) { |
|
|
|
speed->min_sample_len = espeakRATE_MAXIMUM - (wpm - 400)/2; |
|
|
|
if (wpm > 440) |
|
|
|
speed->min_sample_len = 420 - (wpm - 440); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
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; |
|
|
|
else if (wpm > 400) |
|
|
|
speed->pause_factor = 13; |
|
|
|
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; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
espeak_ng_STATUS SetParameter(int parameter, int value, int relative) |
|
|
|
{ |