Browse Source

Support multi-word text replacements in dictionary list files.

master
Reece H. Dunn 8 years ago
parent
commit
fe14c83372
2 changed files with 35 additions and 12 deletions
  1. 1
    0
      CHANGELOG.md
  2. 34
    12
      src/libespeak-ng/translate.c

+ 1
- 0
CHANGELOG.md View File

* Use language and accent names consistently across the language files. * Use language and accent names consistently across the language files.
* Group the encoding handling into a single place with a clean interface and tests. * Group the encoding handling into a single place with a clean interface and tests.
* Support all ISO 8859 encodings. * Support all ISO 8859 encodings.
* Support for multi-word text replacements in language dictionaries.


bug fixes: bug fixes:



+ 34
- 12
src/libespeak-ng/translate.c View File



extern char *phondata_ptr; extern char *phondata_ptr;


int TranslateWord(Translator *tr, char *word_start, WORD_TAB *wtab, char *word_out)
static int TranslateWord3(Translator *tr, char *word_start, WORD_TAB *wtab, char *word_out)
{ {
// word1 is terminated by space (0x20) character // word1 is terminated by space (0x20) character


if (word_out != NULL) if (word_out != NULL)
strcpy(word_out, word1); strcpy(word_out, word1);


first_char = word1[0];
stress_bits = dictionary_flags[0] & 0x7f;
found = LookupDictList(tr, &word1, phonemes, dictionary_flags2, 0, wtab); // the text replacement
if (dictionary_flags2[0] != 0) {
dictionary_flags[0] = dictionary_flags2[0];
dictionary_flags[1] = dictionary_flags2[1];
if (stress_bits != 0) {
// keep any stress information from the original word
dictionary_flags[0] = (dictionary_flags[0] & ~0x7f) | stress_bits;
}
}
return dictionary_flags[0];
} else if ((found == 0) && (dictionary_flags[0] & FLAG_SKIPWORDS) && !(dictionary_flags[0] & FLAG_ABBREV)) { } else if ((found == 0) && (dictionary_flags[0] & FLAG_SKIPWORDS) && !(dictionary_flags[0] & FLAG_ABBREV)) {
// grouped words, but no translation. Join the words with hyphens. // grouped words, but no translation. Join the words with hyphens.
wordx = word1; wordx = word1;
return dictionary_flags[0]; return dictionary_flags[0];
} }


int TranslateWord(Translator *tr, char *word_start, WORD_TAB *wtab, char *word_out)
{
char words_phonemes[N_WORD_PHONEMES]; // a word translated into phoneme codes
char *phonemes = words_phonemes;
int available = N_WORD_PHONEMES;
int first_word = 1;

int flags = TranslateWord3(tr, word_start, wtab, word_out);
if (flags & FLAG_TEXTMODE && word_out) {
while (*word_out && available > 1) {
TranslateWord3(tr, word_out, wtab, NULL);

int n;
if (first_word) {
n = snprintf(phonemes, available, "%s", word_phonemes);
first_word = 0;
} else {
n = snprintf(phonemes, available, "%c%s", phonEND_WORD, word_phonemes);
}

available -= n;
phonemes += n;

// skip to the next word in a multi-word replacement
while (!isspace(*word_out)) ++word_out;
while (isspace(*word_out)) ++word_out;
}
snprintf(word_phonemes, sizeof(word_phonemes), "%s", words_phonemes);
}
return flags;
}

static void SetPlist2(PHONEME_LIST2 *p, unsigned char phcode) static void SetPlist2(PHONEME_LIST2 *p, unsigned char phcode)
{ {
p->phcode = phcode; p->phcode = phcode;

Loading…
Cancel
Save