Fix issue #868: add initial support for Klingon

This commit is contained in:
Valdis Vitolins
2021-01-05 20:17:51 +02:00
parent 06bcb7ab93
commit 3e0254949b
8 changed files with 506 additions and 1 deletions
+1
View File
@@ -38,6 +38,7 @@ new languages:
* io (Ido) -- José Miguel López, Valdis Vitolins
* ltg (Latgalian) -- Valdis Vitolins
* nog (Nogai) -- boracasli98, Valdis Vitolins
* piqd (Klingon) -- Valdis Vitolins
* qu (Quechua) -- Valdis Vitolins
* qdb (Lang Belta) -- Da Def, Valdis Vitolins
* th (Thai) -- Valdis Vitolins
+5
View File
@@ -369,6 +369,7 @@ phsource/phonemes.stamp: \
phsource/ph_kannada \
phsource/ph_kazakh \
phsource/ph_kinyarwanda \
phsource/ph_klingon \
phsource/ph_korean \
phsource/ph_kurdish \
phsource/ph_kyrgyz \
@@ -558,6 +559,7 @@ dictionaries: \
espeak-ng-data/or_dict \
espeak-ng-data/pa_dict \
espeak-ng-data/pap_dict \
espeak-ng-data/piqd_dict \
espeak-ng-data/pl_dict \
espeak-ng-data/pt_dict \
espeak-ng-data/py_dict \
@@ -815,6 +817,9 @@ espeak-ng-data/pa_dict: dictsource/pa_list dictsource/pa_rules dictsource/pa_ext
pap: espeak-ng-data/pap_dict
espeak-ng-data/pap_dict: dictsource/pap_list dictsource/pap_rules dictsource/pap_extra
piqd: espeak-ng-data/piqd_dict
espeak-ng-data/piqd_dict: dictsource/piqd_list dictsource/piqd_rules
pl: espeak-ng-data/pl_dict
espeak-ng-data/pl_dict: dictsource/pl_list dictsource/pl_rules dictsource/pl_extra dictsource/pl_emoji
+41
View File
@@ -0,0 +1,41 @@
// Letters
a ?at
b b'ai
ch tS'ai
d d'ai
e ?et
gh r-'i
h h'i
i 'it
j j'i
l l'i
m m'i
n n'i
ng N'i
o ?ot
p p'i
q q'i
r R'i
s s'i
t t'i
tlh dX'i
u ?ut
v v'i
w w'i
y j'i
' ?
// Numbers
_0 p'ar-
_1 wa'
_2 tSa'
_3 w'edZ
_4 l'os
_5 v'ar-
_6 dZ'av
_7 s'otS
_8 tS'orR-
_9 tS'oRr-
_10 h'ut
+111
View File
@@ -0,0 +1,111 @@
// Replace Klingon letters to Latin
.replace
 a
 b
 ch
 D
 e
 gh
 H
 I
 j
 l
 m
 n
 ng
 o
 p
 q
 qh // should be Q, but eSpeak NG rules don't distinguish capital letters
 r
 S
 t
 th // should be tlh, but current .replace has limits of total bytes replaced
 u
 v
 w
 y
 '
 ,
 .
