Browse Source

Add Pashto language support using Pashto phonemes (#2152)

This commit adds support for the Pashto language (ps) to espeak-ng. The
implementation is based includes ps_rules, ps_list, ps_emoji, ps_extra
files and updated Makefile.am to include Pashto in the dictionary
targets and build rules.
master
Alexander Epaneshnikov 11 months ago
parent
commit
f8e669a4f8
No account linked to committer's email address

+ 5
- 0
ChangeLog.md View File

@@ -7,6 +7,11 @@

The espeak-ng project is a fork of the espeak project.

### 1.53.0

new languages:
* ps (Pashto) -- Hanif Rahman

### 1.52.0

attention! this is the last release witch support the autoconf build system. use cmake to compile espeak-ng.

+ 4
- 0
Makefile.am View File

@@ -527,6 +527,7 @@ dictionaries: \
espeak-ng-data/pap_dict \
espeak-ng-data/piqd_dict \
espeak-ng-data/pl_dict \
espeak-ng-data/ps_dict \
espeak-ng-data/pt_dict \
espeak-ng-data/py_dict \
espeak-ng-data/qdb_dict \
@@ -824,6 +825,9 @@ 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

ps: espeak-ng-data/ps_dict
espeak-ng-data/ps_dict: dictsource/ps_list dictsource/ps_rules dictsource/ps_extra dictsource/ps_emoji

pt: espeak-ng-data/pt_dict
espeak-ng-data/pt_dict: dictsource/pt_list dictsource/pt_rules dictsource/pt_extra dictsource/pt_emoji


+ 1774
- 0
dictsource/ps_emoji
File diff suppressed because it is too large
View File


+ 321
- 0
dictsource/ps_list View File

@@ -0,0 +1,321 @@
// This ps_list file is created for Pashto language support in espeak-ng by Hanif Rahman
// This file is UTF8 encoded
// Updated: March 2025 - Fixed to use only defined phonemes with correct stress

// Explicitly set phoneme table to ps
phonemetable ps


// The Letter names
ا alif
ب be:
پ pe:
ت te:
ټ t.e:
ث se:
ج dZi:m
ځ dzim
چ tSe:
څ tse:
ح he:
خ xe:
د da:l
ډ d.a:l
ذ za:l
ر re:
ړ r.e:
ز ze:
ژ Ze:
ږ Qe:
س si:n
ش Si:n
ښ S.i:n
ص swa:d
ض zwa:d
ط toe:
ظ zoe:
ع ain
غ Qain
ف fe:
ق qa:f
ک ka:f
ګ ga:f
ل la:m
م mi:m
ن nu:n
ڼ n.u:n
_و wa:w
ه he:
ں nu:n||Qun:@
ﮨ tSo:ti:||he:
ھ do||tSaSmi:||he:
ء hamz@
ی je:
ې je:||dra:z@
ۍ je:||l@ra:
ئ hamz@je:
ۀ he:||hamz@
ؤ wa:w||hamz@
ﺅ wa:w||hamz@
ة ta:||marbut@

// character names
َ zabar
ِ ze:r
ُ pe:S
ٰ alif||maqs'u:r@
ّ taSd'i:d
ً tanvi:n||zabar
ْ suku:n
ٗ zami||p@S
ٓ mad@
_؛ waqf@
_: ra:bt@
_، d.rand.@j
_۔ t.@kaj
_؟ puSt@naj


// The numbers
_0 s'@f@r
_1 j'aw
_2 dw@
_3 dre:
_4 c'@lor
_5 p'@ndz@
_6 Sp'aQ
_7 'o:w@
_8 'at@
_9 n'ah
_10 l'as
_11 jw'o:las
_12 dw'o:las
_13 di'arlas
_14 c'awarlas
_15 p'@ndz@las
_16 Sp'aQlas
_17 o:w'@las
_18 at'@las
_19 n'o:las
_20 S'@l
_21 j'aw||wiSt
_22 dw'a||wiSt
_23 dr'e:||wiSt
_24 c'@lor||wiSt
_25 p'@ndz@||wiSt
_26 Sp'aQ||wiSt
_27 'o:w@||wiSt
_28 'at@||wiSt
_29 n'ah||wiSt
_30 d'e:rS
_31 j'aw||de:rS
_40 c'@l||we:St
_50 p'@ndz'os
_60 Sp'e:t@
_70 aw'ja:
_80 at'ja:
_90 n'awi
_100 s'@l
_1000 z'@r
_10000 l'as||z'@r@
_100000 s'@l||z'@r@
_1000000 milj'o:n
_10000000 l'as||milj'o:n@
_100000000 s'@l||milj'o:n@
_1000000000 milijard
_0st s'@f@r@m
_1st l'@Raj
_2st dw'ajam
_3st dr'ejam
_4st c'@l'or@m
_5st p'@ndz@m
_6st Sp'aQ@m
_7st 'o:w@m
_8st 'at@m
_9st n'ah@m
_10st l'as@m

// common words with exceptional pronunciation
د d@ $u
او aw $u
په p@ $u
کې ke: $u
چې ce: $u
نه n@ $u
هم h@m $u
شي Si $u
ته t@ $u
خو xo $u
له l@ $u
به b@ $u
دا da: $u
ډېر d.e:r $u
وي wi $u
څه ts@ $u
یو j@w $u
کړي [email protected] $u
ښه S.@ $u
یې je: $u
کوي k@wi $u
خپل x@p@l $u
تر t@r $u
دي di $u
ځان dza:n $u
شو So $u
لري l@ri $u
شوي S@wi $u
لپاره l@pa:r@ $u
مې me: $u
کار ka:r $u
بل b@l $u
وکړ w@k@r. $u
ډول d.ol $u
لاره la:r@ $u
کولو kolu $u
خلک x@l@k $u
ورته w@rt@ $u
شوه Sw@ $u
لکه l@k@ $u
پورې pore: $u
دوه dw@ $u
مو mu $u
ټول t.ol $u
وه w@ $u
کړ k@r. $u
ژوند Z@w@nd $u
لوی loj $u
تاسو ta:so $u
هغه h@Q@ $u
کولی k@wl@j $u
وخت w@xt $u
کلی k@l@j $u
دغه d@Q@ $u
موږ muQ $u
یوه j@w@ $u
شي Si $u

// Additional common Pashto words with corrected phonetic transcriptions
سلام s@'la:m
زه z@
پښتو p@'S.to
يم j@m
ژبه Z@'b@
ستړی st@'r.@j
مشه m@'S@
څنګه ts@'ng@
يې je:
ته t@
څوک tsok
هغه h@'Q@
دلته d@l't@
هلته h@l't@
کور ko:r
ښار S.a:r
هېواد he:'wa:d
افغانستان afQa:n@s'ta:n
پاکستان pa:k@s'ta:n
ښوونځی S.o:w@n'dz@j
پوهنتون po:h@n'tu:n
کتاب k@'ta:b
قلم q@'l@m
میز me:z
چوکۍ co:'k@j
موټر mo:'t.@r
لار la:r
سړک s@'r.@k
اوبه o:'b@
ډوډۍ d.o:'d.@j
چای ca:j
شپه Sp@
ورځ wr@dz
کال ka:l
وخت w@xt
ساعت sa:'@t
دقیقه d@qi:'q@
ثانیه sa:'nj@
ښځه S.@'dz@
نارینه na:ri:'n@
ماشوم ma:'Sum
زوی zoj
لور lo:r
ورور wro:r
خور xo:r
پلار pla:r
مور mo:r
کورنۍ ko:r'n@j
ملګری m@l'g@re
دوست do:st
دښمن d@S.'m@n
ښوونکی S.o:w@n'k@j
زده zd@
زده_کوونکی zd@_ko:w@n'k@j
ډاکټر d.a:k't.@r
انجینر andzi'ne:r
بزګر b@z'g@r
سوداګر s@wda:'g@r
پولیس po:'lis
عسکر @s'k@r
وزیر w@'zi:r
ولسمشر w@l@s'm@S@r
خدای xu'da:j
جومات dZu'ma:t
لمونځ l@'mondz
روژه ro:'Z@
حج h@dZ
زکات z@'ka:t
اسلام is'la:m
مسلمان m@s@l'ma:n
قرآن qu'ra:n
حدیث h@'dis
سنت s@'n@t
فرض f@rz
واجب wa:'dZ@b
حرام h@'ra:m
حلال h@'la:l
مکروه m@k'ru:h
مباح m@'ba:h
جنت dZ@'n@t
دوزخ do:'z@x
ملائکه m@la:'ik@
پیغمبر p@jQ@m'b@r
صحابه s@'ha:b@
تابعین ta:bi'i:n
علماء ul@'ma:
مشران m@S'ra:n
کشران k@S'ra:n
ځوانان dzwa:'na:n
زاړه za:'r.@
ناروغ na:'roQ
روغ roQ
ښکلی S.@k'l@j
بد b@d
ښه S.@
خراب x@'ra:b
لوی loj
کوچنی kotS'n@j
اوږد o:Qd
لنډ l@nd.
پلن pl@n
نری n@'r@j
دروند d@'rwnd
سپک sp@k
تود to:d
یخ j@x
وچ w@tS
لوند lw@nd
نوی n@'w@j
زوړ zo:r.
پاک pa:k
ناپاک na:'pa:k
سپین spi:n
تور to:r
سور so:r
شین Si:n
ژیړ Ze:r.
آبي a:'bi
نارنجي na:r@n'dZi
بنفش b@'n@fS
خړ x@r.
نسواري n@swa:'ri
طلایي t@la:'ji
نقره‌یي n@qr@'ji

+ 1514
- 0
dictsource/ps_rules
File diff suppressed because it is too large
View File


+ 4
- 0
espeak-ng-data/lang/ira/ps View File

@@ -0,0 +1,4 @@
name Pashto
language ps
maintainer Hanif Rahman <[email protected]>
status immature

+ 11
- 0
espeak-ng-data/voices/asia/ps View File

@@ -0,0 +1,11 @@
name Pashto
language ps
phonemes ps
dictionary ps
dictrules 1
stressRule 2 // Stress on second syllable
stressLength 160 180 200 200 0 0 240 240
stressAmp 16 18 20 20 0 0 22 22
intonation 2
// This voice uses the Pashto phoneme set with improved stress and intonation patterns
// Created: March 2024 by Hanif Rahman

+ 5
- 0
espeak-ng-data/voices/ps View File

@@ -0,0 +1,5 @@
name Pashto (Afghanistan)
language ps
phonemes ps
dictionary ps
stressRule 6

+ 730
- 0
phsource/ph_pashto View File

@@ -0,0 +1,730 @@
// ph_pashto - Phoneme table for Pashto language
// Created: March 2025 by Hanif Rahman
// Updated: March 2025 - Fixed vowel formants, improved retroflex consonants, corrected stress patterns
// This file defines phonemes specific to Pashto language


//====================================================
// VOWELS
//====================================================

phoneme a // َ (zabar/fatha) - short 'a' as in "man"
vwl starttype #a endtype #a
length 180
ipa a
FMT(vowel/a)
endphoneme

phoneme a: // ا - long 'aa' as in "father"
vwl starttype #a endtype #a
length 280
ipa aː
FMT(vowel/a) // Keeping formant consistent with short 'a'
endphoneme

phoneme e // ِ (zer/kasra) - short 'e' as in "bed" "ketab"
vwl starttype #e endtype #e
length 170
ipa e
FMT(vowel/e)
endphoneme

phoneme e: // ې - long 'ee' as in "bait" "peshawar"
vwl starttype #e endtype #e
length 250
ipa eː
FMT(vowel/e_mid) // Using e_mid for better long vowel quality
endphoneme

phoneme i // ِ (zer/kasra) - short 'i' as in "sit" same as e?
vwl starttype #i endtype #i
length 170
ipa i
IfNextVowelAppend(;)
FMT(vowel/i)
endphoneme

phoneme i: // ي - long 'ee' as in "see"
vwl starttype #i endtype #i
length 250
ipa iː
IfNextVowelAppend(;)
FMT(vowel/i) // Using standard i vowel
endphoneme

phoneme o // ُ (pesh/damma) - short 'o' as in "pot"
vwl starttype #o endtype #o
length 170
ipa o
FMT(vowel/o)
endphoneme

phoneme o: // و - long 'o' as in "go"
vwl starttype #o endtype #o
length 250
ipa oː
FMT(vowel/o) // Using standard o vowel
endphoneme

phoneme u // ُ (pesh/damma) - short 'u' as in "put"
vwl starttype #u endtype #u
length 170
ipa u
FMT(vowel/u)
endphoneme

phoneme u: // و - long 'oo' as in "moon"
vwl starttype #u endtype #u
length 250
ipa uː
FMT(vowel/u) // Using standard u vowel
endphoneme

phoneme @ // ə - schwa sound as in "about"
vwl starttype #@ endtype #@
length 130
ipa ə
unstressed
FMT(vowel/@)
endphoneme

// Add unstressed variants of vowels for better prosody
phoneme a# // َ (zabar/fatha) - unstressed short 'a'
vwl starttype #a endtype #a
length 140 // shorter than stressed version
ipa a
unstressed
FMT(vowel/a_8)
endphoneme

phoneme i# // ِ (zer/kasra) - unstressed short 'i'
vwl starttype #i endtype #i
length 130 // shorter than stressed version
ipa i
unstressed
IfNextVowelAppend(;)
FMT(vowel/i_6)
endphoneme

phoneme u# // ُ (pesh/damma) - unstressed short 'u'
vwl starttype #u endtype #u
length 130 // shorter than stressed version
ipa u
unstressed
FMT(vowel/u_6)
endphoneme

//====================================================
// CONSONANTS SPECIFIC TO PASHTO
//====================================================

phoneme ts
// څ in Pashto - voiceless alveolar affricate
vls alv afr
lengthmod 2
ipa ts
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)
endphoneme

