diff --git a/src/libespeak-ng/setlengths.c b/src/libespeak-ng/setlengths.c index 4db3e148..989278cc 100644 --- a/src/libespeak-ng/setlengths.c +++ b/src/libespeak-ng/setlengths.c @@ -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]; - - 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 = 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; - } - } -} - -#else - -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.min_sample_len = espeakRATE_MAXIMUM; - 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]; - + #else if (voice->speed_percent > 0) wpm = (wpm * voice->speed_percent)/100; - if (wpm > espeakRATE_MAXIMUM) - wpm = espeakRATE_MAXIMUM; + #endif - 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; + 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); - } - - 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); } } -#endif +static void SetSpeedMultiplier(int *x, int *wpm) { + int wpm2; + + 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]; + + 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 (x <= 7) { + *speed1 = x; + *speed2 = *speed3 = x - 1; + } +} + +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; + } + + + int s1 = (x * voiceSpeedF1)/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); + } + + 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) {