diff --git a/Makefile.am b/Makefile.am index 26e5679e..238475fb 100644 --- a/Makefile.am +++ b/Makefile.am @@ -370,6 +370,7 @@ phsource/phonemes.stamp: \ phsource/ph_s_gaelic \ phsource/ph_serbian \ phsource/ph_setswana \ + phsource/ph_shan \ phsource/ph_sinhala \ phsource/ph_slovak \ phsource/ph_slovenian \ @@ -520,6 +521,7 @@ dictionaries: \ espeak-ng-data/ro_dict \ espeak-ng-data/ru_dict \ espeak-ng-data/sd_dict \ + espeak-ng-data/shn_dict \ espeak-ng-data/si_dict \ espeak-ng-data/sk_dict \ espeak-ng-data/sl_dict \ @@ -759,6 +761,9 @@ endif sd: espeak-ng-data/sd_dict espeak-ng-data/sd_dict: dictsource/sd_list dictsource/sd_rules dictsource/sd_extra dictsource/sd_emoji +shn: espeak-ng-data/shn_dict +espeak-ng-data/shn_dict: dictsource/shn_list dictsource/shn_rules dictsource/shn_extra + si: espeak-ng-data/si_dict espeak-ng-data/si_dict: dictsource/si_list dictsource/si_rules dictsource/si_extra dictsource/si_emoji diff --git a/dictsource/shn_list b/dictsource/shn_list new file mode 100755 index 00000000..e652e38c --- /dev/null +++ b/dictsource/shn_list @@ -0,0 +1,24 @@ +// numbers + +_0 son // သူၼ် +_1 nEN3 // ၼိုင်ႈ +_2 sON // သွင် +_3 sa:m // သၢမ် +_4 si:2 // သီႇ +_5 ha:3 // ႁႃႈ +_6 hok4 // ႁူၵ်း +_7 tS;et4 // ၸဵတ်း +_8 pEt2 // ပႅတ်ႇ +_9 kaw3 // ၵဝ်ႈ +_1X sip4|| // သိပ်း +_11 sip4||?et4 // သိပ်းဢဵတ်း +_2X sa:w4|| // သၢဝ်း +_21 sa:w4||?et4 // သၢဝ်းဢဵတ်း +_3X sa:m||sip4|| // သၢမ်သိပ်း +_4X si:2||sip4|| // သီႇသိပ်း +_5X ha:3||sip4|| // ႁႃႈသိပ်း +_6X hok4||sip4|| // ႁူၵ်းသိပ်း +_7X tS;et4||sip4|| // ၸဵတ်းသိပ်း +_8X pEt2||sip4|| // ပႅတ်ႇသိပ်း +_9X kaw3||sip4|| // ၵဝ်ႈသိပ်း + diff --git a/dictsource/shn_rules b/dictsource/shn_rules new file mode 100755 index 00000000..8a593d84 --- /dev/null +++ b/dictsource/shn_rules @@ -0,0 +1,177 @@ +// Shan (Tai Yay) pronunciation rules (Burmese script) + +.group င // U+1004 + င N + +.group တ // U+1010 + တ t + +.group ထ // U+1011 + ထ t_h + +.group ပ // U+1015 + ပ p + +.group မ // U+1019 + မ m + +.group ယ // U+101A + ယ j + +.group ရ // U+101B + ရ R + +.group လ // U+101C + လ l + +.group ဝ // U+101D + ဝ w + +.group သ // U+101E + သ s + +.group ဢ // U+1022 + ဢ ? + +.group ၵ // U+1075 + ၵ k + +.group ၶ // U+1076 + ၶ k_h + +.group ၷ // U+1077: rare, used for sounds in other languages + ၷ g + +.group ၸ // U+1078 + ၸ tS; + +.group ၹ // U+1079: rare, used for sounds in other languages + ၹ z + +.group ၺ // U+107A + ၺ J + +.group ၻ // U+107B: rare, used for sounds in other languages + ၻ d + +.group ၼ // U+107C + ၼ n + +.group ၽ // U+107D + ၽ p_h + +.group ၾ // U+107E + _) ၾ p_h // Except for Eastern dialects, which use 'f'. + ၾ f + +.group ႀ // U+107F: rare, used for sounds in other languages + ႀ T + +.group ၿ // U+1080: rare, used for sounds in other languages + ၿ b + +.group ႁ // U+1081 + ႁ h + + + +// Vowels in groups + +// All vowels below are suffixs + +.group ႃ + ႃ a + ေ)ႃ O + + +.group ီ + ီ i + +.group ိ + ိ i + +.group ဵ + ဵ e + +.group ႅ + _) ႅ (_ E + +.group ူ + ူ u + +.group ု + ု u + + +.group ေ + ေ ei // default rule without other characters + _) ေႃ O // in group with other characters if necessary + + +.group ႄ + ႄ E + +.group ႆ + ႆ ai + +.group ၢ + _) ၢ a: + + +.group ၢႆ // U+1062 + _) ၢႆ a:i + + + +.group ွႆ + _) ွႆ oi + + +.group ႂၢႆ + _) ႂၢႆ Oi + + + +.group ြ + ြ ra + + +.group ျ + _) ျ ja + + +.group ဝ် + _)ဝ် w + + +.group ႂ် + _) ႂ် @i + + +.group ၺ် + _)ၺ် Wi + + +.group မ် + _)မ် m + + +.group ၼ် + _)ၼ် n + + +.group င် + _)င် g // ipa = ɳ ( temporary word ) + + +// very short sounds +.group ပ် + _) ပ် p + + +.group တ် + _) တ် t + + +.group ၵ် + _) ၵ် k // temporary word \ No newline at end of file diff --git a/espeak-ng-data/lang/tai/shn b/espeak-ng-data/lang/tai/shn new file mode 100755 index 00000000..c93f373b --- /dev/null +++ b/espeak-ng-data/lang/tai/shn @@ -0,0 +1,2 @@ +name Shan (Tai Yai) +language shn diff --git a/phsource/ph_shan b/phsource/ph_shan new file mode 100755 index 00000000..6dd15a68 --- /dev/null +++ b/phsource/ph_shan @@ -0,0 +1,295 @@ +//******************************************************************* +// TONES +//******************************************************************* + +phoneme 1 // rising tone (contour: 24) + stress + Tone(20, 40, envelope/p_rise, NULL) +endphoneme + +phoneme 2 // low tone (contour: 11) + stress + Tone(10, 10, envelope/i_risefall, NULL) +endphoneme + +phoneme 3 // mid(-falling) tone (contour: 32) + stress + Tone(30, 20, envelope/p_fall, NULL) +endphoneme + +phoneme 4 // high tone (contour: 55) + stress + Tone(50, 50, envelope/i_risefall, NULL) +endphoneme + +phoneme 5 // falling (creaky) tone (contour: 42) + stress + Tone(40, 20, envelope/p_fall, NULL) +endphoneme + +phoneme 6 // emphatic (contour: 343) + stress + Tone(30, 40, envelope/i_risefall, NULL) +endphoneme + +//******************************************************************* +// CONSONANTS (PLOSIVES/STOPS) +//******************************************************************* + +phoneme p // unaspirated + vls blb stp + lengthmod 2 + Vowelin f1=0 f2=1000 -50 -100 f3=-200 80 amp=11 + Vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=22 + + IF nextPh(isPause2) THEN + WAV(ustop/p_) + ENDIF + WAV(ustop/p_unasp) +endphoneme + +phoneme p_h // aspirated + vls blb stp + lengthmod 2 + Vowelin f1=0 f2=1000 -50 -100 f3=-200 80 + Vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=30 + + WAV(ustop/p_asp) +endphoneme + +phoneme t // unaspirated + vls alv stp + lengthmod 2 + Vowelin f1=0 f2=1700 -300 300 f3=-100 80 + Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + + IF nextPh(isPause2) THEN + WAV(ustop/t_) + ENDIF + WAV(ustop/t_unasp) +endphoneme + +phoneme t_h // aspirated + vls alv stp + lengthmod 2 + Vowelin f1=0 f2=1700 -300 300 f3=-100 80 + Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + + WAV(ustop/t) // TODO: This should be aspirated. +endphoneme + +phoneme k // unaspirated + vls vel stp + lengthmod 2 + Vowelin f1=0 f2=2300 200 300 f3=-200 80 + Vowelout f1=0 f2=2300 300 400 f3=-200 80 rms=20 + + IF KlattSynth THEN + Vowelout f1=0 f2=2300 200 300 f3=-200 80 rms=20 + ENDIF + + IF nextPh(isPause2) THEN + WAV(ustop/k_) + ENDIF + WAV(ustop/k_unasp) +endphoneme + +phoneme k_h + vls vel stp + lengthmod 2 + Vowelin f1=0 f2=2300 200 300 f3=-150 80 + Vowelout f1=0 f2=2300 300 400 f3=-150 80 rms=20 + + WAV(ustop/k_asp) +endphoneme + +//******************************************************************* +// VOWELS +//******************************************************************* + +phoneme i + vwl starttype #i endtype #i + length 200 + + FMT(vowel/i) +endphoneme + +phoneme i. + vwl starttype #i endtype #i + length 200 + ipa ɨ + + FMT(vowel/i#_6) +endphoneme + +phoneme W + vwl starttype #a endtype #u + length 200 + ipa ɯ + + FMT(vowel/8_2) +endphoneme + +phoneme u + vwl starttype #u endtype #u + length 200 + + FMT(vowel/u_bck) +endphoneme + +phoneme e + vwl starttype #e endtype #e + length 200 + + FMT(vowel/e_2) +endphoneme + +phoneme @ + vwl starttype #@ endtype #@ + length 200 + ipa ə + + FMT(vowel/3_2) +endphoneme + +phoneme o + vwl starttype #o endtype #o + length 220 + + FMT(vowel/o) +endphoneme + +phoneme E + vwl starttype #e endtype #e + length 200 + ipa ɛ + + FMT(vowel/ee_2) +endphoneme + +phoneme a + vwl starttype #a endtype #a + length 200 + + FMT(vowel/a) +endphoneme + +phoneme a: + vwl starttype #a endtype #a + length 250 + ipa aː + + FMT(vowel/a) +endphoneme + +phoneme O + vwl starttype #o endtype #o + length 260 + ipa ɔ + + FMT(vwl_it/o_open) +endphoneme + + +//******************************************************************* +// DIPHTHONGS +//******************************************************************* + +phoneme iu + vwl starttype #i endtype #u + length 200 + + FMT(vdiph2/iu) +endphoneme + +phoneme eu + vwl starttype #e endtype #u + length 200 + + FMT(vdiph/eu) +endphoneme + +phoneme Eu + vwl starttype #e endtype #u + length 200 + ipa ɛu + + FMT(vdiph/eeu) +endphoneme + +phoneme au + vwl starttype #a endtype #u + length 200 + + FMT(vdiph/au_2) +endphoneme + +phoneme a:u + vwl starttype #a endtype #u + length 250 + ipa aːu + + FMT(vdiph/au_2) +endphoneme + +phoneme Wi + vwl starttype #i endtype #i + length 200 + ipa ɯi + + FMT(vdiph/ui_3) +endphoneme + +phoneme ui + vwl starttype #u endtype #i + length 200 + + FMT(vdiph/ui) +endphoneme + +phoneme @i + vwl starttype #@ endtype #i + length 200 + ipa əi // ႂ် + + FMT(vdiph/@i) +endphoneme + +phoneme oi + vwl starttype #o endtype #i + length 200 + + FMT(vdiph/ooi) +endphoneme + +phoneme ai + vwl starttype #a endtype #i + length 200 + + FMT(vdiph/ai) +endphoneme + +phoneme a:i + vwl starttype #a endtype #i + length 250 + ipa aːi + + FMT(vdiph/ai) +endphoneme + +phoneme Oi + vwl starttype #o endtype #i + length 200 + ipa ɔi + + FMT(vdiph/ooi_3) +endphoneme + +phoneme aW + vwl starttype #a endtype #u + length 200 + ipa aɯ + + FMT(vdiph/aau_4) +endphoneme + diff --git a/phsource/phonemes b/phsource/phonemes index 81753860..337227d3 100644 --- a/phsource/phonemes +++ b/phsource/phonemes @@ -1990,3 +1990,6 @@ include ph_kyrgyz phonemetable mi base1 include ph_maori + +phonemetable shn base1 +include ph_shan diff --git a/src/libespeak-ng/tr_languages.c b/src/libespeak-ng/tr_languages.c index 2023ab31..5cb55529 100644 --- a/src/libespeak-ng/tr_languages.c +++ b/src/libespeak-ng/tr_languages.c @@ -1512,6 +1512,11 @@ Translator *SelectTranslator(const char *name) tr->langopts.stress_rule = STRESSPOSN_1L; tr->langopts.numbers = NUM_AND_UNITS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_SINGLE_STRESS; break; + case L3('s', 'h', 'n'): + tr->langopts.tone_language = 1; // Tone language, use CalcPitches_Tone() rather than CalcPitches() + tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable + tr->langopts.numbers = 1; + break; case L3('c', 'm', 'n'): // no break, just go to 'zh' case case L3('z', 'h', 'y'): // just go to 'zh' case case L('z','h'): diff --git a/tests/language-phonemes.test b/tests/language-phonemes.test index d76ae54d..877cf531 100755 --- a/tests/language-phonemes.test +++ b/tests/language-phonemes.test @@ -98,3 +98,4 @@ test_lang lt 615e503b996ea5f7b267ebd77b91e77c5b874e18 "ma m;a na n;a pa p;a ta t test_lang lv ebd5378940b27e39ac35cda90e027ee0fa625fde "ma na n^a Na pa ba ta da ca Ja ka ga tsa dza Dz\`a tSa dZa DZ\`a fa va sa za Sa Za xa ha ja la l^a Ra ra _:_ mi my mu mE me mo ma mi: my: mu: mE: me: mo: ma: mai mau mei mie miu mui muo muo\` moi" test_lang mi b6e622de46c33181cdfea351b907f932da9a0a1a "ma na Na pa ta ka fa ha ra wa _:_ ma ma: me me: mi mi: mo mo: mu mu:" test_lang mk 072d0a74acf54bea528e7dde427eb04808d38364 "ma na n^a Na pa ta xa k^a ka ba da Ja ga tsa tSa tS;a dza dZa dZ;a fa sa Sa xa va za Za l^a la ja Ra @-*a ra _:_ ma me mi mo mu mA mE ma: me: mi: mo: mu: moU" +test_lang shn e568aca66c2f58fdaf5dda8a67f4d21f05710234 "ma na Ja Na pa p_ha ba ta t_ha da ka k_ha ga ?a fa sa za Ta ha tS;a Ra ja wa la _:_ mi mI mW mu me m@ mo mE ma ma: mO miu meu mEu mau ma:u mWi mui m@i moi mai ma:i mOi maW _:_ ma1 ma2 ma3 ma4 ma5 ma6"