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-fd96e6ae7743master
@@ -222,6 +222,7 @@ antwerpen antv&rp@n | |||
avignon _^_FR | |||
babilon babilOn | |||
babilonië babil'o@ni;@ | |||
bainskloof beInsklo@f | |||
bangladesj baNglad'ES | |||
barcelona bars@l'o@na | |||
barkly _^_EN | |||
@@ -314,6 +315,7 @@ mpumalanga mpu:mal'aNga | |||
montagu mOnt@ky | |||
moreletapark mOr@l,Etap'ark | |||
moorreesburg mur'e@sbWrx2 | |||
mouillepunt mulipWnt | |||
(thaba nchu) tab'A:||ntSu | |||
europa Y@r'o@pa | |||
nigel _^_EN | |||
@@ -363,6 +365,7 @@ wimbledon _^_EN | |||
wolseley wulsli | |||
uganda ug'anda | |||
uruguay urugwaI | |||
wakloof vA:klo@f | |||
zimbabwe zI:mb'ab_wE | |||
zulu zulu // Kwazulu-Natal | |||
@@ -409,6 +412,7 @@ beyers beI@rs | |||
blignault blIx2n@Ut | |||
blomerus blum'e@rWs | |||
blum blum | |||
borodin bOrud'in | |||
botha bo@ta | |||
bouwer b@U@r | |||
braham brA:m | |||
@@ -477,6 +481,7 @@ duncan daNk@-n | |||
(du toit) d@||toI | |||
dustin _^_EN | |||
duvenage dyv@nA:x2@ | |||
dvorak d@-v'O:Zak | |||
einstein aInstaI:n | |||
eksteen $1 | |||
elana il'A:na | |||
@@ -519,6 +524,7 @@ gordon _^_EN | |||
grange x2rA:nsi | |||
gregory _^_EN | |||
greta gre@ta | |||
grieg gri:g | |||
grové x2ruv'e@ | |||
gulliver _^_EN | |||
gustav gustaf | |||
@@ -548,6 +554,7 @@ james _^_EN | |||
jane _^_EN | |||
Jean ZA~n $capital | |||
jesebel je@s@b&l | |||
jessica _^_EN | |||
jimmy _^_EN | |||
joachim juw'A:x2@m | |||
joan _^_EN | |||
@@ -592,6 +599,7 @@ lukas lukas | |||
lulu lulu | |||
mabalêl mabal'&l | |||
mabel _^_EN | |||
macgill m@gjil | |||
mackintosh _^_EN | |||
madelene mad@l'e@n | |||
mbeki mbE:ki | |||
@@ -639,7 +647,6 @@ mouton mut'On | |||
mozart mo@tsart | |||
myburgh meIbWrx2 | |||
naomi na_'o@mi | |||
napoleon nap'o@liOn | |||
natasha n%at'aSa | |||
naudé nOd'e@ | |||
nefertiti nEf@rt'iti | |||
@@ -675,6 +682,7 @@ renée r@neI | |||
retha re@ta | |||
retief r@tif | |||
rhodes _^_EN | |||
richard _^_EN | |||
riekert rik@rt | |||
robert _^_EN | |||
robin _^_EN | |||
@@ -1131,6 +1139,7 @@ jupiter jupit@r | |||
kafee kaf'e@ | |||
kaliefa kal'ifa | |||
kameraderie kam@rA:d@r'i | |||
kapittel kap'It@l | |||
katswink katsv@nk | |||
kaviaar kavi'A:r | |||
kennisvaardig $1 | |||
@@ -1255,6 +1264,7 @@ onvermoë $1 | |||
oorkom $2 | |||
oorle o@rl@ | |||
oorleef $2 | |||
oorry o@reI | |||
oorsee $2 | |||
oorsese $2 | |||
oorval $2 $verb | |||
@@ -1282,6 +1292,7 @@ pirouette p@ru:'Et | |||
plaasjaap plA:sjA:p | |||
plasenta plas'Enta | |||
poinsettia pOIns'Etia | |||
pond po~nt | |||
potpourri pOtpur'i | |||
primate $2 | |||
profetes prOf@t'Es | |||
@@ -1408,6 +1419,7 @@ voluit fOl_Yyt | |||
voorgee fo@rx2e@ | |||
voorkeer $1 | |||
voorkom $2 $only | |||
voorlente $1 | |||
voormalige fo@rm'A:l@x2@ | |||
voornemens fo@rne@m@ns | |||
//voorsien $2 | |||
@@ -1428,5 +1440,6 @@ weggewens v&x2@v'E:ns | |||
welaf v&l_af | |||
weleer v&l_'e@r | |||
wentaktiek $1 | |||
willens vIl@ns | |||
wysgere veIsx2e@r@ | |||
@@ -430,6 +430,7 @@ | |||
bonde (C bOnd@ // verbondenheid/bondeldraer/gebondene/saambondelend | |||
boos (aardig b%o@s_ // move default stress: boosaardig/-e/-heid | |||
_) bor (dA@ b%Or // geborduur/bordeel/bordele | |||
borde (r bOrd@ // fix stress and e sound: borderak/-ke | |||
bos (A@ bOs? // bosaap/bosoorlog/bosuil | |||
bo (v bo@ // fix o sound: bovlak/-e and similar | |||
bowen bo@v@n' // bowenal/bowendien | |||
@@ -587,6 +588,7 @@ | |||
bene (dy b%e@n@ // fix stress and e sounds: gebenedy/-de | |||
_) ben (ga b%EN // fix stress and n/g sounds: Bengaalse/Bengale | |||
beni (g be@n@ // fix stress and e sound: (swaar/twee/vier)benig, etc. | |||
_) ben (Cien b%En // fix 1st e sound: bensien/benzien and compounds | |||
ber (lyn b%&r // move default stress: Berlyn/-er/-se | |||
ber (serk b@r // fix stress and 1st e sound: berserk/-er | |||
C) be (rsie b'&: //kombersie etc. | |||
@@ -718,6 +720,7 @@ | |||
d (d | |||
dd d // gladde/midde/kudde/opskudding | |||
ddh d // Boeddha/boeddhisme | |||
@) d (raam t // fix d sound: draad-/skilpad-/standaardraam and compounds | |||
daad (werk d%A:t // move default stress: daadwerklik/-e | |||
daaren (te d%A:r@n // fix stress and e sound: daarenteen/daarenteë | |||
daarop (v d%A:r%Op // move default stress: daaropvolgend/-e | |||
@@ -727,6 +730,7 @@ | |||
dani (gh d'A:n@ // -hoedanigheid/hoedanighede/onderdanigheid | |||
@) dant d'ant // dant takes stress: kommandant/pruimedant | |||
@) dderd (_ d@rt // ontredderd, se rule: dd d | |||
@) d (einde_ t_ // fix d sound: maand-/noord-/suideinde | |||
@) d (eis t_ // fix d sound, insert pause: skuldeiser/grondeise and many compounds | |||
dge (_ _^_EN // words ending in -dge are English: Cambridge/Hambidge... | |||
dia (C d%i%a // diabeet/diafragma/diagnose/dialek/dialoog/diamant | |||
@@ -1756,7 +1760,7 @@ | |||
geldi x2&ld@ | |||
geld (inC x2<_ // fix d sound, pause: geldinkomste/-insamelaar/-insameling, etc. | |||
geld (ing x2&ld // but: ver-/ontgelding and similar | |||
geldjie x2'&lci | |||
geldjie x2&lci // spaargeldjies | |||
_) gelykeni (s x2@l'eIk@n@ // gelykenis/se | |||
gemmer x2'Em@r | |||
ge (ogra x2i //geografie etc. | |||
@@ -2947,12 +2951,14 @@ | |||
_) na (latig n%A: // move default stress: nalatig/-e/-heid | |||
names nA:m@s // fix e sound: afnames/opnames | |||
napole (ont n%ap%o@l%i // fix stress and vowel sounds: Napoleonties/-e | |||
napo (leon n%apo@ // fix stress and a sound: Napoleon(magte/-troepe...) | |||
_) na (rC na // nartjie/nardus/narsing | |||
_) na (rk n%a // narkose/narkotiseer/narkoties/narkotika | |||
_) na (skeer n''A: // restore default stress: naskeermiddel/-room | |||
_) na (speur n%A: // fix stress and a sound: (on)naspeurbaar/-lik/-e | |||
_) na (speur_N nA: // but default stress: naspeur | |||
_) na (tC na // many compounds beginning with nat | |||
_) na (trekK nA: // fix stress and a sound: natrek/-ke | |||
na (trium nA: // lengthen a sound: natrium and compounds | |||
na (trosK nA: // lengthen a sound: natros/-se/-sies | |||
na (tuur n%a // natuur and compounds and derivatives | |||
@@ -3053,6 +3059,7 @@ | |||
o (terap u // psigo-/fisioterapeut | |||
_) ob (s %Op // obskuur/obskure/obskuriteit/obsessie/obseen | |||
obser (veer %Ops%&r // fix stress, b sound: (ge)observeer(d/-e) | |||
obsti (na %Opst@ // fix stress and i sound: obstinaat/-nate/-naatheid | |||
C) o (dium o@ // fix stress and o sound: jodium/podium/rodium and their compounds | |||
oe u | |||
oe (r u: //long oe sound before r in most cases, but see flg. exceptions: | |||
@@ -3603,6 +3610,7 @@ | |||
pa (trA p%a // patrollie/patroon/patrys | |||
patri (@ p%atr%i // move default stress: patriarg/patriot/-te and derivatives | |||
patriar (ga p%atr%i%ar // move default stress: patriargaal/-gale | |||
patro (lle p%atr%u // fix stress and o sound: patrolleer and compounds | |||
paté p%ate@ // fix stress and vowel sounds: (lewer)paté, etc. | |||
pavil (joe p%av@l // fix stress and v sound: paviljoen and compounds | |||
pawil (joe p%av@l // fix stress: pawiljoen and compounds |
@@ -1,6 +1,4 @@ | |||
// PB = Peter Bjarkov - [email protected] | |||
iv $abbrev | |||
// PB = Peter Bjarkov - [email protected] | |||
// This file is UTF8 encoded | |||
// Spelling-to-phoneme words for Danish | |||
@@ -92,15 +90,15 @@ __ b'Onsdrai | |||
// numbers | |||
_0 'nOl | |||
_1 'e:n | |||
_2 t'o: | |||
_3 tR'&: | |||
_2 t'o | |||
_3 tR'e | |||
_4 f'i:V | |||
_5 f'Em | |||
_6 s'Egs | |||
_7 s'yw | |||
_8 'O:d@ | |||
_9 n'i: | |||
_10 t'i: | |||
_9 n'i | |||
_10 t'i | |||
_11 'Elv@ | |||
_12 t'Vl | |||
_13 tR'&#d@-n // PB & changed to &# | |||
@@ -119,6 +117,7 @@ _7X h&lfj'&rs // PV a changed to & | |||
_8X f'irs | |||
_9X h&lf'Ems // PB a changed to & | |||
_0C h'un*@:D | |||
_1C ed||h'unR@:D // PB addet 'et hundrede' | |||
_0M1 t'u:s@-n | |||
_1M1 ed||t'u:s@-n // PB added 'et' to tusind | |||
_1M2 'e:n||milij'o:n | |||
@@ -130,8 +129,6 @@ _0M4 bilij'o:n3 | |||
_0and 3 | |||
_dpt _k,Vm&: | |||
_roman d%En | |||
// PB a number followed by dot | |||
// ordinals are followed by a dot in Danish | |||
@@ -178,7 +175,6 @@ mens $pause // while | |||
for fV | |||
fordi fVd'i $pause // because - PB: changed stress | |||
når nVr $pause // while | |||
som $u+ $pause // who (relative) | |||
der d&r $u+ $u // PB changed from [d]A | |||
hvor v'Vr // where | |||
hvorfor vVf'V // why - firan r deleted | |||
@@ -196,7 +192,7 @@ ad &: // PB added 'ad' | |||
ad &D $atend $sentence // PB "Det må ikke skille os ad." | |||
at &: $u // PB changed from [at] to [&:] | |||
hos // at - PB: removed [$u+] | |||
som sVm // which / that - PB: removed [$u+] | |||
som sVm $u // which / that - PB: removed [$u+] | |||
// pronouns | |||
jeg jai $u+ // I | |||
@@ -209,13 +205,13 @@ dét de | |||
vi $u | |||
i _i $u+ | |||
mig maj $u // me | |||
dig daj $u | |||
dig daj $u+ | |||
dem $u | |||
ham $u | |||
hende $u | |||
sig $u | |||
os Vs $u | |||
jer | |||
os Vs $u+ | |||
jer $u | |||
denne $u+ // this | |||
dette $u+ | |||
disse $u+ // these | |||
@@ -256,12 +252,12 @@ må $u+ // may | |||
bør $u+ // ought | |||
// letter names | |||
b be: | |||
c se: | |||
d de: | |||
b be | |||
c se | |||
d de | |||
_e e: | |||
f Ef | |||
g ge: | |||
g ge | |||
h hO: | |||
_i i: | |||
j jVD // PB changed from [o] | |||
@@ -270,13 +266,13 @@ l El | |||
m Em | |||
n En | |||
o o | |||
p pe: | |||
q ku: | |||
p pe | |||
q ku | |||
r Er | |||
s es | |||
//t te: mooved to da_rules because of clash with T-shirt | |||
u u? | |||
v ve: | |||
v ve | |||
w d'Vbeltve: | |||
x Eks | |||
y Y? | |||
@@ -286,7 +282,6 @@ z sEt | |||
// PB English words | |||
bacon _^_EN | |||
bondage _^_EN | |||
baseball _^_EN | |||
volleyball _^_EN | |||
dj _^_EN | |||
deadline _^_EN | |||
@@ -2761,6 +2756,52 @@ vanadium $alt | |||
vivarium $alt | |||
vokabularium $alt | |||
// PB nouns with final -um - stress on previous syllable | |||
basilikum $alt | |||
curriculum $alt | |||
dekorum $alt | |||
depositum $alt | |||
desideratum $alt | |||
epicentrum $alt | |||
erratum $alt | |||
faktotum $alt | |||
filosofikum $alt | |||
futurum $alt | |||
gummiarabicum $alt | |||
interregnum $alt | |||
jubilæum $alt | |||
karakteristikum $alt | |||
karbolineum $alt | |||
karborundum $alt | |||
kemoterapeutikum $alt | |||
kompositum $alt | |||
konsum $alt | |||
kuriosum $alt | |||
linoleum $alt | |||
mausoleum $alt | |||
memorandum $alt | |||
momentum $alt | |||
museum $alt | |||
narkotikum $alt | |||
neolitikum $alt | |||
opossum $alt | |||
palæolitikum $alt | |||
perfektum $alt | |||
perikum $alt | |||
periodikum $alt | |||
petitum $alt | |||
petroleum $alt | |||
postscriptum $alt | |||
præteritum $alt | |||
psykofarmakum $alt | |||
pædagogikum $alt | |||
referendum $alt | |||
responsum $alt | |||
supinum $alt | |||
tedeum $alt | |||
ultimatum $alt | |||
vademecum $alt | |||
// PB nouns with final -ie - stress on previous syllable | |||
// unofficial suffix for the "ium" words above | |||
adverbie $alt | |||
@@ -2935,6 +2976,24 @@ rimesse $alt | |||
stewardesse $alt | |||
tristesse $alt | |||
final -ese - stressed e | |||
anamnese $alt | |||
askese $alt | |||
diatese $alt | |||
diurese $alt | |||
eksegese $alt | |||
fylogenese $alt | |||
genese $alt | |||
hypotese $alt | |||
katakrese $alt | |||
kinese $alt | |||
ontogenese $alt | |||
parese $alt | |||
partenogenese $alt | |||
patogenese $alt | |||
protese $alt | |||
syntese $alt | |||
PB final -id - stressed i | |||
adenoid $alt | |||
alkaloid $alt | |||
@@ -5176,7 +5235,7 @@ bivuaker $alt | |||
blamer $alt | |||
blancher $alt | |||
bloker $alt | |||
bogstaver $alt | |||
bogstavere $alt | |||
bombarder $alt | |||
bonbonniere bVNbVNj'E:r $alt | |||
boniter $alt | |||
@@ -5836,7 +5895,7 @@ konvojere $alt | |||
konvoluter $alt | |||
kooperer $alt | |||
koordiner $alt | |||
kopier $alt | |||
kopiere $alt | |||
kopuler $alt | |||
koreografer $alt | |||
korreler $alt | |||
@@ -5872,7 +5931,7 @@ kurer $alt | |||
kursere $alt | |||
kursiver $alt | |||
kurtiser $alt | |||
kuverter $alt | |||
kuvertere $alt | |||
kvadrer $alt | |||
kvaksalverer $alt | |||
kvalificer $alt | |||
@@ -6090,7 +6149,7 @@ patruljere $alt | |||
pausere $alt | |||
pelleter $alt | |||
pendulere $alt | |||
pensioner $alt | |||
pensionere $alt | |||
perciper $alt | |||
perfektioner $alt | |||
perforer $alt | |||
@@ -6108,7 +6167,7 @@ perverter $alt | |||
petitioner $alt | |||
pigmenter $alt | |||
piker $alt | |||
piloter $alt | |||
pilotere $alt | |||
pioner $alt | |||
pipetter $alt | |||
pirater $alt | |||
@@ -6264,7 +6323,7 @@ rekommander $alt | |||
rekompenser $alt | |||
rekonvalescer $alt | |||
rekreer $alt | |||
rekrutter $alt | |||
rekruttere $alt | |||
rektificer $alt | |||
rektoskoper $alt | |||
rekurrer $alt | |||
@@ -6538,7 +6597,7 @@ triumfere $alt | |||
trivialiser $alt | |||
trompeter $alt | |||
trunker $alt | |||
trænere $alt | |||
//trænere $alt | |||
tunneler $alt | |||
turner $alt | |||
tuscher $alt | |||
@@ -6550,7 +6609,6 @@ uniformer $alt | |||
urbaniser $alt | |||
urger $alt | |||
uriner $alt | |||
urpremier $alt | |||
usurper $alt | |||
vacciner $alt | |||
vagabonder $alt | |||
@@ -10385,10 +10443,10 @@ chevrolet sjEvrol'e | |||
saigon sajg3-n // PB Saigon | |||
managua m&n'&:gw& | |||
(deja-vu) deSja||'vy | |||
(il duce) il||d'u:tSj@ // PB Italian faschist | |||
(il duce) il||d'u:tSj@ // PB Italian Fascist | |||
// Abbreviations | |||
pga pOgR'O?n'a? $hasdot // PB short for 'på grund af' | |||
pga pO||gR'O?n||& $hasdot // PB short for 'på grund af' | |||
hr h&r $hasdot // PB hr. - short for mister (Mr) in Danish | |||
mr mestV $hasdot // PB mister | |||
mrs meses $hasdot // PB Mrs. | |||
@@ -10397,14 +10455,21 @@ fx fVegsemp@l // PB "fx" is short for 'for eksempel' | |||
(f.eks) fVegsemp@l $hasdot // PB "f.eks" is short for 'for eksempel' | |||
(dj'en) di:'dje:j3n // *PB dj'en - the dj | |||
(dj'er) di:'dje:jV // *PB dj'er | |||
(tv'et) te:ve:@d // PB | |||
(tv'er) te:ve:V // PB | |||
(cd'en) se:de:3n // PB | |||
(cd'er) se:de:V // PB | |||
emp $abbrev | |||
usa $abbrev | |||
who $abbrev $allcaps // PB World Health Organization | |||
vsop $abbrev | |||
eu $abbrev | |||
co $abbrev $allcaps // PB for CO2-kvote | |||
ngo $abbrev | |||
edb $abbrev | |||
wc v'ese // w is pronounces as v in Danish | |||
(wc'et) v'ese@d | |||
(wc'er) v'eseV | |||
(wc'erne) v'eseVn@ | |||
(wc'ernes) v'eseVn@s | |||
it $abbrev | |||
id $abbrev | |||
dna $abbrev | |||
@@ -10476,7 +10541,7 @@ legenderne leg'EndVn3s | |||
(så langt) sV||l'ANt | |||
(så vil) sV||v'el | |||
(så højt) sV||h'Vjt | |||
(så var) sV||v'Ar | |||
(så var) sV||v'Ar | |||
(så længe) sV||l'EN3 | |||
(så må) sV||m'O | |||
(så har) sV||har | |||
@@ -10484,4 +10549,5 @@ så sV $sentence $atstart | |||
(virkede så) v'irkeD@||sV | |||
(kom så) kVm||sV | |||
(koste med) kosd@||mED | |||
(en kanoner) en||k&non'er | |||
(en kanoner) en||k&non'er | |||
nå nV $atstart // PB Nå, der er du |
@@ -1,7 +1,7 @@ | |||
Phonemes which are used in the *_rules and *_list files | |||
Dictionary af_dict 2010-05-24 | |||
Dictionary af_dict 2010-08-03 | |||
& &: 3: @ @- @L @U a | |||
A: aI AI aU A~ E e: e@ | |||
@@ -53,7 +53,7 @@ p r s S t T v w | |||
x z | |||
Dictionary da_dict 2010-07-29 | |||
Dictionary da_dict 2010-08-11 | |||
& &# 0 3 @ @- a A | |||
e E i o O u V W | |||
@@ -65,7 +65,7 @@ l/2 l/3 m n N p r R | |||
s S t T tS v w z | |||
Dictionary hu_dict 2010-08-02 | |||
Dictionary hu_dict 2010-08-13 | |||
A a: E e: i i: o o: | |||
u u: Y y y: Y: | |||
@@ -100,7 +100,7 @@ n^ p Q r R s s; t | |||
T ts v x z z; | |||
Dictionary en_dict 2010-07-30 | |||
Dictionary en_dict 2010-08-11 | |||
0 3 3: @ @- @2 @5 @L | |||
a a# A: A@ aa aI aI@ aU | |||
@@ -150,7 +150,7 @@ l m n N p r s S | |||
s2 t v w Z | |||
Dictionary fr_dict 2010-07-30 | |||
Dictionary fr_dict 2010-08-06 | |||
@ @- a A~ e E E: E~ | |||
i I o O O~ u u: w | |||
@@ -200,7 +200,7 @@ q r r. s S s. t T | |||
t. th th. v w x z | |||
Dictionary ta_dict 2010-07-30 | |||
Dictionary ta_dict 2010-08-12 | |||
a a: aI aU e E e: i | |||
I i: o o: u U u2 u: | |||
@@ -325,7 +325,7 @@ k l m n p R s S | |||
t tS v w x | |||
Dictionary nl_dict 2010-07-27 | |||
Dictionary nl_dict 2010-08-13 | |||
8 @ @- A a: A~ E e: | |||
EI eU i I O O: o: u | |||
@@ -366,10 +366,10 @@ a E E# E~ i O O~ u | |||
y | |||
: ; b c C d d; dZ | |||
dz f g h j k l m | |||
n N n^ p r R s S | |||
s; S; t t; tS ts tS; v | |||
w x z Z Z; | |||
dz dz; f g h j k l | |||
m n N n^ p r R s | |||
S s; S; t t; tS ts tS; | |||
ts; v w x z Z Z; | |||
Dictionary pt_dict 2010-07-03 | |||
@@ -611,10 +611,11 @@ Dictionary bg_dict 2010-05-19 | |||
@ a e i o u | |||
; b C d d; dZ dz f | |||
g j k l L l^ m n | |||
n^ p r s S s; t t; | |||
tS ts v x z Z z; | |||
; b C d d; dZ dz dz; | |||
f g j k l L l^ m | |||
n n^ p r s S s; t | |||
t; tS ts ts; v x z Z | |||
z; | |||
Dictionary nso_dict 2010-05-26 | |||
@@ -638,6 +639,16 @@ m n N p r s S t | |||
tS v z Z | |||
Dictionary ak_dict 2010-08-11 | |||
a e E i o O u | |||
: b C d dZ dZ; f g | |||
h j k l m n N n^ | |||
p R s t tS; v w z | |||
z; | |||
Dictionary az_dict 2010-07-27 | |||
& @ a e E i o u |
@@ -291,16 +291,16 @@ _17 s'Ev@nti:n | |||
?7 _17 s'@v@nti:n | |||
_18 'eIti:n | |||
_19 n'aInti:n | |||
_2X tw'EntI | |||
_3X T'3:tI | |||
?5 _3X T'IRtI | |||
_4X f'o@tI | |||
_5X f'IftI | |||
_6X s'IkstI | |||
_7X s'Ev@ntI | |||
?7 _7X s'@v@ntI | |||
_8X 'eItI | |||
_9X n'aIntI | |||
_2X tw'Enti | |||
_3X T'3:ti | |||
?5 _3X T'IRti | |||
_4X f'o@ti | |||
_5X f'Ifti | |||
_6X s'Iksti | |||
_7X s'Ev@nti | |||
?7 _7X s'@v@nti | |||
_8X 'eIti | |||
_9X n'aInti | |||
_0C h'Vndr@d | |||
_0M1 T'aUz@nd | |||
_0M2 m'Ili@n | |||
@@ -2648,6 +2648,7 @@ Donaghy d0n'hi: | |||
Doris d0rIs | |||
Dorothy dO@r@Ti | |||
Dougall du:g@L | |||
Duncan dVnk@n | |||
Dvina d@vi:n@ | |||
Dylan dIl@n | |||
Edith i:dIT | |||
@@ -2784,7 +2785,7 @@ Theresa t@ri:z@ | |||
Therese t@ri:z | |||
Thomas t0m@s | |||
Tina ti:n@ | |||
Tracy treIsI | |||
Tracy treIsi | |||
Tricia trIS@ | |||
Vanessa va#nEs@ | |||
Wally w0lI |
@@ -253,7 +253,7 @@ | |||
accu (ra akjU | |||
accus (A a#kju:z | |||
ace (_ eIs | |||
sp) ac (e eIs | |||
sp) ac (e# eIs | |||
_r) ac (e eIs | |||
_) ac (e a#s | |||
_r) ac (is eIs | |||
@@ -2815,7 +2815,7 @@ | |||
ie (ve i: | |||
s) ie (ve I | |||
ie (z i: | |||
_t) ie aI | |||
_t) ie (B aI | |||
.group ig | |||
am) ig (a_ i:g |
@@ -27,7 +27,7 @@ | |||
// http://www.fluxnic.net/cicero | |||
// | |||
// Rules are now maintained by Michel Such <[email protected]> | |||
// Last update: 2010-07-30 Michel Such <[email protected]> | |||
// Last update: 2010-08-01 Michel Such <[email protected]> | |||
// | |||
// Letter classes: | |||
@@ -70,6 +70,7 @@ | |||
// For english words ending "side" | |||
.L14 be in up ut | |||
.L15 c f g h l s | |||
@@ -153,6 +154,7 @@ _C) aud (_ od // Maud | |||
// group b: English section | |||
back _^_en | |||
_) be (L15A _^_en | |||
board _^_en // board, keyboard | |||
box (_ _^_en // box, inbox, outbox | |||
bugg _^_en // debugger | |||
@@ -1462,7 +1464,7 @@ C) ult (_ _^_en | |||
_C) y (_ _^_en | |||
C) y (e_ _^_en | |||
%C) y (_ _^_en | |||
//@CAC) y (_ _^_en | |||
@CeC) y (_ _^_en | |||
nC) y (_ _^_en | |||
yze _^_en | |||
@@ -156,6 +156,8 @@ _#-ika A | |||
_#-ikai Ai | |||
_#-éhez e:hEz | |||
_#-ához a:hoz | |||
_#-ikének e:nEk | |||
_#-ikának a:nAk | |||
(1-e) elseje $text $alt2 | |||
(1-én) elsején $text $alt2 | |||
(1-jén) elsején $text $alt2 | |||
@@ -233,6 +235,7 @@ _#-ához a:hoz | |||
(00-tól) nul:Anul:a:to:l | |||
(0-n) nul:a:n | |||
(00-n) nul:Anul:a:n | |||
(0-ról) nul:a:R2o:l | |||
(1-gyet) EJ:Et | |||
(1-gyes) EJ:ES | |||
(2-őt) kEt:Y:t | |||
@@ -263,6 +266,7 @@ _#-ához a:hoz | |||
(5-től) Yt:Y:l | |||
(5-től) YtYdike:tY:l $alt2 | |||
(5-t) YtYt | |||
(5-ször) Yts:YR2 | |||
(6-al) hAt:Al | |||
(6-tal) hAt:Al | |||
(6-tól) hAt:o:l | |||
@@ -282,7 +286,7 @@ _10e tiz | |||
_20e hus | |||
(10-szer) ti:s:ER2 | |||
(10-szeres) ti:s:ER2ES | |||
(10-t) tizEt | |||
//special number exceptions | |||
@@ -362,6 +366,9 @@ nyári $alt | |||
téli $alt | |||
végén $alt | |||
elején $alt | |||
folyamán $alt | |||
úton $alt | |||
út $alt | |||
// accent names | |||
_lig ligAtu:R2A | |||
@@ -595,7 +602,7 @@ vel $unstressend | |||
ellen $unstressend // against | |||
//elé $u // before | |||
óta $alt $alt3 // since. Not a bug both $alt $alt3 attribute, | |||
óta $unstressend $alt $alt3 // since. Not a bug both $alt $alt3 attribute, | |||
//because if only a year is present, need spokening normal number, not | |||
//ordinal number. For example: | |||
//2004. óta meaning since 2004 and need spokening normal number. | |||
@@ -865,7 +872,7 @@ látszik $unstressend | |||
látszott $unstressend | |||
látszanak $unstressend | |||
látszotok $unstressend | |||
körül $unstressend $alt3 | |||
körül $unstressend $alt $alt3 | |||
dőlt $unstressend | |||
vér $unstressend | |||
sót $unstressend | |||
@@ -1052,7 +1059,125 @@ ház $unstressend | |||
állnak $unstressend | |||
idején $unstressend | |||
néznek $unstressend | |||
érezte $unstressend | |||
sért $unstressend | |||
adózású $unstressend | |||
kötelezni $unstressend | |||
lehetőség $unstressend | |||
mondtuk $unstressend | |||
kellene $unstressend | |||
szerte $unstressend | |||
hozta $unstressend | |||
kezdte $unstressend | |||
lökte $unstressend | |||
benne $unstressend | |||
fenn $unstressend | |||
elő $unstressend | |||
javasolták $unstressend | |||
kezdjen $unstressend | |||
látta $unstressend | |||
látták $unstressend | |||
nyomát $unstressend | |||
került $unstressend | |||
várták $unstressend | |||
közbe $unstressend | |||
látott $unstressend | |||
tartanak $unstressend | |||
ejt $unstressend | |||
önnek $unstressend | |||
álljon $unstressend | |||
szálljon $unstressend | |||
üljön $unstressend | |||
jónak $unstressend | |||
hisz $unstressend | |||
elől $unstressend | |||
vágy $unstressend | |||
vitték $unstressend | |||
küldött $unstressend | |||
mentén $unstressend | |||
venni $unstressend | |||
múlik $unstressend | |||
indít $unstressend | |||
nála $unstressend | |||
vizsgálata $unstressend | |||
vizsgálatot $unstressend | |||
indítottak $unstressend | |||
vizsgált $unstressend | |||
javult $unstressend | |||
része $unstressend | |||
írni $unstressend | |||
téren $unstressend | |||
terén $unstressend | |||
menni $unstressend | |||
fogja $unstressend | |||
teszik $unstressend | |||
tömni $unstressend | |||
nyel $unstressend | |||
érzi $unstressend | |||
annak $unstressend | |||
dolog $unstressend | |||
számít $unstressend | |||
aránya $unstressend | |||
helyzetük $unstressend | |||
kifogásolták $unstressend | |||
kifogásolta $unstressend | |||
fogalmaz $unstressend | |||
szóló $unstressend | |||
gyártott $unstressend | |||
írta $unstressend | |||
rúgták $unstressend | |||
esett $unstressend | |||
marad $unstressend | |||
tulajdonú $unstressend | |||
KFT $unstressend | |||
folytatja $unstressend | |||
államokban $unstressend | |||
című $unstressend | |||
senkit $unstressend | |||
abban $unstressend | |||
tegyük $unstressend | |||
szar $unstressend | |||
gond $unstressend | |||
megy $unstressend | |||
ebből $unstressend | |||
abból $unstressend | |||
ebben $unstressend | |||
mondom $unstressend | |||
akar $unstressend | |||
akarsz $unstressend | |||
távra $unstressend | |||
jog $unstressend | |||
járunk $unstressend | |||
szólni $unstressend | |||
ró $unstressend | |||
kérni $unstressend | |||
építést $unstressend | |||
adni $unstressend | |||
részén $unstressend | |||
érni $unstressend | |||
lap $unstressend | |||
írja $unstressend | |||
írtak $unstressend | |||
stressz $unstressend | |||
nyújtózni $unstressend | |||
éve $unstressend | |||
tartott $unstressend | |||
attól $unstressend | |||
utast $unstressend | |||
szint $unstressend | |||
minőségű $unstressend | |||
beszélt $unstressend | |||
kerületben $unstressend | |||
gáz $unstressend | |||
épült $unstressend | |||
építésű $unstressend | |||
együttes $unstressend | |||
távon $unstressend | |||
híg $unstressend | |||
szőr $unstressend | |||
diagnosztizálható $unstressend | |||
működik $unstressend | |||
hat $unstressend | |||
mutatnak $unstressend | |||
// word pairs | |||
@@ -1074,10 +1199,10 @@ vannak $unstressend | |||
voltam $u // to be, past | |||
voltál $u | |||
volt $u $alt3 | |||
volt $unstressend $alt3 | |||
voltunk $u | |||
voltatok $u | |||
voltak $u | |||
voltak $unstressend | |||
leszek $u // to be, future | |||
leszel $u | |||
@@ -1296,4 +1421,4 @@ CD-m) cédém | |||
(hu-n) hun | |||
(USA-ban) usában | |||
(USA-ba) usába | |||
(pc-n) pécén |
@@ -45,6 +45,8 @@ | |||
tö) bb (féle b | |||
jo) bbr (a bR2 | |||
tö) bbr (e bR2 | |||
kise) bb (ség b | |||
.group c | |||
c ts | |||
@@ -220,6 +222,7 @@ menetren) dsz (erű d|s | |||
cselé) ds (ég tS: | |||
föl) d (szegély d | |||
stran) d (szezon d | |||
_hol) d (sarló d | |||
.group dz | |||
fogó) dz (kod ts | |||
@@ -332,6 +335,7 @@ ritkasá) g (gyűjt g | |||
se) gg (be g | |||
pro) g (gyak g | |||
se) ggr (e gR2 | |||
arcüre) g (gyulladás g | |||
.group gy | |||
gy J | |||
@@ -425,6 +429,7 @@ tizene) gy (en J: | |||
huszone) gy (edik J: | |||
je) gy (ért J | |||
harmince) gy (edik J: | |||
étvá) gy (javít J | |||
.group h | |||
h h | |||
@@ -863,6 +868,7 @@ kitöré) ssz (erű Ss | |||
hirdeté) ssz (erve Ss | |||
páncélo) ssz Ss | |||
hajtá) ssz (erű Ss | |||
sorva) ssz (ák s: | |||
.group sz | |||
sz s | |||
@@ -1114,6 +1120,9 @@ művele) t (sáv t | |||
ö) t (jegyű t | |||
ha) t (jegyű t | |||
hé) t (jegyű t | |||
zár) t (sorú t | |||
skó) t (juhász t | |||
szerete) t (szolgálat t | |||
.group ts | |||
ts (_S2 tS //general rule with word end of ts letters |
@@ -317,10 +317,12 @@ anker $alt | |||
badder $alt | |||
bagger $alt | |||
baker $alt | |||
baster $alt | |||
beender $alt | |||
belemmer $alt | |||
beter $alt | |||
bibber $alt | |||
bitter $alt | |||
bladder $alt | |||
blader $alt | |||
blaker $alt | |||
@@ -330,84 +332,296 @@ blunder $alt | |||
bolder $alt | |||
bolster $alt | |||
boter $alt | |||
broeder $alt | |||
buffer $alt | |||
bulder $alt | |||
bulldozer $alt | |||
bumper $alt | |||
bunker $alt | |||
charter $alt | |||
cijfer $alt | |||
cluster $alt | |||
computer kOmpj'ut@r $alt // ?? "$2 $alt" doesn't work | |||
consuminder $alt | |||
counter $alt | |||
cover k8v@r $alt | |||
dabber $alt | |||
daver $alt | |||
deemstar $alt | |||
dender $alt | |||
dobber $alt | |||
dokter $alt | |||
donder $alt | |||
donker $alt | |||
dotter $alt | |||
duister $alt | |||
dwater $alt | |||
eergister $alt | |||
eier $alt | |||
emmer $alt | |||
ender $alt | |||
enter $alt | |||
erger $alt | |||
etter $alt | |||
filter $alt | |||
fladder $alt | |||
flakker $alt | |||
flikker $alt | |||
flipper $alt | |||
flodder $alt | |||
flonker $alt | |||
flotter $alt | |||
fluister $alt | |||
foeter $alt | |||
folder $alt | |||
folter $alt | |||
gabber $alt | |||
gader $alt | |||
geester $alt | |||
gemoeder $alt | |||
gibber $alt | |||
gister $alt | |||
glibber $alt | |||
glimmer $alt | |||
glinster $alt | |||
glitter $alt | |||
glunder $alt | |||
halter $alt | |||
hamer $alt | |||
hamster $alt | |||
haper $alt | |||
helder $alt | |||
herinner $alt | |||
herover $alt | |||
hinder $alt | |||
hoender $alt | |||
honger $alt | |||
huiver $alt | |||
hunker $alt | |||
ijver $alt | |||
ijzer $alt | |||
imker $alt | |||
inburger $alt | |||
inkader $alt | |||
jakker $alt | |||
jammer $alt | |||
joeker $alt | |||
kader $alt | |||
kaffer $alt | |||
kalefater $alt | |||
kalver $alt | |||
kamfer $alt | |||
kanker $alt | |||
kaper $alt | |||
kaver $alt | |||
keilder $alt | |||
kenter $alt | |||
keper $alt | |||
kerker $alt | |||
ketter $alt | |||
keuter $alt | |||
kicker $alt | |||
kieper $alt | |||
kinder $alt | |||
kladder $alt | |||
klapper $alt | |||
klater $alt | |||
klauter $alt | |||
klaver $alt | |||
kledder $alt | |||
klepper $alt | |||
kletter $alt | |||
kleuter $alt | |||
klieder $alt | |||
klinker $alt | |||
klodder $alt | |||
kluister $alt | |||
knapper $alt | |||
knetter $alt | |||
kneuter $alt | |||
knikker $alt | |||
knipper $alt | |||
knisper $alt | |||
knister $alt | |||
koekeloer $alt | |||
koester $alt | |||
koeter $alt | |||
koffer $alt | |||
koker $alt | |||
kolder $alt | |||
kommer $alt | |||
koper $alt | |||
kuier $alt | |||
kwetter $alt | |||
labber $alt | |||
lager $alt | |||
lammer $alt | |||
laser $alt | |||
laster $alt | |||
lauwer $alt | |||
lazer $alt | |||
lebber $alt | |||
leder $alt // gelederen | |||
leger $alt | |||
lekker $alt | |||
lemmer $alt | |||
lepper $alt | |||
ler $alt | |||
letter $alt | |||
leuter $alt | |||
lever $alt | |||
lieder $alt | |||
lobber $alt | |||
lodder $alt | |||
lommer $alt | |||
louter $alt | |||
lubber $alt | |||
luier $alt | |||
luimer $alt | |||
luister $alt | |||
mager $alt | |||
marmer $alt | |||
meander $alt | |||
meerder $alt | |||
meester $alt | |||
meier $alt | |||
mekker $alt | |||
mieter $alt | |||
mijmer $alt | |||
millimeter $alt | |||
minder $alt | |||
modder $alt | |||
moeder $alt | |||
moker $alt | |||
monster $alt | |||
mopper $alt | |||
nader $alt | |||
neder $alt | |||
nuchter $alt | |||
nummer $alt | |||
ober $alt | |||
offer $alt | |||
onder $alt | |||
orber $alt | |||
ouder $alt | |||
over $alt | |||
palaver $alt | |||
pantser $alt | |||
pauper $alt | |||
peiger $alt | |||
peper $alt | |||
peuter $alt | |||
pieker $alt | |||
pieter $alt | |||
pinkster $alt | |||
pleister $alt | |||
pletter $alt | |||
ploeter $alt | |||
plunder $alt | |||
poeder $alt | |||
poeier $alt | |||
poker $alt | |||
polder $alt | |||
puber $alt | |||
pulver $alt | |||
purper $alt | |||
rader $alt | |||
raster $alt | |||
redder $alt | |||
ridder $alt | |||
rooster $alt | |||
rubber $alt | |||
ruiter $alt | |||
runder $alt | |||
sakker $alt | |||
schamper $alt | |||
schater $alt | |||
schemer $alt | |||
schetter $alt | |||
schilder $alt | |||
schipper $alt | |||
schitter $alt | |||
schouder $alt | |||
schutter $alt | |||
sidder $alt | |||
sjacher $alt | |||
skeeler $alt | |||
skelter $alt | |||
slechter $alt | |||
slenter $alt | |||
slidder $alt | |||
slinger $alt | |||
slobber $alt | |||
slodder $alt | |||
sloeber $alt | |||
sluier $alt | |||
sluimer $alt | |||
snater $alt | |||
snipper $alt | |||
snotter $alt | |||
snuister $alt | |||
sober $alt | |||
sodemieter $alt | |||
somber $alt | |||
spetter $alt | |||
spijker $alt | |||
splinter $alt | |||
sputter $alt | |||
steiger $alt | |||
stekker $alt | |||
stotter $alt | |||
stuiter $alt | |||
stumper $alt | |||
sudder $alt | |||
suiker $alt | |||
supporter $alt | |||
tater $alt | |||
teder $alt | |||
teister $alt | |||
temper $alt | |||
tetter $alt | |||
teuter $alt | |||
timmer $alt | |||
tover $alt | |||
treiter $alt | |||
trompetter $alt | |||
tuier $alt | |||
tutter $alt | |||
twitter $alt | |||
uier $alt | |||
vinger $alt | |||
vlieger $alt | |||
vlinder $alt | |||
vlotter $alt | |||
voeder $alt | |||
volker $alt | |||
vorder $alt | |||
waaier $alt | |||
wakker $alt | |||
wapper $alt | |||
water $alt | |||
wedijver $alt | |||
wegwijzer $alt | |||
wester $alt | |||
wijder $alt | |||
wilder $alt | |||
winter $alt | |||
wipper $alt | |||
woeker $alt | |||
wonder $alt | |||
zeker $alt | |||
zever $alt | |||
zilver $alt | |||
zinder $alt | |||
zolder $alt | |||
zomer $alt | |||
zonder $alt | |||
zuiver $alt | |||
zwabber $alt | |||
zwakker $alt | |||
zwanger $alt | |||
// words where -age is [a:Q@] not French ['a:Z@] | |||
drage $alt | |||
hedentendage $alt | |||
@@ -438,7 +652,6 @@ vrijage vre:j'a:Z@ | |||
aangrijpend $2 | |||
bourgondier burx'o:ndi:@r | |||
circuit sIrku'i | |||
computer $2 | |||
contour ko:nt'ur | |||
ingewikkeld $3 | |||
ingrijpend $2 |
@@ -116,6 +116,7 @@ | |||
_) ge (@P2 Q@ | |||
_) gee Qe: | |||
gener (aal Q,e:n@r | |||
gelijk Q@lEIk | |||
_) geu QY: | |||
_) ge (ven Qe: | |||
@@ -147,7 +148,8 @@ | |||
ie (rd_ 'i | |||
@) ig (_S2d @x | |||
@) ige (_ @Q@ | |||
_) in (gP2 'In | |||
_) in (C@P2 'In | |||
// _) in (gP2 'In | |||
io (nage iO | |||
@) isch (_ =is | |||
@) ische (_ =is@ | |||
@@ -178,6 +180,8 @@ | |||
m m | |||
mm m | |||
_) mee (@P3 m'e: | |||
.group n | |||
n n | |||
@@ -185,6 +189,8 @@ | |||
ng N | |||
nj n^ | |||
_) na (C@@P2 n'a: | |||
.group o | |||
o o: | |||
@@ -200,6 +206,9 @@ | |||
ou (rage u | |||
telef) oo (n 'o: | |||
_) op (@@P2 'Op | |||
_) open (@P4 'o:p@n | |||
_) over (@P4 'o:v@r | |||
.group on | |||
@@ -226,6 +235,7 @@ | |||
_) onge (val OnQ@ | |||
.group p | |||
p p | |||
pp p | |||
@@ -314,6 +324,8 @@ | |||
uw yU | |||
uw (_ yU | |||
_) uit (@P3 'Wyt | |||
.group v | |||
v v | |||
@@ -321,6 +333,7 @@ | |||
_) ver (@P3 v@r | |||
_) ver (sie_ vEr | |||
_) ver (der_ vEr | |||
_) voort (@P5 v'O:rt | |||
.group w | |||
@@ -328,6 +341,8 @@ | |||
w (X w | |||
w (CK w | |||
_) weg (@P3 v#'Ex | |||
.group x | |||
x ks |
@@ -186,7 +186,6 @@ tamil தமிழ் $text | |||
// exceptions | |||
பாபு $alt // initial ப as [b] | |||
பகவதி $alt | |||
பானம் $alt | |||
பாணம் $alt | |||
பாறம் $alt |
@@ -192,6 +192,7 @@ | |||
//sort | |||
அலை) க (டல kV | |||
சமையல்) க (ட் kV | |||
_கால) க (ட்ட kV | |||
_கல்) க (ண்ட kV | |||
_நற்) க (தி gV | |||
வீண்) க (தை kV | |||
@@ -215,6 +216,7 @@ | |||
வீண்) க (ஷ்ட kV | |||
ம) க (ா H | |||
_தாலு) க (ா k | |||
_வலை) க (ாப் k | |||
தொல்) க (ாப்பி k | |||
மூல) க (ாரண k | |||
அந்திம) க (ால k | |||
@@ -281,8 +283,6 @@ | |||
வி) க்ட (ோரியா kt. // victoria | |||
வி) க (்ரம k | |||
ஆ) க (்ரோஷ k | |||
_கால) க (ட்ட kV | |||
_வலை) க (ாப் k | |||
//endsort | |||
@@ -346,6 +346,7 @@ | |||
சீ (னிவாச sri: | |||
_) ச (ீன்_ s | |||
_ஈ) சு s | |||
_) சு (லோக s | |||
கே) சு (வ s | |||
மே) சு (வ s | |||
வி) சு (வ s | |||
@@ -571,6 +572,7 @@ | |||
_) த (ுரதிர்ஷ்ட d | |||
_) த (ுராசை d | |||
_) த (ுரியோதனன d | |||
_) த (ுரியோதனா d | |||
_) த (ுருவங் d | |||
_) த (ுருவத் d | |||
_) த (ுரை d | |||
@@ -622,6 +624,7 @@ | |||
_கீழ்) த (ட்ட tV | |||
_மேல்) த (ட்ட tV | |||
முட்டாள்) த (ன tV | |||
_கௌ) த (மி tV | |||
_கீ) த (ா t | |||
_சீ) த (ா t | |||
_ல) த (ா t | |||
@@ -688,7 +691,6 @@ _பார்வ) த (ி t | |||
ச) த (்ரு t | |||
த) த (்ரூப t | |||
பா) த (்ரூம t | |||
_கௌ) த (மி tV | |||
//endsort | |||
@@ -733,6 +735,7 @@ _பார்வ) த (ி t | |||
//sort | |||
_) ப (கவதி bV | |||
_) ப (கவான bV | |||
_) ப (காசுர bV | |||
_) ப (கிரங்க bV | |||
@@ -754,6 +757,7 @@ _பார்வ) த (ி t | |||
_) ப (த்திரமா bV | |||
_) ப (ந்தங்கள bV | |||
_) ப (ந்தத் bV | |||
_) ப (ந்தப் bV | |||
_) ப (ந்தம bV | |||
_) ப (ந்துக்கள bV | |||
_) ப (ந்துவ bV | |||
@@ -803,6 +807,7 @@ _பார்வ) த (ி t | |||
_) ப (ாகத b | |||
_) ப (ாகம b | |||
_) ப (ாக்கிய b | |||
_) பாக்த (ாத ba:gd | |||
_) ப (ாங்க் b | |||
_) ப (ாசு b | |||
_) ப (ாசுர p | |||
@@ -954,6 +959,7 @@ _முகத்தின்_) ப (ாவ b | |||
வட) ப (குதி pV | |||
தென்) ப (குதி pV | |||
ப (க்கK pV | |||
பரம) ப (க்த bV | |||
க) ப (ட bV | |||
கரம்) ப (ட pV | |||
ப (டி pV | |||
@@ -1033,6 +1039,8 @@ _முகத்தின்_) ப (ாவ b | |||
வீண்) ப (ேச்ச p | |||
ப (ேரில்_ p | |||
ப (ேர்_ p | |||
வன்) ப (ொருள் p | |||
மென்) ப (ொருள் p | |||
வீண்) ப (ொழுத p | |||
ப (ோக_ p | |||
ப (ோகவில்லை_ p | |||
@@ -1070,8 +1078,6 @@ _முகத்தின்_) ப (ாவ b | |||
மன) ப்பி (ரமை bb | |||
துர்) ப்ப (ோதனை bb | |||
கம்) ப்யூட (ர pjU:t.V | |||
மென்) ப (ொருள் p | |||
வன்) ப (ொருள் p | |||
//endsort | |||
// If ப+ appearing in the middle of a word is followed by ட+ | |||
@@ -1315,6 +1321,7 @@ _முகத்தின்_) ப (ாவ b | |||
.group இ | |||
//sort | |||
இ i | |||
_) இ (யேச | |||
_) இ (ரகசிய // silent | |||
_) இ (ரசாயன | |||
_) இ (ரத்த | |||
@@ -1355,10 +1362,14 @@ _முகத்தின்_) ப (ாவ b | |||
ஐ aI | |||
ஒ o | |||
ஒள (வை aU // bad scanning | |||
ஒள (ஷத aU | |||
ஒள (டத aU | |||
ஓ o: | |||
ஔ aU | |||
ஔி ol.i // for bad scanning of books | |||
// combining vowels | |||
@@ -1375,6 +1386,8 @@ _முகத்தின்_) ப (ாவ b | |||
ூ u: | |||
ெ e | |||
_ம) ெள (ன aU // bad scanning | |||
_ம) ெள (ஸ aU // bad scanning | |||
ே e: | |||
@@ -1385,6 +1398,7 @@ _முகத்தின்_) ப (ாவ b | |||
ோ o: | |||
ௌ aU | |||
_த) ௌி el.i // for bad scanning | |||
் // virama |
@@ -14,7 +14,7 @@ awareness of its features, patience and attention to detail. Wikipedia is a goo | |||
<a href="http://en.wikipedia.org/wiki/Vowel">http://en.wikipedia.org/wiki/Vowel</a> | |||
<P> | |||
In many cases it should be fairly easy to add a rough implementation of a new language, hopefully | |||
enough to be intelligible.<br> | |||
enough to be intelligible.<p> | |||
After that it's a gradual process of improvement to: | |||
<ul> | |||
<li>Make the spelling-to-phoneme translation rules more accurate, including the position of stressed |
@@ -89,8 +89,8 @@ If neither -f nor --stdin is given, then the text input is taken from "text word | |||
<p> | |||
<dt> | |||
<strong>-s <integer></strong><br> | |||
<dd>Sets the speed in words-per-minute (approximate values for the default English voice, others may differ slightly). The default value is 170. I generally use a faster speed | |||
of 190. Range 80 to 390. Larger value are rounded down to the maximum. | |||
<dd>Sets the speed in words-per-minute (approximate values for the default English voice, others may differ slightly). The default value is 175. I generally use a faster speed | |||
of 200. Range 80 to 450. Larger value are rounded down to the maximum. | |||
<p> | |||
<dt> | |||
<strong>-b <integer></strong><br> | |||
@@ -128,7 +128,7 @@ others. | |||
<p> | |||
<dt> | |||
<strong>-q</strong><br><dd> | |||
Quiet. No sound is generated. This may be useful with the -x option. | |||
Quiet. No sound is generated. This may be useful with options such as -x and --pho. | |||
<p> | |||
<dt> | |||
<strong>-v <voice filename>[+<variant>]</strong><br> | |||
@@ -152,7 +152,7 @@ Some languages may need additional dictionary data, see <a href="languages.html" | |||
<dt> | |||
<strong>-x</strong><br> | |||
<dd>The phoneme mnemonics, into which the input text is translated, are | |||
shown on stdout. | |||
written to stdout. | |||
<p> | |||
<dt> | |||
<strong>-X</strong><br> | |||
@@ -174,19 +174,27 @@ Compile the pronunciation rule and dictionary lookup data from their source file | |||
<dd> | |||
The same as <strong>--compile</strong>, but source line numbers from the *_rules file are included. These are included in the rules trace when the <strong>-X</strong> option is used. | |||
<p> | |||
<dt><strong>--ipa</strong><br> | |||
<dd> | |||
Writes phonemes to stdout, using the International Phonetic Alphabet (IPA). | |||
<p> | |||
<dt><strong>--path [="<directory path>"]</strong><br> | |||
<dd> | |||
Specifies the directory which contains the espeak-data directory. | |||
<p> | |||
<dt><strong>--pho</strong><br> | |||
<dd> | |||
When used with an mbrola voice (eg. -v mb-en1), it writes mbrola phoneme data (.pho file format) to stdout. This includes the mbrola phoneme names with duration and pitch information, in a form which is suitable as input to this mbrola voice. The --phonout option can be used to write this data to a file. | |||
<p> | |||
<dt><strong>--phonout [="<filename>"]</strong><br> | |||
<dd> | |||
If specified, mbrola phoneme data, and also the output from -x and -X options is written to this file, rather than stdout. | |||
If specified, the output from -x, -X, --ipa, and --pho options is written to this file, rather than to stdout. | |||
<p> | |||
<dt><strong>--punct [="<characters>"]</strong><br> | |||
<dd> | |||
Speaks the names of punctuation characters when they are encountered in the text. If <characters> are given, then only those listed punctuation characters are spoken, eg. <code> --punct=".,;?"</code> | |||
<p> | |||
<dt><strong>--split [="<minutes>"]</strong><br> | |||
<dt><strong>--split [=<minutes>]</strong><br> | |||
<dd> | |||
Used with <strong>-w</strong>, it starts a new WAV file every <code><minutes></code> minutes, at the next sentence boundary. | |||
<p> | |||
@@ -195,7 +203,7 @@ Used with <strong>-w</strong>, it starts a new WAV file every <code><minutes& | |||
<dd>Lists the available voices.<br> | |||
If =<language code> is present then only those voices which are suitable for that language are listed.<br> | |||
<code>--voices=mbrola</code> lists the voices which use mbrola diphone voices. These are not included in the default <code>--voices</code> list<br> | |||
<code>--voices=variant</code> lists the voice variants (voice modifiers).<br> | |||
<code>--voices=variant</code> lists the available voice variants (voice modifiers).<br> | |||
</dl> | |||
<p> <hr> |
@@ -251,14 +251,18 @@ Note, that matching characters in the <pre> part do not affect the syllabl | |||
<td><strong>N</strong></td> | |||
<td>Only use this rule if the word is not a retranslation after removing a suffix.</td> | |||
</tr> | |||
<tr> | |||
<td><strong>T</strong></td> | |||
<td>Only use this rule if the word in found in the *_list file with the <b>$alt</b> attribute.</td> | |||
</tr> | |||
<tr> | |||
<td><strong>#</strong></td> | |||
<td>(English specific) change the next "e" into a special character "E"</td> | |||
</tr> | |||
<tr> | |||
<td><strong>$w_alt<br>$w_alt2<br>$w_alt3</strong></td> | |||
<td>Only use this rule if the word is found in the *_list file with the <b>$alt</b>, <b>$alt2</b> or <b>$alt3</b> attribute respectively.</td> | |||
</tr> | |||
<tr> | |||
<td><strong>$p_alt<br>$p_alt2<br>$p_alt3</strong></td> | |||
<td>Only use this rule if the part-word, up to and including the pre and match parts of this rule, is found in the *_list file with the <b>$alt</b>, <b>$alt2</b> or <b>$alt3</b> attribute respectively.</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</ul> | |||
@@ -275,7 +279,7 @@ eg. | |||
</pre> | |||
S and P must be at the end of the <post> string. | |||
<p> | |||
S<number> 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<number> may be followed by additonal letters (eg. S2ei ). Some of these are probably specific to English, but similar functions could be made for other languages. | |||
<ul><table> | |||
<tbody> | |||
@@ -488,9 +492,13 @@ A word (or group of words) may be given one or more flags, either instead of, or | |||
<td>$hasdot</td> | |||
<td>Use this pronunciation if the word is followed by a dot. (This attribute also implies $dot).</td> | |||
</tr> | |||
<tr> | |||
<td>$sentence</td> | |||
<td>The rule only applies if the clause includes end-of-sentence (i.e. it is not terminated by a comma). For example, "$atend $sentence" means that the rule only applies at the end of a sentence.</td> | |||
</tr> | |||
<tr> | |||
<td>$abbrev</td> | |||
<td>This has two meanings.<br> 1. If there is no phoneme string: Speak the word as individual letters, even if it contains a vowel (eg. "abc" should be spoken as "a" "b" "c").<br>2. If there is a phoneme string: This word is capitalized because it is an abbreviation and capitalization does indicate emphasis (if the "emphasize all-caps" is on).</td> | |||
<td>This has two meanings.<br> 1. If there is no phoneme string: Speak the word as individual letters, even if it contains a vowel (eg. "abc" should be spoken as "a" "b" "c").<br>2. If there is a phoneme string: This word is capitalized because it is an abbreviation and capitalization does not indicate emphasis (if the "emphasize all-caps" is on).</td> | |||
</tr> | |||
<tr> | |||
<td> </td> | |||
@@ -499,9 +507,13 @@ A word (or group of words) may be given one or more flags, either instead of, or | |||
<tr> | |||
<td>$accent</td> | |||
<td>Used for the pronunciation of a single alphabetic character. The character name is spoken as the base-letter name plus the accent (diacritic) name. eg. It can be used to specify that "â" is spoken as "a" "circumflex".</td> | |||
</tr> | |||
<tr> | |||
<td>$combine</td> | |||
<td>This word is treated as though it is combined with the following word with a hyphen. This may be subject to fuither conditions for certain languages.</td> | |||
</tr> | |||
<tr> | |||
<td>$alt $alt2</td> | |||
<td>$alt $alt2 $alt3</td> | |||
<td>These are language specific. Their use should be described in the language's **_list file</td> | |||
</tr> | |||
<tr> |
@@ -41,9 +41,11 @@ eSpeak can be used as a front-end for Mbrola diphone voices. | |||
<h3><A href="add_language.html">Adding a Language</A></h3> | |||
How to add or improve a language. | |||
<h3><A href="phonemes.html">Phonemes</A></h3> | |||
The list of phoneme mnemonics, for use in the Pronunciation Dictionary. | |||
The list of phoneme mnemonics for English, for use in the Pronunciation Dictionary. | |||
<h3><A href="phontab.html">Phoneme Tables</A></h3> | |||
The tables of the phonemes used by each language, with their properties and sound production. | |||
<h3><A href="intonation.html">Intonation</A></h3> | |||
Different intonation "tunes" may be defined for different languages for clauses which end in full-stop, comma, question-mark, and exclamation-mark. | |||
<h3><A href="speak_lib.h">eSpeak Libary API</A></h3> | |||
API definition and header file for a shared library version of eSpeak. | |||
<h3><A href="ssml.html">Markup tags</A></h3> |
@@ -0,0 +1,101 @@ | |||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> | |||
<html> | |||
<head> | |||
<title>eSpeak: Phoneme tables</title> | |||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | |||
</head> | |||
<body> | |||
<A href="docindex.html">Back</A> | |||
<hr> | |||
<h2>INTONATION</h2> | |||
<hr> | |||
In eSpeak's standard intonation model, a "tune" is applied to each clause depending on its punctuation. Other intonation models may be used for some languages, such as tone languages. | |||
<p> | |||
Named tunes are defined in the text file: <b><code>phsource/intonation</code></b>. This file must be compiled for use by eSpeak by using the espeakedit program, using the menu option: <b><code>Compile -> Compile intonation data</code></b>. | |||
<h3>Clauses</h3> | |||
The tunes which are used for a language can be specified by using a <b><code>tunes</code></b> statement in a voice file in <b><code>espeak-data/voices</code></b>. eg: | |||
<p> | |||
<code>tunes s1 c1 q1 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> <tune name> | |||
<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> <tune name> | |||
<dd> | |||
Ends the definition of a tune. | |||
<p> | |||
<dt><strong>prehead</strong> <start pitch> <end pitch> | |||
<dd> | |||
Gives the pitch path for any series of unstressed syllables before the first stressed syllable. | |||
<p> | |||
<dt><strong>headenv</strong> <envelope> <height> | |||
<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> <steps> <start pitch> <end pitch> <unstressed start> <unstressed end> | |||
<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> <percentage list> | |||
<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> <envelope> <top pitch> <bottom pitch> <tail start> <tail end> | |||
<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> <envelope> <top pitch> <bottom pitch> | |||
<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> <pitch> <unstressed start> <unstressed end> | |||
<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> <pitch> <unstressed start> <unstressed end> | |||
<dd> | |||
This specifies the pitch for the last stressed syllable of the head (i.e. the stressed syllable before the nucleus). | |||
<p> | |||
</dl> |
@@ -49,32 +49,27 @@ directory) into | |||
</ol> | |||
<h3>Linux Installation</h3> | |||
I don't think there's a Linux shared library version of Mbrola (equivalent to mbrola.dll), so eSpeak has to pipe phoneme data to the command-line Mbrola. | |||
From eSpeak version 1.44 onwards, eSpeak calls the mbrola program directly, rather than passing phoneme data to it using a pipe. | |||
<ol> | |||
<li>To install the Linux Mbrola binary, download: | |||
<a href="http://www.tcts.fpms.ac.be/synthesis/mbrola/bin/pclinux/mbr301h.zip"> http://www.tcts.fpms.ac.be/synthesis/mbrola/bin/pclinux/mbr301h.zip</a>. | |||
Unpack the archive, and copy and rename the file: <code>mbrola-linux-i386</code> to | |||
Unpack the archive, and copy and rename the file from: <code>mbrola-linux-i386</code> to | |||
<code>mbrola</code> somewhere in your executable path (eg. <code>/usr/bin/mbrola</code> ). | |||
<p> | |||
<li>Get the en1 voice from: | |||
<a href="http://www.tcts.fpms.ac.be/synthesis/mbrola/mbrcopybin.html"> http://www.tcts.fpms.ac.be/synthesis/mbrola/mbrcopybin.html</a>. | |||
Unpack the archive, and copy the "<b>en1</b>" data file (not the whole "en1" | |||
directory) somewhere convenient (eg. <code>/usr/share/mbrola/en1</code> ). | |||
directory) to <code>/usr/share/mbrola/en1</code>.<p>eSpeak will look for mbrola voices firstly in <code>espeak-data/mbrola</code> and then in <code>/usr/share/mbrola</code> | |||
<p> | |||
<li>If you use the eSpeak voice "<b>mb-en1</b>" then eSpeak will generate | |||
Mbrola phoneme data on its stdout. You can pipe this into Mbrola. | |||
<p> | |||
<code>espeak -v mb-en1 -f textfile | mbrola -e /usr/share/mbrola/en1 - | |||
test.wav</code> | |||
<p> | |||
will put the Mbrola speech output into a WAV file. Or you can pipe the output from Mbrola through aplay: | |||
<p> | |||
<code>espeak -v mb-en1 -f textfile | mbrola -e /usr/share/mbrola/en1 - - | aplay -r16000 -fS16</code> | |||
<p> | |||
The -e option prevents Mbrola from stopping if it finds a combination | |||
of phonemes which it doesn't recognise. | |||
<p> | |||
Some mbrola voices (de5, de6) use a sample rate of 22050 Hz. These need -r22050 rather than -r16000. | |||
<li>If you use the eSpeak voice such as "<b>mb-en1</b>" then eSpeak will use the mbrola "en1" voice, eg:<br> | |||
<code>espeak -v mb-en1 "Hello world" | |||
</code> | |||
<p><p> | |||
To generate mbrola phoneme data (.pho file) you can use:<br> | |||
<code>espeak -v mb-en1 -q --pho "Hello world"</code> | |||
<br>or<br> | |||
<code>espeak -v mb-en1 -q --pho --phonout=out.pho "Hello world"</code> | |||
</ol> | |||
<h3>Mbrola Voice Files</h3> | |||
@@ -3,6 +3,7 @@ | |||
<head> | |||
<title>eSpeak: Phoneme tables</title> | |||
<meta name="GENERATOR" content="Quanta Plus"> | |||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> | |||
</head> | |||
<body> | |||
@@ -102,6 +103,7 @@ Within the phoneme definition the following lines may occur: ( (V) indicates on | |||
<tr><TD><b>rhotic</b></TD><td>(C) An "r" type consonant.</td></tr> | |||
<tr><TD><b>unstressed</b></TD><td>(V) This vowel is always unstressed, unless explicitly marked otherwise.</td></tr> | |||
<tr><TD><b>nolink</b></TD><td>Prevent any linking from the previous phoneme.</td></tr> | |||
<tr><TD><b>nopause</b></TD><td>Used in a <code>liquid</code> or <code>nasal</code> phoneme to prevent eSpeak inserting a short pause if a word starts with this phoneme and the previous word ends with a vowel.</td></tr> | |||
<tr><TD><b>trill</b></TD><td>(C) Apply trill to the voicing.</td></tr> | |||
</table> | |||
</dl> | |||
@@ -151,14 +153,18 @@ During the first phase of phoneme interpretation, an instruction which causes a | |||
<dt><strong>length</strong> <length> | |||
<dd>The relative length of the phoneme, typically about 140 for a short vowel and from 200 to 300 for a long vowel or diphong. A length() instruction is needed for vowels. It is optional for consonants. | |||
<p> | |||
<dt><strong>ipa</strong> <ipa string> | |||
<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>(<wav file>, <amplitude>) | |||
<dd> <wav file> 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. <wavefile> does not include a .WAV filename extension, although the file to which it refers may or may not have one.<br> | |||
<amplitude> is optional. It is a percentage change to the amplitude of the WAV file. So, <code>WAV(ufric/s, 50)</code> means: play file 'ufric/s.wav' at 50% amplitude. | |||
<p> | |||
<dt><strong>FMT</strong>(<vowel file>) | |||
<dd><vowel file> 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>(<vowel file>, <amplitude>) | |||
<dd><vowel file> 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> | |||
<amplitude> is optional. It is a percentage change to the amplitude of the sound which is synthesized from the FMT() instruction. | |||
<p> | |||
<dt><strong>FMT</strong>(<vowel file>) <strong>addWav</strong>(<wav file>, <amplitude>) | |||
<dt><strong>FMT</strong>(<vowel file>, <amplitude>) <strong>addWav</strong>(<wav file>, <amplitude>) | |||
<dd>For voiced consonants, a FMT() instruction may be followed by an addWav() instruction. addWav() has the same format as a WAV() instruction, but the WAV file is mixed with the sound which is synthesized from the FMT() instruction. | |||
<p> | |||
<dt><strong>VowelStart</strong>(<vowel file>, <length adjust>) |
@@ -1,7 +1,7 @@ | |||
#ifndef SPEAK_LIB_H | |||
#define SPEAK_LIB_H | |||
/*************************************************************************** | |||
* Copyright (C) 2005 to 2007 by Jonathan Duddington * | |||
* Copyright (C) 2005 to 2010 by Jonathan Duddington * | |||
* email: [email protected] * | |||
* * | |||
* This program is free software; you can redistribute it and/or modify * | |||
@@ -26,8 +26,9 @@ | |||
/*************************************************************/ | |||
#include <stdio.h> | |||
#include <stddef.h> | |||
#define ESPEAK_API_REVISION 3 | |||
#define ESPEAK_API_REVISION 5 | |||
/* | |||
Revision 2 | |||
Added parameter "options" to eSpeakInitialize() | |||
@@ -35,6 +36,11 @@ Revision 2 | |||
Revision 3 | |||
Added espeakWORDGAP to espeak_PARAMETER | |||
Revision 4 | |||
Added flags parameter to espeak_CompileDictionary() | |||
Revision 5 | |||
Added espeakCHARS_16BIT | |||
*/ | |||
/********************/ | |||
/* Initialization */ | |||
@@ -44,12 +50,13 @@ Revision 3 | |||
typedef enum { | |||
espeakEVENT_LIST_TERMINATED = 0, // Retrieval mode: terminates the event list. | |||
espeakEVENT_WORD = 1, // Start of word | |||
espeakEVENT_SENTENCE, // Start of sentence | |||
espeakEVENT_MARK, // Mark | |||
espeakEVENT_PLAY, // Audio element | |||
espeakEVENT_END, // End of sentence | |||
espeakEVENT_MSG_TERMINATED, // End of message | |||
espeakEVENT_PHONEME // Phoneme, if enabled in espeak_Initialize() | |||
espeakEVENT_SENTENCE = 2, // Start of sentence | |||
espeakEVENT_MARK = 3, // Mark | |||
espeakEVENT_PLAY = 4, // Audio element | |||
espeakEVENT_END = 5, // End of sentence or clause | |||
espeakEVENT_MSG_TERMINATED = 6, // End of message | |||
espeakEVENT_PHONEME = 7, // Phoneme, if enabled in espeak_Initialize() | |||
espeakEVENT_SAMPLERATE = 8 // internal use, set sample rate | |||
} espeak_EVENT_TYPE; | |||
@@ -224,6 +231,7 @@ int UriCallback(int type, const char *uri, const char *base); | |||
#define espeakCHARS_UTF8 1 | |||
#define espeakCHARS_8BIT 2 | |||
#define espeakCHARS_WCHAR 3 | |||
#define espeakCHARS_16BIT 4 | |||
#define espeakSSML 0x10 | |||
#define espeakPHONEMES 0x100 | |||
@@ -315,7 +323,8 @@ extern "C" | |||
#endif | |||
espeak_ERROR espeak_Key(const char *key_name); | |||
/* Speak the name of a keyboard key. | |||
Currently this just speaks the "key_name" as given | |||
If key_name is a single character, it speaks the name of the character. | |||
Otherwise, it speaks key_name as a text string. | |||
Return: EE_OK: operation achieved | |||
EE_BUFFER_FULL: the command can not be buffered; | |||
@@ -379,7 +388,8 @@ espeak_ERROR espeak_SetParameter(espeak_PARAMETER parameter, int value, int rela | |||
parameter: | |||
espeakRATE: speaking speed in word per minute. | |||
espeakVOLUME: volume in range 0-100 0=silence | |||
espeakVOLUME: volume in range 0-200 or more. | |||
0=silence, 100=normal full volume, greater values may produce amplitude compression or distortion | |||
espeakPITCH: base pitch, range 0-100. 50=normal | |||
@@ -435,6 +445,7 @@ void espeak_SetPhonemeTrace(int value, FILE *stream); | |||
value=0 No phoneme output (default) | |||
value=1 Output the translated phoneme symbols for the text | |||
value=2 as (1), but also output a trace of how the translation was done (matching rules and list entries) | |||
value=3 as (1), but produces IPA rather than ascii phoneme names | |||
stream output stream for the phoneme symbols (and trace). If stream=NULL then it uses stdout. | |||
*/ | |||
@@ -442,13 +453,16 @@ void espeak_SetPhonemeTrace(int value, FILE *stream); | |||
#ifdef __cplusplus | |||
extern "C" | |||
#endif | |||
void espeak_CompileDictionary(const char *path, FILE *log); | |||
void espeak_CompileDictionary(const char *path, FILE *log, int flags); | |||
/* Compile pronunciation dictionary for a language which corresponds to the currently | |||
selected voice. The required voice should be selected before calling this function. | |||
path: The directory which contains the language's '_rules' and '_list' files. | |||
'path' should end with a path separator character ('/'). | |||
log: Stream for error reports and statistics information. If log=NULL then stderr will be used. | |||
flags: Bit 0: include source line information for debug purposes (This is displayed with the | |||
-X command line option). | |||
*/ | |||
/***********************/ | |||
/* Voice Selection */ | |||
@@ -497,7 +511,7 @@ const espeak_VOICE **espeak_ListVoices(espeak_VOICE *voice_spec); | |||
The list is terminated by a NULL pointer | |||
If voice_spec is NULL then all voices are listed. | |||
If voice spec is give, then only the voices which are compatible with the voice_spec | |||
If voice spec is given, then only the voices which are compatible with the voice_spec | |||
are listed, and they are listed in preference order. | |||
*/ | |||
@@ -74,6 +74,7 @@ eSpeak can speak HTML text directly, or text containing both SSML and HTML marku | |||
Any unrecognised tags are ignored.<p> | |||
The following tags case a sentence break.<br> | |||
<b><br> | |||
<dd> | |||
<li> | |||
<img> | |||
<td> | |||
@@ -85,5 +86,9 @@ The following tags case a paragraph break.<br> | |||
<h4> | |||
<hr> | |||
</b><p> | |||
Text between the following tags is ignored.<br> | |||
<b><script> ... </script> <br> | |||
<style> ... </style> <br> | |||
</b><p> | |||
</body> | |||
</html> |
@@ -1,4 +1,4 @@ | |||
65 phoneme tables | |||
66 phoneme tables | |||
new total | |||
base 107 107 | |||
consonants 9 115 | |||
@@ -12,7 +12,7 @@ consonants 9 115 | |||
en-wi 30 148 | |||
af 39 136 | |||
cy 29 132 | |||
de 38 139 | |||
de 36 137 | |||
eo 13 114 | |||
jbo 2 114 | |||
nci 3 123 | |||
@@ -24,12 +24,12 @@ consonants 9 115 | |||
hu 24 121 | |||
lv 29 125 | |||
nl 24 125 | |||
pl 20 118 | |||
sk 28 133 | |||
cs 6 133 | |||
hr 25 138 | |||
mk 3 139 | |||
sr 14 138 | |||
pl 22 120 | |||
sk 28 135 | |||
cs 6 135 | |||
hr 25 140 | |||
mk 3 141 | |||
sr 14 140 | |||
it 18 126 | |||
la 21 124 | |||
es 10 123 | |||
@@ -38,7 +38,7 @@ consonants 9 115 | |||
pt 29 138 | |||
pt-pt 20 138 | |||
ro 36 146 | |||
el 8 123 | |||
el 9 123 | |||
grc 12 127 | |||
sv 22 127 | |||
no 28 132 | |||
@@ -59,12 +59,13 @@ consonants 9 115 | |||
ne 18 157 | |||
pa 14 151 | |||
prs 8 111 | |||
sl 7 133 | |||
sl 7 135 | |||
gd 6 107 | |||
bg 10 119 | |||
bg 10 121 | |||
nso 8 107 | |||
ht 11 140 | |||
az 10 127 | |||
ak 8 109 | |||
Data file Used by | |||
b/b [b] base | |||
@@ -342,7 +343,7 @@ l/l_ [l/] base | |||
[l/] fr | |||
l/l_@ [l/3] base | |||
[l/] fr | |||
l/l@ [h&w] base | |||
l/l@ [h–z] base | |||
[l#] base | |||
[l] fr | |||
[l/2] fr | |||
@@ -368,13 +369,13 @@ l/L2_oL [l/2] base | |||
l/L2_uL [l/2] base | |||
l/l_3 [l/] de | |||
l/l_4 [ll] sq | |||
l/la [h&w] base | |||
l/la [h–z] base | |||
[l#] base | |||
[l] fr | |||
[l/2] fr | |||
l/l_a [l/3] base | |||
[l/] fr | |||
l/le [h&w] base | |||
l/le [h–z] base | |||
[l#] base | |||
[l] fr | |||
[l/2] fr | |||
@@ -384,7 +385,7 @@ l/L_eL_af [&] af | |||
[&:] af | |||
l/l_front [L] sq | |||
l/l_front_ [l/4] sq | |||
l/li [h&w] base | |||
l/li [h–z] base | |||
[l#] base | |||
[l] fr | |||
[l/2] fr | |||
@@ -396,14 +397,14 @@ ll/ll [L] bg | |||
ll/_ll [L] bg | |||
l/l_long [l] base | |||
[l] fr | |||
l/lo [h&w] base | |||
l/lo [h–z] base | |||
[l#] base | |||
[l] fr | |||
[l/2] fr | |||
l/l_o [l/3] base | |||
[l/] fr | |||
l^/l_rfx [l.] base | |||
l/lu [h&w] base | |||
l/lu [h–z] base | |||
[l#] base | |||
[l] fr | |||
[l/2] fr | |||
@@ -504,7 +505,6 @@ n/nu [n] base | |||
[n#] is | |||
[n] zh | |||
r/@_ [V#] de | |||
[V3#] de | |||
r2/r2@ [r-] en | |||
r2/r2a [r-] en | |||
r2/r2e [r-] en | |||
@@ -526,6 +526,7 @@ r3/r_trill [R2] base | |||
[R] pl | |||
[r*] sr | |||
[x] pt | |||
[r] el | |||
r3/r_trill2 [R] base | |||
[r] cy | |||
r3/r_trill2.wav [R] base | |||
@@ -539,6 +540,7 @@ r3/r_trill.wav [R2] base | |||
[R] pl | |||
[r*] sr | |||
[x] pt | |||
[r] el | |||
r3/r_uvl [r"] base | |||
[r] de | |||
r3/r_uvl.wav [r"] base | |||
@@ -600,9 +602,7 @@ r/trr [r/] base | |||
[r] ro | |||
[r] ru | |||
r/V_ [V#] de | |||
[V1#] de | |||
r/V_2_ [V#] de | |||
[V2#] de | |||
r/xr [r] base | |||
[R3] base | |||
[r-] en | |||
@@ -913,7 +913,6 @@ vdiph/aau_2 [aU] en-wi | |||
[aU] la | |||
[aau] zhy | |||
vdiph/aau_3 [aU] hi | |||
[aU] ta | |||
[aU] ne | |||
vdiph/aau_4 [aU] vi | |||
vdiph/aau_6 [aU] de | |||
@@ -947,6 +946,7 @@ vdiph/ai_8 [aI] ta | |||
vdiph/aoo [aU] en-us | |||
vdiph/au [aU] en | |||
[aU] af | |||
[aU] ta | |||
[a:U] vi | |||
[aU] prs | |||
vdiph/au# [aU] en-sc | |||
@@ -1375,6 +1375,7 @@ vowel/aa_9 [a] fi | |||
[a:] hi | |||
[a] ne | |||
[a] pa | |||
[a] ak | |||
vowel/@_bck [@] hi | |||
[@/] hi | |||
[@] zh | |||
@@ -1425,6 +1426,7 @@ vowel/e_3 [i] en-n | |||
[e] ku | |||
vowel/e_5 [i] en-sc | |||
vowel/e_6 [e] ht | |||
[e] ak | |||
vowel/e_8 [E:] de | |||
[e] fr | |||
vowel/ee [E] en-n | |||
@@ -1455,6 +1457,7 @@ vowel/ee_3 [&] af | |||
[E] vi | |||
vowel/ee_4 [E] sq | |||
vowel/ee_5 [E] en | |||
[E] ak | |||
vowel/ee_6 [&] sk | |||
[E3] sv | |||
[E] ku | |||
@@ -1533,6 +1536,7 @@ vowel/i [i] base | |||
[i] ne | |||
[i] prs | |||
[i] nso | |||
[i] ak | |||
vowel/i# [y:] cy | |||
vowel/i_2 [i2] de | |||
[i:] de | |||
@@ -1663,6 +1667,7 @@ vowel/o [o] base2 | |||
[o:] ml | |||
[o:] pa | |||
[o] sl | |||
[o] ak | |||
vowel/o_2 [o:] cy | |||
[o:] hi | |||
[o:] hu | |||
@@ -1731,6 +1736,7 @@ vowel/oo_2 [0] en-sc | |||
[O] cy | |||
[o] cs | |||
[0] da | |||
[O] ak | |||
vowel/oo_3 [O] af | |||
vowel/oo_4 [O] base2 | |||
[0] en-wm | |||
@@ -1774,6 +1780,7 @@ vowel/u [u] base | |||
[u] ml | |||
[u:] ml | |||
[u] prs | |||
[u] ak | |||
vowel/u# [u:] en-sc | |||
[Y] tr | |||
vowel/u_2 [u1] fi |
@@ -339,35 +339,6 @@ phoneme V# // used for 'r' after a vowel (to create a diphthong) | |||
endphoneme | |||
// TESTING | |||
phoneme V1# | |||
liquid | |||
lengthmod 7 | |||
IF nextPhW(isVowel) THEN | |||
ChangePhoneme(r") | |||
ENDIF | |||
FMT(r/V_) | |||
endphoneme | |||
phoneme V2# // used for 'r' after a vowel (to create a diphthong) | |||
liquid | |||
lengthmod 7 | |||
IF nextPhW(isVowel) THEN | |||
ChangePhoneme(r") | |||
ENDIF | |||
FMT(r/V_2_) | |||
endphoneme | |||
phoneme V3# | |||
liquid | |||
lengthmod 7 | |||
IF nextPhW(isVowel) THEN | |||
ChangePhoneme(r") | |||
ENDIF | |||
FMT(r/@_) | |||
endphoneme | |||
phoneme UR | |||
vowel starttype #u endtype #@ | |||
ipa ʊɐ | |||
@@ -377,6 +348,21 @@ phoneme UR | |||
endphoneme | |||
phoneme r2 | |||
vcd alv flp | |||
IF prevPhW(isVowel) THEN | |||
ChangePhoneme(*) | |||
ENDIF | |||
InsertPhoneme(@-) | |||
ChangePhoneme(*) | |||
endphoneme | |||
// TESTING | |||
// translate from English to German phonemes |
@@ -69,3 +69,13 @@ phoneme k | |||
WAV(ustop/k_unasp, 70) | |||
endphoneme | |||
phoneme r // this is [R] from Slovak/Czech | |||
liquid | |||
trill | |||
lengthmod 6 | |||
ipa r | |||
Vowelin f1=0 f2=1700 -300 300 f3=-300 80 | |||
Vowelout f1=2 f2=1700 -300 300 f3=-300 80 brk | |||
FMT(r3/r_trill) addWav(r3/r_trill.wav, 50) | |||
endphoneme |
@@ -170,8 +170,21 @@ endphoneme | |||
phoneme dz | |||
import_phoneme consonants/dz | |||
CALL consonants/dz | |||
voicingswitch ts | |||
ipa dʑ | |||
endphoneme | |||
phoneme ts; | |||
CALL base/tS; | |||
voicingswitch dz; | |||
ipa tɕ | |||
endphoneme | |||
phoneme dz; | |||
import_phoneme base/dZ; | |||
voicingswitch ts; | |||
endphoneme | |||
@@ -118,14 +118,14 @@ endphoneme | |||
phoneme aI | |||
vowel starttype #a endtype #i | |||
length 230 | |||
length 280 | |||
FMT(vdiph/ai_8) | |||
endphoneme | |||
phoneme aU | |||
vowel starttype #a endtype #u | |||
length 200 | |||
FMT(vdiph/aau_3) | |||
length 260 | |||
FMT(vdiph/au) | |||
endphoneme | |||
@@ -475,6 +475,8 @@ phoneme l/2 // 'dark' [l] after a vowel | |||
ChangePhoneme(l) | |||
ENDIF | |||
CALL vowelstart_l | |||
PrevVowelEndings | |||
VowelEnding(l/L2_@L, -60) | |||
VowelEnding(l/L2_aL, -50) | |||
@@ -1817,3 +1819,6 @@ include ph_haitian | |||
phonemetable az tr | |||
include ph_azerbaijani | |||
phonemetable ak base | |||
include ph_akan |
@@ -2,11 +2,13 @@ | |||
// 13.02.10 jonsd: Changed for eSpeak version 1.43 | |||
// 13.08.10 jonsd: Added Q lines. Use Address to set the displacement in phondata file. | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <string.h> | |||
#include <ctype.h> | |||
#include <sys/types.h> | |||
#if defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN | |||
@@ -101,6 +103,7 @@ void swap_phontab (const char *infile, const char *outfile); | |||
void usage (const char *program_name); | |||
int xread; // prevent compiler warning from fread() | |||
int main (int argc, char *argv[]) | |||
@@ -181,6 +184,7 @@ void swap_phondata (const char *infile, const char *outfile, | |||
const char *manifest) | |||
{//========================================================== | |||
FILE *in, *mfest, *out; | |||
int displ; | |||
char line[1024]; | |||
unsigned char buf_4[4]; | |||
@@ -202,24 +206,30 @@ void swap_phondata (const char *infile, const char *outfile, | |||
exit (1); | |||
} | |||
fread (buf_4, 4, 1, in); | |||
fwrite (buf_4, 4, 1, out); | |||
xread = fread(buf_4, 4, 1, in); | |||
fwrite(buf_4, 4, 1, out); | |||
while (fgets (line, sizeof(line), mfest)) | |||
{ | |||
if(!isupper(line[0])) continue; | |||
sscanf(&line[2],"%x",&displ); | |||
fseek(in, displ, SEEK_SET); | |||
while (fgets (line, 1024, mfest)) { | |||
if (line[0] == 'S') { | |||
SPECT_SEQ buf_spect; | |||
size_t ix; | |||
int n; | |||
fread (&buf_spect.length, 2, 1, in); | |||
fread (&buf_spect.n_frames, 1, 1, in); | |||
xread = fread (&buf_spect.length, 2, 1, in); | |||
xread = fread (&buf_spect.n_frames, 1, 1, in); | |||
fseek (in, -3, SEEK_CUR); | |||
ix = (char *)(&buf_spect.frame[buf_spect.n_frames]) - | |||
(char *)(&buf_spect); | |||
ix = (ix+3) & 0xfffc; | |||
fread (&buf_spect, ix, 1, in); | |||
xread = fread (&buf_spect, ix, 1, in); | |||
buf_spect.length = (short) SWAP_USHORT (buf_spect.length); | |||
for (n = 0; n < buf_spect.n_frames; n++) { | |||
@@ -242,7 +252,7 @@ void swap_phondata (const char *infile, const char *outfile, | |||
int length; | |||
char *wave_data; | |||
fread (buf_4, 4, 1, in); | |||
xread = fread (buf_4, 4, 1, in); | |||
fwrite (buf_4, 4, 1, out); | |||
length = buf_4[1] * 256 + buf_4[0]; | |||
@@ -253,7 +263,7 @@ void swap_phondata (const char *infile, const char *outfile, | |||
exit (1); | |||
} | |||
fread (wave_data, 1, length, in); | |||
xread = fread (wave_data, 1, length, in); | |||
fwrite (wave_data, 1, length, out); | |||
pos = ftell (in); | |||
@@ -273,7 +283,7 @@ void swap_phondata (const char *infile, const char *outfile, | |||
else if (line[0] == 'E') { | |||
char env_buf[128]; | |||
fread (env_buf, 1, 128, in); | |||
xread = fread (env_buf, 1, 128, in); | |||
fwrite (env_buf, 1, 128, out); | |||
} | |||
} | |||
@@ -302,7 +312,7 @@ void swap_phonindex (const char *infile, const char *outfile) | |||
exit (1); | |||
} | |||
fread (buf_4, 4, 1, in); // skip first 4 bytes | |||
xread = fread (buf_4, 4, 1, in); // skip first 4 bytes | |||
fwrite(buf_4, 4, 1, out); | |||
while (! feof (in)) { | |||
@@ -339,7 +349,7 @@ void swap_phontab (const char *infile, const char *outfile) | |||
exit (1); | |||
} | |||
fread (buf_8, 4, 1, in); | |||
xread = fread (buf_8, 4, 1, in); | |||
fwrite (buf_8, 4, 1, out); | |||
n_phoneme_tables = buf_8[0]; | |||
@@ -347,18 +357,18 @@ void swap_phontab (const char *infile, const char *outfile) | |||
int n_phonemes, j; | |||
char tab_name[N_PHONEME_TAB_NAME]; | |||
fread (buf_8, 8, 1, in); | |||
xread = fread (buf_8, 8, 1, in); | |||
fwrite (buf_8, 8, 1, out); | |||
n_phonemes = buf_8[0]; | |||
fread (tab_name, N_PHONEME_TAB_NAME, 1, in); | |||
xread = fread (tab_name, N_PHONEME_TAB_NAME, 1, in); | |||
fwrite (tab_name, N_PHONEME_TAB_NAME, 1, out); | |||
for (j = 0; j < n_phonemes; j++) { | |||
PHONEME_TAB table; | |||
fread (&table, sizeof (PHONEME_TAB), 1, in); | |||
xread = fread (&table, sizeof (PHONEME_TAB), 1, in); | |||
table.mnemonic = SWAP_UINT (table.mnemonic); | |||
table.phflags = SWAP_UINT (table.phflags); |
@@ -2,7 +2,7 @@ | |||
[Setup] | |||
AppName=eSpeak | |||
AppVerName=eSpeak version 1.43.24 | |||
AppVerName=eSpeak version 1.44.01 | |||
AppCopyright=Licensed under GNU General Public License version 3. (See file License.txt for details). | |||
WindowVisible=yes | |||
@@ -32,7 +32,6 @@ Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme | |||
Source: "License.txt"; DestDir: "{app}"; | |||
[Registry] | |||
;Root: HKLM; Subkey: "Software\Microsoft\Speech\Voices\Tokens\eSpeak_5"; Flags: deletekey uninsdeletekey | |||
Root: HKLM; Subkey: "Software\Microsoft\Speech\PhoneConverters\Tokens\eSpeak"; Flags: deletekey uninsdeletekey | |||
@@ -111,8 +110,10 @@ begin | |||
lang_main := language and $3ff; | |||
Result := 'en'; | |||
// translation from microsoft codes to language codes | |||
// Translation from microsoft codes to language codes | |||
// Used to set default voices for inatallation. | |||
case lang_main of | |||
//$02: Result := 'bg'; | |||
$03: Result := 'ca'; | |||
$04: Result := 'zh'; | |||
$05: Result := 'cs'; | |||
@@ -126,7 +127,7 @@ begin | |||
$0e: Result := 'hu'; | |||
$0f: Result := 'is'; | |||
$10: Result := 'it'; | |||
$12: Result := 'ko'; | |||
//$12: Result := 'ko'; | |||
$13: Result := 'nl'; | |||
$14: Result := 'no'; | |||
$15: Result := 'pl'; | |||
@@ -142,17 +143,18 @@ begin | |||
$26: Result := 'lv'; | |||
$2a: Result := 'vi'; | |||
$2b: Result := 'hy'; | |||
$2d: Result := 'eu'; | |||
//$2c: Result := 'az'; | |||
//$2d: Result := 'eu'; | |||
$2f: Result := 'mk'; | |||
$36: Result := 'af'; | |||
$39: Result := 'hi'; | |||
$41: Result := 'sw'; | |||
$49: Result := 'ta'; | |||
$4b: Result := 'kn'; | |||
$50: Result := 'mn'; | |||
//$4b: Result := 'kn'; | |||
//$50: Result := 'mn'; | |||
$52: Result := 'cy'; | |||
$61: Result := 'ne'; | |||
$87: Result := 'rw'; | |||
//$61: Result := 'ne'; | |||
//$87: Result := 'rw'; | |||
end; | |||
// is there a match on the full language code? | |||
@@ -185,8 +187,12 @@ begin | |||
lang1 := Copy(voice,8,6); // eg. mb-de4-en, return 'en' | |||
end; | |||
// Used to set the correct Microsoft language code in the registry | |||
// when a SAPI5 voice is installed. | |||
case lang1 of | |||
'af': value := $436; | |||
'az': value := $42c; | |||
'bg': value := $402; | |||
'bs': value := $41a; // should be $141a but Jaws crashes on startup | |||
'ca': value := $403; | |||
'cs': value := $405; |
@@ -1,7 +1,7 @@ | |||
[Setup] | |||
AppName=eSpeakEdit | |||
AppVerName=eSpeakEdit version 1.43.24 | |||
AppVerName=eSpeakEdit version 1.44.01 | |||
DefaultDirName={pf}\eSpeak | |||
DefaultGroupName=eSpeak | |||
OutputBaseFilename=setup_espeakedit | |||
@@ -14,6 +14,9 @@ ShowLanguageDialog=auto | |||
Name: "{group}\espeakedit"; Filename: "{app}\espeakedit.exe"; WorkingDir: "{app}"; Flags: runmaximized | |||
Name: "{group}\Uninstall espeakedit"; Filename: "{uninstallexe}" | |||
[InstallDelete] | |||
Type: filesandordirs; Name: "{app}\phsource\vowelcharts" | |||
[Files] | |||
Source: "espeakedit.exe"; DestDir: "{app}" |
@@ -178,6 +178,7 @@ int SynthCallback(short *wav, int numsamples, espeak_EVENT *events) | |||
// return the events | |||
for(event=events; (event->type != 0) && (n_Events < N_EVENTS); event++) | |||
{ | |||
audio_latest = event->audio_position + audio_offset; | |||
if((event->type == espeakEVENT_WORD) && (event->length > 0)) | |||
@@ -260,8 +261,8 @@ static int ConvertRate(int new_rate) | |||
int rate; | |||
static int rate_table[21] = {80,100,115,124,133,142,151,159,168,174,180, | |||
187,196,208,220,240,270,300,335,369,390 }; | |||
static int rate_table[21] = {80,110,124,133,142,151,159,168,174,180,187, | |||
196,208,220,240,270,300,335,369,390,450 }; | |||
rate = new_rate + master_rate; | |||
if(rate < -10) rate = -10; |
@@ -5,8 +5,8 @@ | |||
// | |||
VS_VERSION_INFO VERSIONINFO | |||
FILEVERSION 1,0,42,00 | |||
PRODUCTVERSION 1,0,42,00 | |||
FILEVERSION 1,0,44,00 | |||
PRODUCTVERSION 1,0,44,00 | |||
FILEFLAGSMASK 0x3fL | |||
#ifdef _DEBUG | |||
FILEFLAGS 0x1L | |||
@@ -24,14 +24,14 @@ BEGIN | |||
VALUE "Comments", "\0" | |||
VALUE "CompanyName", "Jonathan Duddington\0" | |||
VALUE "FileDescription", "Text to Speech\0" | |||
VALUE "FileVersion", "1, 0,42,00\0" | |||
VALUE "InternalName", "espeak1.42\0" | |||
VALUE "FileVersion", "1, 0,44,00\0" | |||
VALUE "InternalName", "espeak1.44\0" | |||
VALUE "LegalCopyright", "Copyright (c) Jonathan Duddington\0" | |||
VALUE "LegalTrademarks", "\0" | |||
VALUE "OriginalFilename", "espeak_sapi.dll\0" | |||
VALUE "PrivateBuild", "\0" | |||
VALUE "ProductName", "espeak TTS\0" | |||
VALUE "ProductVersion", "1, 0, 42, 00\0" | |||
VALUE "ProductVersion", "1, 0, 44, 00\0" | |||
VALUE "SpecialBuild", "\0" | |||
END | |||
END |
@@ -1925,8 +1925,11 @@ static int LoadEnvelope(FILE *f, const char *fname) | |||
displ = ftell(f_phdata); | |||
fseek(f,12,SEEK_SET); | |||
fread(buf,1,128,f); | |||
fwrite(buf,1,128,f_phdata); | |||
if(fread(buf,128,1,f) == 0) | |||
{ | |||
error("Failed to read envelope: %s",fname); | |||
} | |||
fwrite(buf,128,1,f_phdata); | |||
if(n_envelopes < N_ENVELOPES) | |||
{ | |||
@@ -3576,7 +3579,7 @@ void CompileMbrola() | |||
wxFileName filename = wxFileName(filepath); | |||
strcpy(mbrola_voice,filename.GetName().mb_str(wxConvLocal)); | |||
sprintf(buf,"%s/mbrola_ph/%s_phtrans",path_home,mbrola_voice); | |||
if((f_out = fopen(buf,"w")) == NULL) | |||
if((f_out = fopen(buf,"wb")) == NULL) | |||
{ | |||
wxLogError(_T("Can't write to: ")+wxString(buf,wxConvLocal)); | |||
return; |
@@ -273,7 +273,7 @@ int LoadDictionary(Translator *tr, const char *name, int no_error) | |||
} | |||
tr->data_dictlist = Alloc(size); | |||
fread(tr->data_dictlist,size,1,f); | |||
size = fread(tr->data_dictlist,1,size,f); | |||
fclose(f); | |||
@@ -516,7 +516,7 @@ unsigned short ipa1[96] = { | |||
0x252,0x31,0x32,0x25c,0x34,0x35,0x36,0x37,0x275,0x39,0x2d0,0x2b2,0x3c,0x3d,0x3e,0x294, | |||
0x259,0x251,0x3b2,0xe7,0xf0,0x25b,0x46,0x262,0x127,0x26a,0x25f,0x4b,0x4c,0x271,0x14b,0x254, | |||
0x3a6,0x263,0x280,0x283,0x3b8,0x28a,0x28c,0x153,0x3c7,0xf8,0x292,0x32a,0x5c,0x5d,0x5e,0x5f, | |||
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f, | |||
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x261,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f, | |||
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x303,0x7f | |||
}; | |||
@@ -1639,6 +1639,7 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, | |||
} | |||
*output++ = 0; | |||
return; | |||
} /* end of SetWordStress */ | |||
@@ -566,7 +566,7 @@ void DisplayErrorFile(const char *fname) | |||
if(msg != NULL) | |||
{ | |||
f = fopen(fname,"r"); | |||
fread(msg,len,1,f); | |||
len = fread(msg,1, len, f); | |||
fclose(f); | |||
msg[len] = 0; | |||
msg_string = wxString(msg,wxConvUTF8); |
@@ -1883,7 +1883,7 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned | |||
int TranslateNumber(Translator *tr, char *word1, char *ph_out, unsigned int *flags, WORD_TAB *wtab, int control) | |||
{//============================================================================================================= | |||
if(option_sayas == SAYAS_DIGITS1) | |||
if((option_sayas == SAYAS_DIGITS1) || (wtab[0].flags & FLAG_INDIVIDUAL_DIGITS)) | |||
return(0); // speak digits individually | |||
if(tr->langopts.numbers != 0) |
@@ -774,7 +774,7 @@ static int LoadSoundFile(const char *fname, int index) | |||
fclose(f); | |||
return(4); | |||
} | |||
fread(p,length,1,f); | |||
length = fread(p,1,length,f); | |||
fclose(f); | |||
remove(fname_temp); | |||
@@ -2032,7 +2032,6 @@ int ReadClause(Translator *tr, FILE *f_in, char *buf, short *charix, int *charix | |||
int stressed_word = 0; | |||
int end_clause_after_tag = 0; | |||
int end_clause_index = 0; | |||
const char *p; | |||
wchar_t xml_buf[N_XML_BUF+1]; | |||
#define N_XML_BUF2 20 |
@@ -388,7 +388,8 @@ espeak_ERROR espeak_SetParameter(espeak_PARAMETER parameter, int value, int rela | |||
parameter: | |||
espeakRATE: speaking speed in word per minute. | |||
espeakVOLUME: volume in range 0-100 0=silence | |||
espeakVOLUME: volume in range 0-200 or more. | |||
0=silence, 100=normal full volume, greater values may produce amplitude compression or distortion | |||
espeakPITCH: base pitch, range 0-100. 50=normal | |||
@@ -147,7 +147,7 @@ espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int | |||
// read eSpeak's mbrola phoneme translation data, eg. en1_phtrans | |||
sprintf(path,"%s/mbrola_ph/%s",path_home,phtrans); | |||
size = GetFileLength(path); | |||
if((f_in = fopen(path,"r")) == NULL) { | |||
if((f_in = fopen(path,"rb")) == NULL) { | |||
close_MBR(); | |||
return(EE_NOT_FOUND); | |||
} | |||
@@ -165,7 +165,7 @@ espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int | |||
{ | |||
*pw++ = Read4Bytes(f_in); | |||
} | |||
fread(mbrola_tab,size,1,f_in); | |||
size = fread(mbrola_tab,1,size,f_in); | |||
fclose(f_in); | |||
setVolumeRatio_MBR((float)(mbrola_control & 0xff) /16.0f); |
@@ -35,8 +35,8 @@ | |||
#include "translate.h" | |||
#include "wave.h" | |||
const char *version_string = "1.43.63 02.Aug.10"; | |||
const int version_phdata = 0x014361; | |||
const char *version_string = "1.44.02 13.Aug.10"; | |||
const int version_phdata = 0x014400; | |||
int option_device_number = -1; | |||
FILE *f_logespeak = NULL; |
@@ -1236,10 +1236,15 @@ void DoEmbedded(int *embix, int sourceix) | |||
int command; | |||
do { | |||
word = embedded_list[(*embix)++]; | |||
word = embedded_list[*embix]; | |||
value = word >> 8; | |||
command = word & 0x7f; | |||
if(command == 0) | |||
return; // error | |||
(*embix)++; | |||
switch(command & 0x1f) | |||
{ | |||
case EMBED_S: // speed |
@@ -122,7 +122,8 @@ static Translator* NewTranslator(void) | |||
tr->data_dictrules = NULL; // language_1 translation rules file | |||
tr->data_dictlist = NULL; // language_2 dictionary lookup file | |||
tr->transpose_min = 0; | |||
tr->transpose_min = 'a'; | |||
tr->transpose_max = 'z'; | |||
tr->frequent_pairs = NULL; | |||
// only need lower case | |||
@@ -167,6 +168,7 @@ static Translator* NewTranslator(void) | |||
tr->langopts.replace_chars = NULL; | |||
tr->langopts.ascii_language = ""; // Non-Latin alphabet languages, use this language to speak Latin words, default is English | |||
SetLengthMods(tr,201); | |||
// tr->langopts.length_mods = length_mods_en; | |||
// tr->langopts.length_mods0 = length_mods_en0; | |||
@@ -178,6 +180,7 @@ static Translator* NewTranslator(void) | |||
tr->langopts.thousands_sep = ','; | |||
tr->langopts.decimal_sep = '.'; | |||
tr->langopts.break_numbers = BREAK_THOUSANDS; // 1000, 1000,000 1,000,000 etc | |||
tr->langopts.max_digits = 14; | |||
memcpy(tr->punct_to_tone, punctuation_to_tone, sizeof(tr->punct_to_tone)); | |||
@@ -278,14 +281,14 @@ static void SetCyrillicLetters(Translator *tr) | |||
tr->letter_bits_offset = OFFSET_CYRILLIC; | |||
memset(tr->letter_bits,0,sizeof(tr->letter_bits)); | |||
SetLetterBits(tr,0,ru_vowels); | |||
SetLetterBits(tr,LETTERGP_A,ru_vowels); | |||
SetLetterBits(tr,1,ru_soft); | |||
SetLetterBits(tr,2,ru_consonants); | |||
SetLetterBits(tr,3,ru_hard); | |||
SetLetterBits(tr,4,ru_nothard); | |||
SetLetterBits(tr,5,ru_voiced); | |||
SetLetterBits(tr,6,ru_ivowels); | |||
SetLetterBits(tr,7,ru_vowels); | |||
SetLetterBits(tr,LETTERGP_VOWEL2,ru_vowels); | |||
} // end of SetCyrillicLetters | |||
@@ -419,10 +422,8 @@ Translator *SelectTranslator(const char *name) | |||
static const short stress_lengths_da[8] = {160,140, 200,200, 0,0, 220,230}; | |||
SetupTranslator(tr,stress_lengths_da,NULL); | |||
tr->transpose_min = 'a'; | |||
tr->transpose_max = 'z'; | |||
tr->langopts.stress_rule = STRESSPOSN_1L; | |||
tr->langopts.param[LOPT_PREFIXES] = 1; | |||
SetLetterVowel(tr,'y'); | |||
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_ORDINAL_DOT | NUM_1900 | NUM_ROMAN | NUM_ROMAN_CAPITALS | NUM_ROMAN_ORDINAL; | |||
} | |||
@@ -451,9 +452,6 @@ Translator *SelectTranslator(const char *name) | |||
static const short stress_lengths_en[8] = {182,140, 220,220, 0,0, 248,275}; | |||
SetupTranslator(tr,stress_lengths_en,NULL); | |||
tr->transpose_min = 'a'; | |||
tr->transpose_max = 'z'; | |||
tr->langopts.stress_rule = STRESSPOSN_1L; | |||
tr->langopts.stress_flags = 0x08; | |||
tr->langopts.numbers = NUM_HUNDRED_AND | NUM_ROMAN | NUM_1900; | |||
@@ -485,6 +483,7 @@ Translator *SelectTranslator(const char *name) | |||
tr->letter_bits_offset = OFFSET_GREEK; | |||
memset(tr->letter_bits,0,sizeof(tr->letter_bits)); | |||
SetLetterBits(tr,LETTERGP_A,el_vowels); | |||
SetLetterBits(tr,LETTERGP_VOWEL2,el_vowels); | |||
SetLetterBits(tr,LETTERGP_B,el_voiceless); | |||
SetLetterBits(tr,LETTERGP_C,el_consonants); | |||
SetLetterBits(tr,LETTERGP_Y,el_fvowels); // front vowels: ε η ι υ | |||
@@ -733,6 +732,7 @@ SetLengthMods(tr,3); // all equal | |||
tr->letter_bits_offset = OFFSET_ARMENIAN; | |||
memset(tr->letter_bits,0,sizeof(tr->letter_bits)); | |||
SetLetterBits(tr,LETTERGP_A,hy_vowels); | |||
SetLetterBits(tr,LETTERGP_VOWEL2,hy_vowels); | |||
SetLetterBits(tr,LETTERGP_C,hy_consonants); | |||
tr->langopts.max_initial_consonants = 6; | |||
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_OMIT_1_HUNDRED; | |||
@@ -902,7 +902,7 @@ SetLengthMods(tr,3); // all equal | |||
tr->langopts.param[LOPT_PREFIXES] = 1; | |||
tr->langopts.param[LOPT_REGRESSIVE_VOICING] = 0x10; // devoice at end of word | |||
SetLetterVowel(tr,'y'); | |||
tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_OMIT_1_HUNDRED | NUM_ALLOW_SPACE | NUM_1900 | NUM_ORDINAL_DOT; | |||
tr->langopts.ordinal_indicator = "e"; | |||
memcpy(tr->stress_lengths,stress_lengths_nl,sizeof(tr->stress_lengths)); |
@@ -766,12 +766,14 @@ int TranslateWord(Translator *tr, char *word1, int next_pause, WORD_TAB *wtab) | |||
int word_length; | |||
int ix; | |||
char *p; | |||
int pfix; | |||
int n_chars; | |||
unsigned int dictionary_flags[2]; | |||
unsigned int dictionary_flags2[2]; | |||
int end_type=0; | |||
int prefix_type=0; | |||
int prefix_stress; | |||
char *wordx; | |||
char phonemes[N_WORD_PHONEMES]; | |||
char *ph_limit; | |||
@@ -1007,7 +1009,6 @@ if((wmark > 0) && (wmark < 8)) | |||
while(((length < 3) && (length > 0))|| (word_length > 1 && Unpronouncable(tr,wordx))) | |||
{ | |||
char *p; | |||
// This word looks "unpronouncable", so speak letters individually until we | |||
// find a remainder that we can pronounce. | |||
emphasize_allcaps = 0; | |||
@@ -1311,9 +1312,15 @@ if(dictionary_flags2[0] & FLAG_ABBREV) | |||
/* determine stress pattern for this word */ | |||
/******************************************/ | |||
/* NOTE: this also adds a single PAUSE if the previous word ended | |||
in a primary stress, and this one starts with one */ | |||
if(prefix_flags || (strchr(prefix_phonemes,phonSTRESS_P)!=NULL)) | |||
prefix_stress = 0; | |||
for(p = prefix_phonemes; *p != 0; p++) | |||
{ | |||
if((*p == phonSTRESS_P) || (*p == phonSTRESS_P2)) | |||
{ | |||
prefix_stress = *p; | |||
} | |||
} | |||
if(prefix_flags || (prefix_stress != 0)) | |||
{ | |||
if((tr->langopts.param[LOPT_PREFIXES]) || (prefix_type & SUFX_T)) | |||
{ | |||
@@ -2303,6 +2310,7 @@ void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *t | |||
char *p; | |||
int j, k; | |||
int n_digits; | |||
int individual_digits; | |||
int charix_top=0; | |||
short charix[N_TR_SOURCE+4]; | |||
@@ -2338,7 +2346,9 @@ void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *t | |||
for(p=source; *p != 0; p++) | |||
fputc(*p, f_logespeak); | |||
fprintf(f_logespeak,"ENDCLAUSE\n"); | |||
fflush(f_logespeak); | |||
} | |||
p = source; | |||
charix[charix_top+1] = 0; | |||
charix[charix_top+2] = 0x7fff; | |||
@@ -2947,7 +2957,11 @@ if((c == '/') && (tr->langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(pre | |||
words[word_count].pre_pause = 8; | |||
if(word_count > 0) | |||
{ | |||
words[word_count-1].flags |= FLAG_LAST_WORD; | |||
ix = word_count-1; | |||
while((ix > 0) && (IsBracket(sbuf[words[ix].start]))) | |||
ix--; // the last word is a bracket, mark the previous word as last | |||
words[ix].flags |= FLAG_LAST_WORD; | |||
// FLAG_NOSPACE check to avoid recognizing .mr -mr | |||
if((terminator & CLAUSE_DOT) && !(words[word_count-1].flags & FLAG_NOSPACE)) | |||
words[word_count-1].flags |= FLAG_HAS_DOT; | |||
@@ -2962,8 +2976,8 @@ if((c == '/') && (tr->langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(pre | |||
char *pn; | |||
char *pw; | |||
int nw; | |||
char number_buf[60]; | |||
WORD_TAB num_wtab[15]; // copy of 'words', when splitting numbers into parts | |||
char number_buf[150]; | |||
WORD_TAB num_wtab[50]; // copy of 'words', when splitting numbers into parts | |||
// start speaking at a specified word position in the text? | |||
count_words++; | |||
@@ -2984,7 +2998,7 @@ if((c == '/') && (tr->langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(pre | |||
{ | |||
// Languages with 100000 numbers. Remove thousands separators so that we can insert them again later | |||
pn = number_buf; | |||
while(pn < &number_buf[sizeof(number_buf)-3]) | |||
while(pn < &number_buf[sizeof(number_buf)-20]) | |||
{ | |||
if(iswdigit(*pw)) | |||
{ | |||
@@ -3010,15 +3024,19 @@ if((c == '/') && (tr->langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(pre | |||
for(n_digits=0; iswdigit(word[n_digits]); n_digits++); // count consecutive digits | |||
if((n_digits > 4) && (word[0] != '0')) | |||
if(n_digits > 4) | |||
{ | |||
// word is entirely digits, insert commas and break into 3 digit "words" | |||
number_buf[0] = ' '; | |||
pn = &number_buf[1]; | |||
nx = n_digits; | |||
nw = 0; | |||
individual_digits = 0; | |||
if((n_digits > tr->langopts.max_digits) || (word[0] == '0')) | |||
words[ix].flags |= FLAG_INDIVIDUAL_DIGITS; | |||
while(pn < &number_buf[sizeof(number_buf)-3]) | |||
while(pn < &number_buf[sizeof(number_buf)-20]) | |||
{ | |||
if(!isdigit(c = *pw++) && (c != tr->langopts.decimal_sep)) | |||
break; |
@@ -108,6 +108,7 @@ | |||
#define FLAG_HAS_DOT 0x10000 // dot after this word | |||
#define FLAG_COMMA_AFTER 0x20000 // comma after this word | |||
#define FLAG_MULTIPLE_SPACES 0x40000 // word is preceded by multiple spaces, newline, or tab | |||
#define FLAG_INDIVIDUAL_DIGITS 0x80000 // speak number as individual digits | |||
#define FLAG_SUFFIX_VOWEL 0x08000000 // remember an initial vowel from the suffix | |||
#define FLAG_NO_TRACE 0x10000000 // passed to TranslateRules() to suppress dictionary lookup printout | |||
@@ -194,18 +195,18 @@ | |||
#define PUNCT_SAY_NAME 0x200000 | |||
#define CLAUSE_DOT 0x400000 | |||
#define CLAUSE_NONE 0 + 0x04000 | |||
#define CLAUSE_PARAGRAPH 70 + 0x80000 | |||
#define CLAUSE_EOF 40 + 0x90000 | |||
#define CLAUSE_VOICE 0 + 0x24000 | |||
#define CLAUSE_PERIOD 40 + 0x80000 | |||
#define CLAUSE_COMMA 20 + 0x41000 | |||
#define CLAUSE_SHORTCOMMA 4 + 0x41000 | |||
#define CLAUSE_SHORTFALL 4 + 0x40000 | |||
#define CLAUSE_QUESTION 40 + 0x82000 | |||
#define CLAUSE_EXCLAMATION 45 + 0x83000 | |||
#define CLAUSE_COLON 30 + 0x40000 | |||
#define CLAUSE_SEMICOLON 30 + 0x41000 | |||
#define CLAUSE_NONE ( 0 + 0x04000) | |||
#define CLAUSE_PARAGRAPH (70 + 0x80000) | |||
#define CLAUSE_EOF (40 + 0x90000) | |||
#define CLAUSE_VOICE ( 0 + 0x24000) | |||
#define CLAUSE_PERIOD (40 + 0x80000) | |||
#define CLAUSE_COMMA (20 + 0x41000) | |||
#define CLAUSE_SHORTCOMMA ( 4 + 0x41000) | |||
#define CLAUSE_SHORTFALL ( 4 + 0x40000) | |||
#define CLAUSE_QUESTION (40 + 0x82000) | |||
#define CLAUSE_EXCLAMATION (45 + 0x83000) | |||
#define CLAUSE_COLON (30 + 0x40000) | |||
#define CLAUSE_SEMICOLON (30 + 0x41000) | |||
#define SAYAS_CHARS 0x12 | |||
#define SAYAS_GLYPHS 0x13 | |||
@@ -439,6 +440,7 @@ typedef struct { | |||
int min_roman; | |||
int thousands_sep; | |||
int decimal_sep; | |||
int max_digits; // max number of digits which can be spoken as an integer number (rather than individual digits) | |||
const char *ordinal_indicator; // UTF-8 string | |||
// bit 0, accent name before the letter name, bit 1 "capital" after letter name |
@@ -611,7 +611,7 @@ void MakeVowelLists(void) | |||
prog_log_table = (PHONEME_PROG_LOG *)malloc(ix); | |||
if(prog_log_table == NULL) | |||
return; | |||
fread(prog_log_table, 1, ix, f_prog_log); | |||
ix = fread(prog_log_table, 1, ix, f_prog_log); | |||
fclose(f_prog_log); | |||
prog_log_end = prog_log_table + ix; | |||
n_prog_log = ix / sizeof(PHONEME_PROG_LOG); |