Browse Source

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

master
Valdis Vitolins 7 years ago
parent
commit
75e42d6870

+ 4
- 0
CHANGELOG.md 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
- 0
Makefile.am 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


+ 0
- 0
dictsource/hak_emoji View File


+ 24
- 0
dictsource/hak_list 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
- 0
dictsource/hak_rules 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
- 0
espeak-ng-data/lang/sit/hak View File

@@ -0,0 +1,7 @@
name Hakka Chinese
language hak
maintainer [email protected]
status testing
translator hak
phonemes hak
dictionary hak

+ 520
- 0
phsource/ph_hakka 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
- 0
phsource/phonemes 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
- 0
src/libespeak-ng/tr_languages.c 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
{

Loading…
Cancel
Save