hak: Initial support added for Hakka Chinese by Chen Chien-ting

This commit is contained in:
Valdis Vitolins
2017-12-29 12:46:42 +02:00
parent ea354c06fe
commit 75e42d6870
9 changed files with 849 additions and 0 deletions
+4
View File
@@ -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
+5
View File
@@ -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
View File
+24
View File
@@ -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
+278
View File
@@ -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
| _|
+7
View File
@@ -0,0 +1,7 @@
name Hakka Chinese
language hak
maintainer yoxem.tem98@nctu.edu.tw
status testing
translator hak
phonemes hak
dictionary hak
+520
View File
@@ -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
+3
View File
@@ -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
+8
View File
@@ -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
{