Browse Source

Fix issue #868: add initial support for Klingon

master
Valdis Vitolins 4 years ago
parent
commit
3e0254949b
8 changed files with 506 additions and 1 deletions
  1. 1
    0
      CHANGELOG.md
  2. 5
    0
      Makefile.am
  3. 41
    0
      dictsource/piqd_list
  4. 111
    0
      dictsource/piqd_rules
  5. 2
    1
      docs/languages.md
  6. 5
    0
      espeak-ng-data/lang/art/piqd
  7. 339
    0
      phsource/ph_klingon
  8. 2
    0
      phsource/phonemes

+ 1
- 0
CHANGELOG.md 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
- 0
Makefile.am 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
- 0
dictsource/piqd_list 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
- 0
dictsource/piqd_rules 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
docs/languages.md 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
- 0
espeak-ng-data/lang/art/piqd View File

@@ -0,0 +1,5 @@
name Klingon
language piqd
status testing
stressRule 3


+ 339
- 0
phsource/ph_klingon 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
- 0
phsource/phonemes 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

Loading…
Cancel
Save