Browse Source

[1.29.18] Add data for Serbian voice ("sr").

Moved Croatian/Bosnian/Serbian dictionary source data to hbs_rules, hbs_list.
Added data for Ancient Greek voice ("grc").
In voice files, the attribute: word n  adds a short pause between words. n = 1 to 4 for increasing pause length.


git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@103 d46cf337-b52f-0410-862d-fd96e6ae7743
master
jonsd 17 years ago
parent
commit
f9725f9f64
51 changed files with 1513 additions and 504 deletions
  1. 13
    20
      dictsource/dict_phonemes
  2. 1
    0
      dictsource/en_list
  3. 1
    1
      dictsource/en_rules
  4. 29
    0
      dictsource/grc_list
  5. 344
    0
      dictsource/grc_rules
  6. 603
    0
      dictsource/hbs_list
  7. 15
    7
      dictsource/hbs_rules
  8. 0
    336
      dictsource/hu_list
  9. 1
    1
      espeak-data/voices/bs
  10. 8
    0
      espeak-data/voices/grc
  11. 3
    0
      espeak-data/voices/hr
  12. 14
    0
      espeak-data/voices/sr
  13. 29
    0
      espeak-data/voices/zh
  14. 79
    39
      phsource/compile_report
  15. 8
    0
      phsource/ph_croatian
  16. 7
    7
      phsource/ph_finnish
  17. 15
    15
      phsource/ph_hindi
  18. 7
    7
      phsource/ph_latin
  19. 221
    8
      phsource/ph_serbian
  20. 10
    8
      phsource/phonemes
  21. BIN
      phsource/ufric/ch_sr.wav
  22. BIN
      phsource/ufric/[email protected]
  23. BIN
      phsource/ufric/h_.wav
  24. BIN
      phsource/ufric/ha.wav
  25. BIN
      phsource/ufric/he.wav
  26. BIN
      phsource/ufric/hi.wav
  27. BIN
      phsource/ufric/ho.wav
  28. BIN
      phsource/ufric/hu.wav
  29. BIN
      phsource/ufric/hu_fi.wav
  30. BIN
      phsource/ufric/sh_sr.wav
  31. BIN
      phsource/ufric/x_sr.wav
  32. BIN
      phsource/ustop/t_sr.wav
  33. BIN
      phsource/ustop/ts_sr.wav
  34. BIN
      phsource/ustop/tsh_sr.wav
  35. BIN
      phsource/vdiph2/ei_4
  36. BIN
      phsource/vdiph2/vowelchart.png
  37. BIN
      phsource/vowel/u_7
  38. BIN
      phsource/vwl_en_us/a
  39. 35
    1
      src/compiledata.cpp
  40. 3
    2
      src/compiledict.cpp
  41. 29
    9
      src/dictionary.cpp
  42. 3
    2
      src/phoneme.h
  43. 7
    5
      src/phonemelist.cpp
  44. 1
    1
      src/setlengths.cpp
  45. 14
    4
      src/speak.cpp
  46. 5
    1
      src/speech.h
  47. 1
    1
      src/synthdata.cpp
  48. 0
    10
      src/synthesize.cpp
  49. 0
    2
      src/tr_english.cpp
  50. 4
    13
      src/tr_languages.cpp
  51. 3
    4
      src/translate.h

+ 13
- 20
dictsource/dict_phonemes View File

th v w x z th v w x z




Dictionary hr_dict

& @ @- @2 a A a: aI
aU E e e: E~ i I i:
l- O o o: oU r- u U
u: y

* b d dZ dZ; f g h
j k l l^ m n N n^
p r R s S t tS ts
tS; v x z Z


Dictionary hu_dict Dictionary hu_dict


A a: E e: i i: o o:
u u: Y Y:

: b c d dZ f g h
j J k l m n n^ p
R R2 s S s2 t tS ts
v z Z




Dictionary it_dict Dictionary it_dict
p ph R R2 R3 s s. S; p ph R R2 R3 s s. S;
t th ts ts. ts. tS; tS; tsh t th ts ts. ts. tS; tS; tsh
v w x z z. v w x z z.


Dictionary hbs_dict

& @ @2 a A a: aI aU
E e e: E~ i I i: l-
O o o: oU r* r- u U
u: y

* b d dZ dZ; f g h
j k l L l^ m n N
n^ p r R s S t tS
ts tS; v x z Z

+ 1
- 0
dictsource/en_list View File



naif naI'i:f naif naI'i:f
naïve naI'i:v naïve naI'i:v
nasa nasa2
nascent neIs@nt nascent neIs@nt
nativity $2 nativity $2
natural natS@r@L natural natS@r@L

+ 1
- 1
dictsource/en_rules View File

