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