Browse Source

[1.44.02]

Fix: crash with very long numbers.
Very long nubers ( > 14 digits) now spoken as individual digits.
Fix: bracket was interfering with recognizing last-word in a clause.
Lang=el fix: all words were spoken as individual letters.


git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@252 d46cf337-b52f-0410-862d-fd96e6ae7743
master
jonsd 15 years ago
parent
commit
eb7b132e9a

+ 14
- 1
dictsource/af_list View File

@@ -222,6 +222,7 @@ antwerpen antv&rp@n
avignon _^_FR
babilon babilOn
babilonië babil'o@ni;@
bainskloof beInsklo@f
bangladesj baNglad'ES
barcelona bars@l'o@na
barkly _^_EN
@@ -314,6 +315,7 @@ mpumalanga mpu:mal'aNga
montagu mOnt@ky
moreletapark mOr@l,Etap'ark
moorreesburg mur'e@sbWrx2
mouillepunt mulipWnt
(thaba nchu) tab'A:||ntSu
europa Y@r'o@pa
nigel _^_EN
@@ -363,6 +365,7 @@ wimbledon _^_EN
wolseley wulsli
uganda ug'anda
uruguay urugwaI
wakloof vA:klo@f
zimbabwe zI:mb'ab_wE
zulu zulu // Kwazulu-Natal

@@ -409,6 +412,7 @@ beyers beI@rs
blignault blIx2n@Ut
blomerus blum'e@rWs
blum blum
borodin bOrud'in
botha bo@ta
bouwer b@U@r
braham brA:m
@@ -477,6 +481,7 @@ duncan daNk@-n
(du toit) d@||toI
dustin _^_EN
duvenage dyv@nA:x2@
dvorak d@-v'O:Zak
einstein aInstaI:n
eksteen $1
elana il'A:na
@@ -519,6 +524,7 @@ gordon _^_EN
grange x2rA:nsi
gregory _^_EN
greta gre@ta
grieg gri:g
grové x2ruv'e@
gulliver _^_EN
gustav gustaf
@@ -548,6 +554,7 @@ james _^_EN
jane _^_EN
Jean ZA~n $capital
jesebel je@s@b&l
jessica _^_EN
jimmy _^_EN
joachim juw'A:x2@m
joan _^_EN
@@ -592,6 +599,7 @@ lukas lukas
lulu lulu
mabalêl mabal'&l
mabel _^_EN
macgill m@gjil
mackintosh _^_EN
madelene mad@l'e@n
mbeki mbE:ki
@@ -639,7 +647,6 @@ mouton mut'On
mozart mo@tsart
myburgh meIbWrx2
naomi na_'o@mi
napoleon nap'o@liOn
natasha n%at'aSa
naudé nOd'e@
nefertiti nEf@rt'iti
@@ -675,6 +682,7 @@ renée r@neI
retha re@ta
retief r@tif
rhodes _^_EN
richard _^_EN
riekert rik@rt
robert _^_EN
robin _^_EN
@@ -1131,6 +1139,7 @@ jupiter jupit@r
kafee kaf'e@
kaliefa kal'ifa
kameraderie kam@rA:d@r'i
kapittel kap'It@l
katswink katsv@nk
kaviaar kavi'A:r
kennisvaardig $1
@@ -1255,6 +1264,7 @@ onvermoë $1
oorkom $2
oorle o@rl@
oorleef $2
oorry o@reI
oorsee $2
oorsese $2
oorval $2 $verb
@@ -1282,6 +1292,7 @@ pirouette p@ru:'Et
plaasjaap plA:sjA:p
plasenta plas'Enta
poinsettia pOIns'Etia
pond po~nt
potpourri pOtpur'i
primate $2
profetes prOf@t'Es
@@ -1408,6 +1419,7 @@ voluit fOl_Yyt
voorgee fo@rx2e@
voorkeer $1
voorkom $2 $only
voorlente $1
voormalige fo@rm'A:l@x2@
voornemens fo@rne@m@ns
//voorsien $2
@@ -1428,5 +1440,6 @@ weggewens v&x2@v'E:ns
welaf v&l_af
weleer v&l_'e@r
wentaktiek $1
willens vIl@ns
wysgere veIsx2e@r@


+ 9
- 1
dictsource/af_rules View File

