Browse Source

SetSpeed() refactoring (#1465)

Unify common parts of two implementations. Split into smaller functions.
master
Juho Hiltunen 2 years ago
parent
commit
ef809dcd7e
No account linked to committer's email address
1 changed files with 81 additions and 152 deletions
  1. 81
    152
      src/libespeak-ng/setlengths.c

+ 81
- 152
src/libespeak-ng/setlengths.c View File

#include "synthesize.h" #include "synthesize.h"
#include "translate.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[]; extern int saved_parameters[];


// convert from words-per-minute to internal speed factor // convert from words-per-minute to internal speed factor
static int speed2 = 121; static int speed2 = 121;
static int speed3 = 118; static int speed3 = 118;


#if HAVE_SONIC_H

void SetSpeed(int control) void SetSpeed(int control)
{ {
int x; int x;
int s1;
int wpm; int wpm;
int wpm2;
int wpm_value;
double sonic;


speed.min_sample_len = espeakRATE_MAXIMUM; speed.min_sample_len = espeakRATE_MAXIMUM;
speed.lenmod_factor = 110; // controls the effect of FRFLAG_LEN_MOD reduce length change speed.lenmod_factor = 110; // controls the effect of FRFLAG_LEN_MOD reduce length change
speed.lenmod2_factor = 100; speed.lenmod2_factor = 100;
speed.min_pause = 5;


wpm = embedded_value[EMBED_S]; wpm = embedded_value[EMBED_S];
if (control == 2) if (control == 2)
wpm = embedded_value[EMBED_S2]; wpm = embedded_value[EMBED_S2];


#if HAVE_SONIC_H
int wpm2;
int wpm_value;
double sonic;

speed.min_pause = 5;

wpm_value = wpm; wpm_value = wpm;


if (voice->speed_percent > 0) if (voice->speed_percent > 0)
return; 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) { 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) { 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; 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) espeak_ng_STATUS SetParameter(int parameter, int value, int relative)
{ {

Loading…
Cancel
Save