phoneme dz
// ځ in Pashto - voiced alveolar affricate
vcd alv afr
lengthmod 5
ipa dz
voicingswitch ts
Vowelin f1=1 f2=1700 -300 300 f3=-100 80
Vowelout f1=1 f2=1700 -300 300 f3=-100 80 brk
WAV(ustop/ts) addWav(x/d, 70) // Using standard WAV files
endphoneme

phoneme t.
// ټ in Pashto - retroflex/plosive t
vls rfx stp
lengthmod 2
ipa ʈ
voicingswitch d.
Vowelin f1=0 f2=1800 -300 300 f3=-200 80 colr=2
Vowelout f1=0 f2=1800 -300 250 f3=-200 80 colr=2 rms=20
WAV(ustop/t_) // Using standard t_ WAV
endphoneme

phoneme d.
// ډ in Pashto - retroflex/plosive d
vcd rfx stp
lengthmod 5
ipa ɖ
voicingswitch t.
Vowelin f1=2 f2=1800 -300 300 f3=-200 80 colr=2
Vowelout f1=2 f2=1800 -300 300 f3=-200 80 colr=2 brk
WAV(ustop/t_) addWav(x/d, 60) // Using standard WAV files
endphoneme

phoneme r.
// ړ in Pashto - retroflex flap
vcd rfx flp
lengthmod 6
ipa ɽ
Vowelin f1=3 f2=1200 -400 -100 f3=-400 80 colr=2
Vowelout f1=3 f2=1200 -400 -100 f3=-400 80 colr=2
FMT(r3/r_) addWav(r3/rx, 80) // Using standard FMT
endphoneme

