diff --git a/CHANGELOG.md b/CHANGELOG.md index 378a260d..e77042c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,10 @@ bug fixes: * Fix several issues with the emoji support. +new languages: + +* hak (Hakka Chinese) -- Chen Chien-ting + updated languages: * af (Afrikaans) -- Christo de Klerk diff --git a/Makefile.am b/Makefile.am index 1f24f607..5c8aeaa5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -304,6 +304,7 @@ phsource/phonemes.stamp: \ phsource/ph_greenlandic \ phsource/ph_gujarati \ phsource/ph_haitian \ + phsource/ph_hakka \ phsource/ph_hindi \ phsource/ph_hindi_base \ phsource/ph_hungarian \ @@ -450,6 +451,7 @@ dictionaries: \ espeak-ng-data/gd_dict \ espeak-ng-data/grc_dict \ espeak-ng-data/gu_dict \ + espeak-ng-data/hak_dict \ espeak-ng-data/hi_dict \ espeak-ng-data/hr_dict \ espeak-ng-data/hu_dict \ @@ -580,6 +582,9 @@ espeak-ng-data/fi_dict: dictsource/fi_list dictsource/fi_rules dictsource/fi_ext fr: espeak-ng-data/fr_dict espeak-ng-data/fr_dict: dictsource/fr_list dictsource/fr_rules dictsource/fr_extra dictsource/fr_emoji +hak: espeak-ng-data/hak_dict +espeak-ng-data/hak_dict: dictsource/hak_list dictsource/hak_rules dictsource/hak_extra dictsource/hak_emoji + ga: espeak-ng-data/ga_dict espeak-ng-data/ga_dict: dictsource/ga_list dictsource/ga_rules dictsource/ga_extra dictsource/ga_emoji diff --git a/dictsource/hak_emoji b/dictsource/hak_emoji new file mode 100644 index 00000000..e69de29b diff --git a/dictsource/hak_list b/dictsource/hak_list new file mode 100644 index 00000000..943275a6 --- /dev/null +++ b/dictsource/hak_list @@ -0,0 +1,24 @@ +//numbers +_0 laN2 +_1 it5 +_2 Ni4 +_3 sam1 +_4 S;i4 +_5 N-3 +_6 liuk5 +_7 tS;hit5 +_8 pat5 +_9 kiu3 +_1X S;i.6_| +_2X Ni4S;i.6_| +_3X sam2S;i.6_| +_4X S;i4S;i.6_| +_5X N-3S;i.6_| +_6X liuk5S;i.6_| +_7X tS;hit5S;i.6_| +_8X pat5S;i.6_| +_9X kiu3S;i.6_| +_0C pak5_| +_0M1 tS;hien1_| // 1,000 +_0M2 van4_| // 10,000 +//_0M3 j'i51_| // 100,000,000 \ No newline at end of file diff --git a/dictsource/hak_rules b/dictsource/hak_rules new file mode 100644 index 00000000..a41b1d59 --- /dev/null +++ b/dictsource/hak_rules @@ -0,0 +1,278 @@ +// This file is UTF8 encoded +.L01 p t k (rusheng +.replace +//replace tone mark with tone number +â a1 +ê e1 +êr er1 +î i1 +ô o1 +û u1 +ṳ̂ ii1 +m̂ m1 +n̂ n1 +n̂g ng1 +à a2 +è e2 +èr er2 +ì i2 +ò o2 +ù u3 +ṳ̀ ii2 +m̀ m2 +ǹ n2 +ǹg ng2 +á a3 +é e3 +ér er3 +í i3 +ó o3 +ú u3 +ṳ́ ii3 +ḿ m3 +ń n3 +ńg ng3 +a a4 +e e4 +i i4 +o o4 +u u4 +ṳ ii4 +_) m (_ m4 +_) n (_ n4 +_) ng (_ ng4 +a (L01 a5 +e (L01 e5 +er (L01 er5 +i (L01 i5 +o (L01 o5 +u (L01 u5 +ṳ (L01 ii5 +a̍ (L01 a6 +e̍ (L01 e6 +e̍r (L01 er6 +i̍ (L01 i6 +o̍ (L01 o6 +u̍ (L01 u6 +ṳ̍ (L01 ii6 + + +// Note: ngK matches "ng" if not followed by a vowel +// (D will match on a digit and also if no digit is present. (special for tone +language). + +.group a + a a + a1i ai1 + a2i ai2 + a3i ai3 + a4i ai4 + a5i ai5 + a6i ai6 + + a1u au1 + a2u au2 + a3u au3 + a4u au4 + a5u au5 + a6u au6 + + + +.group b + @) b (K _^_EN + +.group c + ch ts + chh tsh + ch (i tS; + chh (i tS;h + @) c (K _^_EN + +.group d + @) d (K _^_EN + +.group e + er o- + e e + +.group f + f f + @) f (K _^_EN + + + +.group h + h h + @) h (K _^_EN + +.group i + ii i. + i i //i in ing + ia ia + iau iau + ia1u iau1 + ia2u iau2 + ia3u iau3 + ia4u iau4 + ia5u iau5 + ia6u iau6 + ie ie + io io + iu iu + +.group j + @) j (K _^_EN + +.group k + k k + kh kh + @) k (K _^_EN + +.group l + l l + @) l (K _^_EN + +.group m + m m + _) m1 (_ m-1 + _) m2 (_ m-2 + _) m3 (_ m-3 + _) m4 (_ m-4 + @) m (K _^_EN + +.group n + n n + _) n1 (_ n-1 + _) n2 (_ n-2 + _) n3 (_ n-3 + _) n4 (_ n-4 + _) ng1 (_ N-1 + _) ng2 (_ N-2 + _) ng3 (_ N-3 + _) ng4 (_ N-4 + ng (i n^ //ng(i) + ng N + +.group g + @) g (K _^_EN + +.group o + o o + o1a ua1 + o2a ua2 + o3a ua3 + o4a ua4 + o5a ua5 + o6a ua6 + oa1 ua1 + oa2 ua2 + oa3 ua3 + oa4 ua4 + oa5 ua5 + oa6 ua6 + oa1i uai1 + oa2i uai2 + oa3i uai3 + oa4i uai4 + oa5i uai5 + oa6i uai6 + + o1e ue1 + o2e ue2 + o3e ue3 + o4e ue4 + o5e ue5 + o6e ue6 + oe1 ue1 + oe2 ue2 + oe3 ue3 + oe4 ue4 + oe5 ue5 + oe6 ue6 + + o1i oi1 + o2i oi2 + o3i oi3 + o4i oi4 + o5i oi5 + o6i oi6 + + o1ng (K oN1 + o2ng (K oN2 + o3ng (K oN3 + o4ng (K oN4 + + o1m (K om1 + o2m (K om2 + o3m (K om3 + o4m (K om4 + + o1n (K on1 + o2n (K on2 + o3n (K on3 + o4n (K on4 + +.group p + p p + ph ph + @) p (K _^_EN + +.group q + @) q (K _^_EN + +.group r + r (K _^_EN + +.group s + s s + s (i S; + @) s (K _^_EN + +.group t + t t + th th + @) t (K _^_EN + +.group u + u u + ui ui + u1ng (K uN1 + u2ng (K uN2 + u3ng (K uN3 + u4ng (K uN4 + + +.group v + v v + +.group w + @) w (K _^_EN + +.group x + @) x (K _^_EN + +.group y + y j //before a o e i + ya ia + yau iau + ye ie + yi i + yo io + yu iu + + @) y (K _^_EN + +.group z + @) z (K _^_EN + +//tone +.group + 1 1 + 2 2 + 3 3 + 4 4 + 5 5 + 6 6 + | _| + diff --git a/espeak-ng-data/lang/sit/hak b/espeak-ng-data/lang/sit/hak new file mode 100644 index 00000000..86a0eaf2 --- /dev/null +++ b/espeak-ng-data/lang/sit/hak @@ -0,0 +1,7 @@ +name Hakka Chinese +language hak +maintainer yoxem.tem98@nctu.edu.tw +status testing +translator hak +phonemes hak +dictionary hak diff --git a/phsource/ph_hakka b/phsource/ph_hakka new file mode 100644 index 00000000..007d2f21 --- /dev/null +++ b/phsource/ph_hakka @@ -0,0 +1,520 @@ + +//==================================================== +// Tone Numbers +//==================================================== + + +phoneme 1 // tone: yinping + ipa ˨˦ + stress + Tone(40, 80, envelope/p_rise, NULL) +endphoneme + + +phoneme 2 // tone: yangping + ipa ˩˩ + stress + Tone(20, 20, envelope/p_level, NULL) +endphoneme + + +phoneme 3 // tone: shang + ipa ˧˩ + stress + Tone(60, 20, envelope/p_fall, NULL) +endphoneme + + +phoneme 4 // tone: qu + ipa ˥˥ + stress + Tone(100, 100, envelope/p_level, NULL) +endphoneme + + +phoneme 5 // tone: yinru + stress + ipa ˨ + Tone(40, 40, envelope/p_level, NULL) +endphoneme + + +phoneme 6 // tone: yangru + stress + ipa ˥ + Tone(100, 100, envelope/p_level, NULL) +endphoneme + +//==================================================== +// Consonant +//==================================================== + +phoneme p + vls blb stp + lengthmod 2 + Vowelin f1=0 f2=1000 -50 -100 f3=-200 80 rms=30 + Vowelout f1=1 f2=1000 -500 -350 f3=-300 80 rms=22 + IF nextPh(isPause2) THEN + WAV(NULL) + ENDIF + WAV(ustop/p) +endphoneme + +phoneme t + vls alv stp + lengthmod 2 + Vowelin f1=0 f2=1700 -300 300 f3=100 80 + Vowelout f1=1 f2=1700 -300 250 f3=-100 80 rms=20 + IF nextPh(isPause2) THEN + WAV(NULL) + ENDIF + WAV(ustop/t) +endphoneme + +phoneme N + vcd vel nas + Vowelout f1=2 f2=1900 0 300 f3=400 80 len=50 rms=15 brk + lengthmod 7 + + NextVowelStarts + VowelStart(nn/nn@) + VowelStart(nn/nna) + VowelStart(nn/nne) + VowelStart(nn/nni) + VowelStart(nn/nno) + VowelStart(nn/nnu) + EndSwitch + + IF prevPh(isPause) THEN + FMT(nn/_nn) + ELIF nextPh(isNotVowel) THEN + length 190 + FMT(nn/nn2_) + ENDIF +endphoneme + +phoneme n^ // ng(i)- + vcd pal nas + Vowelout f1=2 f2=1900 0 300 f3=400 80 len=50 rms=15 brk + lengthmod 7 + + NextVowelStarts + VowelStart(n^/n^@) + VowelStart(n^/n^a) + VowelStart(n^/n^e) + VowelStart(n^/n^i) + VowelStart(n^/n^o) + VowelStart(n^/n^u) + EndSwitch + + IF prevPh(isPause) THEN + FMT(n^/_n^) + ELIF nextPh(isNotVowel) THEN + length 190 + FMT(n^/n^_) + ENDIF +endphoneme + +phoneme n + vcd alv nas + Vowelout f1=2 f2=1700 -300 250 f3=-100 80 rms=20 brk + lengthmod 2 + + NextVowelStarts + VowelStart(n/n@) + VowelStart(n/na) + VowelStart(n/ne) + VowelStart(n/ni) + VowelStart(n/no) + VowelStart(n/nu) + EndSwitch + + IF nextPh(isNotVowel) THEN + length 190 + FMT(n/n_long_) + ENDIF + FMT(n/_n) +endphoneme + +phoneme m + vcd blb nas + Vowelout f1=2 f2=1700 -300 250 f3=-100 80 rms=20 brk + lengthmod 4 + + NextVowelStarts + VowelStart(m/m@) + VowelStart(m/ma) + VowelStart(m/me) + VowelStart(m/mi) + VowelStart(m/mo) + VowelStart(m/mu) + EndSwitch + + IF nextPh(isNotVowel) THEN + length 190 + FMT(m/m_) + ENDIF + FMT(m/_m) +endphoneme + +phoneme p + 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 + WAV(ustop/p_unasp) +endphoneme + +phoneme ph + 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 + WAV(ustop/p_asp) +endphoneme + + +phoneme f + vls lbd frc + lengthmod 2 + Vowelout f1=0 f2=1000 -500 -350 f3=-200 80 + WAV(ufric/f) +endphoneme + + +phoneme v + vcd lbd frc + voicingswitch f + lengthmod 6 + Vowelin f1=0 f2=1000 -300 -200 f3=-300 100 + Vowelout f1=0 f2=1000 -500 -300 f3=-300 60 len=50 + + IF KlattSynth THEN + Vowelout f1=1 f2=1000 -500 -300 f3=-300 60 len=50 brk + IF nextPh(isPause2) THEN + FMT(klatt/v_) addWav(vocw/v) + ENDIF + FMT(klatt/v) addWav(vocw/v, 150) + ENDIF + + IF nextPh(isPause2) THEN + FMT(voc/v_) addWav(vocw/v) + ENDIF + IF thisPh(isWordStart) AND nextPhW(isLiquid) THEN + length 70 + ENDIF + FMT(voc/v) addWav(vocw/v) +endphoneme + +phoneme t + vls alv stp + lengthmod 2 + Vowelin f1=0 f2=1700 -300 300 f3=-100 80 rms=40 + Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + WAV(ustop/t_unasp2, 40) +endphoneme + + +phoneme th + 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_) +endphoneme + +phoneme l + liquid + lengthmod 7 + + IF prevPh(isPause) THEN + FMT(l/_l) + ENDIF + + FMT(l/l) +endphoneme + +phoneme k + vls uvl stp + lengthmod 2 + Vowelin f1=1 f2=1700 0 200 f3=-300 80 f4 + Vowelout f1=1 f2=1700 0 200 f3=-300 80 f4 rms=30 + WAV(ustop/k_unasp_, 75) +endphoneme + +phoneme kh + vls uvl stp + lengthmod 2 + Vowelin f1=1 f2=1700 0 200 f3=-300 80 f4 + Vowelout f1=1 f2=1700 0 200 f3=-300 80 f4 rms=30 + WAV(ustop/k_asp, 80) +endphoneme + +phoneme h + vls glt apr + lengthmod 3 + ipa h + + IF nextPh(#@) THEN + WAV(h/h@) + ELIF nextPh(#a) THEN + WAV(h/ha) + ELIF nextPh(#e) THEN + WAV(h/he) + ELIF nextPh(#i) THEN + WAV(h/hi) + ELIF nextPh(#o) THEN + WAV(h/ho) + ELIF nextPh(#u) THEN + WAV(h/hu) + ENDIF + WAV(h/h_, 70) // no vowel following +endphoneme + +phoneme tS; + vls alp sib afr + ipa tɕ + lengthmod 2 + Vowelin f1=0 f2=2700 400 600 f3=300 80 + WAV(ustop/tsh_pzd_unasp) +endphoneme + +phoneme tS;h + vls alp sib afr + ipa tɕh + lengthmod 2 + Vowelin f1=0 f2=2700 400 600 f3=300 80 + WAV(ustop/tsh_pzd, 80) +endphoneme + +phoneme S; + vls pla frc sib + lengthmod 2 + ipa ɕ + Vowelin f1=0 f2=2700 400 600 f3=300 80 + WAV(ufric/sh_pzd2, 20) +endphoneme + +phoneme ts + vls alv afr sib + 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/ts_unasp, 70) +endphoneme + +phoneme tsh + vls alv afr sib + 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/ts, 60) +endphoneme + +phoneme s + vls alv frc sib + voicingswitch z + lengthmod 3 + Vowelin f1=0 f2=1700 -300 300 f3=-100 80 + Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + + IF nextPh(isPause) THEN + WAV(ufric/s_) + ELIF nextPh(p) OR nextPh(t) OR nextPh(k) THEN + WAV(ufric/s!) + ENDIF + WAV(ufric/s) +endphoneme + +phoneme j + liquid pal + lengthmod 1 + + IF nextPh(isVowel) THEN + NextVowelStarts + VowelStart(j/j@) + VowelStart(j/ja) + VowelStart(j/je) + VowelStart(j/ji) + VowelStart(j/jo) + VowelStart(j/ju) + EndSwitch + + VowelEnding(j/xj, -30) + + FMT(j/_j) + ELSE + // no vowel follows + Vowelout len=70 + FMT(j/j_) + ENDIF +endphoneme + + + +//Syllablic consonants +//===================== + +phoneme m- + vwl starttype #@ endtype #@ + ipa mU+0329 + lengthmod 4 + length 240 + + IF thisPh(isWordStart) THEN + length 240 + ENDIF + IF KlattSynth THEN + FMT(klatt/m-syl) + ENDIF + FMT(m/m-syl) +endphoneme + +phoneme n- + vwl starttype #@ endtype #@ + ipa nU+0329 + lengthmod 4 + length 240 + + IF thisPh(isWordStart) THEN + length 240 + ENDIF + IF KlattSynth THEN + FMT(klatt/n-syl) + ENDIF + FMT(n/n-syl) +endphoneme + +phoneme N- + vwl starttype #e endtype #e + ipa ŋU+0329 + lengthmod 4 + length 240 + FMT(nn/nn-syl) +endphoneme + + +//==================================================== +// Vowels and Diphtnongs +//==================================================== + + +phoneme i + vwl starttype #i endtype #i + length 250 + FMT(vowel/i) +endphoneme + +phoneme i. + vwl starttype #i endtype #i + length 250 + FMT(vowel/i#_6) +endphoneme + +phoneme a + vwl starttype #a endtype #a + length 250 + FMT(vowel/a) +endphoneme + +phoneme e + vwl starttype #e endtype #e + length 250 + FMT(vowel/e) +endphoneme + +phoneme o + vwl starttype #o endtype #o + length 250 + FMT(vowel/oo) +endphoneme + +phoneme u //try more before N + vwl starttype #u endtype #u + length 250 + FMT(vowel/u) +endphoneme + +phoneme ai + vwl starttype #a endtype #i + length 250 + FMT(vdiph/ai_6) +endphoneme + +phoneme au + vwl starttype #a endtype #u + length 250 + FMT(vdiph/au) +endphoneme + +phoneme eu + vwl starttype #e endtype #u + length 250 + FMT(vdiph/eu) +endphoneme + +phoneme ia + vwl starttype #i endtype #a + length 250 + FMT(vwl_zh/iaa) +endphoneme + +phoneme iau + vwl starttype #i endtype #u + length 250 + FMT(vwl_zh/iaau) +endphoneme + +phoneme ie + vwl starttype #i endtype #e + length 250 + FMT(vwl_zh/ie) +endphoneme + +phoneme io + vwl starttype #i endtype #o + length 250 + FMT(vdiph2/iioo) +endphoneme + +phoneme iu + vwl starttype #i endtype #u + length 250 + FMT(vdiph2/iu) +endphoneme + +phoneme oi + vwl starttype #o endtype #i + length 250 + FMT(vdiph/ooi) +endphoneme + +phoneme ua + vwl starttype #u endtype #a + length 250 + FMT(vwl_zh/uaa) +endphoneme + +phoneme uai + vwl starttype #u endtype #i + length 250 + FMT(vwl_zh/uai) +endphoneme + +phoneme ue + vwl starttype #u endtype #e + length 250 + FMT(vwl_zh/uei) +endphoneme + +phoneme ui + vwl starttype #u endtype #i + length 250 + FMT(vdiph/ui) +endphoneme + +phoneme o- // er + vwl starttype #o endtype #o + length 180 + FMT(vowel/o-) +endphoneme \ No newline at end of file diff --git a/phsource/phonemes b/phsource/phonemes index b76a9c35..e46bbc67 100644 --- a/phsource/phonemes +++ b/phsource/phonemes @@ -1737,6 +1737,9 @@ include ph_french phonemetable fr-ca fr include ph_french_ca +phonemetable hak base1 +include ph_hakka + phonemetable nl base1 include ph_dutch diff --git a/src/libespeak-ng/tr_languages.c b/src/libespeak-ng/tr_languages.c index 9cfe0010..4575f8ca 100644 --- a/src/libespeak-ng/tr_languages.c +++ b/src/libespeak-ng/tr_languages.c @@ -799,6 +799,14 @@ Translator *SelectTranslator(const char *name) tr->langopts.numbers = NUM_SINGLE_STRESS | NUM_DECIMAL_COMMA | NUM_ALLOW_SPACE | NUM_OMIT_1_HUNDRED | NUM_NOPAUSE | NUM_ROMAN | NUM_ROMAN_CAPITALS | NUM_ROMAN_AFTER | NUM_VIGESIMAL | NUM_DFRACTION_4; } break; + case L3('h','a', 'k'): // Hakka Chinese + { + tr->langopts.stress_flags = S_NO_DIM; // don't automatically set diminished stress (may be set in the intonation module) + tr->langopts.tone_language = 1; // Tone language, use CalcPitches_Tone() rather than CalcPitches() + tr->langopts.tone_numbers = 1; // a number after letters indicates a tone number (eg. pinyin or jyutping) + tr->langopts.ideographs = 1; + } + break; case L('g', 'a'): // irish case L('g', 'd'): // scots gaelic {