Browse Source

[1.44.18]

Change in format of *_dict files.  'Word-boundary' at the start of a rule from *_rules is not implied by a new rule type RULE_PRE_ATSTART.
espeakedit: Improvements to Tools->Process Lexicon->Italian which makes the file dictsource/it_listx.
lang=hu, fixes for ordinal numbers.
Speed-up, add files sonic.cpp, sonic.h



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

+ 253
- 102
dictsource/da_list View File

_! udRVbstejn _! udRVbstejn
_- binnesdrai _- binnesdrai
__ b'Onsdrai __ b'Onsdrai
& ou
& Vw
£ pun? £ pun?
€ euro € euro
© kopyrajt © kopyrajt
_1M4 'e:n||bilij'o:n _1M4 'e:n||bilij'o:n
_0M4 bilij'o:n3 _0M4 bilij'o:n3


_0and 3
_0and V
_dpt _k,Vm&: _dpt _k,Vm&:


// PB a number followed by dot // PB a number followed by dot
ø W ø W


// PB English words // PB English words
bacon _^_EN
bondage _^_EN bondage _^_EN
volleyball _^_EN volleyball _^_EN
dj _^_EN dj _^_EN
cool _^_EN cool _^_EN
couch _^_EN couch _^_EN
cursor _^_EN cursor _^_EN
//cowboy _^_EN
debugger _^_EN debugger _^_EN
ensemble _^_FR ensemble _^_FR
event _^_EN event _^_EN
interface _^_EN interface _^_EN
image _^_EN image _^_EN
joke _^_EN joke _^_EN
joystick _^_EN
laptop _^_EN laptop _^_EN
level _^_EN level _^_EN
login _^_EN login _^_EN
look _^_EN look _^_EN
lord _^_EN
//lord _^_EN
macho _^_EN macho _^_EN
management _^_EN management _^_EN
message _^_EN message _^_EN
clarence _^_EN $alt clarence _^_EN $alt
cyrus _^_EN cyrus _^_EN
cia _^_EN $alt cia _^_EN $alt
fbi _^_EN $alt
fox _^_EN fox _^_EN
jones _^_EN jones _^_EN
larry _^_EN $alt larry _^_EN $alt
trikotage $alt trikotage $alt


// PB final -abel - stressed a // PB final -abel - stressed a
acceptabel $alt
affabel $alt
aimabel $alt
amortisabel $alt
analysabel $alt
appellabel $alt
applikabel $alt
deklinabel $alt
demontabel $alt
differentiabel $alt
diskutabel $alt
disputabel $alt
durabel $alt
fashionabel $alt
favorabel $alt
formidabel $alt
inacceptabel $alt
inkommensurabel $alt
irritabel $alt
kapabel $alt
kassabel $alt
komfortabel $alt
kommensurabel $alt
kommutabel $alt
komparabel $alt
kondemnabel $alt
konfiskabel $alt
konstabel $alt
kontrollabel $alt
konvenabel $alt
konversabel $alt
kritisabel $alt
kurabel $alt
//mirabel $alt
miserabel $alt
mutabel $alt
navigabel $alt
negligeabel $alt
negotiabel $alt
notabel $alt
operabel $alt
parabel $alt
passabel $alt
portabel $alt
praktikabel $alt
praktisabel $alt
profitabel $alt
præsentabel $alt
realisabel $alt
remarkabel $alt
rentabel $alt
reparabel $alt
respektabel $alt
risikabel $alt
ræsonnabel $alt
spendabel $alt
tolerabel $alt
trafikabel $alt
transportabel $alt
variabel $alt
venerabel $alt
veritabel $alt
vulnerabel $alt
// "el" has been removed in order to make rules for
// "konstabel" and the plural "konstabler" without "e"
acceptab $alt
affab $alt
aimab $alt
amortisab $alt
analysab $alt
appellab $alt
applikab $alt
deklinab $alt
demontab $alt
differentiab $alt
diskutab $alt
disputab $alt
durab $alt
fashionab $alt
favorab $alt
formidab $alt
inacceptab $alt
inkommensurab $alt
irritab $alt
kapab $alt
kassab $alt
komfortab $alt
kommensurab $alt
kommutab $alt
komparab $alt
kondemnab $alt
konfiskab $alt
konstab $alt
kontrollab $alt
konvenab $alt
konversab $alt
kritisab $alt
kurab $alt
miserab $alt
mutab $alt
navigab $alt
negligeab $alt
negotiab $alt
notab $alt
operab $alt
parab $alt
passab $alt
portab $alt
praktikab $alt
praktisab $alt
profitab $alt
præsentab $alt
realisab $alt
remarkab $alt
rentab $alt
reparab $alt
respektab $alt
risikab $alt
ræsonnab $alt
spendab $alt
tolerab $alt
trafikab $alt
transportab $alt
variab $alt
venerab $alt
veritab $alt
vulnerab $alt


// PB adjectives and nouns with final -ant - stressed a // PB adjectives and nouns with final -ant - stressed a
acceptant $alt acceptant $alt
fluvial $alt fluvial $alt
foderal $alt foderal $alt
formal $alt formal $alt
fokal $alt
fraktal $alt fraktal $alt
frontal $alt frontal $alt
frugal $alt frugal $alt
monumental $alt monumental $alt
moral $alt moral $alt
museal $alt museal $alt
musical mju:sik3l $alt
nasal $alt nasal $alt
national $alt national $alt
neural $alt neural $alt
vordingborgenser $alt vordingborgenser $alt
ålborgenser $alt ålborgenser $alt


// PB final -em: stressed e
problem $alt
bekvem $alt
diadem $alt
eksem $alt
ekstrem $alt
emblem $alt
fonem $alt
grafem $alt
morfem $alt
myxødem $alt
poem $alt
system $alt
teorem $alt
ødem $alt
// PB country names with final -ien - stress on previous syllable // PB country names with final -ien - stress on previous syllable
abessinien $alt abessinien $alt
abkhasien $alt abkhasien $alt
forfatterinde $alt forfatterinde $alt
forstanderinde $alt forstanderinde $alt
fyrstinde $alt fyrstinde $alt
fristerinde $alt
gelinde gel'end@ $alt gelinde gel'end@ $alt
gemalinde $alt gemalinde $alt
grevinde $alt grevinde $alt
kvadrofoni $alt kvadrofoni $alt
litani $alt litani $alt
ludomani $alt ludomani $alt
mahogni m&h'oni $alt
makaroni m&k@r'Vni $alt makaroni m&k@r'Vni $alt
mani $alt mani $alt
misogyni $alt misogyni $alt
salami sal'&mi $alt salami sal'&mi $alt
socionomi $alt socionomi $alt
sodomi $alt sodomi $alt
stomi $alt
synonymi $alt synonymi $alt
taksonomi $alt taksonomi $alt
trakeotomi $alt trakeotomi $alt
mokkasin $alt mokkasin $alt
morfin $alt morfin $alt
muezzin $alt muezzin $alt
muffin mVf'en $alt
musselin $alt musselin $alt
naftalin $alt naftalin $alt
nankin $alt nankin $alt
tyfoid $alt tyfoid $alt
valid $alt valid $alt


// PB final -iker: stressed previous syllable
afatiker $alt
agnostiker $alt
akademiker $alt
akustiker $alt
alkoholiker $alt
allergiker $alt
analytiker $alt
anorektiker $alt
apoplektiker $alt
aritmetiker $alt
asteniker $alt
astigmatiker $alt
astmatiker $alt
atlantiker $alt
blasfemiker $alt
botaniker $alt
bulimiker $alt
datamatiker $alt
diabetiker $alt
diagnostiker $alt
dialektiker $alt
didaktiker $alt
diætetiker $alt
dogmatiker $alt
dramatiker $alt
dysfatiker $alt
dyslektiker $alt
egocentriker $alt
eklektiker $alt
elegiker $alt
elektriker $alt
elektroniker $alt
empiriker $alt
epigrafiker $alt
epileptiker $alt
erotiker $alt
excentriker $alt
fanatiker $alt
filharmoniker $alt
flegmatiker $alt
fonetiker $alt
føniker $alt
genetiker $alt
gnostiker $alt
grammatiker $alt
heraldiker $alt
hermeneutiker $alt
historiker $alt
homiletiker $alt
hysteriker $alt
hæretiker $alt
idylliker $alt
ironiker $alt
karismatiker $alt
keramiker $alt
kiromantiker $alt
kiropraktiker $alt
koleriker $alt
logistiker $alt
matematiker $alt
mekaniker $alt
melankoliker $alt
melodiker $alt
metafysiker $alt
metodiker $alt
metriker $alt
nekromantiker $alt
neurasteniker $alt
neurotiker $alt
nostalgiker $alt
numismatiker $alt
obstetriker $alt
pantomimiker $alt
paralytiker $alt
parlamentariker $alt
peripatetiker $alt
platoniker $alt
polemiker $alt
politiker $alt
polytekniker $alt
pragmatiker $alt
prognostiker $alt
prosaiker $alt
retoriker $alt
reumatiker $alt
romantiker $alt
sangviniker $alt
satiriker $alt
sekteriker $alt
semantiker $alt
semiotiker $alt
skeptiker $alt
skismatiker $alt
skolastiker $alt
statistiker $alt
syfilitiker $alt
symfoniker $alt
systematiker $alt
teoretiker $alt
typotekniker $alt
æstetiker $alt
økumeniker $alt

//PB words with final -isk - stress on the previous syllable //PB words with final -isk - stress on the previous syllable
abkhasisk $alt abkhasisk $alt
absolutistisk $alt absolutistisk $alt
tvivlrådig $alt tvivlrådig $alt
tyvagtig $alt tyvagtig $alt
tålmodig $alt tålmodig $alt
ungdommelig $alt
vankundig $alt vankundig $alt
vederheftig $alt vederheftig $alt
vederhæftig $alt vederhæftig $alt
skriveri $alt skriveri $alt
skruebrækkeri $alt skruebrækkeri $alt
skrædderi $alt skrædderi $alt
skyderi $alt
skulkeri $alt skulkeri $alt
skumleri $alt skumleri $alt
skyderi $alt skyderi $alt
auktionere $alt auktionere $alt
auskulter $alt auskulter $alt
autentificer $alt autentificer $alt
autografer $alt
autografere $alt
autoklaver $alt autoklaver $alt
automatiser $alt automatiser $alt
autonomiser $alt autonomiser $alt
avancere $alt avancere $alt
averter $alt averter $alt
bagatelliser $alt bagatelliser $alt
bajader $alt
bajadere $alt
balancere $alt balancere $alt
balkaniser $alt balkaniser $alt
balloter $alt balloter $alt
banderolere $alt banderolere $alt
barbariser $alt barbariser $alt
barbere $alt barbere $alt
barder $alt
bardere $alt
barrier $alt barrier $alt
barrikader $alt barrikader $alt
basere $alt basere $alt
formatere $alt formatere $alt
formere $alt formere $alt
formuler $alt formuler $alt
omformuler $alt
fortificer $alt fortificer $alt
fosfatere $alt fosfatere $alt
fosforescer $alt fosforescer $alt
karburer $alt karburer $alt
karesser $alt karesser $alt
kariker $alt kariker $alt
karrier $alt
karriere $alt
karter $alt karter $alt
kartonner $alt kartonner $alt
kaserner $alt
kasernere $alt
kassere $alt kassere $alt
kastrer $alt kastrer $alt
katalogiser $alt katalogiser $alt
katalyser $alt katalyser $alt
katapulter $alt
katapultere $alt
kategoriser $alt kategoriser $alt
katekiser $alt katekiser $alt
katolicer $alt katolicer $alt
komplementer $alt komplementer $alt
kompletter $alt kompletter $alt
komplicer $alt komplicer $alt
komplimenter $alt
komplimentere $alt
komponer $alt komponer $alt
komposter $alt komposter $alt
komprimer $alt komprimer $alt
persister $alt persister $alt
personaliser $alt personaliser $alt
personificer $alt personificer $alt
perspektiver $alt
perspektivere $alt
perturber $alt perturber $alt
perverter $alt perverter $alt
petitioner $alt petitioner $alt
pizziker $alt pizziker $alt
placer $alt placer $alt
plagier $alt plagier $alt
plakater $alt
plakatere $alt
planere $alt planere $alt
plastificer $alt plastificer $alt
platiner $alt platiner $alt
realiser $alt realiser $alt
reassumer $alt reassumer $alt
reassurer $alt reassurer $alt
rebeller $alt
rebellere $alt
recenser $alt recenser $alt
recidiver $alt recidiver $alt
recirkuler $alt recirkuler $alt
reducer $alt reducer $alt
referer $alt referer $alt
reflekter $alt reflekter $alt
reformer $alt
reformere $alt
refunder $alt refunder $alt
refuser $alt refuser $alt
regaler $alt regaler $alt
synkroniser $alt synkroniser $alt
syntetiser $alt syntetiser $alt
systematiser $alt systematiser $alt
tabeller $alt
tabellere $alt
tabuere $alt tabuere $alt
tabuiser $alt tabuiser $alt
tabuler $alt tabuler $alt
typografer $alt typografer $alt
tyranniser $alt tyranniser $alt
uniformere $alt uniformere $alt
undervurder $alt
urbaniser $alt urbaniser $alt
urger $alt urger $alt
uriner $alt uriner $alt
usurper $alt usurper $alt
vacciner $alt vacciner $alt
vagabonder $alt
vagabondere $alt
valider $alt valider $alt
valoriser $alt valoriser $alt
valuter $alt valuter $alt
vikarier $alt vikarier $alt
vindicer $alt vindicer $alt
viriliser $alt viriliser $alt
visere $alt
//visere $alt
visiter $alt visiter $alt
visualiser $alt visualiser $alt
vitaliser $alt vitaliser $alt
autorisation $alt autorisation $alt
aversion $alt aversion $alt
ballotation $alt ballotation $alt
baron $alt
bastion $alt bastion $alt
benediktion $alt benediktion $alt
billion $alt billion $alt
meson $alt meson $alt
person $alt person $alt
ræson REs'VN $alt ræson REs'VN $alt
sæson sEs'VN $alt
//sæson sEs'VN $alt
unison $alt unison $alt


// PB exceptions from the "be" rule in group "be" // PB exceptions from the "be" rule in group "be"
eskalator $alt eskalator $alt
evaluator $alt evaluator $alt
evaporator $alt evaporator $alt
faktor $alt
fundator $alt fundator $alt
generator $alt generator $alt
gladiator $alt gladiator $alt
makulator $alt makulator $alt
manipulator $alt manipulator $alt
multiplikator $alt multiplikator $alt
motor $alt
nomenklator $alt nomenklator $alt
observator $alt observator $alt
operator $alt operator $alt
vibrator $alt vibrator $alt
visitator $alt visitator $alt
ækvator $alt ækvator $alt
junior $alt
prior $alt
senior $alt
aggressor $alt
assessor $alt
censor $alt
decisor $alt
defensor $alt
dimissor $alt
divisor $alt
kompressor $alt
kondensor $alt
processor $alt
professor $alt
provisor $alt
revisor $alt
sensor $alt
sponsor $alt
successor $alt
kondor $alt
korridor $alt
labrador $alt
matador $alt
picador $alt
ronkedor $alt
toreador $alt
//major $alt
anafor $alt
metafor $alt
hydrofor $alt
donor $alt
sonor $alt
tenor $alt
tumor $alt