as (tern a2s as (tern a2s
as (thm as as (thm as
as (tral as as (tral as
as (tro aas
as (tro as
as (trolog a2s as (trolog a2s
as (trono a2s as (trono a2s
ass (ym as ass (ym as

+ 29
- 0
dictsource/grc_list View File


?1 _0lang _^_EN // speak numbers in English

// articles
hο $u // ὁ
τὼ $u // τώ
οhι $u // οἱ
hη $u // ἡ
τὰ $u // τά
αhι $u // αἱ
τὸ $u // τό

τοὺ $u // τοῦ
τοὶν $u // τοῖν
τὴς $u // τῆς
ταὶν $u // ταῖν
τὼν $u // τῶν

τῲ $u // τῷ
τοὶς $u // τοῖς
τῂ $u // τῇ
ταὶν $u // ταῖν
ταὶς $u // ταῖς

τὸν $u // τόν
τοὺς $u // τούς
τὴν $u // τήν
τὰς $u // τάς


+ 344
- 0
dictsource/grc_rules View File

// Spelling to Phoneme rules for: Ancient Greek

// Preliminary character substitution:
// Convert tonos, oxia and perispomeni to varia
// Remove psili (soft breathing)
// Convert dasia accent to a separate prefix character ("h")
// Remove iota subscripts
// Replace Latin characters by same-shape Greek characters

.replace
a α // Latin->Greek
o ο
v ν
A Α
B Β
E Ε
Z Ζ
H Η
I Ι
K Κ
M Μ
N Ν
O Ο
P Ρ
T Τ
Y Υ
X Χ

// alpha
ά ὰ // tonos
ά ὰ // oxia
ᾴ ᾲ
ᾶ ὰ
ᾷ ᾲ

ἀ α
ἁ hα
ἂ ὰ
ἃ hὰ
ἄ ὰ
ἅ hὰ
ἆ ὰ
ἇ hὰ

ᾀ ᾳ
ᾁ hᾳ
ᾂ ᾲ
ᾃ hᾲ
ᾄ ᾲ
ᾅ hᾲ
ᾆ ᾲ
ᾇ hᾲ

// epsilon
έ ὲ
έ ὲ
ἐ ε
ἑ hε
ἒ ὲ
ἓ hὲ
ἔ ὲ
ἕ hὲ

// eta
ή ὴ
ή ὴ
ῄ ῂ
ῆ ὴ
ῇ ῂ

ἠ η
ἡ hη
ἢ ὴ
ἣ hὴ
ἤ ὴ
ἥ hὴ
ἦ ὴ
ἧ hὴ

ᾐ ῃ
ᾑ hῃ
ᾒ ῂ
ᾓ hῂ
ᾔ ῂ
ᾕ hῂ
ᾖ ῂ
ᾗ hῂ

//iota
ί ὶ
ί ὶ
ῖ ὶ

ἰ ι
ἱ hι
ἲ ὶ
ἳ hὶ
ἴ ὶ
ἵ hὶ
ἶ ὶ
ἷ hὶ

ΐ ῒ
ῗ ῒ

// omicron
ό ὸ
ό ὸ
ὀ ο
ὁ hο
ὂ ὸ
ὃ hὸ
ὄ ὸ
ὅ hὸ

// upsilon
ύ ὺ
ύ ὺ
ῦ ὺ

ὐ υ
ὑ hυ
ὒ ὺ
ὓ hὺ
ὔ ὺ
ὕ hὺ
ὖ ὺ
ὗ hὺ

ΰ ῢ
ῧ ῢ

// omega
ώ ὼ
ώ ὼ
ῴ ῲ
ῶ ὼ
ῷ ῲ

ὠ ω
ὡ hω
ὢ ὼ
ὣ hὼ
ὤ ὼ
ὥ hὼ
ὦ ὼ
ὧ hὼ

ᾠ ῳ
ᾡ hῳ
ᾢ ῲ
ᾣ hῲ
ᾤ ῲ
ᾥ hῲ
ᾦ ῲ
ᾧ hῲ

// rho
ῤ ρ
ῥ hρ


.group α
α a
αι aI
αὶ 'aI
αυ aU
αὺ 'aU
αhι haI
αhὶ 'haI
αhυ haU
αhὺ 'haU

.group β
β b


.group γ
γ g
γγ Ng

.group δ
δ d


.group ε
ε e
ει e:
εὶ 'e:
ευ eU
εὺ 'eU
εhι he:
εhὶ 'he:
εhυ heU
εhὺ 'heU

.group ζ
ζ z


.group η
η E:
ηι EI:
ηὶ 'EI:
ηυ EU:
ηὺ 'EU:
ηhι hEI:
ηhὶ 'hEI:
ηhυ hEU:
ηhὺ 'hEU:

.group θ
θ T


.group ι
ι i


.group ϊ
ϊ i


.group κ
κ k


.group λ
λ l


.group μ
μ m


.group ν
ν n


.group ξ
ξ ks


.group ο
ο o
οι oI
οὶ 'oI
ου u:
οὺ 'u:
οhι hoI
οhὶ 'hoI
οhυ hu:
οhὺ 'hu:

.group π
π p


.group ρ
ρ R


.group ς
ς s


.group σ
σ s


.group τ
τ t


.group υ
υ y
υι yI
υὶ 'yI
υhι hyI
υhὶ 'hyI

.group ϋ
ϋ y
ϋι yI
ϋὶ 'yI
ϋhι hyI
ϋhὶ 'hyI

.group φ
φ f


.group χ
χ x


.group ψ
ψ ps


.group ω
ω O:
ωι OI:
ωὶ 'OI:
ωυ OU:
ωὺ 'OU:
ωhι hOI:
ωhὶ 'hOI:
ωhυ hOU:
ωhὺ 'hOU:



.group h // dasia (rough breathing)
h h


.group
ὰ 'a
ᾳ aI:
ᾲ 'aI:
ὲ 'e
ὴ 'E:
ῃ EI:
ῂ 'EI:
ὶ 'i
ῒ 'i
ὸ 'o
ὺ 'y
ῢ 'y
ὼ 'O:
ῳ OI:
ῲ 'OI:












+ 603
- 0
dictsource/hbs_list View File


// "hbs" is the ISO 639-3 code for Serbian/Croatian/Bosnian macrolanguage
// This file is UTF-8 encoded

// Conditional rules:
// ?1 Croatian
// ?2 Serbian
// ?3 Bosnian (Bosna and Hercegovina)
// ?4 Serbian & Bosnian


// Letters
b b@
c ts@
č tS@
ć tS;@2
d d@
dž dZ@
đ dZ;@2
f f@
g g@
h x@
j j@2
k k@
l l@
lj l^@
m m@
n n@
nj n^@
p p@
q kv@
r R@
_s s@
š S@
t t@
v v@
w dvostr*uko||v@
?2 w duplo||v@
x iks
y ipsilon
z z@
ž Z@

// symbols
_?? znak // unknown symbol
_?A slovo // unknown letter
© 'aUtoRsk&||pr*av&
% p'osto
+ plus
€ 'euRo
?4 € 'evr*o
@ _'at
?2 @ tRgovatSkoi
& _'end
! 'usklItSnIk
?2 ! 'uzvItSnIk
: dv'ototSk&
?4 : dv'ot&tSk&
# br*'oj_
/ kr*'oz_
\\ b'EkslES
^ ts'iRkumfleks
~ t'ild&
¤ v'alut&
§ 'odlom&k
µ m'ikr*o
¶ tSl'an&k
° st'up&n^
?4 ° st'epen
_" n'avodnIk
?2 _" n'avod
_‚ 'otvoReni||n'avodnIk
_„ sp'uSteni||n'avodnIk
?2 _„ z&tvoReni||n'avodnIk
… tr*'i||t'otSke
?4 … tr*'i||t'atSke
† kr*'iZ
?2 † kr-'st
‡ dv'ostr*Uki||kr*'iZ
?2 ‡ dv'ostRUki||kR'st
‰ pr*'omil
_‹ 'otvoReni||n'avodnIk
_‘ 'otvoReni||n'avodnIk
_’ j'ednostr*'uki||n'avodnIk
_“ 'otvoReni||n'avodnIk
_” z'atvoReni||n'avodnIk
• kr*'upna||t'otSk&
?4 • kr*'upna||t'atSk&
_– En||ts'r-t&
_— Em||ts'r-t&
™ pr*'o'izvodZ&tS
˘ br*'evis
¨ pr*'ijegl&s
?2 ¨ pr*'egl&s
_« 'otvoReni||n'avodnIk
_­ pr*'ivr*emen&||ts'r-t'its&
· p'ut&
¸ sed'il&
_» z'atvoReni||n'avodnIk
® R'egistr*atsIj&
ł l@||s&||ts'r-t'itsom
× p'ut&
÷ p'odijel^,eno
?2 ÷ p'odel^,eno

_$ d'ol&R
_- m'inus
_* zvj'ezdits&
?2 _* zv'ezdits&
_= j'edn&ko
_@ t'r-g'ov&tSko||'a
?2 _@ et

_( 'otvoRen&||z'agr*ad&
_) z'atvoRen&||z'agr*ad&
_' 'apostr*of
_, z'aRez
?2 _, z'apeta
_- ts'r-t'its&
_. t'otSk&
?4 _. t'atSk&
_; t'otSk&z,a*Ez
?2 _; t'atSk&z,apeta
?3 _; t'atSk&z,a*Ez
_< m'an^i||'od
_= j'edn&ko
_> v'etSi||'od
_? 'upitnIk
_& t'r-g'ov&tSko||'i
_[ 'otvoRen&||'ugl&t&
?2 _[ 'otvoRen&||'ugl&st&
_] z'atvoRen&||'ugl&t&
?2 _] z'atvoRen&||'ugl&st&
__ ts'r-t&
_` gr*'avis
_{ 'otvoRen&||v'ititS&st&
_| 'okomits&
?2 _| 'uspR&vn&
_} z'atvoRen&||v'ititS&st&


// Numbers
_0 n'ul&
_1 j'ed&n
_2 dv'a
_2f dv'ije
?2 _2f dv'E
_3 tr*'i
_4 tS'EtIRI
_5 p'Et
_6 S'Est
_7 s'Ed&m
_8 'os&m
_9 d'EvEt
_10 d'EsEt
_11 j'ed&naIst
_12 dv'anaIst
_13 tr*'inaIst
_14 tS'Etr-naIst
_15 p'EtnaIst
_16 S'EsnaIst
_17 s'Ed&mnaIst
_18 'os&mnaIst
_19 d'EvEtnaIst
?2 _11 j'ed&naEst
?2 _12 dv'anaEst
?2 _13 tr*'inaEst
?2 _14 tS'Etr-naEst
?2 _15 p'EtnaEst
?2 _16 S'EsnaEst
?2 _17 s'Ed&mnaEst
?2 _18 'os&mnaEst
?2 _19 d'EvEtnaEst
_2X dv'adEsEt
_3X tr*'idEsEt
_4X tS'Etr-dEsEt
_5X p'EdEsEt
_6X S'EzdEsEt
_7X s'Ed&mdEsEt
_8X 'os&mdEsEt
_9X d'EvEdEsEt
_0C st'o_
?2 _0C st'O_
_2C dvj'est'o
?2 _2C dv'est'a_
?2 _3C tR'ist'a_
?2 _4C tSetR'ist'o_
_6C S'Est'o
_0M1 t'isUtS;&
_0MA1 t'isUtS;e
_1M1 t'isUtS;U
?2 _0M1 h'il^,&d&
?2 _0MA1 h'il^,&de
?2 _1M1 h'il^,&dU
?2 _1MA1 jedn&||hiL&d&
?3 _0M1 h'il^ad&
?3 _0MA1 h'il^ade
?3 _1M1 h'il^adU
_0M2 m'ilijUna
_0MA2 m'ilijUna
_1M2 m'ilijUn
?4 _0M2 m'ilijOna
?4 _0MA2 m'ilijOna
?4 _1M2 m'ilijOn
_0M3 m'iliaRdI
_0MA3 m'iliaRde
_1M3 m'iliaRdU
?2 _0M3 milijArdI
?2 _0MA3 milijArde
?2 _1M3 milijArdU
_0M4 b'ilijUna
_1M4 b'ilijUn
?4 _0M4 b'ilijOna
?4 _1M4 b'ilijOn
_dpt _:z'a*Ez_
_roman r*'imsko

// not Roman numerals
// vi vi // not needed if only all-capitals are spoken as Roman numbers


// Abbreviations
aaa $abbrev
aac $abbrev
ab $only $abbrev $capital
abc $abbrev
abk $only $abbrev
abs $abbrev
acc $only $abbrev
acf $only $abbrev
acfm $abbrev
acg $only $abbrev
acgm $abbrev
acl $only $abbrev
acm $only $abbrev
acw $only $abbrev
add $only $abbrev
adn $only $abbrev
adp $only $abbrev
adsl $abbrev
agm $abbrev
ahk $only $abbrev
aif $only $abbrev
aip $only $abbrev
alg $only $abbrev
alm $only $abbrev
amd $only $abbrev
amf $only $abbrev
amg $only $abbrev
aph $only $abbrev
apj $only $abbrev
apl $only $abbrev
apm $only $abbrev
app $only $abbrev
arg $only $abbrev
arj $only $abbrev
asc $only $abbrev
asf $only $abbrev
asm $only $abbrev
asn $only $abbrev
asp $only $abbrev
asx $only $abbrev
atf $only $abbrev
atp $abbrev
av $only $abbrev
avg $abbrev
avr $only $abbrev
awb $only $abbrev
awt $only $abbrev
brf $abbrev
brl $abbrev
brx $abbrev
cca $abbrev
cda $only $abbrev
cdr $abbrev
cdrw $abbrev
cgi $abbrev
clr $abbrev
cpe $only $abbrev
cpu $only $abbrev
cr $only $abbrev
crt $only $abbrev
ctrl $abbrev
daa $only $abbrev
doo $abbrev
dox $only $abbrev
dqy $abbrev
dsr $only $abbrev
ear $only $abbrev
ecdl $only $abbrev
ecp $only $abbrev
ecs $only $abbrev
elm $only $abbrev
emf $only $abbrev
emh $only $abbrev
eml $only $abbrev
ems $only $abbrev
epf $only $abbrev
eq $only $abbrev
esc $only $abbrev
etd $only $abbrev
eu $only $abbrev
eur $only $abbrev
exc $only $abbrev
faq $abbrev
fbi $abbrev
ffa $only $abbrev
fr $only $abbrev
frm $abbrev
frt $only $abbrev
frx $abbrev
gho $only $abbrev
gr $only $abbrev
grr $abbrev
grrr $abbrev
grp $abbrev
grps $abbrev
grs $only $abbrev
grx $only $abbrev
gui $only $abbrev
hho $abbrev
hr $only $abbrev
hrk $only $abbrev
hrt $only $abbrev $capital
hrv $only $abbrev
hta $only $abbrev
hzzo $abbrev
ibm $abbrev
icc $only $abbrev
icm $only $abbrev
ics $only $abbrev
idb $only $abbrev
idc $only $abbrev
idm $only $abbrev
iff $only $abbrev
ifu $only $abbrev
ilk $only $abbrev
img $only $abbrev
iml $only $abbrev
isdn $abbrev
isl $only $abbrev
isp $only $abbrev
iss $only $abbrev
iq $only $abbrev
iqy $only $abbrev
itw $only $abbrev
itz $only $abbrev
ivf $only $abbrev
jpi $only $abbrev
jrr $abbrev
jse $only $abbrev
lha $abbrev
liq $only $abbrev
maq $only $abbrev
maw $only $abbrev
mda $only $abbrev
mde $only $abbrev
mdi $only $abbrev
mga $only $abbrev
mge $only $abbrev
mgi $only $abbrev
mpa $only $abbrev
mpe $only $abbrev
mpr $only $abbrev
msi $only $abbrev
mup $abbrev $capital
nco $only $abbrev
nfo $only $abbrev
nji $only $abbrev
nr $only $abbrev
nra $only $abbrev
nrb $only $abbrev
nrc $only $abbrev
nre $only $abbrev
nrf $only $abbrev
nrg $abbrev
nrh $only $abbrev
nri $only $abbrev
nrm $only $abbrev
nrq $only $abbrev
nrs $only $abbrev
nru $only $abbrev
nrw $only $abbrev
nsa $only $abbrev
nsi $only $abbrev
nvda $abbrev
obd $only $abbrev
obj $only $abbrev
obt $only $abbrev
obz $only $abbrev
ocr $only $abbrev
ocx $only $abbrev
oem $abbrev
off $only $abbrev
oft $only $abbrev
ofx $only $abbrev
ogc $only $abbrev
ogg $only $abbrev
ogl $only $abbrev
omw $abbrev
oqy $only $abbrev
os $only $abbrev $capital
oss $only $abbrev
otf $only $abbrev
otm $only $abbrev
pda $abbrev
pdi $only $abbrev
pgi $only $abbrev
pho $only $abbrev
pko $only $abbrev
pma $only $abbrev
ppa $only $abbrev
pr $only $abbrev
prf $only $abbrev
prg $only $abbrev
prn $abbrev
prt $only $abbrev
qbr $abbrev
qpr $abbrev
raw $only $abbrev
rb $abbrev
rba $abbrev
rc $only $abbrev
rcc $abbrev
rcd $abbrev
rcs $abbrev
rd $only $abbrev
rds $abbrev
rgb $abbrev
rh $only $abbrev
rk $only $abbrev
rm $only $abbrev
rma $only $abbrev
rme $only $abbrev
rmf $only $abbrev
rmi $only $abbrev
rmt $only $abbrev
rmx $abbrev
rn $only $abbrev
rnk $only $abbrev
rp $only $abbrev
rqy $only $abbrev
rs $abbrev
rss $abbrev
rta $abbrev
rtf $abbrev
rtl $abbrev
rttl $abbrev
rtv $abbrev
rw $abbrev
rwo $only $abbrev
rx $abbrev
sbr $only $abbrev
scr $only $abbrev
sr $only $abbrev
srd $only $abbrev
ssa $only $abbrev
sys $only $abbrev
tpu $only $abbrev
udf $only $abbrev
udl $only $abbrev
udt $abbrev
uhh $abbrev
uif $only $abbrev
uip $only $abbrev
url $only $abbrev
usd $only $abbrev
usr $only $abbrev
uss $only $abbrev
uu $only $abbrev
uue $only $abbrev
uup $only $abbrev
uxd $only $abbrev
vba $only $abbrev
vbe $only $abbrev
vbr $abbrev
vga $abbrev
wax $only $abbrev
wbr $abbrev
wiz $only $abbrev
wma $only $abbrev
wri $only $abbrev
wta $abbrev
xam $only $abbrev
xba $only $abbrev
xiw $only $abbrev
xla $only $abbrev
xpa $only $abbrev
xpi $only $abbrev
xsi $only $abbrev
xxa $only $abbrev
xxe $only $abbrev
xy $abbrev
xyz $abbrev
yu $only $abbrev
zaa $only $abbrev
zoo $only $abbrev

br $dot $abbrev
dr $dot $abbrev
mr $dot $abbrev
mrs $dot $abbrev
itd $dot $abbrev
npr $dot $abbrev
str $only $dot $abbrev

inc $dot
prof $dot
sl $dot
tj $dot
tzv $dot

// Demonstratives
tko $u+
?4 šta $u+
što $u+
koga $pause
čega $pause


// Pronouns


// Prepositions
o $u $brk
u $u $brk
s s_ $brk


// Conjunctions
a $u $pause // and
i $u $pause // and
ali $pause // but
nego $pause // but
ili $u $pause // or




// Auxillary verbs
li $u // question

sam $u // to be, short form
si $u
je $u
smo $u
ste $u
su $u

bio $u // to be, past tense
bila $u
bilo $u
bili $u

nisam $u+ // to be, negative
nisi $u+
nije $u+
nismo $u+
niste $u+
nisu $u+

imam $u+ // to have
imaš $u+
ima $u+
imamo $u+
imate $u+
imaju $u+

nemam $u+ // to have, negative
nemaš $u+
nema $u+
nemamo $u+
nemate $u+
nemaju $u+





// treat as letters if at the end of the clause
a a $atend // letter-a
i i $atend // letter-i
o o $atend // letter-o
s s@ $atend
u u $atend


// Exceptions

ctrl tsontRo:l
control tsontRo:l
docx d'ots||'iks
jpeg j@2||p'eg
macx m'ats||'iks
potx p'ot||'iks
sisx s'is||'iks
start st'aRt
utf u||te||ef

?2 ra R&
?2 re Re
?2 ar &R
?2 er eR

dictsource/hr_rules → dictsource/hbs_rules View File

// translation rules for Croatian

// "hbs" is the ISO 639-3 code for Serbian/Croatian/Bosnian macrolanguage
// This file is UTF-8 encoded // This file is UTF-8 encoded


//The next line gives a voice which is used to find a phoneme table to use to compile this dictionary
//voice=hr

// Conditional rules: // Conditional rules:
// ?1 Croatian // ?1 Croatian
// ?2 Bosnian (Bosna and Hercegovina)
// ?2 Serbian
// ?3 Bosnian (Bosna and Hercegovina)
// ?4 Serbian & Bosnian


.group a .group a
a a a a
e E e E
j) e e j) e e
e (j e e (j e
._) exe %ekse // filetype
_) exe %ekse // filetype
?2 _) exe %eikse // filetype


.group f .group f
f f f f
.group q .group q
q k q k
qu kv qu kv
?2 qu ku


.group r .group r
r R r R
A) r (A R A) r (A R
K) r (A @-*
K) r (A r* // this phoneme expands to [@-*]
rr R rr R
r (_ R r (_ R


$ d'ol&R $ d'ol&R


. totSk& . totSk&
?2 . tatSk&
?4 . tatSk&
. (. _: . (. _:
\.) . \.) .


μ m'i μ m'i
ν n'i ν n'i
ξ ks'i ξ ks'i
ο 'omIk@-*on_
ο 'omIkr*on_


.group 0xcf // Greek letters .group 0xcf // Greek letters


ψ ps'i ψ ps'i
ω 'omeg& ω 'omeg&
ώ 'omeg&||t'onos ώ 'omeg&||t'onos
ό 'omIk@-*on||t'onos
ό 'omIkr*on||t'onos





+ 0
- 336
dictsource/hu_list View File

// Translations for Hungarian words
// This file is UTF-8 encoded.

// Conditional rules:
// ?1 speak "i" as Roman number


// Numbers

_0 nullA
_1 EJ
_2 kEttY:
_3 ha:R2om
_4 ne:J
_5 Yt
_6 hAt
_7 he:t
_8 n^olts
_9 kilEnts
_10 ti:z
_1X tizEn
_20 hu:s
_2X huson
_3X hAR2mints
_4X nEJvEn
_5X YtvEn
_6X hAtvAn
_7X hEtvEn
_8X n^oltsvAn
_9X kilEntsvEn
_0C sa:z
_1C sa:z

_0M1 EzER2
_1M1 EzER2
_2M1 ke:tEzER2
_0M2 millio:
_1M2 millio:
_2M2 ke:tmillio:
_0M3 millia:R2d
_1M3 millia:R2d
_1M3 ke:tmillia:R2d
_0M4 billio:
_1M4 billio:
_2M4 ke:tbillio:
_dpt ||_vEss2Y:_


// Abbreviations
km kilo:me:tER2
mm milime:tER2

a.m An^n^i||m'int $dot
dr doktoR2 $dot
gpu $abbrev
id idY:SEb: $dot
ill illEdvE $dot
ifj ifjAb: $dot
mta $abbrev
pl pe:lda:ul $dot
stb SAtYb:i $dot
u.n u:JnEvEzEt: $dot
ú.n u:JnEvEzEt: $dot
vö v'EZd||_'Yss2E

?1 i EJ $abbrev // option for Roman number


// Articles
a $u // the
az $u
aki $u+ // that

ez $u+ // this


// Pronouns

// If these are only used for emphasis then then don't need $u
// én $u
// te $u
// ő $u
// mi $u
// ti $u
// ők $u
// maga $u
// maguk $u


// Conjunctions
és $u $strend2 // and
de $u+ $pause // but
vagy $u+ $pause // or

mert $u $pause // because
miatt $u // because
bár $u $pause // although
habár $u $pause // although

ha $u $pause // if
noha $u $pause // even thought


// Prepositions etc.


// Negative
nem $alt2 $strend
ne $u+

e $u // "-e" question
e $atend // stressed at end of sentence

// Unstressed adverbs prepositions etc.
néhány $u+
is $u // also

elöl $u // in front of
elől $u
elé $u
előtt $u

mögül $u // behind
mögött $u
mögé $u

kívül $u
után $u // after

alól $u
alá $u
alatt $u // below

felől $u // above
felé $u
fölé $u
felett $u // above
fölött $u

mellől $u // besides
mellé $u
mellett $u

közül $u
közé $u
között $u

an $u // so many persons
as $u
ba $u // into
ban $u // in
be $u
ben $u
ból $u // from inside
ből $u
e $u // in query, his/her
ei $u // his her multiole
en $u
es $u
hez $u
hoz $u // to
höz $u
ig $u // up to
ik $u // -th
nak $u // of, him/her
nek $u
nál $u // by
nél $u
on $u // on
en $u // on
os $u
ra $u // onto
re $u
ról $u // from top of, about
röl $u
ről $u
szer $u
szor $u // times
szór $u
ször $u
tól $u // from
töl $u
től $u
val $u // with
vel $u
án $u // on that day
é $u // his, her
éi $u // his, her multiple
én $u
ón $u
ós $u
ön $u
ös $u

ellen $u // against
elé $u // before
óta $u // since

sok $u // many
kevés $u // few
se $u // neither
sem $u // nor


be $u //into
ki $u // out of
le $u // down
fel $u // up
föl $u // up
meg $u // finish an action
el $u // away
át $u //through
rá $u //onto
ide $u // here
oda $u // there
szét $u //apart
össze $u //connect with
vissza $u //back
ellen $u //against

volna $u // would
részén $u //on ... part of

nélkül $u // without
folytán $u // because of
úgy $u // like that
így $u // like this
egyaránt $u // alike
minden $u // all
részben $u // partly

egyik $u // one of
másik $u // the other


// word pairs

(hogy a) h,oJ,A
(hogy az) h,oJ,Az
(hogy aki) h,oJ,Aki


// Verbs

vagyok $u // to be, present
vagy $u
van $u
vagyunk $u
vagytok $u
vannak $u

voltam $u // to be, past
voltál $u
volt $u
voltunk $u
voltatok $u
voltak $u

leszek $u // to be, future
leszel $u
lesz $u
leszünk $u
lesztek $u
lesznek $u


kell $u+ // should

szabad $u+ // can (allowed)

fog $u+ // going to
fogok $u+
fogsz $u+
fogunk $u+
fogtok $u+
fognak $u+

tud $u+ // can
tudok $u+
tudsz $u+
tudunk $u+
tudtok $u+
tudnak $u+

// Letters
_a A:
a A: $atend // letter "a"
b be:
c tse:
d de:
_e E
f Eff
g ge:
h ha:
j je:
k ka:
l Ell
m Emm
n Enn
p pe:
q ku
r ERR
s S_
s ES $atend
_s ES
v ve:
w duplAve:
x iks
y ipsilon
z ze:

_é e:
é $atend

cs tSe:
dz dze:
dzs dZe:
sz Es
zs Ze:
gy Je:
ty ce:
ly Ellipsilon
ny En^

_. pont
Ft foR2int



// Main Exceptions List
//=====================

nato na:to:




+ 1
- 1
espeak-data/voices/bs View File

name bosnian name bosnian
language bs language bs
phonemes hr phonemes hr
dictionary hr
dictionary hbs
gender male gender male


pitch 81 120 pitch 81 120

+ 8
- 0
espeak-data/voices/grc View File

name greek-ancient
language grc
gender male

stressLength 170 170 190 190 0 0 230 240
dictrules 1
words 1


+ 3
- 0
espeak-data/voices/hr View File

name croatian name croatian
language hr language hr
language hbs
gender male gender male


dictionary hbs

// attributes towards !variant3 // attributes towards !variant3
pitch 81 120 pitch 81 120
formant 0 100 100 100 formant 0 100 100 100

+ 14
- 0
espeak-data/voices/sr View File

name serbian
language sr
gender male
dictionary hbs

// attributes towards !variant3 pitch 80 120
formant 0 100 100 100
formant 1 97 97 100
formant 2 97 97 100
formant 3 97 102 100
formant 4 97 102 100
formant 5 97 102 100

stressAdd 10 10 0 0 0 0 -30 -30

+ 29
- 0
espeak-data/voices/zh View File

name Mandarin test
language zh
gender male
words 1

//for some dialects

//[en]: replace ng with n
//[zh]: 无后鼻音,ng读成n
//replace 0 N n

//[en]: replace rfx consonants
//[zh]: 无卷舌音,r读成l或z,er读成e
//replace 0 ts.h tsh
//replace 0 ts. ts
//replace 0 s. s
//replace 0 i. i[
//replace 0 z. l
//replace 0 z. z
//replace 0 @r @

//[en]: replace beginning n or l
//[zh]: 不分nl,n读成l或l读成n
//replace 2 n l
//replace 2 l n

//[en]: replace beginning w with v
//[zh]: w读成v
//replace 0 w v

+ 79
- 39
phsource/compile_report View File

pl 15 107 pl 15 107
sk 29 125 sk 29 125
cs 6 125 cs 6 125
hr 19 129
mk 3 130
sr 2 129
hr 20 130
mk 3 131
sr 18 130
ru 38 126 ru 38 126
it 17 118 it 17 118
la 21 114 la 21 114
[d;] ro [d;] ro
[d] el [d] el
[d] sw [d] sw
d/d_dnt [d] sr
d/dr [*] base d/dr [*] base
[d] base [d] base
[d[] base [d[] base
[dz;] base [dz;] base
[J] hi [J] hi
[dZ;] mk [dZ;] mk
[dZ] sr
[dZ;] sr
[dZ;] ru [dZ;] ru
dzh/dzh_ [dZ] base dzh/dzh_ [dZ] base
[dZ;] base [dZ;] base
g/xg [g] base g/xg [g] base
[g] cy [g] cy
[g] es [g] es
h/h_ [h] base
[h] fi
[H] hi
[h] hi
[<h>] la
h/h@ [h] base
[h] fi
[H] hi
[h] hi
[th] hi
[h] sr
[<h>] la
h/ha [h] base
[h] fi
[H] hi
[h] hi
[<h>] la
h/he [h] base
[h] fi
[H] hi
[h] hi
[<h>] la
h/hi [h] base
[h] fi
[H] hi
[h] hi
[<h>] la
h/ho [h] base
[H] hi
[h] hi
[<h>] la
h/hu [h] base
[H] hi
[h] hi
[<h>] la
h/hu_fi [h] fi
j2/_j2 [;] base j2/_j2 [;] base
j2/j2@ [(@)] base j2/j2@ [(@)] base
j2/j2a [(a)] base j2/j2a [(a)] base
[(o)] base [(o)] base
[(u)] base [(u)] base
m/_m [m] base m/_m [m] base
[m] sr
[m;] ru [m;] ru
[m;] ro [m;] ro
[m] zh [m] zh
m/m_ [m] base m/m_ [m] base
[m] sr
[m;] ru [m;] ru
[m;] ro [m;] ro
m/m@ [(@)] base m/m@ [(@)] base
m/me [(e)] base m/me [(e)] base
m/mi [(i)] base m/mi [(i)] base
m/mj [m] base m/mj [m] base
[m] sr
[m;] ru [m;] ru
[m;] ro [m;] ro
m/mo [(o)] base m/mo [(o)] base
m/m_sr.wav [m] sr
m/mu [(u)] base m/mu [(u)] base
n^/_n^ [n^] base n^/_n^ [n^] base
[n^] sr
n^/n^_ [n^] base n^/n^_ [n^] base
[n^] sr
n^/n^@ [(@)] base n^/n^@ [(@)] base
n^/n^#_ [n^#] is n^/n^#_ [n^#] is
n/_n [n] base n/_n [n] base
[n] sr
[n;] ro [n;] ro
[n] zh [n] zh
n/n_ [n] base n/n_ [n] base
[n] sr
[n;] ro [n;] ro
[n] zh [n] zh
n/n@ [(@)] base n/n@ [(@)] base
n/nj [n] base n/nj [n] base
[n.] base [n.] base
[n^] base [n^] base
[n] sr
[n^] sr
[n;] ro [n;] ro
n^/nj_sr.wav [N] sr
[n^] sr
nn/_nn [N] base nn/_nn [N] base
[N] en [N] en
[N] sr
[N] zh [N] zh
nn/nn_ [N] base nn/nn_ [N] base
[N] en [N] en
[N] sr
[N] zh [N] zh
nn/nn@ [(@)] base nn/nn@ [(@)] base
nn/nn#_ [N#] is nn/nn#_ [N#] is
nn/nne [(e)] base nn/nne [(e)] base
nn/nni [(i)] base nn/nni [(i)] base
nn/nnj [N] base nn/nnj [N] base
[N] sr
nn/nno [(o)] base nn/nno [(o)] base
nn/nnu [(u)] base nn/nnu [(u)] base
n^/n^o [(o)] base n^/n^o [(o)] base
n/no [(o)] base n/no [(o)] base
n/_nr [n.] base n/_nr [n.] base
n/nr_ [n.] base n/nr_ [n.] base
n/n_sr.wav [N] sr
[n] sr
n^/n^u [(u)] base n^/n^u [(u)] base
n/nu [(u)] base n/nu [(u)] base
r2/_r2 [r-] base r2/_r2 [r-] base
r3/r_n [r/] base r3/r_n [r/] base
[r/] ru [r/] ru
r3/r_o [(o)] base r3/r_o [(o)] base
r3/r_sr.wav [R] sr
[r*] sr
[r-] sr
r3/r_trill [R2] base r3/r_trill [R2] base
[R3] base [R3] base
[r] af [r] af
[r] cy [r] cy
[r] nl [r] nl
[R] sk [R] sk
[R] sr
[r*] sr
[r-] sr
[x] pt [x] pt
r3/r_trill2 [R] base r3/r_trill2 [R] base
[R] hr [R] hr
[(u)] base [(u)] base
ufric/ch [C] base ufric/ch [C] base
[C2] de [C2] de
ufric/ch_sr [h] sr
[x] sr
ufric/f [f] base ufric/f [f] base
[pF] de [pF] de
[f;] ro [f;] ro
[f] zh [f] zh
ufric/f_ [f] base ufric/f_ [f] base
[f;] ro [f;] ro
ufric/h_ [h] base
[h] fi
[H] hi
[h] hi
[<h>] la
ufric/h@ [h] base
[h] fi
[H] hi
[h] hi
[th] hi
[<h>] la
ufric/ha [h] base
[h] fi
[H] hi
[h] hi
[<h>] la
ufric/he [h] base
[h] fi
[H] hi
[h] hi
[<h>] la
ufric/hi [h] base
[h] fi
[H] hi
[h] hi
[<h>] la
ufric/ho [h] base
[H] hi
[h] hi
[<h>] la
ufric/hu [h] base
[H] hi
[h] hi
[<h>] la
ufric/hu_fi [h] fi
ufric/ll [L] base ufric/ll [L] base
[l#] is [l#] is
ufric/s [s] base ufric/s [s] base
ufric/sh_pzd_ [S;] base ufric/sh_pzd_ [S;] base
[Z;] base [Z;] base
ufric/sh_rfx [s.] base ufric/sh_rfx [s.] base
ufric/sh_sr.wav [S] sr
[Z] sr
[dZ] sr
ufric/s_pzd [s;] base ufric/s_pzd [s;] base
[z;] base [z;] base
[s;] ro [s;] ro
[x2] nl [x2] nl
[x2] pt [x2] pt
ufric/x_hr [x] hr ufric/x_hr [x] hr
ufric/x_sr [h] sr
[x] sr
ustop/c [c] base ustop/c [c] base
ustop/k [k] base ustop/k [k] base
[k] en [k] en
[t] el [t] el
ustop/tsh_pzd [tS;] zh ustop/tsh_pzd [tS;] zh
ustop/tsh_pzd_unasp [tS;] zh ustop/tsh_pzd_unasp [tS;] zh
ustop/tsh_sr.wav [tS] sr
ustop/ts_pzd [tS;] base ustop/ts_pzd [tS;] base
[ts;] base [ts;] base
[ch] hi [ch] hi
[c] hu [c] hu
ustop/ts_pzd2 [c] hi ustop/ts_pzd2 [c] hi
[c] hu [c] hu
ustop/t_sr [d] sr
[t] sr
ustop/ts_rfx [ts.] zh ustop/ts_rfx [ts.] zh
ustop/ts_rfx_unasp [ts.] zh ustop/ts_rfx_unasp [ts.] zh
ustop/ts_sr.wav [tS;] sr
[dZ;] sr
ustop/ts_unasp [ts] zh ustop/ts_unasp [ts] zh
ustop/t_unasp [t] zh ustop/t_unasp [t] zh
vdiph/0i [OI] pt vdiph/0i [OI] pt
voc/zh [Z] base voc/zh [Z] base
[z.] base [z.] base
[R^] sk [R^] sk
[Z] sr
[Z;] ro [Z;] ro
voc/zh_ [Z] base voc/zh_ [Z] base
[z.] base [z.] base
[@4] hi [@4] hi
[@] hr [@] hr
vowel/@- [@-] base vowel/@- [@-] base
[r*] hr
vowel/& [a] en_rp vowel/& [a] en_rp
[&] fi [&] fi
[&:] hi [&:] hi
[a:] sk [a:] sk
[A] hr [A] hr
[a] hr [a] hr
[a] sr
[a] it [a] it
[a:] la [a:] la
[a] zh [a] zh

+ 8
- 0
phsource/ph_croatian View File

lengthmod 6 lengthmod 6
endphoneme endphoneme


phoneme r*
vowel nonsyllabic
starttype (@) endtype (@)
formants vowel/@-
unstressed
appendph *
length 50
endphoneme



+ 7
- 7
phsource/ph_finnish View File

vls glt apr vls glt apr
length 100 length 100
lengthmod 3 lengthmod 3
wave ufric/h_%70 // no vowel following
before (@) ufric/h@
before (a) ufric/ha
before (e) ufric/he
before (i) ufric/hi
before (o) ufric/hu_fi%70
before (u) ufric/hu_fi%80
wave h/h_%70 // no vowel following
before (@) h/h@
before (a) h/ha
before (e) h/he
before (i) h/hi
before (o) h/hu_fi%70
before (u) h/hu_fi%80
endphoneme endphoneme



+ 15
- 15
phsource/ph_hindi View File

vls glt apr vls glt apr
length 100 length 100
lengthmod 3 lengthmod 3
wave ufric/h_%70 // no vowel following
before (@) ufric/h@+35
before (a) ufric/ha+35
before (e) ufric/he+35
before (i) ufric/hi+35
before (o) ufric/ho+35
before (u) ufric/hu+35
wave h/h_%70 // no vowel following
before (@) h/h@+35
before (a) h/ha+35
before (e) h/he+35
before (i) h/hi+35
before (o) h/ho+35
before (u) h/hu+35
endphoneme endphoneme


phoneme H // use for full "h" phoneme H // use for full "h"
vls glt apr vls glt apr
length 100 length 100
lengthmod 3 lengthmod 3
wave ufric/h_%70 // no vowel following
before (@) ufric/h@
before (a) ufric/ha
before (e) ufric/he
before (i) ufric/hi
before (o) ufric/ho
before (u) ufric/hu
wave h/h_%70 // no vowel following
before (@) h/h@
before (a) h/ha
before (e) h/he
before (i) h/hi
before (o) h/ho
before (u) h/hu
endphoneme endphoneme




vowelin f1=0 f2=1500 -300 300 f3=-100 80 vowelin f1=0 f2=1500 -300 300 f3=-100 80
vowelout f1=0 f2=1500 -300 250 f3=-100 80 rms=20 vowelout f1=0 f2=1500 -300 250 f3=-100 80 rms=20
lengthmod 2 lengthmod 2
wave ustop/t_hi%50+ufric/h@
wave ustop/t_hi%50+h/h@
switchvoicing d switchvoicing d
endphoneme endphoneme



+ 7
- 7
phsource/ph_latin View File

vls glt apr vls glt apr
length 50 length 50
lengthmod 3 lengthmod 3
wave ufric/h_%70 // no vowel following
before (@) ufric/h@
before (a) ufric/ha
before (e) ufric/he
before (i) ufric/hi
before (o) ufric/ho
before (u) ufric/hu
wave h/h_%70 // no vowel following
before (@) h/h@
before (a) h/ha
before (e) h/he
before (i) h/hi
before (o) h/ho
before (u) h/hu
endphoneme endphoneme





+ 221
- 8
phsource/ph_serbian View File

// include any phonemes which are different from those
// which are inherited from the base language(s)

phoneme a
vowel starttype (a) endtype (a)
length 160
formants vowel/a
reduceto & 4
// ufric/x_sr
// ufric/ch_sr
// ufric/sh_sr
// ustop/t_sr
// ustop/ts_sr
// ustop/tsh_sr
// r3/r_sr
// m/m_sr
// n/n_sr
// n^/nj_sr

// This file inherits phonemes from ph_croatian
// Only phonemes which differ from the inherited phonemes need
// to be included here.


phoneme t // dental variant of /t/
vls dnt stop
vowelin f1=0 f2=1600 -300 300 f3=-100 80
vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20
lengthmod 2
wave ustop/t_sr%50
before _ ustop/t_sr%35
switchvoicing d
endphoneme


phoneme d
vcd alv stop
vowelin f1=2 f2=1700 -300 300 f3=-100 80 amp=16
vowelout f1=2 f2=1700 -300 300 f3=-100 80
formants d/d_dnt+ustop/t_sr%50
before _ d/d_dnt+ustop/t_sr
before r d/d_dnt+ustop/t_sr%50
after _ d/d_dnt+ustop/t_sr
after @ d/d_dnt+ustop/t_sr
lengthmod 5
switchvoicing t
endphoneme


// This is for letter "h" at the beginning of a word
phoneme x
vls vel frc
lengthmod 3
wave ufric/x_sr%70 // no vowel following
before (a) ufric/x_sr
before (e) ufric/ch_sr
before (i) ufric/ch_sr
before (o) ufric/x_sr
before (u) ufric/x_sr
endphoneme


// This is for letter "h" not at the beginning of word
phoneme h
vls vel frc
lengthmod 3
wave ufric/x_sr%70 // no vowel following
before (@) h/h@
before (a) ufric/x_sr
before (e) ufric/ch_sr
before (i) ufric/ch_sr
before (o) ufric/x_sr
before (u) ufric/x_sr
endphoneme



phoneme R
liquid
vowelin f1=0 f2=1600 -300 300 f3=-200 80
vowelout f1=2 f2=1600 -300 300 f3=-200 80 brk
formants r3/r_trill+r3/r_sr.wav%65
after & r3/r_trill+r3/r_sr.wav
after e r3/r_trill+r3/r_sr.wav
after i r3/r_trill+r3/r_sr.wav
after o r3/r_trill+r3/r_sr.wav
after u r3/r_trill+r3/r_sr.wav
after y r3/r_trill+r3/r_sr.wav
trill
lengthmod 6
endphoneme

// This is "r" which doesn't follow a vowel
phoneme r*
liquid
vowelin f1=0 f2=1600 -300 300 f3=-200 80
vowelout f1=2 f2=1600 -300 300 f3=-200 80 brk
formants r3/r_trill+r3/r_sr.wav%65
trill
lengthmod 6
endphoneme

// This is "r" which doesn't have a vowel before or after it
phoneme r-
liquid
vowelin f1=0 f2=1600 -300 300 f3=-200 80
vowelout f1=2 f2=1600 -300 300 f3=-200 80 brk
formants r3/r_trill+r3/r_sr.wav%65
trill
lengthmod 6
endphoneme



phoneme dZ
vcd pla afr sibilant
vowelin f1=2 f2=2300 200 400 f3=100 80
vowelout f1=2 f2=2300 250 300 f3=100 80 brk
formants dzh/dzh+ufric/sh_sr.wav
before _ dzh/dzh+ufric/sh_sr.wav
after _ NULL
after @ dzh/dzh+ufric/sh_sr.wav
lengthmod 5
switchvoicing tS
endphoneme


phoneme dZ;
vcd pla afr sibilant palatal
vowelin f1=2 f2=2700 400 600 f3=300 80 rate len=70
formants dzh/dzh+ustop/ts_sr.wav
before _ dzh/dzh+ustop/ts_sr.wav
after _ NULL
after @ dzh/dzh+ustop/ts_sr.wav
lengthmod 5
switchvoicing tS;
endphoneme


phoneme tS
vls pla afr sibilant
vowelin f1=0 f2=2300 200 400 f3=-100 80
lengthmod 2
wave ustop/tsh_sr.wav
before _ ustop/tsh_sr.wav
switchvoicing dZ
endphoneme


phoneme tS;
vls pal afr sibilant palatal
vowelin f1=0 f2=2700 400 600 f3=300 80 rate len=70
lengthmod 2
wave ustop/ts_sr.wav
before _ ustop/ts_sr.wav
switchvoicing dZ;
endphoneme


phoneme Z
vcd pla frc sibilant
vowelin f1=0 f2=2000 0 300 f3=-200 80
vowelout f1=2 f2=2000 0 300 f3=-200 80 brk
formants voc/zh+ufric/sh_sr.wav
before _ voc/zh+ufric/sh_sr.wav
lengthmod 6
switchvoicing S
endphoneme


phoneme S
vls pla frc sibilant
vowelin f1=0 f2=2100 100 300 f3=-100 80
vowelout f1=0 f2=2100 100 300 f3=-100 80
length 100
lengthmod 3
wave ufric/sh_sr.wav
before _ ufric/sh_sr.wav
switchvoicing Z
endphoneme


phoneme m
vcd blb nasal
vowelout f1=2 f2=1000 -500 -350 f3=-200 80 brk
length 100
lengthmod 4
formants NULL
after _ m/_m+m/m_sr.wav
before _ m/m_+m/m_sr.wav
before (r) m/mj+m/m_sr.wav
endphoneme


phoneme n
vcd alv nasal
vowelout f1=2 f2=1700 -300 250 f3=-100 80 rms=20 brk
length 100
lengthmod 4
formants NULL
after _ n/_n+n/n_sr.wav
after n n/_n+n/n_sr.wav // lengthen [nn]
before _ n/n_+n/n_sr.wav
before (r) n/nj+n/n_sr.wav
endphoneme


phoneme n^
vcd pal nasal palatal
vowelout f1=3 f2=2500 300 500 f3=100 80 len=45 brk rate
length 100
lengthmod 4
formants NULL
after _ n^/_n^+n^/nj_sr.wav
before _ n^/n^_+n^/nj_sr.wav
before (r) n/nj+n^/nj_sr.wav
endphoneme


phoneme N
vcd vel nasal
// vowelout brk
vowelout f1=3 f2=2300 300 400 f3=-200 80 len=40 rms=20 brk
length 100
formants NULL
after _ nn/_nn+n/n_sr.wav
before _ nn/nn_+n/n_sr.wav
before (r) nn/nnj+n^/nj_sr.wav
lengthmod 8 // longer than 'n'
endphoneme endphoneme

+ 10
- 8
phsource/phonemes View File

phonemenumber 21 _^_ // Change language phonemenumber 21 _^_ // Change language
phonemenumber 22 _X1 // a language specific action phonemenumber 22 _X1 // a language specific action
phonemenumber 23 _| // very short pause phonemenumber 23 _| // very short pause
phonemenumber 24 t# // reduced version of [t]
phonemenumber 24 _:: // long pause
phonemenumber 25 t# // reduced version of [t]


// The base phoneme table contains the utility phonemes, the consonants, // The base phoneme table contains the utility phonemes, the consonants,
// and a schwa. The vowels are defined in the language specific phoneme // and a schwa. The vowels are defined in the language specific phoneme
starttype _ endtype _ starttype _ endtype _
length 45 length 45
lengthmod 5 // ?? lengthmod 5 // ??
beforenotvowel _ // change to pause_short
nolink nolink
endphoneme endphoneme


vls glt apr vls glt apr
length 100 length 100
lengthmod 3 lengthmod 3
wave ufric/h_%70 // no vowel following
before (@) ufric/h@
before (a) ufric/ha
before (e) ufric/he
before (i) ufric/hi
before (o) ufric/ho
before (u) ufric/hu
wave h/h_%70 // no vowel following
before (@) h/h@
before (a) h/ha
before (e) h/he
before (i) h/hi
before (o) h/ho
before (u) h/hu
endphoneme endphoneme





BIN
phsource/ufric/ch_sr.wav View File


BIN
phsource/ufric/[email protected] View File


BIN
phsource/ufric/h_.wav View File


BIN
phsource/ufric/ha.wav View File


BIN
phsource/ufric/he.wav View File


BIN
phsource/ufric/hi.wav View File


BIN
phsource/ufric/ho.wav View File


BIN
phsource/ufric/hu.wav View File


BIN
phsource/ufric/hu_fi.wav View File


BIN
phsource/ufric/sh_sr.wav View File


BIN
phsource/ufric/x_sr.wav View File


BIN
phsource/ustop/t_sr.wav View File


BIN
phsource/ustop/ts_sr.wav View File


BIN
phsource/ustop/tsh_sr.wav View File


BIN
phsource/vdiph2/ei_4 View File


BIN
phsource/vdiph2/vowelchart.png View File


BIN
phsource/vowel/u_7 View File


BIN
phsource/vwl_en_us/a View File


+ 35
- 1
src/compiledata.cpp View File

int err; int err;
int errors = 0; int errors = 0;
int dict_count = 0; int dict_count = 0;
FILE *f_in;
FILE *log; FILE *log;
FILE *f_phused; FILE *f_phused;
char dictname[80]; char dictname[80];
char fname_log[sizeof(path_dsource)+20]; char fname_log[sizeof(path_dsource)+20];
char save_voice_name[80]; char save_voice_name[80];
char path[sizeof(path_home)+40]; // path_dsource+20
char buf[200];
char voicename[80];


if(!wxDirExists(path_dictsource)) if(!wxDirExists(path_dictsource))
{ {
dictstr = fname.GetName().BeforeLast('_'); dictstr = fname.GetName().BeforeLast('_');
strcpy(dictname,dictstr.mb_str(wxConvLocal)); strcpy(dictname,dictstr.mb_str(wxConvLocal));
dict_count++; dict_count++;
strcpy(voicename,dictname);

// read the *_rules file to see if a phoneme table is specified though a voice name
sprintf(path,"%s%s_rules",path_dsource,dictname);
if((f_in = fopen(path,"r")) != NULL)
{
unsigned int ix;
unsigned int c;

for(ix=0; ix<20; ix++)
{
if(fgets(buf,sizeof(buf),f_in) == NULL)
break;

if(memcmp(buf,"//voice=",8)==0)
{
for(ix=0; ix<sizeof(voicename); ix++)
{
if(isspace(c = buf[ix+8]))
{
break;
}
voicename[ix] = c;
}
voicename[ix] = 0;
break;
}
}
fclose(f_in);
}


LoadVoice(dictname,0);
LoadVoice(voicename,0);


if((err = CompileDictionary(path_dsource, dictname,log,NULL)) > 0) if((err = CompileDictionary(path_dsource, dictname,log,NULL)) > 0)
{ {

+ 3
- 2
src/compiledict.cpp View File

//#define OPT_FORMAT // format the text and write formatted copy to Log file //#define OPT_FORMAT // format the text and write formatted copy to Log file
//#define OUTPUT_FORMAT //#define OUTPUT_FORMAT


extern void Write4Bytes(FILE *f, int value);
int HashDictionary(const char *string); int HashDictionary(const char *string);


static FILE *f_log = NULL; static FILE *f_log = NULL;
} }
if(replace1 != 0) if(replace1 != 0)
{ {
fwrite(&replace1,1,4,f_out);
fwrite(&replace2,1,4,f_out);
Write4Bytes(f_out,replace1); // write as little-endian
Write4Bytes(f_out,replace2); // if big-endian, reverse the bytes in LoadDictionary()
} }
} }
break; break;

+ 29
- 9
src/dictionary.cpp View File

to[size-1] = 0; to[size-1] = 0;
} }


#ifdef ARCH_BIG
int reverse_word_bytes(int word)
{//=============================
// reverse the order of bytes from little-endian to big-endian
int ix;
int word2 = 0;

for(ix=24; ix>=0; ix -= 8)
{
word2 |= (word >> ix) & 0xff;
word2 = word2 << 8;
}
return(word2);
}
#endif




int LookupMnem(MNEM_TAB *table, char *string) int LookupMnem(MNEM_TAB *table, char *string)
pw += 2; // find the end of the replacement list, each entry is 2 words. pw += 2; // find the end of the replacement list, each entry is 2 words.
} }
p = (char *)(pw+1); p = (char *)(pw+1);

#ifdef ARCH_BIG
pw = (unsigned int *)langopts.replace_chars;
while(*pw != 0)
{
*pw = reverse_word_bytes(*pw);
pw++;
}
#endif
continue; continue;
} }




if((ph = phoneme_tab[*p]) != NULL) if((ph = phoneme_tab[*p]) != NULL)
{ {
int gap = langopts.word_gap & 0xf00;


if(ph->type == phSTRESS) if(ph->type == phSTRESS)
ph = phoneme_tab[p[1]]; ph = phoneme_tab[p[1]];


if(((gap) && (vowel_stress[1] >= 4) && (prev_stress >= 4)) || (langopts.word_gap & 0x8))
#ifdef deleted
int gap = langopts.word_gap & 0x700;
if((gap) && (vowel_stress[1] >= 4) && (prev_stress >= 4))
{ {
/* two primary stresses together, insert a short pause */ /* two primary stresses together, insert a short pause */
if(gap == 0x0300)
*output++ = phonPAUSE;
else
if((gap == 0x0200) && (ph->type == phVOWEL))
*output++ = phonGLOTTALSTOP;
else
*output++ = phonPAUSE_SHORT;
*output++ = pause_phonemes[gap >> 8];
} }
else else
#endif
if((langopts.vowel_pause & 0x30) && (ph->type == phVOWEL)) if((langopts.vowel_pause & 0x30) && (ph->type == phVOWEL))
{ {
// word starts with a vowel // word starts with a vowel

+ 3
- 2
src/phoneme.h View File

#define phonSWITCH 21 #define phonSWITCH 21
#define phonX1 22 // a language specific action #define phonX1 22 // a language specific action
#define phonPAUSE_VSHORT 23 #define phonPAUSE_VSHORT 23
#define phonT_REDUCED 24

#define phonPAUSE_LONG 24
#define phonT_REDUCED 25
extern const unsigned char pause_phonemes[8]; // 0, vshort, short, pause, long, glottalstop


// place of articulation // place of articulation
#define phPLACE 0xf0000 #define phPLACE 0xf0000

+ 7
- 5
src/phonemelist.cpp View File

#include "translate.h" #include "translate.h"




const unsigned char pause_phonemes[8] = {0, phonPAUSE_VSHORT, phonPAUSE_SHORT, phonPAUSE, phonPAUSE_LONG, phonGLOTTALSTOP, phonPAUSE_LONG, phonPAUSE_LONG};




int Translator::ChangePhonemes(PHONEME_LIST2 *phlist, int n_ph, int index, PHONEME_TAB *ph, CHANGEPH *ch) int Translator::ChangePhonemes(PHONEME_LIST2 *phlist, int n_ph, int index, PHONEME_TAB *ph, CHANGEPH *ch)
{ {
int x; int x;


if(langopts.word_gap & 1)
{
insert_ph = phonPAUSE_VSHORT;
}
if(langopts.vowel_pause && (ph->type != phPAUSE) && (next->type == phVOWEL)) if(langopts.vowel_pause && (ph->type != phPAUSE) && (next->type == phVOWEL))
{ {
if(langopts.vowel_pause & 0x04) if(langopts.vowel_pause & 0x04)
insert_ph = phonPAUSE_SHORT; insert_ph = phonPAUSE_SHORT;
} }
} }

if((x = (langopts.word_gap & 0x7)) != 0)
{
insert_ph = pause_phonemes[x];
}
} }


next2 = phoneme_tab[(plist2+2)->phcode]; next2 = phoneme_tab[(plist2+2)->phcode];
} }
} }
else else
if(((langopts.word_gap & 2)==0) || ((plist2+1)->sourceix == 0))
if(((langopts.word_gap & 8)==0) || ((plist2+1)->sourceix == 0))
{ {
// This phoneme can be linked to a following vowel by inserting a linking phoneme // This phoneme can be linked to a following vowel by inserting a linking phoneme
if(next->type == phVOWEL) if(next->type == phVOWEL)

+ 1
- 1
src/setlengths.cpp View File

{ {
len = langopts.length_mods0[next2->ph->length_mod *10+ next->ph->length_mod]; len = langopts.length_mods0[next2->ph->length_mod *10+ next->ph->length_mod];


if((next->newword) && (langopts.word_gap & 0x4))
if((next->newword) && (langopts.word_gap & 0x20))
{ {
// consider as a pause + first phoneme of the next word // consider as a pause + first phoneme of the next word
length_mod = (len + langopts.length_mods0[next->ph->length_mod *10+ 1])/2; length_mod = (len + langopts.length_mods0[next->ph->length_mod *10+ 1])/2;

+ 14
- 4
src/speak.cpp View File







static void init_path(void)
{//========================
static void init_path(char *argv0)
{//===============================
#ifdef PLATFORM_WINDOWS #ifdef PLATFORM_WINDOWS
HKEY RegKey; HKEY RegKey;
unsigned long size; unsigned long size;
unsigned long var_type; unsigned long var_type;
char *p;
char *env; char *env;
unsigned char buf[sizeof(path_home)-12]; unsigned char buf[sizeof(path_home)-12];


{ {
sprintf(path_home,"%s\\espeak-data",env); sprintf(path_home,"%s\\espeak-data",env);
if(GetFileLength(path_home) == -2) if(GetFileLength(path_home) == -2)
return; // an espeak-data directory exists
return; // an espeak-data directory exists in the directory specified by environment variable
}

strcpy(path_home,argv0);
if((p = strrchr(path_home,'\\')) != NULL)
{
strcpy(&p[1],"espeak-data");
if(GetFileLength(path_home) == -2)
return; // an espeak-data directory exists in the same directory as the espeak program
} }


// otherwise, look in the Windows Registry
buf[0] = 0; buf[0] = 0;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Speech\\Voices\\Tokens\\eSpeak", 0, KEY_READ, &RegKey); RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Speech\\Voices\\Tokens\\eSpeak", 0, KEY_READ, &RegKey);
size = sizeof(buf); size = sizeof(buf);
option_multibyte = espeakCHARS_AUTO; // auto option_multibyte = espeakCHARS_AUTO; // auto
f_trans = stdout; f_trans = stdout;


init_path();
init_path(argv[0]);


#ifdef NEED_GETOPT #ifdef NEED_GETOPT
optind = 1; optind = 1;

+ 5
- 1
src/speech.h View File

int LookupMnem(MNEM_TAB *table, char *string); int LookupMnem(MNEM_TAB *table, char *string);




#ifdef PLATFORM_WINDOWS
#define N_PATH_HOME 220
#else
#define N_PATH_HOME 150
#endif


#define N_PATH_HOME 120
extern char path_home[N_PATH_HOME]; // this is the espeak-data directory extern char path_home[N_PATH_HOME]; // this is the espeak-data directory


extern void strncpy0(char *to,const char *from, int size); extern void strncpy0(char *to,const char *from, int size);

+ 1
- 1
src/synthdata.cpp View File

#include "translate.h" #include "translate.h"
#include "wave.h" #include "wave.h"


const char *version_string = "1.29.17 08.Nov.07";
const char *version_string = "1.29.18 10.Nov.07";
const int version_phdata = 0x012901; const int version_phdata = 0x012901;


int option_device_number = -1; int option_device_number = -1;

+ 0
- 10
src/synthesize.cpp View File

DoMarker(espeakEVENT_WORD, (p->sourceix & 0x7ff) + clause_start_char, p->sourceix >> 11, clause_start_word + word_count++); DoMarker(espeakEVENT_WORD, (p->sourceix & 0x7ff) + clause_start_char, p->sourceix >> 11, clause_start_word + word_count++);
} }


if((translator->langopts.word_gap & 1) || (translator->langopts.vowel_pause && (next->type == phVOWEL)))
{
// prevent word merging into next, make it look as though next is a pause
if((next->newword) && (next->type != phPAUSE))
{
// next_pause.ph = phoneme_tab[phonPAUSE];
// next = &next_pause;
}
}

EndAmplitude(); EndAmplitude();


if(p->prepause > 0) if(p->prepause > 0)

+ 0
- 2
src/tr_english.cpp View File

static const short stress_lengths2[8] = {182,140, 220,220, 0,0, 248,275}; static const short stress_lengths2[8] = {182,140, 220,220, 0,0, 248,275};


memcpy(stress_lengths,stress_lengths2,sizeof(stress_lengths)); memcpy(stress_lengths,stress_lengths2,sizeof(stress_lengths));
langopts.vowel_pause = 0;
langopts.stress_rule = 0; langopts.stress_rule = 0;
langopts.word_gap = 0;


langopts.numbers = 0x41 + NUM_ROMAN; langopts.numbers = 0x41 + NUM_ROMAN;
} }

+ 4
- 13
src/tr_languages.cpp View File



// 'diminished' is an unstressed final syllable // 'diminished' is an unstressed final syllable
tr->langopts.stress_flags = 0x6 | 0x10; tr->langopts.stress_flags = 0x6 | 0x10;
tr->langopts.word_gap = 0;
tr->langopts.vowel_pause = 0;
tr->langopts.unstressed_wd1 = 0; tr->langopts.unstressed_wd1 = 0;
tr->langopts.unstressed_wd2 = 2; tr->langopts.unstressed_wd2 = 2;
tr->langopts.param[LOPT_SONORANT_MIN] = 120; // limit the shortening of sonorants before short vowels tr->langopts.param[LOPT_SONORANT_MIN] = 120; // limit the shortening of sonorants before short vowels
static const short stress_lengths_de[8] = {150,130, 190,190, 0, 0, 260,275}; static const short stress_lengths_de[8] = {150,130, 190,190, 0, 0, 260,275};
tr = new Translator(); tr = new Translator();
tr->langopts.stress_rule = 0; tr->langopts.stress_rule = 0;
tr->langopts.word_gap = 0x2; // don't use linking phonemes
tr->langopts.word_gap = 0x8; // don't use linking phonemes
tr->langopts.vowel_pause = 0x30; tr->langopts.vowel_pause = 0x30;
tr->langopts.param[LOPT_PREFIXES] = 1; tr->langopts.param[LOPT_PREFIXES] = 1;
memcpy(tr->stress_lengths,stress_lengths_de,sizeof(tr->stress_lengths)); memcpy(tr->stress_lengths,stress_lengths_de,sizeof(tr->stress_lengths));
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable
tr->langopts.stress_rule = 2; tr->langopts.stress_rule = 2;
tr->langopts.stress_flags = 0x6; // mark unstressed final syllables as diminished tr->langopts.stress_flags = 0x6; // mark unstressed final syllables as diminished
tr->langopts.word_gap = 0;
tr->langopts.vowel_pause = 0;
tr->langopts.unstressed_wd1 = 0; tr->langopts.unstressed_wd1 = 0;
tr->langopts.unstressed_wd2 = 2; tr->langopts.unstressed_wd2 = 2;
tr->langopts.param[LOPT_SONORANT_MIN] = 130; // limit the shortening of sonorants before short vowels tr->langopts.param[LOPT_SONORANT_MIN] = 130; // limit the shortening of sonorants before short vowels
// stress last syllable if it doesn't end in vowel or "s" or "n" // stress last syllable if it doesn't end in vowel or "s" or "n"
// 'diminished' is an unstressed final syllable // 'diminished' is an unstressed final syllable
tr->langopts.stress_flags = 0x200 | 0x6 | 0x10; tr->langopts.stress_flags = 0x200 | 0x6 | 0x10;
tr->langopts.word_gap = 0;
tr->langopts.vowel_pause = 0;
tr->langopts.unstressed_wd1 = 0; tr->langopts.unstressed_wd1 = 0;
tr->langopts.unstressed_wd2 = 2; tr->langopts.unstressed_wd2 = 2;
tr->langopts.param[LOPT_SONORANT_MIN] = 120; // limit the shortening of sonorants before short vowels tr->langopts.param[LOPT_SONORANT_MIN] = 120; // limit the shortening of sonorants before short vowels


tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable
tr->langopts.stress_rule = 2; tr->langopts.stress_rule = 2;
tr->langopts.word_gap = 0;
tr->langopts.vowel_pause = 1; tr->langopts.vowel_pause = 1;
tr->langopts.unstressed_wd1 = 2; tr->langopts.unstressed_wd1 = 2;
tr->langopts.unstressed_wd2 = 2; tr->langopts.unstressed_wd2 = 2;
tr = new Translator(); tr = new Translator();


tr->langopts.stress_rule = 0; tr->langopts.stress_rule = 0;
tr->langopts.word_gap = 0;
tr->langopts.vowel_pause = 1; tr->langopts.vowel_pause = 1;
tr->langopts.param[LOPT_DIERESES] = 1; tr->langopts.param[LOPT_DIERESES] = 1;
tr->langopts.param[LOPT_PREFIXES] = 1; tr->langopts.param[LOPT_PREFIXES] = 1;
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable


tr->langopts.stress_rule = 0; tr->langopts.stress_rule = 0;
tr->langopts.word_gap = 0x4; // length of a final vowel is less dependent on the next consonant
tr->langopts.word_gap = 0x20; // length of a final vowel is less dependent on the next consonant
tr->langopts.vowel_pause = 4; tr->langopts.vowel_pause = 4;
tr->letter_groups[0] = vowels_vi; tr->letter_groups[0] = vowels_vi;
// tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words // tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words
case L('z','h'): case L('z','h'):
case L_zhy: case L_zhy:
{ {
static const short stress_lengths_zh[8] = {220,150, 230,230, 230,0, 230,250};
static const short stress_lengths_zh[8] = {230,150, 230,230, 230,0, 230,250};
static const unsigned char stress_amps_zh[] = {22,16, 22,22, 22,22, 22,22 }; static const unsigned char stress_amps_zh[] = {22,16, 22,22, 22,22, 22,22 };


tr = new Translator; tr = new Translator;
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable
tr->langopts.tone_numbers = 1; // a number after letters indicates a tone number (eg. pinyin or jyutping) tr->langopts.tone_numbers = 1; // a number after letters indicates a tone number (eg. pinyin or jyutping)
tr->langopts.ideographs = 1; tr->langopts.ideographs = 1;
tr->langopts.word_gap = 0x5; // length of a final vowel is less dependent on the next consonant, don't merge consonant with next word
tr->langopts.word_gap = 0x21; // length of a final vowel is less dependent on the next consonant, don't merge consonant with next word
if(name2 == L('z','h')) if(name2 == L('z','h'))
{ {
tr->langopts.textmode = 1; tr->langopts.textmode = 1;


static const short stress_lengths2[8] = {170,140, 220,220, 0, 0, 250,270}; static const short stress_lengths2[8] = {170,140, 220,220, 0, 0, 250,270};
langopts.stress_rule = 0; langopts.stress_rule = 0;
langopts.word_gap = 0;
langopts.vowel_pause = 0x30; langopts.vowel_pause = 0x30;
langopts.param[LOPT_DIERESES] = 1; langopts.param[LOPT_DIERESES] = 1;
langopts.param[LOPT_PREFIXES] = 1; langopts.param[LOPT_PREFIXES] = 1;

+ 3
- 4
src/translate.h View File





typedef struct { typedef struct {
// bit0=don't link consonants with the next word
// bit1=don't add linking phonemes
// bit2=length of a final vowel doesn't depend on the next phoneme
// bits0-2 separate words with (1=pause_vshort, 2=pause_short, 3=pause, 4=pause_long 5=[?] phonemme)
// bit 3=don't use linking phoneme
// bit4=longer pause before STOP, VSTOP,FRIC // bit4=longer pause before STOP, VSTOP,FRIC
// bit8-11=separate words with adjacent stressed syllables with (1=pause, 2=long pausem 3=[?] phoneme)
// bit5=length of a final vowel doesn't depend on the next phoneme
int word_gap; int word_gap;
int vowel_pause; int vowel_pause;
int stress_rule; // 1=first syllable, 2=penultimate, 3=last int stress_rule; // 1=first syllable, 2=penultimate, 3=last

Loading…
Cancel
Save