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

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


blignault blIx2n@Ut blignault blIx2n@Ut
blomerus blum'e@rWs blomerus blum'e@rWs
blum blum blum blum
borodin bOrud'in
botha bo@ta botha bo@ta
bouwer b@U@r bouwer b@U@r
braham brA:m braham brA:m
(du toit) d@||toI (du toit) d@||toI
dustin _^_EN dustin _^_EN
duvenage dyv@nA:x2@ duvenage dyv@nA:x2@
dvorak d@-v'O:Zak
einstein aInstaI:n einstein aInstaI:n
eksteen $1 eksteen $1
elana il'A:na elana il'A:na
grange x2rA:nsi grange x2rA:nsi
gregory _^_EN gregory _^_EN
greta gre@ta greta gre@ta
grieg gri:g
grové x2ruv'e@ grové x2ruv'e@
gulliver _^_EN gulliver _^_EN
gustav gustaf gustav gustaf
jane _^_EN jane _^_EN
Jean ZA~n $capital Jean ZA~n $capital
jesebel je@s@b&l jesebel je@s@b&l
jessica _^_EN
jimmy _^_EN jimmy _^_EN
joachim juw'A:x2@m joachim juw'A:x2@m
joan _^_EN joan _^_EN
lulu lulu lulu lulu
mabalêl mabal'&l mabalêl mabal'&l
mabel _^_EN mabel _^_EN
macgill m@gjil
mackintosh _^_EN mackintosh _^_EN
madelene mad@l'e@n madelene mad@l'e@n
mbeki mbE:ki mbeki mbE:ki
mozart mo@tsart mozart mo@tsart
myburgh meIbWrx2 myburgh meIbWrx2
naomi na_'o@mi naomi na_'o@mi
napoleon nap'o@liOn
natasha n%at'aSa natasha n%at'aSa
naudé nOd'e@ naudé nOd'e@
nefertiti nEf@rt'iti nefertiti nEf@rt'iti
retha re@ta retha re@ta
retief r@tif retief r@tif
rhodes _^_EN rhodes _^_EN
richard _^_EN
riekert rik@rt riekert rik@rt
robert _^_EN robert _^_EN
robin _^_EN robin _^_EN
kafee kaf'e@ kafee kaf'e@
kaliefa kal'ifa kaliefa kal'ifa
kameraderie kam@rA:d@r'i kameraderie kam@rA:d@r'i
kapittel kap'It@l
katswink katsv@nk katswink katsv@nk
kaviaar kavi'A:r kaviaar kavi'A:r
kennisvaardig $1 kennisvaardig $1
oorkom $2 oorkom $2
oorle o@rl@ oorle o@rl@
oorleef $2 oorleef $2
oorry o@reI
oorsee $2 oorsee $2
oorsese $2 oorsese $2
oorval $2 $verb oorval $2 $verb
plaasjaap plA:sjA:p plaasjaap plA:sjA:p
plasenta plas'Enta plasenta plas'Enta
poinsettia pOIns'Etia poinsettia pOIns'Etia
pond po~nt
potpourri pOtpur'i potpourri pOtpur'i
primate $2 primate $2
profetes prOf@t'Es profetes prOf@t'Es
voorgee fo@rx2e@ voorgee fo@rx2e@
voorkeer $1 voorkeer $1
voorkom $2 $only voorkom $2 $only
voorlente $1
voormalige fo@rm'A:l@x2@ voormalige fo@rm'A:l@x2@
voornemens fo@rne@m@ns voornemens fo@rne@m@ns
//voorsien $2 //voorsien $2
welaf v&l_af welaf v&l_af
weleer v&l_'e@r weleer v&l_'e@r
wentaktiek $1 wentaktiek $1
willens vIl@ns
wysgere veIsx2e@r@ wysgere veIsx2e@r@



+ 9
- 1
dictsource/af_rules View File

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

+ 102
- 36
dictsource/da_list View File

// PB = Peter Bjarkov - [email protected]

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


// This file is UTF8 encoded // This file is UTF8 encoded
// Spelling-to-phoneme words for Danish // Spelling-to-phoneme words for Danish
// numbers // numbers
_0 'nOl _0 'nOl
_1 'e:n _1 'e:n
_2 t'o:
_3 tR'&:
_2 t'o
_3 tR'e
_4 f'i:V _4 f'i:V
_5 f'Em _5 f'Em
_6 s'Egs _6 s'Egs
_7 s'yw _7 s'yw
_8 'O:d@ _8 'O:d@
_9 n'i:
_10 t'i:
_9 n'i
_10 t'i
_11 'Elv@ _11 'Elv@
_12 t'Vl _12 t'Vl
_13 tR'&#d@-n // PB & changed to &# _13 tR'&#d@-n // PB & changed to &#
_8X f'irs _8X f'irs
_9X h&lf'Ems // PB a changed to & _9X h&lf'Ems // PB a changed to &
_0C h'un*@:D _0C h'un*@:D
_1C ed||h'unR@:D // PB addet 'et hundrede'
_0M1 t'u:s@-n _0M1 t'u:s@-n
_1M1 ed||t'u:s@-n // PB added 'et' to tusind _1M1 ed||t'u:s@-n // PB added 'et' to tusind
_1M2 'e:n||milij'o:n _1M2 'e:n||milij'o:n


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



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


// pronouns // pronouns
jeg jai $u+ // I jeg jai $u+ // I
vi $u vi $u
i _i $u+ i _i $u+
mig maj $u // me mig maj $u // me
dig daj $u
dig daj $u+
dem $u dem $u
ham $u ham $u
hende $u hende $u
sig $u sig $u
os Vs $u
jer
os Vs $u+
jer $u
denne $u+ // this denne $u+ // this
dette $u+ dette $u+
disse $u+ // these disse $u+ // these
bør $u+ // ought bør $u+ // ought


// letter names // letter names
b be:
c se:
d de:
b be
c se
d de
_e e: _e e:
f Ef f Ef
g ge:
g ge
h hO: h hO:
_i i: _i i:
j jVD // PB changed from [o] j jVD // PB changed from [o]
m Em m Em
n En n En
o o o o
p pe:
q ku:
p pe
q ku
r Er r Er
s es s es
//t te: mooved to da_rules because of clash with T-shirt //t te: mooved to da_rules because of clash with T-shirt
u u? u u?
v ve:
v ve
w d'Vbeltve: w d'Vbeltve:
x Eks x Eks
y Y? y Y?
// PB English words // PB English words
bacon _^_EN bacon _^_EN
bondage _^_EN bondage _^_EN
baseball _^_EN
volleyball _^_EN volleyball _^_EN
dj _^_EN dj _^_EN
deadline _^_EN deadline _^_EN
vivarium $alt vivarium $alt
vokabularium $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 // PB nouns with final -ie - stress on previous syllable
// unofficial suffix for the "ium" words above // unofficial suffix for the "ium" words above
adverbie $alt adverbie $alt
stewardesse $alt stewardesse $alt
tristesse $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 PB final -id - stressed i
adenoid $alt adenoid $alt
alkaloid $alt alkaloid $alt
blamer $alt blamer $alt
blancher $alt blancher $alt
bloker $alt bloker $alt
bogstaver $alt
bogstavere $alt
bombarder $alt bombarder $alt
bonbonniere bVNbVNj'E:r $alt bonbonniere bVNbVNj'E:r $alt
boniter $alt boniter $alt
konvoluter $alt konvoluter $alt
kooperer $alt kooperer $alt
koordiner $alt koordiner $alt
kopier $alt
kopiere $alt
kopuler $alt kopuler $alt
koreografer $alt koreografer $alt
korreler $alt korreler $alt
kursere $alt kursere $alt
kursiver $alt kursiver $alt
kurtiser $alt kurtiser $alt
kuverter $alt
kuvertere $alt
kvadrer $alt kvadrer $alt
kvaksalverer $alt kvaksalverer $alt
kvalificer $alt kvalificer $alt
pausere $alt pausere $alt
pelleter $alt pelleter $alt
pendulere $alt pendulere $alt
pensioner $alt
pensionere $alt
perciper $alt perciper $alt
perfektioner $alt perfektioner $alt
perforer $alt perforer $alt
petitioner $alt petitioner $alt
pigmenter $alt pigmenter $alt
piker $alt piker $alt
piloter $alt
pilotere $alt
pioner $alt pioner $alt
pipetter $alt pipetter $alt
pirater $alt pirater $alt
rekompenser $alt rekompenser $alt
rekonvalescer $alt rekonvalescer $alt
rekreer $alt rekreer $alt
rekrutter $alt
rekruttere $alt
rektificer $alt rektificer $alt
rektoskoper $alt rektoskoper $alt
rekurrer $alt rekurrer $alt
trivialiser $alt trivialiser $alt
trompeter $alt trompeter $alt
trunker $alt trunker $alt
trænere $alt
//trænere $alt
tunneler $alt tunneler $alt
turner $alt turner $alt
tuscher $alt tuscher $alt
urbaniser $alt urbaniser $alt
urger $alt urger $alt
uriner $alt uriner $alt
urpremier $alt
usurper $alt usurper $alt
vacciner $alt vacciner $alt
vagabonder $alt vagabonder $alt
saigon sajg3-n // PB Saigon saigon sajg3-n // PB Saigon
managua m&n'&:gw& managua m&n'&:gw&
(deja-vu) deSja||'vy (deja-vu) deSja||'vy
(il duce) il||d'u:tSj@ // PB Italian faschist
(il duce) il||d'u:tSj@ // PB Italian Fascist


