mirror of
https://github.com/rhasspy/espeak-ng.git
synced 2026-10-31 05:35:35 +00:00
SetSpeed() refactoring (#1465)
Unify common parts of two implementations. Split into smaller functions.
This commit is contained in:
+95
-166
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user