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-fd96e6ae7743master
_! 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 |
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 |
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 |
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 |
_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 |
// 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 |
@) 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 | ||||
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 | ||||
@) 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 |
பாம்ப் $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] |
// '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 |
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 |
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 |
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 |
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 |
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 | ||||
phonemetable am base2 | phonemetable am base2 | ||||
include ph_amhari | include ph_amhari | ||||
phonemetable wo base | |||||
include ph_wolof |
# 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 |
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]; | ||||
} | } | ||||
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); |
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: |
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: |
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, |
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; |
} // 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; |
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) | ||||
{ | { |
/* 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; | |||||
} |
/* 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 |
} | } | ||||
} | } | ||||
} | } | ||||
} | |||||
return(EE_OK); | |||||
} | |||||
return(EE_OK); | |||||
} // end of Synthesize | } // end of Synthesize | ||||
#ifdef DEBUG_ENABLED | #ifdef DEBUG_ENABLED |
#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; |
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: | ||||
{ | { |
// 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 |
#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 |
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])); | ||||
} | } |
{//============= | {//============= | ||||
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 | ||||