// Abbreviations // 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 hr h&r $hasdot // PB hr. - short for mister (Mr) in Danish
mr mestV $hasdot // PB mister mr mestV $hasdot // PB mister
mrs meses $hasdot // PB Mrs. mrs meses $hasdot // PB Mrs.
(f.eks) fVegsemp@l $hasdot // PB "f.eks" 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'en) di:'dje:j3n // *PB dj'en - the dj
(dj'er) di:'dje:jV // *PB dj'er (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'en) se:de:3n // PB
(cd'er) se:de:V // PB (cd'er) se:de:V // PB
emp $abbrev emp $abbrev
usa $abbrev usa $abbrev
who $abbrev $allcaps // PB World Health Organization
vsop $abbrev
eu $abbrev eu $abbrev
co $abbrev $allcaps // PB for CO2-kvote
ngo $abbrev
edb $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 it $abbrev
id $abbrev id $abbrev
dna $abbrev dna $abbrev
(så langt) sV||l'ANt (så langt) sV||l'ANt
(så vil) sV||v'el (så vil) sV||v'el
(så højt) sV||h'Vjt (så højt) sV||h'Vjt
(så var) sV||v'Ar
(så var) sV||v'Ar
(så længe) sV||l'EN3 (så længe) sV||l'EN3
(så må) sV||m'O (så må) sV||m'O
(så har) sV||har (så har) sV||har
(virkede så) v'irkeD@||sV (virkede så) v'irkeD@||sV
(kom så) kVm||sV (kom så) kVm||sV
(koste med) kosd@||mED (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

Phonemes which are used in the *_rules and *_list files 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 & &: 3: @ @- @L @U a
A: aI AI aU A~ E e: e@ A: aI AI aU A~ E e: e@
x z x z




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


& &# 0 3 @ @- a A & &# 0 3 @ @- a A
e E i o O u V W e E i o O u V W
s S t T tS v w z 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: A a: E e: i i: o o:
u u: Y y y: Y: u u: Y y y: Y:
T ts v x z z; T ts v x z z;




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


0 3 3: @ @- @2 @5 @L 0 3 3: @ @- @2 @5 @L
a a# A: A@ aa aI aI@ aU a a# A: A@ aa aI aI@ aU
s2 t v w Z s2 t v w Z




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


@ @- a A~ e E E: E~ @ @- a A~ e E E: E~
i I o O O~ u u: w i I o O O~ u u: w
t. th th. v w x z 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 a a: aI aU e E e: i
I i: o o: u U u2 u: I i: o o: u U u2 u:
t tS v w x t tS v w x




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


8 @ @- A a: A~ E e: 8 @ @- A a: A~ E e:
EI eU i I O O: o: u EI eU i I O O: o: u
y y


: ; b c C d d; dZ : ; 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 Dictionary pt_dict 2010-07-03


@ a e i o u @ 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 Dictionary nso_dict 2010-05-26
tS v z Z 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 Dictionary az_dict 2010-07-27


& @ a e E i o u & @ a e E i o u

+ 12
- 11
dictsource/en_list View File

?7 _17 s'@v@nti:n ?7 _17 s'@v@nti:n
_18 'eIti:n _18 'eIti:n
_19 n'aInti: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 _0C h'Vndr@d
_0M1 T'aUz@nd _0M1 T'aUz@nd
_0M2 m'Ili@n _0M2 m'Ili@n
Doris d0rIs Doris d0rIs
Dorothy dO@r@Ti Dorothy dO@r@Ti
Dougall du:g@L Dougall du:g@L
Duncan dVnk@n
Dvina d@vi:n@ Dvina d@vi:n@
Dylan dIl@n Dylan dIl@n
Edith i:dIT Edith i:dIT
Therese t@ri:z Therese t@ri:z
Thomas t0m@s Thomas t0m@s
Tina ti:n@ Tina ti:n@
Tracy treIsI
Tracy treIsi
Tricia trIS@ Tricia trIS@
Vanessa va#nEs@ Vanessa va#nEs@
Wally w0lI Wally w0lI

+ 2
- 2
dictsource/en_rules View File

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


.group ig .group ig
am) ig (a_ i:g am) ig (a_ i:g

+ 4
- 2
dictsource/fr_rules View File

// http://www.fluxnic.net/cicero // http://www.fluxnic.net/cicero
// //
// Rules are now maintained by Michel Such <[email protected]> // 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: // Letter classes:


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








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



+ 132
- 7
dictsource/hu_list View File

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




//special number exceptions //special number exceptions
téli $alt téli $alt
végén $alt végén $alt
elején $alt elején $alt
folyamán $alt
úton $alt
út $alt


// accent names // accent names
_lig ligAtu:R2A _lig ligAtu:R2A


ellen $unstressend // against ellen $unstressend // against
//elé $u // before //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 //because if only a year is present, need spokening normal number, not
//ordinal number. For example: //ordinal number. For example:
//2004. óta meaning since 2004 and need spokening normal number. //2004. óta meaning since 2004 and need spokening normal number.
látszott $unstressend látszott $unstressend
látszanak $unstressend látszanak $unstressend
látszotok $unstressend látszotok $unstressend
körül $unstressend $alt3
körül $unstressend $alt $alt3
dőlt $unstressend dőlt $unstressend
vér $unstressend vér $unstressend
sót $unstressend sót $unstressend
állnak $unstressend állnak $unstressend
idején $unstressend idején $unstressend
néznek $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 // word pairs




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


leszek $u // to be, future leszek $u // to be, future
leszel $u leszel $u
(hu-n) hun (hu-n) hun
(USA-ban) usában (USA-ban) usában
(USA-ba) usába (USA-ba) usába
(pc-n) pécén

+ 9
- 0
dictsource/hu_rules View File

tö) bb (féle b tö) bb (féle b
jo) bbr (a bR2 jo) bbr (a bR2
tö) bbr (e bR2 tö) bbr (e bR2
kise) bb (ség b



.group c .group c
c ts c ts
cselé) ds (ég tS: cselé) ds (ég tS:
föl) d (szegély d föl) d (szegély d
stran) d (szezon d stran) d (szezon d
_hol) d (sarló d


.group dz .group dz
fogó) dz (kod ts fogó) dz (kod ts
se) gg (be g se) gg (be g
pro) g (gyak g pro) g (gyak g
se) ggr (e gR2 se) ggr (e gR2
arcüre) g (gyulladás g


.group gy .group gy
gy J gy J
huszone) gy (edik J: huszone) gy (edik J:
je) gy (ért J je) gy (ért J
harmince) gy (edik J: harmince) gy (edik J:
étvá) gy (javít J


.group h .group h
h h h h
hirdeté) ssz (erve Ss hirdeté) ssz (erve Ss
páncélo) ssz Ss páncélo) ssz Ss
hajtá) ssz (erű Ss hajtá) ssz (erű Ss
sorva) ssz (ák s:


.group sz .group sz
sz s sz s
ö) t (jegyű t ö) t (jegyű t
ha) t (jegyű t ha) t (jegyű t
hé) t (jegyű t hé) t (jegyű t
zár) t (sorú t
skó) t (juhász t
szerete) t (szolgálat t


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

+ 214
- 1
dictsource/nl_list View File

badder $alt badder $alt
bagger $alt bagger $alt
baker $alt baker $alt
baster $alt
beender $alt beender $alt
belemmer $alt belemmer $alt
beter $alt beter $alt
bibber $alt bibber $alt
bitter $alt
bladder $alt bladder $alt
blader $alt blader $alt
blaker $alt blaker $alt
bolder $alt bolder $alt
bolster $alt bolster $alt
boter $alt boter $alt
broeder $alt
buffer $alt buffer $alt
bulder $alt bulder $alt
bulldozer $alt bulldozer $alt
bumper $alt bumper $alt
bunker $alt bunker $alt
charter $alt
cijfer $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 donder $alt
donker $alt
dotter $alt
duister $alt
dwater $alt dwater $alt
eergister $alt
eier $alt eier $alt
emmer $alt
ender $alt ender $alt
enter $alt
erger $alt
etter $alt
filter $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 geester $alt
gemoeder $alt gemoeder $alt
gibber $alt
gister $alt
glibber $alt
glimmer $alt
glinster $alt
glitter $alt
glunder $alt
halter $alt
hamer $alt hamer $alt
hamster $alt
haper $alt
helder $alt
herinner $alt
herover $alt
hinder $alt
hoender $alt hoender $alt
honger $alt
huiver $alt
hunker $alt
ijver $alt
ijzer $alt
imker $alt
inburger $alt
inkader $alt
jakker $alt jakker $alt
jammer $alt jammer $alt
joeker $alt
kader $alt
kaffer $alt
kalefater $alt
kalver $alt kalver $alt
kamfer $alt
kanker $alt kanker $alt
kaper $alt
kaver $alt kaver $alt
keilder $alt
kenter $alt
keper $alt
kerker $alt
ketter $alt
keuter $alt
kicker $alt
kieper $alt
kinder $alt kinder $alt
kladder $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 klodder $alt
kluister $alt
knapper $alt
knetter $alt
kneuter $alt
knikker $alt
knipper $alt
knisper $alt
knister $alt
koekeloer $alt koekeloer $alt
koester $alt
koeter $alt
koffer $alt
koker $alt
kolder $alt
kommer $alt kommer $alt
koper $alt
kuier $alt kuier $alt
kwetter $alt
labber $alt
lager $alt
lammer $alt lammer $alt
laser $alt
laster $alt laster $alt
lauwer $alt
lazer $alt lazer $alt
lebber $alt lebber $alt
leder $alt // gelederen leder $alt // gelederen
leger $alt leger $alt
lekker $alt
lemmer $alt
lepper $alt
ler $alt ler $alt
letter $alt letter $alt
leuter $alt
lever $alt lever $alt
lieder $alt lieder $alt
lobber $alt
lodder $alt
lommer $alt
louter $alt
lubber $alt lubber $alt
luier $alt
luimer $alt
luister $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 modder $alt
moeder $alt moeder $alt
moker $alt
monster $alt monster $alt
mopper $alt
nader $alt nader $alt
neder $alt
nuchter $alt
nummer $alt nummer $alt
ober $alt
offer $alt
onder $alt
orber $alt
ouder $alt ouder $alt
over $alt
palaver $alt
pantser $alt pantser $alt
pauper $alt
peiger $alt peiger $alt
peper $alt
peuter $alt peuter $alt
pieker $alt
pieter $alt
pinkster $alt
pleister $alt pleister $alt
pletter $alt
ploeter $alt
plunder $alt
poeder $alt poeder $alt
poeier $alt poeier $alt
poker $alt
polder $alt polder $alt
puber $alt
pulver $alt
purper $alt
rader $alt rader $alt
raster $alt raster $alt
redder $alt redder $alt
ridder $alt ridder $alt
rooster $alt
rubber $alt
ruiter $alt
runder $alt runder $alt
sakker $alt
schamper $alt
schater $alt
schemer $alt
schetter $alt
schilder $alt schilder $alt
schipper $alt
schitter $alt
schouder $alt
schutter $alt
sidder $alt
sjacher $alt
skeeler $alt
skelter $alt
slechter $alt
slenter $alt slenter $alt
slidder $alt
slinger $alt slinger $alt
slobber $alt
slodder $alt
sloeber $alt
sluier $alt
sluimer $alt
snater $alt
snipper $alt snipper $alt
snotter $alt
snuister $alt
sober $alt
sodemieter $alt sodemieter $alt
somber $alt
spetter $alt
spijker $alt
splinter $alt splinter $alt
sputter $alt sputter $alt
steiger $alt
stekker $alt
stotter $alt
stuiter $alt
stumper $alt
sudder $alt
suiker $alt suiker $alt
supporter $alt
tater $alt
teder $alt
teister $alt
temper $alt
tetter $alt
teuter $alt
timmer $alt timmer $alt
tover $alt tover $alt
treiter $alt
trompetter $alt
tuier $alt
tutter $alt
twitter $alt
uier $alt
vinger $alt vinger $alt
vlieger $alt
vlinder $alt
vlotter $alt
voeder $alt
volker $alt volker $alt
vorder $alt vorder $alt
waaier $alt
wakker $alt wakker $alt
wapper $alt
water $alt water $alt
wedijver $alt
wegwijzer $alt wegwijzer $alt
wester $alt
wijder $alt
wilder $alt
winter $alt
wipper $alt
woeker $alt
wonder $alt wonder $alt
zeker $alt
zever $alt zever $alt
zilver $alt
zinder $alt
zolder $alt
zomer $alt
zonder $alt zonder $alt
zuiver $alt zuiver $alt
zwabber $alt
zwakker $alt
zwanger $alt zwanger $alt



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

+ 16
- 1
dictsource/nl_rules View File



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


_) mee (@P3 m'e:



.group n .group n
n n n n
ng N ng N
nj n^ nj n^


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



.group o .group o
o o: o o:
ou (rage u ou (rage u


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




.group on .group on
_) onge (val OnQ@ _) onge (val OnQ@





.group p .group p
p p p p
pp p pp p
uw yU uw yU
uw (_ yU uw (_ yU


_) uit (@P3 'Wyt



.group v .group v
v v v v
_) ver (@P3 v@r _) ver (@P3 v@r
_) ver (sie_ vEr _) ver (sie_ vEr
_) ver (der_ vEr _) ver (der_ vEr
_) voort (@P5 v'O:rt




.group w .group w
w (X w w (X w
w (CK w w (CK w


_) weg (@P3 v#'Ex



.group x .group x
x ks x ks

+ 0
- 1
dictsource/ta_list View File



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

+ 19
- 5
dictsource/ta_rules View File

//sort //sort
அலை) க (டல kV அலை) க (டல kV
சமையல்) க (ட் kV சமையல்) க (ட் kV
_கால) க (ட்ட kV
_கல்) க (ண்ட kV _கல்) க (ண்ட kV
_நற்) க (தி gV _நற்) க (தி gV
வீண்) க (தை kV வீண்) க (தை kV
வீண்) க (ஷ்ட kV வீண்) க (ஷ்ட kV
ம) க (ா H ம) க (ா H
_தாலு) க (ா k _தாலு) க (ா k
_வலை) க (ாப் k
தொல்) க (ாப்பி k தொல்) க (ாப்பி k
மூல) க (ாரண k மூல) க (ாரண k
அந்திம) க (ால k அந்திம) க (ால k
வி) க்ட (ோரியா kt. // victoria வி) க்ட (ோரியா kt. // victoria
வி) க (்ரம k வி) க (்ரம k
ஆ) க (்ரோஷ k ஆ) க (்ரோஷ k
_கால) க (ட்ட kV
_வலை) க (ாப் k
//endsort //endsort




சீ (னிவாச sri: சீ (னிவாச sri:
_) ச (ீன்_ s _) ச (ீன்_ s
_ஈ) சு s _ஈ) சு s
_) சு (லோக s
கே) சு (வ s கே) சு (வ s
மே) சு (வ s மே) சு (வ s
வி) சு (வ s வி) சு (வ s
_) த (ுரதிர்ஷ்ட d _) த (ுரதிர்ஷ்ட d
_) த (ுராசை d _) த (ுராசை d
_) த (ுரியோதனன d _) த (ுரியோதனன d
_) த (ுரியோதனா d
_) த (ுருவங் d _) த (ுருவங் d
_) த (ுருவத் d _) த (ுருவத் d
_) த (ுரை d _) த (ுரை d
_கீழ்) த (ட்ட tV _கீழ்) த (ட்ட tV
_மேல்) த (ட்ட tV _மேல்) த (ட்ட tV
முட்டாள்) த (ன tV முட்டாள்) த (ன tV
_கௌ) த (மி tV
_கீ) த (ா t _கீ) த (ா t
_சீ) த (ா t _சீ) த (ா t
_ல) த (ா t _ல) த (ா t
ச) த (்ரு t ச) த (்ரு t
த) த (்ரூப t த) த (்ரூப t
பா) த (்ரூம t பா) த (்ரூம t
_கௌ) த (மி tV
//endsort //endsort






//sort //sort


_) ப (கவதி bV
_) ப (கவான bV _) ப (கவான bV
_) ப (காசுர bV _) ப (காசுர bV
_) ப (கிரங்க bV _) ப (கிரங்க bV
_) ப (த்திரமா bV _) ப (த்திரமா bV
_) ப (ந்தங்கள bV _) ப (ந்தங்கள bV
_) ப (ந்தத் bV _) ப (ந்தத் bV
_) ப (ந்தப் bV
_) ப (ந்தம bV _) ப (ந்தம bV
_) ப (ந்துக்கள bV _) ப (ந்துக்கள bV
_) ப (ந்துவ bV _) ப (ந்துவ bV
_) ப (ாகத b _) ப (ாகத b
_) ப (ாகம b _) ப (ாகம b
_) ப (ாக்கிய b _) ப (ாக்கிய b
_) பாக்த (ாத ba:gd
_) ப (ாங்க் b _) ப (ாங்க் b
_) ப (ாசு b _) ப (ாசு b
_) ப (ாசுர p _) ப (ாசுர p
வட) ப (குதி pV வட) ப (குதி pV
தென்) ப (குதி pV தென்) ப (குதி pV
ப (க்கK pV ப (க்கK pV
பரம) ப (க்த bV
க) ப (ட bV க) ப (ட bV
கரம்) ப (ட pV கரம்) ப (ட pV
ப (டி pV ப (டி pV
வீண்) ப (ேச்ச p வீண்) ப (ேச்ச p
ப (ேரில்_ p ப (ேரில்_ p
ப (ேர்_ p ப (ேர்_ p
வன்) ப (ொருள் p
மென்) ப (ொருள் p
வீண்) ப (ொழுத p வீண்) ப (ொழுத p
ப (ோக_ p ப (ோக_ p
ப (ோகவில்லை_ p ப (ோகவில்லை_ p
மன) ப்பி (ரமை bb மன) ப்பி (ரமை bb
துர்) ப்ப (ோதனை bb துர்) ப்ப (ோதனை bb
கம்) ப்யூட (ர pjU:t.V கம்) ப்யூட (ர pjU:t.V
மென்) ப (ொருள் p
வன்) ப (ொருள் p
//endsort //endsort


// If ப+ appearing in the middle of a word is followed by ட+ // If ப+ appearing in the middle of a word is followed by ட+
.group இ .group இ
//sort //sort
இ i இ i
_) இ (யேச
_) இ (ரகசிய // silent _) இ (ரகசிய // silent
_) இ (ரசாயன _) இ (ரசாயன
_) இ (ரத்த _) இ (ரத்த
ஐ aI ஐ aI


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


ஓ o: ஓ o:


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




// combining vowels // combining vowels
ூ u: ூ u:


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


ே e: ே e:


ோ o: ோ o:


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




் // virama ் // virama

+ 1
- 1
docs/add_language.html View File

<a href="http://en.wikipedia.org/wiki/Vowel">http://en.wikipedia.org/wiki/Vowel</a> <a href="http://en.wikipedia.org/wiki/Vowel">http://en.wikipedia.org/wiki/Vowel</a>
<P> <P>
In many cases it should be fairly easy to add a rough implementation of a new language, hopefully 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: After that it's a gradual process of improvement to:
<ul> <ul>
<li>Make the spelling-to-phoneme translation rules more accurate, including the position of stressed <li>Make the spelling-to-phoneme translation rules more accurate, including the position of stressed

+ 15
- 7
docs/commands.html View File

<p> <p>
<dt> <dt>
<strong>-s &lt;integer&gt;</strong><br> <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> <p>
<dt> <dt>
<strong>-b &lt;integer&gt;</strong><br> <strong>-b &lt;integer&gt;</strong><br>
<p> <p>
<dt> <dt>
<strong>-q</strong><br><dd> <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> <p>
<dt> <dt>
<strong>-v &lt;voice filename&gt;[+&lt;variant&gt;]</strong><br> <strong>-v &lt;voice filename&gt;[+&lt;variant&gt;]</strong><br>
<dt> <dt>
<strong>-x</strong><br> <strong>-x</strong><br>
<dd>The phoneme mnemonics, into which the input text is translated, are <dd>The phoneme mnemonics, into which the input text is translated, are
shown on stdout.
written to stdout.
<p> <p>
<dt> <dt>
<strong>-X</strong><br> <strong>-X</strong><br>
<dd> <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. 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> <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> <dt><strong>--path [="&lt;directory path&gt;"]</strong><br>
<dd> <dd>
Specifies the directory which contains the espeak-data directory. Specifies the directory which contains the espeak-data directory.
<p> <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> <dt><strong>--phonout [="&lt;filename&gt;"]</strong><br>
<dd> <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> <p>
<dt><strong>--punct [="&lt;characters&gt;"]</strong><br> <dt><strong>--punct [="&lt;characters&gt;"]</strong><br>
<dd> <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> 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> <p>
<dt><strong>--split [="&lt;minutes&gt;"]</strong><br>
<dt><strong>--split [=&lt;minutes&gt;]</strong><br>
<dd> <dd>
Used with <strong>-w</strong>, it starts a new WAV file every <code>&lt;minutes&gt;</code> minutes, at the next sentence boundary. Used with <strong>-w</strong>, it starts a new WAV file every <code>&lt;minutes&gt;</code> minutes, at the next sentence boundary.
<p> <p>
<dd>Lists the available voices.<br> <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> 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=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> </dl>
<p>&nbsp;<hr> <p>&nbsp;<hr>

+ 19
- 7
docs/dictionary.html View File

<td><strong>N</strong></td> <td><strong>N</strong></td>
<td>Only use this rule if the word is not a retranslation after removing a suffix.</td> <td>Only use this rule if the word is not a retranslation after removing a suffix.</td>
</tr> </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> <tr>
<td><strong>#</strong></td> <td><strong>#</strong></td>
<td>(English specific) change the next "e" into a special character "E"</td> <td>(English specific) change the next "e" into a special character "E"</td>
</tr> </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> </tbody>
</table> </table>
</ul> </ul>
</pre> </pre>
S and P must be at the end of the &lt;post&gt; string. S and P must be at the end of the &lt;post&gt; string.
<p> <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> <ul><table>
<tbody> <tbody>
<td>$hasdot</td> <td>$hasdot</td>
<td>Use this pronunciation if the word is followed by a dot. (This attribute also implies $dot).</td> <td>Use this pronunciation if the word is followed by a dot. (This attribute also implies $dot).</td>
</tr> </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> <tr>
<td>$abbrev</td> <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>
<tr> <tr>
<td>&nbsp;</td> <td>&nbsp;</td>
<tr> <tr>
<td>$accent</td> <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> <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>
<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> <td>These are language specific. Their use should be described in the language's **_list file</td>
</tr> </tr>
<tr> <tr>

+ 3
- 1
docs/docindex.html View File

<h3><A href="add_language.html">Adding a Language</A></h3> <h3><A href="add_language.html">Adding a Language</A></h3>
How to add or improve a language. How to add or improve a language.
<h3><A href="phonemes.html">Phonemes</A></h3> <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> <h3><A href="phontab.html">Phoneme Tables</A></h3>
The tables of the phonemes used by each language, with their properties and sound production. 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> <h3><A href="speak_lib.h">eSpeak Libary API</A></h3>
API definition and header file for a shared library version of eSpeak. API definition and header file for a shared library version of eSpeak.
<h3><A href="ssml.html">Markup tags</A></h3> <h3><A href="ssml.html">Markup tags</A></h3>

+ 101
- 0
docs/intonation.html View File

<!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

</ol> </ol>
<h3>Linux Installation</h3> <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> <ol>
<li>To install the Linux Mbrola binary, download: <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>. <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> ). <code>mbrola</code> somewhere in your executable path (eg. <code>/usr/bin/mbrola</code> ).
<p> <p>
<li>Get the en1 voice from: <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>. <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" 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> <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> </ol>
<h3>Mbrola Voice Files</h3> <h3>Mbrola Voice Files</h3>



+ 9
- 3
docs/phontab.html View File



<head> <head>
<title>eSpeak: Phoneme tables</title> <title>eSpeak: Phoneme tables</title>
<meta name="GENERATOR" content="Quanta Plus">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head> </head>
<body> <body>
<tr><TD><b>rhotic</b></TD><td>(C) An "r" type consonant.</td></tr> <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>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>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> <tr><TD><b>trill</b></TD><td>(C) Apply trill to the voicing.</td></tr>
</table> </table>
</dl> </dl>
<dt><strong>length</strong> &lt;length&gt; <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. <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> <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;) <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> <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. &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> <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> <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. <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> <p>
<dt><strong>VowelStart</strong>(&lt;vowel file&gt;, &lt;length adjust&gt;) <dt><strong>VowelStart</strong>(&lt;vowel file&gt;, &lt;length adjust&gt;)

+ 26
- 12
docs/speak_lib.h View File

#ifndef SPEAK_LIB_H #ifndef SPEAK_LIB_H
#define 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] * * email: [email protected] *
* * * *
* This program is free software; you can redistribute it and/or modify * * This program is free software; you can redistribute it and/or modify *
/*************************************************************/ /*************************************************************/


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


#define ESPEAK_API_REVISION 3
#define ESPEAK_API_REVISION 5
/* /*
Revision 2 Revision 2
Added parameter "options" to eSpeakInitialize() Added parameter "options" to eSpeakInitialize()
Revision 3 Revision 3
Added espeakWORDGAP to espeak_PARAMETER Added espeakWORDGAP to espeak_PARAMETER


Revision 4
Added flags parameter to espeak_CompileDictionary()

Revision 5
Added espeakCHARS_16BIT
*/ */
/********************/ /********************/
/* Initialization */ /* Initialization */
typedef enum { typedef enum {
espeakEVENT_LIST_TERMINATED = 0, // Retrieval mode: terminates the event list. espeakEVENT_LIST_TERMINATED = 0, // Retrieval mode: terminates the event list.
espeakEVENT_WORD = 1, // Start of word 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; } espeak_EVENT_TYPE;




#define espeakCHARS_UTF8 1 #define espeakCHARS_UTF8 1
#define espeakCHARS_8BIT 2 #define espeakCHARS_8BIT 2
#define espeakCHARS_WCHAR 3 #define espeakCHARS_WCHAR 3
#define espeakCHARS_16BIT 4


#define espeakSSML 0x10 #define espeakSSML 0x10
#define espeakPHONEMES 0x100 #define espeakPHONEMES 0x100
#endif #endif
espeak_ERROR espeak_Key(const char *key_name); espeak_ERROR espeak_Key(const char *key_name);
/* Speak the name of a keyboard key. /* 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 Return: EE_OK: operation achieved
EE_BUFFER_FULL: the command can not be buffered; EE_BUFFER_FULL: the command can not be buffered;
parameter: parameter:
espeakRATE: speaking speed in word per minute. 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 espeakPITCH: base pitch, range 0-100. 50=normal


value=0 No phoneme output (default) value=0 No phoneme output (default)
value=1 Output the translated phoneme symbols for the text 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=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. stream output stream for the phoneme symbols (and trace). If stream=NULL then it uses stdout.
*/ */
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #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 /* Compile pronunciation dictionary for a language which corresponds to the currently
selected voice. The required voice should be selected before calling this function. 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: The directory which contains the language's '_rules' and '_list' files.
'path' should end with a path separator character ('/'). 'path' should end with a path separator character ('/').
log: Stream for error reports and statistics information. If log=NULL then stderr will be used. 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 */ /* Voice Selection */
The list is terminated by a NULL pointer The list is terminated by a NULL pointer


If voice_spec is NULL then all voices are listed. 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. are listed, and they are listed in preference order.
*/ */



+ 5
- 0
docs/ssml.html View File

Any unrecognised tags are ignored.<p> Any unrecognised tags are ignored.<p>
The following tags case a sentence break.<br> The following tags case a sentence break.<br>
<b>&lt;br&gt; &nbsp; <b>&lt;br&gt; &nbsp;
&lt;dd&gt; &nbsp;
&lt;li&gt; &nbsp; &lt;li&gt; &nbsp;
&lt;img&gt; &nbsp; &lt;img&gt; &nbsp;
&lt;td&gt; &nbsp; &lt;td&gt; &nbsp;
&lt;h4&gt; &nbsp; &lt;h4&gt; &nbsp;
&lt;hr&gt; &nbsp; &lt;hr&gt; &nbsp;
</b><p> </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> </body>
</html> </html>

+ 28
- 21
phsource/compile_report View File

65 phoneme tables
66 phoneme tables
new total new total
base 107 107 base 107 107
consonants 9 115 consonants 9 115
en-wi 30 148 en-wi 30 148
af 39 136 af 39 136
cy 29 132 cy 29 132
de 38 139
de 36 137
eo 13 114 eo 13 114
jbo 2 114 jbo 2 114
nci 3 123 nci 3 123
hu 24 121 hu 24 121
lv 29 125 lv 29 125
nl 24 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 it 18 126
la 21 124 la 21 124
es 10 123 es 10 123
pt 29 138 pt 29 138
pt-pt 20 138 pt-pt 20 138
ro 36 146 ro 36 146
el 8 123
el 9 123
grc 12 127 grc 12 127
sv 22 127 sv 22 127
no 28 132 no 28 132
ne 18 157 ne 18 157
pa 14 151 pa 14 151
prs 8 111 prs 8 111
sl 7 133
sl 7 135
gd 6 107 gd 6 107
bg 10 119
bg 10 121
nso 8 107 nso 8 107
ht 11 140 ht 11 140
az 10 127 az 10 127
ak 8 109


Data file Used by Data file Used by
b/b [b] base b/b [b] base
[l/] fr [l/] fr
l/l_@ [l/3] base l/l_@ [l/3] base
[l/] fr [l/] fr
l/l@ [h&w] base
l/l@ [h–z] base
[l#] base [l#] base
[l] fr [l] fr
[l/2] fr [l/2] fr
l/L2_uL [l/2] base l/L2_uL [l/2] base
l/l_3 [l/] de l/l_3 [l/] de
l/l_4 [ll] sq l/l_4 [ll] sq
l/la [h&w] base
l/la [h–z] base
[l#] base [l#] base
[l] fr [l] fr
[l/2] fr [l/2] fr
l/l_a [l/3] base l/l_a [l/3] base
[l/] fr [l/] fr
l/le [h&w] base
l/le [h–z] base
[l#] base [l#] base
[l] fr [l] fr
[l/2] fr [l/2] fr
[&:] af [&:] af
l/l_front [L] sq l/l_front [L] sq
l/l_front_ [l/4] sq l/l_front_ [l/4] sq
l/li [h&w] base
l/li [h–z] base
[l#] base [l#] base
[l] fr [l] fr
[l/2] fr [l/2] fr
ll/_ll [L] bg ll/_ll [L] bg
l/l_long [l] base l/l_long [l] base
[l] fr [l] fr
l/lo [h&w] base
l/lo [h–z] base
[l#] base [l#] base
[l] fr [l] fr
[l/2] fr [l/2] fr
l/l_o [l/3] base l/l_o [l/3] base
[l/] fr [l/] fr
l^/l_rfx [l.] base l^/l_rfx [l.] base
l/lu [h&w] base
l/lu [h–z] base
[l#] base [l#] base
[l] fr [l] fr
[l/2] fr [l/2] fr
[n#] is [n#] is
[n] zh [n] zh
r/@_ [V#] de r/@_ [V#] de
[V3#] de
r2/r2@ [r-] en r2/r2@ [r-] en
r2/r2a [r-] en r2/r2a [r-] en
r2/r2e [r-] en r2/r2e [r-] en
[R] pl [R] pl
[r*] sr [r*] sr
[x] pt [x] pt
[r] el
r3/r_trill2 [R] base r3/r_trill2 [R] base
[r] cy [r] cy
r3/r_trill2.wav [R] base r3/r_trill2.wav [R] base
[R] pl [R] pl
[r*] sr [r*] sr
[x] pt [x] pt
[r] el
r3/r_uvl [r"] base r3/r_uvl [r"] base
[r] de [r] de
r3/r_uvl.wav [r"] base r3/r_uvl.wav [r"] base
[r] ro [r] ro
[r] ru [r] ru
r/V_ [V#] de r/V_ [V#] de
[V1#] de
r/V_2_ [V#] de r/V_2_ [V#] de
[V2#] de
r/xr [r] base r/xr [r] base
[R3] base [R3] base
[r-] en [r-] en
[aU] la [aU] la
[aau] zhy [aau] zhy
vdiph/aau_3 [aU] hi vdiph/aau_3 [aU] hi
[aU] ta
[aU] ne [aU] ne
vdiph/aau_4 [aU] vi vdiph/aau_4 [aU] vi
vdiph/aau_6 [aU] de vdiph/aau_6 [aU] de
vdiph/aoo [aU] en-us vdiph/aoo [aU] en-us
vdiph/au [aU] en vdiph/au [aU] en
[aU] af [aU] af
[aU] ta
[a:U] vi [a:U] vi
[aU] prs [aU] prs
vdiph/au# [aU] en-sc vdiph/au# [aU] en-sc
[a:] hi [a:] hi
[a] ne [a] ne
[a] pa [a] pa
[a] ak
vowel/@_bck [@] hi vowel/@_bck [@] hi
[@/] hi [@/] hi
[@] zh [@] zh
[e] ku [e] ku
vowel/e_5 [i] en-sc vowel/e_5 [i] en-sc
vowel/e_6 [e] ht vowel/e_6 [e] ht
[e] ak
vowel/e_8 [E:] de vowel/e_8 [E:] de
[e] fr [e] fr
vowel/ee [E] en-n vowel/ee [E] en-n
[E] vi [E] vi
vowel/ee_4 [E] sq vowel/ee_4 [E] sq
vowel/ee_5 [E] en vowel/ee_5 [E] en
[E] ak
vowel/ee_6 [&] sk vowel/ee_6 [&] sk
[E3] sv [E3] sv
[E] ku [E] ku
[i] ne [i] ne
[i] prs [i] prs
[i] nso [i] nso
[i] ak
vowel/i# [y:] cy vowel/i# [y:] cy
vowel/i_2 [i2] de vowel/i_2 [i2] de
[i:] de [i:] de
[o:] ml [o:] ml
[o:] pa [o:] pa
[o] sl [o] sl
[o] ak
vowel/o_2 [o:] cy vowel/o_2 [o:] cy
[o:] hi [o:] hi
[o:] hu [o:] hu
[O] cy [O] cy
[o] cs [o] cs
[0] da [0] da
[O] ak
vowel/oo_3 [O] af vowel/oo_3 [O] af
vowel/oo_4 [O] base2 vowel/oo_4 [O] base2
[0] en-wm [0] en-wm
[u] ml [u] ml
[u:] ml [u:] ml
[u] prs [u] prs
[u] ak
vowel/u# [u:] en-sc vowel/u# [u:] en-sc
[Y] tr [Y] tr
vowel/u_2 [u1] fi vowel/u_2 [u1] fi

+ 15
- 29
phsource/ph_german View File

endphoneme 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 phoneme UR
vowel starttype #u endtype #@ vowel starttype #u endtype #@
ipa ʊɐ ipa ʊɐ
endphoneme endphoneme




phoneme r2
vcd alv flp

IF prevPhW(isVowel) THEN
ChangePhoneme(*)
ENDIF

InsertPhoneme(@-)
ChangePhoneme(*)
endphoneme



// TESTING





// translate from English to German phonemes // translate from English to German phonemes

+ 10
- 0
phsource/ph_greek View File

WAV(ustop/k_unasp, 70) WAV(ustop/k_unasp, 70)
endphoneme 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





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

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


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





+ 3
- 3
phsource/ph_tamil View File



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


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





+ 5
- 0
phsource/phonemes View File

ChangePhoneme(l) ChangePhoneme(l)
ENDIF ENDIF


CALL vowelstart_l

PrevVowelEndings PrevVowelEndings
VowelEnding(l/L2_@L, -60) VowelEnding(l/L2_@L, -60)
VowelEnding(l/L2_aL, -50) VowelEnding(l/L2_aL, -50)


phonemetable az tr phonemetable az tr
include ph_azerbaijani include ph_azerbaijani

phonemetable ak base
include ph_akan

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





// 13.02.10 jonsd: Changed for eSpeak version 1.43 // 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 <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <ctype.h>
#include <sys/types.h> #include <sys/types.h>


#if defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN #if defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN


void usage (const char *program_name); void usage (const char *program_name);


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




int main (int argc, char *argv[]) int main (int argc, char *argv[])
const char *manifest) const char *manifest)
{//========================================================== {//==========================================================
FILE *in, *mfest, *out; FILE *in, *mfest, *out;
int displ;
char line[1024]; char line[1024];
unsigned char buf_4[4]; unsigned char buf_4[4];


exit (1); 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') { if (line[0] == 'S') {
SPECT_SEQ buf_spect; SPECT_SEQ buf_spect;
size_t ix; size_t ix;
int n; 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); fseek (in, -3, SEEK_CUR);


ix = (char *)(&buf_spect.frame[buf_spect.n_frames]) - ix = (char *)(&buf_spect.frame[buf_spect.n_frames]) -
(char *)(&buf_spect); (char *)(&buf_spect);
ix = (ix+3) & 0xfffc; 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); buf_spect.length = (short) SWAP_USHORT (buf_spect.length);
for (n = 0; n < buf_spect.n_frames; n++) { for (n = 0; n < buf_spect.n_frames; n++) {
int length; int length;
char *wave_data; char *wave_data;


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


length = buf_4[1] * 256 + buf_4[0]; length = buf_4[1] * 256 + buf_4[0];
exit (1); exit (1);
} }


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


pos = ftell (in); pos = ftell (in);
else if (line[0] == 'E') { else if (line[0] == 'E') {
char env_buf[128]; char env_buf[128];


fread (env_buf, 1, 128, in);
xread = fread (env_buf, 1, 128, in);
fwrite (env_buf, 1, 128, out); fwrite (env_buf, 1, 128, out);
} }
} }
exit (1); 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); fwrite(buf_4, 4, 1, out);


while (! feof (in)) { while (! feof (in)) {
exit (1); exit (1);
} }


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


int n_phonemes, j; int n_phonemes, j;
char tab_name[N_PHONEME_TAB_NAME]; 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); fwrite (buf_8, 8, 1, out);


n_phonemes = buf_8[0]; 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); fwrite (tab_name, N_PHONEME_TAB_NAME, 1, out);


for (j = 0; j < n_phonemes; j++) { for (j = 0; j < n_phonemes; j++) {
PHONEME_TAB table; 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.mnemonic = SWAP_UINT (table.mnemonic);
table.phflags = SWAP_UINT (table.phflags); table.phflags = SWAP_UINT (table.phflags);

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

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

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

[Setup] [Setup]
AppName=eSpeakEdit AppName=eSpeakEdit
AppVerName=eSpeakEdit version 1.43.24
AppVerName=eSpeakEdit version 1.44.01
DefaultDirName={pf}\eSpeak DefaultDirName={pf}\eSpeak
DefaultGroupName=eSpeak DefaultGroupName=eSpeak
OutputBaseFilename=setup_espeakedit OutputBaseFilename=setup_espeakedit
Name: "{group}\espeakedit"; Filename: "{app}\espeakedit.exe"; WorkingDir: "{app}"; Flags: runmaximized Name: "{group}\espeakedit"; Filename: "{app}\espeakedit.exe"; WorkingDir: "{app}"; Flags: runmaximized
Name: "{group}\Uninstall espeakedit"; Filename: "{uninstallexe}" Name: "{group}\Uninstall espeakedit"; Filename: "{uninstallexe}"
[InstallDelete]
Type: filesandordirs; Name: "{app}\phsource\vowelcharts"
[Files] [Files]
Source: "espeakedit.exe"; DestDir: "{app}" Source: "espeakedit.exe"; DestDir: "{app}"

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

// return the events // return the events
for(event=events; (event->type != 0) && (n_Events < N_EVENTS); event++) for(event=events; (event->type != 0) && (n_Events < N_EVENTS); event++)
{ {
audio_latest = event->audio_position + audio_offset; audio_latest = event->audio_position + audio_offset;
if((event->type == espeakEVENT_WORD) && (event->length > 0)) if((event->type == espeakEVENT_WORD) && (event->length > 0))
int 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; rate = new_rate + master_rate;
if(rate < -10) rate = -10; if(rate < -10) rate = -10;

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

// //
VS_VERSION_INFO VERSIONINFO 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 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
VALUE "Comments", "\0" VALUE "Comments", "\0"
VALUE "CompanyName", "Jonathan Duddington\0" VALUE "CompanyName", "Jonathan Duddington\0"
VALUE "FileDescription", "Text to Speech\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 "LegalCopyright", "Copyright (c) Jonathan Duddington\0"
VALUE "LegalTrademarks", "\0" VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "espeak_sapi.dll\0" VALUE "OriginalFilename", "espeak_sapi.dll\0"
VALUE "PrivateBuild", "\0" VALUE "PrivateBuild", "\0"
VALUE "ProductName", "espeak TTS\0" VALUE "ProductName", "espeak TTS\0"
VALUE "ProductVersion", "1, 0, 42, 00\0"
VALUE "ProductVersion", "1, 0, 44, 00\0"
VALUE "SpecialBuild", "\0" VALUE "SpecialBuild", "\0"
END END
END END

+ 6
- 3
src/compiledata.cpp View File

displ = ftell(f_phdata); displ = ftell(f_phdata);


fseek(f,12,SEEK_SET); 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) if(n_envelopes < N_ENVELOPES)
{ {
wxFileName filename = wxFileName(filepath); wxFileName filename = wxFileName(filepath);
strcpy(mbrola_voice,filename.GetName().mb_str(wxConvLocal)); strcpy(mbrola_voice,filename.GetName().mb_str(wxConvLocal));
sprintf(buf,"%s/mbrola_ph/%s_phtrans",path_home,mbrola_voice); 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)); wxLogError(_T("Can't write to: ")+wxString(buf,wxConvLocal));
return; return;

+ 3
- 2
src/dictionary.cpp View File

} }


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




0x252,0x31,0x32,0x25c,0x34,0x35,0x36,0x37,0x275,0x39,0x2d0,0x2b2,0x3c,0x3d,0x3e,0x294, 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, 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, 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 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x303,0x7f
}; };


} }
*output++ = 0; *output++ = 0;


return;
} /* end of SetWordStress */ } /* end of SetWordStress */





+ 1
- 1
src/espeakedit.cpp View File

if(msg != NULL) if(msg != NULL)
{ {
f = fopen(fname,"r"); f = fopen(fname,"r");
fread(msg,len,1,f);
len = fread(msg,1, len, f);
fclose(f); fclose(f);
msg[len] = 0; msg[len] = 0;
msg_string = wxString(msg,wxConvUTF8); msg_string = wxString(msg,wxConvUTF8);

+ 1
- 1
src/numbers.cpp View File



int TranslateNumber(Translator *tr, char *word1, char *ph_out, unsigned int *flags, WORD_TAB *wtab, int control) 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 return(0); // speak digits individually


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

+ 1
- 2
src/readclause.cpp View File

fclose(f); fclose(f);
return(4); return(4);
} }
fread(p,length,1,f);
length = fread(p,1,length,f);
fclose(f); fclose(f);
remove(fname_temp); remove(fname_temp);


int stressed_word = 0; int stressed_word = 0;
int end_clause_after_tag = 0; int end_clause_after_tag = 0;
int end_clause_index = 0; int end_clause_index = 0;
const char *p;
wchar_t xml_buf[N_XML_BUF+1]; wchar_t xml_buf[N_XML_BUF+1];


#define N_XML_BUF2 20 #define N_XML_BUF2 20

+ 2
- 1
src/speak_lib.h View File

parameter: parameter:
espeakRATE: speaking speed in word per minute. 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 espeakPITCH: base pitch, range 0-100. 50=normal



+ 2
- 2
src/synth_mbrola.cpp View File

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


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

+ 2
- 2
src/synthdata.cpp View File

#include "translate.h" #include "translate.h"
#include "wave.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; int option_device_number = -1;
FILE *f_logespeak = NULL; FILE *f_logespeak = NULL;

+ 6
- 1
src/synthesize.cpp View File

int command; int command;


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


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

(*embix)++;

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

+ 10
- 10
src/tr_languages.cpp View File

tr->data_dictrules = NULL; // language_1 translation rules file tr->data_dictrules = NULL; // language_1 translation rules file
tr->data_dictlist = NULL; // language_2 dictionary lookup 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; tr->frequent_pairs = NULL;


// only need lower case // only need lower case
tr->langopts.replace_chars = NULL; tr->langopts.replace_chars = NULL;
tr->langopts.ascii_language = ""; // Non-Latin alphabet languages, use this language to speak Latin words, default is English tr->langopts.ascii_language = ""; // Non-Latin alphabet languages, use this language to speak Latin words, default is English



SetLengthMods(tr,201); SetLengthMods(tr,201);
// tr->langopts.length_mods = length_mods_en; // tr->langopts.length_mods = length_mods_en;
// tr->langopts.length_mods0 = length_mods_en0; // tr->langopts.length_mods0 = length_mods_en0;
tr->langopts.thousands_sep = ','; tr->langopts.thousands_sep = ',';
tr->langopts.decimal_sep = '.'; tr->langopts.decimal_sep = '.';
tr->langopts.break_numbers = BREAK_THOUSANDS; // 1000, 1000,000 1,000,000 etc 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)); memcpy(tr->punct_to_tone, punctuation_to_tone, sizeof(tr->punct_to_tone));




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




static const short stress_lengths_da[8] = {160,140, 200,200, 0,0, 220,230}; static const short stress_lengths_da[8] = {160,140, 200,200, 0,0, 220,230};
SetupTranslator(tr,stress_lengths_da,NULL); SetupTranslator(tr,stress_lengths_da,NULL);


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

tr->langopts.stress_rule = STRESSPOSN_1L; tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.param[LOPT_PREFIXES] = 1;
SetLetterVowel(tr,'y'); 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; 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;
} }
static const short stress_lengths_en[8] = {182,140, 220,220, 0,0, 248,275}; static const short stress_lengths_en[8] = {182,140, 220,220, 0,0, 248,275};
SetupTranslator(tr,stress_lengths_en,NULL); SetupTranslator(tr,stress_lengths_en,NULL);


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

tr->langopts.stress_rule = STRESSPOSN_1L; tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.stress_flags = 0x08; tr->langopts.stress_flags = 0x08;
tr->langopts.numbers = NUM_HUNDRED_AND | NUM_ROMAN | NUM_1900; tr->langopts.numbers = NUM_HUNDRED_AND | NUM_ROMAN | NUM_1900;
tr->letter_bits_offset = OFFSET_GREEK; tr->letter_bits_offset = OFFSET_GREEK;
memset(tr->letter_bits,0,sizeof(tr->letter_bits)); memset(tr->letter_bits,0,sizeof(tr->letter_bits));
SetLetterBits(tr,LETTERGP_A,el_vowels); SetLetterBits(tr,LETTERGP_A,el_vowels);
SetLetterBits(tr,LETTERGP_VOWEL2,el_vowels);
SetLetterBits(tr,LETTERGP_B,el_voiceless); SetLetterBits(tr,LETTERGP_B,el_voiceless);
SetLetterBits(tr,LETTERGP_C,el_consonants); SetLetterBits(tr,LETTERGP_C,el_consonants);
SetLetterBits(tr,LETTERGP_Y,el_fvowels); // front vowels: ε η ι υ SetLetterBits(tr,LETTERGP_Y,el_fvowels); // front vowels: ε η ι υ
tr->letter_bits_offset = OFFSET_ARMENIAN; tr->letter_bits_offset = OFFSET_ARMENIAN;
memset(tr->letter_bits,0,sizeof(tr->letter_bits)); memset(tr->letter_bits,0,sizeof(tr->letter_bits));
SetLetterBits(tr,LETTERGP_A,hy_vowels); SetLetterBits(tr,LETTERGP_A,hy_vowels);
SetLetterBits(tr,LETTERGP_VOWEL2,hy_vowels);
SetLetterBits(tr,LETTERGP_C,hy_consonants); SetLetterBits(tr,LETTERGP_C,hy_consonants);
tr->langopts.max_initial_consonants = 6; tr->langopts.max_initial_consonants = 6;
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED; tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED;
tr->langopts.param[LOPT_PREFIXES] = 1; tr->langopts.param[LOPT_PREFIXES] = 1;
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x10; // devoice at end of word tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x10; // devoice at end of word
SetLetterVowel(tr,'y'); 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.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_OMIT_1_HUNDRED | NUM_ALLOW_SPACE | NUM_1900 | NUM_ORDINAL_DOT;
tr->langopts.ordinal_indicator = "e"; tr->langopts.ordinal_indicator = "e";
memcpy(tr->stress_lengths,stress_lengths_nl,sizeof(tr->stress_lengths)); memcpy(tr->stress_lengths,stress_lengths_nl,sizeof(tr->stress_lengths));

+ 28
- 10
src/translate.cpp View File



int word_length; int word_length;
int ix; int ix;
char *p;
int pfix; int pfix;
int n_chars; int n_chars;
unsigned int dictionary_flags[2]; unsigned int dictionary_flags[2];
unsigned int dictionary_flags2[2]; unsigned int dictionary_flags2[2];
int end_type=0; int end_type=0;
int prefix_type=0; int prefix_type=0;
int prefix_stress;
char *wordx; char *wordx;
char phonemes[N_WORD_PHONEMES]; char phonemes[N_WORD_PHONEMES];
char *ph_limit; char *ph_limit;


while(((length < 3) && (length > 0))|| (word_length > 1 && Unpronouncable(tr,wordx))) while(((length < 3) && (length > 0))|| (word_length > 1 && Unpronouncable(tr,wordx)))
{ {
char *p;
// This word looks "unpronouncable", so speak letters individually until we // This word looks "unpronouncable", so speak letters individually until we
// find a remainder that we can pronounce. // find a remainder that we can pronounce.
emphasize_allcaps = 0; emphasize_allcaps = 0;


/* determine stress pattern for this word */ /* 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)) if((tr->langopts.param[LOPT_PREFIXES]) || (prefix_type & SUFX_T))
{ {
char *p; char *p;
int j, k; int j, k;
int n_digits; int n_digits;
int individual_digits;
int charix_top=0; int charix_top=0;


short charix[N_TR_SOURCE+4]; short charix[N_TR_SOURCE+4];
for(p=source; *p != 0; p++) for(p=source; *p != 0; p++)
fputc(*p, f_logespeak); fputc(*p, f_logespeak);
fprintf(f_logespeak,"ENDCLAUSE\n"); fprintf(f_logespeak,"ENDCLAUSE\n");
fflush(f_logespeak);
} }
p = source;


charix[charix_top+1] = 0; charix[charix_top+1] = 0;
charix[charix_top+2] = 0x7fff; charix[charix_top+2] = 0x7fff;
words[word_count].pre_pause = 8; words[word_count].pre_pause = 8;
if(word_count > 0) 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 // FLAG_NOSPACE check to avoid recognizing .mr -mr
if((terminator & CLAUSE_DOT) && !(words[word_count-1].flags & FLAG_NOSPACE)) if((terminator & CLAUSE_DOT) && !(words[word_count-1].flags & FLAG_NOSPACE))
words[word_count-1].flags |= FLAG_HAS_DOT; words[word_count-1].flags |= FLAG_HAS_DOT;
char *pn; char *pn;
char *pw; char *pw;
int nw; 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? // start speaking at a specified word position in the text?
count_words++; count_words++;
{ {
// Languages with 100000 numbers. Remove thousands separators so that we can insert them again later // Languages with 100000 numbers. Remove thousands separators so that we can insert them again later
pn = number_buf; pn = number_buf;
while(pn < &number_buf[sizeof(number_buf)-3])
while(pn < &number_buf[sizeof(number_buf)-20])
{ {
if(iswdigit(*pw)) if(iswdigit(*pw))
{ {


for(n_digits=0; iswdigit(word[n_digits]); n_digits++); // count consecutive digits 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" // word is entirely digits, insert commas and break into 3 digit "words"
number_buf[0] = ' '; number_buf[0] = ' ';
pn = &number_buf[1]; pn = &number_buf[1];
nx = n_digits; nx = n_digits;
nw = 0; 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)) if(!isdigit(c = *pw++) && (c != tr->langopts.decimal_sep))
break; break;

+ 14
- 12
src/translate.h View File

#define FLAG_HAS_DOT 0x10000 // dot after this word #define FLAG_HAS_DOT 0x10000 // dot after this word
#define FLAG_COMMA_AFTER 0x20000 // comma 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_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_SUFFIX_VOWEL 0x08000000 // remember an initial vowel from the suffix
#define FLAG_NO_TRACE 0x10000000 // passed to TranslateRules() to suppress dictionary lookup printout #define FLAG_NO_TRACE 0x10000000 // passed to TranslateRules() to suppress dictionary lookup printout
#define PUNCT_SAY_NAME 0x200000 #define PUNCT_SAY_NAME 0x200000
#define CLAUSE_DOT 0x400000 #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_CHARS 0x12
#define SAYAS_GLYPHS 0x13 #define SAYAS_GLYPHS 0x13
int min_roman; int min_roman;
int thousands_sep; int thousands_sep;
int decimal_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 const char *ordinal_indicator; // UTF-8 string


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

+ 1
- 1
src/vowelchart.cpp View File

prog_log_table = (PHONEME_PROG_LOG *)malloc(ix); prog_log_table = (PHONEME_PROG_LOG *)malloc(ix);
if(prog_log_table == NULL) if(prog_log_table == NULL)
return; return;
fread(prog_log_table, 1, ix, f_prog_log);
ix = fread(prog_log_table, 1, ix, f_prog_log);
fclose(f_prog_log); fclose(f_prog_log);
prog_log_end = prog_log_table + ix; prog_log_end = prog_log_table + ix;
n_prog_log = ix / sizeof(PHONEME_PROG_LOG); n_prog_log = ix / sizeof(PHONEME_PROG_LOG);

Loading…
Cancel
Save