Browse Source

code cleanup: move ChangeWordStress()

master
Juho Hiltunen 2 years ago
parent
commit
9d03b09537
3 changed files with 51 additions and 48 deletions
  1. 2
    46
      src/libespeak-ng/dictionary.c
  2. 3
    1
      src/libespeak-ng/dictionary.h
  3. 46
    1
      src/libespeak-ng/translateword.c

+ 2
- 46
src/libespeak-ng/dictionary.c View File

@@ -850,7 +850,7 @@ int Unpronouncable(Translator *tr, char *word, int posn)
return 0;
}

static int GetVowelStress(Translator *tr, unsigned char *phonemes, signed char *vowel_stress, int *vowel_count, int *stressed_syllable, int control)
int GetVowelStress(Translator *tr, unsigned char *phonemes, signed char *vowel_stress, int *vowel_count, int *stressed_syllable, int control)
{
// control = 1, set stress to 1 for forced unstressed vowels
unsigned char phcode;
@@ -962,55 +962,11 @@ static int GetVowelStress(Translator *tr, unsigned char *phonemes, signed char *
return max_stress;
}

static char stress_phonemes[] = {
const char stress_phonemes[] = {
phonSTRESS_D, phonSTRESS_U, phonSTRESS_2, phonSTRESS_3,
phonSTRESS_P, phonSTRESS_P2, phonSTRESS_TONIC
};

void ChangeWordStress(Translator *tr, char *word, int new_stress)
{
int ix;
unsigned char *p;
int max_stress;
int vowel_count; // num of vowels + 1
int stressed_syllable = 0; // position of stressed syllable
unsigned char phonetic[N_WORD_PHONEMES];
signed char vowel_stress[N_WORD_PHONEMES/2];

strcpy((char *)phonetic, word);
max_stress = GetVowelStress(tr, phonetic, vowel_stress, &vowel_count, &stressed_syllable, 0);

if (new_stress >= STRESS_IS_PRIMARY) {
// promote to primary stress
for (ix = 1; ix < vowel_count; ix++) {
if (vowel_stress[ix] >= max_stress) {
vowel_stress[ix] = new_stress;
break;
}
}
} else {
// remove primary stress
for (ix = 1; ix < vowel_count; ix++) {
if (vowel_stress[ix] > new_stress) // >= allows for diminished stress (=1)
vowel_stress[ix] = new_stress;
}
}

// write out phonemes
ix = 1;
p = phonetic;
while (*p != 0) {
if ((phoneme_tab[*p]->type == phVOWEL) && !(phoneme_tab[*p]->phflags & phNONSYLLABIC)) {
if ((vowel_stress[ix] == STRESS_IS_DIMINISHED) || (vowel_stress[ix] > STRESS_IS_UNSTRESSED))
*word++ = stress_phonemes[(unsigned char)vowel_stress[ix]];

ix++;
}
*word++ = *p++;
}
*word = 0;
}

void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, int tonic, int control)
{
/* Guess stress pattern of word. This is language specific

+ 3
- 1
src/libespeak-ng/dictionary.h View File

@@ -31,15 +31,17 @@ extern "C"
{
#endif

extern const char stress_phonemes[];

int LoadDictionary(Translator *tr, const char *name, int no_error);
int HashDictionary(const char *string);
const char *EncodePhonemes(const char *p, char *outptr, int *bad_phoneme);
void DecodePhonemes(const char *inptr, char *outptr);
char *WritePhMnemonic(char *phon_out, PHONEME_TAB *ph, PHONEME_LIST *plist, int use_ipa, int *flags);
const char *GetTranslatedPhonemeString(int phoneme_mode);
int GetVowelStress(Translator *tr, unsigned char *phonemes, signed char *vowel_stress, int *vowel_count, int *stressed_syllable, int control);
int IsVowel(Translator *tr, int letter);
int Unpronouncable(Translator *tr, char *word, int posn);
void ChangeWordStress(Translator *tr, char *word, int new_stress);
void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, int tonic, int control);
void AppendPhonemes(Translator *tr, char *string, int size, const char *ph);
int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, char *end_phonemes, int word_flags, unsigned int *dict_flags);

+ 46
- 1
src/libespeak-ng/translateword.c View File

@@ -36,7 +36,7 @@
#include "translate.h"
#include "translateword.h"
#include "common.h" // for strncpy0
#include "dictionary.h" // for TranslateRules, LookupDictList, Cha...
#include "dictionary.h" // for TranslateRules, LookupDictList
#include "numbers.h" // for SetSpellingStress, ...
#include "phoneme.h" // for phonSWITCH, PHONEME_TAB, phonPAUSE_...
#include "readclause.h" // for towlower2
@@ -46,6 +46,7 @@


static void addPluralSuffixes(int flags, Translator *tr, char last_char, char *word_phonemes);
static void ChangeWordStress(Translator *tr, char *word, int new_stress);
static int CheckDottedAbbrev(char *word1);
static int NonAsciiNumber(int letter);
static char *SpeakIndividualLetters(Translator *tr, char *word, char *phonemes, int spell_word, ALPHABET *current_alphabet, char word_phonemes[]);
@@ -667,6 +668,50 @@ int TranslateWord3(Translator *tr, char *word_start, WORD_TAB *wtab, char *word_
}


static void ChangeWordStress(Translator *tr, char *word, int new_stress)
{
int ix;
unsigned char *p;
int max_stress;
int vowel_count; // num of vowels + 1
int stressed_syllable = 0; // position of stressed syllable
unsigned char phonetic[N_WORD_PHONEMES];
signed char vowel_stress[N_WORD_PHONEMES/2];

strcpy((char *)phonetic, word);
max_stress = GetVowelStress(tr, phonetic, vowel_stress, &vowel_count, &stressed_syllable, 0);

if (new_stress >= STRESS_IS_PRIMARY) {
// promote to primary stress
for (ix = 1; ix < vowel_count; ix++) {
if (vowel_stress[ix] >= max_stress) {
vowel_stress[ix] = new_stress;
break;
}
}
} else {
// remove primary stress
for (ix = 1; ix < vowel_count; ix++) {
if (vowel_stress[ix] > new_stress) // >= allows for diminished stress (=1)
vowel_stress[ix] = new_stress;
}
}

// write out phonemes
ix = 1;
p = phonetic;
while (*p != 0) {
if ((phoneme_tab[*p]->type == phVOWEL) && !(phoneme_tab[*p]->phflags & phNONSYLLABIC)) {
if ((vowel_stress[ix] == STRESS_IS_DIMINISHED) || (vowel_stress[ix] > STRESS_IS_UNSTRESSED))
*word++ = stress_phonemes[(unsigned char)vowel_stress[ix]];

ix++;
}
*word++ = *p++;
}
*word = 0;
}

static char *SpeakIndividualLetters(Translator *tr, char *word, char *phonemes, int spell_word, ALPHABET *current_alphabet, char word_phonemes[])
{
int posn = 0;

Loading…
Cancel
Save