.group a
a a
aw au
ay ai
.group b
b b
.group ch
ch tS
.group d
d D
.group e
e e
ey ei
ew eu
.group g
gh r-
.group h
h h
.group i
i i
iy i:
iw iu
.group j
j dZ
.group l
l l
.group m
m m
.group n
n n
ng N
.group o
o o
oy oi
.group p
p p
.group q
q q
qh qh // from replaced Klingon Q letter
.group r
r R
.group s
s s
.group t
t t
th dX // from replaced Klingon letter
tlh dX
.group u
u u
uy ui
.group v
v v
.group w
w w
.group y
y j
.group
' ?
+2 -1
View File
@@ -1,6 +1,6 @@
# Languages
Development version of eSpeak NG supports 122 languages and accents,
Development version of eSpeak NG supports 123 languages and accents,
which are listed in table below.
To check, what languages are supported by distributed version, run `espeak-ng --voices` command.
@@ -101,6 +101,7 @@ To check, what languages are supported by distributed version, run `espeak-ng --
| `myn` | `quc` | Mayan | K'iche' | |
| `roa` | `pt` | Romance | Portuguese | Portugal |
| `inc` | `pa` | Indic | Punjabi | |
| `art` | `piqd` | Constructed | Klingon | |
| `roa` | `ro` | Romance | Romanian | |
| `zle` | `ru` | East Slavic | Russian | |
| `zle` | `ru-lv` | East Slavic | Russian | Latvia |
+5
View File
@@ -0,0 +1,5 @@
name Klingon
language piqd
status testing
stressRule 3
+339
View File
@@ -0,0 +1,339 @@
phoneme a
vwl starttype #a endtype #a
length 130
FMT(vwl_lv/a, 100) // adjusted from aa_3
endphoneme
phoneme e
vwl starttype #e endtype #e
length 120
FMT(vwl_lv/e, 100) // other alternative e_5
endphoneme
phoneme i
vwl starttype #i endtype #i
length 120
FMT(vwl_lv/i, 110) // was i_6
endphoneme
phoneme o
vwl starttype #o endtype #o
length 120
FMT(vwl_lv/o, 90)
endphoneme
phoneme u
vwl starttype #u endtype #u
length 120
FMT(vwl_lv/u, 100)
endphoneme
phoneme ai
vwl starttype #a endtype #i
length 280
lng
FMT(vwl_lv/ai, 100)
endphoneme
phoneme au
vwl starttype #a endtype #u
length 280
lng
FMT(vwl_lv/au, 100)
endphoneme
phoneme ei
vwl starttype #e endtype #i
length 280
lng
FMT(vwl_lv/ei, 100)
endphoneme
phoneme ie
vwl starttype #i endtype #e
length 250
lng
FMT(vwl_lv/ie, 100)
endphoneme
phoneme iu
vwl starttype #i endtype #u
length 250
lng
FMT(vwl_lv/iu, 100)
endphoneme
phoneme ui
vwl starttype #u endtype #i
length 250
lng
FMT(vwl_lv/ui, 100)
endphoneme
phoneme uo
vwl starttype #u endtype #a
length 280
lng
FMT(vwl_lv/ua, 110)
endphoneme
phoneme oi
vwl starttype #o endtype #i
length 250
lng
FMT(vwl_lv/oi, 100)
endphoneme
phoneme ts
vls alv afr nolink
ipa t͡s
voicingswitch J
length 55
lengthmod 1
WAV(ustop/ts2, 60)
endphoneme
phoneme tS
vls pla afr sib
ipa t͡ʃ
voicingswitch dZ
lengthmod 2
length 80
WAV(ustop/tsh,40)
endphoneme
phoneme D // louder and shorter version of d
vcd alv stp
ipa d
voicingswitch t
length 8
lengthmod 5
Vowelin f1=1 f2=1700 -300 300 f3=-100 80
Vowelout f1=2 f2=1700 -300 300 f3=-100 80 brk
IF PreVoicing THEN
FMT(d/xd, 110)
ENDIF
IF nextPh(isPause2) THEN
FMT(d/d_, 120) addWav(x/d_,110)
ENDIF
FMT(d/d, 110) addWav(x/d,110)
endphoneme
phoneme j // **y**es
liquid pal starttype #i
IF nextPhW(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, 127) // In difference with English, vowel is lengthened, not shortened
ELSE
Vowelout len=127 // no vowel follows
FMT(j/xj)
ENDIF
IF prevPh(isPause) THEN
FMT(j/_j)
ENDIF
endphoneme
phoneme k
vls vel stp
lengthmod 2
voicingswitch g
Vowelin f1=0 f2=2300 200 400 f3=-100 80
Vowelout f1=0 f2=2300 300 400 f3=-100 80 rms=20
IF nextPh(isPause2) THEN
WAV(ustop/k_)
ENDIF
IF nextPh(#i) OR nextPh(l^) THEN
WAV(ustop/ki)
ENDIF
IF nextPh(l) THEN
WAV(ustop/kl)
ENDIF
WAV(ustop/k_unasp, 60) // weaker
endphoneme
phoneme c
vls pal stp pzd
voicingswitch J
WAV(ustop/c, 80)
endphoneme
phoneme l
liquid
IF nextPh(isNotVowel) THEN
PrevVowelEndings
VowelEnding(l/L1_@L)
VowelEnding(l/L1_aL)
VowelEnding(l/L1_eL)
VowelEnding(l/L1_iL)
VowelEnding(l/L1_oL)
VowelEnding(l/L1_uL)
EndSwitch
FMT(l/l_)
RETURN
ENDIF
CALL vowelstart_l
IF prevPh(isPause) THEN
FMT(l/_l)
ENDIF
IF prevPh(t) THEN
FMT(l/tl)
ENDIF
IF prevPh(l/) THEN
FMT(l/l_long) // double l, make it longer
ENDIF
FMT(l/l)
endphoneme
phoneme m // copied from standard m phoneme with rule for 'mm'
vcd blb nas
Vowelout f1=2 f2=1000 -500 -350 f3=-200 80 brk
lengthmod 4
IF KlattSynth THEN
Vowelin f1=0 f2=1000 -50 -200 f3=-200 80
IF nextPh(isPause2) THEN
FMT(klatt/m_)
ENDIF
FMT(klatt/m)
ENDIF
NextVowelStarts
VowelStart(m/m@)
VowelStart(m/ma)
VowelStart(m/me)
VowelStart(m/mi)
VowelStart(m/mo)
VowelStart(m/mu)
EndSwitch
IF prevPh(isNotVowel) AND nextPhW(isLiquid) THEN
FMT(m/mj)
ELIF prevPh(isPause) THEN
FMT(m/_m)
ELIF nextPh(isNotVowel) THEN
FMT(m/m_)
ELIF nextPh(m) THEN // m/mj has no volume change, so doubled 'mm' merges better
FMT(m/mj)
ENDIF
endphoneme
phoneme p
vls blb stp
lengthmod 2
voicingswitch b
Vowelin f1=0 f2=1000 -50 -100 f3=-200 80
Vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=30
IF nextPh(isPause2) THEN
WAV(ustop/p_unasp_, 80)
ENDIF
IF nextPh(l) THEN
WAV(ustop/pl)
ENDIF
WAV(ustop/p_unasp, 120)
endphoneme
phoneme R
liquid trl
ipa r
lengthmod 6
Vowelin f1=0 f2=1700 -300 300 f3=-300 80
Vowelout f1=2 f2=1700 -300 300 f3=-300 80 brk
FMT(r3/r_trill) addWav(r3/r_trill.wav, 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
WAV(ufric/s,60)
endphoneme
phoneme t
vls alv stp //lengthenstop
lengthmod 1
voicingswitch d
IF nextPh(isPause2) THEN
WAV(ustop/t_dnt, 40)
ENDIF
WAV(ustop/t_dnt, 50)
endphoneme
phoneme v // from v# in standard phonemes
vcd lbd frc
ipa ʋ
lengthmod 6
voicingswitch f
Vowelin f1=0 f2=1000 -300 -200 f3=-300 100
Vowelout f1=0 f2=1000 -500 -300 f3=-300 60 len=50
IF nextPh(isPause2) THEN
FMT(voc/v#_)
ENDIF
FMT(voc/v#)
endphoneme
phoneme gH // arabic Ghain, the phoneme is derived from Q
vcd vel frc
voicingswitch R2
ipa ɣ
Vowelin f1=2 f2=2300 200 300 f3=-300 80
Vowelout f1=2 f2=2300 250 300 f3=-300 80 brk
FMT(g/g) addWav(vwl_ar/dhad)
endphoneme
phoneme dH //arabic Dhad TODO this probably should be simple d from standard phonemes
vcd alv stp
ipa dˤ
Vowelin f1=1 f2=1700 -300 300 f3=-100 80
Vowelout f1=2 f2=1700 -300 300 f3=-100 80 brk
IF PreVoicing THEN
FMT(d/xd)
ENDIF
IF nextPh(isPause2) THEN
FMT(d/d_) addWav(x/d_)
ENDIF
FMT(d/d) addWav(x/d)
endphoneme
phoneme s[
vls dnt stp
voicingswitch s
IF nextPh(s[) THEN
length 50
ELSE
length 160
ENDIF
lengthmod 7
WAV(vwl_ar/shin)
endphoneme
phoneme X
vls uvl frc
voicingswitch Q
lengthmod 7
Vowelin f1=0 f2=2300 200 400 f3=-100 80
Vowelout f1=0 f2=2300 300 400 f3=-100 80 rms=20
WAV(ufric/xx, 70)
endphoneme
+2
View File
@@ -1854,6 +1854,8 @@ include ph_nahuatl
phonemetable pt base2
include ph_pt_brazil
phonemetable piqd base2
include ph_klingon
phonemetable ro base2
include ph_romanian