@@ -430,6 +430,7 @@
bonde (C bOnd@ // verbondenheid/bondeldraer/gebondene/saambondelend
boos (aardig b%o@s_ // move default stress: boosaardig/-e/-heid
_) bor (dA@ b%Or // geborduur/bordeel/bordele
borde (r bOrd@ // fix stress and e sound: borderak/-ke
bos (A@ bOs? // bosaap/bosoorlog/bosuil
bo (v bo@ // fix o sound: bovlak/-e and similar
bowen bo@v@n' // bowenal/bowendien
@@ -587,6 +588,7 @@
bene (dy b%e@n@ // fix stress and e sounds: gebenedy/-de
_) ben (ga b%EN // fix stress and n/g sounds: Bengaalse/Bengale
beni (g be@n@ // fix stress and e sound: (swaar/twee/vier)benig, etc.
_) ben (Cien b%En // fix 1st e sound: bensien/benzien and compounds
ber (lyn b%&r // move default stress: Berlyn/-er/-se
ber (serk b@r // fix stress and 1st e sound: berserk/-er
C) be (rsie b'&: //kombersie etc.
@@ -718,6 +720,7 @@
d (d
dd d // gladde/midde/kudde/opskudding
ddh d // Boeddha/boeddhisme
@) d (raam t // fix d sound: draad-/skilpad-/standaardraam and compounds
daad (werk d%A:t // move default stress: daadwerklik/-e
daaren (te d%A:r@n // fix stress and e sound: daarenteen/daarenteë
daarop (v d%A:r%Op // move default stress: daaropvolgend/-e
@@ -727,6 +730,7 @@
dani (gh d'A:n@ // -hoedanigheid/hoedanighede/onderdanigheid
@) dant d'ant // dant takes stress: kommandant/pruimedant
@) dderd (_ d@rt // ontredderd, se rule: dd d
@) d (einde_ t_ // fix d sound: maand-/noord-/suideinde
@) d (eis t_ // fix d sound, insert pause: skuldeiser/grondeise and many compounds
dge (_ _^_EN // words ending in -dge are English: Cambridge/Hambidge...
dia (C d%i%a // diabeet/diafragma/diagnose/dialek/dialoog/diamant
@@ -1756,7 +1760,7 @@
geldi x2&ld@
geld (inC x2&lt_ // fix d sound, pause: geldinkomste/-insamelaar/-insameling, etc.
geld (ing x2&ld // but: ver-/ontgelding and similar
geldjie x2'&lci
geldjie x2&lci // spaargeldjies
_) gelykeni (s x2@l'eIk@n@ // gelykenis/se
gemmer x2'Em@r
ge (ogra x2i //geografie etc.
@@ -2947,12 +2951,14 @@
_) na (latig n%A: // move default stress: nalatig/-e/-heid
names nA:m@s // fix e sound: afnames/opnames
napole (ont n%ap%o@l%i // fix stress and vowel sounds: Napoleonties/-e
napo (leon n%apo@ // fix stress and a sound: Napoleon(magte/-troepe...)
_) na (rC na // nartjie/nardus/narsing
_) na (rk n%a // narkose/narkotiseer/narkoties/narkotika
_) na (skeer n''A: // restore default stress: naskeermiddel/-room
_) na (speur n%A: // fix stress and a sound: (on)naspeurbaar/-lik/-e
_) na (speur_N nA: // but default stress: naspeur
_) na (tC na // many compounds beginning with nat
_) na (trekK nA: // fix stress and a sound: natrek/-ke
na (trium nA: // lengthen a sound: natrium and compounds
na (trosK nA: // lengthen a sound: natros/-se/-sies
na (tuur n%a // natuur and compounds and derivatives
@@ -3053,6 +3059,7 @@
o (terap u // psigo-/fisioterapeut
_) ob (s %Op // obskuur/obskure/obskuriteit/obsessie/obseen
obser (veer %Ops%&r // fix stress, b sound: (ge)observeer(d/-e)
obsti (na %Opst@ // fix stress and i sound: obstinaat/-nate/-naatheid
C) o (dium o@ // fix stress and o sound: jodium/podium/rodium and their compounds
oe u
oe (r u: //long oe sound before r in most cases, but see flg. exceptions:
@@ -3603,6 +3610,7 @@
pa (trA p%a // patrollie/patroon/patrys
patri (@ p%atr%i // move default stress: patriarg/patriot/-te and derivatives
patriar (ga p%atr%i%ar // move default stress: patriargaal/-gale
patro (lle p%atr%u // fix stress and o sound: patrolleer and compounds
paté p%ate@ // fix stress and vowel sounds: (lewer)paté, etc.
pavil (joe p%av@l // fix stress and v sound: paviljoen and compounds
pawil (joe p%av@l // fix stress: pawiljoen and compounds

+ 102
- 36
dictsource/da_list View File

@@ -1,6 +1,4 @@
// PB = Peter Bjarkov - [email protected]

iv $abbrev
// PB = Peter Bjarkov - [email protected]

// This file is UTF8 encoded
// Spelling-to-phoneme words for Danish
@@ -92,15 +90,15 @@ __ b'Onsdrai
// numbers
_0 'nOl
_1 'e:n
_2 t'o:
_3 tR'&:
_2 t'o
_3 tR'e
_4 f'i:V
_5 f'Em
_6 s'Egs
_7 s'yw
_8 'O:d@
_9 n'i:
_10 t'i:
_9 n'i
_10 t'i
_11 'Elv@
_12 t'Vl
_13 tR'&#d@-n // PB & changed to &#
@@ -119,6 +117,7 @@ _7X h&lfj'&rs // PV a changed to &
_8X f'irs
_9X h&lf'Ems // PB a changed to &
_0C h'un*@:D
_1C ed||h'unR@:D // PB addet 'et hundrede'
_0M1 t'u:s@-n
_1M1 ed||t'u:s@-n // PB added 'et' to tusind
_1M2 'e:n||milij'o:n
@@ -130,8 +129,6 @@ _0M4 bilij'o:n3

_0and 3
_dpt _k,Vm&:
_roman d%En


// PB a number followed by dot
// ordinals are followed by a dot in Danish
@@ -178,7 +175,6 @@ mens $pause // while
for fV
fordi fVd'i $pause // because - PB: changed stress
når nVr $pause // while
som $u+ $pause // who (relative)
der d&r $u+ $u // PB changed from [d]A
hvor v'Vr // where
hvorfor vVf'V // why - firan r deleted
@@ -196,7 +192,7 @@ ad &: // PB added 'ad'
ad &D $atend $sentence // PB "Det må ikke skille os ad."
at &: $u // PB changed from [at] to [&:]
hos // at - PB: removed [$u+]
som sVm // which / that - PB: removed [$u+]
som sVm $u // which / that - PB: removed [$u+]

// pronouns
jeg jai $u+ // I
@@ -209,13 +205,13 @@ dét de
vi $u
i _i $u+
mig maj $u // me
dig daj $u
dig daj $u+
dem $u
ham $u
hende $u
sig $u
os Vs $u
jer
os Vs $u+
jer $u
denne $u+ // this
dette $u+
disse $u+ // these
@@ -256,12 +252,12 @@ må $u+ // may
bør $u+ // ought

// letter names
b be:
c se:
d de:
b be
c se
d de
_e e:
f Ef
g ge:
g ge
h hO:
_i i:
j jVD // PB changed from [o]
@@ -270,13 +266,13 @@ l El
m Em
n En
o o
p pe:
q ku:
p pe
q ku
r Er
s es
//t te: mooved to da_rules because of clash with T-shirt
u u?
v ve:
v ve
w d'Vbeltve:
x Eks
y Y?
@@ -286,7 +282,6 @@ z sEt
// PB English words
bacon _^_EN
bondage _^_EN
baseball _^_EN
volleyball _^_EN
dj _^_EN
deadline _^_EN
@@ -2761,6 +2756,52 @@ vanadium $alt
vivarium $alt
vokabularium $alt

// PB nouns with final -um - stress on previous syllable
basilikum $alt
curriculum $alt
dekorum $alt
depositum $alt
desideratum $alt
epicentrum $alt
erratum $alt
faktotum $alt
filosofikum $alt
futurum $alt
gummiarabicum $alt
interregnum $alt
jubilæum $alt
karakteristikum $alt
karbolineum $alt
karborundum $alt
kemoterapeutikum $alt
kompositum $alt
konsum $alt
kuriosum $alt
linoleum $alt
mausoleum $alt
memorandum $alt
momentum $alt
museum $alt
narkotikum $alt
neolitikum $alt
opossum $alt
palæolitikum $alt
perfektum $alt
perikum $alt
periodikum $alt
petitum $alt
petroleum $alt
postscriptum $alt
præteritum $alt
psykofarmakum $alt
pædagogikum $alt
referendum $alt
responsum $alt
supinum $alt
tedeum $alt
ultimatum $alt
vademecum $alt

// PB nouns with final -ie - stress on previous syllable
// unofficial suffix for the "ium" words above
adverbie $alt
@@ -2935,6 +2976,24 @@ rimesse $alt
stewardesse $alt
tristesse $alt

final -ese - stressed e
anamnese $alt
askese $alt
diatese $alt
diurese $alt
eksegese $alt
fylogenese $alt
genese $alt
hypotese $alt
katakrese $alt
kinese $alt
ontogenese $alt
parese $alt
partenogenese $alt
patogenese $alt
protese $alt
syntese $alt

PB final -id - stressed i
adenoid $alt
alkaloid $alt
@@ -5176,7 +5235,7 @@ bivuaker $alt
blamer $alt
blancher $alt
bloker $alt
bogstaver $alt
bogstavere $alt
bombarder $alt
bonbonniere bVNbVNj'E:r $alt
boniter $alt
@@ -5836,7 +5895,7 @@ konvojere $alt
konvoluter $alt
kooperer $alt
koordiner $alt
kopier $alt
kopiere $alt
kopuler $alt
koreografer $alt
korreler $alt
@@ -5872,7 +5931,7 @@ kurer $alt
kursere $alt
kursiver $alt
kurtiser $alt
kuverter $alt
kuvertere $alt
kvadrer $alt
kvaksalverer $alt
kvalificer $alt
@@ -6090,7 +6149,7 @@ patruljere $alt
pausere $alt
pelleter $alt
pendulere $alt
pensioner $alt
pensionere $alt
perciper $alt
perfektioner $alt
perforer $alt
@@ -6108,7 +6167,7 @@ perverter $alt
petitioner $alt
pigmenter $alt
piker $alt
piloter $alt
pilotere $alt
pioner $alt
pipetter $alt
pirater $alt
@@ -6264,7 +6323,7 @@ rekommander $alt
rekompenser $alt
rekonvalescer $alt
rekreer $alt
rekrutter $alt
rekruttere $alt
rektificer $alt
rektoskoper $alt
rekurrer $alt
@@ -6538,7 +6597,7 @@ triumfere $alt
trivialiser $alt
trompeter $alt
trunker $alt
trænere $alt
//trænere $alt
tunneler $alt
turner $alt
tuscher $alt
@@ -6550,7 +6609,6 @@ uniformer $alt
urbaniser $alt
urger $alt
uriner $alt
urpremier $alt
usurper $alt
vacciner $alt
vagabonder $alt
@@ -10385,10 +10443,10 @@ chevrolet sjEvrol'e
saigon sajg3-n // PB Saigon
managua m&n'&:gw&
(deja-vu) deSja||'vy
(il duce) il||d'u:tSj@ // PB Italian faschist
(il duce) il||d'u:tSj@ // PB Italian Fascist

// Abbreviations
pga pOgR'O?n'a? $hasdot // PB short for 'på grund af'
pga pO||gR'O?n||& $hasdot // PB short for 'på grund af'
hr h&r $hasdot // PB hr. - short for mister (Mr) in Danish
mr mestV $hasdot // PB mister
mrs meses $hasdot // PB Mrs.
@@ -10397,14 +10455,21 @@ fx fVegsemp@l // PB "fx" is short for 'for eksempel'
(f.eks) fVegsemp@l $hasdot // PB "f.eks" is short for 'for eksempel'
(dj'en) di:'dje:j3n // *PB dj'en - the dj
(dj'er) di:'dje:jV // *PB dj'er
(tv'et) te:ve:@d // PB
(tv'er) te:ve:V // PB
(cd'en) se:de:3n // PB
(cd'er) se:de:V // PB
emp $abbrev
usa $abbrev
who $abbrev $allcaps // PB World Health Organization
vsop $abbrev
eu $abbrev
co $abbrev $allcaps // PB for CO2-kvote
ngo $abbrev
edb $abbrev
wc v'ese // w is pronounces as v in Danish
(wc'et) v'ese@d
(wc'er) v'eseV
(wc'erne) v'eseVn@
(wc'ernes) v'eseVn@s
it $abbrev
id $abbrev
dna $abbrev
@@ -10476,7 +10541,7 @@ legenderne leg'EndVn3s
(så langt) sV||l'ANt
(så vil) sV||v'el
(så højt) sV||h'Vjt
(så var) sV||v'Ar
(så var) sV||v'Ar
(så længe) sV||l'EN3
(så må) sV||m'O
(så har) sV||har
@@ -10484,4 +10549,5 @@ så sV $sentence $atstart
(virkede så) v'irkeD@||sV
(kom så) kVm||sV
(koste med) kosd@||mED
(en kanoner) en||k&non'er
(en kanoner) en||k&non'er
nå nV $atstart // PB Nå, der er du

+ 364
- 95
dictsource/da_rules
File diff suppressed because it is too large
View File


+ 26
- 15
dictsource/dict_phonemes View File

@@ -1,7 +1,7 @@
Phonemes which are used in the *_rules and *_list files


Dictionary af_dict 2010-05-24
Dictionary af_dict 2010-08-03

& &: 3: @ @- @L @U a
A: aI AI aU A~ E e: e@
@@ -53,7 +53,7 @@ p r s S t T v w
x z


Dictionary da_dict 2010-07-29
Dictionary da_dict 2010-08-11

& &# 0 3 @ @- a A
e E i o O u V W
@@ -65,7 +65,7 @@ l/2 l/3 m n N p r R
s S t T tS v w z


Dictionary hu_dict 2010-08-02
Dictionary hu_dict 2010-08-13

A a: E e: i i: o o:
u u: Y y y: Y:
@@ -100,7 +100,7 @@ n^ p Q r R s s; t
T ts v x z z;


Dictionary en_dict 2010-07-30
Dictionary en_dict 2010-08-11

0 3 3: @ @- @2 @5 @L
a a# A: A@ aa aI aI@ aU
@@ -150,7 +150,7 @@ l m n N p r s S
s2 t v w Z


Dictionary fr_dict 2010-07-30
Dictionary fr_dict 2010-08-06

@ @- a A~ e E E: E~
i I o O O~ u u: w
@@ -200,7 +200,7 @@ q r r. s S s. t T
t. th th. v w x z


Dictionary ta_dict 2010-07-30
Dictionary ta_dict 2010-08-12

a a: aI aU e E e: i
I i: o o: u U u2 u:
@@ -325,7 +325,7 @@ k l m n p R s S
t tS v w x


Dictionary nl_dict 2010-07-27
Dictionary nl_dict 2010-08-13

8 @ @- A a: A~ E e:
EI eU i I O O: o: u
@@ -366,10 +366,10 @@ a E E# E~ i O O~ u
y

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


Dictionary pt_dict 2010-07-03
@@ -611,10 +611,11 @@ Dictionary bg_dict 2010-05-19

@ a e i o u

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


Dictionary nso_dict 2010-05-26
@@ -638,6 +639,16 @@ m n N p r s S t
tS v z Z


Dictionary ak_dict 2010-08-11

a e E i o O u

: b C d dZ dZ; f g
h j k l m n N n^
p R s t tS; v w z
z;


Dictionary az_dict 2010-07-27

& @ a e E i o u

+ 12
- 11
dictsource/en_list View File

@@ -291,16 +291,16 @@ _17 s'Ev@nti:n
?7 _17 s'@v@nti:n
_18 'eIti:n
_19 n'aInti:n
_2X tw'EntI
_3X T'3:tI
?5 _3X T'IRtI
_4X f'o@tI
_5X f'IftI
_6X s'IkstI
_7X s'Ev@ntI
?7 _7X s'@v@ntI
_8X 'eItI
_9X n'aIntI
_2X tw'Enti
_3X T'3:ti
?5 _3X T'IRti
_4X f'o@ti
_5X f'Ifti
_6X s'Iksti
_7X s'Ev@nti
?7 _7X s'@v@nti
_8X 'eIti
_9X n'aInti
_0C h'Vndr@d
_0M1 T'aUz@nd
_0M2 m'Ili@n
@@ -2648,6 +2648,7 @@ Donaghy d0n'hi:
Doris d0rIs
Dorothy dO@r@Ti
Dougall du:g@L
Duncan dVnk@n
Dvina d@vi:n@
Dylan dIl@n
Edith i:dIT
@@ -2784,7 +2785,7 @@ Theresa t@ri:z@
Therese t@ri:z
Thomas t0m@s
Tina ti:n@
Tracy treIsI
Tracy treIsi
Tricia trIS@
Vanessa va#nEs@
Wally w0lI

+ 2
- 2
dictsource/en_rules View File

@@ -253,7 +253,7 @@
accu (ra akjU
accus (A a#kju:z
ace (_ eIs
sp) ac (e eIs
sp) ac (e# eIs
_r) ac (e eIs
_) ac (e a#s
_r) ac (is eIs
@@ -2815,7 +2815,7 @@
ie (ve i:
s) ie (ve I
ie (z i:
_t) ie aI
_t) ie (B aI

.group ig
am) ig (a_ i:g

+ 4
- 2
dictsource/fr_rules View File

@@ -27,7 +27,7 @@
// http://www.fluxnic.net/cicero
//
// Rules are now maintained by Michel Such <[email protected]>
// Last update: 2010-07-30 Michel Such <[email protected]>
// Last update: 2010-08-01 Michel Such <[email protected]>
//

// Letter classes:
@@ -70,6 +70,7 @@

// For english words ending "side"
.L14 be in up ut
.L15 c f g h l s



@@ -153,6 +154,7 @@ _C) aud (_ od // Maud

// group b: English section
back _^_en
_) be (L15A _^_en
board _^_en // board, keyboard
box (_ _^_en // box, inbox, outbox
bugg _^_en // debugger
@@ -1462,7 +1464,7 @@ C) ult (_ _^_en
_C) y (_ _^_en
C) y (e_ _^_en
%C) y (_ _^_en
//@CAC) y (_ _^_en
@CeC) y (_ _^_en
nC) y (_ _^_en
yze _^_en


+ 132
- 7
dictsource/hu_list View File

@@ -156,6 +156,8 @@ _#-ika A
_#-ikai Ai
_#-éhez e:hEz
_#-ához a:hoz
_#-ikének e:nEk
_#-ikának a:nAk
(1-e) elseje $text $alt2
(1-én) elsején $text $alt2
(1-jén) elsején $text $alt2
@@ -233,6 +235,7 @@ _#-ához a:hoz
(00-tól) nul:Anul:a:to:l
(0-n) nul:a:n
(00-n) nul:Anul:a:n
(0-ról) nul:a:R2o:l
(1-gyet) EJ:Et
(1-gyes) EJ:ES
(2-őt) kEt:Y:t
@@ -263,6 +266,7 @@ _#-ához a:hoz
(5-től) Yt:Y:l
(5-től) YtYdike:tY:l $alt2
(5-t) YtYt
(5-ször) Yts:YR2
(6-al) hAt:Al
(6-tal) hAt:Al
(6-tól) hAt:o:l
@@ -282,7 +286,7 @@ _10e tiz
_20e hus
(10-szer) ti:s:ER2
(10-szeres) ti:s:ER2ES
(10-t) tizEt


//special number exceptions
@@ -362,6 +366,9 @@ nyári $alt
téli $alt
végén $alt
elején $alt
folyamán $alt
úton $alt
út $alt

// accent names
_lig ligAtu:R2A
@@ -595,7 +602,7 @@ vel $unstressend

ellen $unstressend // against
//elé $u // before
óta $alt $alt3 // since. Not a bug both $alt $alt3 attribute,
óta $unstressend $alt $alt3 // since. Not a bug both $alt $alt3 attribute,
//because if only a year is present, need spokening normal number, not
//ordinal number. For example:
//2004. óta meaning since 2004 and need spokening normal number.
@@ -865,7 +872,7 @@ látszik $unstressend
látszott $unstressend
látszanak $unstressend
látszotok $unstressend
körül $unstressend $alt3
körül $unstressend $alt $alt3
dőlt $unstressend
vér $unstressend
sót $unstressend
@@ -1052,7 +1059,125 @@ ház $unstressend
állnak $unstressend
idején $unstressend
néznek $unstressend
érezte $unstressend
sért $unstressend
adózású $unstressend
kötelezni $unstressend
lehetőség $unstressend
mondtuk $unstressend
kellene $unstressend
szerte $unstressend
hozta $unstressend
kezdte $unstressend
lökte $unstressend
benne $unstressend
fenn $unstressend
elő $unstressend
javasolták $unstressend
kezdjen $unstressend
látta $unstressend
látták $unstressend
nyomát $unstressend
került $unstressend
várták $unstressend
közbe $unstressend
látott $unstressend
tartanak $unstressend
ejt $unstressend
önnek $unstressend
álljon $unstressend
szálljon $unstressend
üljön $unstressend
jónak $unstressend
hisz $unstressend
elől $unstressend
vágy $unstressend
vitték $unstressend
küldött $unstressend
mentén $unstressend
venni $unstressend
múlik $unstressend
indít $unstressend
nála $unstressend
vizsgálata $unstressend
vizsgálatot $unstressend
indítottak $unstressend
vizsgált $unstressend
javult $unstressend
része $unstressend
írni $unstressend
téren $unstressend
terén $unstressend
menni $unstressend
fogja $unstressend
teszik $unstressend
tömni $unstressend
nyel $unstressend
érzi $unstressend
annak $unstressend
dolog $unstressend
számít $unstressend
aránya $unstressend
helyzetük $unstressend
kifogásolták $unstressend
kifogásolta $unstressend
fogalmaz $unstressend
szóló $unstressend
gyártott $unstressend
írta $unstressend
rúgták $unstressend
esett $unstressend
marad $unstressend
tulajdonú $unstressend
KFT $unstressend
folytatja $unstressend
államokban $unstressend
című $unstressend
senkit $unstressend
abban $unstressend
tegyük $unstressend
szar $unstressend
gond $unstressend
megy $unstressend
ebből $unstressend
abból $unstressend
ebben $unstressend
mondom $unstressend
akar $unstressend
akarsz $unstressend
távra $unstressend
jog $unstressend
járunk $unstressend
szólni $unstressend
ró $unstressend
kérni $unstressend
építést $unstressend
adni $unstressend
részén $unstressend
érni $unstressend
lap $unstressend
írja $unstressend
írtak $unstressend
stressz $unstressend
nyújtózni $unstressend
éve $unstressend
tartott $unstressend
attól $unstressend
utast $unstressend
szint $unstressend
minőségű $unstressend
beszélt $unstressend
kerületben $unstressend
gáz $unstressend
épült $unstressend
építésű $unstressend
együttes $unstressend
távon $unstressend
híg $unstressend
szőr $unstressend
diagnosztizálható $unstressend
működik $unstressend
hat $unstressend
mutatnak $unstressend

// word pairs

@@ -1074,10 +1199,10 @@ vannak $unstressend

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

leszek $u // to be, future
leszel $u
@@ -1296,4 +1421,4 @@ CD-m) cédém
(hu-n) hun
(USA-ban) usában
(USA-ba) usába
(pc-n) pécén

+ 9
- 0
dictsource/hu_rules View File

@@ -45,6 +45,8 @@
tö) bb (féle b
jo) bbr (a bR2
tö) bbr (e bR2
kise) bb (ség b


.group c
c ts
@@ -220,6 +222,7 @@ menetren) dsz (erű d|s
cselé) ds (ég tS:
föl) d (szegély d
stran) d (szezon d
_hol) d (sarló d

.group dz
fogó) dz (kod ts
@@ -332,6 +335,7 @@ ritkasá) g (gyűjt g
se) gg (be g
pro) g (gyak g
se) ggr (e gR2
arcüre) g (gyulladás g

.group gy
gy J
@@ -425,6 +429,7 @@ tizene) gy (en J:
huszone) gy (edik J:
je) gy (ért J
harmince) gy (edik J:
étvá) gy (javít J

.group h
h h
@@ -863,6 +868,7 @@ kitöré) ssz (erű Ss
hirdeté) ssz (erve Ss
páncélo) ssz Ss
hajtá) ssz (erű Ss
sorva) ssz (ák s:

.group sz
sz s
@@ -1114,6 +1120,9 @@ művele) t (sáv t
ö) t (jegyű t
ha) t (jegyű t
hé) t (jegyű t
zár) t (sorú t
skó) t (juhász t
szerete) t (szolgálat t

.group ts
ts (_S2 tS //general rule with word end of ts letters

+ 214
- 1
dictsource/nl_list View File

@@ -317,10 +317,12 @@ anker $alt
badder $alt
bagger $alt
baker $alt
baster $alt
beender $alt
belemmer $alt
beter $alt
bibber $alt
bitter $alt
bladder $alt
blader $alt
blaker $alt
@@ -330,84 +332,296 @@ blunder $alt
bolder $alt
bolster $alt
boter $alt
broeder $alt
buffer $alt
bulder $alt
bulldozer $alt
bumper $alt
bunker $alt
charter $alt
cijfer $alt
cluster $alt
computer kOmpj'ut@r $alt // ?? "$2 $alt" doesn't work
consuminder $alt
counter $alt
cover k8v@r $alt
dabber $alt
daver $alt
deemstar $alt
dender $alt
dobber $alt
dokter $alt
donder $alt
donker $alt
dotter $alt
duister $alt
dwater $alt
eergister $alt
eier $alt
emmer $alt
ender $alt
enter $alt
erger $alt
etter $alt
filter $alt
fladder $alt
flakker $alt
flikker $alt
flipper $alt
flodder $alt
flonker $alt
flotter $alt
fluister $alt
foeter $alt
folder $alt
folter $alt
gabber $alt
gader $alt
geester $alt
gemoeder $alt
gibber $alt
gister $alt
glibber $alt
glimmer $alt
glinster $alt
glitter $alt
glunder $alt
halter $alt
hamer $alt
hamster $alt
haper $alt
helder $alt
herinner $alt
herover $alt
hinder $alt
hoender $alt
honger $alt
huiver $alt
hunker $alt
ijver $alt
ijzer $alt
imker $alt
inburger $alt
inkader $alt
jakker $alt
jammer $alt
joeker $alt
kader $alt
kaffer $alt
kalefater $alt
kalver $alt
kamfer $alt
kanker $alt
kaper $alt
kaver $alt
keilder $alt
kenter $alt
keper $alt
kerker $alt
ketter $alt
keuter $alt
kicker $alt
kieper $alt
kinder $alt
kladder $alt
klapper $alt
klater $alt
klauter $alt
klaver $alt
kledder $alt
klepper $alt
kletter $alt
kleuter $alt
klieder $alt
klinker $alt
klodder $alt
kluister $alt
knapper $alt
knetter $alt
kneuter $alt
knikker $alt
knipper $alt
knisper $alt
knister $alt
koekeloer $alt
koester $alt
koeter $alt
koffer $alt
koker $alt
kolder $alt
kommer $alt
koper $alt
kuier $alt
kwetter $alt
labber $alt
lager $alt
lammer $alt
laser $alt
laster $alt
lauwer $alt
lazer $alt
lebber $alt
leder $alt // gelederen
leger $alt
lekker $alt
lemmer $alt
lepper $alt
ler $alt
letter $alt
leuter $alt
lever $alt
lieder $alt
lobber $alt
lodder $alt
lommer $alt
louter $alt
lubber $alt
luier $alt
luimer $alt
luister $alt
mager $alt
marmer $alt
meander $alt
meerder $alt
meester $alt
meier $alt
mekker $alt
mieter $alt
mijmer $alt
millimeter $alt
minder $alt
modder $alt
moeder $alt
moker $alt
monster $alt
mopper $alt
nader $alt
neder $alt
nuchter $alt
nummer $alt
ober $alt
offer $alt
onder $alt
orber $alt
ouder $alt
over $alt
palaver $alt
pantser $alt
pauper $alt
peiger $alt
peper $alt
peuter $alt
pieker $alt
pieter $alt
pinkster $alt
pleister $alt
pletter $alt
ploeter $alt
plunder $alt
poeder $alt
poeier $alt
poker $alt
polder $alt
puber $alt
pulver $alt
purper $alt
rader $alt
raster $alt
redder $alt
ridder $alt
rooster $alt
rubber $alt
ruiter $alt
runder $alt
sakker $alt
schamper $alt
schater $alt
schemer $alt
schetter $alt
schilder $alt
schipper $alt
schitter $alt
schouder $alt
schutter $alt
sidder $alt
sjacher $alt
skeeler $alt
skelter $alt
slechter $alt
slenter $alt
slidder $alt
slinger $alt
slobber $alt
slodder $alt
sloeber $alt
sluier $alt
sluimer $alt
snater $alt
snipper $alt
snotter $alt
snuister $alt
sober $alt
sodemieter $alt
somber $alt
spetter $alt
spijker $alt
splinter $alt
sputter $alt
steiger $alt
stekker $alt
stotter $alt
stuiter $alt
stumper $alt
sudder $alt
suiker $alt
supporter $alt
tater $alt
teder $alt
teister $alt
temper $alt
tetter $alt
teuter $alt
timmer $alt
tover $alt
treiter $alt
trompetter $alt
tuier $alt
tutter $alt
twitter $alt
uier $alt
vinger $alt
vlieger $alt
vlinder $alt
vlotter $alt
voeder $alt
volker $alt
vorder $alt
waaier $alt
wakker $alt
wapper $alt
water $alt
wedijver $alt
wegwijzer $alt
wester $alt
wijder $alt
wilder $alt
winter $alt
wipper $alt
woeker $alt
wonder $alt
zeker $alt
zever $alt
zilver $alt
zinder $alt
zolder $alt
zomer $alt
zonder $alt
zuiver $alt
zwabber $alt
zwakker $alt
zwanger $alt


// words where -age is [a:Q@] not French ['a:Z@]
drage $alt
hedentendage $alt
@@ -438,7 +652,6 @@ vrijage vre:j'a:Z@
aangrijpend $2
bourgondier burx'o:ndi:@r
circuit sIrku'i
computer $2
contour ko:nt'ur
ingewikkeld $3
ingrijpend $2

+ 16
- 1
dictsource/nl_rules View File

@@ -116,6 +116,7 @@

_) ge (@P2 Q@
_) gee Qe:
gener (aal Q,e:n@r
gelijk Q@lEIk
_) geu QY:
_) ge (ven Qe:
@@ -147,7 +148,8 @@
ie (rd_ 'i
@) ig (_S2d @x
@) ige (_ @Q@
_) in (gP2 'In
_) in (C@P2 'In
// _) in (gP2 'In
io (nage iO
@) isch (_ =is
@) ische (_ =is@
@@ -178,6 +180,8 @@
m m
mm m

_) mee (@P3 m'e:


.group n
n n
@@ -185,6 +189,8 @@
ng N
nj n^

_) na (C@@P2 n'a:


.group o
o o:
@@ -200,6 +206,9 @@
ou (rage u

telef) oo (n 'o:
_) op (@@P2 'Op
_) open (@P4 'o:p@n
_) over (@P4 'o:v@r


.group on
@@ -226,6 +235,7 @@
_) onge (val OnQ@



.group p
p p
pp p
@@ -314,6 +324,8 @@
uw yU
uw (_ yU

_) uit (@P3 'Wyt


.group v
v v
@@ -321,6 +333,7 @@
_) ver (@P3 v@r
_) ver (sie_ vEr
_) ver (der_ vEr
_) voort (@P5 v'O:rt


.group w
@@ -328,6 +341,8 @@
w (X w
w (CK w

_) weg (@P3 v#'Ex


.group x
x ks

+ 0
- 1
dictsource/ta_list View File

@@ -186,7 +186,6 @@ tamil தமிழ் $text

// exceptions
பாபு $alt // initial ப as [b]
பகவதி $alt
பானம் $alt
பாணம் $alt
பாறம் $alt

+ 19
- 5
dictsource/ta_rules View File

@@ -192,6 +192,7 @@
//sort
அலை) க (டல kV
சமையல்) க (ட் kV
_கால) க (ட்ட kV
_கல்) க (ண்ட kV
_நற்) க (தி gV
வீண்) க (தை kV
@@ -215,6 +216,7 @@
வீண்) க (ஷ்ட kV
ம) க (ா H
_தாலு) க (ா k
_வலை) க (ாப் k
தொல்) க (ாப்பி k
மூல) க (ாரண k
அந்திம) க (ால k
@@ -281,8 +283,6 @@
வி) க்ட (ோரியா kt. // victoria
வி) க (்ரம k
ஆ) க (்ரோஷ k
_கால) க (ட்ட kV
_வலை) க (ாப் k
//endsort


@@ -346,6 +346,7 @@
சீ (னிவாச sri:
_) ச (ீன்_ s
_ஈ) சு s
_) சு (லோக s
கே) சு (வ s
மே) சு (வ s
வி) சு (வ s
@@ -571,6 +572,7 @@
_) த (ுரதிர்ஷ்ட d
_) த (ுராசை d
_) த (ுரியோதனன d
_) த (ுரியோதனா d
_) த (ுருவங் d
_) த (ுருவத் d
_) த (ுரை d
@@ -622,6 +624,7 @@
_கீழ்) த (ட்ட tV
_மேல்) த (ட்ட tV
முட்டாள்) த (ன tV
_கௌ) த (மி tV
_கீ) த (ா t
_சீ) த (ா t
_ல) த (ா t
@@ -688,7 +691,6 @@ _பார்வ) த (ி t
ச) த (்ரு t
த) த (்ரூப t
பா) த (்ரூம t
_கௌ) த (மி tV
//endsort


@@ -733,6 +735,7 @@ _பார்வ) த (ி t

//sort

_) ப (கவதி bV
_) ப (கவான bV
_) ப (காசுர bV
_) ப (கிரங்க bV
@@ -754,6 +757,7 @@ _பார்வ) த (ி t
_) ப (த்திரமா bV
_) ப (ந்தங்கள bV
_) ப (ந்தத் bV
_) ப (ந்தப் bV
_) ப (ந்தம bV
_) ப (ந்துக்கள bV
_) ப (ந்துவ bV
@@ -803,6 +807,7 @@ _பார்வ) த (ி t
_) ப (ாகத b
_) ப (ாகம b
_) ப (ாக்கிய b
_) பாக்த (ாத ba:gd
_) ப (ாங்க் b
_) ப (ாசு b
_) ப (ாசுர p
@@ -954,6 +959,7 @@ _முகத்தின்_) ப (ாவ b
வட) ப (குதி pV
தென்) ப (குதி pV
ப (க்கK pV
பரம) ப (க்த bV
க) ப (ட bV
கரம்) ப (ட pV
ப (டி pV
@@ -1033,6 +1039,8 @@ _முகத்தின்_) ப (ாவ b
வீண்) ப (ேச்ச p
ப (ேரில்_ p
ப (ேர்_ p
வன்) ப (ொருள் p
மென்) ப (ொருள் p
வீண்) ப (ொழுத p
ப (ோக_ p
ப (ோகவில்லை_ p
@@ -1070,8 +1078,6 @@ _முகத்தின்_) ப (ாவ b
மன) ப்பி (ரமை bb
துர்) ப்ப (ோதனை bb
கம்) ப்யூட (ர pjU:t.V
மென்) ப (ொருள் p
வன்) ப (ொருள் p
//endsort

// If ப+ appearing in the middle of a word is followed by ட+
@@ -1315,6 +1321,7 @@ _முகத்தின்_) ப (ாவ b
.group இ
//sort
இ i
_) இ (யேச
_) இ (ரகசிய // silent
_) இ (ரசாயன
_) இ (ரத்த
@@ -1355,10 +1362,14 @@ _முகத்தின்_) ப (ாவ b
ஐ aI

ஒ o
ஒள (வை aU // bad scanning
ஒள (ஷத aU
ஒள (டத aU

ஓ o:

ஔ aU
ஔி ol.i // for bad scanning of books


// combining vowels
@@ -1375,6 +1386,8 @@ _முகத்தின்_) ப (ாவ b
ூ u:

ெ e
_ம) ெள (ன aU // bad scanning
_ம) ெள (ஸ aU // bad scanning

ே e:

@@ -1385,6 +1398,7 @@ _முகத்தின்_) ப (ாவ b
ோ o:

ௌ aU
_த) ௌி el.i // for bad scanning


் // virama

+ 1
- 1
docs/add_language.html View File

@@ -14,7 +14,7 @@ awareness of its features, patience and attention to detail. Wikipedia is a goo
<a href="http://en.wikipedia.org/wiki/Vowel">http://en.wikipedia.org/wiki/Vowel</a>
<P>
In many cases it should be fairly easy to add a rough implementation of a new language, hopefully
enough to be intelligible.<br>
enough to be intelligible.<p>
After that it's a gradual process of improvement to:
<ul>
<li>Make the spelling-to-phoneme translation rules more accurate, including the position of stressed

+ 15
- 7
docs/commands.html View File

@@ -89,8 +89,8 @@ If neither -f nor --stdin is given, then the text input is taken from "text word
<p>
<dt>
<strong>-s &lt;integer&gt;</strong><br>
<dd>Sets the speed in words-per-minute (approximate values for the default English voice, others may differ slightly). The default value is 170. I generally use a faster speed
of 190. Range 80 to 390. Larger value are rounded down to the maximum.
<dd>Sets the speed in words-per-minute (approximate values for the default English voice, others may differ slightly). The default value is 175. I generally use a faster speed
of 200. Range 80 to 450. Larger value are rounded down to the maximum.
<p>
<dt>
<strong>-b &lt;integer&gt;</strong><br>
@@ -128,7 +128,7 @@ others.
<p>
<dt>
<strong>-q</strong><br><dd>
Quiet. No sound is generated. This may be useful with the -x option.
Quiet. No sound is generated. This may be useful with options such as -x and --pho.
<p>
<dt>
<strong>-v &lt;voice filename&gt;[+&lt;variant&gt;]</strong><br>
@@ -152,7 +152,7 @@ Some languages may need additional dictionary data, see <a href="languages.html"
<dt>
<strong>-x</strong><br>
<dd>The phoneme mnemonics, into which the input text is translated, are
shown on stdout.
written to stdout.
<p>
<dt>
<strong>-X</strong><br>
@@ -174,19 +174,27 @@ Compile the pronunciation rule and dictionary lookup data from their source file
<dd>
The same as <strong>--compile</strong>, but source line numbers from the *_rules file are included. These are included in the rules trace when the <strong>-X</strong> option is used.
<p>
<dt><strong>--ipa</strong><br>
<dd>
Writes phonemes to stdout, using the International Phonetic Alphabet (IPA).
<p>
<dt><strong>--path [="&lt;directory path&gt;"]</strong><br>
<dd>
Specifies the directory which contains the espeak-data directory.
<p>
<dt><strong>--pho</strong><br>
<dd>
When used with an mbrola voice (eg. -v mb-en1), it writes mbrola phoneme data (.pho file format) to stdout. This includes the mbrola phoneme names with duration and pitch information, in a form which is suitable as input to this mbrola voice. The --phonout option can be used to write this data to a file.
<p>
<dt><strong>--phonout [="&lt;filename&gt;"]</strong><br>
<dd>
If specified, mbrola phoneme data, and also the output from -x and -X options is written to this file, rather than stdout.
If specified, the output from -x, -X, --ipa, and --pho options is written to this file, rather than to stdout.
<p>
<dt><strong>--punct [="&lt;characters&gt;"]</strong><br>
<dd>
Speaks the names of punctuation characters when they are encountered in the text. If &lt;characters&gt; are given, then only those listed punctuation characters are spoken, eg. <code> --punct=".,;?"</code>
<p>
<dt><strong>--split [="&lt;minutes&gt;"]</strong><br>
<dt><strong>--split [=&lt;minutes&gt;]</strong><br>
<dd>
Used with <strong>-w</strong>, it starts a new WAV file every <code>&lt;minutes&gt;</code> minutes, at the next sentence boundary.
<p>
@@ -195,7 +203,7 @@ Used with <strong>-w</strong>, it starts a new WAV file every <code>&lt;minutes&
<dd>Lists the available voices.<br>
If =&lt;language code&gt; is present then only those voices which are suitable for that language are listed.<br>
<code>--voices=mbrola</code> lists the voices which use mbrola diphone voices. These are not included in the default <code>--voices</code> list<br>
<code>--voices=variant</code> lists the voice variants (voice modifiers).<br>
<code>--voices=variant</code> lists the available voice variants (voice modifiers).<br>

</dl>
<p>&nbsp;<hr>

+ 19
- 7
docs/dictionary.html View File

@@ -251,14 +251,18 @@ Note, that matching characters in the &lt;pre&gt; part do not affect the syllabl
<td><strong>N</strong></td>
<td>Only use this rule if the word is not a retranslation after removing a suffix.</td>
</tr>
<tr>
<td><strong>T</strong></td>
<td>Only use this rule if the word in found in the *_list file with the <b>$alt</b> attribute.</td>
</tr>
<tr>
<td><strong>#</strong></td>
<td>(English specific) change the next "e" into a special character "E"</td>
</tr>
<tr>
<td><strong>$w_alt<br>$w_alt2<br>$w_alt3</strong></td>
<td>Only use this rule if the word is found in the *_list file with the <b>$alt</b>, <b>$alt2</b> or <b>$alt3</b> attribute respectively.</td>
</tr>
<tr>
<td><strong>$p_alt<br>$p_alt2<br>$p_alt3</strong></td>
<td>Only use this rule if the part-word, up to and including the pre and match parts of this rule, is found in the *_list file with the <b>$alt</b>, <b>$alt2</b> or <b>$alt3</b> attribute respectively.</td>
</tr>
</tbody>
</table>
</ul>
@@ -275,7 +279,7 @@ eg.
</pre>
S and P must be at the end of the &lt;post&gt; string.
<p>
S&lt;number&gt; may be followed by additonal letters (eg. S2ei ). Some of these are probably specific to English, but similar functions could be used for other languages.
S&lt;number&gt; may be followed by additonal letters (eg. S2ei ). Some of these are probably specific to English, but similar functions could be made for other languages.

<ul><table>
<tbody>
@@ -488,9 +492,13 @@ A word (or group of words) may be given one or more flags, either instead of, or
<td>$hasdot</td>
<td>Use this pronunciation if the word is followed by a dot. (This attribute also implies $dot).</td>
</tr>
<tr>
<td>$sentence</td>
<td>The rule only applies if the clause includes end-of-sentence (i.e. it is not terminated by a comma). For example, "$atend $sentence" means that the rule only applies at the end of a sentence.</td>
</tr>
<tr>
<td>$abbrev</td>
<td>This has two meanings.<br> 1. If there is no phoneme string: Speak the word as individual letters, even if it contains a vowel (eg. "abc" should be spoken as "a" "b" "c").<br>2. If there is a phoneme string: This word is capitalized because it is an abbreviation and capitalization does indicate emphasis (if the "emphasize all-caps" is on).</td>
<td>This has two meanings.<br> 1. If there is no phoneme string: Speak the word as individual letters, even if it contains a vowel (eg. "abc" should be spoken as "a" "b" "c").<br>2. If there is a phoneme string: This word is capitalized because it is an abbreviation and capitalization does not indicate emphasis (if the "emphasize all-caps" is on).</td>
</tr>
<tr>
<td>&nbsp;</td>
@@ -499,9 +507,13 @@ A word (or group of words) may be given one or more flags, either instead of, or
<tr>
<td>$accent</td>
<td>Used for the pronunciation of a single alphabetic character. The character name is spoken as the base-letter name plus the accent (diacritic) name. eg. It can be used to specify that "&#xe2;" is spoken as "a" "circumflex".</td>
</tr>
<tr>
<td>$combine</td>
<td>This word is treated as though it is combined with the following word with a hyphen. This may be subject to fuither conditions for certain languages.</td>
</tr>
<tr>
<td>$alt &nbsp; $alt2</td>
<td>$alt &nbsp; $alt2 &nbsp; $alt3</td>
<td>These are language specific. Their use should be described in the language's **_list file</td>
</tr>
<tr>

+ 3
- 1
docs/docindex.html View File

@@ -41,9 +41,11 @@ eSpeak can be used as a front-end for Mbrola diphone voices.
<h3><A href="add_language.html">Adding a Language</A></h3>
How to add or improve a language.
<h3><A href="phonemes.html">Phonemes</A></h3>
The list of phoneme mnemonics, for use in the Pronunciation Dictionary.
The list of phoneme mnemonics for English, for use in the Pronunciation Dictionary.
<h3><A href="phontab.html">Phoneme Tables</A></h3>
The tables of the phonemes used by each language, with their properties and sound production.
<h3><A href="intonation.html">Intonation</A></h3>
Different intonation "tunes" may be defined for different languages for clauses which end in full-stop, comma, question-mark, and exclamation-mark.
<h3><A href="speak_lib.h">eSpeak Libary API</A></h3>
API definition and header file for a shared library version of eSpeak.
<h3><A href="ssml.html">Markup tags</A></h3>

+ 101
- 0
docs/intonation.html View File

@@ -0,0 +1,101 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>
<title>eSpeak: Phoneme tables</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<A href="docindex.html">Back</A>
<hr>
<h2>INTONATION</h2>
<hr>
In eSpeak's standard intonation model, a "tune" is applied to each clause depending on its punctuation. Other intonation models may be used for some languages, such as tone languages.
<p>
Named tunes are defined in the text file: <b><code>phsource/intonation</code></b>. This file must be compiled for use by eSpeak by using the espeakedit program, using the menu option: <b><code>Compile -> Compile intonation data</code></b>.
<h3>Clauses</h3>
The tunes which are used for a language can be specified by using a <b><code>tunes</code></b> statement in a voice file in <b><code>espeak-data/voices</code></b>. eg:
<p>
<code>tunes &nbsp; s1 &nbsp;c1 &nbsp;q1 &nbsp;e1</code>
<p>
It's parameters are four tune names which are used for clauses which end in:
<ol>
<li>Full-stop.
<li>Comma.
<li>Question mark.
<li>Exclamation mark.
</ol>
<p>
A clause consists of the following parts:
<ul>
<li>Pre-head.<br>These are any unstressed syllables before the first stressed syllable.
<p>
<li>Head.<br>This is the part from the first stressed syllable up to the last syllable before the nucleus.
<p>
<li>Nucleus.<br>This is stressed syllable which is the focus of the clause. eSpeak chooses the last stressed syllable of the clause.
<p>
<li>Tail.<br>These are the syllables after the nucleus.
</ul>
<p>
<h3>Tune definitions</h3>
Here is an example tune definition from the file <b><code>phsource/intonation</code></b>.
<p>
<pre>
tune s1
prehead 46 57
headenv fall 16
head 4 80 55 -8 -5
headextend 0 63 38 13 0
nucleus fall 70 18 24 12
nucleus0 fall 64 8
endtune
</pre>
<p>
It contains:
<dl>
<dt><strong>tune</strong> &lt;tune name&gt;
<dd>
Starts the definition of a tune. The <b><code>tune name</code></b> can be used in a <b><code>tunes</code></b> statements in voice files.
<p>
<dt><strong>endtune</strong> &lt;tune name&gt;
<dd>
Ends the definition of a tune.
<p>
<dt><strong>prehead</strong> &lt;start pitch&gt; &lt;end pitch&gt;
<dd>
Gives the pitch path for any series of unstressed syllables before the first stressed syllable.
<p>
<dt><strong>headenv</strong> &lt;envelope&gt; &lt;height&gt;
<dd>
Gives the pitch envelope which is used for stressed syllables in the head (before the nucleus), including <b><code>onset</code></b> and <b><code>headlast</code></b> syllables if these are specified. <b><code>height</code></b> gives a pitch range for the envelope.
<p>
<dt><strong>head</strong> &lt;steps&gt; &lt;start pitch&gt; &lt;end pitch&gt; &lt;unstressed start&gt; &lt;unstressed end&gt;
<dd>
<b><code>start pitch</code></b> and <b><code>end pitch</code></b> give a pitch path for the stressed syllables of the head. <b><code>steps</code></b> is the maximum number of stressed syllables for which this applies. If there are additional stressed syllables, then the <b><code>headextend</code></b> statement is used for them.<p>
<b><code>unstressed start</code></b> and <b><code>unstressed end</code></b> give a pitch path for unstressed syllables between two stressed syllables. Their values are relative to the pitch of the previous stressed syllable. Values are usually negative, meaning that the unstressed syllables have lower pitch than the previous stressed syllable.

<p>
<dt><strong>headextend</strong> &lt;percentage list&gt;
<dd>
If the head contains more stressed syllables than is specified by <b><code>steps</code></b>, then <b><code>percentage list</code></b> is used. It contains up to 8 numbers which are used repeatedly for the additional stressed syllables. A value of 0 corresponds to the lower the <b><code>start pitch</code></b> and <b><code>end pitch</code></b> values of the <b><code>head</code></b> statement. 100 corresponds to the higher value. Negative values and values greater than 100 are allowed.
<p>
<dt><strong>nucleus</strong> &lt;envelope&gt; &lt;top pitch&gt; &lt;bottom pitch&gt; &lt;tail start&gt; &lt;tail end&gt;
<dd>
This gives the pitch envelope and pitch range of the last stressed syllable of the clause. <b><code>tail start</code></b> and <b><code>tail end</code></b> give a pitch path for the unstressed syllables which are after the last stressed syllable.
<p>
<dt><strong>nucleus0</strong> &lt;envelope&gt; &lt;top pitch&gt; &lt;bottom pitch&gt;
<dd>
This is used instead of <b><code>nucleus</code></b> if there are no unstressed syllables after the last stressed syllable. In this case, the pitch changes of the nucleus and the tail and both included in the nucleus.
</dl>
<p>
The following attributes may also be included:
<dl>
<dt><strong>onset</strong> &lt;pitch&gt; &lt;unstressed start&gt; &lt;unstressed end&gt;
<dd>
This specifies the pitch for the first stressed syllable of the head. If the <b><code>onset</code></b> statement is present, then the <b><code>head</code></b> statement used for the stressed syllables after the first.
<p>
<dt><strong>headlast</strong> &lt;pitch&gt; &lt;unstressed start&gt; &lt;unstressed end&gt;
<dd>
This specifies the pitch for the last stressed syllable of the head (i.e. the stressed syllable before the nucleus).
<p>
</dl>

+ 12
- 17
docs/mbrola.html View File

@@ -49,32 +49,27 @@ directory) into
</ol>
<h3>Linux Installation</h3>

I don't think there's a Linux shared library version of Mbrola (equivalent to mbrola.dll), so eSpeak has to pipe phoneme data to the command-line Mbrola.
From eSpeak version 1.44 onwards, eSpeak calls the mbrola program directly, rather than passing phoneme data to it using a pipe.
<ol>
<li>To install the Linux Mbrola binary, download:
<a href="http://www.tcts.fpms.ac.be/synthesis/mbrola/bin/pclinux/mbr301h.zip"> http://www.tcts.fpms.ac.be/synthesis/mbrola/bin/pclinux/mbr301h.zip</a>.
Unpack the archive, and copy and rename the file: <code>mbrola-linux-i386</code> to
Unpack the archive, and copy and rename the file from: <code>mbrola-linux-i386</code> to
<code>mbrola</code> somewhere in your executable path (eg. <code>/usr/bin/mbrola</code> ).
<p>
<li>Get the en1 voice from:
<a href="http://www.tcts.fpms.ac.be/synthesis/mbrola/mbrcopybin.html"> http://www.tcts.fpms.ac.be/synthesis/mbrola/mbrcopybin.html</a>.
Unpack the archive, and copy the "<b>en1</b>" data file (not the whole "en1"
directory) somewhere convenient (eg. <code>/usr/share/mbrola/en1</code> ).
directory) to <code>/usr/share/mbrola/en1</code>.<p>eSpeak will look for mbrola voices firstly in <code>espeak-data/mbrola</code> and then in <code>/usr/share/mbrola</code>
<p>
<li>If you use the eSpeak voice "<b>mb-en1</b>" then eSpeak will generate
Mbrola phoneme data on its stdout. You can pipe this into Mbrola.
<p>
<code>espeak -v mb-en1 -f textfile | mbrola -e /usr/share/mbrola/en1 -
test.wav</code>
<p>
will put the Mbrola speech output into a WAV file. Or you can pipe the output from Mbrola through aplay:
<p>
<code>espeak -v mb-en1 -f textfile | mbrola -e /usr/share/mbrola/en1 - - | aplay -r16000 -fS16</code>
<p>
The -e option prevents Mbrola from stopping if it finds a combination
of phonemes which it doesn't recognise.
<p>
Some mbrola voices (de5, de6) use a sample rate of 22050 Hz. These need -r22050 rather than -r16000.
<li>If you use the eSpeak voice such as "<b>mb-en1</b>" then eSpeak will use the mbrola "en1" voice, eg:<br>
<code>espeak -v mb-en1 "Hello world"
</code>
<p><p>
To generate mbrola phoneme data (.pho file) you can use:<br>
<code>espeak -v mb-en1 -q --pho "Hello world"</code>
<br>or<br>
<code>espeak -v mb-en1 -q --pho --phonout=out.pho "Hello world"</code>

</ol>
<h3>Mbrola Voice Files</h3>


+ 9
- 3
docs/phontab.html View File

@@ -3,6 +3,7 @@

<head>
<title>eSpeak: Phoneme tables</title>
<meta name="GENERATOR" content="Quanta Plus">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
@@ -102,6 +103,7 @@ Within the phoneme definition the following lines may occur: ( (V) indicates on
<tr><TD><b>rhotic</b></TD><td>(C) An "r" type consonant.</td></tr>
<tr><TD><b>unstressed</b></TD><td>(V) This vowel is always unstressed, unless explicitly marked otherwise.</td></tr>
<tr><TD><b>nolink</b></TD><td>Prevent any linking from the previous phoneme.</td></tr>
<tr><TD><b>nopause</b></TD><td>Used in a <code>liquid</code> or <code>nasal</code> phoneme to prevent eSpeak inserting a short pause if a word starts with this phoneme and the previous word ends with a vowel.</td></tr>
<tr><TD><b>trill</b></TD><td>(C) Apply trill to the voicing.</td></tr>
</table>
</dl>
@@ -151,14 +153,18 @@ During the first phase of phoneme interpretation, an instruction which causes a
<dt><strong>length</strong> &lt;length&gt;
<dd>The relative length of the phoneme, typically about 140 for a short vowel and from 200 to 300 for a long vowel or diphong. A length() instruction is needed for vowels. It is optional for consonants.
<p>
<dt><strong>ipa</strong> &lt;ipa string&gt;
<dd>In many cases, eSpeak makes IPA (International Phonetic Alpbabet) phoneme names automatically from eSpeak phoneme names. If this is not correct, then the phoneme definition can include an <b>ipa</b> instruction to specify the correct IPA name. IPA strings may include non-ascii characters. They may also include characters specified by their character codes in the form U+ followed by 4 hexadecimal digits. For example a string: aU+0303 indicates 'a' with a 'combining tilde'.
<p>
<dt><strong>WAV</strong>(&lt;wav file&gt;, &lt;amplitude&gt;)
<dd>&nbsp;&lt;wav file&gt; is a path to a WAV file (22 kHz, 16 bits, mono) within <code>phsource/</code> which will be played to produce the sound. This method is used for unvoiced consonants. &lt;wavefile&gt; does not include a .WAV filename extension, although the file to which it refers may or may not have one.<br>
&lt;amplitude&gt; is optional. It is a percentage change to the amplitude of the WAV file. So, <code>WAV(ufric/s, 50)</code> means: play file 'ufric/s.wav' at 50% amplitude.
<p>
<dt><strong>FMT</strong>(&lt;vowel file&gt;)
<dd>&lt;vowel file&gt; is a path to a file (within <code>phsource/</code>) which defines how to generate the sound (a vowel or voiced consonant) from a sequence of formant values. Vowel files are made using the espeakedit program.
<dt><strong>FMT</strong>(&lt;vowel file&gt;, &lt;amplitude&gt;)
<dd>&lt;vowel file&gt; is a path to a file (within <code>phsource/</code>) which defines how to generate the sound (a vowel or voiced consonant) from a sequence of formant values. Vowel files are made using the espeakedit program.<br>
&lt;amplitude&gt; is optional. It is a percentage change to the amplitude of the sound which is synthesized from the FMT() instruction.
<p>
<dt><strong>FMT</strong>(&lt;vowel file&gt;) <strong>addWav</strong>(&lt;wav file&gt;, &lt;amplitude&gt;)
<dt><strong>FMT</strong>(&lt;vowel file&gt;, &lt;amplitude&gt;) <strong>addWav</strong>(&lt;wav file&gt;, &lt;amplitude&gt;)
<dd>For voiced consonants, a FMT() instruction may be followed by an addWav() instruction. addWav() has the same format as a WAV() instruction, but the WAV file is mixed with the sound which is synthesized from the FMT() instruction.
<p>
<dt><strong>VowelStart</strong>(&lt;vowel file&gt;, &lt;length adjust&gt;)

+ 26
- 12
docs/speak_lib.h View File

@@ -1,7 +1,7 @@
#ifndef SPEAK_LIB_H
#define SPEAK_LIB_H
/***************************************************************************
* Copyright (C) 2005 to 2007 by Jonathan Duddington *
* Copyright (C) 2005 to 2010 by Jonathan Duddington *
* email: [email protected] *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -26,8 +26,9 @@
/*************************************************************/

#include <stdio.h>
#include <stddef.h>

#define ESPEAK_API_REVISION 3
#define ESPEAK_API_REVISION 5
/*
Revision 2
Added parameter "options" to eSpeakInitialize()
@@ -35,6 +36,11 @@ Revision 2
Revision 3
Added espeakWORDGAP to espeak_PARAMETER

Revision 4
Added flags parameter to espeak_CompileDictionary()

Revision 5
Added espeakCHARS_16BIT
*/
/********************/
/* Initialization */
@@ -44,12 +50,13 @@ Revision 3
typedef enum {
espeakEVENT_LIST_TERMINATED = 0, // Retrieval mode: terminates the event list.
espeakEVENT_WORD = 1, // Start of word
espeakEVENT_SENTENCE, // Start of sentence
espeakEVENT_MARK, // Mark
espeakEVENT_PLAY, // Audio element
espeakEVENT_END, // End of sentence
espeakEVENT_MSG_TERMINATED, // End of message
espeakEVENT_PHONEME // Phoneme, if enabled in espeak_Initialize()
espeakEVENT_SENTENCE = 2, // Start of sentence
espeakEVENT_MARK = 3, // Mark
espeakEVENT_PLAY = 4, // Audio element
espeakEVENT_END = 5, // End of sentence or clause
espeakEVENT_MSG_TERMINATED = 6, // End of message
espeakEVENT_PHONEME = 7, // Phoneme, if enabled in espeak_Initialize()
espeakEVENT_SAMPLERATE = 8 // internal use, set sample rate
} espeak_EVENT_TYPE;


@@ -224,6 +231,7 @@ int UriCallback(int type, const char *uri, const char *base);
#define espeakCHARS_UTF8 1
#define espeakCHARS_8BIT 2
#define espeakCHARS_WCHAR 3
#define espeakCHARS_16BIT 4

#define espeakSSML 0x10
#define espeakPHONEMES 0x100
@@ -315,7 +323,8 @@ extern "C"
#endif
espeak_ERROR espeak_Key(const char *key_name);
/* Speak the name of a keyboard key.
Currently this just speaks the "key_name" as given
If key_name is a single character, it speaks the name of the character.
Otherwise, it speaks key_name as a text string.

Return: EE_OK: operation achieved
EE_BUFFER_FULL: the command can not be buffered;
@@ -379,7 +388,8 @@ espeak_ERROR espeak_SetParameter(espeak_PARAMETER parameter, int value, int rela
parameter:
espeakRATE: speaking speed in word per minute.

espeakVOLUME: volume in range 0-100 0=silence
espeakVOLUME: volume in range 0-200 or more.
0=silence, 100=normal full volume, greater values may produce amplitude compression or distortion

espeakPITCH: base pitch, range 0-100. 50=normal

@@ -435,6 +445,7 @@ void espeak_SetPhonemeTrace(int value, FILE *stream);
value=0 No phoneme output (default)
value=1 Output the translated phoneme symbols for the text
value=2 as (1), but also output a trace of how the translation was done (matching rules and list entries)
value=3 as (1), but produces IPA rather than ascii phoneme names

stream output stream for the phoneme symbols (and trace). If stream=NULL then it uses stdout.
*/
@@ -442,13 +453,16 @@ void espeak_SetPhonemeTrace(int value, FILE *stream);
#ifdef __cplusplus
extern "C"
#endif
void espeak_CompileDictionary(const char *path, FILE *log);
void espeak_CompileDictionary(const char *path, FILE *log, int flags);
/* Compile pronunciation dictionary for a language which corresponds to the currently
selected voice. The required voice should be selected before calling this function.

path: The directory which contains the language's '_rules' and '_list' files.
'path' should end with a path separator character ('/').
log: Stream for error reports and statistics information. If log=NULL then stderr will be used.

flags: Bit 0: include source line information for debug purposes (This is displayed with the
-X command line option).
*/
/***********************/
/* Voice Selection */
@@ -497,7 +511,7 @@ const espeak_VOICE **espeak_ListVoices(espeak_VOICE *voice_spec);
The list is terminated by a NULL pointer

If voice_spec is NULL then all voices are listed.
If voice spec is give, then only the voices which are compatible with the voice_spec
If voice spec is given, then only the voices which are compatible with the voice_spec
are listed, and they are listed in preference order.
*/


+ 5
- 0
docs/ssml.html View File

@@ -74,6 +74,7 @@ eSpeak can speak HTML text directly, or text containing both SSML and HTML marku
Any unrecognised tags are ignored.<p>
The following tags case a sentence break.<br>
<b>&lt;br&gt; &nbsp;
&lt;dd&gt; &nbsp;
&lt;li&gt; &nbsp;
&lt;img&gt; &nbsp;
&lt;td&gt; &nbsp;
@@ -85,5 +86,9 @@ The following tags case a paragraph break.<br>
&lt;h4&gt; &nbsp;
&lt;hr&gt; &nbsp;
</b><p>
Text between the following tags is ignored.<br>
<b>&lt;script&gt; &nbsp; ... &nbsp; &lt;/script&gt; &nbsp;<br>
&lt;style&gt; &nbsp; ... &nbsp; &lt;/style&gt; &nbsp;<br>
</b><p>
</body>
</html>

+ 28
- 21
phsource/compile_report View File

@@ -1,4 +1,4 @@
65 phoneme tables
66 phoneme tables
new total
base 107 107
consonants 9 115
@@ -12,7 +12,7 @@ consonants 9 115
en-wi 30 148
af 39 136
cy 29 132
de 38 139
de 36 137
eo 13 114
jbo 2 114
nci 3 123
@@ -24,12 +24,12 @@ consonants 9 115
hu 24 121
lv 29 125
nl 24 125
pl 20 118
sk 28 133
cs 6 133
hr 25 138
mk 3 139
sr 14 138
pl 22 120
sk 28 135
cs 6 135
hr 25 140
mk 3 141
sr 14 140
it 18 126
la 21 124
es 10 123
@@ -38,7 +38,7 @@ consonants 9 115
pt 29 138
pt-pt 20 138
ro 36 146
el 8 123
el 9 123
grc 12 127
sv 22 127
no 28 132
@@ -59,12 +59,13 @@ consonants 9 115
ne 18 157
pa 14 151
prs 8 111
sl 7 133
sl 7 135
gd 6 107
bg 10 119
bg 10 121
nso 8 107
ht 11 140
az 10 127
ak 8 109

Data file Used by
b/b [b] base
@@ -342,7 +343,7 @@ l/l_ [l/] base
[l/] fr
l/l_@ [l/3] base
[l/] fr
l/l@ [h&w] base
l/l@ [h–z] base
[l#] base
[l] fr
[l/2] fr
@@ -368,13 +369,13 @@ l/L2_oL [l/2] base
l/L2_uL [l/2] base
l/l_3 [l/] de
l/l_4 [ll] sq
l/la [h&w] base
l/la [h–z] base
[l#] base
[l] fr
[l/2] fr
l/l_a [l/3] base
[l/] fr
l/le [h&w] base
l/le [h–z] base
[l#] base
[l] fr
[l/2] fr
@@ -384,7 +385,7 @@ l/L_eL_af [&] af
[&:] af
l/l_front [L] sq
l/l_front_ [l/4] sq
l/li [h&w] base
l/li [h–z] base
[l#] base
[l] fr
[l/2] fr
@@ -396,14 +397,14 @@ ll/ll [L] bg
ll/_ll [L] bg
l/l_long [l] base
[l] fr
l/lo [h&w] base
l/lo [h–z] base
[l#] base
[l] fr
[l/2] fr
l/l_o [l/3] base
[l/] fr
l^/l_rfx [l.] base
l/lu [h&w] base
l/lu [h–z] base
[l#] base
[l] fr
[l/2] fr
@@ -504,7 +505,6 @@ n/nu [n] base
[n#] is
[n] zh
r/@_ [V#] de
[V3#] de
r2/r2@ [r-] en
r2/r2a [r-] en
r2/r2e [r-] en
@@ -526,6 +526,7 @@ r3/r_trill [R2] base
[R] pl
[r*] sr
[x] pt
[r] el
r3/r_trill2 [R] base
[r] cy
r3/r_trill2.wav [R] base
@@ -539,6 +540,7 @@ r3/r_trill.wav [R2] base
[R] pl
[r*] sr
[x] pt
[r] el
r3/r_uvl [r"] base
[r] de
r3/r_uvl.wav [r"] base
@@ -600,9 +602,7 @@ r/trr [r/] base
[r] ro
[r] ru
r/V_ [V#] de
[V1#] de
r/V_2_ [V#] de
[V2#] de
r/xr [r] base
[R3] base
[r-] en
@@ -913,7 +913,6 @@ vdiph/aau_2 [aU] en-wi
[aU] la
[aau] zhy
vdiph/aau_3 [aU] hi
[aU] ta
[aU] ne
vdiph/aau_4 [aU] vi
vdiph/aau_6 [aU] de
@@ -947,6 +946,7 @@ vdiph/ai_8 [aI] ta
vdiph/aoo [aU] en-us
vdiph/au [aU] en
[aU] af
[aU] ta
[a:U] vi
[aU] prs
vdiph/au# [aU] en-sc
@@ -1375,6 +1375,7 @@ vowel/aa_9 [a] fi
[a:] hi
[a] ne
[a] pa
[a] ak
vowel/@_bck [@] hi
[@/] hi
[@] zh
@@ -1425,6 +1426,7 @@ vowel/e_3 [i] en-n
[e] ku
vowel/e_5 [i] en-sc
vowel/e_6 [e] ht
[e] ak
vowel/e_8 [E:] de
[e] fr
vowel/ee [E] en-n
@@ -1455,6 +1457,7 @@ vowel/ee_3 [&] af
[E] vi
vowel/ee_4 [E] sq
vowel/ee_5 [E] en
[E] ak
vowel/ee_6 [&] sk
[E3] sv
[E] ku
@@ -1533,6 +1536,7 @@ vowel/i [i] base
[i] ne
[i] prs
[i] nso
[i] ak
vowel/i# [y:] cy
vowel/i_2 [i2] de
[i:] de
@@ -1663,6 +1667,7 @@ vowel/o [o] base2
[o:] ml
[o:] pa
[o] sl
[o] ak
vowel/o_2 [o:] cy
[o:] hi
[o:] hu
@@ -1731,6 +1736,7 @@ vowel/oo_2 [0] en-sc
[O] cy
[o] cs
[0] da
[O] ak
vowel/oo_3 [O] af
vowel/oo_4 [O] base2
[0] en-wm
@@ -1774,6 +1780,7 @@ vowel/u [u] base
[u] ml
[u:] ml
[u] prs
[u] ak
vowel/u# [u:] en-sc
[Y] tr
vowel/u_2 [u1] fi

+ 15
- 29
phsource/ph_german View File

@@ -339,35 +339,6 @@ phoneme V# // used for 'r' after a vowel (to create a diphthong)
endphoneme


// TESTING

phoneme V1#
liquid
lengthmod 7
IF nextPhW(isVowel) THEN
ChangePhoneme(r")
ENDIF
FMT(r/V_)
endphoneme

phoneme V2# // used for 'r' after a vowel (to create a diphthong)
liquid
lengthmod 7
IF nextPhW(isVowel) THEN
ChangePhoneme(r")
ENDIF
FMT(r/V_2_)
endphoneme

phoneme V3#
liquid
lengthmod 7
IF nextPhW(isVowel) THEN
ChangePhoneme(r")
ENDIF
FMT(r/@_)
endphoneme

phoneme UR
vowel starttype #u endtype #@
ipa ʊɐ
@@ -377,6 +348,21 @@ phoneme UR
endphoneme


phoneme r2
vcd alv flp

IF prevPhW(isVowel) THEN
ChangePhoneme(*)
ENDIF

InsertPhoneme(@-)
ChangePhoneme(*)
endphoneme



// TESTING



// translate from English to German phonemes

+ 10
- 0
phsource/ph_greek View File

@@ -69,3 +69,13 @@ phoneme k
WAV(ustop/k_unasp, 70)
endphoneme


phoneme r // this is [R] from Slovak/Czech
liquid
trill
lengthmod 6
ipa r
Vowelin f1=0 f2=1700 -300 300 f3=-300 80
Vowelout f1=2 f2=1700 -300 300 f3=-300 80 brk
FMT(r3/r_trill) addWav(r3/r_trill.wav, 50)
endphoneme

+ 14
- 1
phsource/ph_polish View File

@@ -170,8 +170,21 @@ endphoneme


phoneme dz
import_phoneme consonants/dz
CALL consonants/dz
voicingswitch ts
ipa dʑ
endphoneme

phoneme ts;
CALL base/tS;
voicingswitch dz;
ipa tɕ
endphoneme


phoneme dz;
import_phoneme base/dZ;
voicingswitch ts;
endphoneme



+ 3
- 3
phsource/ph_tamil View File

@@ -118,14 +118,14 @@ endphoneme

phoneme aI
vowel starttype #a endtype #i
length 230
length 280
FMT(vdiph/ai_8)
endphoneme

phoneme aU
vowel starttype #a endtype #u
length 200
FMT(vdiph/aau_3)
length 260
FMT(vdiph/au)
endphoneme



+ 5
- 0
phsource/phonemes View File

@@ -475,6 +475,8 @@ phoneme l/2 // 'dark' [l] after a vowel
ChangePhoneme(l)
ENDIF

CALL vowelstart_l

PrevVowelEndings
VowelEnding(l/L2_@L, -60)
VowelEnding(l/L2_aL, -50)
@@ -1817,3 +1819,6 @@ include ph_haitian

phonemetable az tr
include ph_azerbaijani

phonemetable ak base
include ph_akan

+ 24
- 14
platforms/big_endian/espeak-phoneme-data.c View File

@@ -2,11 +2,13 @@


// 13.02.10 jonsd: Changed for eSpeak version 1.43
// 13.08.10 jonsd: Added Q lines. Use Address to set the displacement in phondata file.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h>

#if defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN
@@ -101,6 +103,7 @@ void swap_phontab (const char *infile, const char *outfile);

void usage (const char *program_name);

int xread; // prevent compiler warning from fread()


int main (int argc, char *argv[])
@@ -181,6 +184,7 @@ void swap_phondata (const char *infile, const char *outfile,
const char *manifest)
{//==========================================================
FILE *in, *mfest, *out;
int displ;
char line[1024];
unsigned char buf_4[4];

@@ -202,24 +206,30 @@ void swap_phondata (const char *infile, const char *outfile,
exit (1);
}

fread (buf_4, 4, 1, in);
fwrite (buf_4, 4, 1, out);
xread = fread(buf_4, 4, 1, in);
fwrite(buf_4, 4, 1, out);

while (fgets (line, sizeof(line), mfest))
{
if(!isupper(line[0])) continue;

sscanf(&line[2],"%x",&displ);
fseek(in, displ, SEEK_SET);

while (fgets (line, 1024, mfest)) {
if (line[0] == 'S') {
SPECT_SEQ buf_spect;
size_t ix;
int n;

fread (&buf_spect.length, 2, 1, in);
fread (&buf_spect.n_frames, 1, 1, in);
xread = fread (&buf_spect.length, 2, 1, in);
xread = fread (&buf_spect.n_frames, 1, 1, in);
fseek (in, -3, SEEK_CUR);

ix = (char *)(&buf_spect.frame[buf_spect.n_frames]) -
(char *)(&buf_spect);
ix = (ix+3) & 0xfffc;

fread (&buf_spect, ix, 1, in);
xread = fread (&buf_spect, ix, 1, in);

buf_spect.length = (short) SWAP_USHORT (buf_spect.length);
for (n = 0; n < buf_spect.n_frames; n++) {
@@ -242,7 +252,7 @@ void swap_phondata (const char *infile, const char *outfile,
int length;
char *wave_data;

fread (buf_4, 4, 1, in);
xread = fread (buf_4, 4, 1, in);
fwrite (buf_4, 4, 1, out);

length = buf_4[1] * 256 + buf_4[0];
@@ -253,7 +263,7 @@ void swap_phondata (const char *infile, const char *outfile,
exit (1);
}

fread (wave_data, 1, length, in);
xread = fread (wave_data, 1, length, in);
fwrite (wave_data, 1, length, out);

pos = ftell (in);
@@ -273,7 +283,7 @@ void swap_phondata (const char *infile, const char *outfile,
else if (line[0] == 'E') {
char env_buf[128];

fread (env_buf, 1, 128, in);
xread = fread (env_buf, 1, 128, in);
fwrite (env_buf, 1, 128, out);
}
}
@@ -302,7 +312,7 @@ void swap_phonindex (const char *infile, const char *outfile)
exit (1);
}

fread (buf_4, 4, 1, in); // skip first 4 bytes
xread = fread (buf_4, 4, 1, in); // skip first 4 bytes
fwrite(buf_4, 4, 1, out);

while (! feof (in)) {
@@ -339,7 +349,7 @@ void swap_phontab (const char *infile, const char *outfile)
exit (1);
}

fread (buf_8, 4, 1, in);
xread = fread (buf_8, 4, 1, in);
fwrite (buf_8, 4, 1, out);
n_phoneme_tables = buf_8[0];

@@ -347,18 +357,18 @@ void swap_phontab (const char *infile, const char *outfile)
int n_phonemes, j;
char tab_name[N_PHONEME_TAB_NAME];

fread (buf_8, 8, 1, in);
xread = fread (buf_8, 8, 1, in);
fwrite (buf_8, 8, 1, out);

n_phonemes = buf_8[0];

fread (tab_name, N_PHONEME_TAB_NAME, 1, in);
xread = fread (tab_name, N_PHONEME_TAB_NAME, 1, in);
fwrite (tab_name, N_PHONEME_TAB_NAME, 1, out);

for (j = 0; j < n_phonemes; j++) {
PHONEME_TAB table;

fread (&table, sizeof (PHONEME_TAB), 1, in);
xread = fread (&table, sizeof (PHONEME_TAB), 1, in);

table.mnemonic = SWAP_UINT (table.mnemonic);
table.phflags = SWAP_UINT (table.phflags);

+ 15
- 9
platforms/windows/make_espeak.iss View File

@@ -2,7 +2,7 @@
[Setup]
AppName=eSpeak
AppVerName=eSpeak version 1.43.24
AppVerName=eSpeak version 1.44.01
AppCopyright=Licensed under GNU General Public License version 3. (See file License.txt for details).
WindowVisible=yes
@@ -32,7 +32,6 @@ Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme
Source: "License.txt"; DestDir: "{app}";
[Registry]
;Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_5"; Flags: deletekey uninsdeletekey
Root: HKLM; Subkey: "Software\Microsoft\Speech\PhoneConverters\Tokens\eSpeak"; Flags: deletekey uninsdeletekey
@@ -111,8 +110,10 @@ begin
lang_main := language and $3ff;
Result := 'en';
// translation from microsoft codes to language codes
// Translation from microsoft codes to language codes
// Used to set default voices for inatallation.
case lang_main of
//$02: Result := 'bg';
$03: Result := 'ca';
$04: Result := 'zh';
$05: Result := 'cs';
@@ -126,7 +127,7 @@ begin
$0e: Result := 'hu';
$0f: Result := 'is';
$10: Result := 'it';
$12: Result := 'ko';
//$12: Result := 'ko';
$13: Result := 'nl';
$14: Result := 'no';
$15: Result := 'pl';
@@ -142,17 +143,18 @@ begin
$26: Result := 'lv';
$2a: Result := 'vi';
$2b: Result := 'hy';
$2d: Result := 'eu';
//$2c: Result := 'az';
//$2d: Result := 'eu';
$2f: Result := 'mk';
$36: Result := 'af';
$39: Result := 'hi';
$41: Result := 'sw';
$49: Result := 'ta';
$4b: Result := 'kn';
$50: Result := 'mn';
//$4b: Result := 'kn';
//$50: Result := 'mn';
$52: Result := 'cy';
$61: Result := 'ne';
$87: Result := 'rw';
//$61: Result := 'ne';
//$87: Result := 'rw';
end;
// is there a match on the full language code?
@@ -185,8 +187,12 @@ begin
lang1 := Copy(voice,8,6); // eg. mb-de4-en, return 'en'
end;
// Used to set the correct Microsoft language code in the registry
// when a SAPI5 voice is installed.
case lang1 of
'af': value := $436;
'az': value := $42c;
'bg': value := $402;
'bs': value := $41a; // should be $141a but Jaws crashes on startup
'ca': value := $403;
'cs': value := $405;

+ 4
- 1
platforms/windows/make_espeakedit.iss View File

@@ -1,7 +1,7 @@
[Setup]
AppName=eSpeakEdit
AppVerName=eSpeakEdit version 1.43.24
AppVerName=eSpeakEdit version 1.44.01
DefaultDirName={pf}\eSpeak
DefaultGroupName=eSpeak
OutputBaseFilename=setup_espeakedit
@@ -14,6 +14,9 @@ ShowLanguageDialog=auto
Name: "{group}\espeakedit"; Filename: "{app}\espeakedit.exe"; WorkingDir: "{app}"; Flags: runmaximized
Name: "{group}\Uninstall espeakedit"; Filename: "{uninstallexe}"
[InstallDelete]
Type: filesandordirs; Name: "{app}\phsource\vowelcharts"
[Files]
Source: "espeakedit.exe"; DestDir: "{app}"

+ 3
- 2
platforms/windows/windows_sapi/ttsengobj.cpp View File

@@ -178,6 +178,7 @@ int SynthCallback(short *wav, int numsamples, espeak_EVENT *events)
// return the events
for(event=events; (event->type != 0) && (n_Events < N_EVENTS); event++)
{
audio_latest = event->audio_position + audio_offset;
if((event->type == espeakEVENT_WORD) && (event->length > 0))
@@ -260,8 +261,8 @@ static int ConvertRate(int new_rate)
int rate;
static int rate_table[21] = {80,100,115,124,133,142,151,159,168,174,180,
187,196,208,220,240,270,300,335,369,390 };
static int rate_table[21] = {80,110,124,133,142,151,159,168,174,180,187,
196,208,220,240,270,300,335,369,390,450 };
rate = new_rate + master_rate;
if(rate < -10) rate = -10;

+ 5
- 5
platforms/windows/windows_sapi/version.rc2 View File

@@ -5,8 +5,8 @@
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,42,00
PRODUCTVERSION 1,0,42,00
FILEVERSION 1,0,44,00
PRODUCTVERSION 1,0,44,00
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -24,14 +24,14 @@ BEGIN
VALUE "Comments", "\0"
VALUE "CompanyName", "Jonathan Duddington\0"
VALUE "FileDescription", "Text to Speech\0"
VALUE "FileVersion", "1, 0,42,00\0"
VALUE "InternalName", "espeak1.42\0"
VALUE "FileVersion", "1, 0,44,00\0"
VALUE "InternalName", "espeak1.44\0"
VALUE "LegalCopyright", "Copyright (c) Jonathan Duddington\0"
VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "espeak_sapi.dll\0"
VALUE "PrivateBuild", "\0"
VALUE "ProductName", "espeak TTS\0"
VALUE "ProductVersion", "1, 0, 42, 00\0"
VALUE "ProductVersion", "1, 0, 44, 00\0"
VALUE "SpecialBuild", "\0"
END
END

+ 6
- 3
src/compiledata.cpp View File

@@ -1925,8 +1925,11 @@ static int LoadEnvelope(FILE *f, const char *fname)
displ = ftell(f_phdata);

fseek(f,12,SEEK_SET);
fread(buf,1,128,f);
fwrite(buf,1,128,f_phdata);
if(fread(buf,128,1,f) == 0)
{
error("Failed to read envelope: %s",fname);
}
fwrite(buf,128,1,f_phdata);

if(n_envelopes < N_ENVELOPES)
{
@@ -3576,7 +3579,7 @@ void CompileMbrola()
wxFileName filename = wxFileName(filepath);
strcpy(mbrola_voice,filename.GetName().mb_str(wxConvLocal));
sprintf(buf,"%s/mbrola_ph/%s_phtrans",path_home,mbrola_voice);
if((f_out = fopen(buf,"w")) == NULL)
if((f_out = fopen(buf,"wb")) == NULL)
{
wxLogError(_T("Can't write to: ")+wxString(buf,wxConvLocal));
return;

+ 3
- 2
src/dictionary.cpp View File

@@ -273,7 +273,7 @@ int LoadDictionary(Translator *tr, const char *name, int no_error)
}

tr->data_dictlist = Alloc(size);
fread(tr->data_dictlist,size,1,f);
size = fread(tr->data_dictlist,1,size,f);
fclose(f);


@@ -516,7 +516,7 @@ unsigned short ipa1[96] = {
0x252,0x31,0x32,0x25c,0x34,0x35,0x36,0x37,0x275,0x39,0x2d0,0x2b2,0x3c,0x3d,0x3e,0x294,
0x259,0x251,0x3b2,0xe7,0xf0,0x25b,0x46,0x262,0x127,0x26a,0x25f,0x4b,0x4c,0x271,0x14b,0x254,
0x3a6,0x263,0x280,0x283,0x3b8,0x28a,0x28c,0x153,0x3c7,0xf8,0x292,0x32a,0x5c,0x5d,0x5e,0x5f,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x261,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x303,0x7f
};

@@ -1639,6 +1639,7 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags,
}
*output++ = 0;

return;
} /* end of SetWordStress */



+ 1
- 1
src/espeakedit.cpp View File

@@ -566,7 +566,7 @@ void DisplayErrorFile(const char *fname)
if(msg != NULL)
{
f = fopen(fname,"r");
fread(msg,len,1,f);
len = fread(msg,1, len, f);
fclose(f);
msg[len] = 0;
msg_string = wxString(msg,wxConvUTF8);

+ 1
- 1
src/numbers.cpp View File

@@ -1883,7 +1883,7 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned

int TranslateNumber(Translator *tr, char *word1, char *ph_out, unsigned int *flags, WORD_TAB *wtab, int control)
{//=============================================================================================================
if(option_sayas == SAYAS_DIGITS1)
if((option_sayas == SAYAS_DIGITS1) || (wtab[0].flags & FLAG_INDIVIDUAL_DIGITS))
return(0); // speak digits individually

if(tr->langopts.numbers != 0)

+ 1
- 2
src/readclause.cpp View File

@@ -774,7 +774,7 @@ static int LoadSoundFile(const char *fname, int index)
fclose(f);
return(4);
}
fread(p,length,1,f);
length = fread(p,1,length,f);
fclose(f);
remove(fname_temp);

@@ -2032,7 +2032,6 @@ int ReadClause(Translator *tr, FILE *f_in, char *buf, short *charix, int *charix
int stressed_word = 0;
int end_clause_after_tag = 0;
int end_clause_index = 0;
const char *p;
wchar_t xml_buf[N_XML_BUF+1];

#define N_XML_BUF2 20

+ 2
- 1
src/speak_lib.h View File

@@ -388,7 +388,8 @@ espeak_ERROR espeak_SetParameter(espeak_PARAMETER parameter, int value, int rela
parameter:
espeakRATE: speaking speed in word per minute.

espeakVOLUME: volume in range 0-100 0=silence
espeakVOLUME: volume in range 0-200 or more.
0=silence, 100=normal full volume, greater values may produce amplitude compression or distortion

espeakPITCH: base pitch, range 0-100. 50=normal


+ 2
- 2
src/synth_mbrola.cpp View File

@@ -147,7 +147,7 @@ espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int
// read eSpeak's mbrola phoneme translation data, eg. en1_phtrans
sprintf(path,"%s/mbrola_ph/%s",path_home,phtrans);
size = GetFileLength(path);
if((f_in = fopen(path,"r")) == NULL) {
if((f_in = fopen(path,"rb")) == NULL) {
close_MBR();
return(EE_NOT_FOUND);
}
@@ -165,7 +165,7 @@ espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int
{
*pw++ = Read4Bytes(f_in);
}
fread(mbrola_tab,size,1,f_in);
size = fread(mbrola_tab,1,size,f_in);
fclose(f_in);

setVolumeRatio_MBR((float)(mbrola_control & 0xff) /16.0f);

+ 2
- 2
src/synthdata.cpp View File

@@ -35,8 +35,8 @@
#include "translate.h"
#include "wave.h"

const char *version_string = "1.43.63 02.Aug.10";
const int version_phdata = 0x014361;
const char *version_string = "1.44.02 13.Aug.10";
const int version_phdata = 0x014400;

int option_device_number = -1;
FILE *f_logespeak = NULL;

+ 6
- 1
src/synthesize.cpp View File

@@ -1236,10 +1236,15 @@ void DoEmbedded(int *embix, int sourceix)
int command;

do {
word = embedded_list[(*embix)++];
word = embedded_list[*embix];
value = word >> 8;
command = word & 0x7f;

if(command == 0)
return; // error

(*embix)++;

switch(command & 0x1f)
{
case EMBED_S: // speed

+ 10
- 10
src/tr_languages.cpp View File

@@ -122,7 +122,8 @@ static Translator* NewTranslator(void)
tr->data_dictrules = NULL; // language_1 translation rules file
tr->data_dictlist = NULL; // language_2 dictionary lookup file

tr->transpose_min = 0;
tr->transpose_min = 'a';
tr->transpose_max = 'z';
tr->frequent_pairs = NULL;

// only need lower case
@@ -167,6 +168,7 @@ static Translator* NewTranslator(void)
tr->langopts.replace_chars = NULL;
tr->langopts.ascii_language = ""; // Non-Latin alphabet languages, use this language to speak Latin words, default is English


SetLengthMods(tr,201);
// tr->langopts.length_mods = length_mods_en;
// tr->langopts.length_mods0 = length_mods_en0;
@@ -178,6 +180,7 @@ static Translator* NewTranslator(void)
tr->langopts.thousands_sep = ',';
tr->langopts.decimal_sep = '.';
tr->langopts.break_numbers = BREAK_THOUSANDS; // 1000, 1000,000 1,000,000 etc
tr->langopts.max_digits = 14;

memcpy(tr->punct_to_tone, punctuation_to_tone, sizeof(tr->punct_to_tone));

@@ -278,14 +281,14 @@ static void SetCyrillicLetters(Translator *tr)

tr->letter_bits_offset = OFFSET_CYRILLIC;
memset(tr->letter_bits,0,sizeof(tr->letter_bits));
SetLetterBits(tr,0,ru_vowels);
SetLetterBits(tr,LETTERGP_A,ru_vowels);
SetLetterBits(tr,1,ru_soft);
SetLetterBits(tr,2,ru_consonants);
SetLetterBits(tr,3,ru_hard);
SetLetterBits(tr,4,ru_nothard);
SetLetterBits(tr,5,ru_voiced);
SetLetterBits(tr,6,ru_ivowels);
SetLetterBits(tr,7,ru_vowels);
SetLetterBits(tr,LETTERGP_VOWEL2,ru_vowels);
} // end of SetCyrillicLetters


@@ -419,10 +422,8 @@ Translator *SelectTranslator(const char *name)
static const short stress_lengths_da[8] = {160,140, 200,200, 0,0, 220,230};
SetupTranslator(tr,stress_lengths_da,NULL);

tr->transpose_min = 'a';
tr->transpose_max = 'z';

tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.param[LOPT_PREFIXES] = 1;
SetLetterVowel(tr,'y');
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_ORDINAL_DOT | NUM_1900 | NUM_ROMAN | NUM_ROMAN_CAPITALS | NUM_ROMAN_ORDINAL;
}
@@ -451,9 +452,6 @@ Translator *SelectTranslator(const char *name)
static const short stress_lengths_en[8] = {182,140, 220,220, 0,0, 248,275};
SetupTranslator(tr,stress_lengths_en,NULL);

tr->transpose_min = 'a';
tr->transpose_max = 'z';

tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.stress_flags = 0x08;
tr->langopts.numbers = NUM_HUNDRED_AND | NUM_ROMAN | NUM_1900;
@@ -485,6 +483,7 @@ Translator *SelectTranslator(const char *name)
tr->letter_bits_offset = OFFSET_GREEK;
memset(tr->letter_bits,0,sizeof(tr->letter_bits));
SetLetterBits(tr,LETTERGP_A,el_vowels);
SetLetterBits(tr,LETTERGP_VOWEL2,el_vowels);
SetLetterBits(tr,LETTERGP_B,el_voiceless);
SetLetterBits(tr,LETTERGP_C,el_consonants);
SetLetterBits(tr,LETTERGP_Y,el_fvowels); // front vowels: ε η ι υ
@@ -733,6 +732,7 @@ SetLengthMods(tr,3); // all equal
tr->letter_bits_offset = OFFSET_ARMENIAN;
memset(tr->letter_bits,0,sizeof(tr->letter_bits));
SetLetterBits(tr,LETTERGP_A,hy_vowels);
SetLetterBits(tr,LETTERGP_VOWEL2,hy_vowels);
SetLetterBits(tr,LETTERGP_C,hy_consonants);
tr->langopts.max_initial_consonants = 6;
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED;
@@ -902,7 +902,7 @@ SetLengthMods(tr,3); // all equal
tr->langopts.param[LOPT_PREFIXES] = 1;
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x10; // devoice at end of word
SetLetterVowel(tr,'y');
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_OMIT_1_HUNDRED | NUM_ALLOW_SPACE | NUM_1900 | NUM_ORDINAL_DOT;
tr->langopts.ordinal_indicator = "e";
memcpy(tr->stress_lengths,stress_lengths_nl,sizeof(tr->stress_lengths));

+ 28
- 10
src/translate.cpp View File

@@ -766,12 +766,14 @@ int TranslateWord(Translator *tr, char *word1, int next_pause, WORD_TAB *wtab)

int word_length;
int ix;
char *p;
int pfix;
int n_chars;
unsigned int dictionary_flags[2];
unsigned int dictionary_flags2[2];
int end_type=0;
int prefix_type=0;
int prefix_stress;
char *wordx;
char phonemes[N_WORD_PHONEMES];
char *ph_limit;
@@ -1007,7 +1009,6 @@ if((wmark > 0) && (wmark < 8))

while(((length < 3) && (length > 0))|| (word_length > 1 && Unpronouncable(tr,wordx)))
{
char *p;
// This word looks "unpronouncable", so speak letters individually until we
// find a remainder that we can pronounce.
emphasize_allcaps = 0;
@@ -1311,9 +1312,15 @@ if(dictionary_flags2[0] & FLAG_ABBREV)

/* determine stress pattern for this word */
/******************************************/
/* NOTE: this also adds a single PAUSE if the previous word ended
in a primary stress, and this one starts with one */
if(prefix_flags || (strchr(prefix_phonemes,phonSTRESS_P)!=NULL))
prefix_stress = 0;
for(p = prefix_phonemes; *p != 0; p++)
{
if((*p == phonSTRESS_P) || (*p == phonSTRESS_P2))
{
prefix_stress = *p;
}
}
if(prefix_flags || (prefix_stress != 0))
{
if((tr->langopts.param[LOPT_PREFIXES]) || (prefix_type & SUFX_T))
{
@@ -2303,6 +2310,7 @@ void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *t
char *p;
int j, k;
int n_digits;
int individual_digits;
int charix_top=0;

short charix[N_TR_SOURCE+4];
@@ -2338,7 +2346,9 @@ void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *t
for(p=source; *p != 0; p++)
fputc(*p, f_logespeak);
fprintf(f_logespeak,"ENDCLAUSE\n");
fflush(f_logespeak);
}
p = source;

charix[charix_top+1] = 0;
charix[charix_top+2] = 0x7fff;
@@ -2947,7 +2957,11 @@ if((c == '/') && (tr->langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(pre
words[word_count].pre_pause = 8;
if(word_count > 0)
{
words[word_count-1].flags |= FLAG_LAST_WORD;
ix = word_count-1;
while((ix > 0) && (IsBracket(sbuf[words[ix].start])))
ix--; // the last word is a bracket, mark the previous word as last
words[ix].flags |= FLAG_LAST_WORD;

// FLAG_NOSPACE check to avoid recognizing .mr -mr
if((terminator & CLAUSE_DOT) && !(words[word_count-1].flags & FLAG_NOSPACE))
words[word_count-1].flags |= FLAG_HAS_DOT;
@@ -2962,8 +2976,8 @@ if((c == '/') && (tr->langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(pre
char *pn;
char *pw;
int nw;
char number_buf[60];
WORD_TAB num_wtab[15]; // copy of 'words', when splitting numbers into parts
char number_buf[150];
WORD_TAB num_wtab[50]; // copy of 'words', when splitting numbers into parts

// start speaking at a specified word position in the text?
count_words++;
@@ -2984,7 +2998,7 @@ if((c == '/') && (tr->langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(pre
{
// Languages with 100000 numbers. Remove thousands separators so that we can insert them again later
pn = number_buf;
while(pn < &number_buf[sizeof(number_buf)-3])
while(pn < &number_buf[sizeof(number_buf)-20])
{
if(iswdigit(*pw))
{
@@ -3010,15 +3024,19 @@ if((c == '/') && (tr->langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(pre

for(n_digits=0; iswdigit(word[n_digits]); n_digits++); // count consecutive digits

if((n_digits > 4) && (word[0] != '0'))
if(n_digits > 4)
{
// word is entirely digits, insert commas and break into 3 digit "words"
number_buf[0] = ' ';
pn = &number_buf[1];
nx = n_digits;
nw = 0;
individual_digits = 0;

if((n_digits > tr->langopts.max_digits) || (word[0] == '0'))
words[ix].flags |= FLAG_INDIVIDUAL_DIGITS;

while(pn < &number_buf[sizeof(number_buf)-3])
while(pn < &number_buf[sizeof(number_buf)-20])
{
if(!isdigit(c = *pw++) && (c != tr->langopts.decimal_sep))
break;

+ 14
- 12
src/translate.h View File

@@ -108,6 +108,7 @@
#define FLAG_HAS_DOT 0x10000 // dot after this word
#define FLAG_COMMA_AFTER 0x20000 // comma after this word
#define FLAG_MULTIPLE_SPACES 0x40000 // word is preceded by multiple spaces, newline, or tab
#define FLAG_INDIVIDUAL_DIGITS 0x80000 // speak number as individual digits

#define FLAG_SUFFIX_VOWEL 0x08000000 // remember an initial vowel from the suffix
#define FLAG_NO_TRACE 0x10000000 // passed to TranslateRules() to suppress dictionary lookup printout
@@ -194,18 +195,18 @@
#define PUNCT_SAY_NAME 0x200000
#define CLAUSE_DOT 0x400000

#define CLAUSE_NONE 0 + 0x04000
#define CLAUSE_PARAGRAPH 70 + 0x80000
#define CLAUSE_EOF 40 + 0x90000
#define CLAUSE_VOICE 0 + 0x24000
#define CLAUSE_PERIOD 40 + 0x80000
#define CLAUSE_COMMA 20 + 0x41000
#define CLAUSE_SHORTCOMMA 4 + 0x41000
#define CLAUSE_SHORTFALL 4 + 0x40000
#define CLAUSE_QUESTION 40 + 0x82000
#define CLAUSE_EXCLAMATION 45 + 0x83000
#define CLAUSE_COLON 30 + 0x40000
#define CLAUSE_SEMICOLON 30 + 0x41000
#define CLAUSE_NONE ( 0 + 0x04000)
#define CLAUSE_PARAGRAPH (70 + 0x80000)
#define CLAUSE_EOF (40 + 0x90000)
#define CLAUSE_VOICE ( 0 + 0x24000)
#define CLAUSE_PERIOD (40 + 0x80000)
#define CLAUSE_COMMA (20 + 0x41000)
#define CLAUSE_SHORTCOMMA ( 4 + 0x41000)
#define CLAUSE_SHORTFALL ( 4 + 0x40000)
#define CLAUSE_QUESTION (40 + 0x82000)
#define CLAUSE_EXCLAMATION (45 + 0x83000)
#define CLAUSE_COLON (30 + 0x40000)
#define CLAUSE_SEMICOLON (30 + 0x41000)

#define SAYAS_CHARS 0x12
#define SAYAS_GLYPHS 0x13
@@ -439,6 +440,7 @@ typedef struct {
int min_roman;
int thousands_sep;
int decimal_sep;
int max_digits; // max number of digits which can be spoken as an integer number (rather than individual digits)
const char *ordinal_indicator; // UTF-8 string

// bit 0, accent name before the letter name, bit 1 "capital" after letter name

+ 1
- 1
src/vowelchart.cpp View File

@@ -611,7 +611,7 @@ void MakeVowelLists(void)
prog_log_table = (PHONEME_PROG_LOG *)malloc(ix);
if(prog_log_table == NULL)
return;
fread(prog_log_table, 1, ix, f_prog_log);
ix = fread(prog_log_table, 1, ix, f_prog_log);
fclose(f_prog_log);
prog_log_end = prog_log_table + ix;
n_prog_log = ix / sizeof(PHONEME_PROG_LOG);

Loading…
Cancel
Save