phoneme n.
// ڼ in Pashto - retroflex nasal
vcd rfx nas
lengthmod 4
ipa ɳ
Vowelin f1=2 f2=1200 -500 -300 f3=-400 80 colr=2
Vowelout f1=2 f2=1200 -500 -300 f3=-400 80 colr=2
FMT(n/n_) // Using standard FMT
endphoneme

phoneme S.
// ښ in Pashto - retroflex fricative
vls rfx frc sib
lengthmod 3
ipa ʂ
voicingswitch Z.
Vowelin f1=0 f2=1800 -100 300 f3=-400 80 colr=2
Vowelout f1=0 f2=1800 -100 300 f3=-400 80 colr=2
WAV(ufric/sh) // Using standard sh WAV
endphoneme

phoneme Z.
// ژ in Pashto - voiced retroflex fricative
vcd rfx frc sib
lengthmod 6
ipa ʐ
voicingswitch S.
Vowelin f1=0 f2=1800 0 300 f3=-400 80 colr=2
Vowelout f1=2 f2=1800 0 300 f3=-400 80 colr=2 brk
FMT(voc/zh) addWav(vocw/zh, 110) // Using standard zh WAV
endphoneme

phoneme Z
// ژ in Pashto - voiced post-alveolar fricative (like French j)
vcd pla frc sib
lengthmod 6
ipa ʒ
voicingswitch S
Vowelin f1=0 f2=2000 0 300 f3=-200 80
Vowelout f1=2 f2=2000 0 300 f3=-200 80 brk
FMT(voc/zh) addWav(vocw/zh, 130)
endphoneme