// PB Final -ut - stressed u // PB Final -ut - stressed u
absolut $alt absolut $alt
assurandør $alt assurandør $alt
auditør $alt auditør $alt
bankør $alt bankør $alt
billettør $alt
causør $alt causør $alt
charmør $alt charmør $alt
chauffør $alt chauffør $alt
seriøs $alt seriøs $alt
serøs $alt serøs $alt
skabrøs $alt skabrøs $alt
skandaløs $alt
skarlatinøs $alt skarlatinøs $alt
skrofuløs $alt skrofuløs $alt
spatiøs $alt spatiøs $alt
rejicerer rejis'eV // PB rejicerer rejis'eV // PB
rejiceres rejis'eVs // PB rejiceres rejis'eVs // PB
rejicering rejis'eRiN // PB rejicering rejis'eRiN // PB
gele sjel'e // PB gele
gelé sjel'e // PB gelé
geleen sjel'e@-n // PB geleen
geleer sjel'e3 // PB geleer
geleens sjel'e@-ns // PB geleens
geleerne sjel'eVn@ // PB geleerne
geleernes sjel'eVn@s // PB geleernes
geleagtig sjel'eagte //PB geleagtig
geleagtige sjel'eagte@ //PB geleagtige
nogle n'o:@-n // PB English: 'some' - must be pronounced like the Danish word 'nogen' nogle n'o:@-n // PB English: 'some' - must be pronounced like the Danish word 'nogen'
nogen n'o:@-n // PB nogen n'o:@-n // PB
ligesom lisVm // PB ligesom lisVm // PB
konfirmander kVnferm'&nd3 // PB konfirmander kVnferm'&nd3 // PB
konfirmanderne kVnferm'&nd3-n@ // PB konfirmanderne kVnferm'&nd3-n@ // PB
konfirmandernes kVnferm'&nd3-n@s // PB konfirmandernes kVnferm'&nd3-n@s // PB
dollar dVlV // PB
//dollar dVlV // PB
giv g'i // PB the v shouldn't be pronounced giv g'i // PB the v shouldn't be pronounced
giver gir // PB the v shouldn't be pronounced giver gir // PB the v shouldn't be pronounced
jaloux sja'lu // PB jaloux
jaloux sj&'lu // PB jaloux
aficionado afisjo'na:do // PB aficionado afisjo'na:do // PB
breakdance brEig'da:ns // PB breakdance breakdance brEig'da:ns // PB breakdance
breakdancen brEig'da:ns@-n // PB breakdancen breakdancen brEig'da:ns@-n // PB breakdancen
date dejt // PB date - stævnemøde date dejt // PB date - stævnemøde
siger sir // PB silent d siger sir // PB silent d
(tids nok) tis||n'Vk // PB silent d (tids nok) tis||n'Vk // PB silent d
cologne ko'lVN3 // PB
skateboardet sk'eitbo@d3D // PB skateboardet sk'eitbo@d3D // PB
billie bile // PB the name Billie billie bile // PB the name Billie
(hole in one) h'oulinw,0n // PB English golf expression used in Danish (hole in one) h'oulinw,0n // PB English golf expression used in Danish
ngo $abbrev ngo $abbrev
edb $abbrev edb $abbrev
mri $abbrev mri $abbrev
kfuk $abbrev $allcaps
wc v'ese // w is pronounces as v in Danish wc v'ese // w is pronounces as v in Danish
(wc'et) v'ese@d (wc'et) v'ese@d
(wc'er) v'eseV (wc'er) v'eseV
// PB problem with 'sig' [si] = "say" and 'sig' = "himself/herself" [saj] // PB problem with 'sig' [si] = "say" and 'sig' = "himself/herself" [saj]
(sig mig) si||maj // PB sig mig engang (sig mig) si||maj // PB sig mig engang
(sig hvad) si||v& // PB sig hvad du mener (sig hvad) si||v& // PB sig hvad du mener
(sig det) si||de // PB sig det, du mener
sig $atend $sentence saj // end of a sentence - han vaskede sig. sig $atend $sentence saj // end of a sentence - han vaskede sig.
(gør sig til) g,Wr||saj||t'el // PB (gør sig til) g,Wr||saj||t'el // PB
(gav sig til) g&||saj||tel // PB han gav sig til at ... (gav sig til) g&||saj||tel // PB han gav sig til at ...
(så længe) sV||l'EN3 (så længe) sV||l'EN3
(så være) sV||v'EV (så være) sV||v'EV
(så må) sV||m'O (så må) sV||m'O
(så må sige) s'O||m'O|s'i@
(så har) sV||har (så har) sV||har
(se så) se||sV (se så) se||sV
(så sent) sV||sent (så sent) sV||sent
(ville så) vil3||sV (ville så) vil3||sV
så sV $sentence $atstart
//så sV $sentence $atstart
(hvad så) v&||sV $atend // "Hvad så?" (hvad så) v&||sV $atend // "Hvad så?"
(virkede så) v'irkeD@||sV (virkede så) v'irkeD@||sV
(kom så) kVm||sV (kom så) kVm||sV

+ 1815
- 1315
dictsource/da_rules
File diff suppressed because it is too large
View File


+ 21
- 9
dictsource/dict_phonemes View File

x z x z




Dictionary da_dict 2010-10-28
Dictionary da_dict 2010-12-02


& &# 0 3 @ @- a A & &# 0 3 @ @- a A
e E i o O u V W
W# y Y
aI e E i o O u V
W W# y Y


* - : ? b B d D * - : ? b B d D
dZ f g h j J k l dZ f g h j J k l
z z




Dictionary hu_dict 2010-11-17
Dictionary hu_dict 2010-12-02


a A a: E e: i i: o a A a: E e: i i: o
o: u u: Y y y: Y: o: u u: Y y y: Y:
- : b c C d dZ dz - : b c C d dZ dz
f g h j J k l m f g h j J k l m
n n^ p r R R2 s S n n^ p r R R2 s S
s2 t tS ts v z Z
s2 t t2 tS ts v z Z




Dictionary de_dict 2010-08-25 Dictionary de_dict 2010-08-25
ts v x z z; ts v x z z;




Dictionary en_dict 2010-11-04
Dictionary en_dict 2010-11-18


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
t. th th. v w x z t. th th. v w x z




Dictionary ta_dict 2010-11-15
Dictionary ta_dict 2010-12-01


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:
S s2 t T tl# v x z S s2 t T tl# v x z




Dictionary it_dict 2010-11-10
Dictionary it_dict 2010-12-03


@- a a/ aI aU e E eI @- a a/ aI aU e E eI
i I o O u i I o O u
t tS v w x t tS v w x




Dictionary nl_dict 2010-11-10
Dictionary nl_dict 2010-12-03


8 @ @- a A a: A~ E 8 @ @- a A a: A~ E
E2 e: EI eU i I o O E2 e: EI eU i I o O
h j J k l m n p h j J k l m n p
Q R s S t tS v w Q R s S t tS v w
x z Z x z Z


Dictionary wo_dict 2010-11-30

@ @: a a: e E e: E:
i i: m- n- N- o O O:
o: u u:

: b c d f g h j
J k l m n N n^ p
q R R2 s s2 t v w
x z

+ 1
- 1
dictsource/en_list View File

salmon sam@n salmon sam@n
scalpel skalp@L scalpel skalp@L
scared ske@d scared ske@d
scaring ske@rI2
scaring ske@rI2N
scenic si:nIk scenic si:nIk
scald sk0ld scald sk0ld
scepter sEpt3 scepter sEpt3

+ 2
- 3
dictsource/en_rules View File

r) ogue oUg r) ogue oUg
v) ogue oUg v) ogue oUg
@@) ogue 0g @@) ogue 0g
l) o (gy @
@l) og (y =@dZ
oh oU oh oU
o (hA oU o (hA oU
j) oh (n 0 j) oh (n 0
at) oll 0l at) oll 0l
w) oll oUl w) oll oUl
olm (_ oUm olm (_ oUm
olo (gy '0l@
olo (gi '0l@ olo (gi '0l@
olo (gic @l'0 olo (gic @l'0
v) olt oUlt v) olt oUlt
?8 &f) ully (_ Vl%I ?8 &f) ully (_ Vl%I
&) u (lous_ =jU &) u (lous_ =jU
b) ul (r Ul b) ul (r Ul
&ic) ul (t @L
&ic) ul (t_ @L
_) ultra (@ ,Ultra _) ultra (@ ,Ultra
u (lul V u (lul V
@) u (lum =jU @) u (lum =jU

+ 29
- 8
dictsource/hu_list View File

_2a ke:t // for 200, 2000 _2a ke:t // for 200, 2000
_3 ha:R2om _3 ha:R2om
_4 ne:J _4 ne:J
_5 Yt
_6 hAt
_7 he:t
_5 Yt2 // [t2] changes a following [t] to [t:]
_6 hAt2 // [t2] changes a following [t] to [t:]
_7 he:t2 // [t2] changes a following [t] to [t:]
_8 n^olts _8 n^olts
_9 kilEnts _9 kilEnts
_10 ti:z _10 ti:z
(0-st) nul:a:St (0-st) nul:a:St
(1-gyet) EJ:Et (1-gyet) EJ:Et
(1-gyes) EJ:ES (1-gyes) EJ:ES
(2-szer) ke:ts:ER2
(2-őt) kEt:Y:t (2-őt) kEt:Y:t
(2-őn) kEt:Y:n (2-őn) kEt:Y:n
(2-n) kEt:Y:n (2-n) kEt:Y:n
(6-tal) hAt:Al (6-tal) hAt:Al
(6-tól) hAt:o:l (6-tól) hAt:o:l
(6-tól) h'Atodika:to:l $alt2 (6-tól) h'Atodika:to:l $alt2
(6-szor) hAts:oR2
(7-től) he:t:Y:l (7-től) he:t:Y:l
(7-től) hEtEdike:tY:l $alt2 (7-től) hEtEdike:tY:l $alt2
(7-tel) he:t:El (7-tel) he:t:El
(7-el) he:t:El (7-el) he:t:El
(7-sekre) hEtESEkR2E (7-sekre) hEtESEkR2E
(7-sel) hEtES:El (7-sel) hEtES:El
(7-szer) he:ts:ER2
(8-cal) n^olts:Al (8-cal) n^olts:Al
(8-al) n^olts:Al (8-al) n^olts:Al
(9-el) kilEnts:El (9-el) kilEnts:El
(10-t) tizEt (10-t) tizEt





//special number exceptions //special number exceptions
(10-el) ti:zzEl (10-el) ti:zzEl
(20-al) hu:s:Al (20-al) hu:s:Al


// Abbreviations // Abbreviations
ADSL a:de:ESEl $allcaps //Internet connection type, we pronouns this with ádéesel ADSL a:de:ESEl $allcaps //Internet connection type, we pronouns this with ádéesel
ÁFAa:fA $allcaps
ÁNTSZ a:Ente:Es $allcaps ÁNTSZ a:Ente:Es $allcaps
ATM a:te:Em $allcaps //The ATM stands. We pronouns this abbreviation with átéem word. Default, Espeak pronouns this abbreviation with atéem word. ATM a:te:Em $allcaps //The ATM stands. We pronouns this abbreviation with átéem word. Default, Espeak pronouns this abbreviation with atéem word.
cm tsEntime:tER2 cm tsEntime:tER2
ORTT $abbrev $allcaps ORTT $abbrev $allcaps
ORFK oEREfka: $abbrev $allcaps ORFK oEREfka: $abbrev $allcaps
MÁV ma:v $allcaps MÁV ma:v $allcaps
LMP ElEmpe: $allcaps
MTI $abbrev $allcaps MTI $abbrev $allcaps
mm milime:tER2 mm milime:tER2
RAM R2Am $allcaps //Espeak normaly spokening this abbreviation with erraem, but this is not good RAM R2Am $allcaps //Espeak normaly spokening this abbreviation with erraem, but this is not good
előtt $alt $alt3 $unstressend előtt $alt $alt3 $unstressend
este $alt3 este $alt3
estéjén $alt3 estéjén $alt3
éjszakára $alt3
mögül $unstressend // behind mögül $unstressend // behind
mögött $unstressend mögött $unstressend
mögé $unstressend mögé $unstressend
közül $unstressend közül $unstressend
közé $unstressend közé $unstressend
között $u $alt3 között $u $alt3
idén $alt3
környékén $alt3 környékén $alt3
an $u // so many persons an $u // so many persons
as $u as $u
péntekig $alt3 péntekig $alt3
szombatig $alt3 szombatig $alt3
vasárnapig $alt3 vasárnapig $alt3

hétfőn $alt $alt3
kedden $alt3
szerdán $alt3
csütörtökön $alt3
pénteken $alt3
szombaton $alt3
vasárnapon $alt3
sok $unstressend // many sok $unstressend // many
kevés $unstressend // few kevés $unstressend // few
se $unstressend // neither se $unstressend // neither
döntöttek $unstressend döntöttek $unstressend
írt $unstressend írt $unstressend
méltó $unstressend méltó $unstressend
dől $unstressend
nyomsz $unstressend
elnök $unstressend
itthon $unstressend
otthon $unstressend
köszönhető $unstressend


// word pairs // word pairs


_— kviR2tmi:nus _— kviR2tmi:nus
_" ide:zY:jEl _" ide:zY:jEl
_( b'Alza:R2o:jEl $max3 _( b'Alza:R2o:jEl $max3
_) j'obbza:R2o:jEl $max3
_) j'obza:R2o:jEl $max3
_[ n^'ito:sYglEtES $max3 _[ n^'ito:sYglEtES $max3
_] z'a:R2o:sYglEtES $max3 _] z'a:R2o:sYglEtES $max3
_{ k'EzdY:kAptSoS $max3 _{ k'EzdY:kAptSoS $max3


$textmode $textmode
MSZP emeszpé MSZP emeszpé
MSZMP emeszempé
SZDSZ eszdéesz SZDSZ eszdéesz




(NVDA-t) envédéát (NVDA-t) envédéát
(NVDA-tól) envédéától (NVDA-tól) envédéától
(NVDA-val) envédéával (NVDA-val) envédéával


(%-kal) százalékkal
(ÁFÁ-t) áfát
(MB-al) megabájttal

+ 420
- 351
dictsource/hu_rules
File diff suppressed because it is too large
View File


+ 2
- 0
dictsource/it_list View File



// abbreviations // abbreviations
(http ://) 'ak:at,i:t,i:p'i:_ (http ://) 'ak:at,i:t,i:p'i:_
www 'vu'vu'vu
avv avvocato $text $hasdot


// articles // articles
i $u $only i $u $only

+ 153
- 125
dictsource/it_listx
File diff suppressed because it is too large
View File


+ 1
- 1
dictsource/it_rules View File

@) a (ggine_ 'a @) a (ggine_ 'a


_) ae (r aI _) ae (r aI
@) ano (_ %ano //ByFilo
// @) a (no_ =a //ByFilo, this seems to make it_listx longer
@) avano (_S5 'avano @) avano (_S5 'avano
a (tterA_ 'a a (tterA_ 'a



+ 35
- 1
dictsource/nl_list View File

mirabel $3 mirabel $3
tabel $2 tabel $2


// ending -eum is stressed ['e:8m]
atheneum $alt
colosseum $alt
jubileum $alt
lyceum $alt
mausoleum $alt
museum $alt
carbolineum $alt
linoleum $alt $2
marmoleum $alt
petroleum $alt $2

// ending -ot is stressed
fagot $2
kapot $2
patriot $3
komplot $2
poliglot $3
marmot $2
schavot $2

// words ending in el, elt, elde, elden, elend, elende, eld, ele, elen // words ending in el, elt, elde, elden, elend, elende, eld, ele, elen
// with stress on the previous syllable
// with stress on the previous syllable,
// also words ending in er. etc.

beter $alt

// adjectives // adjectives
edel $alt edel $alt
enkel $alt enkel $alt
agenda $2 agenda $2
amino $1 amino $1
amnestie $3 amnestie $3
bijziend $2 // bijziendheid
boudoir budv#'a:r boudoir budv#'a:r
bourgondier burx'o:ndi:@r bourgondier burx'o:ndi:@r
braille brAj@
circuit sIrku'i circuit sIrku'i
chalet Sa:lE chalet Sa:lE
champagne SAmp'An^@ champagne SAmp'An^@
check tSEk check tSEk
chiffon Sif'On chiffon Sif'On
contour ko:nt'ur contour ko:nt'ur
divers div'Ers
dynastie $3 dynastie $3
eensgelijks e:nsQ@l'EIks
emaille ,e:m'Aij@
eucharistie $4 eucharistie $4
inductie $2
ingewikkeld $3 ingewikkeld $3
ingrijpend $2 ingrijpend $2
ingeval $3 ingeval $3
ingevolge $3 ingevolge $3
ingrediënt $4 ingrediënt $4
ingenieur Inzj@nj'Y:r ingenieur Inzj@nj'Y:r
informatie $3
journaal Surn'a:l journaal Surn'a:l
maxima $1 maxima $1
meteen mEt'e:n meteen mEt'e:n
minima $1 minima $1
nabij nab'EI
ongastvrij OnQAstv@-*'EI ongastvrij OnQAstv@-*'EI
ongelooflijk $3 ongelooflijk $3
ongemakkelijk $3 ongemakkelijk $3
tegenwoordig $3 tegenwoordig $3
travestie $3 travestie $3
verderop $3 verderop $3
volledig $2
waarschijnlijk $2 waarschijnlijk $2





+ 48
- 6
dictsource/nl_rules View File

@) abel (_ 'a:bE2l @) abel (_ 'a:bE2l
@) abele (_ 'a:b@l@ @) abele (_ 'a:b@l@
_) af (C@P2 'Af _) af (C@P2 'Af
age (_ 'a:Z@
age (_N 'a:Z@
ages (_S1 s ages (_S1 s
age (_$w_alt a:Q@ age (_$w_alt a:Q@
aire (_ 'E:r aire (_ 'E:r
air (_ 'Er air (_ 'Er
@) agne (_ 'An^@
ale (_ 'a:l@ ale (_ 'a:l@
@) ant (_ 'Ant @) ant (_ 'Ant
@) ant (e_ 'Ant
@) ant (en_ 'Ant
@) ant (er_ 'Ant


@) a (de_ 'a: @) a (de_ 'a:
@) a (ta_ 'a: @) a (ta_ 'a:
&) baar (_ =ba:r &) baar (_ =ba:r
_) be (@P2 b@ _) be (@P2 b@
_) b (ee+ b _) b (ee+ b
_) bei (de bEI
_) be (ren bI: _) be (ren bI:
_) be (rm bE _) be (rm bE
_) be (stia bE _) be (stia bE
_) bezig be:z@x _) bezig be:z@x
_) beu bY: _) beu bY:
_) bij (C@P3 b'EI _) bij (C@P3 b'EI
_) brand br'And
_) bureau byr'o: _) bureau byr'o:
_) buurt (@@P5 b'yrt // buurtbewoner _) buurt (@@P5 b'yrt // buurtbewoner


ciële S'e:l@ ciële S'e:l@
coach ko:tS coach ko:tS


_) congres kOnQr'Es



.group d .group d
d d // auto-devoice at end-of-word d d // auto-devoice at end-of-word


.group e .group e
e e: e e:
&C) e (_S1q @
&C) e (_S1qd @
e (_ @ e (_ @
e (CK E e (CK E
e (x E e (x E
eeuw eU eeuw eU
eu Y: eu Y:


ea (_ 'e:a:
eau o: //words with French origin eau o: //words with French origin
@) ee (_ 'e: @) ee (_ 'e:
@) ee (X_ 'e: @) ee (X_ 'e:
&) el (den_$p_alt =@l &) el (den_$p_alt =@l
&) el (end_$p_alt =@l &) el (end_$p_alt =@l


&) er (_$p_alt =@r
&) er (e_$p_alt =@r
&) er (en_$p_alt =@r
&) er (t_$p_alt =@r
&) er (d_$p_alt =@r
&) er (de_$p_alt =@r
&) er (den_$p_alt =@r
&) er (end_$p_alt =@r

&) elijks @l@ks
&) em (_ @m &) em (_ @m
&) en (_S2qd @n &) en (_S2qd @n
&) ens (_S3q @ns &) ens (_S3q @ns
&) end (_ @nd &) end (_ @nd
&) ende (_ @nd@ &) ende (_ @nd@
@) ent (_ 'Ent @) ent (_ 'Ent
@) ent (e_ 'Ent
@) ent (en_ 'Ent
@) ent (er_ 'Ent
&) er (_ @r &) er (_ @r
&) ere (_ @r@ &) ere (_ @r@
&) er (en_$p_alt @r // where 'eren' is not a verb ending &) er (en_$p_alt @r // where 'eren' is not a verb ending
eren (_ 'I:r@n eren (_ 'I:r@n
&) es (_ @s &) es (_ @s
@) etten (_S3 @n @) etten (_S3 @n
eum (_$w_alt 'e:8m
@mus) eum (_ ,e:8m // compounds
@) eur (_ 'Y:r @) eur (_ 'Y:r


&) e (nB@ E2 &) e (nB@ E2
@) e (raar_ @ @) e (raar_ @
&) e (rC@ E2 &) e (rC@ E2


c) e (ntrum E // not @
_) expositie Ekspo:z'itsi





.group f .group f
_) ge (@P2 Q@ _) ge (@P2 Q@
_) gee Qe: _) gee Qe:
gener (aal Q,e:n@r gener (aal Q,e:n@r
gelijk Q@lEIk
_) gelijk Q@lEIk
_) ge (rC QE _) ge (rC QE
_) geu QY: _) geu QY:
_) ge (ven Qe: _) ge (ven Qe:
_) ge (ver Qe:
_) ge (ving Qe: _) ge (ving Qe:


ge (sprek Q@ // in compounds



.group h .group h
h h h h


_) her (@P3 hEr _) her (@P3 hEr
_) her (en hI:r _) her (en hI:r
&) heid (_S4 hEIt




.group i .group i
&) ica (_ =ika: &) ica (_ =ika:
&) ico (_ =iko: &) ico (_ =iko:
ie (X 'i ie (X 'i
ie (ren_ 'i
ie (rd_ 'i ie (rd_ 'i
@) ig (_S2dq @x @) ig (_S2dq @x
@) ige (_ @Q@ @) ige (_ @Q@
ij (_ 'EI
ij (e_ 'EI
@) ij (n_ 'EI @) ij (n_ 'EI
&) ika (_ =ika: &) ika (_ =ika:
&) iko (_ =iko: &) iko (_ =iko:
m m m m
m) m m) m


mail me:Il
management ma:nIdZm@nt management ma:nIdZm@nt
_) mee (@P3 m'e: _) mee (@P3 m'e:
menu (_ m@ny




.group n .group n
@@C) o (_ =o: @@C) o (_ =o:
oe (X_ 'u oe (X_ 'u
oir (_ 'v#a:r oir (_ 'v#a:r
pr) o (gram o:
oo (X 'o: oo (X 'o:
telef) oo (n 'o:
oon 'o:n // in compounds, eg. telefoongesprek
_) op (@@P2 'Op _) op (@@P2 'Op
_) open (@P4 'o:p@n _) open (@P4 'o:p@n
_) op (era 'o:p _) op (era 'o:p
r r r r
A) r (A r A) r (A r
C) r (A r C) r (A r
rr *r
rr *r

route rut@ // route(s)


.group re .group re
_) re (geren r@ _) re (geren r@
@) ssi (o S @) ssi (o S


_) standaard (@P9 st'Anda:rt _) standaard (@P9 st'Anda:rt
_vre) s (e s




.group t .group t
.group te .group te
_) tegen (P5 t'e:Q@n _) tegen (P5 t'e:Q@n
_) terug (P5 t@r'8x _) terug (P5 t@r'8x
_) te (gelijk t@
_) te (gelijkP2 t@
_) te (gemoetP2 t@ _) te (gemoetP2 t@
_) te (goed t@ _) te (goed t@
_) te (hui t@ // tehuis _) te (hui t@ // tehuis
w (CK w w (CK w


_) weg (@P3 v#'Ex _) weg (@P3 v#'Ex
_) weg (en v#e:Q
_) weg (e_ v#e:Q // bewegelijk




.group x .group x

+ 12
- 3
dictsource/ta_list View File

பாம்ப் $alt பாம்ப் $alt
பீராமண $alt பீராமண $alt
பால்ய $alt பால்ய $alt
பலு $alt
பில் $alt பில் $alt
பந்த் $alt பந்த் $alt
பில்லி $alt பில்லி $alt
பீர் $alt பீர் $alt
போயிங் $alt போயிங் $alt
பலத்தாலான $alt பலத்தாலான $alt
பெஞ்ச் $alt
பெஞ்சு $alt
பார $alt பார $alt
பாமா $alt பாமா $alt
பென்ஸ் $alt பென்ஸ் $alt
பிஸி $alt பிஸி $alt
பேஷ் $alt பேஷ் $alt
பாவே $alt பாவே $alt
பாலு $alt
பீடி $alt
பிசி $alt
போன்சாய் $alt
போன்ஸாய் $alt
பீப் bi:p
ப்யூனஸ் $alt
பவுத்த $alt
பவுத்தம் $alt
(பி . ஏ) bije: (பி . ஏ) bije:




தொப்புனு $alt தொப்புனு $alt
தருமம் $alt தருமம் $alt
தாவே $alt தாவே $alt
தருமமும் $alt
தராவி $alt




// initial ட // initial ட
டிக் t.ik டிக் t.ik
ரெட்டி red.d.i ரெட்டி red.d.i
செல்லம் $alt செல்லம் $alt
சிக்கன் $alt




கக $alt // initial க as [g] கக $alt // initial க as [g]

+ 128
- 19
dictsource/ta_rules View File

// 'a' 'e' 'i' // 'a' 'e' 'i'
.L03 இ எ அ .L03 இ எ அ


// alternative 's' characters
.L04 ச ஸ


// consonants // consonants


க (ாரர k க (ாரர k
_) க (ிடுகிடு g _) க (ிடுகிடு g
_) க (ின்னென்ற g _) க (ின்னென்ற g
_) கி (ரக g
_) கி (ரகண g
_) கி (ரந்த g
_) கி (ரவுண்ட g
_) கி (ரஹ g
_) கி (ராக்கி g
_) கி (ராதக k
_) கி (ராம g
_) க (ிரிஜா g _) க (ிரிஜா g
_) க (ிரிதர g _) க (ிரிதர g
_) கி (ரீட k
_) கி (ரீன்லாந்த g
_) கி (ரீம k _) கி (ரீம k
_) க (ிருகஸ்தர g _) க (ிருகஸ்தர g
_) க (ிருஹஸ்தர g _) க (ிருஹஸ்தர g
_) கி (ரேக்க g _) கி (ரேக்க g
_) கி (ரைண்டர g
_) கி (ரௌண்ட g
_) கி (ளாஸ g
_) கி (ளினிக் k
_) க (ீதல k _) க (ீதல k
_) க (ீத்த k _) க (ீத்த k
_) க (ுகநாத g _) க (ுகநாத g
_) க (ுருதேவ g _) க (ுருதேவ g
_) க (ுருநா g _) க (ுருநா g
_) க (ுருபூஜை g _) க (ுருபூஜை g
_) க (ுருப்பெயர g
_) க (ுருமார g _) க (ுருமார g
_) க (ுருரா g _) க (ுருரா g
_) க (ுருவா g _) க (ுருவா g
_) க (ுருவுடை g _) க (ுருவுடை g
_) க (ுருவை g _) க (ுருவை g
_) க (ுருவோட g _) க (ுருவோட g
_) க (ுறட்டை g
_) கு (வாலியர g _) கு (வாலியர g
_) க (ூகிள g _) க (ூகிள g
_) க (ூகுள g _) க (ூகுள g
_) க (ேட்டைத் g _) க (ேட்டைத் g
_) க (ேட்டைப் g _) க (ேட்டைப் g
_) க (ேலி g _) க (ேலி g
_) க (ொறட்ட g
_) கோக (ிலா go:k _) கோக (ிலா go:k
_) க (ோகுல g _) க (ோகுல g
_) க (ோதாவரி g _) க (ோதாவரி g
_) க (ௌ g _) க (ௌ g
_) கௌட (ில்ய kaUt. _) கௌட (ில்ய kaUt.
_) க (ௌட்டில்ய k _) க (ௌட்டில்ய k
_) க (ௌவ k
_) க் (ரவுண்ட g
_) க் (ரூப g _) க் (ரூப g
_) க் (ரௌண்ட g
_) க் (வாலியர g _) க் (வாலியர g
//endsort //endsort


//sort //sort
_மை) க kV#
அலை) க (டல kV அலை) க (டல kV
சமையல்) க (ட் kV சமையல்) க (ட் kV
உச்ச) க (ட்ட kV உச்ச) க (ட்ட kV
_தென்) க (ாசி k _தென்) க (ாசி k
_நேர்) க (ாணல k _நேர்) க (ாணல k
_கண்) க (ாணா k _கண்) க (ாணா k
விவே) க (ானந்த k
_வலை) க (ாப் k _வலை) க (ாப் k
தொல்) க (ாப்பி k தொல்) க (ாப்பி k
மூல) க (ாரண k மூல) க (ாரண k
_ம) க (ிந்த H _ம) க (ிந்த H
மோ) க (ினி H மோ) க (ினி H
_ம) க (ிமை H _ம) க (ிமை H
_) கி (ரக g
_) கி (ரகண g
கி (ரண g கி (ரண g
பொற்) கி (ரண g பொற்) கி (ரண g
_) கி (ரந்த g
_) கி (ரஹ g
_) கி (ராக்கி g
_) கி (ராதக k
_) கி (ராம g
_) கி (ரீட k
_) கி (ரீன்லாந்த g
ஐஸ்) கி (ரீம k ஐஸ்) கி (ரீம k
ங்) க (ிரு g ங்) க (ிரு g
கிரு (ஷ் kri கிரு (ஷ் kri
_) கி (ரைண்டர g
_) கி (ரௌண்ட g
இங்) கி (லீஷ் g இங்) கி (லீஷ் g
கி (லேச k கி (லேச k
அங்) க (ிள k அங்) க (ிள k
_) கி (ளாஸ g
_) கி (ளினிக் k
_வட) க (ிழ k _வட) க (ிழ k
தென்) க (ிழ k தென்) க (ிழ k
_பா) க (ிஸ்தான k _பா) க (ிஸ்தான k
வீண்) க (ோப k வீண்) க (ோப k
_நாகர்) க (ோயில k _நாகர்) க (ோயில k
_ட) க் k _ட) க் k
_மை) க் k
_ஷா) க் (_ k _ஷா) க் (_ k
துர்) க்க ggV# துர்) க்க ggV#
மார்) க்க ggV# மார்) க்க ggV#
அயோ) க்க (ிய gg அயோ) க்க (ிய gg
ஆரோ) க்க (ிய gg ஆரோ) க்க (ிய gg
வைரா) க்க (ிய gg வைரா) க்க (ிய gg
அநு) க்கி (ர gg
அனு) க்கி (ர gg
L03) க்கி (ரக gg // a,i L03) க்கி (ரக gg // a,i
_வி) க்க (ிரக gg _வி) க்க (ிரக gg
சத்தியா) க்கி (ரக gg சத்தியா) க்கி (ரக gg
_மு) க்க (ுண gg _மு) க்க (ுண gg
அணு) க்க (ுண்ட gg அணு) க்க (ுண்ட gg
ஜன) க்க (ும்பல gg ஜன) க்க (ும்பல gg
_வி) க்ச (னரி ks.V
_பி) க்ச (ர ktSV _பி) க்ச (ர ktSV
_மெ) க்சிக (ோ ksik _மெ) க்சிக (ோ ksik
க்ட kt.V# // English words க்ட kt.V# // English words
ச (ந்தர tSV ச (ந்தர tSV
_) ச (ந்தர்ப sV _) ச (ந்தர்ப sV
ச (ந்திர tSV ச (ந்திர tSV
_ஹட்) ச (ன sV
_வாட்) ச (ன sV
_) ச (ப்பாத்தி tSV _) ச (ப்பாத்தி tSV
_) சரசு (வதி sVrVs _) சரசு (வதி sVrVs
_) சர்ச (ி tSVrtS _) சர்ச (ி tSVrtS
மருதா) ச (ல tSV மருதா) ச (ல tSV
வேதா) ச (ல tSV வேதா) ச (ல tSV
_சேஷா) ச (ல tSV
_தணிகா) ச (ல tSV
அருணா) ச (ல tSV அருணா) ச (ல tSV
_) ச (ாணக்கிய tS _) ச (ாணக்கிய tS
ச (ாந்தி s. ச (ாந்தி s.
ராஜோப) ச (ார tS ராஜோப) ச (ார tS
_) ச (ார்ஜை tS _) ச (ார்ஜை tS
_) ச (ார்ஜ்_ tS _) ச (ார்ஜ்_ tS
_) ச (ார்லஸ tS
_) ச (ாளுக்கிய tS _) ச (ாளுக்கிய tS
_) சிக (ாகோ tSik _) சிக (ாகோ tSik
_) ச (ிக்கனு tS
_) ச (ிக்கனை tS
_) சிக் (மங்களூர tSik _) சிக் (மங்களூர tSik
_) சிக் (லெட் tSik _) சிக் (லெட் tSik
_) ச (ிட்டாக tS _) ச (ிட்டாக tS
_) ச (ித்திர tS _) ச (ித்திர tS
வி) ச (ித்திர tS வி) ச (ித்திர tS
_) ச (ித்திரவதை tS _) ச (ித்திரவதை tS
_) ச (ித்தூர tS
_) ச (ித்ரவதை tS _) ச (ித்ரவதை tS
_) ச (ித்ரா tS _) ச (ித்ரா tS
சு) சித (்ரா tSit சு) சித (்ரா tSit
_) ச (ெல்லக்குட்டி tS _) ச (ெல்லக்குட்டி tS
_) ச (ெல்லத்துக்கு tS _) ச (ெல்லத்துக்கு tS
_) ச (ெல்லத்தை tS _) ச (ெல்லத்தை tS
_) ச (ெல்லப்ப tS
_) ச (ெல்லமா tS _) ச (ெல்லமா tS
_) ச (ெஸ் tS _) ச (ெஸ் tS
_) ச (ேனல tS _) ச (ேனல tS
_) ச (ேரி tS _) ச (ேரி tS
_) ச (ேலஞ் tS _) ச (ேலஞ் tS
_) ச (ைனாவ tS _) ச (ைனாவ tS
_) ச (ைனீஸ tS
_) ச (ௌதரி tS _) ச (ௌதரி tS
//endsort //endsort




//sort //sort


அர்ஜண்) ட t.V#
அர்ஜெண்) ட t.V#
_மில்) ட (ன t.V _மில்) ட (ன t.V
_) ட (ன் t.V _) ட (ன் t.V
ிங்) ட (ன் t.V // -ington ிங்) ட (ன் t.V // -ington
_) ட (ாக்க t. // talkies _) ட (ாக்க t. // talkies
_) டாக்ட (ர d.a:kt.V _) டாக்ட (ர d.a:kt.V
_) டாக (்ஸி t.a:k _) டாக (்ஸி t.a:k
_) டாங்க (ர t.a:NkV
_) டாங்க (ி t.a:Nk _) டாங்க (ி t.a:Nk
_) டாட (ா t.a:t. _) டாட (ா t.a:t.
அண்) டார்டிக t.a:rt.ikV# அண்) டார்டிக t.a:rt.ikV#
_போர்) ட (ிகோ t. _போர்) ட (ிகோ t.
ஆர்) டிக் t.ik ஆர்) டிக் t.ik
_) ட (ிக்க t. _) ட (ிக்க t.
_) டின்க (ரிங் t.inkV
_) டி (யூசன t. _) டி (யூசன t.
_) டி (யூஷன t. _) டி (யூஷன t.
_) டி (ரங்கு t. _) டி (ரங்கு t.
_) டிராபிக் t.ra:fik _) டிராபிக் t.ra:fik
_) ட (ிராம t. _) ட (ிராம t.
கொலஸ்) டி (ரால _|t. கொலஸ்) டி (ரால _|t.
_) டி (ராலி t.
_) டி (ராவல t. _) டி (ராவல t.
_) டி (ராவெல t. _) டி (ராவெல t.
_) டி (ரெயின t. _) டி (ரெயின t.
_) டி (ரெய்லர t.
_) டி (ரெஸ d. _) டி (ரெஸ d.
_) டிரேயின (ை t.re:jn _) டிரேயின (ை t.re:jn
_) டி (ரைவர d. _) டி (ரைவர d.
கண்) டி (ரோல t. கண்) டி (ரோல t.
_) ட (ிவிய t. _) ட (ிவிய t.
_) ட (ெக்ஸாஸ t.
_) டென்டுல்க (ர t.ent.UlkV _) டென்டுல்க (ர t.ent.UlkV
_) ட (ென்ஷன t. _) ட (ென்ஷன t.
_) டெம்ப (ர t.empV _) டெம்ப (ர t.empV
_) டெம்ப (ோ t.emp _) டெம்ப (ோ t.emp
டெலிப (ோன t.elif டெலிப (ோன t.elif
_) ட (ெலிவிஷன t. _) ட (ெலிவிஷன t.
_) ட (ெல்_அவீவ t. // tel aviv
_) டெஸ்ட t.est.V# _) டெஸ்ட t.est.V#
_) டேங்க (ர t.e:NkV
_) ட (ேப t. _) ட (ேப t.
_) ட (ேஸ்ட t. _) ட (ேஸ்ட t.
_) டைட (ில t.aIt. _) டைட (ில t.aIt.
_) ட (ைம்_ t. _) ட (ைம்_ t.
_) ட (ோக்கன t. _) ட (ோக்கன t.
_) ட (ோக்கியோ t. _) ட (ோக்கியோ t.
_) டோரண்ட (ோ t.o:rVn.t.
_ல) ட்ட d.d.V# _ல) ட்ட d.d.V#
_ரெ) ட்ட (ியா d.d. _ரெ) ட்ட (ியா d.d.
இ) ட்ட (ிலி d.d. இ) ட்ட (ிலி d.d.
_) ட்ராஃபிக் t.ra:fik _) ட்ராஃபிக் t.ra:fik
_) ட (்ரான்சிஸ்டர t. _) ட (்ரான்சிஸ்டர t.
_) ட்ராபிக் t.ra:fik _) ட்ராபிக் t.ra:fik
_) ட் (ராலி t.
_) ட் (ராவல t. _) ட் (ராவல t.
_) ட் (ராவெல t. _) ட் (ராவெல t.
_) ட்ரெயி (லர t.rej
_) ட் (ரெய்லர t.
_பெ) ட் (ரோ t. _பெ) ட் (ரோ t.
கண்) ட் (ரோல t. கண்) ட் (ரோல t.
_வீ) ட் (ல t. _வீ) ட் (ல t.
_ஹி) ட் (லர t. _ஹி) ட் (லர t.
அ) ட்லாண்ட t.la:n.t.V# // atlant
//endsort //endsort




_) த (யாள dV _) த (யாள dV
_) த (யை dV _) த (யை dV
_) த (ரணி dV _) த (ரணி dV
_) த (ராவிய dV
_) த (ரிசனங் dV _) த (ரிசனங் dV
_) த (ரிசனத் dV _) த (ரிசனத் dV
_) த (ரிசி dV _) த (ரிசி dV
_) த (ரித்திரம dV _) த (ரித்திரம dV
_) த (ருமத் dV _) த (ருமத் dV
_) த (ருமன dV _) த (ருமன dV
_) தருமப (ுரி dVrUmVp
_) த (ருமர dV _) த (ருமர dV
_) த (ருமி dV _) த (ருமி dV
_) த (ர்க dV _) த (ர்க dV
_) த (ானத் d _) த (ானத் d
_) த (ானமா d _) த (ானமா d
_) த (ானிய d _) த (ானிய d
_) த (ானியங்கி t
_) த (ானுவ d _) த (ானுவ d
_) த (ாமோதர d _) த (ாமோதர d
_) த (ாம்_தூம d _) த (ாம்_தூம d
_) த (ாயாதி d _) த (ாயாதி d
_) த (ாரணி d _) த (ாரணி d
_) த (ாராசுர d
_) த (ாராபுர d _) த (ாராபுர d
_) த (ாராள d _) த (ாராள d
_) த (ாராவி d _) த (ாராவி d
_) த (ுச்சாதனன d _) த (ுச்சாதனன d
_) த (ுட்ட d _) த (ுட்ட d
_) த (ுபாய d _) த (ுபாய d
_) த (ுப்பட்டா d
_) த (ுரதிருஷ்ட d _) த (ுரதிருஷ்ட d
_) த (ுரதிர்ஷ்ட d _) த (ுரதிர்ஷ்ட d
_) த (ுரதிஷ்ட d _) த (ுரதிஷ்ட d
_) த (ேவருலக d _) த (ேவருலக d
_) த (ேவர்க d _) த (ேவர்க d
_) த (ேவலோக d _) த (ேவலோக d
_) த (ேவஸ்தான d
_) த (ேவாதி d _) த (ேவாதி d
_) த (ேவாமிருத d _) த (ேவாமிருத d
_) த (ேவாம்ச d _) த (ேவாம்ச d
_ப) த (ஞ்சலி tV _ப) த (ஞ்சலி tV
_கீழ்) த (ட்ட tV _கீழ்) த (ட்ட tV
_மேல்) த (ட்ட tV _மேல்) த (ட்ட tV
பிள்ளை) த (ன tV
முட்டாள்) த (ன tV முட்டாள்) த (ன tV
_கௌ) த (மி tV _கௌ) த (மி tV
_கீ) த (ா t _கீ) த (ா t
பு) த்த (ர ddV பு) த்த (ர ddV
_விரு) த்தாச (ல dda:tSV _விரு) த்தாச (ல dda:tSV
அ) த்த (ாசி dd அ) த்த (ாசி dd
_சி) த்தாந்த dda:ntV#
சி) த்த (ார் dd சி) த்த (ார் dd
பு) த்த (ி dd பு) த்த (ி dd
அயோ) த்த (ி dd அயோ) த்த (ி dd
வி) த்து (வான d வி) த்து (வான d
_முக) த்து (வார dd _முக) த்து (வார dd
அ) த்த (ெய்வ dd அ) த்த (ெய்வ dd
L03) த்த (ெய்வ dd
குல) த்த (ெய்வ dd குல) த்த (ெய்வ dd
உ) த்த (ேச dd உ) த்த (ேச dd
L03) த்த (ேச dd // a, e, i L03) த்த (ேச dd // a, e, i
_) ப (ங்களா bV _) ப (ங்களா bV
_) ப (ங்கார bV _) ப (ங்கார bV
_) ப (சவகல்யாண bV _) ப (சவகல்யாண bV
_) ப (ச்சன bV
_) ப (ஜ bV _) ப (ஜ bV
_) ப (ட்சண bV _) ப (ட்சண bV
_) ப (ட்சிக்க bV _) ப (ட்சிக்க bV
_) ப (யப் bV _) ப (யப் bV
_) ப (யம bV _) ப (யம bV
_) ப (யாலஜி bV _) ப (யாலஜி bV
_) பயாஸ்கோப் bVja:sko:p
_) ப (யில்வான bV _) ப (யில்வான bV
_) ப (ரதநாட்டிய bV _) ப (ரதநாட்டிய bV
_) ப (ரதன bV _) ப (ரதன bV
_) ப (ரதர bV _) ப (ரதர bV
_) ப (ராக்_ஒபாமா bV
_) ப (ரோட bV _) ப (ரோட bV
_) ப (ர்கர bV
_) ப (ர்னாலா bV _) ப (ர்னாலா bV
_) ப (ர்மா bV _) ப (ர்மா bV
_) ப (ர்லாங் fV _) ப (ர்லாங் fV
_) ப (லவீன bV _) ப (லவீன bV
_) ப (லஹீன bV _) ப (லஹீன bV
_) பலாத்க (ார bVla:dk _) பலாத்க (ார bVla:dk
_) ப (லிகடா bV
_) ப (லிக்கடா bV
_) ப (லிக்குச் bV _) ப (லிக்குச் bV
_) ப (லிக்கொ bV _) ப (லிக்கொ bV
_) ப (லிஜா bV _) ப (லிஜா bV
_) ப (லிபீட bV _) ப (லிபீட bV
_) ப (லிய bV _) ப (லிய bV
_) பலுச (ிஸ்தான bVlUtS
_) ப (லூன bV _) ப (லூன bV
_) ப (ல்கேரிய bV _) ப (ல்கேரிய bV
_) பல்ட (ி bVlt. _) பல்ட (ி bVlt.
_) ப (ல்பு bV _) ப (ல்பு bV
_) ப (ல்பை bV _) ப (ல்பை bV
_) ப (ளு bV
_) ப (வாணி bV _) ப (வாணி bV
_) ப (வானி bV _) ப (வானி bV
_) பவுண்ட (ன faUn.t.V _) பவுண்ட (ன faUn.t.V
_) ப (வுத்தத்தில bV
_) ப (வ்ய bV _) ப (வ்ய bV
_) ப (ஸ bV _) ப (ஸ bV
_) ப (ஹதூர bV _) ப (ஹதூர bV
_) ப (ாரம b _) ப (ாரம b
_) ப (ாரம்பரிய p _) ப (ாரம்பரிய p
_) ப (ாரிஸ்டர b _) ப (ாரிஸ்டர b
_) ப (ார்L04லோனா b
_) ப (ார்கவி b _) ப (ார்கவி b
_) ப (ார்ம f _) ப (ார்ம f
_) ப (ாலக b _) ப (ாலக b
_) ப (ாலக்காட p _) ப (ாலக்காட p
_) ப (ாலச b _) ப (ாலச b
_) ப (ாலதண் b _) ப (ாலதண் b
_) பாலப (ாட ba:lVp
_) ப (ாலமுர b _) ப (ாலமுர b
_) ப (ாலாஜி b _) ப (ாலாஜி b
_) ப (ாலாபிஷேக p _) ப (ாலாபிஷேக p
_) ப (ாலாவ b _) ப (ாலாவ b
_) ப (ாலின் p _) ப (ாலின் p
_) ப (ாலியத்த b _) ப (ாலியத்த b
_) ப (ால b
_) ப (ாலிவுட் b
_) ப (ாலுடன் p _) ப (ாலுடன் p
_) ப (ாலும்_ p _) ப (ாலும்_ p
_) ப (ாலுவ b
_) ப (ாலை p _) ப (ாலை p
_) ப (ால் p _) ப (ால் p
_) ப (ால்_தாக்கரே b _) ப (ால்_தாக்கரே b
முகத்திலிருந்து_) ப (ாவ b முகத்திலிருந்து_) ப (ாவ b
_) ப (ாவனா b _) ப (ாவனா b
_) ப (ாவனை b _) ப (ாவனை b
_) ப (ாவிக்கப்பட b
_) ப (ாவிக்கிற b _) ப (ாவிக்கிற b
_) ப (ாவிக்கும்போத b
_) ப (ாவித்த b _) ப (ாவித்த b
_) ப (ாவிப்பத b _) ப (ாவிப்பத b
_) ப (ாவிப்பதா b _) ப (ாவிப்பதா b
_) ப (ாஸ்மதி b _) ப (ாஸ்மதி b
_) பி(ராந்தியு b _) பி(ராந்தியு b
_) ப (ி_._பி_._சி b // b.b.c _) ப (ி_._பி_._சி b // b.b.c
_) ப (ிகர f
_) ப (ிக்கு b _) ப (ிக்கு b
_) ப (ிக்ஷு b _) ப (ிக்ஷு b
_) ப (ிக்ஷூ b _) ப (ிக்ஷூ b
_) ப (ிங்கர்_ f _) ப (ிங்கர்_ f
_) ப (ிசினஸ b _) ப (ிசினஸ b
_) ப (ிசிய b
_) ப (ினாமி b _) ப (ினாமி b
_) ப (ினிஷ f _) ப (ினிஷ f
_) ப (ின்லாந்த f _) ப (ின்லாந்த f
_) ப (ிபிசி b // bbc _) ப (ிபிசி b // bbc
_) ப (ிம்ப b _) ப (ிம்ப b
_) பி (யூனஸ்_ b
_) ப (ிரகதீ b _) ப (ிரகதீ b
_) பி (ரகதீ b _) பி (ரகதீ b
_) பி (ரகலாதன p _) பி (ரகலாதன p
_) பி (ராப் p _) பி (ராப் p
_) பி (ராமண b _) பி (ராமண b
_) பி (ராமணன b _) பி (ராமணன b
_) பி (ராமி b
_) பி (ராமிக் b _) பி (ராமிக் b
_) பி (ராமின்_ b _) பி (ராமின்_ b
_) பி (ரார்தன p _) பி (ரார்தன p
_) பி (ரிட b _) பி (ரிட b
_) ப (ிரித்தானி b _) ப (ிரித்தானி b
_) பி (ரித்தானி b _) பி (ரித்தானி b
_) பிரின்சிப (ால prinsip
_) பி (ரியன p _) பி (ரியன p
_) பி (ரியப் p _) பி (ரியப் p
_) பி (ரியம p _) பி (ரியம p
_) ப (ீச்சு b _) ப (ீச்சு b
_) ப (ீஜ b _) ப (ீஜ b
_) ப (ீஜிங b _) ப (ீஜிங b
_) ப (ீடி b
_) ப (ீடிகள b
_) ப (ீடிகை p _) ப (ீடிகை p
_) ப (ீடித்த p _) ப (ீடித்த p
_) ப (ீடிப்புகை b
_) ப (ீடிய b
_) பீட்ரூட் bi:t.ru:t.
_) ப (ீப்பொலி b
_) ப (ீம b _) ப (ீம b
_) ப (ீரங்கி b _) ப (ீரங்கி b
_) பீ (ராமண b _) பீ (ராமண b
_) ப (ீராமணர b _) ப (ீராமணர b
_) ப (ீரை b _) ப (ீரை b
_) ப (ீரோ b _) ப (ீரோ b
_) ப (ீர்பால b
_) ப (ீஹார b _) ப (ீஹார b
_) ப (ுக்கில b _) ப (ுக்கில b
_) ப (ுக்கென்ற b _) ப (ுக்கென்ற b
_) ப (ூமி b _) ப (ூமி b
_) ப (ூலோக b _) ப (ூலோக b
_) ப (ெங்களூர b _) ப (ெங்களூர b
_) ப (ெங்கால b
_) பெஞ்ச bentSV#
_) ப (ெஞ்சமின b _) ப (ெஞ்சமின b
_) ப (ெஞ்சா b
_) ப (ெஞ்சி b
_) பெட்ட (ுக்கு bed.d. _) பெட்ட (ுக்கு bed.d.
_) ப (ெட்ரூம b _) ப (ெட்ரூம b
_) ப (ெப்ரவரி f
_) ப (ெர்னார்ட b _) ப (ெர்னார்ட b
_) ப (ெர்முடா b _) ப (ெர்முடா b
_) ப (ெர்லிங b _) ப (ெர்லிங b
_) ப (ோதித் b _) ப (ோதித் b
_) ப (ோதை b _) ப (ோதை b
_) ப (ோனிய b _) ப (ோனிய b
_) ப (ோன்கள f
_) ப (ோன்ஸ்லே b _) ப (ோன்ஸ்லே b
_) ப (ோபால b _) ப (ோபால b
_) ப (ோர்ஜரி f _) ப (ோர்ஜரி f
_க) ப (த் bV _க) ப (த் bV
வீர) ப (த்தினி pV வீர) ப (த்தினி pV
உ) ப (ந்நியாச pV உ) ப (ந்நியாச pV
_லிஸ்) ப (ன bV
கல்) ப (னா pV கல்) ப (னா pV
_கம்) ப (னி pV _கம்) ப (னி pV
பிரதா) ப (ம bV பிரதா) ப (ம bV
வீர) ப (ராக்கிரம pV வீர) ப (ராக்கிரம pV
கரம்) ப (ற் pV கரம்) ப (ற் pV
ப (ற்றி_ pV ப (ற்றி_ pV
_பக்கப்) ப (ல bV
படைப்) ப (ல bV
ஆயுதப்) ப (ல bV
_மகா) ப (லி bV _மகா) ப (லி bV
_மூடு) ப (ல்லக் pV _மூடு) ப (ல்லக் pV
வேலைப்) ப (ளு bV
வட) ப (ழ pV வட) ப (ழ pV
வீண்) ப (ழி pV வீண்) ப (ழி pV
_வா) ப (ஸ pV _வா) ப (ஸ pV
_தீ) ப (ா p _தீ) ப (ா p
_கலி) ப (ா f
_கலீ) ப (ா f _கலீ) ப (ா f
_சம) ப (ாக b _சம) ப (ாக b
முதற்) ப (ாக b முதற்) ப (ாக b
உதிரிப்) ப (ாக b
_பிக்) ப (ாக்க+ p _பிக்) ப (ாக்க+ p
உ) ப (ாசனை p உ) ப (ாசனை p
சமன்) ப (ாட p சமன்) ப (ாட p
ராம) ப (ாண b // also இராமபாண ராம) ப (ாண b // also இராமபாண
_யாழ்) ப (ாண p _யாழ்) ப (ாண p
தண்ட) ப (ாணி p தண்ட) ப (ாணி p
பஞ்ச) ப (ாண்ட p
ப (ாண்டி p ப (ாண்டி p
ப (ாதை p ப (ாதை p
ஜிந்தா) ப (ாத் b ஜிந்தா) ப (ாத் b
_டீ) ப (ாய் p _டீ) ப (ாய் p
எதிர்) ப (ார p எதிர்) ப (ார p
கண்) ப (ார்வை p கண்) ப (ார்வை p
_ப்ரின்சி) ப (ால p
_சிவ) ப (ாலன b _சிவ) ப (ாலன b
_கா) ப (ாலி b _கா) ப (ாலி b
_டி) பால்ட fa:lt.V#
_நே) ப (ாள p _நே) ப (ாள p
_பூ) ப (ாளம்_ p _பூ) ப (ாளம்_ p
_ராஜ) ப (ாளைய p _ராஜ) ப (ாளைய p
வாதா) ப (ி p வாதா) ப (ி p
கோ) ப (ி p கோ) ப (ி p
சித்தப்) பி(ரமை b சித்தப்) பி(ரமை b
_கன்) ப (ிகர f
_பசி) ப (ிக் f _பசி) ப (ிக் f
கண்டு) ப (ிடி p
திமிர்) ப (ிடி p திமிர்) ப (ிடி p
ராவல்) ப (ிண்டி p ராவல்) ப (ிண்டி p
ர்) ப (ின்_ b ர்) ப (ின்_ b
ம்) ப (ின்_ b ம்) ப (ின்_ b
_முன்) ப (ின்_ p _முன்) ப (ின்_ p
@) ப (ின்நாலும்_ p @) ப (ின்நாலும்_ p
@) ப (ின்னர்_ p
@) ப (ின்னால்_ p @) ப (ின்னால்_ p
_) ப (ிப்ரவரி f _) ப (ிப்ரவரி f
_லெஸ்) ப (ியன b
பிரக (ாஷ prVk பிரக (ாஷ prVk
மதப்) பிரச (ார prVtS
பி (ரத p பி (ரத p
வீண்) பி (ரமை b வீண்) பி (ரமை b
துஷ்) பி (ரயோக p துஷ்) பி (ரயோக p
_திம்) ப (ு p _திம்) ப (ு p
_அன்) ப (ுட b _அன்) ப (ுட b
_மார்) ப (ுட b _மார்) ப (ுட b
வாயு) ப (ுத்திர p
அக்னி) ப (ுத்திர p
பாடலி) ப (ுத்திர p பாடலி) ப (ுத்திர p
அக்கினி) ப (ுத்திர p
வில்லி) ப (ுத்தூர p வில்லி) ப (ுத்தூர p
ம்) ப (ுரா b ம்) ப (ுரா b
_தர்ம) ப (ுரி p _தர்ம) ப (ுரி p
இன்ஸ்) ப (ெக்டர p இன்ஸ்) ப (ெக்டர p
இளம்) ப (ெண் p இளம்) ப (ெண் p
_கம்) ப (ெனி p _கம்) ப (ெனி p
புலம்) ப (ெயர் p
இடம்) ப (ெயர p
_புலம்) ப (ெயர p
மொழி) ப (ெயர் p மொழி) ப (ெயர் p
ப (ெருமான p ப (ெருமான p
ப (ெற p // ?? end-of-word + suffix ?? ப (ெற p // ?? end-of-word + suffix ??
_க) ப (ே f
_கை) ப (ேசி p _கை) ப (ேசி p
_செல்) ப (ேசி p _செல்) ப (ேசி p
அலை) ப (ேசி p அலை) ப (ேசி p
_வெல்) ப (ேர f _வெல்) ப (ேர f
ப (ேரில்_ p ப (ேரில்_ p
ப (ேர்_ p ப (ேர்_ p
_பழம்) ப (ொருள p
_தொல்) ப (ொருள p
வன்) ப (ொருள் p வன்) ப (ொருள் p
மென்) ப (ொருள் p மென்) ப (ொருள் p
வீண்) ப (ொழுத p வீண்) ப (ொழுத p
ப (ோதே_+ p ப (ோதே_+ p
ஐ) ப (ோன f ஐ) ப (ோன f
_செல்) ப (ோன f _செல்) ப (ோன f
மைக்ரோ) ப (ோன f
ப (ோன_ p ப (ோன_ p
ப (ோனா p ப (ோனா p
ப (ோன்ற+ p // ?? end-of-word + suffix ?? ப (ோன்ற+ p // ?? end-of-word + suffix ??
ப (ோயிரு p
ப (ோய் p ப (ோய் p
கலி) ப (ோர்னிய f கலி) ப (ோர்னிய f
ப (ோல_ p ப (ோல_ 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
//endsort //endsort


// If ப+ appearing in the middle of a word is followed by ட+ // If ப+ appearing in the middle of a word is followed by ட+
பாப (K pa:pV பாப (K pa:pV
பப (ா pVp பப (ா pVp
பாப (ா pa:p பாப (ா pa:p
_) பாப (ம pa:bV
_) பாப (த் pa:bV
_) பாப (ங் pa:bV
// த) ப (K pV // த) ப (K pV
தா) ப (K pV தா) ப (K pV
// த) ப (ா p // த) ப (ா p
ல lV ல lV
ல (B l ல (B l


_செய) ல்ப RpV#



.group ள .group ள
ள l.V ள l.V
இ (ராவுத்த இ (ராவுத்த
இ (ராஷ்டிர இ (ராஷ்டிர
இ (லகுவாக இ (லகுவாக
இ (லட்சங்
இ (லட்சண இ (லட்சண
இ (லட்சத்
இ (லட்சம
இ (லட்சா
இ (லட்சிய இ (லட்சிய
இ (லண்டன இ (லண்டன
இ (லவங்க இ (லவங்க
இ (லாப
இ (லேச இ (லேச
//endsort //endsort




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




் // virama ் // virama

+ 27
- 8
phsource/compile_report View File

67 phoneme tables
68 phoneme tables
new total new total
base 107 107 base 107 107
consonants 9 115 consonants 9 115
fr-ca 11 140 fr-ca 11 140
hi 59 150 hi 59 150
ta 21 153 ta 21 153
hu 24 121
hu 25 122
lv 29 125 lv 29 125
nl 25 126 nl 25 126
pl 22 120 pl 22 120
az 10 127 az 10 127
ak 8 109 ak 8 109
am 8 123 am 8 123
wo 18 118


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}] base
l/l@ [há] 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}] base
l/la [há] base
[l#] base [l#] base
[l] fr [l] fr
[l/2] fr [l/2] fr
[K] nso [K] nso
l/l_a [l/3] base l/l_a [l/3] base
[l/] fr [l/] fr
l/le [h}] base
l/le [há] 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}] base
l/li [há] 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}] base
l/lo [há] 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}] base
l/lu [há] base
[l#] base [l#] base
[l] fr [l] fr
[l/2] fr [l/2] fr
[k] sq [k] sq
ustop/k_unasp_ [k] zh ustop/k_unasp_ [k] zh
ustop/null [?] base ustop/null [?] base
[t2] hu
ustop/p [p] base ustop/p [p] base
[p2] fr [p2] fr
[p] zhy [p] zhy
[@] hy [@] hy
[@] ml [@] ml
[@] sl [@] sl
[@] wo
[@:] wo
vowel/@- [@-] base vowel/@- [@-] base
[r*] hr [r*] hr
vowel/& [a] en-rp vowel/& [a] en-rp
[&] sr [&] sr
[a#] rw [a#] rw
[a/] rw [a/] rw
[a] wo
vowel/a_2 [a] base2 vowel/a_2 [a] base2
[a] en-wi [a] en-wi
[A:] en-wi [A:] en-wi
[a] da [a] da
[a] rw [a] rw
vowel/a#_2 [A] nl vowel/a#_2 [A] nl
[a:] nl
[a#] pl [a#] pl
[&] hr [&] hr
[a] sv [a] sv
[a:] ml [a:] ml
vowel/a_6 [a] ca vowel/a_6 [a] ca
[a:] vi [a:] vi
[a:] wo
vowel/a_7 [a] en vowel/a_7 [a] en
[a] fr [a] fr
[a] ht [a] ht
[e:] ml [e:] ml
[e] ne [e] ne
[e] sl [e] sl
[e] wo
[e:] wo
vowel/e# [I] en-sc vowel/e# [I] en-sc
vowel/e_2 [eI] en-sc vowel/e_2 [eI] en-sc
[e:] de [e:] de
vowel/ee_4 [E] sq vowel/ee_4 [E] sq
vowel/ee_5 [E] en vowel/ee_5 [E] en
[E] ak [E] ak
[E] wo
[E:] wo
vowel/ee_6 [&] sk vowel/ee_6 [&] sk
[E3] sv [E3] sv
[E] ku [E] ku
[i] nso [i] nso
[i] ak [i] ak
[i] am [i] am
[i:] wo
vowel/i# [y:] cy vowel/i# [y:] cy
vowel/i_2 [i2] de vowel/i_2 [i2] de
[i:] de [i:] de
[i/] pt [i/] pt
[i] is [i] is
[I] sq [I] sq
[i] wo
vowel/ii_en [i] en vowel/ii_en [i] en
[i] sq [i] sq
vowel/ii_final [i] en-us vowel/ii_final [i] en-us
[o:] pa [o:] pa
[o] sl [o] sl
[o] ak [o] ak
[o] wo
[o:] wo
vowel/o_2 [o:] cy vowel/o_2 [o:] cy
[o:] hi [o:] hi
[o:] hu [o:] hu
[O] id [O] id
[o] prs [o] prs
[o] bg [o] bg
[O] wo
[O:] wo
vowel/oo_1 [O:] en-n vowel/oo_1 [O:] en-n
[O:] en-rp [O:] en-rp
[O@] en-rp [O@] en-rp
[u:] ml [u:] ml
[u] prs [u] prs
[u] ak [u] ak
[u:] wo
vowel/u# [u:] en-sc vowel/u# [u:] en-sc
[Y] tr [Y] tr
vowel/u_2 [u1] fi vowel/u_2 [u1] fi
[u] sl [u] sl
[u] bg [u] bg
[u] am [u] am
[u] wo
vowel/u#_2 [u-] sv vowel/u#_2 [u-] sv
vowel/u#_3 [U] ta vowel/u#_3 [U] ta
[U:] ta [U:] ta

BIN
phsource/j2/j2@ View File


BIN
phsource/j2/j2e View File


+ 1
- 0
phsource/mbrola/hu1 View File

0 N NULL 0 n 0 N NULL 0 n
0 C NULL 0 x 0 C NULL 0 x
0 s2 NULL 0 s 0 s2 NULL 0 s
0 t2 NULL 0 t




// map English phonemes to Hungarian // map English phonemes to Hungarian

+ 5
- 1
phsource/ph_dutch View File

vowel starttype #a endtype #a vowel starttype #a endtype #a
length 210 length 210
IF thisPh(isUnstressed) THEN IF thisPh(isUnstressed) THEN
FMT(vowel/a#_4)
IF thisPh(isWordEnd) THEN
FMT(vowel/a#_2)
ELSE
FMT(vowel/a#_4)
ENDIF
ENDIF ENDIF
FMT(vowel/a) FMT(vowel/a)
endphoneme endphoneme

+ 12
- 0
phsource/ph_hungarian View File

endphoneme endphoneme




phoneme t2
// changes to pause when followed by [t], so the [t][ becomes [t:]
vls dnt stop
lengthmod 2
IF nextPh(t) THEN
WAV(ustop/null, 0)
ELSE
ChangePhoneme(t)
ENDIF
endphoneme


phoneme d phoneme d
vcd dnt stop vcd dnt stop
voicingswitch t voicingswitch t

+ 2
- 2
phsource/ph_tamil View File



phoneme o phoneme o
vowel starttype #o endtype #o vowel starttype #o endtype #o
length 160
length 130
FMT(vowel/o) FMT(vowel/o)
endphoneme endphoneme




phoneme o: phoneme o:
vowel starttype #o endtype #o vowel starttype #o endtype #o
length 280
length 300
FMT(vowel/o) FMT(vowel/o)
endphoneme endphoneme



+ 3
- 0
phsource/phonemes View File



phonemetable am base2 phonemetable am base2
include ph_amhari include ph_amhari

phonemetable wo base
include ph_wolof

+ 8
- 0
platforms/windows/windows_dll/espeak.dsp View File

# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\src\sonic.cpp
# End Source File
# Begin Source File
SOURCE=.\src\numbers.cpp SOURCE=.\src\numbers.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\src\sonic.h
# End Source File
# Begin Source File
SOURCE=.\src\phoneme.h SOURCE=.\src\phoneme.h
# End Source File # End Source File
# Begin Source File # Begin Source File

+ 23
- 5
src/compiledict.cpp View File

int flags; int flags;
int suffix_char; int suffix_char;
int condition_num=0; int condition_num=0;
int at_start = 0;
const char *name; const char *name;
char buf[60]; char buf[60];
char buf_pre[60]; char buf_pre[60];
char suffix[20]; char suffix[20];
static char output[60]; static char output[60];


static char symbols[] = {' ',' ',' ',' ',' ',' ',' ',' ',' ',
'@','&','%','+','#','S','D','Z','A','L','!',' ','?','?','J','N','K','V','?','T','X','?','W'};
static char symbols[] = {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
'&','%','+','#','S','D','Z','A','L','!',' ','@','?','J','N','K','V','?','T','X','?','W'};


static char symbols_lg[] = {'A','B','C','H','F','G','Y'}; static char symbols_lg[] = {'A','B','C','H','F','G','Y'};


case RULE_PHONEMES: case RULE_PHONEMES:
finished=1; finished=1;
break; break;
case RULE_PRE_ATSTART:
at_start = 1; // drop through to next case
case RULE_PRE: case RULE_PRE:
match_type = RULE_PRE; match_type = RULE_PRE;
*p = 0; *p = 0;
sprintf(p,"?%d ",condition_num); sprintf(p,"?%d ",condition_num);
p = &p[strlen(p)]; p = &p[strlen(p)];
} }
if((ix = strlen(buf_pre)) > 0)
if(((ix = strlen(buf_pre)) > 0) || at_start)
{ {
if(at_start)
*p++ = '_';
while(--ix >= 0) while(--ix >= 0)
*p++ = buf_pre[ix]; *p++ = buf_pre[ix];
*p++ = ')'; *p++ = ')';
char *prule; char *prule;
int len; int len;
int len_name; int len_name;
int start;
int state=2; int state=2;
int finish=0; int finish=0;
int pre_bracket=0; int pre_bracket=0;
} }
if(rule_pre[0] != 0) if(rule_pre[0] != 0)
{ {
output[len++] = RULE_PRE;
start = 0;
if(rule_pre[0] == RULE_SPACE)
{
// omit '_' at the beginning of the pre-string and imply it by using RULE_PRE_ATSTART
c = RULE_PRE_ATSTART;
start = 1;
}
else
{
c = RULE_PRE;
}
output[len++] = c;

// output PRE string in reverse order // output PRE string in reverse order
for(ix = strlen(rule_pre)-1; ix>=0; ix--)
for(ix = strlen(rule_pre)-1; ix>=start; ix--)
output[len++] = rule_pre[ix]; output[len++] = rule_pre[ix];
} }



+ 53
- 26
src/dictionary.cpp View File

int done; int done;
int stressflags; int stressflags;
int dflags = 0; int dflags = 0;
int first_primary;


signed char vowel_stress[N_WORD_PHONEMES/2]; signed char vowel_stress[N_WORD_PHONEMES/2];
char syllable_weight[N_WORD_PHONEMES/2]; char syllable_weight[N_WORD_PHONEMES/2];
} }


done = 0; done = 0;
first_primary = 0;
for(v=1; v<vowel_count; v++) for(v=1; v<vowel_count; v++)
{ {
if(vowel_stress[v] < 0) if(vowel_stress[v] < 0)
stress = 3; /* use secondary stress for remaining syllables */ stress = 3; /* use secondary stress for remaining syllables */
} }
} }

if(vowel_stress[v] >= 4)
{
if(first_primary == 0)
first_primary = v;
else
if(stressflags & S_FIRST_PRIMARY)
{
// reduce primary stresses after the first to secondary
vowel_stress[v] = 3;
}
}
} }


if((unstressed_word) && (tonic < 0)) if((unstressed_word) && (tonic < 0))
int failed; int failed;
int unpron_ignore; int unpron_ignore;
int consumed; /* number of letters consumed from input */ int consumed; /* number of letters consumed from input */
int count; /* count through rules in the group */
int syllable_count; int syllable_count;
int vowel; int vowel;
int letter_group; int letter_group;
int n_bytes; int n_bytes;
int add_points; int add_points;
int command; int command;
int check_atstart;


MatchRecord match; MatchRecord match;
static MatchRecord best; static MatchRecord best;




total_consumed = 0; total_consumed = 0;
count = 0;
common_phonemes = NULL; common_phonemes = NULL;
match_type = 0; match_type = 0;


letter = 0; letter = 0;
distance_right= -6; /* used to reduce points for matches further away the current letter */ distance_right= -6; /* used to reduce points for matches further away the current letter */
distance_left= -2; distance_left= -2;
count++;
check_atstart = 0;


match.points = 1; match.points = 1;
match.end_type = 0; match.end_type = 0;
rule--; // so we are still pointing at the 0 rule--; // so we are still pointing at the 0
failed=2; // matched OK failed=2; // matched OK
break; break;

case RULE_PRE_ATSTART: // pre rule with implied 'start of word'
check_atstart = 1;
unpron_ignore = 0;
match_type = RULE_PRE;
break;

case RULE_PRE: case RULE_PRE:
match_type = RULE_PRE; match_type = RULE_PRE;
if(word_flags & FLAG_UNPRON_TEST) if(word_flags & FLAG_UNPRON_TEST)
{ {
// checking the start of the word for unpronouncable character sequences, only // checking the start of the word for unpronouncable character sequences, only
// consider rules which explicitly match the start of a word // consider rules which explicitly match the start of a word
if(rule[0] != ' ')
failed = 1;
unpron_ignore = 0;
// Note: Those rules now use RULE_PRE_ATSTART
failed = 1;
} }
break; break;

case RULE_POST: case RULE_POST:
match_type = RULE_POST; match_type = RULE_POST;
break; break;
match.points += add_points; match.points += add_points;
} }



if((failed == 2) && (unpron_ignore == 0)) if((failed == 2) && (unpron_ignore == 0))
{ {
/* matched OK, is this better than the last best match ? */

if(match.points >= best.points)
{
memcpy(&best,&match,sizeof(match));
total_consumed = consumed;
}

if((option_phonemes == 2) && (match.points > 0) && ((word_flags & FLAG_NO_TRACE) == 0))
// do we also need to check for 'start of word' ?
if((check_atstart==0) || (pre_ptr[-1] == ' '))
{ {
// show each rule that matches, and it's points score
int pts;
char decoded_phonemes[80];
if(check_atstart)
match.points += 4;


// note: 'count' contains the rule number, if we want to include it
pts = match.points;
if(group_length > 1)
pts += 35; // to account for an extra letter matching
DecodePhonemes(match.phonemes,decoded_phonemes);
fprintf(f_trans,"%3d\t%s [%s]\n",pts,DecodeRule(group_chars, group_length, rule_start, word_flags), decoded_phonemes);
/* matched OK, is this better than the last best match ? */
if(match.points >= best.points)
{
memcpy(&best,&match,sizeof(match));
total_consumed = consumed;
}
if((option_phonemes == 2) && (match.points > 0) && ((word_flags & FLAG_NO_TRACE) == 0))
{
// show each rule that matches, and it's points score
int pts;
char decoded_phonemes[80];
pts = match.points;
if(group_length > 1)
pts += 35; // to account for an extra letter matching
DecodePhonemes(match.phonemes,decoded_phonemes);
fprintf(f_trans,"%3d\t%s [%s]\n",pts,DecodeRule(group_chars, group_length, rule_start, word_flags), decoded_phonemes);
}
} }

} }


/* skip phoneme string to reach start of next template */ /* skip phoneme string to reach start of next template */
fprintf(f_trans,"Replace: %s %s\n",word,*wordptr); fprintf(f_trans,"Replace: %s %s\n",word,*wordptr);
} }
} }
else
{
flags[0] &= ~FLAG_SKIPWORDS;
}


ph_out[0] = 0; ph_out[0] = 0;
return(0); return(0);

+ 4
- 2
src/espeakedit.cpp View File

EVT_MENU(MENU_LEXICON_BG, MyFrame::OnTools) EVT_MENU(MENU_LEXICON_BG, MyFrame::OnTools)
EVT_MENU(MENU_LEXICON_DE, MyFrame::OnTools) EVT_MENU(MENU_LEXICON_DE, MyFrame::OnTools)
EVT_MENU(MENU_LEXICON_IT, MyFrame::OnTools) EVT_MENU(MENU_LEXICON_IT, MyFrame::OnTools)
EVT_MENU(MENU_LEXICON_IT2, MyFrame::OnTools)
EVT_MENU(MENU_LEXICON_TEST, MyFrame::OnTools) EVT_MENU(MENU_LEXICON_TEST, MyFrame::OnTools)
EVT_MENU(MENU_TO_UTF8, MyFrame::OnTools) EVT_MENU(MENU_TO_UTF8, MyFrame::OnTools)
EVT_MENU(MENU_COUNT_WORDS, MyFrame::OnTools) EVT_MENU(MENU_COUNT_WORDS, MyFrame::OnTools)
case MENU_LEXICON_BG: case MENU_LEXICON_BG:
case MENU_LEXICON_DE: case MENU_LEXICON_DE:
case MENU_LEXICON_IT: case MENU_LEXICON_IT:
case MENU_LEXICON_IT2:
case MENU_LEXICON_TEST: case MENU_LEXICON_TEST:
CompareLexicon(event.GetId()); // Compare a lexicon with _rules translation CompareLexicon(event.GetId()); // Compare a lexicon with _rules translation
break; break;
break; break;


case MENU_SPEAK_FILE: case MENU_SPEAK_FILE:
out_ptr = NULL;
transldlg->SpeakFile(); transldlg->SpeakFile();
break; break;


break; break;


case MENU_SPEAK_PAUSE: case MENU_SPEAK_PAUSE:
out_ptr = NULL;
SpeakNextClause(NULL,NULL,3); SpeakNextClause(NULL,NULL,3);
if(SynthStatus() & 2) if(SynthStatus() & 2)
speak_menu->SetLabel(MENU_SPEAK_PAUSE,_T("&Resume")); speak_menu->SetLabel(MENU_SPEAK_PAUSE,_T("&Resume"));
else else
{
speak_menu->SetLabel(MENU_SPEAK_PAUSE,_T("&Pause")); speak_menu->SetLabel(MENU_SPEAK_PAUSE,_T("&Pause"));
}
break; break;


case MENU_SPEAK_VOICE: case MENU_SPEAK_VOICE:

+ 96
- 27
src/extras.cpp View File



void Lexicon_It(int pass) void Lexicon_It(int pass)
{//====================== {//======================
// Reads a lexicon of pairs of words: normal spelling and spelling with accents
// Creates file: dictsource/it_listx which includes corrections for stress position and [E]/[e] and [O]/[o] phonemes
// Words which are still in error are listed in file: it_compare (in the directory of the lexicon file).
int count=0; int count=0;
int matched=0; int matched=0;
int ix; int ix;
int c; int c;
char *p;
char *p, *p2;
int len; int len;
int vowel_ix; int vowel_ix;
int stress_posn1; int stress_posn1;
FILE *f_out; FILE *f_out;
FILE *f_listx; FILE *f_listx;
FILE *f_list_in = NULL; FILE *f_list_in = NULL;
int listx_count;
long int displ; long int displ;
const char *alt_string; const char *alt_string;
wxString str;
static wxString fname_lex;
char buf[200]; char buf[200];
char word[80]; char word[80];
char word1[80]; char word1[80];
char temp[80]; char temp[80];
char phonemes[80]; char phonemes[80];
char phonemes2[80]; char phonemes2[80];
char buf_out[120];
char phonemes3[80];
char buf_out[200];
char buf_error[200];
char last_listx[200];
static const char *vowels1 = "aeiou"; static const char *vowels1 = "aeiou";
static const char *vowels2 = "aeou"; static const char *vowels2 = "aeou";




static const char *exceptions[] = {ex1, ex2, ex3, ex4, ex5, ex6, ex7, ex8, ex9, ex10, NULL}; static const char *exceptions[] = {ex1, ex2, ex3, ex4, ex5, ex6, ex7, ex8, ex9, ex10, NULL};


wxString fname = wxFileSelector(_T("Italian Lexicon"),path_dir1,_T(""),_T(""),_T("*"),wxOPEN);
if(pass == 1)
{
fname_lex = wxFileSelector(_T("Italian Lexicon"),path_dir1,_T(""),_T(""),_T("*"),wxOPEN);
}


strcpy(buf,fname.mb_str(wxConvLocal));
strcpy(buf,fname_lex.mb_str(wxConvLocal));
if((f_in = fopen(buf,"r")) == NULL) if((f_in = fopen(buf,"r")) == NULL)
{ {
wxLogError(_T("Can't read file ")+fname);
wxLogError(_T("Can't read file ")+fname_lex);
return; return;
} }
path_dir1 = wxFileName(fname).GetPath();
path_dir1 = wxFileName(fname_lex).GetPath();
strcpy(buf_out, path_dir1.mb_str(wxConvLocal));
sprintf(buf, "%s/IT_errors", buf_out);
if((f_out = fopen("compare_it","w")) == NULL)
if((f_out = fopen(buf,"w")) == NULL)
{ {
wxLogError(_T("Can't write file: compare_it "));
str = wxString(buf, wxConvLocal);
wxLogError(_T("Can't write file: ") + str);
return; return;
} }


listx_count = 0;
last_listx[0] = 0;

if(pass == 1) if(pass == 1)
{ {
sprintf(buf,"%s/it_listx",path_dsource); sprintf(buf,"%s/it_listx",path_dsource);
remove(buf); remove(buf);
CompileDictionary(path_dsource,"it",NULL,NULL,0); CompileDictionary(path_dsource,"it",NULL,NULL,0);
f_listx = fopen(buf,"w"); f_listx = fopen(buf,"w");
wxLogStatus(_T("Pass 1"));
} }
else else
{ {
CompileDictionary(path_dsource,"it",NULL,NULL,0);
sprintf(buf,"%s/it_listx2",path_dsource); sprintf(buf,"%s/it_listx2",path_dsource);
f_listx = fopen(buf,"w"); f_listx = fopen(buf,"w");
sprintf(buf,"%s/it_listx",path_dsource); sprintf(buf,"%s/it_listx",path_dsource);
continue; continue;


if(strlen(word) < 8) if(strlen(word) < 8)
sprintf(buf_out,"%s\t\t%s\t",word,temp);
sprintf(buf_error,"%s\t\t%s\t",word,temp);
else else
sprintf(buf_out,"%s\t%s",word,temp);
sprintf(buf_error,"%s\t%s",word,temp);


sprintf(word1," %s ",word); sprintf(word1," %s ",word);


sscanf(buf, "%s", word1); sscanf(buf, "%s", word1);
if(strcmp(word1, word_stem) < 0) if(strcmp(word1, word_stem) < 0)
{ {
fprintf(f_listx,"%s",buf); // copy it_listx from pass 1 until we reach the matching word
sprintf(buf_out,"%s",buf); // copy it_listx from pass 1 until we reach the matching word
} }
else else
if(strcmp(word1, word_stem) == 0)
{ {
p = buf;
while((*p != '\n') && (*p != 0)) *p++;
*p = 0;
fprintf(f_listx,"%s %s\n",buf,alt_string); // add $alt or $alt2 to the entry
if(strcmp(word1, word_stem) == 0)
{
p = buf;
while((*p != '\n') && (*p != 0)) *p++;
*p = 0;
sprintf(buf_out,"%s %s\n",buf,alt_string); // add $alt or $alt2 to the entry
}
else
{
sprintf(buf_out,"%s %s\n", word_stem, alt_string); // add a new word with $alt or $alt2
fseek(f_list_in, displ, SEEK_SET);
}

if(strcmp(buf_out, last_listx) != 0)
{
fprintf(f_listx, "%s", buf_out);
listx_count++;
strcpy(last_listx, buf_out);
}
break; break;
} }
else

if(strcmp(buf_out, last_listx) != 0)
{ {
fprintf(f_listx,"%s %s\n", word_stem, alt_string); // add a new word with $alt or $alt2
fseek(f_list_in, displ, SEEK_SET);
break;
fprintf(f_listx, "%s", buf_out);
listx_count++;
strcpy(last_listx, buf_out);
} }
} }
} }
} }
else else
{ {
fprintf(f_out,"%s\t%s\t%s\n",buf_out,phonemes,phonemes2);
// allow if the only difference is no primary stress
p2 = phonemes2;
p = phonemes3;
while(*p2 != 0)
{
*p = *p2++;
if((*p2 == ':') && (strchr("aeiouEO", *p) != NULL)) p2++; // change lone vowels to short by removing ':'
if(*p == '\'') *p = ','; // change primary to secondary stress
p++;
}
*p = 0;
if(strcmp(phonemes, phonemes3) == 0)
{
matched++;
}
else
{
// still doesn't match, report this word
fprintf(f_out,"%s\t%s\t%s\n",buf_error,phonemes,phonemes2);
}
} }
} }


{ {
while(fgets(buf, sizeof(buf), f_list_in) != NULL) while(fgets(buf, sizeof(buf), f_list_in) != NULL)
{ {
fprintf(f_listx, "%s", buf); // copy the remaining entries from pass 1
if(strcmp(buf, last_listx) != 0) // check for duplicate entries
{
fprintf(f_listx, "%s", buf); // copy the remaining entries from pass 1
listx_count++;
strcpy(last_listx, buf);
}
} }
fclose(f_list_in); fclose(f_list_in);
} }
fclose(f_in); fclose(f_in);
fclose(f_out); fclose(f_out);
fclose(f_listx); fclose(f_listx);
wxLogStatus(_T("Completed, equal=%d different=%d"),matched,count-matched);
}

if(pass == 2)
{
sprintf(buf,"%s/it_listx",path_dsource);
remove(buf);
sprintf(buf_out,"%s/it_listx2",path_dsource);
rename(buf_out, buf);
wxLogStatus(_T("Created file 'it_listx', entries=%d errors=%d total words=%d"),listx_count, count-matched, count);
}
else
{
wxLogStatus(_T("Pass 1, equal=%d different=%d"),matched,count-matched);
}
} // end of Lexicon_It




void Lexicon_De() void Lexicon_De()
fclose(f_in); fclose(f_in);
fclose(f_out); fclose(f_out);
wxLogStatus(_T("Completed, equal=%d different=%d"),matched,count-matched); wxLogStatus(_T("Completed, equal=%d different=%d"),matched,count-matched);
}
} // end of Lexicon_De




extern int IsVowel(Translator *tr, int letter); extern int IsVowel(Translator *tr, int letter);
break; break;
case MENU_LEXICON_IT: case MENU_LEXICON_IT:
Lexicon_It(1); Lexicon_It(1);
break;
case MENU_LEXICON_IT2:
Lexicon_It(2); Lexicon_It(2);
break; break;
case MENU_LEXICON_TEST: case MENU_LEXICON_TEST:

+ 0
- 1
src/main.h View File

MENU_LEXICON_BG, MENU_LEXICON_BG,
MENU_LEXICON_DE, MENU_LEXICON_DE,
MENU_LEXICON_IT, MENU_LEXICON_IT,
MENU_LEXICON_IT2,
MENU_LEXICON_TEST, MENU_LEXICON_TEST,
MENU_TO_UTF8, MENU_TO_UTF8,
MENU_COUNT_WORDS, MENU_COUNT_WORDS,

+ 0
- 1
src/menus.cpp View File

lexicon_menu->Append(MENU_LEXICON_BG, _("Bulgarian")); lexicon_menu->Append(MENU_LEXICON_BG, _("Bulgarian"));
lexicon_menu->Append(MENU_LEXICON_DE, _("German")); lexicon_menu->Append(MENU_LEXICON_DE, _("German"));
lexicon_menu->Append(MENU_LEXICON_IT, _("Italian")); lexicon_menu->Append(MENU_LEXICON_IT, _("Italian"));
lexicon_menu->Append(MENU_LEXICON_IT2, _("Italian, pass 2"));
// lexicon_menu->Append(MENU_LEXICON_TEST, _("Test")); // lexicon_menu->Append(MENU_LEXICON_TEST, _("Test"));


tools_menu = new wxMenu; tools_menu = new wxMenu;

+ 16
- 12
src/numbers.cpp View File

} // end of CheckDotOrdinal } // end of CheckDotOrdinal




static int hu_number_e(const char *word)
{//=====================================
static int hu_number_e(const char *word, int thousandplex, int value)
{//==================================================================
// lang-hu: variant form of numbers when followed by hyphen and a suffix starting with 'a' or 'e' (but not a, e, az, ez, azt, ezt, att. ett // lang-hu: variant form of numbers when followed by hyphen and a suffix starting with 'a' or 'e' (but not a, e, az, ez, azt, ezt, att. ett


if((word[0] == 'a') || (word[0] == 'e')) if((word[0] == 'a') || (word[0] == 'e'))
{ {
if((word[1] == ' ') || (word[1] == 'z') || ((word[1] == 't') && (word[2] == 't'))) if((word[1] == ' ') || (word[1] == 'z') || ((word[1] == 't') && (word[2] == 't')))
return(0); return(0);

if(((thousandplex==1) || ((value % 1000) == 0)) && (word[1] == 'l'))
return(0); // 1000-el

return(1); return(1);
} }
return(0); return(0);
{ {
if(!(wtab[0].flags & FLAG_ORDINAL)) if(!(wtab[0].flags & FLAG_ORDINAL))
{ {
if((wtab[0].flags & FLAG_HYPHEN_AFTER) && hu_number_e(word))
if((wtab[0].flags & FLAG_HYPHEN_AFTER) && hu_number_e(word, 0, acc))
{ {
// should use the 'e' form of the number // should use the 'e' form of the number
num_control |= 1; num_control |= 1;
char ph_tens[50]; char ph_tens[50];
char ph_digits[50]; char ph_digits[50];
char ph_and[12]; char ph_and[12];
char ph_ord_suffix[20];


units = value % 10; units = value % 10;
tens = value / 10; tens = value / 10;
if((units != 0) && (tr->langopts.numbers2 & NUM2_MULTIPLE_ORDINAL)) if((units != 0) && (tr->langopts.numbers2 & NUM2_MULTIPLE_ORDINAL))
{ {
// Use the ordinal form of tens as well as units. Add the ordinal ending // Use the ordinal form of tens as well as units. Add the ordinal ending
Lookup(tr, "_ord", ph_ord_suffix);
strcat(ph_tens, ph_ord_suffix);
strcat(ph_tens, ph_ordinal2);
} }
} }
} }
char ph_thousands[50]; char ph_thousands[50];
char ph_hundred_and[12]; char ph_hundred_and[12];
char ph_thousand_and[12]; char ph_thousand_and[12];
char ph_ord_suffix[20];


ordinal = control & 0x22; ordinal = control & 0x22;
hundreds = value / 100; hundreds = value / 100;
{ {
// Use ordinal form of hundreds, as well as for tens and units // Use ordinal form of hundreds, as well as for tens and units
// Add ordinal suffix to the hundreds // Add ordinal suffix to the hundreds
Lookup(tr, "_ord", ph_ord_suffix);
strcat(ph_digits, ph_ord_suffix);
strcat(ph_digits, ph_ordinal2);
} }
} }


int thousands_inc = 0; int thousands_inc = 0;
int prev_thousands = 0; int prev_thousands = 0;
int ordinal = 0; int ordinal = 0;
int dot_ordinal;
int this_value; int this_value;
int decimal_count; int decimal_count;
int max_decimal_count; int max_decimal_count;
if(prev_thousands || (word[0] != '0')) if(prev_thousands || (word[0] != '0'))
{ {
// don't check for ordinal if the number has a leading zero // don't check for ordinal if the number has a leading zero
ordinal = CheckDotOrdinal(tr, word, &word[ix], wtab, 0);
if((ordinal = CheckDotOrdinal(tr, word, &word[ix], wtab, 0)) != 0)
dot_ordinal = 1;
} }


if((word[ix] == '.') && !isdigit(word[ix+1]) && !isdigit(word[ix+2]) && !(wtab[1].flags & FLAG_NOSPACE)) if((word[ix] == '.') && !isdigit(word[ix+1]) && !isdigit(word[ix+2]) && !(wtab[1].flags & FLAG_NOSPACE))
if(tr->translator_name == L('h','u')) if(tr->translator_name == L('h','u'))
{ {
// variant form of numbers when followed by hyphen and a suffix starting with 'a' or 'e' (but not a, e, az, ez, azt, ezt // variant form of numbers when followed by hyphen and a suffix starting with 'a' or 'e' (but not a, e, az, ez, azt, ezt
if((wtab[thousandplex].flags & FLAG_HYPHEN_AFTER) && (thousands_exact==1) && hu_number_e(&word[suffix_ix]))
if((wtab[thousandplex].flags & FLAG_HYPHEN_AFTER) && (thousands_exact==1) && hu_number_e(&word[suffix_ix], thousandplex, value))
{ {
number_control |= 1; // use _1e variant of number number_control |= 1; // use _1e variant of number
} }
n_digit_lookup = 2; n_digit_lookup = 2;
} }
} }

// if((buf_digit_lookup[0] == 0) && (*p != '0') && (dot_ordinal==0))
if((buf_digit_lookup[0] == 0) && (*p != '0')) if((buf_digit_lookup[0] == 0) && (*p != '0'))
{ {
// not found, lookup only the last digit
// not found, lookup only the last digit (?? but not if dot-ordinal has been found)
if(LookupDictList(tr, &p, buf_digit_lookup, flags, FLAG_SUFX, wtab)) // don't match '0', or entries with $only if(LookupDictList(tr, &p, buf_digit_lookup, flags, FLAG_SUFX, wtab)) // don't match '0', or entries with $only
{ {
n_digit_lookup = 1; n_digit_lookup = 1;

+ 5
- 7
src/setlengths.cpp View File

int s1; int s1;
int wpm; int wpm;
int wpm2; int wpm2;
double wpm_inc;


speed.loud_consonants = 0; speed.loud_consonants = 0;
speed.min_sample_len = 450; speed.min_sample_len = 450;
// fast_settings[0] wpm where speedup starts // fast_settings[0] wpm where speedup starts
// fast_settings[1] wpm for maximum espeak speed // fast_settings[1] wpm for maximum espeak speed
// fast_settings[2] maximum espeak speed // fast_settings[2] maximum espeak speed

sonicSpeed = 1.0; sonicSpeed = 1.0;
if(wpm > speed.fast_settings[0]) if(wpm > speed.fast_settings[0])
{ {
wpm2 = wpm; wpm2 = wpm;
wpm_inc = (double)(speed.fast_settings[2] - speed.fast_settings[0]) / (double)(speed.fast_settings[1] - speed.fast_settings[0]);

wpm_inc = (wpm2 - speed.fast_settings[0]) * wpm_inc;
wpm = speed.fast_settings[0] + (int)wpm_inc;

sonicSpeed = ((double)wpm2)/wpm;
wpm = speed.fast_settings[2];
// Maybe we can do better than a 10 wpm fudge factor?
sonicSpeed = ((double)wpm2 + 10)/wpm;
} }



#ifdef TEST_SPEED #ifdef TEST_SPEED
if(wpm > 1000) if(wpm > 1000)
{ {

+ 967
- 0
src/sonic.cpp View File

/* Sonic library
Copyright 2010
Bill Cox
This file is part of the Sonic Library.

The Sonic Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */

#include "StdAfx.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "sonic.h"

struct sonicStreamStruct {
short *inputBuffer;
short *outputBuffer;
short *pitchBuffer;
short *downSampleBuffer;
float speed;
float volume;
float pitch;
int numChannels;
int inputBufferSize;
int pitchBufferSize;
int outputBufferSize;
int numInputSamples;
int numOutputSamples;
int numPitchSamples;
int minPeriod;
int maxPeriod;
int maxRequired;
int remainingInputToCopy;
int sampleRate;
int prevPeriod;
int prevMaxDiff;
int prevMinDiff;
};

/* Just used for debugging */
void sonicMSG(char *format, ...)
{
char buffer[4096];
va_list ap;
FILE *file;

va_start(ap, format);
vsprintf((char *)buffer, (char *)format, ap);
va_end(ap);
file=fopen("/tmp/sonic.log", "a");
fprintf(file, "%s", buffer);
fclose(file);
}

/* Scale the samples by the factor. */
static void scaleSamples(
short *samples,
int numSamples,
float volume)
{
int fixedPointVolume = volume*4096.0f;
int value;

while(numSamples--) {
value = (*samples*fixedPointVolume) >> 12;
if(value > 32767) {
value = 32767;
} else if(value < -32767) {
value = -32767;
}
*samples++ = value;
}
}

/* Get the speed of the stream. */
float sonicGetSpeed(
sonicStream stream)
{
return stream->speed;
}

/* Set the speed of the stream. */
void sonicSetSpeed(
sonicStream stream,
float speed)
{
stream->speed = speed;
}

/* Get the pitch of the stream. */
float sonicGetPitch(
sonicStream stream)
{
return stream->pitch;
}

/* Set the pitch of the stream. */
void sonicSetPitch(
sonicStream stream,
float pitch)
{
stream->pitch = pitch;
}

/* Get the scaling factor of the stream. */
float sonicGetVolume(
sonicStream stream)
{
return stream->volume;
}

/* Set the scaling factor of the stream. */
void sonicSetVolume(
sonicStream stream,
float volume)
{
stream->volume = volume;
}

/* Get the sample rate of the stream. */
int sonicGetSampleRate(
sonicStream stream)
{
return stream->sampleRate;
}

/* Get the number of channels. */
int sonicGetNumChannels(
sonicStream stream)
{
return stream->numChannels;
}

/* Destroy the sonic stream. */
void sonicDestroyStream(
sonicStream stream)
{
if(stream->inputBuffer != NULL) {
free(stream->inputBuffer);
}
if(stream->outputBuffer != NULL) {
free(stream->outputBuffer);
}
if(stream->pitchBuffer != NULL) {
free(stream->pitchBuffer);
}
if(stream->downSampleBuffer != NULL) {
free(stream->downSampleBuffer);
}
free(stream);
}

/* Create a sonic stream. Return NULL only if we are out of memory and cannot
allocate the stream. */
sonicStream sonicCreateStream(
int sampleRate,
int numChannels)
{
sonicStream stream = (sonicStream)calloc(1, sizeof(struct sonicStreamStruct));
int minPeriod = sampleRate/SONIC_MAX_PITCH;
int maxPeriod = sampleRate/SONIC_MIN_PITCH;
int maxRequired = 2*maxPeriod;

if(stream == NULL) {
return NULL;
}
stream->inputBufferSize = maxRequired;
stream->inputBuffer = (short *)calloc(maxRequired, sizeof(short)*numChannels);
if(stream->inputBuffer == NULL) {
sonicDestroyStream(stream);
return NULL;
}
stream->outputBufferSize = maxRequired;
stream->outputBuffer = (short *)calloc(maxRequired, sizeof(short)*numChannels);
if(stream->outputBuffer == NULL) {
sonicDestroyStream(stream);
return NULL;
}
stream->pitchBufferSize = maxRequired;
stream->pitchBuffer = (short *)calloc(maxRequired, sizeof(short)*numChannels);
if(stream->pitchBuffer == NULL) {
sonicDestroyStream(stream);
return NULL;
}
stream->downSampleBuffer = (short *)calloc(maxRequired, sizeof(short));
stream->speed = 1.0f;
stream->pitch = 1.0f;
stream->volume = 1.0f;
stream->sampleRate = sampleRate;
stream->numChannels = numChannels;
stream->minPeriod = minPeriod;
stream->maxPeriod = maxPeriod;
stream->maxRequired = maxRequired;
return stream;
}

/* Enlarge the output buffer if needed. */
static int enlargeOutputBufferIfNeeded(
sonicStream stream,
int numSamples)
{
if(stream->numOutputSamples + numSamples > stream->outputBufferSize) {
stream->outputBufferSize += (stream->outputBufferSize >> 1) + numSamples;
stream->outputBuffer = (short *)realloc(stream->outputBuffer,
stream->outputBufferSize*sizeof(short)*stream->numChannels);
if(stream->outputBuffer == NULL) {
return 0;
}
}
return 1;
}

/* Enlarge the input buffer if needed. */
static int enlargeInputBufferIfNeeded(
sonicStream stream,
int numSamples)
{
if(stream->numInputSamples + numSamples > stream->inputBufferSize) {
stream->inputBufferSize += (stream->inputBufferSize >> 1) + numSamples;
stream->inputBuffer = (short *)realloc(stream->inputBuffer,
stream->inputBufferSize*sizeof(short)*stream->numChannels);
if(stream->inputBuffer == NULL) {
return 0;
}
}
return 1;
}

/* Add the input samples to the input buffer. */
static int addFloatSamplesToInputBuffer(
sonicStream stream,
float *samples,
int numSamples)
{
short *buffer;
int count = numSamples*stream->numChannels;

if(numSamples == 0) {
return 1;
}
if(!enlargeInputBufferIfNeeded(stream, numSamples)) {
return 0;
}
buffer = stream->inputBuffer + stream->numInputSamples*stream->numChannels;
while(count--) {
*buffer++ = (*samples++)*32767.0f;
}
stream->numInputSamples += numSamples;
return 1;
}

/* Add the input samples to the input buffer. */
static int addShortSamplesToInputBuffer(
sonicStream stream,
short *samples,
int numSamples)
{
if(numSamples == 0) {
return 1;
}
if(!enlargeInputBufferIfNeeded(stream, numSamples)) {
return 0;
}
memcpy(stream->inputBuffer + stream->numInputSamples*stream->numChannels, samples,
numSamples*sizeof(short)*stream->numChannels);
stream->numInputSamples += numSamples;
return 1;
}

/* Add the input samples to the input buffer. */
static int addUnsignedCharSamplesToInputBuffer(
sonicStream stream,
unsigned char *samples,
int numSamples)
{
short *buffer;
int count = numSamples*stream->numChannels;

if(numSamples == 0) {
return 1;
}
if(!enlargeInputBufferIfNeeded(stream, numSamples)) {
return 0;
}
buffer = stream->inputBuffer + stream->numInputSamples*stream->numChannels;
while(count--) {
*buffer++ = (*samples++ - 128) << 8;
}
stream->numInputSamples += numSamples;
return 1;
}

/* Remove input samples that we have already processed. */
static void removeInputSamples(
sonicStream stream,
int position)
{
int remainingSamples = stream->numInputSamples - position;

if(remainingSamples > 0) {
memmove(stream->inputBuffer, stream->inputBuffer + position*stream->numChannels,
remainingSamples*sizeof(short)*stream->numChannels);
}
stream->numInputSamples = remainingSamples;
}

/* Just copy from the array to the output buffer */
static int copyToOutput(
sonicStream stream,
short *samples,
int numSamples)
{
if(!enlargeOutputBufferIfNeeded(stream, numSamples)) {
return 0;
}
memcpy(stream->outputBuffer + stream->numOutputSamples*stream->numChannels,
samples, numSamples*sizeof(short)*stream->numChannels);
stream->numOutputSamples += numSamples;
return numSamples;
}

/* Just copy from the input buffer to the output buffer. Return 0 if we fail to
resize the output buffer. Otherwise, return numSamples */
static int copyInputToOutput(
sonicStream stream,
int position)
{
int numSamples = stream->remainingInputToCopy;

if(numSamples > stream->maxRequired) {
numSamples = stream->maxRequired;
}
if(!copyToOutput(stream, stream->inputBuffer + position*stream->numChannels,
numSamples)) {
return 0;
}
stream->remainingInputToCopy -= numSamples;
return numSamples;
}

/* Read data out of the stream. Sometimes no data will be available, and zero
is returned, which is not an error condition. */
int sonicReadFloatFromStream(
sonicStream stream,
float *samples,
int maxSamples)
{
int numSamples = stream->numOutputSamples;
int remainingSamples = 0;
short *buffer;
int count;

if(numSamples == 0) {
return 0;
}
if(numSamples > maxSamples) {
remainingSamples = numSamples - maxSamples;
numSamples = maxSamples;
}
buffer = stream->outputBuffer;
count = numSamples*stream->numChannels;
while(count--) {
*samples++ = (*buffer++)/32767.0f;
}
if(remainingSamples > 0) {
memmove(stream->outputBuffer, stream->outputBuffer + numSamples*stream->numChannels,
remainingSamples*sizeof(short)*stream->numChannels);
}
stream->numOutputSamples = remainingSamples;
return numSamples;
}

/* Read short data out of the stream. Sometimes no data will be available, and zero
is returned, which is not an error condition. */
int sonicReadShortFromStream(
sonicStream stream,
short *samples,
int maxSamples)
{
int numSamples = stream->numOutputSamples;
int remainingSamples = 0;

if(numSamples == 0) {
return 0;
}
if(numSamples > maxSamples) {
remainingSamples = numSamples - maxSamples;
numSamples = maxSamples;
}
memcpy(samples, stream->outputBuffer, numSamples*sizeof(short)*stream->numChannels);
if(remainingSamples > 0) {
memmove(stream->outputBuffer, stream->outputBuffer + numSamples*stream->numChannels,
remainingSamples*sizeof(short)*stream->numChannels);
}
stream->numOutputSamples = remainingSamples;
return numSamples;
}

/* Read unsigned char data out of the stream. Sometimes no data will be available, and zero
is returned, which is not an error condition. */
int sonicReadUnsignedCharFromStream(
sonicStream stream,
unsigned char *samples,
int maxSamples)
{
int numSamples = stream->numOutputSamples;
int remainingSamples = 0;
short *buffer;
int count;

if(numSamples == 0) {
return 0;
}
if(numSamples > maxSamples) {
remainingSamples = numSamples - maxSamples;
numSamples = maxSamples;
}
buffer = stream->outputBuffer;
count = numSamples*stream->numChannels;
while(count--) {
*samples++ = (char)((*buffer++) >> 8) + 128;
}
if(remainingSamples > 0) {
memmove(stream->outputBuffer, stream->outputBuffer + numSamples*stream->numChannels,
remainingSamples*sizeof(short)*stream->numChannels);
}
stream->numOutputSamples = remainingSamples;
return numSamples;
}

/* Force the sonic stream to generate output using whatever data it currently
has. No extra delay will be added to the output, but flushing in the middle of
words could introduce distortion. */
int sonicFlushStream(
sonicStream stream)
{
int maxRequired = stream->maxRequired;
int numSamples = stream->numInputSamples;
int remainingSpace, numOutputSamples, expectedSamples;

if(numSamples == 0) {
return 1;
}
if(numSamples >= maxRequired && !sonicWriteShortToStream(stream, NULL, 0)) {
return 0;
}
numSamples = stream->numInputSamples; /* Now numSamples < maxRequired */
if(numSamples == 0) {
return 1;
}
remainingSpace = maxRequired - numSamples;
memset(stream->inputBuffer + numSamples*stream->numChannels, 0,
remainingSpace*sizeof(short)*stream->numChannels);
stream->numInputSamples = maxRequired;
numOutputSamples = stream->numOutputSamples;
if(!sonicWriteShortToStream(stream, NULL, 0)) {
return 0;
}
/* Throw away any extra samples we generated due to the silence we added */
expectedSamples = (int)(numSamples*stream->speed + 0.5);
if(stream->numOutputSamples > numOutputSamples + expectedSamples) {
stream->numOutputSamples = numOutputSamples + expectedSamples;
}
return 1;
}

/* Return the number of samples in the output buffer */
int sonicSamplesAvailable(
sonicStream stream)
{
return stream->numOutputSamples;
}

/* If skip is greater than one, average skip samples togther and write them to
the down-sample buffer. If numChannels is greater than one, mix the channels
together as we down sample. */
static void downSampleInput(
sonicStream stream,
short *samples,
int skip)
{
int numSamples = stream->maxRequired/skip;
int samplesPerValue = stream->numChannels*skip;
int i, j;
int value;
short *downSamples = stream->downSampleBuffer;

for(i = 0; i < numSamples; i++) {
value = 0;
for(j = 0; j < samplesPerValue; j++) {
value += *samples++;
}
value /= samplesPerValue;
*downSamples++ = value;
}
}

/* Find the best frequency match in the range, and given a sample skip multiple.
For now, just find the pitch of the first channel. */
static int findPitchPeriodInRange(
short *samples,
int minPeriod,
int maxPeriod,
int *retMinDiff,
int *retMaxDiff)
{
int period, bestPeriod = 0;
short *s, *p, sVal, pVal;
unsigned long diff, minDiff = 1, maxDiff = 0;
int i;

for(period = minPeriod; period <= maxPeriod; period++) {
diff = 0;
s = samples;
p = samples + period;
for(i = 0; i < period; i++) {
sVal = *s++;
pVal = *p++;
diff += sVal >= pVal? (unsigned short)(sVal - pVal) :
(unsigned short)(pVal - sVal);
}
/* Note that the highest number of samples we add into diff will be less
than 256, since we skip samples. Thus, diff is a 24 bit number, and
we can safely multiply by numSamples without overflow */
if(diff*bestPeriod < minDiff*period) {
minDiff = diff;
bestPeriod = period;
}
if(diff*bestPeriod > maxDiff*period) {
maxDiff = diff;
}
}
*retMinDiff = minDiff;
*retMaxDiff = maxDiff;
return bestPeriod;
}

/* At abrupt ends of voiced words, we can have pitch periods that are better
aproximated by the previous pitch period estimate. Try to detect this case. */
static int prevPeriodBetter(
sonicStream stream,
int period,
int minDiff,
int maxDiff)
{
if(maxDiff*3/2 < stream->prevMaxDiff && (maxDiff*3.0f)*stream->prevMinDiff <
(float)stream->prevMaxDiff*minDiff*2) {
return 1;
}
return 0;
}

/* Find the pitch period. This is a critical step, and we may have to try
multiple ways to get a good answer. This version uses AMDF. To improve
speed, we down sample by an integer factor get in the 11KHz range, and then
do it again with a narrower frequency range without down sampling */
static int findPitchPeriod(
sonicStream stream,
short *samples)
{
int minPeriod = stream->minPeriod;
int maxPeriod = stream->maxPeriod;
int sampleRate = stream->sampleRate;
int minDiff, maxDiff, retPeriod;
int skip = 1;
int period;

if(sampleRate > SONIC_AMDF_FREQ) {
skip = sampleRate/SONIC_AMDF_FREQ;
}
if(stream->numChannels == 1 && skip == 1) {
period = findPitchPeriodInRange(samples, minPeriod, maxPeriod, &minDiff, &maxDiff);
} else {
downSampleInput(stream, samples, skip);
period = findPitchPeriodInRange(stream->downSampleBuffer, minPeriod/skip,
maxPeriod/skip, &minDiff, &maxDiff);
if(skip != 1) {
period *= skip;
minPeriod = period - (skip << 2);
maxPeriod = period + (skip << 2);
if(minPeriod < stream->minPeriod) {
minPeriod = stream->minPeriod;
}
if(maxPeriod > stream->maxPeriod) {
maxPeriod = stream->maxPeriod;
}
if(stream->numChannels == 1) {
period = findPitchPeriodInRange(samples, minPeriod, maxPeriod,
&minDiff, &maxDiff);
} else {
downSampleInput(stream, samples, 1);
period = findPitchPeriodInRange(stream->downSampleBuffer, minPeriod,
maxPeriod, &minDiff, &maxDiff);
}
}
}
if(prevPeriodBetter(stream, period, minDiff, maxDiff)) {
retPeriod = stream->prevPeriod;
} else {
retPeriod = period;
}
stream->prevMinDiff = minDiff;
stream->prevMaxDiff = maxDiff;
stream->prevPeriod = period;
return retPeriod;
}

/* Overlap two sound segments, ramp the volume of one down, while ramping the
other one from zero up, and add them, storing the result at the output. */
static void overlapAdd(
int numSamples,
int numChannels,
short *out,
short *rampDown,
short *rampUp)
{
short *o, *u, *d;
int i, t;

for(i = 0; i < numChannels; i++) {
o = out + i;
u = rampUp + i;
d = rampDown + i;
for(t = 0; t < numSamples; t++) {
*o = (*d*(numSamples - t) + *u*t)/numSamples;
o += numChannels;
d += numChannels;
u += numChannels;
}
}
}

/* Overlap two sound segments, ramp the volume of one down, while ramping the
other one from zero up, and add them, storing the result at the output. */
static void overlapAddWithSeparation(
int numSamples,
int numChannels,
int separation,
short *out,
short *rampDown,
short *rampUp)
{
short *o, *u, *d;
int i, t;

for(i = 0; i < numChannels; i++) {
o = out + i;
u = rampUp + i;
d = rampDown + i;
for(t = 0; t < numSamples + separation; t++) {
if(t < separation) {
*o = *d*(numSamples - t)/numSamples;
d += numChannels;
} else if(t < numSamples) {
*o = (*d*(numSamples - t) + *u*(t - separation))/numSamples;
d += numChannels;
u += numChannels;
} else {
*o = *u*(t - separation)/numSamples;
u += numChannels;
}
o += numChannels;
}
}
}

/* Just move the new samples in the output buffer to the pitch bufer */
static int moveNewSamplesToPitchBuffer(
sonicStream stream,
int originalNumOutputSamples)
{
int numSamples = stream->numOutputSamples - originalNumOutputSamples;
int numChannels = stream->numChannels;

if(stream->numPitchSamples + numSamples > stream->pitchBufferSize) {
stream->pitchBufferSize += (stream->pitchBufferSize >> 1) + numSamples;
stream->pitchBuffer = (short *)realloc(stream->pitchBuffer,
stream->pitchBufferSize*sizeof(short)*numChannels);
if(stream->pitchBuffer == NULL) {
return 0;
}
}
memcpy(stream->pitchBuffer + stream->numPitchSamples*numChannels,
stream->outputBuffer + originalNumOutputSamples*numChannels,
numSamples*sizeof(short)*numChannels);
stream->numOutputSamples = originalNumOutputSamples;
stream->numPitchSamples += numSamples;
return 1;
}

/* Remove processed samples from the pitch buffer. */
static void removePitchSamples(
sonicStream stream,
int numSamples)
{
int numChannels = stream->numChannels;
short *source = stream->pitchBuffer + numSamples*numChannels;

if(numSamples == 0) {
return;
}
if(numSamples != stream->numPitchSamples) {
memmove(stream->pitchBuffer, source, (stream->numPitchSamples -
numSamples)*sizeof(short)*numChannels);
}
stream->numPitchSamples -= numSamples;
}

/* Change the pitch. The latency this introduces could be reduced by looking at
past samples to determine pitch, rather than future. */
static int adjustPitch(
sonicStream stream,
int originalNumOutputSamples)
{
float pitch = stream->pitch;
int numChannels = stream->numChannels;
int period, newPeriod, separation;
int position = 0;
short *out, *rampDown, *rampUp;

if(stream->numOutputSamples == originalNumOutputSamples) {
return 1;
}
if(!moveNewSamplesToPitchBuffer(stream, originalNumOutputSamples)) {
return 0;
}
while(stream->numPitchSamples - position >= stream->maxRequired) {
period = findPitchPeriod(stream, stream->pitchBuffer + position*numChannels);
newPeriod = period/pitch;
if(!enlargeOutputBufferIfNeeded(stream, newPeriod)) {
return 0;
}
out = stream->outputBuffer + stream->numOutputSamples*numChannels;
if(pitch >= 1.0f) {
rampDown = stream->pitchBuffer + position*numChannels;
rampUp = stream->pitchBuffer + (position + period - newPeriod)*numChannels;
overlapAdd(newPeriod, numChannels, out, rampDown, rampUp);
} else {
rampDown = stream->pitchBuffer + position*numChannels;
rampUp = stream->pitchBuffer + position*numChannels;
separation = newPeriod - period;
overlapAddWithSeparation(period, numChannels, separation, out, rampDown, rampUp);
}
stream->numOutputSamples += newPeriod;
position += period;
}
removePitchSamples(stream, position);
return 1;
}

/* Skip over a pitch period, and copy period/speed samples to the output */
static int skipPitchPeriod(
sonicStream stream,
short *samples,
float speed,
int period)
{
long newSamples;
int numChannels = stream->numChannels;

if(speed >= 2.0f) {
newSamples = period/(speed - 1.0f);
} else if(speed > 1.0f) {
newSamples = period;
stream->remainingInputToCopy = period*(2.0f - speed)/(speed - 1.0f);
}
if(!enlargeOutputBufferIfNeeded(stream, newSamples)) {
return 0;
}
overlapAdd(newSamples, numChannels, stream->outputBuffer +
stream->numOutputSamples*numChannels, samples, samples + period*numChannels);
stream->numOutputSamples += newSamples;
return newSamples;
}

/* Insert a pitch period, and determine how much input to copy directly. */
static int insertPitchPeriod(
sonicStream stream,
short *samples,
float speed,
int period)
{
long newSamples;
short *out;
int numChannels = stream->numChannels;

if(speed < 0.5f) {
newSamples = period*speed/(1.0f - speed);
} else {
newSamples = period;
stream->remainingInputToCopy = period*(2.0f*speed - 1.0f)/(1.0f - speed);
}
if(!enlargeOutputBufferIfNeeded(stream, period + newSamples)) {
return 0;
}
out = stream->outputBuffer + stream->numOutputSamples*numChannels;
memcpy(out, samples, period*sizeof(short)*numChannels);
out = stream->outputBuffer + (stream->numOutputSamples + period)*numChannels;
overlapAdd(newSamples, numChannels, out, samples + period*numChannels, samples);
stream->numOutputSamples += period + newSamples;
return newSamples;
}

/* Resample as many pitch periods as we have buffered on the input. Return 0 if
we fail to resize an input or output buffer. Also scale the output by the volume. */
static int changeSpeed(
sonicStream stream,
float speed)
{
short *samples;
int numSamples = stream->numInputSamples;
int position = 0, period, newSamples;
int maxRequired = stream->maxRequired;

if(stream->numInputSamples < maxRequired) {
return 1;
}
do {
if(stream->remainingInputToCopy > 0) {
newSamples = copyInputToOutput(stream, position);
position += newSamples;
} else {
samples = stream->inputBuffer + position*stream->numChannels;
period = findPitchPeriod(stream, samples);
if(speed > 1.0) {
newSamples = skipPitchPeriod(stream, samples, speed, period);
position += period + newSamples;
} else {
newSamples = insertPitchPeriod(stream, samples, speed, period);
position += newSamples;
}
}
if(newSamples == 0) {
return 0; /* Failed to resize output buffer */
}
} while(position + maxRequired <= numSamples);
removeInputSamples(stream, position);
return 1;
}

/* Resample as many pitch periods as we have buffered on the input. Return 0 if
we fail to resize an input or output buffer. Also scale the output by the volume. */
static int processStreamInput(
sonicStream stream)
{
int originalNumOutputSamples = stream->numOutputSamples;
float speed = stream->speed/stream->pitch;

if(speed > 1.00001 || speed < 0.99999) {
changeSpeed(stream, speed);
} else {
if(!copyToOutput(stream, stream->inputBuffer, stream->numInputSamples)) {
return 0;
}
stream->numInputSamples = 0;
}
if(stream->pitch != 1.0f) {
if(!adjustPitch(stream, originalNumOutputSamples)) {
return 0;
}
}
if(stream->volume != 1.0f) {
/* Adjust output volume. */
scaleSamples(stream->outputBuffer + originalNumOutputSamples*stream->numChannels,
(stream->numOutputSamples - originalNumOutputSamples)*stream->numChannels,
stream->volume);
}
return 1;
}

/* Write floating point data to the input buffer and process it. */
int sonicWriteFloatToStream(
sonicStream stream,
float *samples,
int numSamples)
{
if(!addFloatSamplesToInputBuffer(stream, samples, numSamples)) {
return 0;
}
return processStreamInput(stream);
}

/* Simple wrapper around sonicWriteFloatToStream that does the short to float
conversion for you. */
int sonicWriteShortToStream(
sonicStream stream,
short *samples,
int numSamples)
{
if(!addShortSamplesToInputBuffer(stream, samples, numSamples)) {
return 0;
}
return processStreamInput(stream);
}

/* Simple wrapper around sonicWriteFloatToStream that does the unsigned char to float
conversion for you. */
int sonicWriteUnsignedCharToStream(
sonicStream stream,
unsigned char *samples,
int numSamples)
{
if(!addUnsignedCharSamplesToInputBuffer(stream, samples, numSamples)) {
return 0;
}
return processStreamInput(stream);
}

/* This is a non-stream oriented interface to just change the speed of a sound sample */
int sonicChangeFloatSpeed(
float *samples,
int numSamples,
float speed,
float pitch,
float volume,
int sampleRate,
int numChannels)
{
sonicStream stream = sonicCreateStream(sampleRate, numChannels);

sonicSetSpeed(stream, speed);
sonicSetPitch(stream, pitch);
sonicSetVolume(stream, volume);
sonicWriteFloatToStream(stream, samples, numSamples);
sonicFlushStream(stream);
numSamples = sonicSamplesAvailable(stream);
sonicReadFloatFromStream(stream, samples, numSamples);
sonicDestroyStream(stream);
return numSamples;
}

/* This is a non-stream oriented interface to just change the speed of a sound sample */
int sonicChangeShortSpeed(
short *samples,
int numSamples,
float speed,
float pitch,
float volume,
int sampleRate,
int numChannels)
{
sonicStream stream = sonicCreateStream(sampleRate, numChannels);

sonicSetSpeed(stream, speed);
sonicSetPitch(stream, pitch);
sonicSetVolume(stream, volume);
sonicWriteShortToStream(stream, samples, numSamples);
sonicFlushStream(stream);
numSamples = sonicSamplesAvailable(stream);
sonicReadShortFromStream(stream, samples, numSamples);
sonicDestroyStream(stream);
return numSamples;
}

+ 138
- 0
src/sonic.h View File

/* Sonic library
Copyright 2010
Bill Cox
This file is part of the Sonic Library.

The Sonic Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */

/*
The Sonic Library implements Pitch Based Resampling, which is a new algorithm
invented by Bill Cox for the specific purpose of speeding up speech by high
factors at high quality. It generates smooth speech at speed up factors as high
as 6X, possibly more. It is also capable of slowing down speech, and generates
high quality results regardless of the speed up or slow down factor. For
speeding up speech by 2X or more, the following equation is used:

newSamples = period/(speed - 1.0)
scale = 1.0/newSamples;

where period is the current pitch period, determined using AMDF or any other
pitch estimator, and speed is the speedup factor. If the current position in
the input stream is pointed to by "samples", and the current output stream
position is pointed to by "out", then newSamples number of samples can be
generated with:

out[t] = (samples[t]*(newSamples - t) + samples[t + period]*t)/newSamples;

where t = 0 to newSamples - 1.

For speed factors < 2X, an algorithm similar to PICOLA is used. The above
algorithm is first used to double the speed of one pitch period. Then, enough
input is directly copied from the input to the output to achieve the desired
speed up facter, where 1.0 < speed < 2.0. The amount of data copied is derived:

speed = (2*period + length)/(period + length)
speed*length + speed*period = 2*period + length
length(speed - 1) = 2*period - speed*period
length = period*(2 - speed)/(speed - 1)

For slowing down speech where 0.5 < speed < 1.0, a pitch period is inserted into
the output twice, and length of input is copied from the input to the output
until the output desired speed is reached. The length of data copied is:

length = period*(speed - 0.5)/(1 - speed)

For slow down factors between 0.5 and 0.5, no data is copied, and an algorithm
similar to high speed factors is used.
*/

#ifdef __cplusplus
extern "C" {
#endif

/* This specifies the range of voice pitches we try to match.
Note that if we go lower than 65, we could overflow in findPitchInRange */
#define SONIC_MIN_PITCH 65
#define SONIC_MAX_PITCH 400

/* These are used to down-sample some inputs to improve speed */
#define SONIC_AMDF_FREQ 4000

struct sonicStreamStruct;
typedef struct sonicStreamStruct *sonicStream;

/* For all of the following functions, numChannels is multiplied by numSamples
to determine the actual number of values read or returned. */

/* Create a sonic stream. Return NULL only if we are out of memory and cannot
allocate the stream. Set numChannels to 1 for mono, and 2 for stereo. */
sonicStream sonicCreateStream(int sampleRate, int numChannels);
/* Destroy the sonic stream. */
void sonicDestroyStream(sonicStream stream);
/* Use this to write floating point data to be speed up or down into the stream.
Values must be between -1 and 1. Return 0 if memory realloc failed, otherwise 1 */
int sonicWriteFloatToStream(sonicStream stream, float *samples, int numSamples);
/* Use this to write 16-bit data to be speed up or down into the stream.
Return 0 if memory realloc failed, otherwise 1 */
int sonicWriteShortToStream(sonicStream stream, short *samples, int numSamples);
/* Use this to write 8-bit unsigned data to be speed up or down into the stream.
Return 0 if memory realloc failed, otherwise 1 */
int sonicWriteUnsignedCharToStream(sonicStream stream, unsigned char *samples, int numSamples);
/* Use this to read floating point data out of the stream. Sometimes no data
will be available, and zero is returned, which is not an error condition. */
int sonicReadFloatFromStream(sonicStream stream, float *samples, int maxSamples);
/* Use this to read 16-bit data out of the stream. Sometimes no data will
be available, and zero is returned, which is not an error condition. */
int sonicReadShortFromStream(sonicStream stream, short *samples, int maxSamples);
/* Use this to read 8-bit unsigned data out of the stream. Sometimes no data will
be available, and zero is returned, which is not an error condition. */
int sonicReadUnsignedCharFromStream(sonicStream stream, unsigned char *samples, int maxSamples);
/* Force the sonic stream to generate output using whatever data it currently
has. No extra delay will be added to the output, but flushing in the middle of
words could introduce distortion. */
int sonicFlushStream(sonicStream stream);
/* Return the number of samples in the output buffer */
int sonicSamplesAvailable(sonicStream stream);
/* Get the speed of the stream. */
float sonicGetSpeed(sonicStream stream);
/* Set the speed of the stream. */
void sonicSetSpeed(sonicStream stream, float speed);
/* Get the pitch of the stream. */
float sonicGetPitch(sonicStream stream);
/* Set the pitch of the stream. */
void sonicSetPitch(sonicStream stream, float pitch);
/* Get the scaling factor of the stream. */
float sonicGetVolume(sonicStream stream);
/* Set the scaling factor of the stream. */
void sonicSetVolume(sonicStream stream, float volume);
/* Get the sample rate of the stream. */
int sonicGetSampleRate(sonicStream stream);
/* Get the number of channels. */
int sonicGetNumChannels(sonicStream stream);
/* This is a non-stream oriented interface to just change the speed of a sound
sample. It works in-place on the sample array, so there must be at least
speed*numSamples available space in the array. Returns the new number of samples. */
int sonicChangeFloatSpeed(float *samples, int numSamples, float speed, float pitch,
float volume, int sampleRate, int numChannels);
/* This is a non-stream oriented interface to just change the speed of a sound
sample. It works in-place on the sample array, so there must be at least
speed*numSamples available space in the array. Returns the new number of samples. */
int sonicChangeShortSpeed(short *samples, int numSamples, float speed, float pitch,
float volume, int sampleRate, int numChannels);

#ifdef __cplusplus
}
#endif

+ 2
- 2
src/speak_lib.cpp View File

} }
} }
} }
}
return(EE_OK);
}
return(EE_OK);
} // end of Synthesize } // end of Synthesize


#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED

+ 2
- 2
src/synthdata.cpp View File

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


const char *version_string = "1.44.13 17.Nov.10";
const int version_phdata = 0x014404;
const char *version_string = "1.44.18 03.Dec.10";
const int version_phdata = 0x014415;


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

+ 6
- 0
src/tr_languages.cpp View File



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";
tr->langopts.stress_flags = S_FIRST_PRIMARY;
memcpy(tr->stress_lengths,stress_lengths_nl,sizeof(tr->stress_lengths)); memcpy(tr->stress_lengths,stress_lengths_nl,sizeof(tr->stress_lengths));
} }
break; break;
} }
break; break;


case L('w','o'):
tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.numbers = NUM_AND_UNITS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_SINGLE_STRESS;
break;

case L('z','h'): case L('z','h'):
case L_zhy: case L_zhy:
{ {

+ 2
- 2
src/translate.cpp View File

// dot after a word, with space following, probably an abbreviation // dot after a word, with space following, probably an abbreviation
words[word_count-1].flags |= FLAG_HAS_DOT; words[word_count-1].flags |= FLAG_HAS_DOT;


if(IsSpace(next_in))
c = ' '; // remove the dot if it's followed by a space, so that it's not pronounced
if(IsSpace(next_in) || (next_in == '-'))
c = ' '; // remove the dot if it's followed by a space or hyphen, so that it's not pronounced
} }
} }
else else

+ 5
- 2
src/translate.h View File

#define RULE_CONDITION 5 // followed by condition number (byte) #define RULE_CONDITION 5 // followed by condition number (byte)
#define RULE_GROUP_START 6 #define RULE_GROUP_START 6
#define RULE_GROUP_END 7 #define RULE_GROUP_END 7
#define RULE_LINENUM 8 // next 2 bytes give a line number, for debugging purposes
#define RULE_PRE_ATSTART 8 // as RULE_PRE but also match with 'start of word'
#define RULE_LINENUM 9 // next 2 bytes give a line number, for debugging purposes


#define RULE_SPACE 32 // ascii space #define RULE_SPACE 32 // ascii space
#define RULE_SYLLABLE 9 // @
#define RULE_SYLLABLE 21 // @
#define RULE_STRESSED 10 // & #define RULE_STRESSED 10 // &
#define RULE_DOUBLE 11 // % #define RULE_DOUBLE 11 // %
#define RULE_INC_SCORE 12 // + #define RULE_INC_SCORE 12 // +
#define S_FINAL_NO_2 0x10 #define S_FINAL_NO_2 0x10
#define S_NO_AUTO_2 0x20 #define S_NO_AUTO_2 0x20
#define S_2_TO_HEAVY 0x40 #define S_2_TO_HEAVY 0x40
#define S_FIRST_PRIMARY 0x80
#define S_2_SYL_2 0x1000 #define S_2_SYL_2 0x1000
#define S_INITIAL_2 0x2000 #define S_INITIAL_2 0x2000
#define S_NO_AUTO_DIM 0x10000 #define S_NO_AUTO_DIM 0x10000
// bit4=don't allow secondary stress on last syllable // bit4=don't allow secondary stress on last syllable
// bit5-don't use automatic secondary stress // bit5-don't use automatic secondary stress
// bit6=light syllable followed by heavy, move secondary stress to the heavy syllable. LANG=Finnish // bit6=light syllable followed by heavy, move secondary stress to the heavy syllable. LANG=Finnish
// bit7=if more than one primary stress, make the subsequent primaries to secondary stress
// bit8=stress last syllable if it doesn't end in a vowel // bit8=stress last syllable if it doesn't end in a vowel
// bit9=stress last syllable if it doesn't end in vowel or "s" or "n" LANG=Spanish // bit9=stress last syllable if it doesn't end in vowel or "s" or "n" LANG=Spanish
// bit12= In a 2-syllable word, if one has primary stress then give the other secondary stress // bit12= In a 2-syllable word, if one has primary stress then give the other secondary stress

+ 4
- 3
src/voices.cpp View File

voice->samplerate = 22050; voice->samplerate = 22050;
memset(voice->klattv,0,sizeof(voice->klattv)); memset(voice->klattv,0,sizeof(voice->klattv));


speed.fast_settings[0] = 250;
speed.fast_settings[1] = 600;
speed.fast_settings[2] = 300;
speed.fast_settings[0] = 350;
speed.fast_settings[1] = 800;
speed.fast_settings[2] = 175;


#ifdef PLATFORM_RISCOS #ifdef PLATFORM_RISCOS
voice->roughness = 1; voice->roughness = 1;
static int Read8Numbers(char *data_in,int *data) static int Read8Numbers(char *data_in,int *data)
{//============================================= {//=============================================
// Read 8 integer numbers // Read 8 integer numbers
memset(data, 0, 8+sizeof(int));
return(sscanf(data_in,"%d %d %d %d %d %d %d %d", return(sscanf(data_in,"%d %d %d %d %d %d %d %d",
&data[0],&data[1],&data[2],&data[3],&data[4],&data[5],&data[6],&data[7])); &data[0],&data[1],&data[2],&data[3],&data[4],&data[5],&data[6],&data[7]));
} }

+ 34
- 15
src/wavegen.cpp View File

{//============= {//=============
wcmdq_head = 0; wcmdq_head = 0;
wcmdq_tail = 0; wcmdq_tail = 0;
if(sonicSpeedupStream != NULL)
{
sonicDestroyStream(sonicSpeedupStream);
sonicSpeedupStream = NULL;
}
#ifdef USE_PORTAUDIO #ifdef USE_PORTAUDIO
Pa_AbortStream(pa_stream); Pa_AbortStream(pa_stream);
#endif #endif
fprintf(stderr, "espeak: out of memory\n"); fprintf(stderr, "espeak: out of memory\n");
} }
outbuffer_size = ix; outbuffer_size = ix;
out_ptr = NULL;
}
if(out_ptr == NULL)
{
out_ptr = out_start = outbuffer; out_ptr = out_start = outbuffer;
out_end = out_start + outbuffer_size; out_end = out_start + outbuffer_size;
} }




/* Speed up the audio samples with libsonic. */ /* Speed up the audio samples with libsonic. */
static int SpeedUp(short *outbuf, int length, int end_of_text)
{//===========================================================
if(sonicSpeedupStream != NULL && sonicGetSpeed(sonicSpeedupStream) != sonicSpeed)
{
sonicDestroyStream(sonicSpeedupStream);
sonicSpeedupStream = NULL;
}
if(sonicSpeedupStream == NULL)
static int SpeedUp(short *outbuf, int length_in, int length_out, int end_of_text)
{//==============================================================================
if(length_in >0)
{ {
sonicSpeedupStream = sonicCreateStream(sonicSpeed, 22050);
if(sonicSpeedupStream == NULL)
{
sonicSpeedupStream = sonicCreateStream(22050, 1);
}
if(sonicGetSpeed(sonicSpeedupStream) != sonicSpeed)
{
sonicSetSpeed(sonicSpeedupStream, sonicSpeed);
}
sonicWriteShortToStream(sonicSpeedupStream, outbuf, length_in);
} }


sonicWriteShortToStream(sonicSpeedupStream, outbuf, length);

if(end_of_text) if(end_of_text)
{ {
sonicFlushStream(sonicSpeedupStream); sonicFlushStream(sonicSpeedupStream);
} }
return sonicReadShortFromStream(sonicSpeedupStream, outbuf, length);
return sonicReadShortFromStream(sonicSpeedupStream, outbuf, length_out);
} // end of SpeedUp } // end of SpeedUp




{//============================ {//============================
int finished; int finished;
unsigned char *p_start; unsigned char *p_start;
int length;
int max_length;


p_start = out_ptr; p_start = out_ptr;


// fill_zeros is ignored. It is now done in the portaudio cakkback
// fill_zeros is ignored. It is now done in the portaudio callback
finished = WavegenFill2(0); finished = WavegenFill2(0);


if(sonicSpeed > 1.0 && out_ptr > p_start)
if(sonicSpeed > 1.0)
{ {
out_ptr = p_start + 2*SpeedUp((short *)p_start, (out_ptr-p_start)/2, finished);
max_length = (out_end - p_start);
length = 2*SpeedUp((short *)p_start, (out_ptr-p_start)/2, max_length/2, finished);
out_ptr = p_start + length;

if(length >= max_length)
finished = 0; // there may be more data to flush
} }
return finished; return finished;
} // end of WavegenFill } // end of WavegenFill


Loading…
Cancel
Save