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