phoneme Q
// غ in Pashto - voiced uvular fricative
vcd uvl frc
lengthmod 6
ipa ʁ
voicingswitch X
Vowelin f1=2 f2=1000 -500 -350 f3=-200 80
Vowelout f1=2 f2=1000 -500 -350 f3=-200 80 brk
FMT(voc/Q) addWav(vocw/Q, 60) // Increased WAV amplitude for better voicing
endphoneme

phoneme X
// خ in Pashto - voiceless uvular fricative
vls uvl frc
lengthmod 3
ipa χ
voicingswitch Q
Vowelin f1=0 f2=1000 -500 -350 f3=-200 80
Vowelout f1=0 f2=1000 -500 -350 f3=-200 80
WAV(ufric/xx, 90) // Adjusted amplitude for better contrast with Q
endphoneme

phoneme g
// ګ in Pashto - voiced velar stop
vcd vel stp
lengthmod 5
ipa ɡ
voicingswitch k
Vowelin f1=2 f2=2300 200 300 f3=-300 80
Vowelout f1=2 f2=2300 250 300 f3=-300 80 brk
IF PreVoicing THEN
FMT(g/xg)
ENDIF
IF nextPh(isPause2) THEN
FMT(g/g_) addWav(x/g_)
ENDIF
FMT(g/g) addWav(x/g2, 150)
endphoneme

