From 3e0254949b1ea02cb3defe2c1bf4ced846f942e2 Mon Sep 17 00:00:00 2001 From: Valdis Vitolins Date: Sun, 3 Jan 2021 01:06:00 +0200 Subject: [PATCH] Fix issue #868: add initial support for Klingon --- CHANGELOG.md | 1 + Makefile.am | 5 + dictsource/piqd_list | 41 +++++ dictsource/piqd_rules | 111 ++++++++++++ docs/languages.md | 3 +- espeak-ng-data/lang/art/piqd | 5 + phsource/ph_klingon | 339 +++++++++++++++++++++++++++++++++++ phsource/phonemes | 2 + 8 files changed, 506 insertions(+), 1 deletion(-) create mode 100644 dictsource/piqd_list create mode 100644 dictsource/piqd_rules create mode 100644 espeak-ng-data/lang/art/piqd create mode 100644 phsource/ph_klingon diff --git a/CHANGELOG.md b/CHANGELOG.md index d820857e..30a14835 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/Makefile.am b/Makefile.am index bb4a625d..353cb859 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 diff --git a/dictsource/piqd_list b/dictsource/piqd_list new file mode 100644 index 00000000..187865fa --- /dev/null +++ b/dictsource/piqd_list @@ -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 + diff --git a/dictsource/piqd_rules b/dictsource/piqd_rules new file mode 100644 index 00000000..d72613c4 --- /dev/null +++ b/dictsource/piqd_rules @@ -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 + ' ? diff --git a/docs/languages.md b/docs/languages.md index bc5cf730..8c02f5e6 100644 --- a/docs/languages.md +++ b/docs/languages.md @@ -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 | diff --git a/espeak-ng-data/lang/art/piqd b/espeak-ng-data/lang/art/piqd new file mode 100644 index 00000000..49367cd8 --- /dev/null +++ b/espeak-ng-data/lang/art/piqd @@ -0,0 +1,5 @@ +name Klingon +language piqd +status testing +stressRule 3 + diff --git a/phsource/ph_klingon b/phsource/ph_klingon new file mode 100644 index 00000000..95f628de --- /dev/null +++ b/phsource/ph_klingon @@ -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 + + diff --git a/phsource/phonemes b/phsource/phonemes index a256aa84..ee7a7fc7 100644 --- a/phsource/phonemes +++ b/phsource/phonemes @@ -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