From e03ab8a8c4477bbb1504bf22d50b9dada0c3ac89 Mon Sep 17 00:00:00 2001 From: Juho Hiltunen Date: Mon, 10 Oct 2022 21:03:47 +0300 Subject: [PATCH 1/5] tests: add a test for langopts.spelling_stress --- tests/voices.test | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/voices.test b/tests/voices.test index 59fce254..c045aa47 100755 --- a/tests/voices.test +++ b/tests/voices.test @@ -5,3 +5,4 @@ ##### Voice options test_phon ka "s'asi,amovn,oa t#k#v'eni g'ats#noba r'ogor brdz'andebit#" "სასიამოვნოა თქვენი გაცნობა. როგორ ბრძანდებით" "lowercaseSentence" #872 +test_phon fi "'a:b,e:s,e:" "abc" "spelling_stress" From f342b5d31994a69a0610aa4c085032a9aa695950 Mon Sep 17 00:00:00 2001 From: Juho Hiltunen Date: Mon, 10 Oct 2022 20:24:43 +0300 Subject: [PATCH 2/5] cleanup: make spelling_stress bool and set default value --- src/libespeak-ng/numbers.c | 2 +- src/libespeak-ng/tr_languages.c | 17 +++++++++-------- src/libespeak-ng/translate.h | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/libespeak-ng/numbers.c b/src/libespeak-ng/numbers.c index 96903ec5..28b9b265 100644 --- a/src/libespeak-ng/numbers.c +++ b/src/libespeak-ng/numbers.c @@ -657,7 +657,7 @@ void SetSpellingStress(Translator *tr, char *phonemes, int control, int n_chars) if ((c == phonSTRESS_P) && (n_chars > 1) && (prev != phonSWITCH)) { count++; - if (tr->langopts.spelling_stress == 1) { + if (tr->langopts.spelling_stress) { // stress on initial letter when spelling if (count > 1) c = phonSTRESS_3; diff --git a/src/libespeak-ng/tr_languages.c b/src/libespeak-ng/tr_languages.c index 038bc10a..c5fd3d46 100644 --- a/src/libespeak-ng/tr_languages.c +++ b/src/libespeak-ng/tr_languages.c @@ -302,6 +302,7 @@ static Translator *NewTranslator(void) tr->langopts.param[LOPT_UNPRONOUNCABLE] = 's'; // don't count this character at start of word tr->langopts.param[LOPT_BRACKET_PAUSE] = 4; // pause at bracket tr->langopts.param[LOPT_BRACKET_PAUSE_ANNOUNCED] = 2; // pauses when announcing bracket names + tr->langopts.spelling_stress = false; tr->langopts.max_initial_consonants = 3; tr->langopts.replace_chars = NULL; tr->langopts.alt_alphabet_lang = L('e', 'n'); @@ -803,7 +804,7 @@ Translator *SelectTranslator(const char *name) tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_DFRACTION_2 | NUM_ORDINAL_DOT; SetLetterVowel(tr, 'y'); - tr->langopts.spelling_stress = 1; + tr->langopts.spelling_stress = true; } break; case L('f', 'r'): // french @@ -900,7 +901,7 @@ Translator *SelectTranslator(const char *name) tr->langopts.stress_flags = S_FINAL_NO_2; tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x3; tr->langopts.max_initial_consonants = 5; - tr->langopts.spelling_stress = 1; + tr->langopts.spelling_stress = true; tr->langopts.accents = 1; tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_DECIMAL_COMMA | NUM_THOUS_SPACE | NUM_DFRACTION_2 | NUM_ROMAN_CAPITALS; @@ -936,7 +937,7 @@ Translator *SelectTranslator(const char *name) tr->langopts.max_roman = 899; tr->langopts.min_roman = 1; SetLetterVowel(tr, 'y'); - tr->langopts.spelling_stress = 1; + tr->langopts.spelling_stress = true; SetLengthMods(tr, 3); // all equal } break; @@ -1180,7 +1181,7 @@ Translator *SelectTranslator(const char *name) SetupTranslator(tr, stress_lengths_lv, stress_amps_lv); tr->langopts.stress_rule = STRESSPOSN_1L; - tr->langopts.spelling_stress = 1; + tr->langopts.spelling_stress = true; tr->encoding = ESPEAKNG_ENCODING_ISO_8859_4; tr->langopts.max_digits = 33; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED | NUM_DFRACTION_4 | NUM_ORDINAL_DOT; @@ -1322,7 +1323,7 @@ Translator *SelectTranslator(const char *name) tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x3; tr->langopts.max_initial_consonants = 5; - tr->langopts.spelling_stress = 1; + tr->langopts.spelling_stress = true; tr->langopts.param[LOPT_COMBINE_WORDS] = 4; // combine some prepositions with the following word tr->langopts.numbers = NUM_OMIT_1_HUNDRED | NUM_DFRACTION_2 | NUM_ROMAN; @@ -1346,7 +1347,7 @@ Translator *SelectTranslator(const char *name) tr->langopts.stress_rule = STRESSPOSN_1L; tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; - tr->langopts.spelling_stress = 1; + tr->langopts.spelling_stress = true; tr->letter_bits_offset = OFFSET_SINHALA; memset(tr->letter_bits, 0, sizeof(tr->letter_bits)); @@ -1391,7 +1392,7 @@ Translator *SelectTranslator(const char *name) tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_SWAP_TENS | NUM_OMIT_1_HUNDRED | NUM_DFRACTION_2 | NUM_ORDINAL_DOT; SetLetterVowel(tr, 'y'); - tr->langopts.spelling_stress = 1; + tr->langopts.spelling_stress = true; tr->langopts.intonation_group = 3; // less intonation, don't raise pitch at comma } break; @@ -1450,7 +1451,7 @@ Translator *SelectTranslator(const char *name) tr->langopts.stress_rule = STRESSPOSN_1L; tr->langopts.stress_flags = S_FINAL_DIM_ONLY | S_FINAL_NO_2; // use 'diminished' for unstressed final syllable - tr->langopts.spelling_stress = 1; + tr->langopts.spelling_stress = true; tr->langopts.break_numbers = BREAK_LAKH_DV; if (name2 == L('t', 'a')) { diff --git a/src/libespeak-ng/translate.h b/src/libespeak-ng/translate.h index 5ec9e0ad..4ab8d64f 100644 --- a/src/libespeak-ng/translate.h +++ b/src/libespeak-ng/translate.h @@ -525,7 +525,7 @@ typedef struct { unsigned char tunes[6]; int long_stop; // extra mS pause for a lengthened stop char max_initial_consonants; - char spelling_stress; // 0=default, 1=stress first letter + bool spelling_stress; char tone_numbers; char ideographs; // treat as separate words bool textmode; // the meaning of FLAG_TEXTMODE is reversed (to save data when *_list file is compiled) From 015bb42a70a1db0e3ca8221e3d8abcb1576696f5 Mon Sep 17 00:00:00 2001 From: Juho Hiltunen Date: Mon, 10 Oct 2022 21:07:50 +0300 Subject: [PATCH 3/5] new configurable language option: spellingStress --- src/libespeak-ng/langopts.c | 4 ++++ src/libespeak-ng/voice.h | 2 ++ 2 files changed, 6 insertions(+) diff --git a/src/libespeak-ng/langopts.c b/src/libespeak-ng/langopts.c index 0227d50a..4eedfa72 100644 --- a/src/libespeak-ng/langopts.c +++ b/src/libespeak-ng/langopts.c @@ -95,6 +95,10 @@ if (CheckTranslator(translator, langopts_tab, key) != 0) { translator->langopts.lowercase_sentence = true; break; } + case V_SPELLINGSTRESS: { + translator->langopts.spelling_stress = true; + break; + } case V_STRESSADD: { // stressAdd int stress_add_set = 0; int stress_add[8]; diff --git a/src/libespeak-ng/voice.h b/src/libespeak-ng/voice.h index e27c25cf..f05c0695 100644 --- a/src/libespeak-ng/voice.h +++ b/src/libespeak-ng/voice.h @@ -112,6 +112,7 @@ typedef enum { V_WORDGAP, V_INTONATION, V_TUNES, + V_SPELLINGSTRESS, V_STRESSLENGTH, V_STRESSAMP, V_STRESSADD, @@ -145,6 +146,7 @@ static const MNEM_TAB langopts_tab[] = { { "l_sonorant_min", 0x100+LOPT_SONORANT_MIN }, { "lowercaseSentence", V_LOWERCASE_SENTENCE }, { "numbers", V_NUMBERS }, + { "spellingStress", V_SPELLINGSTRESS }, { "stressAdd", V_STRESSADD }, { "stressAmp", V_STRESSAMP }, { "stressLength", V_STRESSLENGTH }, From 53e40ead807bc5cebf0b546fd4b249d930d2584a Mon Sep 17 00:00:00 2001 From: Juho Hiltunen Date: Mon, 10 Oct 2022 21:19:43 +0300 Subject: [PATCH 4/5] docs: add spellingStress --- docs/voices.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/voices.md b/docs/voices.md index b264456f..6c4d72d5 100644 --- a/docs/voices.md +++ b/docs/voices.md @@ -28,6 +28,7 @@ - [dictrules](#dictrules) - [lowercaseSentence](#lowercaseSentence) - [replace](#replace) + - [spellingStress](#spellingStress) - [stressOpt](#stressopt) - [stressRule](#stressrule) - [stressLength](#stresslength) @@ -418,6 +419,12 @@ e.g. The phoneme mnemonics can be defined for each language, but some are listed in [Phonemes](phonemes.md). +### spellingStress + + spellingStress + +When set, stress first letter when reading abbreviations. + ### stressOpt stressOpt From dc6088117177e6a911b2cf5c5b171c54b5ee1b81 Mon Sep 17 00:00:00 2001 From: Juho Hiltunen Date: Mon, 10 Oct 2022 21:17:20 +0300 Subject: [PATCH 5/5] et: fi: move spellingStress from code to language configuration --- espeak-ng-data/lang/urj/et | 1 + espeak-ng-data/lang/urj/fi | 3 ++- src/libespeak-ng/tr_languages.c | 1 - 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/espeak-ng-data/lang/urj/et b/espeak-ng-data/lang/urj/et index 1b524c1d..096565f9 100644 --- a/espeak-ng-data/lang/urj/et +++ b/espeak-ng-data/lang/urj/et @@ -7,3 +7,4 @@ stressOpt 1 2 4 6 // (S_NO_DIM + S_FINAL_DIM = S_FINAL_DIM_ONLY), S_FINAL_NO_2, stressRule 0 intonation 3 +spellingStress diff --git a/espeak-ng-data/lang/urj/fi b/espeak-ng-data/lang/urj/fi index 285b9c47..fe2447c8 100644 --- a/espeak-ng-data/lang/urj/fi +++ b/espeak-ng-data/lang/urj/fi @@ -7,4 +7,5 @@ stressLength 150 180 200 200 0 0 210 250 stressOpt 1 2 4 6 // (S_NO_DIM + S_FINAL_DIM = S_FINAL_DIM_ONLY), S_FINAL_NO_2, S_2_TO_HEAVY stressRule 0 -intonation 3 \ No newline at end of file +intonation 3 +spellingStress diff --git a/src/libespeak-ng/tr_languages.c b/src/libespeak-ng/tr_languages.c index c5fd3d46..3fd26687 100644 --- a/src/libespeak-ng/tr_languages.c +++ b/src/libespeak-ng/tr_languages.c @@ -804,7 +804,6 @@ Translator *SelectTranslator(const char *name) tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_DFRACTION_2 | NUM_ORDINAL_DOT; SetLetterVowel(tr, 'y'); - tr->langopts.spelling_stress = true; } break; case L('f', 'r'): // french