//====================================================
// CONSONANTS SHARED WITH OTHER LANGUAGES
//====================================================

phoneme p
vls blb stp
voicingswitch b
lengthmod 2
ipa p
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)
endphoneme

phoneme b
vcd blb stp
voicingswitch p
lengthmod 5
ipa b
Vowelin f1=2 f2=1000 -500 -300 f3=-300 80
Vowelout f1=2 f2=1000 -500 -300 f3=-300 80 brk
IF PreVoicing THEN
FMT(b/xb)
ENDIF
IF nextPh(isPause2) THEN
FMT(b/b_) addWav(x/b_)
ENDIF
FMT(b/b) addWav(x/b)
endphoneme

phoneme t
vls alv stp
voicingswitch d
lengthmod 2
ipa t
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 d
vcd alv stp
voicingswitch t
lengthmod 5
ipa d
Vowelin f1=1 f2=1700 -300 300 f3=-100 80
Vowelout f1=1 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 k
vls vel stp
voicingswitch g
lengthmod 2
ipa k
Vowelin f1=0 f2=2300 200 300 f3=-200 80
Vowelout f1=0 f2=2300 300 400 f3=-200 80 rms=20
IF nextPh(isPause2) THEN
WAV(ustop/k_)
ENDIF
WAV(ustop/k)
endphoneme

phoneme tS
// چ in Pashto - voiceless post-alveolar affricate
vls pla afr sib
voicingswitch dZ
lengthmod 2
ipa t͡ʃ
Vowelin f1=0 f2=2300 200 400 f3=-100 80
Vowelout f1=0 f2=2300 300 400 f3=-100 80
WAV(ustop/tsh)
endphoneme

phoneme dZ
// ج in Pashto - voiced post-alveolar affricate
vcd pla afr sib
voicingswitch tS
lengthmod 5
ipa d͡ʒ
Vowelin f1=2 f2=2300 200 400 f3=-100 80
Vowelout f1=2 f2=2300 250 300 f3=-100 80 brk
IF PreVoicing THEN
FMT(dzh/xdzh)
ENDIF
IF nextPh(isPause2) THEN
FMT(dzh/dzh_) addWav(x/dzh_)
ENDIF
FMT(dzh/dzh) addWav(x/dzh)
endphoneme

