From bc16f819dd7c2889ff5b1ebfcb32095cb0f457ac Mon Sep 17 00:00:00 2001 From: Juho Hiltunen Date: Mon, 24 Oct 2022 21:49:12 +0300 Subject: [PATCH 1/6] cleanup: refactor and remove duplication from SetSpeed() implementations. There are two SetSpeed(), one for Sonic and one without. The differences are very small. In SetSpeedMods(), sample rate is adjusted for Sonic only: speed.min_sample_len = (speed.min_sample_len * samplerate_native) / 22050; Since samplerate_native is 22050 at the moment this line has no effect. --- src/libespeak-ng/setlengths.c | 149 +++++++++++++--------------------- 1 file changed, 57 insertions(+), 92 deletions(-) diff --git a/src/libespeak-ng/setlengths.c b/src/libespeak-ng/setlengths.c index 4db3e148..80acaaef 100644 --- a/src/libespeak-ng/setlengths.c +++ b/src/libespeak-ng/setlengths.c @@ -38,6 +38,8 @@ #include "synthesize.h" #include "translate.h" +static void SetSpeedMods(int wpm, int x); + extern int saved_parameters[]; // convert from words-per-minute to internal speed factor @@ -143,7 +145,6 @@ static int speed3 = 118; void SetSpeed(int control) { int x; - int s1; int wpm; int wpm2; int wpm_value; @@ -218,53 +219,8 @@ void SetSpeed(int control) } 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(wpm, x); + } } #else @@ -273,7 +229,6 @@ 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; @@ -314,54 +269,64 @@ void SetSpeed(int control) } 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(wpm, x); } } #endif +static void SetSpeedMods(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 * 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); + } + +#if HAVE_SONIC_H + // adjust for different sample rates + speed.min_sample_len = (speed.min_sample_len * samplerate_native) / 22050; +#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) { // parameter: reset-all, amp, pitch, speed, linelength, expression, capitals, number grouping From a4c70d7921c6ce8f2f31d98e1fee246569d936d5 Mon Sep 17 00:00:00 2001 From: Juho Hiltunen Date: Tue, 25 Oct 2022 18:24:27 +0300 Subject: [PATCH 2/6] cleanup: remove setting samplerate with Sonic. we currently only support 22050 as samplerate so this code has no effect. This should be readded to setSpeed() with and without Sonic if multiple samplerates are supported in the future. --- src/libespeak-ng/setlengths.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/libespeak-ng/setlengths.c b/src/libespeak-ng/setlengths.c index 80acaaef..7713f60b 100644 --- a/src/libespeak-ng/setlengths.c +++ b/src/libespeak-ng/setlengths.c @@ -303,11 +303,6 @@ static void SetSpeedMods(int wpm, int x) { speed.min_sample_len = 420 - (wpm - 440); } -#if HAVE_SONIC_H - // adjust for different sample rates - speed.min_sample_len = (speed.min_sample_len * samplerate_native) / 22050; -#endif - speed.pause_factor = (256 * s1)/115; // full speed adjustment, used for pause length speed.clause_pause_factor = 0; From 9e9fb16b569ae18ef3a00c0c83d52d3bed376eec Mon Sep 17 00:00:00 2001 From: Juho Hiltunen Date: Tue, 25 Oct 2022 18:42:38 +0300 Subject: [PATCH 3/6] cleanup: use parameters instead of globals with SetSpeedMods --- src/libespeak-ng/setlengths.c | 62 +++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/src/libespeak-ng/setlengths.c b/src/libespeak-ng/setlengths.c index 7713f60b..347cec12 100644 --- a/src/libespeak-ng/setlengths.c +++ b/src/libespeak-ng/setlengths.c @@ -38,7 +38,7 @@ #include "synthesize.h" #include "translate.h" -static void SetSpeedMods(int wpm, int x); +static void SetSpeedMods(SPEED_FACTORS *speed, int voiceSpeedF1, int wpm, int x); extern int saved_parameters[]; @@ -219,8 +219,8 @@ void SetSpeed(int control) } if (control & 2) { - SetSpeedMods(wpm, x); - } + SetSpeedMods(&speed, voice->speedf1, wpm, x); + } } #else @@ -269,56 +269,70 @@ void SetSpeed(int control) } if (control & 2) { - SetSpeedMods(wpm, x); + SetSpeedMods(&speed, voice->speedf1, wpm, x); + } } #endif -static void SetSpeedMods(int wpm, int x) { +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; + 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; + speed->lenmod_factor = 110 - (wpm - 250)/4; + speed->lenmod2_factor = 110 - (wpm - 250)/2; } - int s1 = (x * voice->speedf1)/256; + int s1 = (x * voiceSpeedF1)/256; if (wpm >= 170) - speed.wav_factor = 110 + (150*s1)/128; // reduced speed adjustment, used for playing recorded sounds + 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 + speed->wav_factor = 128 + (128*s1)/130; // = 215 at 170 wpm if (wpm >= 350) - speed.wav_factor = wav_factor_350[wpm-350]; + speed->wav_factor = wav_factor_350[wpm-350]; if (wpm >= 390) { - speed.min_sample_len = espeakRATE_MAXIMUM - (wpm - 400)/2; + speed->min_sample_len = espeakRATE_MAXIMUM - (wpm - 400)/2; if (wpm > 440) - speed.min_sample_len = 420 - (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; + 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->pause_factor = 12; else if (wpm > 400) - speed.pause_factor = 13; + speed->pause_factor = 13; else if (wpm > 374) - speed.pause_factor = 14; + speed->pause_factor = 14; else if (wpm > 350) - speed.pause_factor = pause_factor_350[wpm - 350]; + speed->pause_factor = pause_factor_350[wpm - 350]; - if (speed.clause_pause_factor == 0) { + 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 ((speed->clause_pause_factor = speed->pause_factor) < 16) + speed->clause_pause_factor = 16; } } From 84f58824af73dff1dd9c190bb6fb97083f55eb24 Mon Sep 17 00:00:00 2001 From: Juho Hiltunen Date: Tue, 25 Oct 2022 18:50:54 +0300 Subject: [PATCH 4/6] cleanup: refactor and remove duplication from SetSpeed() implementations. --- src/libespeak-ng/setlengths.c | 33 ++++++++------------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/src/libespeak-ng/setlengths.c b/src/libespeak-ng/setlengths.c index 347cec12..6cd18497 100644 --- a/src/libespeak-ng/setlengths.c +++ b/src/libespeak-ng/setlengths.c @@ -38,6 +38,7 @@ #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); extern int saved_parameters[]; @@ -206,16 +207,7 @@ void SetSpeed(int control) 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; - } + SetSpeedFactors(voice, x, &speed1, &speed2, &speed3); } if (control & 2) { @@ -256,16 +248,7 @@ void SetSpeed(int control) 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; - } + SetSpeedFactors(voice, x, &speed1, &speed2, &speed3); } if (control & 2) { @@ -279,13 +262,13 @@ void SetSpeed(int control) 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; + *speed1 = (x * voice->speedf1)/256; + *speed2 = (x * voice->speedf2)/256; + *speed3 = (x * voice->speedf3)/256; if (x <= 7) { - speed1 = x; - speed2 = speed3 = x - 1; + *speed1 = x; + *speed2 = *speed3 = x - 1; } } From 0c82988b44a930600bbfc8af031d0a7d2fef8dd6 Mon Sep 17 00:00:00 2001 From: Juho Hiltunen Date: Tue, 25 Oct 2022 19:04:09 +0300 Subject: [PATCH 5/6] cleanup: refactor and remove duplication from SetSpeed() implementations. --- src/libespeak-ng/setlengths.c | 46 +++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/libespeak-ng/setlengths.c b/src/libespeak-ng/setlengths.c index 6cd18497..eaf933f5 100644 --- a/src/libespeak-ng/setlengths.c +++ b/src/libespeak-ng/setlengths.c @@ -40,6 +40,7 @@ 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[]; @@ -193,18 +194,7 @@ 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; + SetSpeedMultiplier(&x, &wpm); if (control & 1) { SetSpeedFactors(voice, x, &speed1, &speed2, &speed3); @@ -234,18 +224,8 @@ void SetSpeed(int control) if (voice->speed_percent > 0) wpm = (wpm * voice->speed_percent)/100; - 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; + SetSpeedMultiplier(&x, &wpm); if (control & 1) { SetSpeedFactors(voice, x, &speed1, &speed2, &speed3); @@ -259,6 +239,26 @@ void SetSpeed(int control) #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() From 8170775113b2af77e2f2d9fb07bc51e13f539d05 Mon Sep 17 00:00:00 2001 From: Juho Hiltunen Date: Tue, 25 Oct 2022 19:18:16 +0300 Subject: [PATCH 6/6] code cleanup: refactor and remove duplication by unifying SetSpeed() implemantations. It is unclear why the two implementations differ. --- src/libespeak-ng/setlengths.c | 46 +++++++---------------------------- 1 file changed, 9 insertions(+), 37 deletions(-) diff --git a/src/libespeak-ng/setlengths.c b/src/libespeak-ng/setlengths.c index eaf933f5..989278cc 100644 --- a/src/libespeak-ng/setlengths.c +++ b/src/libespeak-ng/setlengths.c @@ -142,25 +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 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) @@ -194,36 +195,10 @@ void SetSpeed(int control) return; } - SetSpeedMultiplier(&x, &wpm); - - if (control & 1) { - SetSpeedFactors(voice, x, &speed1, &speed2, &speed3); - } - - if (control & 2) { - 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 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; + #endif SetSpeedMultiplier(&x, &wpm); @@ -233,12 +208,9 @@ void SetSpeed(int control) if (control & 2) { SetSpeedMods(&speed, voice->speedf1, wpm, x); - } } -#endif - static void SetSpeedMultiplier(int *x, int *wpm) { int wpm2;