Browse Source

Add Pashto language support based on Urdu language files

This commit adds support for the Pashto language (ps) to espeak-ng. The implementation is based on Urdu language files and includes ps_rules, ps_list, ps_emoji, ps_extra files and updated Makefile.am to include Pashto in the dictionary targets and build rules.

fix: add Pashto data file.

refactor: use enhance rules for stress.

fix: add missing configs.

Add Pashto phoneme support and improve voice files

fix: add Pashto phonemes test.

fix: restore original phonemes.

fix: remove renduandant ps_dict from Make.am file.

fix: use correct phonemes with ipa and stress rules.

feat: translate all en_emoji to Pashto.

fix: add Pashto dict entry in Makefile.am

feat: enhance ps_rules with example pairs and words.
master
Hanif Rahman 2 months ago
parent
commit
03989008b7

+ 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