phoneme f
vls lbd frc
voicingswitch v
lengthmod 3
ipa f
Vowelin f1=0 f2=1000 -500 -350 f3=-200 80
Vowelout f1=0 f2=1000 -500 -350 f3=-200 80
WAV(ufric/f)
endphoneme

phoneme v
vcd lbd frc
voicingswitch f
lengthmod 6
ipa v
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_) addWav(vocw/v)
ENDIF
FMT(voc/v) addWav(vocw/v)
endphoneme

phoneme s
vls alv frc sib
voicingswitch z
lengthmod 3
ipa s
Vowelin f1=0 f2=1700 -300 300 f3=-100 80
Vowelout f1=0 f2=1700 -300 300 f3=-100 80
WAV(ufric/s)
endphoneme

phoneme z
vcd alv frc sib
voicingswitch s
lengthmod 6
ipa z
Vowelin f1=0 f2=1700 -300 300 f3=-100 80
Vowelout f1=0 f2=1700 -300 300 f3=-100 80 brk
IF nextPh(isPause2) THEN
FMT(voc/z_) addWav(ufric/s_, 70)
ENDIF
FMT(voc/z) addWav(ufric/s_, 85)
endphoneme

phoneme S
vls pla frc sib
voicingswitch Z
lengthmod 3
ipa ʃ
Vowelin f1=0 f2=2100 100 300 f3=-100 80
Vowelout f1=0 f2=2100 100 300 f3=-100 80
WAV(ufric/sh)
endphoneme

phoneme x
vls vel frc
voicingswitch Q
lengthmod 3
ipa x
Vowelin f1=0 f2=2300 200 400 f3=-200 80
Vowelout f1=0 f2=2300 300 400 f3=-200 80
WAV(ufric/x_hr, 30) // Increased amplitude for better clarity
endphoneme

phoneme h
vls glt frc
lengthmod 3
ipa h
Vowelin f1=0 f2=2300 200 400 f3=-200 80 // Added Vowelin parameters
Vowelout f1=0 f2=2300 300 400 f3=-200 80
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)
endphoneme

phoneme m
vcd blb nas
lengthmod 4
ipa m
Vowelin f1=0 f2=1000 -50 -200 f3=-200 80 // Moved Vowelin before Vowelout for consistency
Vowelout f1=2 f2=1000 -500 -350 f3=-200 80 brk
IF KlattSynth THEN
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_)
ENDIF
endphoneme

phoneme n
vcd alv nas
lengthmod 4
ipa n
Vowelin f1=0 f2=1500 -200 200 f3=0 80 // Moved Vowelin before Vowelout for consistency
Vowelout f1=2 f2=1500 -300 250 f3=-100 80 rms=20 brk

IF KlattSynth THEN
FMT(klatt/n)
ENDIF

NextVowelStarts
VowelStart(n/n@)
VowelStart(n/na)
VowelStart(n/ne)
VowelStart(n/ni)
VowelStart(n/no)
VowelStart(n/nu)
EndSwitch

IF prevPh(isNotVowel) AND nextPhW(isLiquid) THEN
FMT(n/nj)
ELIF prevPh(isPause) OR prevPh(n) THEN
FMT(n/_n)
ELIF nextPh(isNotVowel) THEN
FMT(n/n_)
ENDIF
endphoneme

phoneme N
vcd vel nas
lengthmod 8
ipa ŋ
Vowelin f1=0 f2=2100 50 300 f3=0 80 // Moved Vowelin before Vowelout for consistency
Vowelout f1=3 f2=2300 300 400 f3=-200 80 len=40 rms=20 brk

IF KlattSynth THEN
IF nextPh(isPause2) THEN
FMT(klatt/nn_)
ENDIF
FMT(klatt/nn)
ENDIF

NextVowelStarts
VowelStart(nn/nn@)
VowelStart(nn/nna)
VowelStart(nn/nne)
VowelStart(nn/nni)
VowelStart(nn/nno)
VowelStart(nn/nnu)
EndSwitch

