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
| @@ -67,7 +67,7 @@ _? spWrgsmVlstajn | |||
| _! udRVbstejn | |||
| _- binnesdrai | |||
| __ b'Onsdrai | |||
| & ou | |||
| & Vw | |||
| £ pun? | |||
| € euro | |||
| © kopyrajt | |||
| @@ -127,7 +127,7 @@ _0M3 milij'A:d3 | |||
| _1M4 'e:n||bilij'o:n | |||
| _0M4 bilij'o:n3 | |||
| _0and 3 | |||
| _0and V | |||
| _dpt _k,Vm&: | |||
| // PB a number followed by dot | |||
| @@ -280,7 +280,6 @@ z sEt | |||
| ø W | |||
| // PB English words | |||
| bacon _^_EN | |||
| bondage _^_EN | |||
| volleyball _^_EN | |||
| dj _^_EN | |||
| @@ -303,7 +302,6 @@ coke _^_EN | |||
| cool _^_EN | |||
| couch _^_EN | |||
| cursor _^_EN | |||
| //cowboy _^_EN | |||
| debugger _^_EN | |||
| ensemble _^_FR | |||
| event _^_EN | |||
| @@ -316,12 +314,11 @@ hooligan _^_EN | |||
| interface _^_EN | |||
| image _^_EN | |||
| joke _^_EN | |||
| joystick _^_EN | |||
| laptop _^_EN | |||
| level _^_EN | |||
| login _^_EN | |||
| look _^_EN | |||
| lord _^_EN | |||
| //lord _^_EN | |||
| macho _^_EN | |||
| management _^_EN | |||
| message _^_EN | |||
| @@ -382,7 +379,6 @@ boyle _^_EN $alt | |||
| clarence _^_EN $alt | |||
| cyrus _^_EN | |||
| cia _^_EN $alt | |||
| fbi _^_EN $alt | |||
| fox _^_EN | |||
| jones _^_EN | |||
| larry _^_EN $alt | |||
| @@ -467,69 +463,70 @@ tonnage $alt | |||
| trikotage $alt | |||
| // 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 | |||
| acceptant $alt | |||
| @@ -796,6 +793,7 @@ fiskal $alt | |||
| fluvial $alt | |||
| foderal $alt | |||
| formal $alt | |||
| fokal $alt | |||
| fraktal $alt | |||
| frontal $alt | |||
| frugal $alt | |||
| @@ -893,7 +891,6 @@ mondial $alt | |||
| monumental $alt | |||
| moral $alt | |||
| museal $alt | |||
| musical mju:sik3l $alt | |||
| nasal $alt | |||
| national $alt | |||
| neural $alt | |||
| @@ -2038,6 +2035,22 @@ viborgenser $alt | |||
| vordingborgenser $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 | |||
| abessinien $alt | |||
| abkhasien $alt | |||
| @@ -2332,6 +2345,7 @@ elskerinde $alt | |||
| forfatterinde $alt | |||
| forstanderinde $alt | |||
| fyrstinde $alt | |||
| fristerinde $alt | |||
| gelinde gel'end@ $alt | |||
| gemalinde $alt | |||
| grevinde $alt | |||
| @@ -2765,7 +2779,6 @@ kosmogoni $alt | |||
| kvadrofoni $alt | |||
| litani $alt | |||
| ludomani $alt | |||
| mahogni m&h'oni $alt | |||
| makaroni m&k@r'Vni $alt | |||
| mani $alt | |||
| misogyni $alt | |||
| @@ -2831,6 +2844,7 @@ polygami $alt | |||
| salami sal'&mi $alt | |||
| socionomi $alt | |||
| sodomi $alt | |||
| stomi $alt | |||
| synonymi $alt | |||
| taksonomi $alt | |||
| trakeotomi $alt | |||
| @@ -2997,7 +3011,6 @@ mezzanin $alt | |||
| mokkasin $alt | |||
| morfin $alt | |||
| muezzin $alt | |||
| muffin mVf'en $alt | |||
| musselin $alt | |||
| naftalin $alt | |||
| nankin $alt | |||
| @@ -3638,6 +3651,110 @@ timid $alt | |||
| tyfoid $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 | |||
| abkhasisk $alt | |||
| absolutistisk $alt | |||
| @@ -5318,6 +5435,7 @@ tvivlagtig $alt | |||
| tvivlrådig $alt | |||
| tyvagtig $alt | |||
| tålmodig $alt | |||
| ungdommelig $alt | |||
| vankundig $alt | |||
| vederheftig $alt | |||
| vederhæftig $alt | |||
| @@ -5593,6 +5711,7 @@ skribleri $alt | |||
| skriveri $alt | |||
| skruebrækkeri $alt | |||
| skrædderi $alt | |||
| skyderi $alt | |||
| skulkeri $alt | |||
| skumleri $alt | |||
| skyderi $alt | |||
| @@ -5789,7 +5908,7 @@ augmentere $alt | |||
| auktionere $alt | |||
| auskulter $alt | |||
| autentificer $alt | |||
| autografer $alt | |||
| autografere $alt | |||
| autoklaver $alt | |||
| automatiser $alt | |||
| autonomiser $alt | |||
| @@ -5797,7 +5916,7 @@ autoriser $alt | |||
| avancere $alt | |||
| averter $alt | |||
| bagatelliser $alt | |||
| bajader $alt | |||
| bajadere $alt | |||
| balancere $alt | |||
| balkaniser $alt | |||
| balloter $alt | |||
| @@ -5807,7 +5926,7 @@ bandagere $alt | |||
| banderolere $alt | |||
| barbariser $alt | |||
| barbere $alt | |||
| barder $alt | |||
| bardere $alt | |||
| barrier $alt | |||
| barrikader $alt | |||
| basere $alt | |||
| @@ -6120,6 +6239,7 @@ formaliser $alt | |||
| formatere $alt | |||
| formere $alt | |||
| formuler $alt | |||
| omformuler $alt | |||
| fortificer $alt | |||
| fosfatere $alt | |||
| fosforescer $alt | |||
| @@ -6368,15 +6488,15 @@ karboniser $alt | |||
| karburer $alt | |||
| karesser $alt | |||
| kariker $alt | |||
| karrier $alt | |||
| karriere $alt | |||
| karter $alt | |||
| kartonner $alt | |||
| kaserner $alt | |||
| kasernere $alt | |||
| kassere $alt | |||
| kastrer $alt | |||
| katalogiser $alt | |||
| katalyser $alt | |||
| katapulter $alt | |||
| katapultere $alt | |||
| kategoriser $alt | |||
| katekiser $alt | |||
| katolicer $alt | |||
| @@ -6425,7 +6545,7 @@ kompiler $alt | |||
| komplementer $alt | |||
| kompletter $alt | |||
| komplicer $alt | |||
| komplimenter $alt | |||
| komplimentere $alt | |||
| komponer $alt | |||
| komposter $alt | |||
| komprimer $alt | |||
| @@ -6751,7 +6871,7 @@ persifler $alt | |||
| persister $alt | |||
| personaliser $alt | |||
| personificer $alt | |||
| perspektiver $alt | |||
| perspektivere $alt | |||
| perturber $alt | |||
| perverter $alt | |||
| petitioner $alt | |||
| @@ -6766,7 +6886,7 @@ pivoter $alt | |||
| pizziker $alt | |||
| placer $alt | |||
| plagier $alt | |||
| plakater $alt | |||
| plakatere $alt | |||
| planere $alt | |||
| plastificer $alt | |||
| platiner $alt | |||
| @@ -6879,7 +6999,7 @@ reaktiver $alt | |||
| realiser $alt | |||
| reassumer $alt | |||
| reassurer $alt | |||
| rebeller $alt | |||
| rebellere $alt | |||
| recenser $alt | |||
| recidiver $alt | |||
| recirkuler $alt | |||
| @@ -6890,7 +7010,7 @@ redresser $alt | |||
| reducer $alt | |||
| referer $alt | |||
| reflekter $alt | |||
| reformer $alt | |||
| reformere $alt | |||
| refunder $alt | |||
| refuser $alt | |||
| regaler $alt | |||
| @@ -7117,7 +7237,7 @@ synkretiser $alt | |||
| synkroniser $alt | |||
| syntetiser $alt | |||
| systematiser $alt | |||
| tabeller $alt | |||
| tabellere $alt | |||
| tabuere $alt | |||
| tabuiser $alt | |||
| tabuler $alt | |||
| @@ -7197,12 +7317,13 @@ typiser $alt | |||
| typografer $alt | |||
| tyranniser $alt | |||
| uniformere $alt | |||
| undervurder $alt | |||
| urbaniser $alt | |||
| urger $alt | |||
| uriner $alt | |||
| usurper $alt | |||
| vacciner $alt | |||
| vagabonder $alt | |||
| vagabondere $alt | |||
| valider $alt | |||
| valoriser $alt | |||
| valuter $alt | |||
| @@ -7222,7 +7343,7 @@ vidimer $alt | |||
| vikarier $alt | |||
| vindicer $alt | |||
| viriliser $alt | |||
| visere $alt | |||
| //visere $alt | |||
| visiter $alt | |||
| visualiser $alt | |||
| vitaliser $alt | |||
| @@ -8853,6 +8974,7 @@ automation $alt | |||
| autorisation $alt | |||
| aversion $alt | |||
| ballotation $alt | |||
| baron $alt | |||
| bastion $alt | |||
| benediktion $alt | |||
| billion $alt | |||
| @@ -9599,7 +9721,7 @@ liaison li&s'VN $alt | |||
| meson $alt | |||
| person $alt | |||
| ræson REs'VN $alt | |||
| sæson sEs'VN $alt | |||
| //sæson sEs'VN $alt | |||
| unison $alt | |||
| // PB exceptions from the "be" rule in group "be" | |||
| @@ -10501,6 +10623,7 @@ emulgator $alt | |||
| eskalator $alt | |||
| evaluator $alt | |||
| evaporator $alt | |||
| faktor $alt | |||
| fundator $alt | |||
| generator $alt | |||
| gladiator $alt | |||
| @@ -10553,6 +10676,7 @@ likvidator $alt | |||
| makulator $alt | |||
| manipulator $alt | |||
| multiplikator $alt | |||
| motor $alt | |||
| nomenklator $alt | |||
| observator $alt | |||
| operator $alt | |||
| @@ -10602,6 +10726,40 @@ versifikator $alt | |||
| vibrator $alt | |||
| visitator $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 | |||
| absolut $alt | |||
| @@ -10645,6 +10803,7 @@ arrangør $alt | |||
| assurandør $alt | |||
| auditør $alt | |||
| bankør $alt | |||
| billettør $alt | |||
| causør $alt | |||
| charmør $alt | |||
| chauffør $alt | |||
| @@ -10848,6 +11007,7 @@ sententiøs $alt | |||
| seriøs $alt | |||
| serøs $alt | |||
| skabrøs $alt | |||
| skandaløs $alt | |||
| skarlatinøs $alt | |||
| skrofuløs $alt | |||
| spatiøs $alt | |||
| @@ -11010,15 +11170,6 @@ rejicere rejis'eV // PB should not be pronounced [raje] | |||
| rejicerer rejis'eV // PB | |||
| rejiceres rejis'eVs // 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' | |||
| nogen n'o:@-n // PB | |||
| ligesom lisVm // PB | |||
| @@ -11027,10 +11178,10 @@ konfirmand kVnferm'&nd // PB | |||
| konfirmander kVnferm'&nd3 // PB | |||
| konfirmanderne kVnferm'&nd3-n@ // PB | |||
| konfirmandernes kVnferm'&nd3-n@s // PB | |||
| dollar dVlV // PB | |||
| //dollar dVlV // PB | |||
| giv g'i // 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 | |||
| breakdance brEig'da:ns // PB breakdance | |||
| breakdancen brEig'da:ns@-n // PB breakdancen | |||
| @@ -11064,7 +11215,6 @@ calais kal'E // PB Calais - town in France | |||
| date dejt // PB date - stævnemøde | |||
| siger sir // PB silent d | |||
| (tids nok) tis||n'Vk // PB silent d | |||
| cologne ko'lVN3 // PB | |||
| skateboardet sk'eitbo@d3D // PB | |||
| billie bile // PB the name Billie | |||
| (hole in one) h'oulinw,0n // PB English golf expression used in Danish | |||
| @@ -11103,6 +11253,7 @@ co $abbrev $allcaps // PB for CO2-kvote | |||
| ngo $abbrev | |||
| edb $abbrev | |||
| mri $abbrev | |||
| kfuk $abbrev $allcaps | |||
| wc v'ese // w is pronounces as v in Danish | |||
| (wc'et) v'ese@d | |||
| (wc'er) v'eseV | |||
| @@ -11140,7 +11291,6 @@ hav hAu $atend | |||
| // PB problem with 'sig' [si] = "say" and 'sig' = "himself/herself" [saj] | |||
| (sig mig) si||maj // PB sig mig engang | |||
| (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. | |||
| (gør sig til) g,Wr||saj||t'el // PB | |||
| (gav sig til) g&||saj||tel // PB han gav sig til at ... | |||
| @@ -11187,11 +11337,12 @@ legenderne leg'EndVn3s | |||
| (så længe) sV||l'EN3 | |||
| (så være) sV||v'EV | |||
| (så må) sV||m'O | |||
| (så må sige) s'O||m'O|s'i@ | |||
| (så har) sV||har | |||
| (se så) se||sV | |||
| (så sent) sV||sent | |||
| (ville så) vil3||sV | |||
| så sV $sentence $atstart | |||
| //så sV $sentence $atstart | |||
| (hvad så) v&||sV $atend // "Hvad så?" | |||
| (virkede så) v'irkeD@||sV | |||
| (kom så) kVm||sV | |||
| @@ -53,11 +53,11 @@ p r s S t T v w | |||
| x z | |||
| Dictionary da_dict 2010-10-28 | |||
| Dictionary da_dict 2010-12-02 | |||
| & &# 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 | |||
| dZ f g h j J k l | |||
| @@ -66,7 +66,7 @@ s S t T tS v w x | |||
| z | |||
| Dictionary hu_dict 2010-11-17 | |||
| Dictionary hu_dict 2010-12-02 | |||
| a A a: E e: i i: o | |||
| o: u u: Y y y: Y: | |||
| @@ -74,7 +74,7 @@ o: u u: Y y y: Y: | |||
| - : b c C d dZ dz | |||
| f g h j J k l m | |||
| 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 | |||
| @@ -100,7 +100,7 @@ p Q r R s s; t T | |||
| ts v x z z; | |||
| Dictionary en_dict 2010-11-04 | |||
| Dictionary en_dict 2010-11-18 | |||
| 0 3 3: @ @- @2 @5 @L | |||
| a a# A: A@ aa aI aI@ aU | |||
| @@ -200,7 +200,7 @@ q r r. s S s. t T | |||
| 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 | |||
| I i: o o: u U u2 u: | |||
| @@ -249,7 +249,7 @@ n^# p Q r R r# R2 s | |||
| 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 | |||
| i I o O u | |||
| @@ -325,7 +325,7 @@ k l m n p R s S | |||
| t tS v w x | |||
| Dictionary nl_dict 2010-11-10 | |||
| Dictionary nl_dict 2010-12-03 | |||
| 8 @ @- a A a: A~ E | |||
| E2 e: EI eU i I o O | |||
| @@ -662,3 +662,15 @@ W y | |||
| h j J k l m n p | |||
| Q R s S t tS v w | |||
| 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 | |||
| @@ -1958,7 +1958,7 @@ scaly skeIlI | |||
| salmon sam@n | |||
| scalpel skalp@L | |||
| scared ske@d | |||
| scaring ske@rI2 | |||
| scaring ske@rI2N | |||
| scenic si:nIk | |||
| scald sk0ld | |||
| scepter sEpt3 | |||
| @@ -3660,7 +3660,7 @@ | |||
| r) ogue oUg | |||
| v) ogue oUg | |||
| @@) ogue 0g | |||
| l) o (gy @ | |||
| @l) og (y =@dZ | |||
| oh oU | |||
| o (hA oU | |||
| j) oh (n 0 | |||
| @@ -3786,7 +3786,6 @@ | |||
| at) oll 0l | |||
| w) oll oUl | |||
| olm (_ oUm | |||
| olo (gy '0l@ | |||
| olo (gi '0l@ | |||
| olo (gic @l'0 | |||
| v) olt oUlt | |||
| @@ -4996,7 +4995,7 @@ | |||
| ?8 &f) ully (_ Vl%I | |||
| &) u (lous_ =jU | |||
| b) ul (r Ul | |||
| &ic) ul (t @L | |||
| &ic) ul (t_ @L | |||
| _) ultra (@ ,Ultra | |||
| u (lul V | |||
| @) u (lum =jU | |||
| @@ -9,9 +9,9 @@ _2 kEt:Y: | |||
| _2a ke:t // for 200, 2000 | |||
| _3 ha:R2om | |||
| _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 | |||
| _9 kilEnts | |||
| _10 ti:z | |||
| @@ -240,6 +240,7 @@ _#-ikának a:nAk | |||
| (0-st) nul:a:St | |||
| (1-gyet) EJ:Et | |||
| (1-gyes) EJ:ES | |||
| (2-szer) ke:ts:ER2 | |||
| (2-őt) kEt:Y:t | |||
| (2-őn) kEt:Y:n | |||
| (2-n) kEt:Y:n | |||
| @@ -273,13 +274,14 @@ _#-ikának a:nAk | |||
| (6-tal) hAt:Al | |||
| (6-tól) hAt:o:l | |||
| (6-tól) h'Atodika:to:l $alt2 | |||
| (6-szor) hAts:oR2 | |||
| (7-től) he:t:Y:l | |||
| (7-től) hEtEdike:tY:l $alt2 | |||
| (7-tel) he:t:El | |||
| (7-el) he:t:El | |||
| (7-sekre) hEtESEkR2E | |||
| (7-sel) hEtES:El | |||
| (7-szer) he:ts:ER2 | |||
| (8-cal) n^olts:Al | |||
| (8-al) n^olts:Al | |||
| (9-el) kilEnts:El | |||
| @@ -292,6 +294,7 @@ _20e hus | |||
| (10-t) tizEt | |||
| //special number exceptions | |||
| (10-el) ti:zzEl | |||
| (20-al) hu:s:Al | |||
| @@ -413,6 +416,7 @@ _?? kAR2AktEr||ko:d // unknown characters (change this) | |||
| // Abbreviations | |||
| ADSL a:de:ESEl $allcaps //Internet connection type, we pronouns this with ádéesel | |||
| ÁFAa:fA $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. | |||
| cm tsEntime:tER2 | |||
| @@ -430,6 +434,7 @@ MLSZ EmElEs $allcaps | |||
| ORTT $abbrev $allcaps | |||
| ORFK oEREfka: $abbrev $allcaps | |||
| MÁV ma:v $allcaps | |||
| LMP ElEmpe: $allcaps | |||
| MTI $abbrev $allcaps | |||
| mm milime:tER2 | |||
| RAM R2Am $allcaps //Espeak normaly spokening this abbreviation with erraem, but this is not good | |||
| @@ -537,6 +542,7 @@ elé $unstressend | |||
| előtt $alt $alt3 $unstressend | |||
| este $alt3 | |||
| estéjén $alt3 | |||
| éjszakára $alt3 | |||
| mögül $unstressend // behind | |||
| mögött $unstressend | |||
| mögé $unstressend | |||
| @@ -568,6 +574,7 @@ nekem $unstressend | |||
| közül $unstressend | |||
| közé $unstressend | |||
| között $u $alt3 | |||
| idén $alt3 | |||
| környékén $alt3 | |||
| an $u // so many persons | |||
| as $u | |||
| @@ -634,7 +641,13 @@ csütörtökig $alt3 | |||
| péntekig $alt3 | |||
| szombatig $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 | |||
| kevés $unstressend // few | |||
| se $unstressend // neither | |||
| @@ -1209,6 +1222,12 @@ járni $unstressend | |||
| döntöttek $unstressend | |||
| írt $unstressend | |||
| méltó $unstressend | |||
| dől $unstressend | |||
| nyomsz $unstressend | |||
| elnök $unstressend | |||
| itthon $unstressend | |||
| otthon $unstressend | |||
| köszönhető $unstressend | |||
| // word pairs | |||
| @@ -1344,7 +1363,7 @@ _– gondolAtjEl | |||
| _— kviR2tmi:nus | |||
| _" ide:zY:jEl | |||
| _( b'Alza:R2o:jEl $max3 | |||
| _) j'obbza:R2o:jEl $max3 | |||
| _) j'obza:R2o:jEl $max3 | |||
| _[ n^'ito:sYglEtES $max3 | |||
| _] z'a:R2o:sYglEtES $max3 | |||
| _{ k'EzdY:kAptSoS $max3 | |||
| @@ -1407,6 +1426,7 @@ nato na:to: | |||
| $textmode | |||
| MSZP emeszpé | |||
| MSZMP emeszempé | |||
| SZDSZ eszdéesz | |||
| @@ -1466,5 +1486,6 @@ CD-m) cédém | |||
| (NVDA-t) envédéát | |||
| (NVDA-tól) envédéától | |||
| (NVDA-val) envédéával | |||
| (%-kal) százalékkal | |||
| (ÁFÁ-t) áfát | |||
| (MB-al) megabájttal | |||
| @@ -149,6 +149,8 @@ _0Z3 mill'ezimi // 1000ths | |||
| // abbreviations | |||
| (http ://) 'ak:at,i:t,i:p'i:_ | |||
| www 'vu'vu'vu | |||
| avv avvocato $text $hasdot | |||
| // articles | |||
| i $u $only | |||
| @@ -27,7 +27,7 @@ | |||
| @) a (ggine_ 'a | |||
| _) ae (r aI | |||
| @) ano (_ %ano //ByFilo | |||
| // @) a (no_ =a //ByFilo, this seems to make it_listx longer | |||
| @) avano (_S5 'avano | |||
| a (tterA_ 'a | |||
| @@ -778,8 +778,33 @@ libel $2 | |||
| mirabel $3 | |||
| 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 | |||
| // with stress on the previous syllable | |||
| // with stress on the previous syllable, | |||
| // also words ending in er. etc. | |||
| beter $alt | |||
| // adjectives | |||
| edel $alt | |||
| enkel $alt | |||
| @@ -1211,8 +1236,10 @@ actiepunt Aksip8nt | |||
| agenda $2 | |||
| amino $1 | |||
| amnestie $3 | |||
| bijziend $2 // bijziendheid | |||
| boudoir budv#'a:r | |||
| bourgondier burx'o:ndi:@r | |||
| braille brAj@ | |||
| circuit sIrku'i | |||
| chalet Sa:lE | |||
| champagne SAmp'An^@ | |||
| @@ -1225,18 +1252,24 @@ chat tSEt | |||
| check tSEk | |||
| chiffon Sif'On | |||
| contour ko:nt'ur | |||
| divers div'Ers | |||
| dynastie $3 | |||
| eensgelijks e:nsQ@l'EIks | |||
| emaille ,e:m'Aij@ | |||
| eucharistie $4 | |||
| inductie $2 | |||
| ingewikkeld $3 | |||
| ingrijpend $2 | |||
| ingeval $3 | |||
| ingevolge $3 | |||
| ingrediënt $4 | |||
| ingenieur Inzj@nj'Y:r | |||
| informatie $3 | |||
| journaal Surn'a:l | |||
| maxima $1 | |||
| meteen mEt'e:n | |||
| minima $1 | |||
| nabij nab'EI | |||
| ongastvrij OnQAstv@-*'EI | |||
| ongelooflijk $3 | |||
| ongemakkelijk $3 | |||
| @@ -1257,6 +1290,7 @@ tegenstrijdig $3 | |||
| tegenwoordig $3 | |||
| travestie $3 | |||
| verderop $3 | |||
| volledig $2 | |||
| waarschijnlijk $2 | |||
| @@ -17,13 +17,17 @@ | |||
| @) abel (_ 'a:bE2l | |||
| @) abele (_ 'a:b@l@ | |||
| _) af (C@P2 'Af | |||
| age (_ 'a:Z@ | |||
| age (_N 'a:Z@ | |||
| ages (_S1 s | |||
| age (_$w_alt a:Q@ | |||
| aire (_ 'E:r | |||
| air (_ 'Er | |||
| @) agne (_ 'An^@ | |||
| ale (_ 'a:l@ | |||
| @) ant (_ 'Ant | |||
| @) ant (e_ 'Ant | |||
| @) ant (en_ 'Ant | |||
| @) ant (er_ 'Ant | |||
| @) a (de_ 'a: | |||
| @) a (ta_ 'a: | |||
| @@ -37,6 +41,7 @@ | |||
| &) baar (_ =ba:r | |||
| _) be (@P2 b@ | |||
| _) b (ee+ b | |||
| _) bei (de bEI | |||
| _) be (ren bI: | |||
| _) be (rm bE | |||
| _) be (stia bE | |||
| @@ -47,6 +52,7 @@ | |||
| _) bezig be:z@x | |||
| _) beu bY: | |||
| _) bij (C@P3 b'EI | |||
| _) brand br'And | |||
| _) bureau byr'o: | |||
| _) buurt (@@P5 b'yrt // buurtbewoner | |||
| @@ -88,6 +94,8 @@ | |||
| ciële S'e:l@ | |||
| coach ko:tS | |||
| _) congres kOnQr'Es | |||
| .group d | |||
| d d // auto-devoice at end-of-word | |||
| @@ -98,7 +106,7 @@ | |||
| .group e | |||
| e e: | |||
| &C) e (_S1q @ | |||
| &C) e (_S1qd @ | |||
| e (_ @ | |||
| e (CK E | |||
| e (x E | |||
| @@ -110,6 +118,7 @@ | |||
| eeuw eU | |||
| eu Y: | |||
| ea (_ 'e:a: | |||
| eau o: //words with French origin | |||
| @) ee (_ 'e: | |||
| @) ee (X_ 'e: | |||
| @@ -131,18 +140,33 @@ | |||
| &) el (den_$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 | |||
| &) en (_S2qd @n | |||
| &) ens (_S3q @ns | |||
| &) end (_ @nd | |||
| &) ende (_ @nd@ | |||
| @) ent (_ 'Ent | |||
| @) ent (e_ 'Ent | |||
| @) ent (en_ 'Ent | |||
| @) ent (er_ 'Ent | |||
| &) er (_ @r | |||
| &) ere (_ @r@ | |||
| &) er (en_$p_alt @r // where 'eren' is not a verb ending | |||
| eren (_ 'I:r@n | |||
| &) es (_ @s | |||
| @) etten (_S3 @n | |||
| eum (_$w_alt 'e:8m | |||
| @mus) eum (_ ,e:8m // compounds | |||
| @) eur (_ 'Y:r | |||
| &) e (nB@ E2 | |||
| @@ -152,6 +176,9 @@ | |||
| @) e (raar_ @ | |||
| &) e (rC@ E2 | |||
| c) e (ntrum E // not @ | |||
| _) expositie Ekspo:z'itsi | |||
| .group f | |||
| @@ -166,12 +193,15 @@ | |||
| _) ge (@P2 Q@ | |||
| _) gee Qe: | |||
| gener (aal Q,e:n@r | |||
| gelijk Q@lEIk | |||
| _) gelijk Q@lEIk | |||
| _) ge (rC QE | |||
| _) geu QY: | |||
| _) ge (ven Qe: | |||
| _) ge (ver Qe: | |||
| _) ge (ving Qe: | |||
| ge (sprek Q@ // in compounds | |||
| .group h | |||
| h h | |||
| @@ -179,6 +209,7 @@ | |||
| _) her (@P3 hEr | |||
| _) her (en hI:r | |||
| &) heid (_S4 hEIt | |||
| .group i | |||
| @@ -199,9 +230,12 @@ | |||
| &) ica (_ =ika: | |||
| &) ico (_ =iko: | |||
| ie (X 'i | |||
| ie (ren_ 'i | |||
| ie (rd_ 'i | |||
| @) ig (_S2dq @x | |||
| @) ige (_ @Q@ | |||
| ij (_ 'EI | |||
| ij (e_ 'EI | |||
| @) ij (n_ 'EI | |||
| &) ika (_ =ika: | |||
| &) iko (_ =iko: | |||
| @@ -240,8 +274,10 @@ | |||
| m m | |||
| m) m | |||
| mail me:Il | |||
| management ma:nIdZm@nt | |||
| _) mee (@P3 m'e: | |||
| menu (_ m@ny | |||
| .group n | |||
| @@ -271,8 +307,9 @@ | |||
| @@C) o (_ =o: | |||
| oe (X_ 'u | |||
| oir (_ 'v#a:r | |||
| pr) o (gram o: | |||
| oo (X 'o: | |||
| telef) oo (n 'o: | |||
| oon 'o:n // in compounds, eg. telefoongesprek | |||
| _) op (@@P2 'Op | |||
| _) open (@P4 'o:p@n | |||
| _) op (era 'o:p | |||
| @@ -327,7 +364,9 @@ | |||
| r r | |||
| A) r (A r | |||
| C) r (A r | |||
| rr *r | |||
| rr *r | |||
| route rut@ // route(s) | |||
| .group re | |||
| _) re (geren r@ | |||
| @@ -356,6 +395,7 @@ | |||
| @) ssi (o S | |||
| _) standaard (@P9 st'Anda:rt | |||
| _vre) s (e s | |||
| .group t | |||
| @@ -388,7 +428,7 @@ | |||
| .group te | |||
| _) tegen (P5 t'e:Q@n | |||
| _) terug (P5 t@r'8x | |||
| _) te (gelijk t@ | |||
| _) te (gelijkP2 t@ | |||
| _) te (gemoetP2 t@ | |||
| _) te (goed t@ | |||
| _) te (hui t@ // tehuis | |||
| @@ -437,6 +477,8 @@ | |||
| w (CK w | |||
| _) weg (@P3 v#'Ex | |||
| _) weg (en v#e:Q | |||
| _) weg (e_ v#e:Q // bewegelijk | |||
| .group x | |||
| @@ -227,7 +227,6 @@ tamil தமிழ் $text | |||
| பாம்ப் $alt | |||
| பீராமண $alt | |||
| பால்ய $alt | |||
| பலு $alt | |||
| பில் $alt | |||
| பந்த் $alt | |||
| பில்லி $alt | |||
| @@ -254,8 +253,6 @@ tamil தமிழ் $text | |||
| பீர் $alt | |||
| போயிங் $alt | |||
| பலத்தாலான $alt | |||
| பெஞ்ச் $alt | |||
| பெஞ்சு $alt | |||
| பார $alt | |||
| பாமா $alt | |||
| பென்ஸ் $alt | |||
| @@ -279,6 +276,15 @@ tamil தமிழ் $text | |||
| பிஸி $alt | |||
| பேஷ் $alt | |||
| பாவே $alt | |||
| பாலு $alt | |||
| பீடி $alt | |||
| பிசி $alt | |||
| போன்சாய் $alt | |||
| போன்ஸாய் $alt | |||
| பீப் bi:p | |||
| ப்யூனஸ் $alt | |||
| பவுத்த $alt | |||
| பவுத்தம் $alt | |||
| (பி . ஏ) bije: | |||
| @@ -332,6 +338,8 @@ tamil தமிழ் $text | |||
| தொப்புனு $alt | |||
| தருமம் $alt | |||
| தாவே $alt | |||
| தருமமும் $alt | |||
| தராவி $alt | |||
| // initial ட | |||
| @@ -353,6 +361,7 @@ tamil தமிழ் $text | |||
| டிக் t.ik | |||
| ரெட்டி red.d.i | |||
| செல்லம் $alt | |||
| சிக்கன் $alt | |||
| கக $alt // initial க as [g] | |||
| @@ -52,6 +52,8 @@ | |||
| // 'a' 'e' 'i' | |||
| .L03 இ எ அ | |||
| // alternative 's' characters | |||
| .L04 ச ஸ | |||
| // consonants | |||
| @@ -133,12 +135,26 @@ | |||
| க (ாரர k | |||
| _) க (ிடுகிடு g | |||
| _) க (ின்னென்ற g | |||
| _) கி (ரக g | |||
| _) கி (ரகண g | |||
| _) கி (ரந்த g | |||
| _) கி (ரவுண்ட g | |||
| _) கி (ரஹ g | |||
| _) கி (ராக்கி g | |||
| _) கி (ராதக k | |||
| _) கி (ராம g | |||
| _) க (ிரிஜா g | |||
| _) க (ிரிதர g | |||
| _) கி (ரீட k | |||
| _) கி (ரீன்லாந்த g | |||
| _) கி (ரீம k | |||
| _) க (ிருகஸ்தர g | |||
| _) க (ிருஹஸ்தர g | |||
| _) கி (ரேக்க g | |||
| _) கி (ரைண்டர g | |||
| _) கி (ரௌண்ட g | |||
| _) கி (ளாஸ g | |||
| _) கி (ளினிக் k | |||
| _) க (ீதல k | |||
| _) க (ீத்த k | |||
| _) க (ுகநாத g | |||
| @@ -186,6 +202,7 @@ | |||
| _) க (ுருதேவ g | |||
| _) க (ுருநா g | |||
| _) க (ுருபூஜை g | |||
| _) க (ுருப்பெயர g | |||
| _) க (ுருமார g | |||
| _) க (ுருரா g | |||
| _) க (ுருவா g | |||
| @@ -196,6 +213,7 @@ | |||
| _) க (ுருவுடை g | |||
| _) க (ுருவை g | |||
| _) க (ுருவோட g | |||
| _) க (ுறட்டை g | |||
| _) கு (வாலியர g | |||
| _) க (ூகிள g | |||
| _) க (ூகுள g | |||
| @@ -215,6 +233,7 @@ | |||
| _) க (ேட்டைத் g | |||
| _) க (ேட்டைப் g | |||
| _) க (ேலி g | |||
| _) க (ொறட்ட g | |||
| _) கோக (ிலா go:k | |||
| _) க (ோகுல g | |||
| _) க (ோதாவரி g | |||
| @@ -253,12 +272,14 @@ | |||
| _) க (ௌ g | |||
| _) கௌட (ில்ய kaUt. | |||
| _) க (ௌட்டில்ய k | |||
| _) க (ௌவ k | |||
| _) க் (ரவுண்ட g | |||
| _) க் (ரூப g | |||
| _) க் (ரௌண்ட g | |||
| _) க் (வாலியர g | |||
| //endsort | |||
| //sort | |||
| _மை) க kV# | |||
| அலை) க (டல kV | |||
| சமையல்) க (ட் kV | |||
| உச்ச) க (ட்ட kV | |||
| @@ -304,6 +325,7 @@ | |||
| _தென்) க (ாசி k | |||
| _நேர்) க (ாணல k | |||
| _கண்) க (ாணா k | |||
| விவே) க (ானந்த k | |||
| _வலை) க (ாப் k | |||
| தொல்) க (ாப்பி k | |||
| மூல) க (ாரண k | |||
| @@ -316,27 +338,14 @@ | |||
| _ம) க (ிந்த H | |||
| மோ) க (ினி H | |||
| _ம) க (ிமை H | |||
| _) கி (ரக g | |||
| _) கி (ரகண g | |||
| கி (ரண g | |||
| பொற்) கி (ரண g | |||
| _) கி (ரந்த g | |||
| _) கி (ரஹ g | |||
| _) கி (ராக்கி g | |||
| _) கி (ராதக k | |||
| _) கி (ராம g | |||
| _) கி (ரீட k | |||
| _) கி (ரீன்லாந்த g | |||
| ஐஸ்) கி (ரீம k | |||
| ங்) க (ிரு g | |||
| கிரு (ஷ் kri | |||
| _) கி (ரைண்டர g | |||
| _) கி (ரௌண்ட g | |||
| இங்) கி (லீஷ் g | |||
| கி (லேச k | |||
| அங்) க (ிள k | |||
| _) கி (ளாஸ g | |||
| _) கி (ளினிக் k | |||
| _வட) க (ிழ k | |||
| தென்) க (ிழ k | |||
| _பா) க (ிஸ்தான k | |||
| @@ -379,6 +388,7 @@ | |||
| வீண்) க (ோப k | |||
| _நாகர்) க (ோயில k | |||
| _ட) க் k | |||
| _மை) க் k | |||
| _ஷா) க் (_ k | |||
| துர்) க்க ggV# | |||
| மார்) க்க ggV# | |||
| @@ -396,6 +406,8 @@ | |||
| அயோ) க்க (ிய gg | |||
| ஆரோ) க்க (ிய gg | |||
| வைரா) க்க (ிய gg | |||
| அநு) க்கி (ர gg | |||
| அனு) க்கி (ர gg | |||
| L03) க்கி (ரக gg // a,i | |||
| _வி) க்க (ிரக gg | |||
| சத்தியா) க்கி (ரக gg | |||
| @@ -406,6 +418,7 @@ | |||
| _மு) க்க (ுண gg | |||
| அணு) க்க (ுண்ட gg | |||
| ஜன) க்க (ும்பல gg | |||
| _வி) க்ச (னரி ks.V | |||
| _பி) க்ச (ர ktSV | |||
| _மெ) க்சிக (ோ ksik | |||
| க்ட kt.V# // English words | |||
| @@ -468,11 +481,15 @@ | |||
| ச (ந்தர tSV | |||
| _) ச (ந்தர்ப sV | |||
| ச (ந்திர tSV | |||
| _ஹட்) ச (ன sV | |||
| _வாட்) ச (ன sV | |||
| _) ச (ப்பாத்தி tSV | |||
| _) சரசு (வதி sVrVs | |||
| _) சர்ச (ி tSVrtS | |||
| மருதா) ச (ல tSV | |||
| வேதா) ச (ல tSV | |||
| _சேஷா) ச (ல tSV | |||
| _தணிகா) ச (ல tSV | |||
| அருணா) ச (ல tSV | |||
| _) ச (ாணக்கிய tS | |||
| ச (ாந்தி s. | |||
| @@ -488,8 +505,11 @@ | |||
| ராஜோப) ச (ார tS | |||
| _) ச (ார்ஜை tS | |||
| _) ச (ார்ஜ்_ tS | |||
| _) ச (ார்லஸ tS | |||
| _) ச (ாளுக்கிய tS | |||
| _) சிக (ாகோ tSik | |||
| _) ச (ிக்கனு tS | |||
| _) ச (ிக்கனை tS | |||
| _) சிக் (மங்களூர tSik | |||
| _) சிக் (லெட் tSik | |||
| _) ச (ிட்டாக tS | |||
| @@ -504,6 +524,7 @@ | |||
| _) ச (ித்திர tS | |||
| வி) ச (ித்திர tS | |||
| _) ச (ித்திரவதை tS | |||
| _) ச (ித்தூர tS | |||
| _) ச (ித்ரவதை tS | |||
| _) ச (ித்ரா tS | |||
| சு) சித (்ரா tSit | |||
| @@ -544,12 +565,14 @@ | |||
| _) ச (ெல்லக்குட்டி tS | |||
| _) ச (ெல்லத்துக்கு tS | |||
| _) ச (ெல்லத்தை tS | |||
| _) ச (ெல்லப்ப tS | |||
| _) ச (ெல்லமா tS | |||
| _) ச (ெஸ் tS | |||
| _) ச (ேனல tS | |||
| _) ச (ேரி tS | |||
| _) ச (ேலஞ் tS | |||
| _) ச (ைனாவ tS | |||
| _) ச (ைனீஸ tS | |||
| _) ச (ௌதரி tS | |||
| //endsort | |||
| @@ -578,6 +601,8 @@ | |||
| //sort | |||
| அர்ஜண்) ட t.V# | |||
| அர்ஜெண்) ட t.V# | |||
| _மில்) ட (ன t.V | |||
| _) ட (ன் t.V | |||
| ிங்) ட (ன் t.V // -ington | |||
| @@ -596,6 +621,7 @@ | |||
| _) ட (ாக்க t. // talkies | |||
| _) டாக்ட (ர d.a:kt.V | |||
| _) டாக (்ஸி t.a:k | |||
| _) டாங்க (ர t.a:NkV | |||
| _) டாங்க (ி t.a:Nk | |||
| _) டாட (ா t.a:t. | |||
| அண்) டார்டிக t.a:rt.ikV# | |||
| @@ -605,6 +631,7 @@ | |||
| _போர்) ட (ிகோ t. | |||
| ஆர்) டிக் t.ik | |||
| _) ட (ிக்க t. | |||
| _) டின்க (ரிங் t.inkV | |||
| _) டி (யூசன t. | |||
| _) டி (யூஷன t. | |||
| _) டி (ரங்கு t. | |||
| @@ -615,21 +642,26 @@ | |||
| _) டிராபிக் t.ra:fik | |||
| _) ட (ிராம t. | |||
| கொலஸ்) டி (ரால _|t. | |||
| _) டி (ராலி t. | |||
| _) டி (ராவல t. | |||
| _) டி (ராவெல t. | |||
| _) டி (ரெயின t. | |||
| _) டி (ரெய்லர t. | |||
| _) டி (ரெஸ d. | |||
| _) டிரேயின (ை t.re:jn | |||
| _) டி (ரைவர d. | |||
| கண்) டி (ரோல t. | |||
| _) ட (ிவிய t. | |||
| _) ட (ெக்ஸாஸ t. | |||
| _) டென்டுல்க (ர t.ent.UlkV | |||
| _) ட (ென்ஷன t. | |||
| _) டெம்ப (ர t.empV | |||
| _) டெம்ப (ோ t.emp | |||
| டெலிப (ோன t.elif | |||
| _) ட (ெலிவிஷன t. | |||
| _) ட (ெல்_அவீவ t. // tel aviv | |||
| _) டெஸ்ட t.est.V# | |||
| _) டேங்க (ர t.e:NkV | |||
| _) ட (ேப t. | |||
| _) ட (ேஸ்ட t. | |||
| _) டைட (ில t.aIt. | |||
| @@ -637,6 +669,7 @@ | |||
| _) ட (ைம்_ t. | |||
| _) ட (ோக்கன t. | |||
| _) ட (ோக்கியோ t. | |||
| _) டோரண்ட (ோ t.o:rVn.t. | |||
| _ல) ட்ட d.d.V# | |||
| _ரெ) ட்ட (ியா d.d. | |||
| இ) ட்ட (ிலி d.d. | |||
| @@ -645,12 +678,16 @@ | |||
| _) ட்ராஃபிக் t.ra:fik | |||
| _) ட (்ரான்சிஸ்டர t. | |||
| _) ட்ராபிக் t.ra:fik | |||
| _) ட் (ராலி t. | |||
| _) ட் (ராவல t. | |||
| _) ட் (ராவெல t. | |||
| _) ட்ரெயி (லர t.rej | |||
| _) ட் (ரெய்லர t. | |||
| _பெ) ட் (ரோ t. | |||
| கண்) ட் (ரோல t. | |||
| _வீ) ட் (ல t. | |||
| _ஹி) ட் (லர t. | |||
| அ) ட்லாண்ட t.la:n.t.V# // atlant | |||
| //endsort | |||
| @@ -739,12 +776,14 @@ | |||
| _) த (யாள dV | |||
| _) த (யை dV | |||
| _) த (ரணி dV | |||
| _) த (ராவிய dV | |||
| _) த (ரிசனங் dV | |||
| _) த (ரிசனத் dV | |||
| _) த (ரிசி dV | |||
| _) த (ரித்திரம dV | |||
| _) த (ருமத் dV | |||
| _) த (ருமன dV | |||
| _) தருமப (ுரி dVrUmVp | |||
| _) த (ருமர dV | |||
| _) த (ருமி dV | |||
| _) த (ர்க dV | |||
| @@ -770,11 +809,13 @@ | |||
| _) த (ானத் d | |||
| _) த (ானமா d | |||
| _) த (ானிய d | |||
| _) த (ானியங்கி t | |||
| _) த (ானுவ d | |||
| _) த (ாமோதர d | |||
| _) த (ாம்_தூம d | |||
| _) த (ாயாதி d | |||
| _) த (ாரணி d | |||
| _) த (ாராசுர d | |||
| _) த (ாராபுர d | |||
| _) த (ாராள d | |||
| _) த (ாராவி d | |||
| @@ -852,6 +893,7 @@ | |||
| _) த (ுச்சாதனன d | |||
| _) த (ுட்ட d | |||
| _) த (ுபாய d | |||
| _) த (ுப்பட்டா d | |||
| _) த (ுரதிருஷ்ட d | |||
| _) த (ுரதிர்ஷ்ட d | |||
| _) த (ுரதிஷ்ட d | |||
| @@ -896,6 +938,7 @@ | |||
| _) த (ேவருலக d | |||
| _) த (ேவர்க d | |||
| _) த (ேவலோக d | |||
| _) த (ேவஸ்தான d | |||
| _) த (ேவாதி d | |||
| _) த (ேவாமிருத d | |||
| _) த (ேவாம்ச d | |||
| @@ -920,6 +963,7 @@ | |||
| _ப) த (ஞ்சலி tV | |||
| _கீழ்) த (ட்ட tV | |||
| _மேல்) த (ட்ட tV | |||
| பிள்ளை) த (ன tV | |||
| முட்டாள்) த (ன tV | |||
| _கௌ) த (மி tV | |||
| _கீ) த (ா t | |||
| @@ -967,6 +1011,7 @@ _பார்வ) த (ி t | |||
| பு) த்த (ர ddV | |||
| _விரு) த்தாச (ல dda:tSV | |||
| அ) த்த (ாசி dd | |||
| _சி) த்தாந்த dda:ntV# | |||
| சி) த்த (ார் dd | |||
| பு) த்த (ி dd | |||
| அயோ) த்த (ி dd | |||
| @@ -995,6 +1040,7 @@ _பார்வ) த (ி t | |||
| வி) த்து (வான d | |||
| _முக) த்து (வார dd | |||
| அ) த்த (ெய்வ dd | |||
| L03) த்த (ெய்வ dd | |||
| குல) த்த (ெய்வ dd | |||
| உ) த்த (ேச dd | |||
| L03) த்த (ேச dd // a, e, i | |||
| @@ -1068,6 +1114,7 @@ _பார்வ) த (ி t | |||
| _) ப (ங்களா bV | |||
| _) ப (ங்கார bV | |||
| _) ப (சவகல்யாண bV | |||
| _) ப (ச்சன bV | |||
| _) ப (ஜ bV | |||
| _) ப (ட்சண bV | |||
| _) ப (ட்சிக்க bV | |||
| @@ -1101,11 +1148,14 @@ _பார்வ) த (ி t | |||
| _) ப (யப் bV | |||
| _) ப (யம bV | |||
| _) ப (யாலஜி bV | |||
| _) பயாஸ்கோப் bVja:sko:p | |||
| _) ப (யில்வான bV | |||
| _) ப (ரதநாட்டிய bV | |||
| _) ப (ரதன bV | |||
| _) ப (ரதர bV | |||
| _) ப (ராக்_ஒபாமா bV | |||
| _) ப (ரோட bV | |||
| _) ப (ர்கர bV | |||
| _) ப (ர்னாலா bV | |||
| _) ப (ர்மா bV | |||
| _) ப (ர்லாங் fV | |||
| @@ -1127,19 +1177,24 @@ _பார்வ) த (ி t | |||
| _) ப (லவீன bV | |||
| _) ப (லஹீன bV | |||
| _) பலாத்க (ார bVla:dk | |||
| _) ப (லிகடா bV | |||
| _) ப (லிக்கடா bV | |||
| _) ப (லிக்குச் bV | |||
| _) ப (லிக்கொ bV | |||
| _) ப (லிஜா bV | |||
| _) ப (லிபீட bV | |||
| _) ப (லிய bV | |||
| _) பலுச (ிஸ்தான bVlUtS | |||
| _) ப (லூன bV | |||
| _) ப (ல்கேரிய bV | |||
| _) பல்ட (ி bVlt. | |||
| _) ப (ல்பு bV | |||
| _) ப (ல்பை bV | |||
| _) ப (ளு bV | |||
| _) ப (வாணி bV | |||
| _) ப (வானி bV | |||
| _) பவுண்ட (ன faUn.t.V | |||
| _) ப (வுத்தத்தில bV | |||
| _) ப (வ்ய bV | |||
| _) ப (ஸ bV | |||
| _) ப (ஹதூர bV | |||
| @@ -1195,6 +1250,7 @@ _பார்வ) த (ி t | |||
| _) ப (ாரம b | |||
| _) ப (ாரம்பரிய p | |||
| _) ப (ாரிஸ்டர b | |||
| _) ப (ார்L04லோனா b | |||
| _) ப (ார்கவி b | |||
| _) ப (ார்ம f | |||
| _) ப (ாலக b | |||
| @@ -1202,6 +1258,7 @@ _பார்வ) த (ி t | |||
| _) ப (ாலக்காட p | |||
| _) ப (ாலச b | |||
| _) ப (ாலதண் b | |||
| _) பாலப (ாட ba:lVp | |||
| _) ப (ாலமுர b | |||
| _) ப (ாலாஜி b | |||
| _) ப (ாலாபிஷேக p | |||
| @@ -1209,9 +1266,10 @@ _பார்வ) த (ி t | |||
| _) ப (ாலாவ b | |||
| _) ப (ாலின் p | |||
| _) ப (ாலியத்த b | |||
| _) ப (ாலு b | |||
| _) ப (ாலிவுட் b | |||
| _) ப (ாலுடன் p | |||
| _) ப (ாலும்_ p | |||
| _) ப (ாலுவ b | |||
| _) ப (ாலை p | |||
| _) ப (ால் p | |||
| _) ப (ால்_தாக்கரே b | |||
| @@ -1231,7 +1289,9 @@ _முகத்தின்_) ப (ாவ b | |||
| முகத்திலிருந்து_) ப (ாவ b | |||
| _) ப (ாவனா b | |||
| _) ப (ாவனை b | |||
| _) ப (ாவிக்கப்பட b | |||
| _) ப (ாவிக்கிற b | |||
| _) ப (ாவிக்கும்போத b | |||
| _) ப (ாவித்த b | |||
| _) ப (ாவிப்பத b | |||
| _) ப (ாவிப்பதா b | |||
| @@ -1245,16 +1305,19 @@ _முகத்தின்_) ப (ாவ b | |||
| _) ப (ாஸ்மதி b | |||
| _) பி(ராந்தியு b | |||
| _) ப (ி_._பி_._சி b // b.b.c | |||
| _) ப (ிகர f | |||
| _) ப (ிக்கு b | |||
| _) ப (ிக்ஷு b | |||
| _) ப (ிக்ஷூ b | |||
| _) ப (ிங்கர்_ f | |||
| _) ப (ிசினஸ b | |||
| _) ப (ிசிய b | |||
| _) ப (ினாமி b | |||
| _) ப (ினிஷ f | |||
| _) ப (ின்லாந்த f | |||
| _) ப (ிபிசி b // bbc | |||
| _) ப (ிம்ப b | |||
| _) பி (யூனஸ்_ b | |||
| _) ப (ிரகதீ b | |||
| _) பி (ரகதீ b | |||
| _) பி (ரகலாதன p | |||
| @@ -1333,6 +1396,7 @@ _முகத்தின்_) ப (ாவ b | |||
| _) பி (ராப் p | |||
| _) பி (ராமண b | |||
| _) பி (ராமணன b | |||
| _) பி (ராமி b | |||
| _) பி (ராமிக் b | |||
| _) பி (ராமின்_ b | |||
| _) பி (ரார்தன p | |||
| @@ -1346,6 +1410,7 @@ _முகத்தின்_) ப (ாவ b | |||
| _) பி (ரிட b | |||
| _) ப (ிரித்தானி b | |||
| _) பி (ரித்தானி b | |||
| _) பிரின்சிப (ால prinsip | |||
| _) பி (ரியன p | |||
| _) பி (ரியப் p | |||
| _) பி (ரியம p | |||
| @@ -1386,15 +1451,20 @@ _முகத்தின்_) ப (ாவ b | |||
| _) ப (ீச்சு b | |||
| _) ப (ீஜ b | |||
| _) ப (ீஜிங b | |||
| _) ப (ீடி b | |||
| _) ப (ீடிகள b | |||
| _) ப (ீடிகை p | |||
| _) ப (ீடித்த p | |||
| _) ப (ீடிப்புகை b | |||
| _) ப (ீடிய b | |||
| _) பீட்ரூட் bi:t.ru:t. | |||
| _) ப (ீப்பொலி b | |||
| _) ப (ீம b | |||
| _) ப (ீரங்கி b | |||
| _) பீ (ராமண b | |||
| _) ப (ீராமணர b | |||
| _) ப (ீரை b | |||
| _) ப (ீரோ b | |||
| _) ப (ீர்பால b | |||
| _) ப (ீஹார b | |||
| _) ப (ுக்கில b | |||
| _) ப (ுக்கென்ற b | |||
| @@ -1440,11 +1510,12 @@ _முகத்தின்_) ப (ாவ b | |||
| _) ப (ூமி b | |||
| _) ப (ூலோக b | |||
| _) ப (ெங்களூர b | |||
| _) ப (ெங்கால b | |||
| _) பெஞ்ச bentSV# | |||
| _) ப (ெஞ்சமின b | |||
| _) ப (ெஞ்சா b | |||
| _) ப (ெஞ்சி b | |||
| _) பெட்ட (ுக்கு bed.d. | |||
| _) ப (ெட்ரூம b | |||
| _) ப (ெப்ரவரி f | |||
| _) ப (ெர்னார்ட b | |||
| _) ப (ெர்முடா b | |||
| _) ப (ெர்லிங b | |||
| @@ -1476,6 +1547,7 @@ _முகத்தின்_) ப (ாவ b | |||
| _) ப (ோதித் b | |||
| _) ப (ோதை b | |||
| _) ப (ோனிய b | |||
| _) ப (ோன்கள f | |||
| _) ப (ோன்ஸ்லே b | |||
| _) ப (ோபால b | |||
| _) ப (ோர்ஜரி f | |||
| @@ -1549,6 +1621,7 @@ _சந்திர_) ப (ோஸ b | |||
| _க) ப (த் bV | |||
| வீர) ப (த்தினி pV | |||
| உ) ப (ந்நியாச pV | |||
| _லிஸ்) ப (ன bV | |||
| கல்) ப (னா pV | |||
| _கம்) ப (னி pV | |||
| பிரதா) ப (ம bV | |||
| @@ -1563,15 +1636,21 @@ _சந்திர_) ப (ோஸ b | |||
| வீர) ப (ராக்கிரம pV | |||
| கரம்) ப (ற் pV | |||
| ப (ற்றி_ pV | |||
| _பக்கப்) ப (ல bV | |||
| படைப்) ப (ல bV | |||
| ஆயுதப்) ப (ல bV | |||
| _மகா) ப (லி bV | |||
| _மூடு) ப (ல்லக் pV | |||
| வேலைப்) ப (ளு bV | |||
| வட) ப (ழ pV | |||
| வீண்) ப (ழி pV | |||
| _வா) ப (ஸ pV | |||
| _தீ) ப (ா p | |||
| _கலி) ப (ா f | |||
| _கலீ) ப (ா f | |||
| _சம) ப (ாக b | |||
| முதற்) ப (ாக b | |||
| உதிரிப்) ப (ாக b | |||
| _பிக்) ப (ாக்க+ p | |||
| உ) ப (ாசனை p | |||
| சமன்) ப (ாட p | |||
| @@ -1581,6 +1660,7 @@ _சந்திர_) ப (ோஸ b | |||
| ராம) ப (ாண b // also இராமபாண | |||
| _யாழ்) ப (ாண p | |||
| தண்ட) ப (ாணி p | |||
| பஞ்ச) ப (ாண்ட p | |||
| ப (ாண்டி p | |||
| ப (ாதை p | |||
| ஜிந்தா) ப (ாத் b | |||
| @@ -1588,8 +1668,10 @@ _சந்திர_) ப (ோஸ b | |||
| _டீ) ப (ாய் p | |||
| எதிர்) ப (ார p | |||
| கண்) ப (ார்வை p | |||
| _ப்ரின்சி) ப (ால p | |||
| _சிவ) ப (ாலன b | |||
| _கா) ப (ாலி b | |||
| _டி) பால்ட fa:lt.V# | |||
| _நே) ப (ாள p | |||
| _பூ) ப (ாளம்_ p | |||
| _ராஜ) ப (ாளைய p | |||
| @@ -1602,7 +1684,9 @@ _சந்திர_) ப (ோஸ b | |||
| வாதா) ப (ி p | |||
| கோ) ப (ி p | |||
| சித்தப்) பி(ரமை b | |||
| _கன்) ப (ிகர f | |||
| _பசி) ப (ிக் f | |||
| கண்டு) ப (ிடி p | |||
| திமிர்) ப (ிடி p | |||
| ராவல்) ப (ிண்டி p | |||
| ர்) ப (ின்_ b | |||
| @@ -1610,9 +1694,12 @@ _சந்திர_) ப (ோஸ b | |||
| ம்) ப (ின்_ b | |||
| _முன்) ப (ின்_ p | |||
| @) ப (ின்நாலும்_ p | |||
| @) ப (ின்னர்_ p | |||
| @) ப (ின்னால்_ p | |||
| _) ப (ிப்ரவரி f | |||
| _லெஸ்) ப (ியன b | |||
| பிரக (ாஷ prVk | |||
| மதப்) பிரச (ார prVtS | |||
| பி (ரத p | |||
| வீண்) பி (ரமை b | |||
| துஷ்) பி (ரயோக p | |||
| @@ -1633,7 +1720,10 @@ _சந்திர_) ப (ோஸ b | |||
| _திம்) ப (ு p | |||
| _அன்) ப (ுட b | |||
| _மார்) ப (ுட b | |||
| வாயு) ப (ுத்திர p | |||
| அக்னி) ப (ுத்திர p | |||
| பாடலி) ப (ுத்திர p | |||
| அக்கினி) ப (ுத்திர p | |||
| வில்லி) ப (ுத்தூர p | |||
| ம்) ப (ுரா b | |||
| _தர்ம) ப (ுரி p | |||
| @@ -1647,10 +1737,12 @@ _சந்திர_) ப (ோஸ b | |||
| இன்ஸ்) ப (ெக்டர p | |||
| இளம்) ப (ெண் p | |||
| _கம்) ப (ெனி p | |||
| புலம்) ப (ெயர் p | |||
| இடம்) ப (ெயர p | |||
| _புலம்) ப (ெயர p | |||
| மொழி) ப (ெயர் p | |||
| ப (ெருமான p | |||
| ப (ெற p // ?? end-of-word + suffix ?? | |||
| _க) ப (ே f | |||
| _கை) ப (ேசி p | |||
| _செல்) ப (ேசி p | |||
| அலை) ப (ேசி p | |||
| @@ -1659,6 +1751,8 @@ _சந்திர_) ப (ோஸ b | |||
| _வெல்) ப (ேர f | |||
| ப (ேரில்_ p | |||
| ப (ேர்_ p | |||
| _பழம்) ப (ொருள p | |||
| _தொல்) ப (ொருள p | |||
| வன்) ப (ொருள் p | |||
| மென்) ப (ொருள் p | |||
| வீண்) ப (ொழுத p | |||
| @@ -1685,9 +1779,11 @@ _சந்திர_) ப (ோஸ b | |||
| ப (ோதே_+ p | |||
| ஐ) ப (ோன f | |||
| _செல்) ப (ோன f | |||
| மைக்ரோ) ப (ோன f | |||
| ப (ோன_ p | |||
| ப (ோனா p | |||
| ப (ோன்ற+ p // ?? end-of-word + suffix ?? | |||
| ப (ோயிரு p | |||
| ப (ோய் p | |||
| கலி) ப (ோர்னிய f | |||
| ப (ோல_ p | |||
| @@ -1696,6 +1792,7 @@ _சந்திர_) ப (ோஸ b | |||
| ப (ோலத்_ p | |||
| ப (ோலப்_ p | |||
| ப (ோலவே_ p | |||
| ப (ோலும்_ p | |||
| ப (ோல்_+ p | |||
| ப (ோவத p | |||
| _கம்) ப (ோஸ p | |||
| @@ -1726,6 +1823,7 @@ _சந்திர_) ப (ோஸ b | |||
| _ல) ப்ப (ை bb | |||
| துர்) ப்ப (ோதனை bb | |||
| கம்) ப்யூட (ர pjU:t.V | |||
| _மா) ப் (ள p | |||
| //endsort | |||
| // If ப+ appearing in the middle of a word is followed by ட+ | |||
| @@ -1751,6 +1849,9 @@ _சந்திர_) ப (ோஸ b | |||
| பாப (K pa:pV | |||
| பப (ா pVp | |||
| பாப (ா pa:p | |||
| _) பாப (ம pa:bV | |||
| _) பாப (த் pa:bV | |||
| _) பாப (ங் pa:bV | |||
| // த) ப (K pV | |||
| தா) ப (K pV | |||
| // த) ப (ா p | |||
| @@ -1814,6 +1915,8 @@ _சந்திர_) ப (ோஸ b | |||
| ல lV | |||
| ல (B l | |||
| _செய) ல்ப RpV# | |||
| .group ள | |||
| ள l.V | |||
| @@ -1888,10 +1991,15 @@ _சந்திர_) ப (ோஸ b | |||
| இ (ராவுத்த | |||
| இ (ராஷ்டிர | |||
| இ (லகுவாக | |||
| இ (லட்சங் | |||
| இ (லட்சண | |||
| இ (லட்சத் | |||
| இ (லட்சம | |||
| இ (லட்சா | |||
| இ (லட்சிய | |||
| இ (லண்டன | |||
| இ (லவங்க | |||
| இ (லாப | |||
| இ (லேச | |||
| //endsort | |||
| @@ -1958,6 +2066,7 @@ _சந்திர_) ப (ோஸ b | |||
| ௌ aU | |||
| _த) ௌி el.i // for bad scanning | |||
| வ) ௌி el.i | |||
| ் // virama | |||
| @@ -1,4 +1,4 @@ | |||
| 67 phoneme tables | |||
| 68 phoneme tables | |||
| new total | |||
| base 107 107 | |||
| consonants 9 115 | |||
| @@ -21,7 +21,7 @@ consonants 9 115 | |||
| fr-ca 11 140 | |||
| hi 59 150 | |||
| ta 21 153 | |||
| hu 24 121 | |||
| hu 25 122 | |||
| lv 29 125 | |||
| nl 25 126 | |||
| pl 22 120 | |||
| @@ -67,6 +67,7 @@ consonants 9 115 | |||
| az 10 127 | |||
| ak 8 109 | |||
| am 8 123 | |||
| wo 18 118 | |||
| Data file Used by | |||
| b/b [b] base | |||
| @@ -345,7 +346,7 @@ l/l_ [l] base | |||
| [l/] fr | |||
| l/l_@ [l/3] base | |||
| [l/] fr | |||
| l/l@ [h}] base | |||
| l/l@ [há] base | |||
| [l#] base | |||
| [l] fr | |||
| [l/2] fr | |||
| @@ -378,14 +379,14 @@ l/L2_oL [l/2] base | |||
| l/L2_uL [l/2] base | |||
| l/l_3 [l/] de | |||
| l/l_4 [ll] sq | |||
| l/la [h}] base | |||
| l/la [há] base | |||
| [l#] base | |||
| [l] fr | |||
| [l/2] fr | |||
| [K] nso | |||
| l/l_a [l/3] base | |||
| [l/] fr | |||
| l/le [h}] base | |||
| l/le [há] base | |||
| [l#] base | |||
| [l] fr | |||
| [l/2] fr | |||
| @@ -396,7 +397,7 @@ l/L_eL_af [&] af | |||
| [&:] af | |||
| l/l_front [L] sq | |||
| l/l_front_ [l/4] sq | |||
| l/li [h}] base | |||
| l/li [há] base | |||
| [l#] base | |||
| [l] fr | |||
| [l/2] fr | |||
| @@ -409,7 +410,7 @@ ll/ll [L] bg | |||
| ll/_ll [L] bg | |||
| l/l_long [l] base | |||
| [l] fr | |||
| l/lo [h}] base | |||
| l/lo [há] base | |||
| [l#] base | |||
| [l] fr | |||
| [l/2] fr | |||
| @@ -417,7 +418,7 @@ l/lo [h}] base | |||
| l/l_o [l/3] base | |||
| [l/] fr | |||
| l^/l_rfx [l.] base | |||
| l/lu [h}] base | |||
| l/lu [há] base | |||
| [l#] base | |||
| [l] fr | |||
| [l/2] fr | |||
| @@ -738,6 +739,7 @@ ustop/k_unasp [k] base | |||
| [k] sq | |||
| ustop/k_unasp_ [k] zh | |||
| ustop/null [?] base | |||
| [t2] hu | |||
| ustop/p [p] base | |||
| [p2] fr | |||
| [p] zhy | |||
| @@ -1217,6 +1219,8 @@ vowel/@ [@] base | |||
| [@] hy | |||
| [@] ml | |||
| [@] sl | |||
| [@] wo | |||
| [@:] wo | |||
| vowel/@- [@-] base | |||
| [r*] hr | |||
| vowel/& [a] en-rp | |||
| @@ -1301,6 +1305,7 @@ vowel/a# [a] base2 | |||
| [&] sr | |||
| [a#] rw | |||
| [a/] rw | |||
| [a] wo | |||
| vowel/a_2 [a] base2 | |||
| [a] en-wi | |||
| [A:] en-wi | |||
| @@ -1314,6 +1319,7 @@ vowel/a_2 [a] base2 | |||
| [a] da | |||
| [a] rw | |||
| vowel/a#_2 [A] nl | |||
| [a:] nl | |||
| [a#] pl | |||
| [&] hr | |||
| [a] sv | |||
| @@ -1364,6 +1370,7 @@ vowel/a_5 [a:] ta | |||
| [a:] ml | |||
| vowel/a_6 [a] ca | |||
| [a:] vi | |||
| [a:] wo | |||
| vowel/a_7 [a] en | |||
| [a] fr | |||
| [a] ht | |||
| @@ -1437,6 +1444,8 @@ vowel/e [e] base | |||
| [e:] ml | |||
| [e] ne | |||
| [e] sl | |||
| [e] wo | |||
| [e:] wo | |||
| vowel/e# [I] en-sc | |||
| vowel/e_2 [eI] en-sc | |||
| [e:] de | |||
| @@ -1483,6 +1492,8 @@ vowel/ee_3 [&] af | |||
| vowel/ee_4 [E] sq | |||
| vowel/ee_5 [E] en | |||
| [E] ak | |||
| [E] wo | |||
| [E:] wo | |||
| vowel/ee_6 [&] sk | |||
| [E3] sv | |||
| [E] ku | |||
| @@ -1564,6 +1575,7 @@ vowel/i [i] base | |||
| [i] nso | |||
| [i] ak | |||
| [i] am | |||
| [i:] wo | |||
| vowel/i# [y:] cy | |||
| vowel/i_2 [i2] de | |||
| [i:] de | |||
| @@ -1652,6 +1664,7 @@ vowel/ii_6 [I] en-wm | |||
| [i/] pt | |||
| [i] is | |||
| [I] sq | |||
| [i] wo | |||
| vowel/ii_en [i] en | |||
| [i] sq | |||
| vowel/ii_final [i] en-us | |||
| @@ -1698,6 +1711,8 @@ vowel/o [o] base2 | |||
| [o:] pa | |||
| [o] sl | |||
| [o] ak | |||
| [o] wo | |||
| [o:] wo | |||
| vowel/o_2 [o:] cy | |||
| [o:] hi | |||
| [o:] hu | |||
| @@ -1749,6 +1764,8 @@ vowel/oo [o] base | |||
| [O] id | |||
| [o] prs | |||
| [o] bg | |||
| [O] wo | |||
| [O:] wo | |||
| vowel/oo_1 [O:] en-n | |||
| [O:] en-rp | |||
| [O@] en-rp | |||
| @@ -1812,6 +1829,7 @@ vowel/u [u] base | |||
| [u:] ml | |||
| [u] prs | |||
| [u] ak | |||
| [u:] wo | |||
| vowel/u# [u:] en-sc | |||
| [Y] tr | |||
| vowel/u_2 [u1] fi | |||
| @@ -1823,6 +1841,7 @@ vowel/u_2 [u1] fi | |||
| [u] sl | |||
| [u] bg | |||
| [u] am | |||
| [u] wo | |||
| vowel/u#_2 [u-] sv | |||
| vowel/u#_3 [U] ta | |||
| [U:] ta | |||
| @@ -26,6 +26,7 @@ volume 32 | |||
| 0 N NULL 0 n | |||
| 0 C NULL 0 x | |||
| 0 s2 NULL 0 s | |||
| 0 t2 NULL 0 t | |||
| // map English phonemes to Hungarian | |||
| @@ -78,7 +78,11 @@ phoneme a: | |||
| vowel starttype #a endtype #a | |||
| length 210 | |||
| IF thisPh(isUnstressed) THEN | |||
| FMT(vowel/a#_4) | |||
| IF thisPh(isWordEnd) THEN | |||
| FMT(vowel/a#_2) | |||
| ELSE | |||
| FMT(vowel/a#_4) | |||
| ENDIF | |||
| ENDIF | |||
| FMT(vowel/a) | |||
| endphoneme | |||
| @@ -123,6 +123,18 @@ phoneme t // dental variant of /t/ | |||
| 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 | |||
| vcd dnt stop | |||
| voicingswitch t | |||
| @@ -66,14 +66,14 @@ endphoneme | |||
| phoneme o | |||
| vowel starttype #o endtype #o | |||
| length 160 | |||
| length 130 | |||
| FMT(vowel/o) | |||
| endphoneme | |||
| phoneme o: | |||
| vowel starttype #o endtype #o | |||
| length 280 | |||
| length 300 | |||
| FMT(vowel/o) | |||
| endphoneme | |||
| @@ -1840,3 +1840,6 @@ include ph_akan | |||
| phonemetable am base2 | |||
| include ph_amhari | |||
| phonemetable wo base | |||
| include ph_wolof | |||
| @@ -109,6 +109,10 @@ SOURCE=.\src\klatt.cpp | |||
| # End Source File | |||
| # Begin Source File | |||
| SOURCE=.\src\sonic.cpp | |||
| # End Source File | |||
| # Begin Source File | |||
| SOURCE=.\src\numbers.cpp | |||
| # End Source File | |||
| # Begin Source File | |||
| @@ -174,6 +178,10 @@ SOURCE=.\src\klatt.h | |||
| # End Source File | |||
| # Begin Source File | |||
| SOURCE=.\src\sonic.h | |||
| # End Source File | |||
| # Begin Source File | |||
| SOURCE=.\src\phoneme.h | |||
| # End Source File | |||
| # Begin Source File | |||
| @@ -208,14 +208,15 @@ char *DecodeRule(const char *group_chars, int group_length, char *rule, int cont | |||
| int flags; | |||
| int suffix_char; | |||
| int condition_num=0; | |||
| int at_start = 0; | |||
| const char *name; | |||
| char buf[60]; | |||
| char buf_pre[60]; | |||
| char suffix[20]; | |||
| 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'}; | |||
| @@ -241,6 +242,8 @@ char *DecodeRule(const char *group_chars, int group_length, char *rule, int cont | |||
| case RULE_PHONEMES: | |||
| finished=1; | |||
| break; | |||
| case RULE_PRE_ATSTART: | |||
| at_start = 1; // drop through to next case | |||
| case RULE_PRE: | |||
| match_type = RULE_PRE; | |||
| *p = 0; | |||
| @@ -342,8 +345,10 @@ char *DecodeRule(const char *group_chars, int group_length, char *rule, int cont | |||
| sprintf(p,"?%d ",condition_num); | |||
| 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) | |||
| *p++ = buf_pre[ix]; | |||
| *p++ = ')'; | |||
| @@ -1158,6 +1163,7 @@ static char *compile_rule(char *input) | |||
| char *prule; | |||
| int len; | |||
| int len_name; | |||
| int start; | |||
| int state=2; | |||
| int finish=0; | |||
| int pre_bracket=0; | |||
| @@ -1308,9 +1314,21 @@ static char *compile_rule(char *input) | |||
| } | |||
| 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 | |||
| for(ix = strlen(rule_pre)-1; ix>=0; ix--) | |||
| for(ix = strlen(rule_pre)-1; ix>=start; ix--) | |||
| output[len++] = rule_pre[ix]; | |||
| } | |||
| @@ -1090,6 +1090,7 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, | |||
| int done; | |||
| int stressflags; | |||
| int dflags = 0; | |||
| int first_primary; | |||
| signed char vowel_stress[N_WORD_PHONEMES/2]; | |||
| char syllable_weight[N_WORD_PHONEMES/2]; | |||
| @@ -1433,6 +1434,7 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, | |||
| } | |||
| done = 0; | |||
| first_primary = 0; | |||
| for(v=1; v<vowel_count; v++) | |||
| { | |||
| if(vowel_stress[v] < 0) | |||
| @@ -1469,6 +1471,18 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, | |||
| 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)) | |||
| @@ -1737,7 +1751,6 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
| int failed; | |||
| int unpron_ignore; | |||
| int consumed; /* number of letters consumed from input */ | |||
| int count; /* count through rules in the group */ | |||
| int syllable_count; | |||
| int vowel; | |||
| int letter_group; | |||
| @@ -1747,6 +1760,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
| int n_bytes; | |||
| int add_points; | |||
| int command; | |||
| int check_atstart; | |||
| MatchRecord match; | |||
| static MatchRecord best; | |||
| @@ -1769,7 +1783,6 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
| total_consumed = 0; | |||
| count = 0; | |||
| common_phonemes = NULL; | |||
| match_type = 0; | |||
| @@ -1787,7 +1800,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
| letter = 0; | |||
| distance_right= -6; /* used to reduce points for matches further away the current letter */ | |||
| distance_left= -2; | |||
| count++; | |||
| check_atstart = 0; | |||
| match.points = 1; | |||
| match.end_type = 0; | |||
| @@ -1827,17 +1840,24 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
| rule--; // so we are still pointing at the 0 | |||
| failed=2; // matched OK | |||
| 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: | |||
| match_type = RULE_PRE; | |||
| if(word_flags & FLAG_UNPRON_TEST) | |||
| { | |||
| // checking the start of the word for unpronouncable character sequences, only | |||
| // 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; | |||
| case RULE_POST: | |||
| match_type = RULE_POST; | |||
| break; | |||
| @@ -2306,31 +2326,34 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
| match.points += add_points; | |||
| } | |||
| 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 */ | |||
| @@ -3313,6 +3336,10 @@ int LookupDictList(Translator *tr, char **wordptr, char *ph_out, unsigned int *f | |||
| fprintf(f_trans,"Replace: %s %s\n",word,*wordptr); | |||
| } | |||
| } | |||
| else | |||
| { | |||
| flags[0] &= ~FLAG_SKIPWORDS; | |||
| } | |||
| ph_out[0] = 0; | |||
| return(0); | |||
| @@ -232,7 +232,6 @@ BEGIN_EVENT_TABLE(MyFrame, wxMDIParentFrame) | |||
| EVT_MENU(MENU_LEXICON_BG, MyFrame::OnTools) | |||
| EVT_MENU(MENU_LEXICON_DE, 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_TO_UTF8, MyFrame::OnTools) | |||
| EVT_MENU(MENU_COUNT_WORDS, MyFrame::OnTools) | |||
| @@ -610,7 +609,6 @@ void MyFrame::OnTools(wxCommandEvent& event) | |||
| case MENU_LEXICON_BG: | |||
| case MENU_LEXICON_DE: | |||
| case MENU_LEXICON_IT: | |||
| case MENU_LEXICON_IT2: | |||
| case MENU_LEXICON_TEST: | |||
| CompareLexicon(event.GetId()); // Compare a lexicon with _rules translation | |||
| break; | |||
| @@ -699,6 +697,7 @@ void MyFrame::OnSpeak(wxCommandEvent& event) | |||
| break; | |||
| case MENU_SPEAK_FILE: | |||
| out_ptr = NULL; | |||
| transldlg->SpeakFile(); | |||
| break; | |||
| @@ -707,11 +706,14 @@ void MyFrame::OnSpeak(wxCommandEvent& event) | |||
| break; | |||
| case MENU_SPEAK_PAUSE: | |||
| out_ptr = NULL; | |||
| SpeakNextClause(NULL,NULL,3); | |||
| if(SynthStatus() & 2) | |||
| speak_menu->SetLabel(MENU_SPEAK_PAUSE,_T("&Resume")); | |||
| else | |||
| { | |||
| speak_menu->SetLabel(MENU_SPEAK_PAUSE,_T("&Pause")); | |||
| } | |||
| break; | |||
| case MENU_SPEAK_VOICE: | |||
| @@ -289,11 +289,14 @@ static void DecodePhonemes2(const char *inptr, char *outptr) | |||
| 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 matched=0; | |||
| int ix; | |||
| int c; | |||
| char *p; | |||
| char *p, *p2; | |||
| int len; | |||
| int vowel_ix; | |||
| int stress_posn1; | |||
| @@ -305,8 +308,11 @@ void Lexicon_It(int pass) | |||
| FILE *f_out; | |||
| FILE *f_listx; | |||
| FILE *f_list_in = NULL; | |||
| int listx_count; | |||
| long int displ; | |||
| const char *alt_string; | |||
| wxString str; | |||
| static wxString fname_lex; | |||
| char buf[200]; | |||
| char word[80]; | |||
| char word1[80]; | |||
| @@ -315,7 +321,10 @@ void Lexicon_It(int pass) | |||
| char temp[80]; | |||
| char phonemes[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 *vowels2 = "aeou"; | |||
| @@ -333,31 +342,42 @@ void Lexicon_It(int pass) | |||
| 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) | |||
| { | |||
| wxLogError(_T("Can't read file ")+fname); | |||
| wxLogError(_T("Can't read file ")+fname_lex); | |||
| 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; | |||
| } | |||
| listx_count = 0; | |||
| last_listx[0] = 0; | |||
| if(pass == 1) | |||
| { | |||
| sprintf(buf,"%s/it_listx",path_dsource); | |||
| remove(buf); | |||
| CompileDictionary(path_dsource,"it",NULL,NULL,0); | |||
| f_listx = fopen(buf,"w"); | |||
| wxLogStatus(_T("Pass 1")); | |||
| } | |||
| else | |||
| { | |||
| CompileDictionary(path_dsource,"it",NULL,NULL,0); | |||
| sprintf(buf,"%s/it_listx2",path_dsource); | |||
| f_listx = fopen(buf,"w"); | |||
| sprintf(buf,"%s/it_listx",path_dsource); | |||
| @@ -390,9 +410,9 @@ void Lexicon_It(int pass) | |||
| continue; | |||
| 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 | |||
| sprintf(buf_out,"%s\t%s",word,temp); | |||
| sprintf(buf_error,"%s\t%s",word,temp); | |||
| sprintf(word1," %s ",word); | |||
| @@ -550,22 +570,37 @@ void Lexicon_It(int pass) | |||
| sscanf(buf, "%s", word1); | |||
| 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 | |||
| 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; | |||
| } | |||
| 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); | |||
| } | |||
| } | |||
| } | |||
| @@ -574,7 +609,26 @@ void Lexicon_It(int pass) | |||
| } | |||
| 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); | |||
| } | |||
| } | |||
| } | |||
| @@ -582,15 +636,32 @@ void Lexicon_It(int pass) | |||
| { | |||
| 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_in); | |||
| fclose(f_out); | |||
| 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() | |||
| @@ -760,7 +831,7 @@ void Lexicon_De() | |||
| fclose(f_in); | |||
| fclose(f_out); | |||
| wxLogStatus(_T("Completed, equal=%d different=%d"),matched,count-matched); | |||
| } | |||
| } // end of Lexicon_De | |||
| extern int IsVowel(Translator *tr, int letter); | |||
| @@ -1340,8 +1411,6 @@ void CompareLexicon(int id) | |||
| break; | |||
| case MENU_LEXICON_IT: | |||
| Lexicon_It(1); | |||
| break; | |||
| case MENU_LEXICON_IT2: | |||
| Lexicon_It(2); | |||
| break; | |||
| case MENU_LEXICON_TEST: | |||
| @@ -160,7 +160,6 @@ enum { | |||
| MENU_LEXICON_BG, | |||
| MENU_LEXICON_DE, | |||
| MENU_LEXICON_IT, | |||
| MENU_LEXICON_IT2, | |||
| MENU_LEXICON_TEST, | |||
| MENU_TO_UTF8, | |||
| MENU_COUNT_WORDS, | |||
| @@ -127,7 +127,6 @@ wxMenuBar *MakeMenu(int type, const char *dict_name) | |||
| lexicon_menu->Append(MENU_LEXICON_BG, _("Bulgarian")); | |||
| lexicon_menu->Append(MENU_LEXICON_DE, _("German")); | |||
| lexicon_menu->Append(MENU_LEXICON_IT, _("Italian")); | |||
| lexicon_menu->Append(MENU_LEXICON_IT2, _("Italian, pass 2")); | |||
| // lexicon_menu->Append(MENU_LEXICON_TEST, _("Test")); | |||
| tools_menu = new wxMenu; | |||
| @@ -808,14 +808,18 @@ if((tr->prev_dict_flags & FLAG_ALT_TRANS) && ((c2 == 0) || (wtab[0].flags & FLAG | |||
| } // 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 | |||
| if((word[0] == 'a') || (word[0] == 'e')) | |||
| { | |||
| if((word[1] == ' ') || (word[1] == 'z') || ((word[1] == 't') && (word[2] == 't'))) | |||
| return(0); | |||
| if(((thousandplex==1) || ((value % 1000) == 0)) && (word[1] == 'l')) | |||
| return(0); // 1000-el | |||
| return(1); | |||
| } | |||
| return(0); | |||
| @@ -927,7 +931,7 @@ int TranslateRoman(Translator *tr, char *word, char *ph_out, WORD_TAB *wtab) | |||
| { | |||
| 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 | |||
| num_control |= 1; | |||
| @@ -1111,7 +1115,6 @@ static int LookupNum2(Translator *tr, int value, int control, char *ph_out) | |||
| char ph_tens[50]; | |||
| char ph_digits[50]; | |||
| char ph_and[12]; | |||
| char ph_ord_suffix[20]; | |||
| units = value % 10; | |||
| tens = value / 10; | |||
| @@ -1214,8 +1217,7 @@ static int LookupNum2(Translator *tr, int value, int control, char *ph_out) | |||
| if((units != 0) && (tr->langopts.numbers2 & NUM2_MULTIPLE_ORDINAL)) | |||
| { | |||
| // 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); | |||
| } | |||
| } | |||
| } | |||
| @@ -1368,7 +1370,6 @@ static int LookupNum3(Translator *tr, int value, char *ph_out, int suppress_null | |||
| char ph_thousands[50]; | |||
| char ph_hundred_and[12]; | |||
| char ph_thousand_and[12]; | |||
| char ph_ord_suffix[20]; | |||
| ordinal = control & 0x22; | |||
| hundreds = value / 100; | |||
| @@ -1447,8 +1448,7 @@ static int LookupNum3(Translator *tr, int value, char *ph_out, int suppress_null | |||
| { | |||
| // Use ordinal form of hundreds, as well as for tens and units | |||
| // Add ordinal suffix to the hundreds | |||
| Lookup(tr, "_ord", ph_ord_suffix); | |||
| strcat(ph_digits, ph_ord_suffix); | |||
| strcat(ph_digits, ph_ordinal2); | |||
| } | |||
| } | |||
| @@ -1557,6 +1557,7 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned | |||
| int thousands_inc = 0; | |||
| int prev_thousands = 0; | |||
| int ordinal = 0; | |||
| int dot_ordinal; | |||
| int this_value; | |||
| int decimal_count; | |||
| int max_decimal_count; | |||
| @@ -1611,7 +1612,8 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned | |||
| if(prev_thousands || (word[0] != '0')) | |||
| { | |||
| // 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)) | |||
| @@ -1730,7 +1732,7 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned | |||
| 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 | |||
| 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 | |||
| } | |||
| @@ -1790,9 +1792,11 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned | |||
| n_digit_lookup = 2; | |||
| } | |||
| } | |||
| // if((buf_digit_lookup[0] == 0) && (*p != '0') && (dot_ordinal==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 | |||
| { | |||
| n_digit_lookup = 1; | |||
| @@ -140,7 +140,6 @@ void SetSpeed(int control) | |||
| int s1; | |||
| int wpm; | |||
| int wpm2; | |||
| double wpm_inc; | |||
| speed.loud_consonants = 0; | |||
| speed.min_sample_len = 450; | |||
| @@ -154,18 +153,17 @@ void SetSpeed(int control) | |||
| // fast_settings[0] wpm where speedup starts | |||
| // fast_settings[1] wpm for maximum espeak speed | |||
| // fast_settings[2] maximum espeak speed | |||
| sonicSpeed = 1.0; | |||
| if(wpm > speed.fast_settings[0]) | |||
| { | |||
| 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 | |||
| if(wpm > 1000) | |||
| { | |||
| @@ -0,0 +1,967 @@ | |||
| /* 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; | |||
| } | |||
| @@ -0,0 +1,138 @@ | |||
| /* 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 | |||
| @@ -528,8 +528,8 @@ static espeak_ERROR Synthesize(unsigned int unique_identifier, const void *text, | |||
| } | |||
| } | |||
| } | |||
| } | |||
| return(EE_OK); | |||
| } | |||
| return(EE_OK); | |||
| } // end of Synthesize | |||
| #ifdef DEBUG_ENABLED | |||
| @@ -35,8 +35,8 @@ | |||
| #include "translate.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; | |||
| FILE *f_logespeak = NULL; | |||
| @@ -915,6 +915,7 @@ SetLengthMods(tr,3); // all equal | |||
| 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.stress_flags = S_FIRST_PRIMARY; | |||
| memcpy(tr->stress_lengths,stress_lengths_nl,sizeof(tr->stress_lengths)); | |||
| } | |||
| break; | |||
| @@ -1211,6 +1212,11 @@ SetLengthMods(tr,3); // all equal | |||
| } | |||
| 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_zhy: | |||
| { | |||
| @@ -2779,8 +2779,8 @@ if((c == '/') && (tr->langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(pre | |||
| // dot after a word, with space following, probably an abbreviation | |||
| 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 | |||
| @@ -145,10 +145,11 @@ | |||
| #define RULE_CONDITION 5 // followed by condition number (byte) | |||
| #define RULE_GROUP_START 6 | |||
| #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_SYLLABLE 9 // @ | |||
| #define RULE_SYLLABLE 21 // @ | |||
| #define RULE_STRESSED 10 // & | |||
| #define RULE_DOUBLE 11 // % | |||
| #define RULE_INC_SCORE 12 // + | |||
| @@ -342,6 +343,7 @@ typedef struct { | |||
| #define S_FINAL_NO_2 0x10 | |||
| #define S_NO_AUTO_2 0x20 | |||
| #define S_2_TO_HEAVY 0x40 | |||
| #define S_FIRST_PRIMARY 0x80 | |||
| #define S_2_SYL_2 0x1000 | |||
| #define S_INITIAL_2 0x2000 | |||
| #define S_NO_AUTO_DIM 0x10000 | |||
| @@ -353,6 +355,7 @@ typedef struct { | |||
| // bit4=don't allow secondary stress on last syllable | |||
| // bit5-don't use automatic secondary stress | |||
| // 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 | |||
| // 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 | |||
| @@ -411,9 +411,9 @@ void VoiceReset(int tone_only) | |||
| voice->samplerate = 22050; | |||
| 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 | |||
| voice->roughness = 1; | |||
| @@ -512,6 +512,7 @@ static void PhonemeReplacement(int type, char *p) | |||
| static int Read8Numbers(char *data_in,int *data) | |||
| {//============================================= | |||
| // Read 8 integer numbers | |||
| memset(data, 0, 8+sizeof(int)); | |||
| 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])); | |||
| } | |||
| @@ -286,6 +286,11 @@ void WcmdqStop() | |||
| {//============= | |||
| wcmdq_head = 0; | |||
| wcmdq_tail = 0; | |||
| if(sonicSpeedupStream != NULL) | |||
| { | |||
| sonicDestroyStream(sonicSpeedupStream); | |||
| sonicSpeedupStream = NULL; | |||
| } | |||
| #ifdef USE_PORTAUDIO | |||
| Pa_AbortStream(pa_stream); | |||
| #endif | |||
| @@ -446,6 +451,10 @@ static int WaveCallback(const void *inputBuffer, void *outputBuffer, | |||
| fprintf(stderr, "espeak: out of memory\n"); | |||
| } | |||
| outbuffer_size = ix; | |||
| out_ptr = NULL; | |||
| } | |||
| if(out_ptr == NULL) | |||
| { | |||
| out_ptr = out_start = outbuffer; | |||
| out_end = out_start + outbuffer_size; | |||
| } | |||
| @@ -1974,25 +1983,27 @@ int WavegenFill2(int fill_zeros) | |||
| /* 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) | |||
| { | |||
| sonicFlushStream(sonicSpeedupStream); | |||
| } | |||
| return sonicReadShortFromStream(sonicSpeedupStream, outbuf, length); | |||
| return sonicReadShortFromStream(sonicSpeedupStream, outbuf, length_out); | |||
| } // end of SpeedUp | |||
| @@ -2001,15 +2012,23 @@ int WavegenFill(int fill_zeros) | |||
| {//============================ | |||
| int finished; | |||
| unsigned char *p_start; | |||
| int length; | |||
| int max_length; | |||
| 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); | |||
| 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; | |||
| } // end of WavegenFill | |||