IF prevPh(#i) THEN
VowelEnding(nn/inn, -40)
ENDIF

IF prevPh(isNotVowel) AND nextPhW(isLiquid) THEN
FMT(nn/nnj)
ELIF prevPh(isPause) THEN
FMT(nn/_nn)
ELIF nextPh(isNotVowel) THEN
FMT(nn/nn_)
ENDIF
endphoneme

phoneme l
liquid
lengthmod 7
ipa l

IF nextPh(isNotVowel) THEN
ChangePhoneme(l/)
ENDIF

CALL vowelstart_l

IF prevPh(#@) THEN
VowelEnding(l/xl, -50)
ELIF prevPh(isVowel) THEN
VowelEnding(l/xl, -40)
ENDIF

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 l/
liquid
lengthmod 7
ipa l̥

IF nextPh(isVowel) THEN
ChangePhoneme(l)
ENDIF

PrevVowelEndings
VowelEnding(l/L1_@L, -60)
VowelEnding(l/L1_aL, -40)
VowelEnding(l/L1_eL, -30)
VowelEnding(l/L1_iL, -30)
VowelEnding(l/L1_oL, -40)
VowelEnding(l/L1_uL, -40)
EndSwitch

IF prevPhW(j) THEN
FMT(l/L1_eL)
ENDIF
IF prevPhW(w) THEN
FMT(l/L1_eL)
ENDIF

FMT(l/l_)
endphoneme

phoneme r
liquid rhotic
lengthmod 7
ipa r

IF nextPh(isNotVowel) THEN
ChangePhoneme(r/)
ENDIF

NextVowelStarts
VowelStart(r/r@, -15)
VowelStart(r/ra, -15)
VowelStart(r/re, -15)
VowelStart(r/ri, -15)
VowelStart(r/ro, -15)
VowelStart(r/ru, -15)
EndSwitch

IF prevPh(isVowel) THEN
VowelEnding(r/xr, -50)
ENDIF

IF prevPh(isPause) THEN
FMT(r/_r)
ELIF prevPh(t) OR prevPh(p) OR prevPh(k) THEN
FMT(r/tr)
ENDIF

FMT(r/r)
endphoneme

phoneme r/
liquid rhotic
lengthmod 2
ipa r̥

IF prevPh(t) OR prevPh(p) OR prevPh(k) THEN
FMT(r/trr)
ENDIF

IF prevPh(isNotVowel) THEN
FMT(r/rr)
ENDIF

FMT(r3/r_) addWav(r3/rx)
endphoneme

phoneme j
liquid pal starttype #i
lengthmod 7
ipa j

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, -30)

IF prevPh(isPause) THEN
FMT(j/_j)
ENDIF
ELSE
// no vowel follows
Vowelout len=70
FMT(j/j_)
ENDIF
endphoneme

phoneme w
liquid
lengthmod 7
starttype #u
ipa w
IF nextPh(isVowel) THEN
NextVowelStarts
VowelStart(w/w@)
VowelStart(w/wa)
VowelStart(w/we)
VowelStart(w/wi)
VowelStart(w/wo)
VowelStart(w/wu)
EndSwitch

VowelEnding(w/xw, -30)

IF prevPhW(isNasal) THEN
FMT(w/w)
ELSEIF prevPhW(h) THEN
// none, [hw]
ELSE
FMT(w/_w)
ENDIF
ELSE
// no vowel follows
Vowelout len=50
IF prevPh(#i) THEN
FMT(w/iw_)
ENDIF
FMT(w/w_)
ENDIF
endphoneme

phoneme q
vls uvl stp
lengthmod 2
ipa q
Vowelin f1=1 f2=1700 0 200 f3=-300 80 gpaus f4 rms=30
Vowelout f1=1 f2=1700 -100 200 f3=-300 80 f4 rms=35

IF nextPh(isPause2) THEN
WAV(ustop/q, 40)
ELIF nextPh(#u) THEN
WAV(ustop/q_u, 80)
ENDIF
WAV(ustop/q, 48)
endphoneme

phoneme ?
vls glt stp
lengthmod 3
ipa ʔ
nolink
Vowelin glstop
Vowelout glstop
WAV(ustop/null)
endphoneme

+ 3
- 0
phsource/phonemes View File

@@ -2069,3 +2069,6 @@ phonemetable ms id

phonemetable kaa kk
include ph_karakalpak

phonemetable ps base1
include ph_pashto

+ 3
- 0
src/windows/data.vcxproj View File

@@ -332,6 +332,9 @@
<Target Name="pl" Inputs="$(ProjectDir)..\..\dictsource\pl_rules;$(ProjectDir)..\..\dictsource\pl_list" Outputs="$(ProjectDir)..\..\espeak-ng-data\pl_dict" DependsOnTargets="Phonemes">
<Exec Command="cd $(ProjectDir)..\..\dictsource &amp;&amp; $(TargetDir)espeak-ng.exe --path=$(ProjectDir)..\.. --compile=pl" />
</Target>
<Target Name="ps" Inputs="$(ProjectDir)..\..\dictsource\ps_rules;$(ProjectDir)..\..\dictsource\ps_list" Outputs="$(ProjectDir)..\..\espeak-ng-data\ps_dict" DependsOnTargets="Phonemes">
<Exec Command="cd $(ProjectDir)..\..\dictsource &amp;&amp; $(TargetDir)espeak-ng.exe --path=$(ProjectDir)..\.. --compile=ps" />
</Target>
<Target Name="pt" Inputs="$(ProjectDir)..\..\dictsource\pt_rules;$(ProjectDir)..\..\dictsource\pt_list" Outputs="$(ProjectDir)..\..\espeak-ng-data\pt_dict" DependsOnTargets="Phonemes">
<Exec Command="cd $(ProjectDir)..\..\dictsource &amp;&amp; $(TargetDir)espeak-ng.exe --path=$(ProjectDir)..\.. --compile=pt" />
</Target>

+ 1
- 0
tests/language-phonemes.test View File

@@ -155,3 +155,4 @@ test_phwav vi-VN-x-south 292eb169fdbd65bfd6c208d657f33a5b6dd61792 "na Na la ja p
test_phwav xex b50c3128c2e7e6445345dc62ca3f60ea6fa3e89d "ma na Na pa ta ka ba da ga fa va sa Sa za Za tSa dZa la l^a *a Ra ra r/a wa ja _:_ ma maI maU m&~ m&U~ me meI meU mE me~ mi mi~ mo mo~ moI mu mu~ m@"
test_phwav yue af260b341089441ab81f2eac8b19895490a81be0 "na Na la ja pa pha fa ta tha ka kha tS;a tS;ha S;a s.a tsa tsha ts.a ts.ha N-a _:_ ma mA mai mAu m@ m@r mE mei mi mi[ mi. miA miAu miE mio miou mo mo- mou mong mu muA mua muai mu@ mei muo my myu my& myE my@ myi _:_ ma11 ma21 ma214 ma22 ma33 ma35 ma44 ma51 ma53 ma55"
test_phwav yue-Latn-jyutping af260b341089441ab81f2eac8b19895490a81be0 "na Na la ja pa pha fa ta tha ka kha tS;a tS;ha S;a s.a tsa tsha ts.a ts.ha N-a _:_ ma mA mai mAu m@ m@r mE mei mi mi[ mi. miA miAu miE mio miou mo mo- mou mong mu muA mua muai mu@ mei muo my myu my& myE my@ myi _:_ ma11 ma21 ma214 ma22 ma33 ma35 ma44 ma51 ma53 ma55"
test_phwav ps d2dd8d9e11d4bfd7bb714c24b340bbd110a6a75a "ma na Na pa ta ka ba da ga fa Ta sa Sa xa ha va Da za Za tSa dZa la ra ja wa t2a t#a d#a z#a r-a z/2a w#a m- n- N- _:_ mI mE ma m0 mV mU mi: mA: mO: mu: m3: mA@ mO@ mo@ mU@ mi@3 mIR mVR mi@ me@ mi m@ m3 me# mI# mI2 meI maI mOI moU maU maa mO2 maI@ maI3 maU@"

Loading…
Cancel
Save