commit 8d59235f7a7f2a9f0127602ccdfb243dd3a2f390 Author: jonsd Date: Sat May 5 11:00:27 2007 +0000 git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@1 d46cf337-b52f-0410-862d-fd96e6ae7743 diff --git a/dictsource/ReadMe b/dictsource/ReadMe new file mode 100644 index 00000000..f2812de4 --- /dev/null +++ b/dictsource/ReadMe @@ -0,0 +1,27 @@ +These are the spelling-to-phoneme pronunciation rules and exceptions lists +for each language. + +You can make changes and then re-compile them to produce the "_dict" +file in the espeak-data data directory (eg. "en_dict") which the +speak program used. + +Use: + speak --compile= + +to compile the data for a particular language. It automatically replaces +the corresponding _dict file in espeak-data, ready for use by the +speak program. + +An "_extra" file, (eg. en_extra) can be used to in addition to the "_list" file +to add exception words without disturbing the official "_list" file. +It is treated as an extension of the "_list" file. + + +Language Notes: + +Russian. An additional dictionary of Russian words and their stress positions + is available at http://espeak.sourceforge.net/data/russian_data.zip. + This allows eSpeak to put the stress on the correct syllable of Russian words. + + + diff --git a/dictsource/af_list b/dictsource/af_list new file mode 100755 index 00000000..93e86d83 --- /dev/null +++ b/dictsource/af_list @@ -0,0 +1,566 @@ +//maintainer: Willem van der Walt +// email: wvdwalt@csir.co.za +// tel: +27 12 8413996 +// Meraka Institute, CSIR +//With contributions by Christo de Klerk + + +// This file is UTF-8 encoded +// all words lower case + + +// abbreviations +(http ://) hA:te@te@p'e@_ +e.a _:En_'and@r + +// letter names +// any letter which also appear as words should be prefixed by a _ here +a A: +b be@ +c se@ +d de@ +e e@ +f Ef +g x2e@ +h hA: +i i +j je@ +k kA: +l &l +m Em +n En +o o@ +p pe@ +q ky +//r &r +s Es +t te@ +_u y +v fe@ +w ve@ +x Eks +y eI +z zEd + + +// numeric +_0 'nWl +_1 _'e@n +_1a _'e@n +_2 'twe@ +_3 'dri +_4 'fir +_5 'feIf +_6 'sEs +_7 'se@v@ +_8 _'axt +_9 'ne@x@ +_10 'tin +_11 _'&lf +_12 'tw'A:lf +_13 'd&rtin +_14 'fe@rtin +_15 'feIftin +_16 'sEstin +_17 'se@v@ntin +_18 _'ax2tin +_19 'ne@x2@ntin +_2X 'twIntIx2 +_3X 'd&rtIx2 +_4X 'fe@rtIx2 +_5X 'feIftIx2 +_6X 'sEstIx2 +_7X 'se@v@ntIx2 +_8X 'tax2tIx2 +_9X 'ne@x2@ntIx2 +_0C 'hOn@rt +_0M1 'd'Yys@nt +_0M2 'mIljun +_0M3 mIlj'art +_0and _!En +_dpt 'pWnt + + + + + +// Place names + +afrika 'A:frika +bethlehem bEt_liEm +ceylon s@lOn +china S'ina +engeland 'EN@lant +mesopotamië mEsuput'A:mi@ +thaba tA:ba +(thaba nchu) tab'A:||ntSu +europa Y@r'o@pa +paarl p&:r@L +pretoria prit'o@ria +stellenbosch st%&l@mbOs +worcester v'ust@r + + + +// People names +Abiméleg abin'e@lEx2 +André 'andreI +annette an'Et +aucamp @Ukamp +benjamin bEndZ@m@n +botha bo@ta +carl kA:r@L +charles _^_EN +chris krIs +christo krIstu +christian krIstian +christine kr@st'i:n +coetzee kuts'e@ +debora d@bo@ra +der d@r +esegiël is'e@x2i_@l +eugene judZ'i:n +eugène yZ'En +ferreira f@r&:r@ +fourie fur'i +francois franSwa +freud frOId +george _^_EN +gerhard x2&rart +grange x2rA:nsi +gustav gustaf +jacobus jako@bWs +jacques ZA:k +jesus ji:sWs +john _^_EN +le l@ +leandra li'andra +leroux l@ru +levi le@fi + +louis luI +louise luw'i:z +louw l'@U +maria mar'ia +michiel $2 +natasha n%at'aSa +paul p@Ul +paulus p@UlWs +petrus pe@trWs +phoebe fi:bi +plooy pl'oI +preez pr'e@ +rebekka r@bEka +ronel run'&l +rousseau r@s@U +roux r'u +scheepers ske@p@rs +schoor sko@r +shakespeare _^_EN +terblanche t@rblA:nS +theron tr'On +viljoen $2 +villiers vIli@rs +marais mar'E: +mandela mand'E:la +celliers sIlj'e@ +joubert jub'&:r +plessis pl@s'i +schalkwyk skalkveIk +tony t@Uni +xhosa kO:za + +toit toI +khumalo kum'A:lu + + + + +// article + +die $u + + + +// unstressed verbs + +is $u +het $u +sal $u +sou $u +kan $u $strend +kon $u $strend +wil $u $strend +word $u +gaan $u $only +kry $u + + +// conjunctions and questions + +//maar +toe $u +//tog + +en $u $pause +want $pause +of $u $pause +dan $pause +anders $pause +al $pause +daarom $pause +dus $pause +gevolglik $pause +daarna $pause +desondanks dEs?OndaNks $pause +ondanks 'OndaNks $pause +verder f'&rd@r $pause +nogtans $pause +intussen $pause +omdat $pause +sodat $pause +voordat $pause +nadat $pause +totdat $pause +as ,as $pause +soos $pause +solank $pause +sodra $pause +sowel so@v'&l +sedert $pause +alhoewel alhuv'&l $pause +tensy $pause +aangesien $pause +wie $pause +wanneer $pause +waar $pause +waarom $pause +waarheen $pause +weliswaar v'&l@-svA:r $pause +hoe $pause +hoekom $pause +hoeveel $pause +wat $pause +watter $pause + + +// prepositions +aan $u $strend2 +agter $u $strend2 +bo $u $strend2 +by $u +in $u +met $u +na $u +om $u $strend2 +onder $u $strend2 +op $u $strend2 +van $u +vir $u +voor $u $strend2 + + +// misc unstressed +de d@ +du $u +dat $u $strend +te t@ +nie $unstressend + +soos $u +beker be@k@r +bekers be@k@rs + + + +// pronouns +ek &k $u +jy $u +u $u +hy $u +sy $u +dit $u +ons o~ns $u +julle $u +hulle $u +hulleself hWl@s&lf +my $u +jou $u +hom $u +haar $u +se s@ + +dis $u + + + +// phrase with words spoken together + +(nie waar nie) n,i||v,A:r||n'i + + +// abbreviations + +mnr mIn'e@r +mej m@jWfr@U +mev m@fr@U +dr d'Okt@r +insp InspEkt'Y@r +prof pruf'Es@r +st s@nt +supt suprEntEnd'Ent +pres pr@s@d'Ent +bv beIf'o@rbe@lt + + + +// main word list + +aanbid $2 +aanstaande $2 +agenda ax2'Enda +algehele alx2@h,e@l@ +alles al@s +alternatiewe $4 +amen A:mEn +anatomie $4 +asof asOf +asook aso@k +asseblief as@bl'if +babelaas bab@lA:s +bedjie bE:ici +beide beId@ +belangriker b@laNr@k,Ir +belangrikst@ b@laNr@kst@ +bene be@n@ +beswil bEsv@l +bêre b&:r@ +beskryf b@skr'eIf +beste bEst@ +bestes bEst@s +betekenis b@te@k@n@s +bewe be@v@ +bewend be@v@nt +bewering b@ve@rIN +biblioteek $4 + +dadelik dA:d@lIk +darem dar@m +derde d&:rd@ +dekade dEk'A:d@ +diegene dix2,e@n@ +dikwels dIkv@ls +diplomasie d@plo@mas'i +dusver dWsf&r + +effense Ef@ns@ +ekself %&ks'&lf +ekstra $1 + +elders &ld@rs +enige e@nIx2@ +era e@ra +erger &rg@r +espeak i:;spi:k +euro Y@ru +exodus Eks'o@dWs + +figuur f@x2yr +finalis $3 +finaliste $3 + +garages g@rA:dZ@s +gee x2e@ +geen x2e@n +gegewens x2@x2e@v@ns +geldelike x2&ld@l@k@ +genade $2 +genesis x2e@n@s@s +//gesamentlik x2@sA:m@ntl@k +gooi x2OI +gomorra x2@mOra + +hallo h'Il,@U +hanteer $2 +heeltemal he@lt@mal +heengaan he@nx2A:n +hek h&k +hekke h&k@ +helaas he@l'A:s +hele he@l@ +here he@r@ +hoewel huv'&l +hoofsaaklik $2 +hotel hut'&l + +idee $2 +ietwat itvat +ignoreer ix2no@r'e@r +inagneming @nax2ne@m@N +inderdaad @nd@rd'A:t +ingang Inx2aN +intens @nt'Ens +intensiteit $4 +ironie irun'i + +joernalis $3 + + +kafee kaf'e@ +kantoor $2 +kapitaal kapit'A:l +koevert kuf'&rt +kollega kul'e@x2a +komaan kOmA:n +komberse kOmb'&rs@ +kombers kOmb'&rs +konferensie kOnf@r'e:nsi +kopiereg kup'ir&x2 +krediet kr@dit +kritiek krIt'ik +kultuur $2 +kunsmatige kWnsm'A:t@x2@ + +latere l'A:t@r@ +lekker l&k@r +lekkerder l&k@rd@r +lekkerste l&k@rst@ +lughawe lWx2h,A:v@ + +makabere m%ak'A:b@r@ +matige mA:t@x2@ +meegee me@x2e@ +militêre mIl@t'&:r@ +minister m@nIst@r +minute m@nyt@ +minuut m@nyt +miskien $2 +misterie m@ste@ri +monitor mOnitOr +motore mo@t'o@r@ +motor mo@t@r +motortjie mo@t@rki + +nadele nA:de@l@ +nature nat'yr@ +nalatigheid nA:l'A:t@x2eIt +namate $2 +negeer n@x2e@r +netjies nE:icis +netjiese nEicis@ +netsowel nEtso@v&l +nietemin n'it@m@n +nobelprys $2 +nogal nOx2al +normale nOrm'A:l@ +november $2 +numeri nWm@ri + +omtrent Omtr'Ent +onbegrip $1 +onderstebo On@rst@b,o@ +onderwyser $3 +ongeag $1 +ongeduld $1 +ongeloof $1 +ongelyk $1 +ongemak $1 +ongerief $1 +ongewens $1 +ongewensde $3 +ongewoons $1 +onkunde $1 +onlangs $1 +onmag $1 +onrus $1 +oorkom $2 +oorleef $2 +oorspronklike $2 +oranje $2 + +patriotisme patri|ut'Ism@ +parlement parl@m'Ent +penorent pEno@rEnt +per pIr +persent p@rsEnt +program prux2r'am + +reeds re@ts +retireer r@t@re@:r +retoriek r@tur'ik +rimpeling rImp@l@N +roterende rut'e@r@nd@ +rukkerig rWk@r@x2 + + +samelewing sA:m@l,e@v@N +sedert se@d@rt +sektore $2 +skepsele skEps@l@ +s'n s'@n +sobere s'o@b@r@ +sombere s'Omb@r@ +sodra so@dr'A: +sogenaamde s'o@x2@n,A:md@ +soldaat $2 +soldate $2 +sononder sOn,On@r +sonop sOn,Op +sover so@f&r +spesmaas $2 +stabiel stab'il + +terdeë $2 +terug t@-rWx2 +terwyl t@rveIl +tesame t@sA:m@ +tevrede t@fre@d@ +toegee tux2e@ +toenemend $2 +totale tut'A:l@ +totsiens $2 + + +uitdagings YydA:x2@Ns +uitdaging YydA:x2@N +uiteindelik $2 + +vaarwel fA:rv'&l +vanaf fanaf +vandag $2 +vandaan $2 +vanjaar $2 +vanoggend fan'Ox2@nt +vanuit fan'Yyt +veraf f&r_af +verafgeleë f&rafx2@le@@ +verantwoordelikheid f@rantv'o@rd@l@keIt +verdere f&rd@r@ +vere fe@r@ +vererger f@r&rg@r +ver f&r +verg f&rx2 +vergete f@rx2e@t@ +vergewe f@rx2e@v@ +vermy $2 +verre f&:r@ +verreweg f&r@v&x2 +verse f&:rs@ +vers f&:rs +verste f&rst@ +verte f&rt@ +via via +volwassenes fOlv'as@n@s +voorgee fo@rx2e@ +voorkom $2 +voormalige fo@rm'A:l@x2@ +voorsien $2 +vorige fo@r@x2@ +vrek fr&k + +waarskynlik $2 +waarskynlike $2 +wangedrag vanx2@drax2 +weg v&x2 +weggewens v&x2@v'E:ns + diff --git a/dictsource/af_rules b/dictsource/af_rules new file mode 100755 index 00000000..9139fae1 --- /dev/null +++ b/dictsource/af_rules @@ -0,0 +1,1922 @@ +//maintainer: Willem van der Walt + // email: wvdwalt@csir.co.za +// tel: +27 12 8413996 +// Meraka Institute, CSIR +//With contributions by Christo de Klerk + + + +.group a + _C) a (Cie_ 'A: + a A: + a (C a + + C) abie 'A:bi + _) a (bC %a // abdy/ablatief/ablusie/abstrak, etdc. + @) adig 'A:d@x2 // misdadiger/gewelddadigheid/kragdadigheid + C) adium A:diWm // compounds of stadium/radium + + C) agie 'A:x2i + agter (dogt %ax2t@r // move default stress: agterdogtig and derivitives + &) agtig 'ax2t@x2 // this string almost always carries stress on a + C) asie 'A:si + + a (CAA %a + a (Cie A: // apies/middagslapie + a (Cy %a + a (CA A: + _) aka a%k@ //akademie etc. + akkedis a%k@d'Is //akkedis and compounds + aa A: + ae A: //should be A:@ but sounds wrong + ai aI + aai AI + adres %adrEs // fix last e sound of adres as last part of compounds + _) alle (C al@ // alledaags/e/allerhande + _) alom (@ al?Om // shorten a sound: alombekend, etc. + _) al (we %al // stress: alweer/alwetend/-heid + apart ap'art + appar (A %ap@r // apparaat/apparate and compounds + appèl ap'&l + appen (diC %apEn // appendiks/-e/appendix + ap (te@ %ap // move default stress in apteek and derivitives and compounds + area A:ria // are0+a/kiesareas + au aU // ?? + atten (d at@n // compounds ending in bevattend etc. + at (le %at // atleet and compounds + atle (tiek %atl@ // atletiek and compounds + + austra o@str,A: + antering %ante@r@N //hantering in compounds + _tr) a (ns %a //transvaal, transformeer etc. stres + avon (t ,avOn //avontuur and friends + + aangee (+ 'A:nx2e@ // see rule: _) aange (@P5 A:nx@ + _) aange (@P5 'A:nx2@ // added stress mark to ensure stress on aan + aan (g A:n // aangaan/aangaap/aangroei/aangryp + aan (lok %A:n // move default stress: aanloklik/-heid + aan (lok_N A:n // restore default stress: aanlok + aan (sien %A:n // stress on 2nd slb + aan (sien_N 'A:n // stress on 1st slb + aan (skou A:n' // stress aanskou/lik + aanste (llerig A:nst'& // aanstellerig/-e|-heid + aansterk 'A:nst&rk // aansterk/ing + aan (stoot %A:n // stress on 2nd slb.: aanstootlik + aan (stoot_N A:n // stress on 1st slb.: aanstoot + aan (trek %A:n // move default stress: aantreklik/-heid + aan (trek_N A:n // restore default stress: aantrek + aan (vaar %A:n // aanvaar/de/baar + aan (vank A:n' // stress aanvanklik/e + aanwen (d 'A:nvEn // to correct pronunciation of e + aanwen (_ 'A:nvEn // to correct pronunciation of e in aanwen/aanwending + _) af (@P2 'af // afbreek/afdwaal/afdwing + C) afel (@ A:f@l // compounds starting with tafel/ontrafeling/uitrafeling + afgee (+ 'afx2e@ // see rule: _) afge (@P4 afx2@ + _) afge (@P4 'afx2@ // stress on 1st slb + afrik (a %afr%ik // exception to af prefix and move stress to end + afwesig %afve@s@x2 // to steer clear of pre- and suffixes + af (wagten %af // move default stress: afwagtend/-e + _) agterge (@P7 'ax2t@rx2@ + agterna ax2t@rn'A: // agterna/-kyk/-loop/-sit/-staar + a (djie aI + aan (djie AIN + aan (tjie AIN + aen (tjie AIN + adjie AIci + atjie aIci + aadjie AIci + aatjie AIci + &) asie (_S4 'A:si + &) asies (_S5 'A:sis + st) a (tist a //statistiek and friends + + adjunk adj'WNk + a (dres a' // stress adres/se +// adresseer adrEs'e@r // stress + admini %atm@n@ // administrasie/administratief/administratiewe + agent ax2'Ent + algemeen 'alx2@m,e@n + alleen %ale@n // to handel stress in compounds with alleen + amandel am'and@l // amandel/s/-poeding/-tert... + _) am (A %am // amorfe/amok/amortisasie/amalgamasie + amer (ik %ame@r // Amerika/Amerikaner + ampi (oen %amp%i // kampioen/sampioen and compounds + amus (e %am%ys // shorten a and move stress + anoniem anun'im + _) ar (gi %ar // argief and compounds/argiewe + _) ar (giC %ar% // argitek and compounds + _) arkad %arkA:d // arkade/arkadia + _) ar (om %ar // aroma/aromaties + arres (_ %arEs // arres/huisarres + arre (stA %ar@ // arrestasie/arresteer + arro (g %ar%u // arrogant/-e/arrogansie + ar (tikel %ar // stress: artikel and compounds + artiku %art%ik%y // stress and vowel sounds: artikulasie/artikuleer + _) a (strA %a // astrant/astrale/astraal + artille (rie %art@l@ // stress and vowel sounds: artillerie and compounds + asem A:s@m // asemgehaal/asemhaling/asemteug/ontwaseming + assist %as@st // assistent/e/assisteer + atten (C at'En // attent/heid/onattent/attensies + augustus Ox2'WstWs + avokado %af%ukA:du // stress and o sounds + avokade %af%ukA:d@ // variant form of avokado + ay (_ _^_EN // words ending in ay are English + ays (_ _^_EN // words ending in ays are English + +// The following are experimental nasalisation of aans: + aans (_ 'A~ns + aanse (_ 'A~ns@ + +.group an + an (djie+ aIN + angl (A %A~Nx2l% // anglikaans/anglisisme/anglofiel + angola A~Nx2'o@la //Angola, Angolabos etc. + angol (e %A~Nx2%ul //Angolese etc. + an (tjie aIN + _) ana ,ana // words starting with ana starts destressed +// The following are experimental nasalisation of ans + d) ans A~ns + fr) ans A~ns + h) ans A~ns + k) ans A~ns + l) ans A~ns + kr) ans A~ns + +.group b + b b + b (b + b (_N p + @) beeldig b'e@ld@x2 // denkbeeldig/voorbeeldig + bei beI // beier/beitel + _) be (@P2 b@ + C) be (C b@ + C) be (rsie b'&: //kombersie etc. + @) ba (rend b'A: // onrusbarend/opsienbarend and derivitives + ba (riton ba // shorten a sound: bariton and compounds + basi (s bA:s@ // basis and compounds + bene (r be@n@ //benerig/e + be (C%+ bE // beffie/bessie/bennie/bettie/blombeddings + _) be (Cy b@ // bely/beny/betyds + bed (rand bEt // fix e and first d sounds + bed (s bEt // bedsitkamer/bedsprei/gebedsdag + @) bed (_ bEt // bruidsbed/dubbelbed; many compounds ending in bed + be (de_ be@ // bede/gebede + bedel be@d@l // bedel/gebedel/bedelaar + bedeling b@de@l@N //bedeling and compounds + bedev be@d@f // bedevaart and compounds + beger (A b@x2e@r // begerig/begerend and compounds + bekk (+ b&k // exception to be (C%+ bE + bek (_ b&k // exception to be (C%+ bE + beken b@kEn // 2nd e sound: oorbekend/welbekende + @) beker (_ be@k@r // compounds ending with -beker + bell b&l // inbeller/oorbelle/seepbelle + _) bel (C b&l // Belgies/belhamel + bere (_ be@r@ //tediebere pandabere etc. + be (weging b@ // draaibeweging/swaaibeweging + bewende be@v@nd@ // first e pronounced long + bewing be@v@N // (aard)bewing/s + @) bewys b@veIs // "be" in rybewys/lisensiebewys/geboortebewys + bobbe (j b%Ob@ //fix stress for bobbejaan and friends + + bonde (C bOnd@ // verbondenheid/bondeldraer/gebondene/saambondelend + _) bor (dA@ b%Or // geborduur/bordeel/bordele + bowen bo@v@n' // bowenal/bowendien + _) byge (@P4 b'eIx2@ + by (kom@ b%eI // bykomende/bykomstige + + badjie baIci + + baba b'A:ba + ba (lans b%a // move default stress + balan (seer b%al%an // move stress to -eer + ba (ldadig b%a // move default stress: baldadig and derivitives + balhor b%alho@r // move default stress: balhorig and derivitives + ba (ljaar b%a // move default stress: baljaar and derivitives + balju b%aljy // move default stress: balju and compounds + ba (lkon b%a // move default stress: balkon and compounds + ballade b%alA:d@ // move default stress: ballade and compounds + baller (inA b%al@r // move default stress: ballerina/-o and compounds + ba (llet b%a // move default stress: ballet and compounds + ba (lletjie ba // restore default stress: balletjie/-s + ba (llon b%a // move default stress: ballon and compounds + ballo (t b,alO // move default stress: ballotasie/balloteer + balsem bals@m // correct e sound in derivitives like balseming + bara (k bar'a + bar (bA b%ar // barbaar/barbare and derivitives/barbier and compounds + baklei b@kl'eI // baklei/er + + bee (+ be@ + @) beer (_ b'e@r // absorbeer/inhibeer, etc. + teddie) beer be@r // restore default stress + ys) beer be@r // restore default stress + bederf b@d'&rf + bende bEnd@ // bende and its many compounds + @) bene (_ be@n@ + bering b'e@r@N // ontbering/inhibering/inkubering + o) bering b@r@N // versobering + C) bering b@r@N // verorbering/versombering + skrob) bering b'e@r@N // skrobbering + + beu (C bY@ // beur/beuke/beul + besig b'e@s@x2 + bessie bEsi + berg b&rx2 + berge b&rg@ + besem be@s@m + besering =b@se@r@N // besering/s/kniebesering... + beter b'e@t@r + bidd b'Id // biddag/aanbidding + bid b'It_ // biduur/aanbid + binne bIn@ // binnekom/binnelandse + bi (sar b%i // move default stress: bisar/-re + bla (tant bl%a // shorten 1st a and move default stress: blatant/-e/-heid + @) ble (_ _^_EN // words ending in ble is English + bloe (ddors@ bl%u // bloeddorstig and derivitives, but bloeddors + boeke (t b%ukE //move default stress and fix 2nd e sound: boeket and compounds + boere bur@ // many compounds with boere + bok (ooi bOk_ // bokooi/e/ribbokooi/boerbokooi + buiten (ge b'Yyt@n // buitengewoon/s/buitengewone/buitengemeen + buiten bYyt@n' // buitendien/buitensporig + buite b'Yyt@ // buitelandse/buitestander/buitew�eld + bybel b'eIb@l // to correct pronunc. of e in compounds + by (voorb b%eI// move default stress + + +.group c + c k + c (c + c (e s + c (i s + c (y s + ce (_ _^_EN // words ending in ce are English + ch x + _) ch x2 + ch (ol k //cholera, cholestrol etc. + ch (ro k + chat _^_EN + @) ci (_ s'i // plurals ending in -ci + @) cel (_ _^_EN // words ending in cel is English + @) cle (_ _^_EN // words ending in cle is English + chirurg S@r'Wrx2 + cy (_ _^_EN // words ending in cy are English + chin (e S%in //chinees, chinese + + +.group d + d d + d (d + dd d // gladde/midde/kudde/opskudding + aan) dag (tig d'ax2 // accent on dag + dani (gh d'A:n@ // -hoedanigheid/hoedanighede/onderdanigheid + @) dant d'ant // dant takes stress: kommandant/pruimedant + de (moCr d%E // demokraat/demokrasie/-ë/demokraties/demografie + dekade (n dEkad'E + dekade (s dEk'A:d@ + _) deli (ka d%El%i // delikaat/delikate + + @) dend (er d@nd // beduidender/behoudender + @) dend (ste d@nt // beduidendste/behoudendste + &) denis d@n@s // geskiedenisboek/kultuurgeskiedenis/belydenis/beduidenis + de (press d%i // depressie/depressief/depressiewe + @) derd (_ d@rt // verouderd/afgesonderd/gevorderd + @) dderd (_ d@rt // ontredderd, se rule: dd d + _) derge d&rx2@ // dergelik/-e + deur (dring@ d%y@r // move default stress: deurdringend/-e + deur (lop@ d%y@r // move default stress: deurlopend/-e + deur (sigt d%y@r // move default stress: deursigtig/-e + deur (weeC d%y@r // move default stress: deurweef/deurweek/-te + diaken d%iA:k@n // diaken and compounds + dia (m d%i%a // diamant and compounds + dilemma d@lEma // dilemma and compounds + &) ding (_S4 dIN + &) de (_S2 d@ + &) des (_S3 d@s + d (_N t // + dj c // palatal stop + + d (_dN // next word starts with d, drop the d + deloos d@lo@s + delos d@lo@s + + @) dge (_ _^_EN //words ending in dge is English + +// &C) dele (_ de@l@ + _) dames d'A:m@s // numerous compounds with dames + de (ba d@ // debat/-te/debakel + deba (tteer d@b%a // move default stress to end: debatteer + debuut d@b'yt // debuut/-bundel/-vertoning + desember de@s'Emb@r + digers d@x2@rs + departe (ment d@p%art@ + deposito d@pOsitu // stress and vowel sounds: deposito and compounds + detail d'i:teIl + distri (bu d@str@ // distribusie/distribueer and compounds + dis (trik d@s // stress: distrik/-te and compounds + _) dode d'o@d@ //dodelik dodemars etc. + doktor (_ dOkt@r // make last o schwa + doku dOky + dominee (_ d'o@m@ni + domin (A dOmin' // domineer/dominering + @) d (C t // oudste/benoudste/goudstad/steeds/Sweeds + p) d (C d // oopdwing/koopdwang + ver) d (C d // verdwyn; see rule: @) d (C t + @) dd d // beddens/bedding + @n) d (ete_ t // aandete/oggendete + @) d (eteC_ t // aand-/oggendetes/grondeter + djie ci // bokbaardjie/bordjie/boordjie/perdjie/tydjie + @) d (r d // but oordrewe/oordrom + oe) d (r t // bloedrooi/bloedryk/hoedrand/invloedryk + toe) d (r d // but: toedrag/toedraai + @C) dwerk tv&rk // handwerk/naaldwerk + @) dwes tv'Es // noordwes/te/lik/e suidwes/te/lik/e + @) dwese tve@s@ // leedwese/vakbondwese + @) dwillig tv'Il@x2 // d sound and stress: kwaadwillig/bereidwillig + oo) d (A t? // fix d in compounds starting with brood/dood/lood/nood... followed by vowel + karoo) d d // but Karoodorp/Karoodoring/Karoodistrik, etc. + du (pliC du // duplikaat/dupliseer + +.group e + e e@ + e (C E + CAC) e (CC @ // fix e sound: nalatenskap/wapenstilstand + CAnn) e (CA @ // banneling/sinnebeeld/spinnekop/-rak + @C) e (bo @ // compounds with boek/boer/boog/boom/bol/bord/borsel/bos/ grondbonebotter/kamdebo... + @C) e (bu @ // briewebus/ereburger/novellebundel/urinebuis/woedebui + sp) e (d @ // ekspedisie/gaspedaal/kwispedoor + sp) e (lonk @ // spelonk/rowerspelonk/spelonkagtig etc. + _k) e (ndh =E // but bekendheid/onbekendheid + @C) e (rh @ //donkerheid/kweperheining/nywerhede/pantserhemp/klapperhaar/suikerhandel/hamerhou + p) e (talje @ // fix stress and 1st e sound: petalje and compounds + l) e (moen @ //fix lemoen and compounds + @) ei (sen _'eI // (on)veeleisend/spoedeisend + r) ei (sen 'eI // rondreisend + C) e (h @ // alpehoring/beukehout/briewehoof/hondehok/tehuis... + hand) e (l @ // handelaar/handelsmerk/handelsware and similar + _) e (mi %E + oek) e (C @ // besoekersgetalle/boekekennis/boekenhout/koekepan/snoekerspeler/woekerwet + toek) e (n E // but: toekenning and compounds + C) e (rj @' // fieterjasies/kerjakker/kaperjolle + aw) e (r@ @ // aweregs/dawerend and compounds of dawer/drawertjie/hawer and compounds/hawe and comp. + uim) e (C @ // pruimedant/sluimeraar/sluimerend + e (CA e@ + dier) e (@ @ // dieresorg/-lewe..., many compounds + luuks) e @ // luukses/luukse and compounds + midd) e (@ @ // compounds starting with midde: middedorp/middeooste/middestad/middeweg + reus) e (@ @ // correct 2nd e in compounds starting with reuse + Cy) e (CC @ // e sound in vryevalformasie/senulyersinrigting/vryerspaartjies + C) ede (_ e@d@ // aandgebede/selftevrede + C) edes (_ e@d@s // lofredes/hoofredes + e (kono@ %E // 1st e: ekonome/ekonomie/ekonomies/ekonoom + e (mosi %i // emosie/emosioneel, etc. + hal) e (rC@ @ // uithalerperd/-skut/-speler and similar + C) e (ndh =@ //asemrowendheid/beduidendheid/doeltreffendheid/dringendheid/voortvarendheid... + u) eel 'e@l // words ending in ueel take stress on last slb + @) eer 'e@r // this string most often has stress + u) eer 'e@r // aktueer/konstrueer/salueer, etc. + effek %e@fEk // move default stress and fix e sound: effek/-te/-tief + eienaardig %eI@nA:rd@x2 // move default stress: eienaardig/-ste + @) ein (dig 'eIn // nimmereindige/nimmereindigend + sirk) e (l @ // compounds: sirkelgang/sirkelvormig + nk) e (lb @ // onwankelbaar/skenkelbeen/sprinkelbesproeiing + u) ele (+ 'e@l@ // words ending in uele take stress on penultimate slb + u) ering 'e@r@N // aktuering/konstruering, etc. + ele (gant ,e@l@ // elegant/onelegant + C) e (k & // + C) e (kA+ e@ + C) e (ks E + C) e (kt E + ekstase Ekst'A:s@ // stress ekstase/s + wink) e (l @ // winkelvensters/-sentrum/-personeel/winkelier/winkelhaak + C) eloos @lo@s // haweloos/hopeloos/hulpeloos/vlekkeloos + C) elose @lo@s@ // hawelose/hopelose/hulpelose/vlekkelose + C) ema (_ e@ma // words ending in ema: compounds of skema/tema + C) enaar @nA:r // eienaar/lessenaar + C) enier @n'i:r // kruidenier/spysenier/valkenier/Renier + C) en (heid @n // opgewondenheid/bedorwenheid and many similar + _) enorm e@n'Or@_m // enorm/-s, pronunc. of rm + _) enorm (A %e@nOrm // enorme/enormiteit, pronunc. of rm and stress + _) enkel ENk@l // enkelbaan/enkelbed; many compounds + @C) eny (_ @n'eI // words ending in eny have stress on y + d) e (fi E + C) e (kant @ // buitekant/noordekant + ee e@ + eetjie e@ici // tweetjies/hanetreetjie + eedjie e@ici // kleedjie/tafelkleedjie/altaarkleedjie + eeu iu + ei eI + ey eI + eu Y@ + euntjie Y@iNci // seuntjie/reuntjie + eë e@ // e deelteken-e + &) e (_ @ + m) e (nis @ // geheimenis(vol)/verdoemenis + C) e (toe_ @ // binnetoe/buitetoe + e (gK & + _) e (gal %e@ // stress: egalig/-e + C) ektomie 'Ektumi // histerektomie/vasektomie + &) elik (ing @l@k // verduideliking/s/vergoddeliking/verstedeliking + + app) elkoos @lk'o@s // stress shifts to koos appelkooskonfeit + &) e (l_ @ + @sk) e (l & // kwyt(ge)skeld(ing) + Cdd) e (le_ e@ + Csd) e (le_ e@ + Add) e (le_ @ + ACd) e (le_ e@ + los) e (s @ + + e (lK & + @s) e (l@ @ // e sound in words like borselkop/voedselaanvulling and many similar + Cs) e (lf & // e sound in words like terselfdertyd/vanselfsprekend + Cs) e (lle_ & // e sound in words like bloedselle/limfselle/stamselle/tronkselle + AC) e (lh @ // e sound in words like edelheid/ydelheid/kreupelheid + @p) e (lh @ // e sound in words like simpelheid + blind) e (ling @ + ind) e (ling e@ + nd) e (ling @ + _) eike 'eIk@ // many compounds with eike + &) e (lC_ @ + @m) e (ld & // aanmeld/voormeld + elagtig @l'ax2t@x2 // beuselagtig/e/heid/buffelagtig... + ener (gi %En@r // energie/energiek/e + ele (ment El@ // element/e/klankelement + m) e (ling @ // versameling/insameling/stameling + _) eni (g 'e@n@ // enigeen/enigiemand/enigiets/eniggebore/enigermate + C) e (ltjie @ // eltjie always @lki + + _) epilep Ep@l'Ep // epilepsie/epilepties/e + sam) e @ + + K) e (poort @ // Onderstepoort/erepoort/hellepoort + ff) el (@ @l // derivitives and compounds of eg. snuffel/skoffel/knoffel, etc. + &) ele (_ @l@ + elektr %ilEktr // move stress from 1st slb: elektries/elektrisiteit + + _) ellende e@l'End@ + _) ellendig e@l'End@x2 + engels EN@ls // engelssprekend/engelstalige/engelsman + lei) er (s @r // leierskap/leiersgroep/leierskursus/leiersposisie... + in) er (A 'e@r // kombinering/verkleinering... + ff) er (@ @r // keffertjie/koffersleutel/offerande/opoffering + stoff) er (A 'e@r // exception to rule: ff) er (@ @ + C) eres @r'Es // ...onderwyseres/...sangeres/priesteres + &) e (m_ @ + &l) e (m_ E // compounds ending in lem + n) erie (_ @r'i //masjinerie and compounds stress and e sound + @Cp) e (n_ E// balpuntpen/koorspen/vulpen and similar + @Cp) e (nne E // plurals of the above/-pennetjie + breip) e (n E // fix e sound in breipen/-ne + &) e (n_ @ + &) e (nC_ @ + &) e (ng_ E + erf) e (nis @ //erfenis/kultuurerfenis/verderfenis + + &) e (r_ @ + &) ers (_ @rs + &) erei (_ @reI + e (r & + + lew) e (ns @ + &d) e (r@ @ // not initial or final syllable + &t) e (r@ @ + &b) e (s@ @ + komp) e (t@ @ // kompetisie/s/uitklopkompetisie/inkompetensie + een (drag@ %e@n // eendrag has stress on 1st slb, but eendragtig and similar on 2nd + eenge 'e@nx2@ + _) een (stemm %e@n // move default stress: eenstemmig/-e/-heid + _) een (ton %e@n // move default stress: eentonig + _) een (voud@ %e@n // stress on 2nd slb: eenvoudig, but on 1st: eenvoud + eerbied (A e@rb'id // eerbiedig/ing + eerbiedw %e@rb%itv // eerbiedwaardig/eerbiedwekkend + eerw %e@rv // stress: eerwaarde + entjie EiNci + edjie 'E:ici + etjie ici + &) elik (_S4 @l@k + &) elikheid (_S8 @l@keIt // vriendelikheid/duidelikheid + epi (deC %Ep%i // epidemie/-s/-e/epidermies/epidermis + + K) erig @rIx2 + K) erige @rIx2@ + AA) erige @rIx2@ + Ai) er (A @r // bakleierig/draaiery/mooierige + k) es (_ @s // blankes/blinkes/krankes/dronkes/sterkes/swakkes + hip) e (r @ + _) er (b &r' // erbarm/ing + _) er (k &r' // erkenbaar/erkenning + _) er (v &r' // ervaar/ervare/ervarings/ervaringe + &) ere (_S3 @r@ + @) ery (_ @reI + e (tiket E // shorten e sound + + + ewigheid 'e@v@x2,eIt // ewigheid/hewigheid/stewigheid + evolus EvOl'ys // evolusie/devolusie/revolusie + C) ewyn @veIn // alewyn/compounds of brandewyn + _op) e (n @ + C) ensie (_ 'Ensi // many words ending in stressed ensie(s) + C) ensies 'Ensis // forensiese +C) ensie (_ @) enswaar (dig @nsv'A:r // noemenswaardige/bejammerenswaardig + @C) ent (_ 'Ent // orent/student/topstudent + @C) ent (e_ 'Ent // plurals of some of the above + C) er (tyd @r // tegelykertyd/kindertyd/indertyd + _) etens 'e@t@ns // etenstyd/klok/tafel/uur + pann) e (C @ //pannekoek and friends + pann) e (tjie i //fix pannetjie/spannetjie etc. + C) ewel (A e@v@l // prewelend/wrewelig/newelig/beneweling + d) e (mons E% + r) e (digering E + som) e (r @ //someraand and others. + _ew) e (++ @ //ewewig, ewekansig etc. + C) e (sk_ 'E // grotesk/burlesk/humoresk + C) e (ske_ 'E // burleske/groteske + C) e (sk@ @ // hondeskou/modeskou/erdeskottel/geleideskip/hardeskyf + d) e (skun %E // but: deskundige and compounds + @d) e (s@ @ // bejaardesorg/heidesoorte/hondesiekte/modesiek/tandestokkie/tersydestelling/vredesluiting + @d) esi (ma %Es%i // duodesimaal/heksadesimale + @d) e (se_ 'e@ // Kanadese/nadese, etc. + pred) e (sti E // predestinasie + evang ,e@faNx2 // evangelie/evangelis + + ou) e (C @ + C) e (v @ //kleibevattend/stasiebevelvoerder/skadevergoeding + +// The following are experimental nasalisation of ens + gr) ens e~ns + m) ens e~ns + nam) ens @ns // but not namens + w) ens e~ns + @sam) e (ns_ @ //fix eksamens + @nem) e (ns_ @ //fix words ending in nemens + _mens) e @ //mense at start of compounds + _mens) e (k @ //force correct behaviour before k + @kom) e (ns_ @ //fix words ending in komens + @C) e (wa_ @ // goederewa/kolewa/ossewa/troepewa + Ab) e (wa @ //bewaking/bewaring in compounds polisiebewaking + @C) e (waen @ // plurals and diminutives of some of the above + w) e (ling @ //weling always v@l@N + + wild) e @ //wilde in compounds + wild) e (kA @ //wilde in compounds with k wildekomkommer etc. + will) e (m @ //willem, willemse etc. + pp) e (C@+ @ // flapperend/snippermandjie/dopperkerk/poppekas... + &) e (nk_ E // but kersgeskenk/verjaardaggeskenk + @ks) e (ms @ // bliksems and compounds + @) e (spel_ @ //gebarespel/kleurespel/klokkespel/parespel/poppespel/samespel/snarespel + ar) e (sse_ 'E // bibliotekaresse/sekretaresse + _s) e (na @ //senator and friends + p) e (talje @ // fix stress and 1st e sound: petalje and compounds + interpr) e (teer @' //stress and e sound interpreteer + _) e (ks %E //move default stress in words starting with eks + uik) e (rs @ //fix e in words containing uikers + CoeC) e (C @ //fix e in boetedoening, boedelbelasting and many others + orr) e (l @ //fix e in borrel, orrel, korrel in compounds + eval (u %iv%al // evaluasie/evalueer/evaluering + + + +.group f + f f + f (f + fa (briek f%a // move default stress: fabriek and many compounds/fabriseer + familie fam'ili + fanta (sA f%ant%a // fantaseer/fantasie + fasiliteit fasilit'eIt // fasiliteit/e/aftrekorderfasiliteit + februarie f'e@-bry,A:ri + @) fel (end f@l // betwyfelend/skuifelend/weifelend + @) fel (ing f@l // betwyfeling/skuifeling/weifeling + fi (siek f@ // correct 1st i sound and move default stress: + filistyn f@l@st'eIn // filistyn/e + _) fi (na@ f%i // finaal/finale/finansies + fla (grant fl%a // shorten 1st a and move default stress: flagrant/-e + flo (re fl%u // move default stress, correct o sound: florerend + @) fonie fun'i // kakofonie/simfonieorkes/telefonie + _) for (C f%Or // formeel/formele/forseer/fortuin + _) for (se_ f'Or // stress back to 1st slb; se rule: _) for (C + foto fo@tu + fo (togra fo@ // move default stress: fotograaf and similar + fung (e f%WNx2 // fungeer/fungerende/fungering + fynge (C feInx2@ // fyngebreekte/-kou/-kap/-maalde + + +.group g + g x2 + g (g + ge x2@ + ga (lAC x2%a // galant/galery/galon/galop +//re-enable following rule to get [g@] at end of words + C) ge (_ g@ + genre Z'A~nr@ //genre and compounds + gese (_ x2'e@s@ //Portugese, and others + + gespe (_ x2Esp@ // gespe and compounds + gewens (g x2e@v@ns // (on)vergewensgesind/-e/-heid + gewers (_ x2e@v@rs //fix gewers at word ends + _) gh g + gh (_ k + @) gheid x2eIt // traagheid/leegheid/droogheid/stugheid + _) ge (@P2 x2@ + ge (k_ x2& + ge (kk x2& + ge (kh x2& + genade x2@nA:d@ // correct 2nd e in compounds: genadedood, etc. + genad (etjie x2@nA:d // correct 2nd e in genadetjie + _) ge (rC x2& // gerf/gerwe/gert/gerber + gesel (_ x2@s&l // metgesel/compounds ending with gesel + geselle (_ x2@s&l@ // metgeselle/compounds ending in geselle + geu (C x2Y@ // geur/e/ig/geut + gewe (_ x2'e@v@ // begewe/gegewe + @) gewende (_ x2'e@v@nd@ + @) gewend (_ x2'e@v@nt // insiggewend/deurslaggewend/liggewend + gewel (d x2@v&l //geweld/ig/gewelddadig + gewel (f x2@v'&l //gewelf/boog + gewel (w x2@v'&l //gewelwe + + gewel x2e@v@l //gewel/huis/muur etc. + gewer (_ x2e@v@r // gewer and many compounds ending in gewer + gewing x2e@v@N // begewing/vergewing + + bur) ger g@r + gee (+ x2e@ + geër (_ x2e@@r // oorgeër/pasaangeër + gees (drift x2%e@s // move default stress: geesdriftig and derivitives + @) gegee =x2@x2'e@ + gei (+ x2eI // geil and derivitives/geiser/geit/-e + ge (kskeer x2'E // gekskeer/gekskeerder/gekskeerdery + geld x2< + gelde x2&ld@ + geldi x2&ld@ + geldjie x2'&lci + _) gelykeni (s x2@l'eIk@n@ // gelykenis/se + gemmer x2'Em@r + ght _^_EN +// geo + ge (ogra x2i //geografie etc. + ge (olo x2i //geoloog etc. + ge (ome x2i //geometries etc. + gesels x2@s'&ls + generaal x2@n@r'A:l + _) gade x2A:d@ // gadeslaan/gadegeslaan + garage g@r'A:dZ + @) gge (_ x2@ // logge/stugge + godde (lo x2%Od@ // move default stress: goddelose/goddeloos + A) gogie (_ x2ux2'i // demagogie/pedagogie + A) gogies x2'o@x2is // demagogies/-e/pedagogies/-e + A) goog (_ x2'o@x2 // demagoog/pedagoog + A) goë x2'u@ // demagoë/pedagoë + guerrilla g@r'Ila + +.group h + h h + h (h + @C) hal (sA h'al // reikhalsend/waaghalsig + hal (sstar h%al // move default stress: + _) hane (C hA:n@ // hanekam/hanekraai/hanepoot/hanetree + @) hartig h'art@x2 // barmhartig/lighartigheid/lighartig... + heiden heId@n // heidene/heidense/heidendom + hemde hEmd@ // naghemde/onderhemde/frokkiehemde + hemel he@m@l // hemelblou/hemelhoog and many compounds with hemel + _) her (@P3 h%&r + herder h'&rd@r + here (_ he@r@ + hel h&l + _) helde h'&ld@ // heldedade/heldedood/heldemoed... + &) hede (_ he@d@ + heg h&x2 + g) heid eIt // traagheid/leegheid/droogheid/stugheid + herinner h&r'In@r // herinner/-ing/-e|s + hip (noCA h%ip // hipnose/hipnoties/hipnotiseer + hister (e hist@r // histerektomie + hister (i hist'e@r // histerie/histeries + histor hist,o@r + hoog (dra h%o@x2 // stress: hoogdrawend and derivitives + hor (los h%Or // horlosie and compounds + hu (meur h%y // stress: humeur/-ig + +.group i + i i + i (C I + i (CA i + ie i + _) iese (C ,is@ // iesegrimmig and derivitives + ieus i'Y@s // this ending always takes stress + i (tief @ + i (tiew @ + def) i (n @ + f) i (guu @ //figuur + f) i (gure_ @ //figure at word end + C) iater i'A:t@r // psigiater/pediater + C) iatrie iatr'i // psigiatrie/pediatrie + C) iatries i'A:tris // psigiatries/pediatries + ide (a %id%i // ideaal/ideale and compounds + _) idi (o %id%i // idioom/idiome/idioot + _) id (A %id // idille/idillies + illu (si %ily // illusie/-s/illusief + in (diens @n //indienstreding/indiensopleiding/indiensplasing + insi (dent @ns@ // insident/e/insidentjie + in (skik @n // move default stress: inskiklik and derivitives + in (tiem @n // move default stress: intiem/e + intimi (dA @nt@m@ // intimidasie/intimideer + ingrypen @nx2reIp@n // move default stress and correct 1st e in ingrypender + innemen @ne@m@n // move default stress and correct 2nd e in innemendste + intrige @ntrix2@ // intrige/-s; fix 2nd i sound + innuendo @ny:|'End@U // innuendo('s) + + C) ie (r_ i: //ier at end of words is long + C) ie (re_ i: //iere at end of words is long + + _em) i (r @ + ië e@:@- // i followed by "deelteken e" + iën i'En //i deelteken e n + + + + iee (C i'e@ // distansieer/finansieer/finansieel/prieel + iële i'e@l@ // finansiële/potensiële + + + ieu iu + ij (C eI + ingee (+ 'Inx2e@ // se rule: _) inge (@P4 @nx2@ + _) inge (@P4 'Inx2@ // prefix inge always has stress on 1st slb + inge (wing 'Inx2e@ // see rule: _) inge (@P4 @nx2@ + @C) inge (_ @N@ + ings INs // begrotingsrede/ontvangslokaal/geringste + _) ing (@ 'Inx2 // ingaan/ingang/ingiet/ingly/ingroei/ingreep... + &) ige (_ Ix2@ + @C) iger (CA @x2@r // twintiger-/dertiger-/veertigerjare, etc. + &) iges (_ Ix2@s + &) iger (_S2 @r + @) ika (_ =%ik%a // logika/dinamika + &) ike (_S3 @k@ + C) iking @k@N + &) ing (_ @N + @C) igend (_ @x2@nt // bevredigend/beangstigend... + @C) igende @x2@nd@ // bevredigende/beangstigende... + C) iging @x2@N + m) i (nister @ //fix first i sound in minister in some compounds + indjie 'IiNci + intjie IiNci + idjie Iici + itjie Iici + + ighei (d @x2eI // kleinigheidjie + iana i'A:na + indivi ,IndIvi //individuele and others + &C) ikend @k@nt // grinnikend/runnikend/sanikend + &C) ikende @k@nd@ // grinnikende/runnikende/sanikende + ingenieur @nx2@n'y@r + inspring 'Inspr@N // see list: insp InspEkt'Y@r and rule: &) ring (_S4 rIN + inten (s @ntEn // move default stress + in (tussen @n // move default stress + irrit ir@t' // irriteer/irritasie + irriter (@ ir@t'e@r // irriterend/e/irritering + + iles (_ _^_EN // words and names ending in -iles are English + ity (_N _^_EN + @) igering ix2'e@r@N + instruks @nstr'Wks // instruksie/s (stress) + instrukt @nstr%Wkt // instrukteur/s/instrukteer (stress) + + iër (@ i'e@r // kopiëring/subsidiërende + AC) is (_ 'Is // aktivis/humanis/kommunis/pianis/solis/violis/kompromis + pol) is (_ @s // polis and compounds + ar) is (_ =@s // but sekretaris/argivaris/kommissaris + litar) is 'Is // but militaris + AC) iste (_ 'Ist@ // aktiviste/humaniste/kommuniste/pianiste/soliste/violiste + @) iseer is'e@r // analiseer/kategoriseer + @) iseren (d is'e@r@n // analiserend/kategoriserend + @f) iek (_ 'ik // manjefiek/compounds + @n) iek (_ 'ik // uniek/compounds +@n) iek (e_ 'ik // unieke/compounds + @kn) iek (_ ik // but piekniek + @t) iek (_ 'ik // antiek/etiek/taktiek + @t) iek (e_ 'ik // antieke... + @tr) iek (_ 'ik // eksentriek/metriek + @tr) iek (e_ 'ik // eksentrieke/metrieke + sp) i (oen %i // spioen/spioenasie and compounds + + @) iseur is'Y@r // adviseur/narkotiseur + @) i (sering i + C) isie 'isi // ambisie/ammunisie/komposisie/ammunisiekis + C) isieus isi'Y@s // ambisieus/suspisieuse + C) isk (_ 'Isk // asterisk/tamarisk + C) ispel Isp@l // lispeling/kwispeling/kwispelstert + @) isme (_ 'Ism@ // isme always takes stress + @) iteit it'eIt // stress on iteit endings + @C) itis (_ 'it@s // stress: many diseases ending in -itis + C) iveer if'e@r // always takes stress + C) iver (A if'e@r // always takes stress: aktiverende/motivering + +.group j + j j + j (j + + jakaranda j%ak%ar'anda //jakaranda and compounds + januarie j'any,A:ri + jeans _^_EN + jellie dZ'Eli + johan juh'an + johannes juh'an@s + jonge jON@ // jongeling/jongeres + + junie j'uni + julie j'uli + juris (dik j%ur@s // jurisdiksie and compounds + + +.group k + @A) k (aat k' // advokaatstoga/fabrikaat/sertifikaatjie/triplikaat and many similar + @) kate (_ k'A:t@ // plurals of some of the above + k k + k (k + kk k + kabel kA:b@l //stress and e sound + kabeljou kab@lj'@U //kabeljou and compounds + + kabinet k%ab%inEt // kabinet/drankkabinet/kabinetsvergadering + kade (t k%adE // shorten 1st a and move default stress: kadet and compounds + kake (C kA:k@ // kakebeen/skakelaar/skakelbord/skakelfunksie + ka (lAnC k%a // kalender and compounds/kalant/kalander and compounds + kalmeer kalm'e@r // kalmeer/gekalmeer + kalmer (A kalm'e@r // kalmerend/e/kalmering + kamer kA:m@r // compounds: kamerindeling/kamerorkes, etc. + kamera kam@ra + kamerade k%am@rA:d@ // stress: kamerade/skeepskamerade + kameraa kam@r'A: + kamer (C kA:m@r // kamerdeur/eetkamermat/sitkamervenster + kandi (dA k%an%i // kandidaat/kandidate and compounds + @A) kaner (_ k'A:n@r // Afrikaner/Amerikaner + kape (l k%ap& // move default stress and fix e sound: kapel and compounds + kape (la@ k%ap@ // fix e sound: kapelaan/kapelane and compounds + kap (tein k%ap // kaptein/kapteinskap/skeepskaptein + kar (ton k%ar // move default stress: karton and compounds + kar (wei k%ar // move default stress: karwei and derivitives + _) kata ,kata + kate (dr k%at@ // katedraal/katedrale and compounds + kategorie k,at@x2ur'i // to also handle plural + kategor (isA kat@x2ur // katagoriseer/kategorisering/gekategoriseer + kategories k,at@x2'o@ris // to move stress + + keling k@l@N + kkeling k@l@N + kelend (_ k@l@nt + kelende (_ k@l@nd@ + kkelend (_ k@l@nt + kkelende (_ k@l@nd@ + n) kerend (_ k@r@nt //hunkerend and others + n) kerende (_ k@r@nd@ //hunkerende and others + weder) ker (A k'e@r // wederkerend/wederkerig + kker (@ k@r // swakkerig/blikkerig/flikkerend/flikkering + klaarblyklik klA:rbl'eIkl@k // klaarblyklik/e + _) kla (sA@@ kla // klasaantekeninge/klasonderwyser and other compounds + kla (ssiek kl%a // move default stress: klassiek/-e + kla (vier kl%a // klavier and many compounds + _) kamele kam'e@l@ // kamele teenoor skamele + karakter kar'akt@r + er) ken kEn // E sound in erkEn + klein (g kleIn // kleingeld/kleingoed/kleingekry/kleingemaak + klere kl'e@r@ + kklere =kl'e@r@ + knip (A knIp? // knipogie/geknipoog/ + ko (pie@ k%u // kopiereg/kopie + koe (rA k%u // koerier/koerasie/koerant and compounds + kollege k'OlidZ // kollege/onderwyskollege + kolleges (_ k'OlidZ@s // kolleges/onderwyskolleges + @)kollek kulEk // straatkollekte/straatkolleksie/deurkollekte + _) kollek kul'Ek // kollekte/kollektebord/kolleksie + kollekteer kulEkt'e@r // kollekteer/gekollekteer + koeël k'ul + kolonel kOl@n'&l + kolo (ssa k,Olu // move default stress: kolossaal/kolossale + kombuis kOmb'Yys + ko (medi k%u // move default stress, correct o sound + komitee kOm@te@ + kommen (ta k%Om@n // kommentaar/kommentator + kom (plA k%Om // komplot/kompleet + _) kon (C k%On + _) kon (dig k'On // stress: see rule: _) kon (C k%On + konnekteer kOnEkt'e@r // (ge)konnekteer + konkel kONk@l // restore default stress and fix [N] sound: konkelaar/konkelwerk, etc. + konsist k%Ons@st // konsistorie and compounds/konsistensie + koö k%o@O // koördinasie/koöpsie, etc. + krimi (nA kr@m@' // krimineel/kriminele/diskrimineer + krit (A kr@t // kriteria/-ium/kritiseer and derivitives + krieket krik@t //krieket e sound and stress + krieketw krik@tv //krieket followed by w in compounds always v + + krokodil krOk@-d'I:l + kruger kr'Y@@r + kulin k%Wl%in // Move default stress and fix u sound: kulinër/-e + @) kundi (g k'Wnd@ // wiskundige/onoordeelkundigheid and many similar + kwali (C@ kw%al%i // kwaliteit/kwalifiseer + + +.group l + l l + l (l + _) la (kon l%a // lakoniek/lakonies/lakonisme + _) lang (d l%aN // langdradig/langdurig and their derivitivs + &) lede (_S4 le@d@ + lede (C le@d@ // ledemate/ledegeld/ledelys + leding (_ le@d@N //fix ontleding and others + Ci) leer l'e@r // faksimileer/meubileer/stileer and similar + legende l@x2End@ // move default stress; fix e sounds + legen (da l@x2@n // move default stress and fix e sounds + leli (k le@l@ // fix e sound and stress: lelik and derivitives + _) lende lEnd@ // lendelam/lendene/compounds of lende + lening le@n@N // banklening/sorgverlening/hulpverlening... + _) lev (i l@f // Levitikus/Leviet + lewe (C le@v@ // belewenis/lewendig/agtergeblewenes + libe (ra l@b@ // liberaal/liberale/liberalis/-me + ligen l@x2'En + liggaamlik l@x2A:ml@k // stress liggaamlik/-e/-heid + &) lik (_S3 l@k + &) like (_S4 l@k@ + &) likes (_S5 l@k@s + &) liker (_S5 l@k@r + &) likste (_S6 l@kst@ + linker lINk@r // blinkertjies/many compounds with linker and klinker + @) ll (_N _^_EN // Words ending in -ll are English + _) losge (@P5 l'Osx2@ + _) losies l%us'is //losies at start always means "to stay" + &) lm (K l@-m + liefdes lifd@s // liefdesbrief/daad/geskiedenis/verhouding... + lisensie l@s'E:nsi + lering (_ l'e@r@N //isolering distilering correct @ to e@ and force stress + lokomo ,lukumu' //lokomotief and friends + @) lusti (g l'Wst@ // move default stress: strydlustig/lewenslustig and many similar + + +.group m + m m + m (m + ma (ho m%a // mahoniehout/-lessenaar and similar + &) mal (_S3 mal + malaria mal'A:ria; + man (da m%an //mandaat and compounds + manier m@ni:r //manier and compounds + manu (sk ,many + marine m%arin@ // marine and compounds + mar (sje m%ar // move default stress: marsjeer and derivitives + masjien m@Sin // masjien and many compounds + maties m'A:tis //tamaties, outomaties etc. + ma (triek m%a // matriek and many compounds with matriek + @) matig m'A:t@x2 // doelmatig/gelykmatig/regmatig; matig takes stress in compounds +// mc _^_EN //the mac names does not work + + medalje m@dalj@ // medalje/bronsmedalje/medaljewenner + _) mede (@P4 m'e@d@ + _) mede (ly m%e@d@// move stress + media mi:dia // compounds of media + me (dium mi: // fix e sound + mee (doë m%e@ // move default stress + medisyne m@d@s'eIn@ //medisyne and compounds + meganies m@x2'A:nis + _) meege (@P5 m'e@x2@ + me (juf m@ // move default stress and shorten e sound + meneer m@n'e@r // meneer/meneertjie + menere m@n'e@r@ // menere/beroepsmenere + mening m'e@n@N + mening (itis mEn@Nx2 // see rule: mening m'e@n@N + + mentee (C mEnt'e@ // argumenteer/dokumenteer/fragmenteer stress related + mentele (_ mEnt'e@l@ // stress always on penultimate slb of words ending in ntele + + mentering mEnt'e@r@N + materiaal mate@ri'A:l + mekaar m@k'A:r + mekaarge m@k'A:rx2@ + _) melodies m@l'o@dis //melodies and compounds + _) melodi (eu ,mEludi //melodieus + _) melodie mElud'i + _) melo (dr m'Elu //melodrama etc. + mme (C m@ + ment m'Ent + mental (iteit m,Ental // fix stress: mentaliteit/sentimentaliteit and compounds + mentjie m'EiNci // monumentjie/dokumentjies + metaal m@t'A:l + metale m@t'A:l@ + meteen mEt_'e@n // meteen/meteens/almeteens + metode m@t'o@d@ // metode/s + me (tod m@ // metodies/metodiek + + metodis mEtud'Is // metodis/ties/e/metodisme + mevrou m@fr'@U + middagete m'Idax2_e@t@ // middagete/s + middel mId@l // middellyf/middelpunt/middelste/bemiddelend + milit m@l@t // militêr/militaris + minag m'Inax2 // minag/geminag/minagting/minagtend + miner (A m@n@r // mineraal and many compounds + mi (neur m%i // move default stress: mineur and compounds + mikro mikru + ministers m@n'Ist@rs + mis (gis m@s // stress on 2nd slb + mis (gun m@s // stress on 2nd slb + mis (ha m@s // mishandel/mishaag + miske (n m@skE // misken/ning/onmiskenbaar + mis (l m@s // misluk/mislei + mis (lik m'Is // default stress again + _) mis (m m@s // mismaak/-te/mismoedig + mis (noeg m@s // stress on 2nd slb + mis (o m@s_ // misoes/misopvatting + mis (plaas m@s // stress on 2nd slb + mis (rabel m@s // stress on 2nd slb + mis (reken m@s // stress on 2nd slb + mister (ieus m@ste@r // stress at end + mis (tiek m@s + mis (troos m@s // mistroostig + mis (vorm m@s // stress on 2nd slb + modern m%ud&r@-n + moedswillig mutsv'Il@x2 // move default stress: moedswillig/-e/-heid + moeite m'uIt@ // moeitevol/le/moeiteloos/lose + mohammed (a m%uh%am@d // mohammedane/mohammedaan + moles (tA mOl@s' // molesteer/der + monder (A m%Onde@r // move default stress and lengthen 1st e sound + monu (ment m%On%y // monument/e/vrouemonument/monumenteel + motor mo@t@r // motorfiets/motorkar/vragmotor + @) mpel (A mp@l // bewimpeling/dompelaar/strompeling + museum m%ysY@m // move default stress + musiek m%Wsik + musi (C mysi' // musikant/musikus/musici + môre (@ mO:r@' // move default stress: môreaand/-middag/-oggend + + +.group n + n n + n (n + n (c N + n (k N + n (q N + n (x N + ng N + eu) n (g n // dreungeluid/kreungeluid/steungeluid/steungewend + Cui) n (g n // basuingeskal/bruingebrand/bruingeel/tuingereedskap/tuingewas/tuingrond + n (_g N + ng (ent Nx2 // kontingent/tangent and derivitives + @) nges (_ N@s // banges/langes/dinges + @) ng (itis_ Nx2 // brongitis/faringitis/laringitis + _) na (C_ n'a //three-letter words starting with na + na ( n%a_ // naef/naewe/nawiteit + na (tal ,na' //natal and compunds + _) n (AA n // for words starting with naa, etc. + nasio naSiu + _) nag (C n'ax2 + _) na n'A: + _) na (by@ n%A: // move default stress: nabye/nabyheid + _) na (delig n%A: // move stress from 1st slb: nadelig/-e + _) na (denk n%A: // exception to: _) na n'A: + _) na (rC na // nartjie/nardus/narsing + _) na (rk n%a // narkose/narkotiseer/narkoties/narkotika + _) na (tC na // many compounds beginning with nat + na (tuur n%a // natuur and compounds and derivitives + @) na (_ na // shorten final na, except for: + r) na (_ nA: // daarna/hierna/waarna + naasbeste nA:sbEst@ // naasbeste/s + nadruklik nA:dr'Wkl@k // nadruklik/e + na (ï n%a? // naïef/naïewe/naïwiteit + nazi nA:tsi // Nazi and compounds + + &) ning (_S4 n@N + nning n@N // prevent nn in words like orwinning, see: &) ning (_S4 n@N + _) nage (@P4 n'A:x2@ + + nasionale naSEun'A:l@ + &) nele (_ n'e@l@ + netel ne@t@l // netelig and derivitives/netel and compounds + nommer (een n%Om@r? // stress: nommereen in compounds like nommereenspeler + normaal nOrm'A:l // normaal/normaalweg/abnormaal + nou (keu n%@U // noukeurig/-e/-heid/onnoukeurig + no (velle n%u // move default stress and fix o sound + ntere (ss nt;r@' // interessant/interesseer/geïnteresseerd + nuus (kierig n%ys // move default stress: nuuskierig/-heid + + +.group o + o o@ + o (C O + o (CA o@ + o (terap u // psigo-/fisioterapeut + ob (sku %Op // obskuur/obskure/obskuriteit + oefen uf@n// oefenbroekie/oefeningboek/liggaamsoefeninge + C) ogig _o@x2@x2 // bruinogig/grootogig/skuinsogig + C) oetel ut@l // troeteldier/-naam/vertroeteling/vroetelend/boeteling + _) o (marm %O //omarm and compounds + odiek ud'ik // periodiek/metodiek + oliek (_ ul'ik // koliek/mankoliek/simboliek + oliek (e_ ul'ik // mankolieke/katolieke + orie o@ri + oriu 'o@riW + orkes %OrkEs // orkes and compounds + + C) o (Cie o@ // removed primary stress + C) o (CAA %u + b) o (CAA o@ //fix o in bobeen, bobaas etc. + C) o (Cy %u + C) o (Ciee %o@ // assosieer/harmonieer/folieer + fil) o (@ u% + oo o@ + oe u + oei uI + oi OI + ooi oI + oy OI + ou @U + + oetjie uIci + oentjie uINci + oedjie uIci + odjie OIci + otjie OIci + ondjie OINci + ontjie OINci + ontering %Onte@r@N //ontering in compounds montering etc. + ograaf ux2r'A:f // biograaf/demograaf/fotograaf + ografie ux2raf'i // biografie/demografie/fotografie + ografies ux2r'A:fis // biografies/demografies/fotografies + ograwe ux2r'A:v@ // biograwe/demograwe/fotograwe + C) okkel Ok@l // derivitives of smokkel/rokkel/brokkel and others + okraat ukr'A:t // burokraat/outokraat and similar + okrasie ukras'i // burokrasie/outokrasie and similar + okrat (A ukr'A:t // burokraties/outokraties/demokrate and similar + ologie ulux2'i // biologie/tegnologie and similar + ologies ul'o@x2is // biologies/tegnologies and similar + oloog ul'o@x2 // bioloog/kardioloog and similar + oloë ul'u@ // bioloë/kardioloë and similar + ometrie ume@tr'i // geometrie/psigometrie + ometries um'e@tris // geometries/psigometriese + onome un'o@m@ // astronome/ekonome/gastronome + onomie unum'i // astronomie/ekonomie/gastronomie + onomies un'o@mis // astronomies/-e/ekonomies/-e/gastronomies/-e + onoom un'o@m // astronoom/ekonoom/gastronoom + osofie usuf'i // filosofie/teosofie + osofies us'o@fis // filosofies/teosofiese + osoof us'o@f // filosoof/teosoof + osowe us'o@v@ // filosowe/teosowe + opaat up'A:t // homeopaat/psigopaat and similar + opatie upat'i // homeopatie/neuropatie and similar + opatie upat'i // psigopatie/osteopatie and similar + opaties up'A:tis // allopaties/homopaties and similar + k) ongres %ONx2rEs // compounds ending with kongres: kerkkongres + @) ony (_ _^_EN //words ending in only is English + oodjie oIci + ootjie oIci + + oontjie oINki + oondjie oINki + omgee (+ 'Omx2e@ // se rule: _) omge (@P4 Omx2@ + omgewe (_ Omx2'e@v@ // se rule: _) omge (@P4 Omx2@ + _) omge (@P4 'Omx2@ // stress on 1st slb + omgewing Omx2'e@vIN + om (h %Om // omhels/omhein/omhoog/omhul + om (ha Om // restore default stress: omhaal/omhang/omhaak + _) omker (A Omke@r // omkering/omkerende + om (ring %Om // move default stress + om (sig %Om // move default stress: omsigtig/-heid + omstandigh Omst'and@x2 // to steer clear of prefixes and suffixes + om (vatt %Om // move default stress: omvattend and derivitives + _) omver %Omf&r // omver/omvergooi/omverwerp + + _) on (@P2 %On + ondeur %Ond%y@r // ondeurdagte/ondeurdringbaar/ondergrondelik + onheil Onh%eIl // stress: onheil/e/onheilbringer + onheil (ig %Onh'eIl // stress: onheilig/e + onheil (spel %Onh%eIl // stress: onheilspellend/e + onreg 'Onr&x2 // stress: onreg/te + on (regv+ %On // stress: onregverdig/e/heid + _) ont (@P3 %Ont + onteenseg Onte@ns'&x2 // onteenseglik/e + on (toe %On // ontoereikend/heid + on (tyd %On // ontydig and derivitives + _) on (wAs 'On // onwis/onwys + _) onge (@P4 Onx2@ + _) ongees %Onx2%e@s // ongeesdriftig; see rule: _) onge (@P4 Onx2@ + _) ongeloofli (k Onx2@l'o@fl@ // to avoid "lik" suffix retranslation of "ongeloof" + onge (luk_ o~Nx2@ // ongeluk/verkeersongeluk, etc. + onge (lukke_ o~Nx2@ // ongelukke/verkeersongelukke, etc. + onge (lukkie o~Nx2@ // ongelukkie/-s + onge (luks o~Nx2@ // ongeluksvoël, etc. + ongemakli (k Onx2@m'akl@ // to avoid "-lik" suffix retranslation + ongeriefli (k Onx2@r'ifl@ // to avoid "-lik" suffix retranslation + onder On@r + onder (bre %On@r // move default stress: onderbreek/onderbreking + onder (druk %On@r // exception to default stress rule + onder (duim %On@r // exception to default stress rule + onder (hor %On@r // exception to default stress rule: + onder (rig %On@r // exception to default stress rule + onder (skA %On@r // exception to default stress rule + onder (steu %On@r // exception to default stress rule: ondersteun/-ing/-ers + onder (vin %On@r // exception to default stress rule: ondervind/ondervinding + _) onderge (@P7 'On@rx2@ + ontevrede Ont@fr'e@d@ + + oombliklik o@mbl'Ikl@k // stress: oombliklik/e + oorbluf o@rbl'Wf // stress: oorbluf/te + oorbodig o@rb'o@d@x2 // stress: oorbodig/-e/-heid + oordrewe o@rdr'e@v@ // stress: oordrewe/oordrewenheid + oor (dink %o@r // move default stress + oor (doen %o@r // move default stress + oor (een %o@r // move default stress: ooreen/ooreenkom/ooreenkoms/ooreenstem + oor (een@@ ,o@r // move default stress: ooreenkomstig/ooreenstemmend + oor (hand@ o@r' // stress oorhandig/ing, but oorhand + oor (heers %o@r // move default stress + oorkoepel o@rk'up@l // stress and pronunc. of el: oorkoepelend/oorkoepeling + _) oorlede o@rl'e@d@ // stress oorlede/ne/s + oor (reed %o@r // move default stress + oor (redA %o@r // move default stress: oorredingskrag + oor (rompel %o@r // move default stress + oor (sk %o@r // stress: oorskadu/oorskat/oorskrei + oor (spronk %o@r // move default stress: (on)oorspronklik and compounds + oor (tr %o@r // oortree/oortreding/oortref + oor (tuig %o@r // oortuig/oortuiging/oortuigende + _) oor (w o@r' // oorwin/oorweeg/oorweging/oorweldig/end... + oor (wig 'o@r // stress + _) opeen Op_'e@n + ope (l o@p@ // dopeling/hopelik/opelug/opelyf + opgee (+ 'Opx2e@ // see rule: _) opge (@P4 Opx2@ + _) opge (@P4 'Opx2@ // stress on 1st slb + &C) op (ig 'o@p // wanhopig/voorlopige + opper Op@r // oppergesag/wese/vlak/man + optel Opt&l + _) op (@P2 'Op // opeet/opeis/optredes/opoffering + open o@p@n // open/opening/e/s + open (b %o@p@n openbaar/openbare/openbaring + oper (A %o@p@r // operasie/operateur/opereer + opera (_ 'o@p@ra // stress: opera/operas + opinie o@p'ini // opinie/-s + op (offer Op // fix o sound: selfopperende, etc. + oppon (A %Op@n // opponent/opponeer + op (roerig %Op // oproerig/-e/-heid, but oproer + op (sienb %Op // opsienbare/opsienbarend + op (winde %Op // move default stress: opwindend and derivitives + organisasie Orx2anis'A:si + @) oties 'o@tis // antibioties/eksoties/eroties/neuroties + ower (@ o@v@r // lowergroen/betowerend/dowerig/compounds of owerheid + oë u@ // + +// The following are experimental nasalisation of ons + b) ons o~ns + d) ons o~ns + fr) ons o~ns + g) ons o~ns + +.group p + p p + p (p + pajama p@dZ'A:ma //pajama and compounds + pakistan p%ak%istan //first a and stress + papaja pap'AIa //papaja and compounds + pam (C p%am // move default stress: pamflet/pampoen/pampoentjies and compounds + pam (pa pam // restore default stress: pampas and compounds + pape (gaai p%ap@ //papegaai and compounds: stress, a and e sounds + pa (niek p%a // paniek/paniekerig + pa (pier p%a // papier and compounds + + pa (tat p@ // patat/warmpatat/wurgpatat + para (C ,para //paralel, paragraaf etc. + parade (_ p@rA:d@ // parade and compounds + par (C@ p%ar // (ge)parkeer/parkeerplek/party(keer/maal...)/parfuum/parmantig + _) pas (AA pas // pasaangeër/pasoortreding + pas (op p%as // pasop/pasoppens + passa (sier p%as%a // stress: passasier and compounds + pastorie pastur'i // pastorie/-paar/-moeder + _) pa (tA p%a // pateties/patee/patent/paterniteit + polio po@li;u // polio and compounds +// @) pene (_ p@n@ // geroepene/ontslapene/uitgeworpene + pene (_ p@n@ // geroepenes/ontslapenes/uitgeworpenes + _) perde p'&:rd@ + @) perde (_ p&:rd@ // compounds ending with perde + pe) perde (_ p@rd@ //gepeperde, ongepeperde + ras) perde (_ p@rd@ //gerasperde and compounds + snip) perde (_ p@rd@ //words ending in snipperde + tem) perde (_ p@rd@ //words ending in temperde + @) pere (_ pe@r@ // compounds ending in pere indicating the fruit + skam) pere (_ p@r@ ?? shorten 1st e in ending + peloton pEl@t'On + permanen p&rman'En // permanent/e/permanensie + permit p@rm'It + persoon p@rs'o@n + perso (neel p%&rs%u // personeel and compounds + pervers p@rf&rs // pervers/perversie + planete pl%ane@t@ // move default stress and fix a sound: planete and compounds like planetebaan + plei (dooi pl%eI // (slot)pleidooi/-e + plesier pl@s'i:r + polisie pul'isi + politiek pOl@t'ik + popu ,pOpy + _) por (C %pOr //portret portaal etc. + _) pos (a pOs //posadres/posadministrasie + _) post (K p'@Ust- //post where it means after + _) prak (tyk pr%ak // stress: praktyk and compounds + pre (sA pr@ // president/presies/present + primi (t pr@m@ // make i sounds schwa: primitief/primitiewe + ple (k pl& + posisie puz'isi + predi (kant pr%e@d@ // predikant and compounds + prinse (s pr@nsE // prinses/-se|-sie/-s + privaat prif'A:t + pro (blA pr%u // probleem/probleme + profesie prOf@s'i // fix vowel sounds and move stress + pro (CA pr%u // probeer/produk/proses/professie/provinsie + prosa pr'o@sa //prosa and compounds + proses (_ prus'Es //proses at end of word + + projek pruj'Ek + proku (rA pr%Ok%y // prokureur and compounds/prokurasie + prominen prOmin'En // prominent/e/prominensie + propag ,prOpax2 + + prosedure prOs@d'yr@ + protes prut'Es + protest ,prOt@st + ps (igA s // psigologie/kinderpsigoloog + psalm p@s'al@m // schwa between p and s + + publi (C pWbl%i + puntener p%Wnt@ne@r // stress and 2nd e sound: puntenerig and derivitives + + +.group q + q kw + q (q + + qu _^_EN // words containing qu are English + + +.group r + _) r (_ &r + r r + r (r + _) r (_D. rant + _) r (_DD. rant + _) r (_DDD rant + radika (li radika + radika (le radik'A: + radikaa radik'A: + radio r'A:diu:- + rake (t rak'E // raket/te/tennisraket + ramp (salig r%amp // move default stress + ramp (spoed@ r%amp // move default stress: rampspoedig and derivitives + _) ra (pport r%a // fix stress: rapport/skoolrapport/rapportryer + rea (ks r%ia // reaksie/s/skokreaksie + rea (C r%i%a // reageer/realis/me|ties + re (bel r@ // move stress from 1st slb + _) redel re@d@l //redelik and compounds + _) rede (C re@d@ // redevoerder/redekawel and similar + redeneer r@d@n'e@r // redeneer/geredeneer/beredeneer/beredeneerde + reden (ACA r@d@n' // redenasie/s + _) redi (gA r%Ed%i // redigeer/geredigeer/-de/ongeredigeerde + refor (m r@f%Or // gereformeerde/reformering/reformasie + reg (ist r@x2 // registrasie/-nommer/register/bevolkingsregister + regverdig r&x2f'&rd@x2 // regverdig/onregverdige/regverdigheid - verwyder uit af_list + re (kru r@ // move stress from 1st slb + rele (van r@l@ // relevansie/relevant and derivitives + re (nA r@ // move stress from 1st slb.: renoster + repu (t r%Epy // move stress from 1st slb + restaur r%Est%ur //stress and au exception + re (to r@ // move stress from 1st slb + renons r@no~ns // stress on 2nd slb and nasalisation + relase r@lA:s@ // relase/s + rele (gA r@l@ // relegeer/relegasie + repet rEp@t + republiek r@pWbl'ik // republiek/e/ie/sowjetrepubliek + &) rering (_ re@r@N //strukturering, demonstrering etc. + resul (tA r@sWl' // resultaat/resultate/eksamenresultaat... + resep r@sEp // resep/resepte/resepteboek + reserwe r@z'&rv@ + ribbe (tj r'Ibi + ritu (A r@t%y // ritueel/rituele/ritualisties + _) rol (A rOl? // oprolaksie/roloorvleueling + roman rum'an + &) ring (_S4 rIN + rring r@N // karring/torring + &) rm (K r@-m + @) rn (K r@-n + + s) rede re@d@ // bestaansrede/feesrede + reg r&x2 + reke (nA re@k@ // rekenaar/sakrekenaar/rekenaarprogram/hoofrekene + rekord r'EkOrt + o) rene r@n@ // eersgeborene/uitverkorenes + rivier r@f'ir + re (geer r@ // regeer/geregeer; stress to end + reger (A r@x2e@r // regering/regerende + resensie r@s'E:nsi + resensent r@s@ns'Ent + respek r@spEk + respek (teer r@sp%Ek // stress to end + rond (r rOnt // grondreuk/grondrel/rondreis/-rol/-ry + rugby r'Wgbi + &) rele (_ r'e@l@ + rondom rOnt_%Om // rondom/rondomheen/rondomstaner + rolprent rOlprEnt // rolprent/rolprentvertoning and other compounds + + +.group s + s s + s (s + @@@) s (_S1 s // to correctly handle plural s + i) s (_ s // exceptions to rule: @@@) s (_S1 s + o) s (_ s // exceptions to rule: @@@) s (_S1 s + u) s (_ s // exceptions to rule: @@@) s (_S1 s + sch S + sh (_ S + sj S + sjokolade SOk@l'A:d@ // sjokolade and compounds + s (japie s // dorpsjapie/plaasjapie/stadsjapie + @) sj (aar sj // diensjaar/lewensjaar/begrotingsjaar + @) sj (are sj // apartheidsjare/oesjare + sigare (t s@x2%arE // fix vowel sounds and move default stress + sig (a@ s@x2 // sigaar/sigare/sigaardosie + siklu (s siklW // siklus and many compounds + sili (nd s@lI // silinder(s)/silinderkoppe + s (iën S + sending (_ sEnd@N //fix sending at word end + + D_) ste st@ //ste after numbers 22ste etc. + saamge (P6 s'A:mx2@ // saamgepers/-de/saamgetel/saamgeêet + sabot (A s%ab%ut // sabotasie/saboteer + salaris s@lA:r@s // salaris/aanvangsalaris/salarisskaal/-uitbetaling + salon salOn // eetsalon/haarkappersalon + _) same (@P4 s'A:m@ // samekoms/sameswering + samel (C sA:m@l // versamelde: see rule:_) same (@P4 s'A:m@ + samen sA:m@n // gesamentlik/-e + sa (tir s%a // move default stress: satire/satiries/-e + _) sede se@d@ // sede/-s|-preek + seker se@k@r // versekering/sekerheid/onsekerheid/sekere + se (ko s@ // sekond/sekonde/sekondes/sekondant + sekre (ta s@kr@ + se (ku s@ // sekuriteit/sekuur + seku (l s%Ek%y // sekulër/sekulariseer + + &) sele (_ s'e@l@ + no) sele (_ s@l@ // e sounds in onnosele + seli (ba s%El%i // move default stress and fix e sound: selibaat/selibate + @) sel (wig s'&l // stress: (ver)eenselwig and derivitives + _) semen (t s@mEn // sementtafel/blad/vierkant + + sening se@n@N // sening/haaksening/heupsening + sen (trale s%En // exception to default stress rule + sere (moni s%Er@ // seremonie/-meester/huwelikseremonie/seremonieel + ser (vet s@r // servet and compounds, e.g. servetring + setel (_ se@t@l // setel and compounds; to avoid "=tel" suffix + siaal Si'A:l // potensiaal/provinsiaal + siale Si'A:l@ // provinsiale/asosiale/nupsiale + C) s (ieel S // potensieel/finansieel + C) s (iële S // potensiële/finansiële + si (nnig s'I // sinnig in compounds has stress: dubbelsinnig/geheimsinnig/kranksinnig + siniste (r s@nIst@ // sinister/sinistere/sinisters + skade skA:d@ // elik suffix rule breaks a sound of (on)skadelik + skadu skA:dy // skaduagtig/skadutjie + skaker (ing sk%ake@r // skakering/-s/kleurskakering + skemer ske@m@r // fix 2nd e in many compounds and derivitives of skemer- + sko (lier sk%o@ // move default stress: skolier/-e + _) slag sl'ax2 + slinger slIN@r // slingertjie/slingervel/slingerend + @) sering s'e@r@N // analisering/kategorisering + @) ses (_ s@s // fix 2 slb. words ending in ses + sodom (iet s,o@dOm // fix stress + _) soie so@?i // soiets/soiemand + so (lie s%O // stress and o sound: solied/-e + so (lid s%O // konsolidasie/solidariteit + so (pra s%u // move default stress and fix o sound: sopraan/soprane + spelagtig sp&l'ax2t@x2 // skouspelagtig/e/heid/klugspelagtig + e) spel (_ sp&l //klokkespel/snarespel/driespel/hokkiespel/puntespel/putjiespel + C) spel (_ sp&l // many compounds ending in spel after consonant + &) spele (_ sp'e@l@ + spese (ry sp@s@ // spesery and compounds and derivitives + spoed (@ sput // spoedaflewering/spoedeisend/spoedorder + spoed (ig spud // spoedig/-lik/-er/-ste + sproke spro@k@ // see rule: pro (CA pr%u : aangesprokene/onbesproke, etc. + self (_ s'&lf // myself/vanself +// self s'&lf + sewe (C s'e@v@ // sewejarige/standerdseweklas + september s@pt'Emb@r + @) sief (_ s'if // massief/aggressief/passief/intensief + @) siewe (_ s'iv@ // massiewe/aggressiewe/passiewe/intensiewe + _) sieke sik@ // siekeboeg/-fonds/-lys/-lokaal/-loon + silwer sIlv@r // silwerskoon/silwerware/compounds of silwer +// sioe Si'u + si (o Si // fisiologie/-logiese/-loog + sio (ne Siu' // emosioneel/emosionele/rasioneel/rasionele, etc. + sistem sIst'e@m + situasie sItSu'A:si + @) skaplik sk'apl@k // -skaplik always takes stress + @) skappy skap'eI // heerskappy/maatskappye + skerp sk&rp + skoonge (C sko@nx2@ // skoongewaste/skoongevee/skoongeboul + @) skynlik sk'eInl@k oê­³kynlik/onwaarskeinlik/waarskynlikheid + smelt sm< + sodom (iet s,o@dOm // fix stress and 2nd o sound: sodomiet/-e + sonde (C@ sOnd@ // sondebok/sondelas + sosial (i so@Sial' // sosialis/sosialisme/sosialisties + so (v s'o@ // soveel/sover + soverre so@f'&r@ // stress: se rule: so (v s'o@ // soveel/sover + speku (lA sp%Ek%y // spekulasie/spekuleer/spekulatief + @) sper (a sp@r' //desperate/desperaatheid/rasperagtig + ek) sper (im spEr // eksperimenteer/eksperimenteel + sake sA:k@ //sakeman, sakeonderneming etc. + spesi (a sp%ES%i // spesiaal/spesiale/spesialis + spesialis (A spESialis + spesialis spESal'Is + spesi (f sp%Es%I // spesifiek/spesifiseer + @) spre (kend spr'e@ // stress: vanselfsprekend + stan (da st%an // standaard/-e/standardisering + standerd (@ st%and@rt // compounds starting with standerd + staties st'A:tis + steding ste@d@N // besteding and compounds + @) stel (ing st@l // eersteling/gunsteling/wellusteling/worsteling and their compounds + @) stelik st@l@k // oostelik/christelik/beestelik + stel st&l + kun) stel (d st@l // gekunsteld/ongekunsteld and derivitives + + stede (_ ste@d@ //voorstede, hoofstede etc. + stele (_ ste@l@ //kastele lepelstele etc. + stene (_ ste@n@ //skoorstene, bakstene etc. + chri) stene (_ st@n@ //fix christene and compounds + @) stel (o st@l //bewusteloos/lustelose/rusteloosheid/kosteloos + @) sterkt st&rkt // compounds ending in sterkte + + weg) ster (we st&r // wegsterwe/wegsterwende + _) ster st'&r + kwik) ster st&:r // kwikstertjie/-s + sterrei st@r'eI + sterre st'&r@ + sterretjie st'&rici + + ste (m stE // eliminate one m in derivitives like stemming + stewel ste@v@l // sokkerstewels/stewelmaker and other compounds + @) stiek st'ik // statistiek/akoestiek/artistiek and many similar + @) sties =st%is // statisties/akoesties/artisties and many similar + storm stOr@-m + strategie strat@x2'i + streke str'e@k@ + struikel str'Yyk@l // struikelblok/struikelaar/struikelend + stu (deer st%y // move default stress + sub (ti s%Wp // stress and b sound: subtiel/-ste/subtiliteit + @) sug (tig s'Wx2 // eersugtig/onbaatsugtig/onselfsugtig, etc. + sukses s%WksEs // sukses/suksesse/suksesvol/reusesukses + swag sv'ax2 + swart (gal sw%art // move default stress: swartgallig + swerk sv'&rk + swinkel svINk@l + +.group t + t t + t (t + t (_dN // final t, and next word starts with d + A) tch _^_EN // clutch/pitch/bitch + @) talig t'A:l@x2 // Anderstalig/tweetalig + _) ta (ma t%a // tamatie and compounds + _) ta (mb t%a // tamboer and compounds/tambotie and compounds + _) tant (e tA~nt // nasalise + _) tekere t@ke@r@ // move default stress and correct e sounds + tele (C t%&l@ // telefoneer/telekommunikasie, etc. + @C) te (nk t& ++ //tenk and friends + @C) te (C t@ /// + @C) te (lbord t& // krieket-/tennistelbord, etc. + @C) te (k_ t& // tydsbestek/uitstek + ap) teke te@k@ // apteke/apteker and compounds + te (oC t%i% // teologie/-loog/-logies/teorie/teoreties + @C) t (eny t // to enable rule: @C) eny (_ @n'eI + tempera ,tEmp@-r%a //temperatuur, temperament etc. + teks (+ tEks // compounds with teks + adver) t (e t' // advertensie/afdeling/agent + t (ema++ t // compounds with tema + tent (_ tEnt //suurstoftent and others + _) tering te@r@N // tering and compounds + moles) tering te@r@N // molestering/kindermolestering + _) ter (l t@r // move default stress: terloops/-e + @) term (_ t&r@ // correct pronunciation of e + @) terme (_ t&rm@ // correct pronunciation of 1st e + tern (_ t'&:r@-n //lantern ekstern etc. + _) ter (nA t@r // terneergedruk/ternouernood + te (rrA t@ // terras/terrein/terreur and compounds + _) ter (s t%&r // tersake/terselfdertyd/tersluiks/terstond/tersyde + tese (_ t'e@s@ //sintese, and others + A) teur t'Y@r // outeur/ouditeur/operateur + k) teur t'Y@r // akteur/inspekteur + tabak tab'ak; + teen (woor t%e@n // teenwoordig/heid/verteenwoordiging + _) te (we t@ // move default stress and fix 1st e sound: teweeg/tewerkstelling + _) tewens te@v@ns // fix both e sounds + tevore t@f'o@r@ // tevore/vantevore + + tia (_ Sja + @) tief (_ t'if // alternatief/aktief/instinktief/(ak)kumulatief + @) tiewe (_ t'iv@ // alternatiewe/aktiewe/instinktiewe/(ak)kumulatiewe + ti (ra t%i // move default stress tiran tirade + tj tS + tj (ie c + _) tj (ie tS + ui) tj tj // uitjaag/uitjou/uitjubel + ui) tjie ci // beskuitjie/fluitjie/ruitjie/uitjie, etc. + @) teken te@k@n + teken (A te@k@n // compounds of betekenis/tekening + tekor t@k'Or // deelteken/koppelteken/litteken/handtekening/ondertekende + _) th (@@ t + _) th _^_EN // if only one vowel character + @) th (_N _^_EN + tenaar t@nA:r + + tes (_ t@s + + &) tel (_S3 t@l + ttel t@l // many compounds of bottel/skottelgoed + teleur t@lY@r // teleur/teleurstelling/teleurgesteld + &) tels (_S4 t@ls + sleu) tel t@l //sleutel in compounds + tel t&l + teltjie t@lki + @) tel (o t@l // hartelose/besluiteloos/gedagtelose + wa) tert t@rt + &) tert t&rt + &) tertjie t@rki + @) ter (tyd t@r // mettertyd/pinkstertyd/toentertyd + + _) toege (@P5 t'ux2@ + + _) tege (CA t@x2@ // tegemoet/tegemoetkom/tegemoetkomende/tegemoetgekom/tegelyk + _) terug (@P5 t@-r'Wx2 + _) terugge (@P7 t@-r'Wx2@ + teruggee (+ t@r'Wx2e@ // see rule: _) terugge (@P7 t@-r'Wx2@ + @) tele (_ t'e@l@ + + tenis t@nIs + tennis t'En@s // tennisafrigter/tennisarm + tera (pA tEra' // terapie/terapeutterapeuties + _) tereg t@r&x2 // teregwysing/teregstelling/tereghelp/tereg + _) tever (@ t@f@r + tevrede t@fr'e@d@ + as) terende (_ t'e@r@nd@ //kontrasterende + ek) terende (_ t'e@r@nd@ //reflekterende respekterende + + n) terende (_ t'e@r@nd@ //konfronterende mensonterende + pe) terende (_ t'e@r@nd@ //kompeterende + i) terende (_ t'e@r@nd@ //presipiterende moniterende + ul) terende (_ t'e@r@nd@ //konsulterende resulterende + ver) terende (_ t'e@r@nd@ //verterende in compounds + + @) tion (_ _^_EN //words ending in tion is English + @) tions (_ _^_EN //words ending in tions is English + toegank t%ux2'aNk // toeganklik/heid + toereike t%ureIk@ // toereikend/heid + toereken (b t%ur'e@k@n // ontoerekenbaar/heid/ontoerekenbaarheid + toneel t%une@l + toege (wing t'ux2e@ // exception to _) toege (@P5 tux2@ + toer (@ t%ur // move default stress: toeris/-te/compounds of toernooi + toere tu:r@ // restore default stress + toe (vallig t%u // exception to default stress rule + tra (dis tr%a// shorten and unstress 1st slb: tradisie/tradisioneel + trag (ed tr%ax2 // move default stress: tragedie and compounds + traw (a trav' // trawant/e/trawal + &) treding tre@d@N // betreding/uittreding + @) treer tr'e@r // this slb always takes stress; many words + + trek tr&k + trekker tr&k@r // voortrekkerleier/Voortrekkerstraat/salaristrekkersvergadering + @) trise (_ tr'is@ // aktrise and similar + tro (tseer tr%O // stress: trotseer/getrotseer + tro (tsering tr%O // move default stress + tuimel tYym@l // tuimelend/tuimelaar/tuimelraam and compounds + tussen tWs@n // tussenin/tussenbeide/tussenganger + tuur t'yr + @) ty (dig t'eI // gelyktydig/vroegtydig + + +.group u + u y + u (C W + u (CA y + uu y + ui Yy + uy Yy + + uit (bund %Yyt // move default stress: uitbundig and derivitives + uit (druk %Yyt // move default stress + uit (druk_N Yyt + uit (drukking_ Yyt // but default stress: + uit (drukkings Yyt // and compounds starting with uitdrukkings + uitgee (+ 'Yytx2e@ // se rule: _) uitge (@P5 Yytx2@ + uitstaande %YytstA:nd@ // move default stress + uit (steken %Yyt // move default stress + uit (spatt %Yyt // move default stress + _) uitge (@P5 'Yytx2@ // words beginning with uitge have stress on 1st slb + uitgewer 'Yytx2,e@v@r + uitgewerk Yytx2@v&rk // uitgewerk and derivitives; see rule: uitgewer + C) uiwer (A Yyv@r // huiwerend/suiweringsaanleg and similar compounds + u (ra %y // uraan and compounds/uranus + urine %yrin@ // urine and compounds + urineer yrin'e@r // stress to end + utjie Yyci + universiteit yniv&rsit'eIt + C) uwelik 'yv@l@k // gruwelik/huwelik/afskuwelik + m) u (skiet %W //change stress for muskiet compounds + n) uwe (C yv@ // nuwelinge/nuwemaan + n) uw yv // nuwigheid/nuwighede + r) uwe (C yv@ // gruweldaad/-rolprent/-verhaal.../struweling + + +.group v + v f + v (v + @) vaardig f'A:rd@x2 // diensvaardig/hulpvaardig/onboetvaardig/strydvaardig + uit) vaardig fA:rd@x2 // but uitvaardig + vakansie f@k'ansi + vangen f'aN@n // gevangene/gevangenis/bevangenheid + van (pas f%an // fix stress: onvanpas/-te + @) ve (_ _^_EN //words ending in ve is English + A) ves (_ _^_EN // words ending in ves after vowel are English + + ve (l f& // maagvel, stress on 1st slb + @) vel (A fe@l // aanbeveling/aanbevelingsbrief + vele f'e@l@ + ven (ster fe~n // nasalise + ven (yn f@n // venyn/venynig + ver f@r + _) ver (@P3 f@r + verant (w f@r%ant // (on)verantwoordelik/-heid/verantwoording + verende f'e@r@nd@ + verer (ing f@r_e@r // verering and compounds ending with verering, eg. heldeverering + vergete f@rx2'e@t@ // vergeterig/vergetelheid + vering f'e@r@N //motivering preservering etc. + @C) vers (_ f&rs // teksvers/slotvers/kindervers and similar + @C) vers (e_ f&rs // plurals of words like the above + ver (sie_ f&:r //words ending in versie + ver (sies_ f&:r //words ending in versies + ver (fris f@r // verfris and derivitives; see rule: verf (C f&rf + verfyn f@rf'eIn + verf (@ f&rf // verfkwas/-voorraad/-emmer and similar + verf f'&rf + _) vergesog f'&:r;x2@sOx2 + veronderste (l f@rOn@rst'& // stress: veronderstel/-ling + _) verse (b f'&:rs@ + C) verse (_ f&rs@ + A) verse (_ v'&rs@ + _) veronge (@P7 f@r'O:Nx2@ + verbete f@rb'e@t@ // verbete/verbetenheid + verte (l f@rt& // oorvertelling/rondvertel and similar + ver (velA f@r // vervelig/verveling (see: _) ver (@P3 f@r + video v'idi;u //video and compounds + + ville _^_EN + vinger f'IN@r // numerous compounds with vinger + vis (A fIs // visarend/walvisolie + vise (C f'isi // visevoorsitter/visesekretaris + ad) vis (e@ fis' // v and i sounds: adviseer/adviserend/-e + A) vis (e@ vis' // v and i sounds: improviseer/reviseer/improviserend + vis (ie vis // v and i sounds: visie/televisie + vis (uA v%iZ //visuele, visueel etc. + vis (um vis // v and i sounds: visum + + _) vasge (@P5 f'asx2@ + @) voerig f'ur@x2 // breedvoerig/uitvoeriger + volke f'Olk@ // volke/-re: exception to: vo (lC f%O + volk (ing fOlk // bevolking: exception to: vo (lC f%O + volk (s fOlk // volksliedere/volksbeweging/volksleier and similar + vo (lle_ fO // exception to: vo (lC f%O + vo (ller fO // exception to: vo (lC f%O + vol (hou_ fOl // exception to: vo (lC f%O + vol (maan fOl // exception to: vo (lC f%O + vol (ste_ fOl // exception to: vo (lC f%O + volop f'Ol_Op // volop/volopbetaalde + volwasse fOlv'as@ // (on)volwassene/s/(on)volwassenheid + vo (lC f%O // volledig/volmaakte/voltooi + vol (g fOl // volgeling/volgende/volgorde + voren f'o@r@n // alvorens/vorendag/vorentoe + voorbar fo@rb'A:r // move default stress: voorbarig and derivitives + _) voorbe (@P6 f'o@rb@ + _) voor (bee+ fo@r // voorbeeld + + _) voorge (@P6 f'o@rx2@ + voorspe (l fo@rsp'& // voorspel/voorspelling/voorspelbaar/onvoorspelbaar + voort (v@@ f%o@rt // voortvarend/voortvlugtige + _) vooruit fo@r'Yyt // vooruit/vooruitsig/vooruitbeplanning + vooruit (strew fo@rYyt' // change stress + vorm f'Or@m + vreemde fr'e@md@ // vreemde/s/vreemdeling + vriendi (n frind'I // vriendin/vriendinne/vriendinnetjies + vrygewig freIx2'e@v@x2 // vrygewig/-e|-heid + vry (wil fr%eI // vrywillig/-lik|-heid + vuldig f'Wld@x2 // sorgvuldig/veelvuldig/vermenigvuldig and variants + + + +.group w + w v + w (w + d) w w + k) w w + s) w w + ens) w v + weer (lê v%e@r // move default stress + weer (leg w%e@r // move default stress: (on)weerlegbaar + @) weg (_ v&x2 // blindweg/botweg and many similar + w (ese_ v //words ending in wese + t) w w + it) w v // inkuitwisser/witwyn/uitwoed/witwatersrand + @) wa (_ vA: // words ending in -wa: afleweringswa + @) w (aen v // strydwaens/afleweringswaentjie + @s) w (And v // kranswand/kuswind/meswond + @s) w (An_ v // plurals of the above in -de: de treate + @s) ware vA:r@ // kruideniersware/bronsware/glasware/kombuisware + bes) ware wA:r@ // geloofsbesware/gewetensbesware + @) wekkend v'Ek@nt // stress on wekkend at end compounds + @) wekkende v'Ek@nd@ // stress on wekkende at end compounds + _) we (ll@@ v%& // wellewend/welluidend/wellustig, but wellig/wellus + _) wel (r v%&l // move default stress: (on)welriekend + _) wel (v v%&l // stress (on)welvoeglik/-e/-heid/welvarend + wel (vaart v&l // restore default stress + wel (wil v%&l // move default stress: welwillend/-e + _) wen (aC vEn? // wenas/wenakker/opwenaksie + ne) wens v@ns // newens/benewens/hierbenewens/daarbenewens + + waardeer vard'e@r // waardeer/waardeerder + waarder (@ vard'e@r // waarderend/e/waardering + &) waardig v'A:rd@x2 // stress on -waardig: merkwaardig/besienswaardigheid, etc. + s) wed (C vEt // toetswedstryd/tenniswedstryd/afloswedloop + s) wedd (@ vEd // beroepswedder + wedywer vEteIv@r // pronunc. of d and e-sound in derivitives + weer (hou w%e@r // exception to default stress rule + weer (spre ve@r' // weerspreek/weersprekende/weerspreking + weer (staan v%e@r // weerstaan/onweerstaanbaar + werp v&rp + @) wesigheid v'e@s@x2eIt // aanwesigheid/afwesigheid + weten (C ve@t@n // wetenskap/-lik/-e and compounds/compounds of geweten- + wêrel (d v'&:r@l + wiking vikiN // fix i sounds + + wn _^_EN // names containing town/Brackendowns/Brown + worth _^_EN + wood _^_EN + @) ws (_N _^_EN + @) w (_N _^_EN + @) werste vIrst@ + wolke vOlk@ // nimbuswolke/wolkekrabber + woorde vo@rd@ + + nt) w (A v + +.group x + x ks + x (x + +.group y + y eI + +.group z + z z + z (z + + +.group + ə @ // char.replacement for 'n + _C) è (_ E // dè/nè + + ê e: + ê (r &: + ®e 3: + ge) ë (rf & // oorgeëf/-de + ïgnoreer ix2nur'e@r // geïgnoreer + ï (n @ // geïnteresseerd + be) ï (nC 'I // beïndruk/beïnvloed + ïsol %is%ul // geïsoleer/-d + ô O: + ûe W@ // brûe/rû + +// punctuation + ! _:eItrup_: + !) ! + $ dOl@r + % p@rs'Ent + & _|amp&rsant + £ p@Unt + € Y@ru + / stre@p + @ beI_: + \\ trystre@p + +// punctuation, but don't speak multiple occurrances + = _:x2@l'eIk_: + = (== + =) = (= + ==) = (_ _:: + + * st&r + *) * (* + ** + **) * (_ _:: + + + plus + _) ++ (_ pluspl'us + \+\+\+) + // ignore + after the first 3 + + __) - (_D minWs + A_) - (_D _ + C_) - (_D _ + --) - + + . pWnt + . (. _: + \.) . + diff --git a/dictsource/cs_list b/dictsource/cs_list new file mode 100644 index 00000000..9595a24e --- /dev/null +++ b/dictsource/cs_list @@ -0,0 +1,381 @@ + // translation rules for Czech +// This file is UTF-8 encoded + +// Letters +_a a: +á dl'oUhe:,a: +b be: +c tse: +č tSe: +ch xa: +d de: +ď Je: +e e: +é dl'oUhe:,e: +ě ije +f ef +g ge: +h ha: +_i i: +í dl'oUhe:,i: +j je: +_k ka: +l el +ľ el^ +ĺ dl'oUhe:,el +m em +n en +ň en^ +_o o: +ó dl'oUhe:,o: +ô uo: +p pe: +q kve: +r er +ř eR +_s es +š eS +t te: +ť ce: +u u: +ú dl'oUhe:,u: +ů 'u:s_k@-r'oUZkem +_v ve: +w dv'ojve: +x iks +y ipsilon +ý dl'oUe:,ipsilon +_z zet +ž Zet + +: dv'ojtetSka +% p@-*otsento ++ plus +€ eU*o +@ zavina:tS +& ampr-sent +# gRi:Zek +/ lomeno +\\ beksleS +! vigRitSn^i:k +° stupen^ +× kra:t +÷ Jeleno +§ pa*ag@-*af +~ tilda +^ zdRi:Ska +© k'opi*ajt + +_$ dola:r +_' apost@-*of +_" uvozovki +_, tSa:rka +_- mi:nus +_; zdRedn^i:k +_= rovno +_* hvjezJitSka +_? otazn^i:k +__ pottr-Zen^i: +_` 'ob@-*a:ts,ena:||tS'a:rka +_( za:vorka +_) za:vorkazavRi:t +_[ h@-*'anata:||z'a:vorka +_] h@-*'anata:||z'avRi:t +_{ sl'oZena:||z'a:vorka +_} sl'oZena:||z'avRi:t +_< menSi: +_> vjetSi: +_| sv'isla:||tS'a:*a +_?? simbol +_?A znak + + +// Numbers +_0 n'ula +_1 j'eden +_2 dv'a +_2f dvj'e +_3 tRi +_4 tSt'iRi +_5 p'jet +_6 S'est +_7 s'edum +_8 'osum +_9 d'evjet +_10 d'eset +_11 j'edena:tst +_12 dv'ana:tst +_13 tR'ina:tst +_14 tSt'r-na:tst +_15 p'atna:tst +_16 S'estna:tst +_17 s'edumna:tst +_18 'osumna:tst +_19 d'evatena:tst +_2X dv'atset +_3X tR'itset +_4X tSt'iRitset +_5X p'adesa:t +_6X S'edesa:t +_7X s'edumdesa:t +_8X 'osumdesa:t +_9X d'evadesa:t +_0C s'et +_1C st'o +_2C dvj'esc'e +_3C tR'ist'a +_4C tStiRist'a + +_1M1 c'isi:ts +_0MA1 c'isi:tse +_0M1 c'isi:ts + +_1M2 m'ilio:n +_0MA2 m'ilio:ni +_0M2 m'ilio:nu: + +_1M3 m'iliarda +_0MA3 m'iliardi +_0M3 m'iliard + +_1M4 b'ilio:n +_0MA4 b'ilio:ni +_0M4 b'ilio:nu: + +_dpt _:tSa:rka_ +_. tetSka + + +// Pronouns +mi $u +ti $u +se $u +si $u + + +// Prepositions +skrz $u $brk $alt2 // though +skrze $u $pause // through +pro $u $pause $alt2 // for +na $u $brk $alt2 // to/for/on +o $u $pause $alt2 // around/about +při $u $pause $alt2 // into,in,around +v v_ $brk // in +po $u $pause $alt2 // after,around +za $u $pause $alt2 // behind +před $u $pause $alt2 // in front of +mezi $pause // between +pod $u $pause $alt2 // below +pode $u $pause // below +s s_ $pause // with +nad $u $pause $alt2 // above +nade $u $pause // above + +k $brk // towards +proti $u $pause // against +díky $pause // thanks to +naproti $pause // opposite + +během $pause // during +podle $pause // according to +dle $u $pause $alt2 // along +vedle $pause // beside +kolem $pause // around +okolo $pause // around +do $u $brk $alt2 // to +od $u $brk $alt2 // away from +ode $u $brk // away from +z s_ $brk // out of/from +ze $u $brk $alt2 // out of/from +bez $pause $alt2 // without +beze $pause // without +místo $pause // instead of + +i $u $brk // ??? + +// Conjunctions +a $u $pause // and +nebo $u $pause // or +však $pause // but +krom $pause // except +ale $pause // however +ač $pause // although +leč $pause // unless +sice $pause // although +že $u $pause // if,that +mimo $pause // except +což $pause // which +ani $pause // neither,nor + +// Negative + + +// Auxillary verbs +být $u // to be +jsem $u // am +jsi $u +je $u +jsme $u +jste $u +jsou $u + +byl $u // (past participle) +byla $u +bylo $u +byli $u +byly $u + + +budu $u // (future) +budeš $u +bude $u +budeme $u +budete $u +budou $u + +bych $u // (conditional) +bys $u +by $u +bychom $u +byste $u +by $u + +mám $u+ // have +máš $u+ +má $u+ +máme $u+ +máte $u+ +mají $u+ +měl $u+ + +chci $u+ // want +chceš $u+ +chce $u+ +chceme $u+ +chcete $u+ +chtějí $u+ + +// treat as letters if at the end of the clause +a a: $atend // letter-a +i i: $atend // letter-i +k ka: $atend // letter-k +o o: $atend // letter-o +s es $atend +v ve: $atend +z zet $atend + + +// Abbreviations +// if a word has no vowels (or "r") then it will +// automatically be spoken as individual letters +arc $abbrev +arj $abbrev +atd $abbrev +bes $abbrev +blr $abbrev +cab $abbrev +cga $abbrev +cm tsentimetr- +crd $abbrev +ča $abbrev +čav $abbrev +čla $abbrev +člr $abbrev +čr $abbrev +čsad $abbrev +čsfr $abbrev +čsr $abbrev +čssr $abbrev +čvut $abbrev +dcl detsilitr- +dpi $abbrev +drv $abbrev +dta $abbrev +eeg $abbrev +ekg $abbrev +esc iskeip +etf $abbrev +kb kilobajt +ghz gigaherts +gn gigan^utn +gpa $abbrev +gw gigavat +(http ://) ha:tetepe: +hz herts +ibm $abbrev +ip $abbrev +khz kiloherts +kldr $abbrev +km kilometr- +kn kilon^utn +kpa $abbrev +kw kilovat +mhz megaherts +mkr $abbrev +mlr $abbrev +mpa $abbrev +ndr $abbrev +nsr $abbrev +ocr $abbrev +ods $abbrev +ohc $abbrev +ohv $abbrev +okd $abbrev +om $abbrev +osn $abbrev +ozv $abbrev +pci $abbrev +pdr $abbrev +pgdn peIdZdaUn +pgup peIdZap +plr $abbrev +prm $abbrev +rc $abbrev +rlc $abbrev +rlr $abbrev +rs $abbrev +rx $abbrev +scsi $abbrev +sr $abbrev +ssr $abbrev +sssr $abbrev +stva $abbrev +trm $abbrev +ufz $abbrev +uhf $abbrev +ukv $abbrev +usa $abbrev +uvf $abbrev +vga $abbrev +wgpo $abbrev +wri $abbrev +www veveve: + + +// Exceptions + +antoni antoni +ascii aski +balistika balistika +cancel kensl- +(caps lock) kapslok +change tSeIndZ +delete dili:t +down daUn +exchange ikstSeIndZ +home hoUm +insert inzert +lazer leIzr- +newton n^u:tn +num nam +outlook aUtlu:k +page peIdZ +power paUr- +scroll skro:l +search sertS +size sajz +this Dis +unie unije +untitled antitl- +up ap + diff --git a/dictsource/cs_rules b/dictsource/cs_rules new file mode 100644 index 00000000..898f58d8 --- /dev/null +++ b/dictsource/cs_rules @@ -0,0 +1,643 @@ +// translation rules for Czech +// This file is UTF-8 encoded + +.group a + a a + au aU + + m) ai (l eI + p) age eIdZ + p) aste (_ eIst + tr) ack ek + + +.group á + á a: + +.group ä + ä e + +.group b + b b + b (_ p + b (_G b + bě bje + + back bek + basic beIzik + board bo:rd + + +.group c + c ts + ch x + + _) c (al k + _) c (lau k + _) c (om k + _) c (or k + _) creati kreati + _ma) c (r k + _pa) ck (a k + re) cogni (t kogni + _s) ca (n ke + _s) c (o k + cover kavr- + c (us k + lo) ck k + pa) ck k + pas) c (al k + re) c (o k + ctrl kont@-*ol + + +.group č + č tS + +.group d + d d + d (_ t + d (_G d + d (ě J + d (i J + d (í J + d (iT d // word has $alt attribute + d (íT d + dz dz + dz (_ ts + dz (_G dz + dž dZ + dž (_ tS + dž (_G dZ + + +.group di + di (a di + di (e_ dij + di (e di + di (gi di + di (j di + di (k di + di (o di + di (r di + di (u di + di (scip di + diskredi disk@-*edi + di (sk di + di (sp di + disti (c disti + di (st di + _au) di di + _) di (a dij + _) di (á di + _) di (ch di + _) dick dik + _) di (f di + _) di (g di + _) di (let di + _) di (me di + _) di (mi di + _) di (p di + _) di (rc Ji + _) di (rk Ji + _) disco disko + _) di (s di + _) di (van di + _) di (ver di + _) di (vid di + _) di (vizna Ji + _) di (vizny Ji + _) di (z di + cho) di (s Ji + _e) di di + _expe) di di + _gla) di di + _hle) di Ji + _kar) di di + _mo) di di + _ne) di (p di + _o) di (nst di + _pol) di di + _sar) di di + _scan) di di + _tra) di di + a) di (k di + an) di (d di + dar) di (z di + eto) di di + di (a_ di + di (e_ dij + di (i_ dij + di (o_ dij + di (u_ dij + di (nik di + di (sm di + di (st di + di (tik di + di (um_ di + in) di di + ko) di (fi di + kre) di (t di + la) di (s di + man) di (t di + me) di di + mé) di di + mě) di di + mi) di di + n) di (c di + o) di (c di + or) di di + ral) di di + ře) di (sk Ji + rio) di (c di + tope) di (c di + tra) di (c di + + +.group ď + ď J + ď (_ c + ď (_G J + +.group e + e e + ej (K eI + eu eU + + k) ey i: + + +.group é + é e: + +.group ě + ě e + +.group f + f f + fě fje + +.group g + g g + g (_ k + g (_G g + + +.group h + h h + h (_ x + h (_G h + +.group i + i i + ia %ia + ie %ie + iu %iu + + ia (_ ia + ie (_ ije + ii (_ iji + io (_ ijo + iu (_ ijo + _) i (on j + + ight ajt // right, night + + +.group í + í i: + +.group j + j j + +.group k + k k + kk k + +.group l + l l + ll l + K) l (K l- + + _) laser leIzr + + +.group ľ + ľ l^ + +.group m + m m + mě mn^e + + _) manager menedZr- + _) message mesidZ + _) mic (ro majk + + +.group n + n n + nn n + n (g N + n (k N + n (ě n^ + n (i n^ + n (í n^ + n (iT n // word has $alt attribute + n (íT n + + new n^u: + + +.group ni + _a) ni (m ni +anorga) ni ni + _bota) ni ni + _bro) ni n^i + _cy) ni ni + _ebo) ni ni + _et) ni (c ni +_galva) ni ni + _huma) ni ni +_hygie) ni ni + _imu) ni (t ni + _ka) ni (b ni + _kolo) ni ni +_mícha) ni n^i + _mo) ni ni + _mu) ni ni + _na) ni (tr ni + _) nikoti nikoti + _) ni (l ni + _) ni (tro ni + _) ni (tro_ n^i + _orga) ni ni + _pa) ni (ck ni + _sa) ni (t ni + _se) ni (l ni + _te) ni (s ni + _tré) ni ni + _u) ni ni + ale) ni (t ni + a) ni (d ni + a) ni (kov ni + a) ni (k ni + a) ni (z ni + cha) ni (c ni + cha) ni (k ni + či) ni (t n^i + do) ni (c ni + echa) ni (s ni + efi) ni ni + ele) ni (t ni + endro) ni ni + e) ni (k ni + e) ni (s ni + eremo) ni ni + erma) ni ni + fi) niti niti + fo) ni (c ni + ge) ni ni + gé) ni ni + g) ni (t ni + go) ni ni + harmo) ni ni + i) ni (k ni + ni (a_ ni + ni (e_ nij + ni (i_ nij + ni (o_ nij + ni (u_ nij + ni (nik ni + ni (sm ni + ni (st ni + ni (tik ni + ni (um_ ni + i) ni (ci ni + i) ni (t ni + _hli) ni (t n^i + iro) ni ni + kli) ni ni + k) ni (p ni + komu) ni ni + kto) ni ni + loud) ni n^i + ma) ni (f ni + ma) ni (p ni + mi) ni ni + mu) ni (k ni + mu) ni (s ni + námoř) ni n^i + na) ni (s ni + ni (ak ni + ni (í nij + ni (kl ni + ni (zuj ni + no) ni (m ni + o) ni (d ni + o) ni (k ni + o) ni (s ni + pod) ni (k n^i + pro) ni (k n^i + ro) ni (c ni + stoj) ni n^i + tago) ni (s ni + tu) ni (s ni + u) ni (k n^i + u) ni (t ni + vi) ni (t n^i + v) ni (kl n^i + vz) ni (k n^i + za) ni (k n^i + ze) ni (t ni + + +.group ň + ň n^ + +.group o + o o + ou oU + + v) oice ojs + t) oo (l u: + gr) ou (p u: + _wind) ow oU + + +.group ó + ó o: + +.group ô + ô uo + +.group p + p p + pp (A_ p + pě pje + +.group q + q k + qu kv + +.group r + r r + A) r (A * + C) r (A @-* + rr *r + K) r (K r- + + right rajt + + +.group ř + ř R + +.group s + s s + ss (_ s + ss (A_ s + + scape skeIp + _) sch S + shift Sift + _pre) s (id z + selec (t silek + space speIs + e) s (id z + + +.group š + š S + +.group t + t t + tt (_ t + tt (A_ t + t (ě c + t (i c + t (í c + t (iT t // word has $alt attribute + t (íT t + +.group ti + _an) ti ti +_atlan) ti ti + _bes) ti ti + _cen) ti ti + _dese) ti ci +_dvace) ti ci +_eklip) ti ti + _flo) ti ti + _ins) ti ti + _jus) ti ti + _kons) ti ti + _kon) ti (n ti +_kosme) ti ti + _ky) ti (c ci + _ma) ti (n ci + _mul) ti ti + _op) ti (c ti +_pales) ti ti + _pe) ti (č ti + _pla) ti (n ti + _posi) ti ti +_preven) ti ti + _pro) ti ci + _res) ti (t ti + _ru) ti ti + _sa) ti (r ti + _sa) ti (ř ti + _sen) ti ti + _sta) tisti tisti +_stras) ti ci + _tě) ti ci + _téma) ti ti + _) ti (b ti + _) ti (ci ti + _) ti (mb ti + _) time tajm + time (_ tajm + _) ti (nk ti + _) ti (ran ti + _) ti (tan ti + _) ti (tán ti + _) ti (tul ti + _) ti (x ti + _ver) ti (k ti + ak) ti ti + ama) ti (c ti + ama) ti (k ti + an) ti (k ti + an) ti (l ti + an) ti (s ti + apa) ti (c ti + apa) ti (č ti + ap) ti (v ci + arke) ti (ng ti + aroma) ti ti + a) ti (c ti + a) ti (k ti + a) ti (n ti + a) tisti tisti + a) ti (v ti + a) ti (z ti + au) ti ti + ás) ti (c ci + bo) ti (z ti + cha) ti (c ci + c) ti ci + desá) ti ci + des) ti (l ti + dos) ti ci + drama) ti ti + dr) ti ci + ek) ti ti + ema) ti (c ti + ema) ti (k ti + en) ti (n ti + eore) ti (c ti + ep) ti (k ti + ero) ti (c ti + e) ti (c ti + e) ti (k ti + e) ti (v ti + e) ti (z ti + eví) ti ci + ě) ti (c ci + gi) ti (m ti + i) ti (k ti + ti (a_ ti + ti (e_ tij + ti (i_ tij + ti (o_ tij + ti (u_ tij + ti (nik ti + ti (sm ti + ti (st ti + ti (tik ti + ti (um_ ti + hos) ti ci + in) ti (m ti + nves) ti ti + kon) ti ti + kos) ti (c ci + kri) ti ti + k) ti (v ti + la) ti (n ci + lech) ti ci + li) ti (c ti + ma) ti (ck ti + ma) ti (c ci + ma) ti (ka ti + mo) ti (v ti + ms) ti ci + ne) ti (c ti + n) ti (c ti + n) ti (n ti + ompa) ti (b ti + op) ti ti + or) ti (m ti + os) ti (c ti + o) ti (k ti + pě) ti ci + ple) ti ci + ře) ti (c ci + řice) ti ci + rimi) ti (v ti + ri) ti (c ti + ri) ti (k ti + rk) ti ti + ro) ti (k ti + ro) ti (v ci + r) ti (z ti + rvi) ti ti + šes) ti ci + s) ti (k ti + s) ti (mul ti + s) ti (p ti + suges) ti ti + ti (ck ti + ti (f ti + timoni (t timoni + tini (u tinij + ti (tul ti + toma) ti (c ti + uma) ti (c ti + u) ti (k ti + vani) ti (t ti + ven) ti (l ti + vě) ti (v ci + xo) ti (k ti + x) ti (l ti + ympa) ti ti + ý) ti (ck ti +_flegma) ti ti + _ul) ti (m ti + _abs) ti ti + kul) ti (v ti + + +.group ť + ť c + +.group u + u u + +.group ú + ú u: + +.group ů + ů u: + +.group v + v v + vě vje + +.group w + w v + wave veIf + +.group x + x ks + e) xoti (c gzoti + +.group y + y i + y (í ij + +.group ý + ý i: + +.group z + z z + z (_ s + z (_G z + +.group ž + ž Z + ž (_ S + ž (_G Z + +.group + ä e + ë e + ĺ l- + ö e: + ŕ r- + ü i + + $ dola:r + + . tetSka + . (. _: + \.) . + + __) - (_D mi:nus + A_) - (_D _ + C_) - (_D _ + --) - + + * hvj'ezJitSka + *) * (* + ** + **) * (_ _:: diff --git a/dictsource/cy_list b/dictsource/cy_list new file mode 100644 index 00000000..e1eb1acc --- /dev/null +++ b/dictsource/cy_list @@ -0,0 +1,224 @@ + +// Letters +// If a letter has a "word" pronunciation which is different from its +// "letter" name, then include the letter name here, with the letter +// prefixed by a _ character. +_a A: +_e e: +_I i: +_o o: +_y V + + +// numbers +_0 n'Ul +_1 'Yn +_2 d'aY +_3 tr'i: +_4 p'Edwar +_5 p'Ymp +_6 xw'e:C +_7 s'aIT +_8 w'YT +_9 n'aU +_1X d'e:g +_2X d'aYD,e:g +_3X tr'i:D,e:g +_4X p'EdwarD,e:g +_5X p'YmD,e:g +_6X xw'e:D,e:g +_7X s'aITD,e:g +_8X w'YTD,e:g +_9X n'aUD,e:g +_0C k'ant +_2C d'aYg,ant +_3C tr'i:x,ant +_0M1 m'i:l_ +_1M1 m'i:l_ // no '1' before thousand +_0M2 m'i:lIun_ +_0M3 b'i:lIun_ +_dpt puYnt + + +// articles +y @ +yr @r + +// conjunctions +a %a $pause // and +ac $u $pause // and +os $u $pause // if +er $u $pause // although +achos $pause // because +felly $pause // so, therefore +mor $pause // as,so +neu $pause // or(not) +oherwydd $pause // because +ond $pause // but +petai $pause // if it were +sy $u $pause // which is +sydd $u $pause // which are + +// prepositions +//yn @n // in (cy_rules) +ym @ // in (+nasal word) +yng @ // in (+nasal word) +ynddi $u+ // in it (f) +ynddo $u+ // in it (m) + +o _%o: // of,from,out of +(o hyd) o:h'y:d $pause // until +â _%A: // with +am _%am // for +ar _%ar // on +at _%at // to,towards +ap _%ap +gan $u+ // by,with,from +mewn $u+ // in(a) +tu $u+ +wrth $u $pause $strend // by,with,while + +heb $u // without,not +gyda $u+ // with +ers $u $pause $strend // since +cyn $u $pause $strend // before,as +nes $pause $strend // until +tan $pause $strend // until +dan $pause $strend // until,under + +agos _A:gOs $u+ // near +blaen $u+ // in front of +ôl _%o:l $strend // behind +rhwng $u+ // between +dan $u+ // under +dros $u+ // over,for,on behalf of +//draws // across +drwy $u+ // through +erbyn $u+ // by, against +ymhen $pause $strend // within + + +// pronouns +i %I +ti %ti: +e %E +hi %hi: +ni %ni: +chi %xi: +nhw %nhu: + +hon $u+ // this one (f) +honna $u+ // that one (f) +hwn $u+ // this one (m) +hwnna $u+ // that one (m) +hwnnw $u+ // that one (m) +hyn $u+ // this, these +hynny $u+ // that, those + +rhain $u+ // these +rheina $u+ // those +rheini $u+ // those + +taw $u+ // that + +mai $u+ // that +Mai $capital // May: month + +'na $u+ // that +yna $u+ // that + +'ma $u+ // this +yma $u+ // this + +// possessives +fy $u // my +ei $u // his, her +ein $u // our +eu $u // their + +// questions +shwd $u $pause $strend // how +sud $u $pause $strend // how + +// adverbs etc. +fel $u // like,as +na $u // than +nag $u // than +//bron // almost +//cwbl // all +pob $u // each +rhywfaint $u // some (amount) +rhywrai $u // some (pl) +unrhyw $u // any + +// verbs +yn @n +wedi $u // perfect tense +fe $u+ // positive marker + +bod $u // to be +rydw $u +rwyt $u +mae $u +mae $u +rydyn $u +rydych $u +maen $u + +dwy $u // to be, contractions +dan $u +dach $u +rwy $u +ryn $u +rych $u + +roedd $u // was + +fod $u + +oes $u // is there? +yw %Yu // is,are + +dyma $u // here is +dyna $u // there is, that's + +cael $u+ // to get,have +ga $u+ + +gafodd $u+ // past +gawson $u+ +gawsoch $u+ +gas $u+ +geson $u+ +gesoch $u+ + + +gallu $u // can, to be able to +alla $u +alli $u +all $u +allwn $u +allwch $u +allan $u +galla $u +galli $u +gall $u +gallwn $u +gallwch $u +gallan $u + +//gorfod // must, to have to +//gorffod + +gwneud $u+ // to do, make +neud $u+ // to do, make + +//myna // to go + + +bangor baNgOr +cymraeg kVmr'AYg +ysbryd $2 + +Hughes hIu:s +Jones dZo:ns diff --git a/dictsource/cy_rules b/dictsource/cy_rules new file mode 100644 index 00000000..a3247012 --- /dev/null +++ b/dictsource/cy_rules @@ -0,0 +1,286 @@ +// translation rules for Welsh language +// This file is UTF-8 encoded + +.group a + _) a (_ A: + a A: + a (C a + a (CC a + aa A: + + a (b A: + a (d A: + a (g A: + a (ch A: + a (th A: + a (ff A: + a (s A: + a (f A: + a (dd A: + + ae AY + ai aI + au aY + @) au (_ a + aw (+ aU + + +.group b + _) b (_ bi: + b b + +.group c + _) c (_ Ek + _) ch (_ Ex + c k + ch x + e) ch C + i) ch C + u) ch C + + _) cwn kUm + + +.group d + _) d (_ di: + _) dd (_ ED + d d + dd D + +.group e + _) e (_ e: + e e: + e (C E + e (CC E + ee e: + e (b e: + e (d e: + e (g e: + e (ch e: + e (th e: + e (ff e: + e (s e: + e (f e: + e (dd e: + + ei @I + ey @I + eu @Y + ew (+ eU + e (wA E + +.group f + _) f (_ Ev + _) ff (_ Ef + f v + ff f + +.group g + _) g (_ Eg + g g + gwl gw@-l + gwn gw@-n + +.group h + _) h (_ hA: + h h + +.group i + _) i (_ i: + i i: + i (C I + i (CC I + ii i: + i (b i: + i (d i: + i (g i: + i (ch i: + i (th i: + i (ff i: + i (s i: + i (f i: + i (dd i: + i (l i: + i (n i: + i (r i: + + i (A j + iw (+ Iu + +.group j + _) j (_ dZV + j dZ + +.group k + _) k (_ kV + k k + +.group l + _) l (_ El + _) ll (_ EL + l l + ll L + + _) llan Lan + + +.group m + _) m (_ Em + m m + +.group n + _) n (_ En + _) ng (_ EN + n n + ng N + +.group o + _) o (_ o: + o o: + o (C O + o (CC O + oo o: + + o (b o: + o (d o: + o (g o: + o (ch o: + o (th o: + o (ff o: + o (s o: + o (f o: + o (dd o: + + oe OY + oi OI + ou OY + +.group p + _) p (_ pi: + _) ph (_ fi: + p p + ph f + +.group q + _) q (_ kwA: + q k + qu kw + +.group r + _) r (_ Er + _) rh (_ hro: + r r + rh hr + +.group s + _) s (_ Es + s s + si (A S + +.group t + _) t (_ ti: + _) th (_ ET + t t + th T + +.group u + _) u (_ ,Ib'EdOl // ??? + u y: + u (C Y + u (CC Y + uu y: + + u (b y: + u (g y: + u (d y: + u (ch y: + u (th y: + u (ff y: + u (s y: + u (f y: + u (dd y: + u (ll y: + u (l y: + u (n y: + u (r y: + + uw (+ Yu + +.group v + _) v (_ vi: + v v + +.group w + _) w (_ u: + g) w w + w u: + &) w (K+ U + w (C U + w (CC U + ww u: + + w (b u: + w (d u: + w (g u: + w (ch u: + w (th u: + w (ff u: + w (s u: + w (f u: + w (dd u: + + w (A w + wy uY + +.group x + _) x (_ Eks + x ks + +.group y + _) y (_ V + y (@+ V + y y: + y (C Y + y (CC Y + + y (d y: + y (s y: + y (th y: + y (ch y: + y (g y: + y (dd y: + + _) y (w j + yw (+ Yu + _) yn (_ @n + _) yn (_n @ + +.group z + _) z (_ zu: + z z + +.group + â A: + ê e: + î i: + ô o: + û y: + ŵ u: + ŷ y: + + à a + è E + ì I + ò O + ù Y + ẁ U + ỳ Y + + ï i: + + 'ch (_S3 x + 'n (_S2 n + 'r (_S2 r + + . puYnt + diff --git a/dictsource/de_list b/dictsource/de_list new file mode 100644 index 00000000..1c1d9030 --- /dev/null +++ b/dictsource/de_list @@ -0,0 +1,527 @@ +// This file is UTF-8 encoded +// all words lower case + +// Uses of $alt: +// 1. Change ['i:] to [=I@] at end of word + + +// Letters +//======== +// If a letter has a "word" pronunciation which is different from its +// "letter" name, then include the letter name here, with the letter +// prefixed by a _ character. + +_. pUnkt +_, kOma + + +// Numbers +//======== +_0 'nUl +_1 _'aIn +_1a _'aIns +_2 'tsvaI +_3 'd@-*aI +_4 'fi:* +_5 'fynf +_6 'zEks +_7 'zi:b@n +_8 '_axt +_9 'nOIn +_10 'tse:n +_11 '_Elf +_12 'tsvWlf +_13 'd@-*aItse:n +_14 'fi:*tse:n +_15 'fynftse:n +_16 'zEktse:n +_17 'zi:btse:n +_18 '_axttse:n +_19 'nOIntse:n +_2X 'tsvantsIC +_3X 'd@-*aItsIC +_4X 'fi:*tsIC +_5X 'fynftsIC +_6X 'zEktsIC +_7X 'zi:btsIC +_8X '_axttsIC +_9X 'nOIntsIC +_0C 'hUnd3t +_0M1 'taUz@nt +_1M1 'taUz@nt // no '1' before thousand +_0M2 ||mIlI'o:n@n +_1M2 _'aIn@||mIlI'o:n +_0M3 ||mIlI'a*d@n +_1M3 _'aIn@||mIlI'a*d@ +_0M4 bIlI'o:n +_0and ||Unt +_dpt _kOma + +// Abbreviations +//============== +a.a.o A:A:o: +allg 'alg@maIn@n +abb 'abb,IldUN +anm 'anm,E*kUN +bd band +bde bEnd@ +bzw b@tsi:hUNsvaIz@ +chr k@-*Istu:s +dm d'OItSm,A:*k $capital $only $abbrev +dr dOkt'o:* +evtl e:vEntu:'El +od o:d3 +fr f@-*aU +frl f@-*OIlaIn +hr hE* +hrsg hE*'aUsge:b3 +inkl Inklu:s'i:v@ +km ki:lo:me:t3 +nr nUm3 +st 'Este: +usf %Untzo:f'O*t +usw %Untzo:v'aIt3 $pause +vgl fE*gl'aIC@ +z.b tsUmb'aISpi:l + + +// English words +//============== +// de_rules includes the words ending in "-ing" +access _^_EN +account _^_EN +aid _^_EN // aids +appeal _^_EN +apple _^_EN +baseball _^_EN +bbc _^_EN +beat _^_EN +browser _^_EN +byte _^_EN +camcorder _^_EN +chart _^_EN +coach _^_EN +coke _^_EN +computer _^_EN +cool _^_EN +couch _^_EN +cursor _^_EN +dj _^_EN +email _^_EN +ensemble _^_FR +event _^_EN +firewall _^_EN +foul _^_EN +foyer _^_EN +frame _^_EN +freak _^_EN +gin _^_EN +groupie _^_EN +hip _^_EN +homepage _^_EN +hooligan _^_EN +interface _^_EN +jean _^_EN +jet _^_EN +job _^_EN +joke _^_EN +joystick _^_EN +junkie _^_EN +laptop _^_EN +laser _^_EN +level _^_EN +login _^_EN +look _^_EN +macho _^_EN +mail _^_EN +message _^_EN +offline _^_EN +online _^_EN +out _^_EN +pair _^_EN +penthouse _^_EN +pidgin _^_EN +plot _^_EN +poster _^_EN +receiver _^_EN +remake _^_EN +roadie _^_EN +roastbeef _^_EN +quiz _^_EN +run _^_EN +scanner _^_EN +science _^_EN +server _^_EN +sex _^_EN +sexy _^_EN +shirt _^_EN +show _^_EN +single _^_EN +slip _^_EN +slum _^_EN +small _^_EN +snob _^_EN +song _^_EN +spam _^_EN +spirit _^_EN +squaw _^_EN +suite _^_EN +sweatshirt _^_EN +talk _^_EN +teaser _^_EN +tech _^_EN +terminal _^_EN +trip _^_EN +tuner _^_EN +unix _^_EN +window _^_EN +word _^_EN + + +// Main exceptions list +//===================== +allein $2 +andre and@-*@ // andere +anomalie $2 +akazie $alt +arie $alt +arterie $alt +außerdem aUs3de:m + +beben be:b@n +beere be:*@ +bestie bEstI@ +best bEst +beten be:t@n +bronchie $alt + +ciao tSaU +coup ku: + +dahlie $alt +deshalb $2 +dezember $2 +duett du:'Et + +direkt $2 +dritte d@-*It@ + +einander aIn'and3 +einig aInIC +endivie $alt +erde E*d@ +erst E*st + +furie $alt + +geben ge:b@n +geber ge:b3 +gegenüber ge:g@n'y:b3 +gemein g@maIn +genial ge:nI'al +geranie ge:*'A:nI@ +gessen gEs@n +geste ge:st@ +gestern gEst3n +gestrig gEst@-*IC +glorie $alt +grazie $alt + +handy handI +historie $alt +hm h@m +hostie $alt + +immobilie $alt +injurie $alt +insbesondere $3 +interess Int@*'Es + +januar janu:A:* + +kamelie $alt +kastanie $alt +kid kId +kommend kOm'End +komödie $alt +kurie $alt + +lappalie $alt +lilie $alt +linie $alt +luetisch lu:'e:tIS + +machen max@n +marginalie $alt +materie $alt +menuette mEnu:'Et +mikrofiche maIk@-*o:fIS +miteinander $1 +mitte mIt@ +mumie $alt + +oberen o:b@*@n +oboe o:bo:@ +orgie $alt +ok o:k'e: + +petersilie $alt +pinie $alt +präsident $3 +prämie $alt +problem p@-*Obl'e:m + +reliquie $alt +rupie $alt + +sagt zA:gt +selbst zElpst +serie se:*I;@ +service sE*vIs +sofort $2 +sogar $2 +soweit $2 +sowohl $2 +system z%IstEm + +tag tA:g +the D@ // English +theater te:'A:t3 +tuerei tu:*aI + +unten Unt@n + +verein fE*'aIn +vielleicht $2 +vorbei fO*b'aI + +//wahrscheinlich $2 +warum vA:*'Um + +zoom zu:m +zuerst tsu:'E*st +zudem tsu:'de:m +zurück $2 + + +// definite article +der %dE* +die %di: +das %das +den %de:n +dem %de:m +des %dEz + +derselb $2 +desselb dEss'Elb +dieselb $2 +dasselb dasz'Elb +demselb $2 +denselb $2 + +// conjunctions +und Unt $pause $u+ +aber ,A:b3 $pause $strend +oder ,o:d3 $pause $strend +sondern $pause +denn dEn $pause $u+ +weil $pause $strend +als $pause $u+ +bevor be:f'o:* $pause +also $pause $strend +wenn ,vEn $pause $strend +sowie $2 $pause + +deren ,dE*@n $brk + +// prepositions +ab ap $u+ $brk +an an $u+ $brk +am am $u+ $brk +auf aUf $u+ $brk +aus ,aUs $brk $strend +bei baI $u+ $pause $only +bis bIs $u+ $pause +da $u+ +durch $u+ $pause +für fy:* $u+ $pause +gegen ge:g@n $u+ $pause +gegend ge:g@nt +hin hIn +in In $u+ $brk +(in die) %Ind%i: +(in den) %Ind%e:n +(in der) %Ind%E* +im Im $u+ $brk +ins Ins $u+ $brk +mit mIt $u+ $pause +nach nax $u+ $brk +ob ,Ob $pause $strend $only +pro ,p@-*o: $pause +von fOn $u+ $brk +(von dem) %fOn%de:m $brk +vom fOm $u+ $brk +vor ,fO* $strend +zu tsu: $u+ $brk +zum tsUm $u+ $brk +zur tsu:* $u+ $brk +über ,yb3 $pause $strend +unter ,Unt3 $pause $strend +um Um $u+ $brk +(um die) %Umd%i: $brk +(um den) %Umd%e:m $brk +während $pause + +// misc +so zo: $u+ +doch dOx $u+ +noch $pause +(noch nicht) n'Ox||n,ICt $brk +(nicht mehr) n'ICt||,me:* +(nicht mehr) n,ICt||m'e:* $atend +(gar nicht) g,A:*n'ICt + +// should these be in the Rules because they can be a prefix in a +// compound verb ? +daran dA:*'an +darauf $2 +daraus $2 +dabei $2 +dadurch dA:d'U*x +dafür $2 +dagegen $2 +daher dA:h'Er +dahin dA:h'In +damit dA:m'It +danach $2 +daneben $2 +darein $2 +darin dA:*'In +darüber $2 +darum $2 +darunter $2 +davon dA:f'On +dazu dA:ts'u: +umher Umh'E* +umhin Umh'In +woran vo:*'an +worauf $2 +woraus $2 +worin vo:*'In + +// pronouns +ich %IC $only +du %du: $only +er %Er $brk $only +es %Ez $only +sie %zi: $only +wir %vi:* $only +ihr %i:* +man %man $only +sich %zIC $only +(es ist) %Ez%Ist + + +daß das $u+ +dass das $u+ + +ein aIn $u+ +eine ,aIn@ +einem ,aIn@m +einen ,aIn@n +einer ,aIn3 +eines ,aIn@s + +//kein $u+ +//keine $u+ + +mein $u+ +meine $u+ + +dein $u+ +deine $u+ + +sein $u // can also be verb "to be" +seine $u+ + +unsre ,Unz*@ +unsere ,Unz*@ +unser ,Unz3 +unserm ,Uns3m +unserem ,Uns@*@m + + +ihre ,i:*@ +ihrem ,i:*@m +ihrer ,i:*3 + +dies ,di:z +diese ,di:z@ + +// +was vas +wie $u $pause + +// abverbs +auch ,aUx +dann $u +etwa $u +ganz g,ants $only +je $u +nur $brk + +// verbs + +bin %bIn +bist %bIst +ist %Ist +sind %zInt +seit %zaIt $only + +gehen ge:@n $only +geht ge:t $only +gehe ge:@ $only + +habe %hA:b@ $only +habst %habst $only +hast %hast $only +hat %hat $only +haben h,A:b@n $only +hatte h,at@ $only +hatten h,at@n $only +hätte h,Et@ $only +hättest h,EtEst $only +hättet h,Et@t $only +hätten h,Et@n $only + +war %vA:* $only +warst %vA:*st $only +wart %vA:*t $only +waren 'vA:*@n + +will %vIl $only +willst %vIlst $only +wollen %vOl@n $only +wolt %vOlt + +werden v,E*d@n +werde v,E*d@ +werdst v,E*dst +werdet v,E*d@t +wurden vU*d@n +wurde vU*d@ +wurdst vU*dst +wurdet vU*d@t + +können ,kWn@n $only +kann ,kan $only +kannst ,kanst $only +könnt ,kWnt $only +konnt ,kOnt $only + +sollen ,zOl@n +soll ,zOl +sollst ,zOlst +sollte ,zOlt@ +sollten ,zOlt@n + diff --git a/dictsource/de_rules b/dictsource/de_rules new file mode 100644 index 00000000..071a0c5d --- /dev/null +++ b/dictsource/de_rules @@ -0,0 +1,577 @@ +// This file is UTF-8 encoded + +.group a + _) a (_ A: + a A: + aa A: + ah (+ A: + ael A:El + ae E: + + a (C% a + a (CC a + a (sch a + + ai aI + ay aI + au aU + + _) ab (@P2 'ab + _) abend A:b@nt + _) abge (@ 'abg@ + _) abzu 'abtsu: + _) an (@P2 'an + _) an (der an + _) auf (@P3 'aUf + _) aus (@P3 'aUs + + _) air _^_EN + aktie aktI@ + @A) al (_ 'al + @) an (_ 'an + @) ant (_ 'ant + @) atisch (_S6 'A:tIS + @) atisieren (_S9 A:tIs'i:*@n + anier (_ 'A:ni:3 + arier (_ 'A:*i:3 + adier (_ 'A:di:3 + +.group b + _) b (_ be: + b b + b) b + b (_N p + b (s_ p + bt (_N pt + + _) be (@P2 b@ + &Cen) be (C@ b@ + _) b (eHC b + _) be (C% bE + _) bei (P3 b'aI + _) bei (de baI + _) beo (b b,@o: + + _) b (ebC b + _) b (ecC b + _) b (eet b + _) b (enzin b + _) b (erC b + _) b (esen b + _) b (ess b + _) b (esten b + _) b (eug b + _) b (eul b + _) b (eut b + + baby _^_EN + beten be:t@n + _) bike _^_EN + _) blue _^_EN + board _^_EN + _) boom _^_EN + +.group c + _) c (_ se: + c k + c) c + + ch C + a) ch x + o) ch x + u) ch x + äu) ch C + eu) ch C + _) chr k@-* + chs ks + ck k + + _) c (el S + _) cey tsaI + chat _^_EN + chef SEf + _) c (ent ts + _) ch (il S + chip _^_EN + _) ch (ol k + _) ch (or k + @) chen (_$4 C@n + bre) ch (en x + spro) ch (en x // not spro-chen + wo) ch (en+ x + nä) chs (t Cs + coat (_ _^_EN + _) code ko:t + _) cow _^_EN + crew _^_EN + cup _^_EN + +.group d + _) d (_ de: + d d + d) d + d (_N t + d (s_ t + dt t + ddt t + + _) deal _^_EN + design _^_EN + dge (_ _^_EN + drive _^_EN + _) drug _^_EN + + +.group e + _) e (_ e: + e e: + ee e: + eh (+ e: + + e (C% E + e (CC E + e (sch E + + ei aI + eu OI + ey (_ e: + + ell (_ 'El + &) e (_$1 @ + &) e (BB_ E2 + e (gt_+ e: + &) el (_ @l + &) em (_$2 @m + @) en (_$2 @n + @) er (C 3 + @) er (r E* + @) er (nC E* + @) er (_$2 3 + &) ere (_ @*@ + &) eren (_$1 n + &) erer (_ @*3 + &) eres (_$1 s + &) er (C_ @* + &) er (n_ @r + &) er (r_ E + w) er (k_ E* + @) es (_$2 @s + &) et (_ @t + Ad) ent (_ 'Ent + @m) ent (_ 'Ent + @m) ente (_ 'Ent@ + &) est (_ @st + + &) en (@ E2n // [E2] can reduce to [@] + // &) er (C@ E2* + &) el (@ E2l + + @) ei (_ 'aI + &) erung (_ =@*UN + + _) ein (@P3 'aIn + _) emp (@P3 _|%Emp + _) ent (@P3 _|%Ent + _) enten Ent@n + _) ent (er Ent + _) er (@P2 _|%E* + _) er (HC E* // lC, mC, nC, rC + _) ergeb (nis E*g'e:b + _) er (stC E* + _) er (ste E* + _) er (ste@@P2 _|%E* + + _) entert _^_EN + _) erob (er %E*o:b + + +.group f + _) f (_ Ef + f f + f) f + + _) fest (P4 f'Est + _) flug fl'u:g + _) free _^_EN + + +.group g + _) g (_ ge: + g g + g) g + g (_N k + gd (_N kt + gt (_N kt + + _) g (eHC g // hC, lC, mC, nC, rC + _) ge (@P2 g@ + C) ge (C@ g@ + g (ei+ g + + _) gn (A g@-n + B) gn (A g@-n + + geben ge:b@n + gegen (@P5 ge:g@n + gegen (_ ge:g@n + gegn ge:gn + gehen ge:@n + general ge:nE*'al + _) g (ener g + _) g (eo+ g + @) ght (_ _^_EN + green _^_EN + guide _^_EN + + +.group h + _) h (_ hA: + h h + h) h + + _) herauf (P6 hE*'aUf + _) herab (P5 hE*'ab + _) heraus (P6 hE*'aUs + _) herbei (P6 hE*'baI + _) herum (P5 hE*'Um + _) hervor (P6 hE*f'Or + _) hier (@ h%i:* + _) hinab (P5 hIn'ab + _) hinauf (P6 hIn'aUf + _) hinaus (P6 hIn'aUs + _) hinein (P6 hIn'aIn + _) hinweg (P6 hInv'e:g + _) hinzu (P5 hInts'u: + _) hinge (@P5 h'Ing@ + + _) haupt (@@P5 h'aUpt + _) high _^_EN + _) hyper _^_EN + + +.group i + _) i ( i: + i i: + ie i: + ih (+ i: + ieh i: + + i (C% I + i (CC I + i (sch I + @) i (ng I + + &) ie (ll_ i:,E + &) ier (_ 'i:3 + r) ien (@ IEn + &) ien (_S1 n + &) iens (_ =I;@ns + &) ient (_ =I;@nt + sch) ie (n i: + ieren 'i:*@n + @) iert (_ 'i:*t + ierungs 'i:*UNs + ierung 'i:*UN + + ig (C IC + ig (_N IC + @) ik (_ 'i:k + @) ie (_ 'i: + + bakter) ie =I@ + famil) ie =I@ + fer) ie (n =I@ + fol) ie (_ =I@ + formal) ie =I@ + stud) ie (_ =I@ + + @) ing (_N _^_EN + @) ion (_ j'o:n + @) ional (_ jo:n,al + @) is (_ Is + &) isch (_ =IS + @) ität (_S4 It'e:t + +.group j + _) j (_ jOt + j j + +.group k + _) k (_ kA: + k k + k) k + + @) keit (_$4 kaIt + + kolleg k%Ole:g + +.group l + _) l (_ El + l l + l) l + lin (_ l'i:n + + @) lich (_$4 lIC + lady _^_EN + +.group m + _) m (_ Em + m m + m) m + + marine mA:*'i:n@ + A) meter (_ me:t3 + _) micro _^_EN + _) mit (P3 m'It + mitt (eC mIt + _) ms _^_EN + musik m%u:zi:k + +.group n + _) n (_ En + n n + n) n + ng N +// ng (A Ng +// ng (l Ng + ng (r Ng + nk Nk + nk (A nk + + nce (_ _^_EN + &) ness _^_EN + news _^_EN + nieder ni:d3 + +.group o + _) o (_ o: + o o: + oh (+ o: + oo o: + oe Y: + + o (C% O + o (CC O + o (sch O + + _) ober (@P4 _|,o:b3 + _) ober (ste o:b3 + + @A) on (_ 'o:n + @) oo (_ u: + + +.group p + _) p (_ pe: + p p + p) p + pf pF + ph f + + _) pay _^_EN + philie f'i:li: + _) pro (@ %p@-*o: + + _) po (e p%o: + _) poe (sc pY: + partei p%a*taI + pool _^_EN + power _^_EN + _) pu (e p%u: + +.group q + _) q (_ ku: + q k + qu kv + +.group r + _) r (_ E* + r * + r (r + C) r @-* + _) r @-* + _) rh @-* + +.group s + _) s (_ Es + s s + s (A z + s (_$1 s + A) s (_N s + A) s (_ z + ss s + + sch S + sch (en_ sC + _) sh S + sh (K S + _) sp Sp + _be) sp Sp + _ge) sp Sp + _ver) sp Sp + &C) st (_$2 st + _) st St + _be) st St + _ge) st St + _ver) st St + + _) safe _^_EN + &) schaft (_S6 Saft + schein (lich S'aIn + schwer Sve:* + shop _^_EN + _) sky _^_EN + soldat z%OldA:t + sound _^_EN + speed _^_EN + _) street _^_EN + style _^_EN + synthesi _^_EN + +.group t + _) t (_ te: + t t + t) t + th (K t + K) th t + tz ts + + &B) te (_$2 t@ + &t) te (_ @ +// &B) ten (_$3 t@n +// &t) ten (_ @n +// &B) tet (_$3 t@t + + tch tS + _) teen _^_EN + thrill _^_EN + @) tient (_ tsI'Ent + @) tion (_ tsI'o:n + _) trail _^_EN + _) train _^_EN + _) tranqu _^_EN + _) tw _^_EN + +.group u + _) u (_ u: + u u: + uh (+ u: + uell u:'El + ue y: + &) ue (_ u:@ // statue + + u (C% U + u (CC U + u (sch U + @) u (ng U + + _) un Un + _) un (C@P2 Un + _) unbe (@P4 _|,Unb@ + _) unge (@P4 _|,Ung@ + _) unver (@P5 _|,UnfE* + _) un (iv u:n + _) under _^_EN + _) unter (@P5 _|%Unt3 + + &) uela (_ u:,e:la + @) uerisch (_ 'u:*IS + _) user _^_EN + +.group v + _) v (_ faU + v v + v) v + + _) v f + _) vie fi: + _) vi (et v,i: + _) vi (CC vI + _) vi vi: + + _) ver (@P3 f%E* + _) vor (@P3 'fO* + _) vor (ne 'fO* + _) vorbei (@P6 fO*'baI + + + voraus fO*'aUs + vorüber fO*'yb3 + +.group w + _) w (_ ve: + w v + + @) wert (_ vE*t + _) wh _^_EN + &) ware (_ _^_EN + work _^_EN + + +.group x + _) x (_ Iks + x ks + + +.group y + _) y (_ UpsIlOn + + y y: + y (CC y + y (A j + @) y (_ I + t) y (_ _^_EN + +.group z + _) z (_ tsEt + z ts + z) z + ziell tsj'El + + _) zer (@ %tsE* + _) zu (C@P2 ts%u: + +.group ä + ä E: + äh (+ e: + + ä (C% E + ä (CC E + ä (sch E + + äu OI + +.group ö + ö Y: + öh (+ Y: + + ö (C% W + ö (CC W + ö (sch W + +.group ü + ü y: + üh (+ y: + + ü (C% y + ü (CC y + ü (sch y + + _) über (@P4 _|,y:b3 + +.group ß + _) ß (_ EstsEt + ß s + + +.group + , (D kOma + / slaS + % p@-*o:ts'Ent + $ dOl@ + € OI*o: + £ paUnd + + . pUnkt + . (. _: + \.) . diff --git a/dictsource/el_list b/dictsource/el_list new file mode 100644 index 00000000..dade0c10 --- /dev/null +++ b/dictsource/el_list @@ -0,0 +1,239 @@ + +// This file is UTF-8 encoded +// all words lower case + +// Α α, Β β, Γ γ, Δ δ, Ε ε, Ζ ζ, Η η, Θ θ, Ι ι, Κ κ, Λ λ, Μ μ, Ν ν, Ξ ξ, +// Ο ο, Π π, Ρ ρ, Σ σ ς (word-final form), Τ τ, Υ υ, Φ φ, Χ χ, Ψ ψ, Ω ω. +// ά έ ή ί ΰ ϊ ϋ ό ύ ώ + + +// numbers +_0 miD'en +_1 'ena +_2 D'io +_3 tr'ia +_3f tr'is +_4 t'esera +_4f t'eseris +_5 p'ente +_6 'eksi +_7 ept'a +_8 okt'o +_9 en'ea +_1X D'eka +_11 'enDeka +_12 D'oDeka +_2X 'ikosi +_3X tri'anda +_4X sar'anda +_5X pen'inda +_6X eks'inda +_7X ebdom'inda +_8X ogd'onda +_9X enen'inda +_0C ekat'on_ +_1C0 ekat'o +_1C ekat'on_ +_2C D;ak'os;a_ +_3C triak'os;a_ +_4C tetrak'os;a_ +_5C pendak'os;a_ +_6C eksak'os;a_ +_7C eptak'os;a_ +_8C oktak'os;a_ +_9C en^ak'os;a_ +_0M1 Cil^'aDes +_1M1 C'il^a // no '1' before thousand +_1M2 'ena|ekatom'irio +_0M2 ekatom'iria +_1M3 'ena|Disekatom'irio +_0M3 Disekatom'iria +_dpt k'oma +_. tel'ia + + +// articles +ο o $u // definate article +η i $u +το $u +του $u +της $u +τον $u +την $u +οι $u +τα $u +των $u +τους $u +τις $u + +ένας $u // indefinate article +μία $u +μια mn^a $u +ένα $u +ενός $u +μίας $u +μιας $u +έναν $u + + + + +// pronouns +τη $u // her + +που $u // that,which + + +// verbs +είμαι $u // to be +είσαι $u +είναι $u +είμαστε $u +είστε $u + +ήμουν $u +ήσουν $u +ήταν $u +ήμασταν $u +ήσασταν $u + +θαείμαι $u +θαείσαι $u +θαείναι $u +θαείμαστε $u +θαείστε $u + +ναείμαι $u +ναείσαι $u +ναείναι $u +ναείμαστε $u +ναείστε $u + + +έχω $u // to have +έχεις $u +έχει $u +έχουμε $u +έχετε $u +έχουν $u + +είχα $u +είχες $u +είχε $u +είχαμε $u +είχατε $u +είχαν $u + +θαέχω $u +θαέχεις $u +θαέχει $u +θαέχουμε $u +θαέχετε $u +θαέχουν $u + +ναέχω $u +ναέχεις $u +ναέχει $u +ναέχουμε $u +ναέχετε $u +ναέχουν $u + + +// prepositions + +σε $u // in,at,to +στου $u // + the +στον $u +στων $u +στους $u +στης $u +στην $u +στις $u +στο $u +στα $u + +εκ $u // of +να $u $brk // to +από $u // from, by, of +με $u $brk // with +μασί $u $brk // with,together +παρά $u $brk // by, of, than +μέσα $u $brk // in, inside, within +εις $u $brk // on, to +διά $u $brk // by +περί $brk // towards +προς $brk // towards +μέχρι $brk // until +κοντά $brk // beside + +// conjunctions + +αλλά $u $pause // but +και ke $u $pause // and (don't change to [ge] after n) +ή $u $pause // or +ότι $u $pause // that +αν $u $pause // if, whether +εάν $u $pause // if, whether +(εκτός εάν) ekt'ose,an $pause // unless +παρόλο $pause // despite + +επειδή $pause // because +γιατί $pause // because, why +διότι $pause // because, for + + +// Letters +// If a letter has a "word" pronunciation which is different from its +// "letter" name, then include the letter name here, with the letter +// prefixed by a _ character. + +α alfa +β vita +γ Qama +δ Delta +ε 'epsilon +ζ zita + +_η 'ita +η 'ita $atend +θ Tita +ι i'ota +κ kapa +λ lamDa +μ mi +ν ni +ξ ksi +_ο 'omikron +ο 'omikron $atend +π pi +ρ Ro +σ s'iQma +ς s'iQma +τ taf +υ 'ipsilon +φ fi +χ Ci +ψ psi +ω om'eQa + +ά ,alfa|t'onos +έ ,epsilon|t'onos +_ή ,ita|t'onos +ή ,ita|t'onos $atend +ί i,ota|t'onos +ΰ ,ipsilon|t'onos +ϊ i'ota +ϋ 'ipsilon +ό ,omikron|t'onos +ύ ,ipsilon|t'onos +ώ om,eQa|t'onos + +_. tel'ia +_, k'oma + + + +// miscellaneous exceptions +μιερός mier'os +ρια rQ;a + diff --git a/dictsource/el_rules b/dictsource/el_rules new file mode 100644 index 00000000..e09a1016 --- /dev/null +++ b/dictsource/el_rules @@ -0,0 +1,280 @@ +// Greek -modern + +// This file is UTF-8 encoded +// all words lower case + +// Α α, Β β, Γ γ, Δ δ, Ε ε, Ζ ζ, Η η, Θ θ, Ι ι, Κ κ, Λ λ, Μ μ, Ν ν, Ξ ξ, +// Ο ο, Π π, Ρ ρ, Σ σ ς (word-final form), Τ τ, Υ υ, Φ φ, Χ χ, Ψ ψ, Ω ω. + +.group α + α a + αι e + αί 'e + αυ av + αυ (B af // +voiceless consonant κ, π, τ, χ, θ, σ, ξ. + αύ 'av + αύ (B 'af // +voiceless consonant κ, π, τ, χ, θ, σ, ξ. + αη aI + αϊ aI + +.group β + β v + β (β + +.group γ + γ Q + γγ g + γκ g + A) γγ Ng + A) γκ Ng + γ (χ N + γαι (A j + γε (A j + γει (A j + γη (A j + γι (A j + γυ (A j + γοι (A j + +.group δ + δ D + δ (δ + +.group ε + ε e + ει i + εί 'i + C) ει (A ; + ευ ev + ευ (B ef // +voiceless consonant + ευ (β e + ευ (φ e + εύ 'ev + εύ (B 'ef // +voiceless consonant + εύ (β 'e + εύ (φ 'e + +.group ζ + ζ z + ζ (ζ + ζη (A z; + ζι (A z; + ζυ (A z; + ζει (A z; + ζοι (A z; + +.group η + η i + C) η (A ; + ηυ iv + ηυ (B if // +voiceless consonant + +.group θ + θ T + θ (θ + +.group ι + ι i + C) ι (A ; + ρ) ι (A i + +.group κ + κ k + κ (κ + ν_) κ g + + κη (A c // k + i sound = [c] + κι (A c + κυ (A c + κει (A c + κοι (A c + + +.group λ + λ l + λ (λ + λη (A l^ + λι (A l^ + λυ (A l^ + λει (A l^ + λοι (A l^ + +.group μ + μ m + μ (μ + _) μπ b + +.group ν + ν n + ν (ν + ντ d // always? or not after a vowel? + ν (_π m + ν (_ψ m + ν (_κ N + ν (_ξ N + νη (A n^ + νι (A n^ + νυ (A n^ + νει (A n^ + νοι (A n^ + + +.group ξ + ξ ks + ξ (ξ + ν_) ξ gz + +.group ο + ο o + οι i + οί 'i + C) οι (A ; + ου u + ού 'u + οη oI + οϊ oI + +.group π + π p + π (π + ν_) π b + +.group ρ + ρ R + ρ (ρ + A) ρ (A * + C) ρ (A @-* + +.group σ + σ s + σ (σ + ση (A s; + σι (A s; + συ (A s; + σει (A s; + σοι (A s; + +.group ς + ς s + ς (_B s // +voiceless consonant + ς (_C z + +.group τ + τ t + τ (τ + τσ ts + τζ dz + ν_) τ d + ν_) τσ dz + +.group υ + υ i + C) υ (A ; + υι i + υί 'i + +.group φ + φ f + φ (φ + +.group χ + χ x + χ (αι C + χ (αί C + χ (ε C + χ (έ C + χ (η C + χ (ή C + χ (ι C + χ (ί C + χ (οι C + χ (οί C + χ (υ C + χ (ύ C + +.group ψ + ψ ps + ψ (ψ + ν_) ψ bz + +.group ω + ω o + + + +// If we find a Latin letter a-z, then translate as English +.group a + a _^_EN +.group b + b _^_EN +.group c + c _^_EN +.group d + d _^_EN +.group e + e _^_EN +.group f + f _^_EN +.group g + g _^_EN +.group h + h _^_EN +.group i + i _^_EN +.group j + j _^_EN +.group k + k _^_EN +.group l + l _^_EN +.group m + m _^_EN +.group n + n _^_EN +.group o + o _^_EN +.group p + p _^_EN +.group q + q _^_EN +.group r + r _^_EN +.group s + s _^_EN +.group t + t _^_EN +.group u + u _^_EN +.group v + v _^_EN +.group w + w _^_EN +.group x + x _^_EN +.group y + y _^_EN +.group z + z _^_EN + +.group + ά 'a + άη 'aI + άι 'aI + έ 'e + ή 'i + ί 'i + ΰ 'i + ϊ i + ϋ i + ό 'o + όη 'oI + όι 'oI + ύ 'i + ώ 'o + + . tel'ia + , (D k'oma + ! Tavmastik'o + !) ! + + diff --git a/dictsource/en_list b/dictsource/en_list new file mode 100644 index 00000000..78ddf5e9 --- /dev/null +++ b/dictsource/en_list @@ -0,0 +1,2649 @@ + +// You can use the en_extra file, rather than this one +// to add your own pronunciation definitions. + +// This file is UTF-8 encoded +// all words must be LOWER CASE (although the initial letter will be automatically +// converted if it's a 7bit ascii character) + +//stress symbols ' primary , secondary % unstressed + +// Conditional rules +// ?2 Use long 'a' in 'bath' +// ?3 General American +// ?4 Not General American +// ?5 split [3:] er [3:], ir [IR], ur [VR] +// ?6 'one' = [wVn], 'of' = [Vv] +// ?7 Scottish + + +// letter names, as they are spoken as a single character in text +// precede by _ to distinguish from pronunciation as a language word + +_a eI +b bi: +c si: +d di: +e i: +f Ef +g dZi: +h eItS +_i aI +j dZeI +k keI +l El +m Em +n En +o oU +p pi: +q kju: +r A@ +_s Es +t ti: +u ju: +v vi: +w d'Vb@Lju: +x Eks +y waI +z zEd +?3 z zi: + +é i:a2k'ju:t + + +// character names +_cap k,ap@-t@L +_?A lEt3 +_?? sImb@L + +_! Ekskl@m'eIS@n +_" kwoUts +_# haS +_$ d0l3 +_% p3s'Ent +?5 _% pVRs'Ent +_& amp@sand +_' praIm +_( ElbrakIt +_) A@brakIt +_* ast@rIsk: +_+ plVs +_, k0m@ +_- h,aIf@n +_. st0p +_/ stroUk +_: koUl0n +_; sEmIk'oUl0n +_< ElaNg@L +_= i:kw@Lz +_> A@aNg@L +_? kwEstS@n +_@ at|saIn +_[ Elskwe@ +_\ bakstroUk +_] A@skwe@ +_^ s3:kVmfl,Eks +?5 _^ sIRkVmfl,Eks +__ 'Vnd3sk,o@ +_` bakpraIm +_{ ElbreIs +_| vi:b'A@ +_} A@breIs +_~ tIld@ +_£ paUnd + + +// numeric + +_0 z'i@roU +_1 w'0n +?6 _1 w'Vn +_2 t'u: +_3 Tr'i: +_4 f'o@ +_5 f'aIv +_6 s'Iks +_7 s'Ev@n +?7 _7 s'@v@n +_8 'eIt +_9 n'aIn +_10 t'En +_11 Il'Ev@n +_12 tw'Elv +_13 T'3:ti:n +?5 _13 T'IRti:n +_14 f'o@ti:n +_15 f'Ifti:n +_16 s'Iksti:n +_17 s'Ev@nti:n +?7 _17 s'@v@nti:n +_18 'eIti:n +_19 n'aInti:n +_2X tw'EntI2 +_3X T'3:tI2 +?5 _3X T'IRtI2 +_4X f'O@tI2 +_5X f'IftI2 +_6X s'IkstI2 +_7X s'Ev@ntI2 +?7 _7X s'@v@ntI2 +_8X 'eItI2 +_9X n'aIntI2 +_0C h'Vndr@d +_0M1 T'aUz@nd +_0M2 m'Ili@n +_0M3 b'Ili@n +_0and @n +?3 _0and +_dpt pOInt + + +// ABBREVIATIONS +//************** + +abc eIbi:s'i: +ac eI'si: +adfs eIdi:Ef'Es +a.k.a aka2_! +agm eIdZi:'Em +ai eI;'aI +api apI2 +asap eIEseIpi: +awol eIw0l +cio si:aI'oU +ctrl k0ntr'oUl +dept dI2pA@tm@nt +diy di:aI'waI +eg fO@Egz'aamp@L +etc Et'sEtr@ +eur jU@ +hmm h@m +(http ://) eItSti:ti:'pi:_ +ibm aIbi:Em +ie aIi:_! $pause +i.e aIi:_! $pause +irc aI;A@s'i: +lbs paUndz +ltd lImItId +mc m@k +oem oUi:'Em +ok oU'keI +os oUEs +riscos rIskoUEs +sae EseI'i: +seac si:ak +st s@nt +th T +thu T3: // Thursday +?5 thu TIR // Thursday +ufo ju:Ef'oU +ui ,ju:'aI +uk ju:k'eI +url ju:A@'El +usa ju:Es'eI +wwii dVb@Lju:dVb@Lju:t'u: +xy EkswaI + +ii tu: $abbrev // roman numerals +iii Tri: $abbrev +iv fo@ $abbrev + + +nd $only +rd $only +th $only +st $only + +mr mIst3 $dot +mrs mIsIz $dot +//ms mIz $dot +dr d0kt3 $dot $capital +lt $dot +prof $dot +rev $dot +st $dot + + + +// MAIN WORD DICTIONARY +//********************* + + + + +abbey abI2 +abdomen abd@m@n +abed a2bEd +abet a2bEt +abhor a2bho@ +abler eIbl3 +ablest eIbl@st +ability a2bIl@tI2 +ablaut ablaUt +aborigine ab@r'IdZ@nI +abracadabra abr@k@d'abr@ +absence abs@ns +absent abs'Ent +absent abs@nt $onlys +absent abs'Ent $verb +absentia abs'Enti:@ +absinthe absInT +absolutely $3 $verbf +abstemious a2bst'i:mi@s +abstract abstrakt $only +abstract a2bstr'akt $verb +academe a2kad@mI +access aksEs $onlys +access aksEs $verb +accouche a2ku:S +acer eIs3 +aces eIsIz +acetylene a2sEt@li:n +accurate akjUr@t +accursed a2k3:sId +?5 accursed a2kVRsId +achille a2kIli: +aching eIkIN +adam ad@m +adamant ad@m@nt +add ad +addict adIkt $onlys +addon ad0n +adher adh'i@ +adieu a2dju: +adieus a2dju:z +adieux a2dju:z +adios aDj'o:s +admirable adm@r@b@L +admonition adm@n'IS@n +ado a2du: +adobe a2doUbI2 +adversary adv3s@rI2 +advert a2dv3:t $verb +advertise adv3taIz +advertiser adv3taIz3 +advertize adv3taIz +advertisement a2dv3:tIsm@nt +adware 'adw,e@ +adze adz +aegis i:dZIs +aerate e@r'eIt +aether i:T@ +afar a2fA@ +affirmation af3m'eIS@n +affidavit afId'eIvIt +afflux a2flVks +aforemention $2 +again a2gEn +agape a2geIp +agar eIgA@ +aged eIdZd +aggro agroU +aghast a2gaast +agin a2gIn +aging eIdZIN +agist eIdZIst +agog a2g0g +agressive a2grEsIv // misspell +aground a2graUnd +ague eIgju: +aha a2hA: +ahem a2h'@m +ahoy a2hOI +airbus e@:bVs +airpower 'e@p,aU@ +aisle aI@l +ajar a2dZA@ +ajax eIdZaks +aka aka2 +akin $2 +alas a2l'as +albeit O:lb'i:It +alfalfa alf'alf@ +alias eIli@s +alibi al@baI +alkali alk@laI +allay a2leI +allegiance a2li:dZ@ns +allele a2li:l +alleluia alI2l'u:j@ +allemande al@mand +allergic a2l3:dZIk +allhallows O:lh'aloUz +allied alaId +allover O:l'oUv3 +alm A:m +almost O:lmoUst +allspice $1 +alternate Olt'3:n@t $only +alternate Olt3neIt $verb +alternately Olt'3:n@tlI2 $verbf +alternative Olt'3:n@tIv +altogether ,O:lt@gED3 +always O:lweIz +aluminium aljUm'Ini@m +amaryllis am@r'IlIs +amass a2mas +ambassador a2mbas@d3 +ambidextrous $3 +amen A:m'En $onlys +amok a2m0k +amoral eIm'0r@L +amount a2maUnt +amply amplI2 $verbf +anal eIn@L +analogous a2nal@g@s +analog an@l0g +analogue an@l0g +analyses a2nal@si:z +analyses an@laIzIz $verb +analysis a2nal@sIs +anenome a2nEn@mI2 +angel eIndZ@L +anecdote anIkdoUt +anecdotal anIkd'oUt@L +anemometer anIm'0mIt3 +anemone a2nEn@mI2 +anew a2nju: +anion aneI@n +anniversary anIv'3:s@rI2 +anon a2n0n +anonymous $2 +another a2nVD3 +answer aans3 +ante antI2 +antecedent antIs'i:d@nt +antichrist $1 +anticline $1 +antidote $1 +antifreze $1 +antigen $1 +antihero $1 +antilog $1 +antimatter $1 +antinomy ant'In@mI2 +antioch $1 +antipathy ant'Ip@TI2 +antiphonal ant'If@n@L +antique ant'i:k +antithesis ant'IT@sIs +antitheses ant'IT@si:z +anus eInVs +anxiety aNz'aI@tI2 +anxious aNS@s +anymore $3 +apache a2patSI +apron eIpr@n +appal a2pO:l +apparatus ap@r'eIt@s +apprentice a2prEntIs +approximate a2pr0ksIm@t $only +approximate a2pr0ksImeIt $verb +arab ar@b +arabic $1 +arcade $2 +arch A@tS +arches A@tSIz +archimedes A@kIm'i:di:z +archive A@kaIv +archway $1 +arena a2ri:n@ +arithmetic a2rITm@tIk +arise a2raIz +arisen a2rIz@n +armslength ,A@mzl'ENT +arouse a2raUz +asbestos asb'Est@s +ascertain as3teIn +arsenal A@s@n@L +arsenic A@snIk +asiatic eISI'atIk +askance a2skans +ass as +assess a2sEs +atlas atl@s +atop a2t0p +attache at'aSeI $only +attaches a2tatSIz +attorney a2t3:nI2 +?5 attorney a2tVRnI2 +attribute atrIbju:t +attribute $2 $verb +au ,oU +aubergine oUb3Zi:n +auger O:g3 +aurora $2 +aussie 0zI +austere O:st'i@ +authority a2T0rItI2 +authoritative O:T'0rIt@tIv +autograph O:t@graf +auto O:toU +automobile O:t@m@bi@l +autonomous O:t'0n@m@s +autopsy O:t0psI2 +avalanche av@laanS +average av@-rIdZ +aviary eIvi@rI2 +awry a2raI +axes aksIz + +backend bak'End +ballad bal@d +ballast bal@st +ballet baleI +balloon b@lu:n +ballot bal@t +baloney b@loUnI2 +banal beIn@L +banana b@nA:n@ +banged baNgd +banquet baNkwIt +barbeque bA@b@kju: +barometer b@r0mIt3 +barrage barA:Z +basis beIsIs +bass beIs +bastion basti@n +batman batman +belisha b@l'i:S@ +bely bI2laI +basal beIs@L +best bEst +beta bi:t@ +beverage bEv@rIdZ +bias baI@s +biased baI@st +bible baIb@L +bidet bi:deI +bijou bi:Zu: +bikini bIk'i:nI2 +binman bInman +biped baIpEd +bison baIs@n +bizarre bIz'A@ +bizzare bIz'A@ +blancmange bl@m0nZ +blase blA:zeI +blockade $2 +blouse blaUz +blurry bl3:rI2 +?5 blurry blVRrI2 +bogey boUgI2 +boing bOIN +bombard $2 +bonbon b0nb0n +bonhomie b0n@mi: +boogie b'u:gI2 +bosom bUz@m +bosun boUs@n +bourgeois bu:3Zwa +bourgeoise bu:3Zwaz +bouquet bu:k'eI +bow boU +bow baU $verb +breakfast brEkf@st +breath bri:D +breath brET $only +breath bri:D $verb +breathless brETl@s +brethren brEDr@n +bridesmaid braIdzmeId +brigade $2 +brigadier brIga2d'i@ +brochure broUS3 +brooch broUtS +budgerigar bVdZ@rIgA@ +buffet bVfeI +bunion bVnI2@n +bureaucracy bjU@'0kr@sI2 +bursar b3:s3 +bus bVs +buses bVsIz +busily bIsIlI2 $verbf +buxom bVks@m + +cabaret kab@reI +cach kaS // cached +cachet kaSeI +cacti kaktaI +cadet ka2dEt +cadre kA:d3 +caesar si:z3 +cafe kafI2 +cajole ka2dZoUl +caldera k0ld'e@r@ +calix keIlIks +calv kA:v // for calved, calving +calve kA:v +cameo kamIoU +campus kamp@s // campuses +canal k@nal +canary k@ne@rI2 +canine keInaIn +canoe k@nu: +canton kant0n +caprice ka2pr'i:s +caramel kar@mEl +caravan kar@van +career k@r'i@ +caress k@rEs +carpel kA@p@l +cascade $2 +cashmere kaSm'i@ +catarrh k@tA@ +catholic kaTlIk +cavalier $3 +caveat kavIat +caviar kavIA@ +caviare kavIA@ +cavort ka2v'O@t +cedar si:d3 +celebre sEl'Ebr@ +cello tSEloU +censure sEnS3 +ceres si@ri:z +certificate s3tIfIk@t +chalet SaleI +chameleon k@mi:li@n +champagne Samp'eIn +chang tSeIndZ +chang tSaN $onlys +chapel tSap@L +charade Sa2rA:d +charismatic karIsm'atIk +charit tSarIt // charitable +chocolate tS0kl@t +cholera k0l@r@ +cholesterol k@lEst@r0l +chromosome kroUm@soUm +ciao tSaU +cigar sI2gA@ +cigarette sIg@'rEt +circumference $2 +circumvent s3:k@mvEnt +?5 circumvent sIRk@mvEnt +citizen sItIz@n +cleanse klEnz +clerk klA@k +cliche kli:SeI +close kloUs $only +close kloUz $verb +closer kloUs3 +closely kloUslI2 $verbf // not kloUzlI +closet kl0zIt +cloth kloUD $verb +coauthor koU'O:T3 +cobol koUb0l +cocoa koUkoU +coffee k0fI2 +cochlea k0kli:@ +coconut koUk@nVt +codify koUdIfaI +cognac k0njak +coincide koUIns'aId +college k0lIdZ +colon koUl0n +color kVl3 +colored kVl3d +colonel k3:n@L +?5 colonel kVRn@L +combat k0mbat // combating +combo k0mboU +comet k0mIt +commence k@mEns +commend k@mEnd +comment k0mEnt +commentary k0m@ntrI2 +committee k@mItI2 +community k@mju:nItI2 +compat k@mpat // for compatible +competed k@mp'i:tId +competing k@mp'i:tIN +competition k0mp@t'IS@n +compromise k0mpr@maIz +compound $2 $verb +con k0n +conduct k0ndVkt $only +conduct $verb +concert k0ns3t $onlys +concert $verb +concerto k0ntS'e@toU +conciliatory k0ns'IlI|@t@rI2 +concise k0ns'aIs +cone koUn +conflict $1 $onlys +conflict $verb +conger k0ng3 +conscience k0nS@ns +construct $1 $onlys +construct $verb +contemplative $2 +content $1 $onlys +content $verb $past +contest $1 $onlys +contest $verb +contract $1 $onlys +contract $verb +contralto k0ntr'altoU +contraption k0ntr'apS@n +contrary k0ntr@rI2 +contrast k0ntr'ast $verb +contrite k0ntr'aIt +conven k0nv'i:n // convened +converse $1 $only +converse $verb +convict $1 $onlys +convict $verb +convolute k0nv@l'u:t +coop ku:p +cooper ku:p3 +coordinate koU'O:dIneIt $verb +copier k0pi@ +coral k0r@L +coronet k0r@nEt +corporal kO@pr@L +corporate kO@p@r@t +corps kO@ $only +countered kaUnt3d +coupon ku:p0n +covert koUv'3:t +coworker koUw3:k3 +creature kri:tS3 +crevasse kr@vas +crisis kraIsIs +crises kraIsi:z +christmas krIsm@s +crooked krUkId +crusade $2 +cuckoo kUku: +cupboard kVb@d +curate kjU@reIt +curse k3:s +?5 curse kVRs +customer k'Vst@m3 +cutoff kVt0f +cyan saI'an +cymru kVmrI2 + +dahlia deIli:@ +dais deIIs +damaged d'amIdZd +dandelion dandIlaI@n +de d@ $only +debacle deIb'A:k@L +debris dEbri: +debut deIbju: +decade dEkeId +decent di:s@nt +declaration dEkl@'reIS@n +decorative dEkr@tIv +decoy di:kOI +decry dIkr'aI +defens dIf'Ens // for defensible +deficit dEfIsIt +definitive dI2fInItIv +deity deI@tI2 +deja deIZA: $only +deliberate dI2lIb@r@t +delicate dElIk@t +delimit dI2lImIt // delimited +demolish dI2m0lIS +demon di:m@n +demo dEmoU +denouement deIn'u:mO~ +denier dI2naI3 +deny dI2naI +denial dI2naI@l +derange dI2reIndZ +descry dIskr'eI +desert dI2z3:t +desert dEs3t $only +desert dI2z3:t $verb +desolate dEs@l@t +desperate dEsp@r@t +detente deIt'0nt +détente deIt'0nt +detritus dItr'aIt@s +deus deIUs +di d,I +diabetes daI@b'i:ti:z +diameter daI'amIt3 +diaspora daI'asp@r@ +diehard daIhA@d +dielectric daI@l'EktrIk +diesel di:z@L +dilemma daIl'Em@ +dingy dIndZI2 +dinosaur daIn@sO@ +diode daIoUd +diplomacy dIpl'oUm@sI2 +disconsolate dIsC'0ns@l@t +disc dIsk // for discs +disciple dIs'aIp@L +discounted $2 +disease dIz'i:z +dishes dISIz +dismal dIzm@l +disparate dIsp@r@t +distributor $2 +distro dIstroU +disuse dI2sju:z +divan dI2van +doable du:@b@L +doctrine d0ktrIn +doctrinal d0ktr'aIn@L +domino $1 +donor doUn3 +dont doUnt $only +dose doUs +dramatic dr@matIk +drawer drO@ +drier draI3 +driest draI|@st +duet dju:'Et +dugout dVgaUt +duvet du:veI +dynasty dIn@stI2 +d'ye dj@ + +ebook i:bUk +eweek i:wi:k +early 3:lI2 +eavesdrop i:vzdr0p +ebay i:beI +ecommerce 'i:k,0m3:s +eden i:d@n +edict i:dIkt +edit EdIt +edition I2dIS@n +efile i:faIl +eh eI +el ,El +electricity I2lEktr'IsItI2 +electrode I2lEktroUd +electron I2lEktr0n +eligible ElIdZ@b@L +élite I2li:t +email i:meIl +embed Emb'Ed +ember Emb3 +empire $1 +emu i:mju: +enroute 0nr'u:t +ensemble 0ns'0mb@L +entente 0nt'0nt +entourage 0ntu:rA:Z +entrance Entr@ns $onlys +entrance Entr'aans $verb +envelope Env@loUp $only +envelopes Env@loUps +envelope $verb +epistle I2pIs@L +epitome I2pIt@mI2 +equation I2kweIZ@n +equivocal I2kwIv@k@L +era i@r@ $only // should by $onlys, but gets 'erased' wrong +eras i@r@z +erase I2reIz // erasing erases +ere e@ $only +eros i@r0s +errand Er@nd +escapism Esk'eIpIz@m +escort Esk'O@t $verb +espionage EspI@nA:Z +essential Is'EnS@L +estoppel Est'0p@L +exit EgzIt // exiting +exonerate Egz'0n@reIt +eureka ju:'ri:ka2 +europa jU@r'oUp@ +evildoers i:v@Ldu:3z +ewe ju: +evening i:vnIN +evit EvIt // inevitable +exalt Egz'0lt +execute EksIkju:t // not $2 +exile $1 +exodus Eks@d@s +expert Eksp3:t +expertise Eksp3t'i:z +exploit $1 $onlys +exploit $verb +expo $1 +export $1 $onlys +export $verb +extract $1 $onlys +extract $1 $only +extract $2 $verb +extrem Ekstr'i:m // extremism +extremist Ekstr'i:mIst +eyrie i@rI2 + +facade f@sA:d +façade f@sA:d +faeces fi:si:z +fallible fal@b@L +familiar f@mIli@ +famine famIn +farewell $2 +fasten faas@n +fathom faD@m +favorite feIv@-rIt // sp. +favourite feIv@-rIt +favorites feIv@-rIts // sp. +favourites feIv@-rIts +feisty faIstI2 +feline fi:laIn +feminine fEm@nIn +fete feIt +fetus fi:t@s +fi f,aI // as in "hi-fi" +fiasco fi:'askoU +fiery faI@rI2 +finale fIn'A:lI2 +finance faInans $only +finance $verb +finesse fI2nEs +finite faInaIt +fishnet fISnEt +fiord fi:O@d +fix fIks // for fixer +flexible flEksIb@L +flier flaI3 +flourish flVrI2S +focus foUk@s // ed,ing +foothold fUthoUld +forage f0rIdZ +force fo@s +forensic f@rEnsIk +foreshadow $2 +foreshorten $2 +forestall fo@st'O:l +foretell fo@t'El +forever $2 +forewarn $2 +formid fO@m'Id // formidable +forte fo@teI +foyer fOIeI +freelance fri:laans +frigate frIg@t +fringer frIndZ3 // infringer +fringing frIndZIN +frontend fr'Vnt,End +frontpage fr'Vntp,eIdZ +fruition fru:'IS@n +frustrate $2 +fuchsia fju:S@ +furore fju:r'O:rI +furthermore f3:D3m'o@ $pause +?5 furthermore fVRD3m'o@ $pause +fuscia fju:S@ +fuselage fju:z@lA:Z + +gala gA:l@ +galaxy gala2ksI2 +galileo galIl'eIoU +galore ga2lo@ +gases gasI2z +gauche goUS +gauge geIdZ +geese gi:s +gemini dZEmInaI +geni dZi:nI2 +genome dZi:noUm +genre Z0nr@ +genuine dZEnju:In +geyser gi:z3 +gig gIg +gigantic dZaIg'antIk +gibbon gIb@n +gilead g'IlIad +giraffe dZI2raaf +goin ,goUIn $only // for goin' +goodbye $2 +goodday $2 +goodnight $2 +gospel g0sp@L +goto goUtu: +gourmet gU@meI +graduate gradju:@t +graduate gradju:eIt $verb +graffiti gra2fi:tI2 +gredient gri:di@nt // ingredient +grenade gr@neId +grosvenor groUv@n3 +groupie gru:pI +gui gu:I2 +guinea gInI2 +gurus gu:ru:z + +haggis hagIs +haha hA:h'A: +halleluiah halI2'lu:j@ +hallelujah halI2'lu:j@ +hanged haNd +harem hA:r'i:m +harness hA@nIs +havoc hav@k +hasty heIstI2 +hatred heItrId +hazardous haz3d@s +hedgehog hEdZh0g +hehe hi:h'i: +helium hi:li@m +helix hi:lIks +hello h@loU +henceforth hEnsfo@T +hercules h3:kjUli:z +hereto hi@'tu: +hermaphrodite $2 +hermes h3:mi:z +herod hEr@d +heroe hi@oU +heroic hI2roUIk +heroin hEroUIn +heroine hEroUIn +herpes h3:pi:z +hideout haIdaUt +hindu hIndu: +hindus hIndu:z +hiya haIa2 +hmpf h'@mpf +holme hoUm +holster hoUlst3 +holy hoUlI2 +homepage hoUmpeIdZ +hominem h0mInEm +horizontal $3 +hospitable h0sp'It@b@L +hostage h0stIdZ +hotel hoUt'El +house haUz $verb +however $2 +howto haUtu: +hubris hu:brIs +hunger hVng3 +hurrah hVr'A: +hurray hVr'eI +hurricane hVrIk@n +hussar hVz'A@ +hyperbola haIp'3:b@l@ +hyperbole haIp'3:b@lI2 +hypothesis haIp'0T@sIs +hypotheses haIp'0T@si:z +hypotenuse haIp'0t@nju:s + + +icon aIk0n +iconbar aIk0nbA@ +imagine I2madZI2n +impedance I2mpi:d@ns +imperative I2mpEr@tIv +imprecise I2mprIs'aIs +inappropriate ,Ina2proUpri@t +incense Ins'Ens $verb +incoming InkVmI2N +increase I2nkri:s $verb +indicative $2 +indices IndIsi:z +indict Ind'aIt +indie IndI2 +indo IndoU +indoor $1 $only +industry IndVstrI +indy IndI2 +infamous Inf@m@s +infer Inf'3: +inference Inf@r@ns +influenza Influ:'Enz@ +infrastructure $1 +ingenuity IndZIn'ju:I2tI2 +inherit I2nhErIt // inherited +innard In3d +inner In3 +inning InIN +innovative In@veItIv +insert Ins3:t $onlys +insert Ins'3:t $verb +insightful $2 +inspire Insp'aI@ +instal I2nstO:l // instalment +installation Inst@l'eIS@n +instinctive $2 +insult $2 +insult $1 $onlys +intel IntEl +interim $1 +intermediate Int3m'i:di@t +intern Int3:n +interrogatory $3 +inventory Inv@ntrI2 +interface $1 +intermin I2nt3:mIn // interminable +internet Int3nEt +interrupt $1 $onlys +interrupt $3 $verb +interval Int3v@L +interven Int3v'i:n // for intervening +intro $1 +iris aIrIs +irony aIr@nI2 +isosceles aIs'0s@li:z +itinerary aIt'In@r@rI2 +ivory aIv@rI2 + +jagged dZagId +japan dZ@pan +jasmine dZazmIn +jesus dZi:z@s +joky dZoUkI2 +july dZu:l'aI + +kaput ka2pUt +karate k@rA:tI2 +kebab k@bab +hiatus haI'eIt@s +kilo ki:loU +kilter kIlt3 +kiosk ki:0sk +kiwi ki:wi: +knavish neIvI2S +koala koU'A:l@ +kopje k0pI +kosher koUS3 + +la ,la $only +laboratory la2b'0r@trI2 +labor leIb3 +labored leIb@d +lager lA:g3 +landowner l'and,oUn3 +las ,las +lasagne l@zanj@ +laser leIz3 +lasso las'u: +lawyer lOI3 +lava lA:v@ +le l@ $only +lead li:d +leafy li:fI2 +leant lEnt +leapt lEpt +lego lEgoU +leisure l'EZ3 +lemonade $3 +leo li:oU +leopard lEp@d +lesion li:Z@n +lethal li:T@L +libre li:br@ +lier laI3 // outlier +lilac laIl@k +lily lIlI2 +limit lImIt // limited +limousine lIm@zi:n +lingerie l0nZ@rI2 +linen lInIn +liqueur lI2kjU@ +literature lItrItS3 +live laIv $onlys +live lIv $verb +livestock l'aIvst,0k +liver lIv3 +lively laIvlI2 +llama lA:m@ +loch l0x +login l0gIn +logon l0g'0n +longago l0Ng@goU +london lVnd@n +looser lu:z3 +lorenz l0r@nts +los ,l0s $only +losing lu:zIN // misspell +lullaby lVl@baI +lunatic lu:n@tIk + +macabre m@kA:br@ +machete m@SEtI +machismo m@tSIzmoU +mademoiselle mad@m@zEl +magazine $3 +magi meIdZaI +maintain $2 +maintainer $2 +majority m@dZ0rItI2 +malic malIk +malice malIs +mall mal +mammoth mam@T +mandate $2 $verb +manganese $1 +manger meIndZ3 +manhour manaU@ +mankind $2 +maneuver m@nu:v3 +manuever m@nu:v3 // misspell +manure m@njU@ +maraud m@rO:d +marauder m@rO:d3 +market mA@kI2t // for marketing +marcel mA@s'El +marquee mA@k'i: +margarine mA@dZ@ri:n +marmoset mA@m@sEt +marijuana marIw'A:n@ +marshall mA@S@L +massacre mas@k3 +massage masA:Z +matrices meItr@si:z +mausoleum mO:s@li:@m +mayhem meIhEm +meant mEnt +matrix meItrIks +meadow mEdoU +meander mI2and3 +mediaeval mEdI'i:v@L +medicine mEds@n +melon mEl@n +menus mEnju:z +memo mEmoU +menagerie m@n'adZj@rI2 +mercedes m3:s'eIdi:z +mercenary m3:s@n@rI2 +merest mi@r@st +meringue m@rang +metabolic mEt@b'0lIk +metaphor mEt@fO@ +metallic mEt'alIk +miaou mi:'aU +miaow mi:'aU +mica maIk@ +microorganism maIkroU'O@g@nIz@m +midday m,Idd'eI +midterm m'Idt,3:m +mildew mIldju: +mileage maIlI2dZ +milestone maIlstoUn +militia m@lIS@ +minibus mInIbVs +mining maInIN // not mini +minuet mInju:'Et +minutely maIn'ju:tlI2 +mirage mIrA:Z +misery mIz@rI2 +misled mIsl'Ed +mischievous mIstSIv@s +miscreant mIskri@nt +missed mIst +misses mIsIz +misted mIstI2d +mister mIst3 +mitre maIt3 +mixer mIks3 +modem moUdEm +moderate m0d@reIt $verb +momentum $2 +monday mVndeI +monotone m0n@toUn +monsieur m@sj3: +?5 monsieur m@sjVR +mony mVnI2 // monies, monied +moraine m@reIn +morale m@ral +morass m0r'as +mosquito m0sk'i:toU +motel moUt'El +motif moUt'i:f +moustache m@st'aaS +mouths maUDz $only +movies mu:vI2z +mundane $2 +murmur m3:m3 +?5 murmur mVRm3 +museum mju:z'i@m +mutate mju:t'eIt +myriad mIrIad +myrrh m3: +?5 myrrh mVR + +naif naI'i:f +naïve naI'i:v +nascent neIs@nt +nativity $2 +natural natS@r@L +nauseam nO:zi@m +nazi naatsI2 +necklace nEkl@s +necktie nEktaI +negate nI2geIt +neglect nI2glEkt +neon ni:0n +nepenthe nIp'EnTI2 +niche ni:S +noah noUV +nobly noUblI2 $verbf +nobody 'noUb0dI2 +nocturnal $2 +nomenclature n@mENkl@tS3 +nonsense n0ns@ns +nonetheless n0nD@l'Es +not noUt // for noted, notable, etc +nott n0t +nothing nVTI2N +noway noUweI +nowhere noUwe@ + +oases oU'eIsi:z +oasis oU'eIsIs +obesity oUb'i:s@tI2 +obey oUb'eI +obituary 0b'ItSU@I2 +object $1 $onlys +object $verb +obsolete 0bs@li:t +obstacle 0bst@k@L +ocean oUS@n +oceanic oUSI2'anIk +ochre oUk3 +o'clock @kl0k +october $2 +oeuvre 3:vr@ +?5 oeuvre VRvr@ +offer 0f3 +offers 0f3z +ogre oUg3 +okay oUk'eI +omelet 0ml@t +omelette 0ml@t +opaque oUp'eIk +opine oUp'aIn +opponent @poUn@nt +oppose @poUz +opposer @poUz3 +orange 0rIndZ +orion 0r'aI@n +ordeal O@d'i@l +orphan O@f@n // orphaned +outage $1 +outcome $1 +outer aUt3 +outbreak $1 +outburst $1 +outcast $1 +outcrop $1 +outcry $1 +outed aUtId +outfit $1 +outing $1 +outlaw $1 +outlet $1 +outlier 'aUtl,aI3 +outline $1 +outlive aUtl'Iv +outlook $1 +outpost aUtpoUst +output $1 +outrage $1 +outset $1 +outskirt $1 +outward aUtw3d +overage oUv@r-eIdZ +overly oUv3lI2 +overt oUv'3:t +overtly oUv'3:tlI2 +oxen 0ks@n + +padre pA:dreI +paella paI'El@ +papa pa2p'A: +papal peIp@L +pagan peIg@n +pageant padZ@nt +panacea pana2s'i:@ +panache $2 +parabola p@rab@l@ +paralysis p@ral@sIs +parameter p@ramIt3 +parasite par@saIt +pariah p@raI@ +parole pa2r'oUl +passenger pasINdZ3 +pasted peIstId +pasting peIstIN +pastry peIstrI2 +pate pateI +pathos peIT0s +patrol p@troUl +pear pe@ +peculiar pI2kju:lI3 +pedalo pEd@loU +pejorative p@dZ0r@tIv +penal pi:n@L +peninsula p@n'InsjUl@ +penis pi:nI2s +perfectly p3:fEktlI2 +perfect p3:fEkt $onlys +perfect p3fEkt $verb +perimeter p@rImIt3 +permit p3:mIt $onlys +permit p3mIt $verb +persona p3:s'oUn@ +perspex p3:spEks +perus p@ru:z +peruse p@ru:z +petite p@ti:t +petroleum p@troUli:@m +pharaoh fe@roU +philistine fIlI2staIn +philosophy fIl'0s@fI2 +phoenix fi:nIks +photograph foUt@graf +piano pI2anoU +piecemeal p'i:sm,i:l +pier pi@ +pigeon pIdZ@n +pigsty pIgstaI +pilot paIl@t +pineapple p'aInap@L +pint paInt +pioneer paI@n'i@ +pious paI@s +pipette pIp'Et +piquant pi:k@nt +piracy paI@r@sI2 +pirate paIr@t +piteous pIti@s +pituitary $2 +plaguing pleIgIN +plunging plVndZIN +plus plVs +poky poUkI2 +politer p@l'aIt3 +politic p0l@tIk +poll poUl +polls poUlz +penchant p0nS0n +portend po@t'End +postage poUstIdZ +practise praktIs +prayer pre@ +precedence prEsId@ns +precedent prEsId@nt +precept pri:sEpt +precipice prEsIpIs +precise prI2saIs // 's' not 'z' at end +predefine pri:dIf'aIn +predicate prEdIkeIt +preface prEf@s +preferably prEf@-r@blI2 $verbf +prelude prElju:d +preparation prEp@r'eIS@n +present prEz@nt $only +present $verb +presently prEz@ntlI2 $verbf +preset pri:sEt +precis preIsi: +prestige prEst'i:Z +pretext pri:tEkst +pretty prItI2 +privilege prIvIlIdZ +privy prIvI2 +prix pri: +proactive proU'aktIv +pros proUz +proceed proUsi:d $onlys +proceed $verb +proceed $only +progress proUgrEs $only +progress $verb +project pr0dZEkt $onlys +project $verb +promenade pr0m@n'A:d +pronoun proUnaUn +propaganda pr0p@g'and@ +protegee pr0t@dZeI +protest proUtEst $onlys +protest $verb +protocol proUt@k0l +psst psst +psyche saIki: +psyched saIkd +psychiatrist saIk'aI@trIst +psychosis saIk'oUsIs +psychotic saIk'0tIk +pud pUd // and pudding +punative pju:n@tIv +puny pju:nI2 +purist pju:r-Ist +purport p3:p'o@t +purportedly p3p'o@tIdlI2 $verbf +pyjama p@dZA:m@ +pyrites paIr'aIti:z +pythagoras paIT'ag@r@s +python paIT@n +pyramidal pIr'amId@L + +quash kw0S +quaternary kw@t3:n@rI2 +question kwEstS@n +quiche ki:S +quiver kwIv3 + +rabid reIbId +radar reIdA@ +radioactive reIdI2oU'aktIv +radon reId0n +ragged ragId +rainforest r'eInf,0rIst +rajah rA:dZA: +rapier reIpi@ +rapport rap'o@ +rarest re@r@st +rascal raask@L +ratatouille rat@t'u:I2 +rather rA:D3 +ratio reISI2oU +rationale raS@n'al +ravine r@vi:n +rawest rO:@st +re r,i: +read ri:d +read rEd $past $only +readme ri:dmi: +reading ri:dI2N +readonly ,ri:d'oUnlI2 +really ri@lI2 $verbf +rearm ri:'A@m +rebel rI2bEl $verb +recall ri:kO:l +recall $2 $verb +recess ri:sEs +recipe rEsIpi: +reciprocal rI2sIpr@k@L +recommend r,Ek@mEnd +recommendation rEk@mEnd'eIS@n +record rEkO@d $onlys +record $verb +redcross $2 +redeye r'Ed,aI +redo ri:du: +reference rEfr@ns +referee rEf@r'i: +referral rIf'3:r@L +referring rIf'3:rIN +refit ri:fIt +reflex ri:flEks +reflux ri:flVks +reg rEdZ +regal ri:g@L +regime reIZ'i:m +region ri:dZ@n // & regional +reign reIn +rein reIn +reined reInd +reindeer reIndi@ +reinvent ri:Inv'Ent +refinery rI2faIn@rI2 +relative rEl@tIv +relic rElIk +relish rElIS +rely rI2laI +remedy rEm@dI2 +remit ri:mIt +remit ri:m'It $verb +remnant rEmn@nt +rendevous r0ndIvu: +rendezvous r0ndIvu: +renegade rEn@geId +rental rEnt@L +repel rI2pEl +replay ri:pleI +reply rI2plaI // for replied +repost r,i:p'oUst +reprisal rI2praIz@L +reputation rEpju:t'eIS@n +requiem rEkwIEm +rescue 'rEskju: +rescuer rEskju:3 +reservation rEz3v'eIS@n +reservoir rEz3vwA@ +resin rEzIn +respiration rEspIr'eIS@n +respiratory rI2spIr@t@rI2 +respite rEspaIt +rest rEst // for rested +restaurant rEstr0nt +restful rEstf@L +restoration rEst@r'eIS@n +retaliatory rIt'ali:@t@rI2 +retrial ri:traI@l +retry ri:traI +reuse ri:'ju:z +rever rI2vi@ // revered +rhododendron roUd@d'Endr@n +rhetoric rEt@rIk $onlys +rhinoceros raIn'0s@r@s +ribena raIb'i:n@ +ridiculous $2 +righteous raItS@s +riposte rI2p0st +risen rIz@n +romance roUm'ans +rotate $2 +rouse raUz +rout raUt // for routed +routine $2 +row roU +(row about) 'raU||,a2baUt +(row over) 'raU||,oUv3 +ruby ru:bI2 +rugged rVgId +ruin ru:In // for ruining + +sabotage sab@tA:Z +saboteur sab@t'3: +?5 saboteur sab@t'VR +sabre seIb3 +sachet saSeI +sacred seIkr@d +sacrifice sakrIfaIs +safety seIftI2 +saga sA:g@ +salad sal@d +saline seIlaIn +san ,san +sardine $2 +satan seIt@n +satellite sat@laIt +saucepan sO:sp@n +saudi saUdI2 +says sEz +schema ski:m@ +shallow SaloU +salmon sam@n +scalpel skalp@L +scared ske@d +scaring ske@rIN +scenic si:nIk +scald sk0ld +sclera skli@r@ +seabed si:bEd +sealion si:laI@n +seance seI0ns +secrecy si:kr@sI2 +secret si:kr@t +secretive si:kr@tI2v +secretary sEkr@trI2 +sedate sI2deIt +separate sEp@-r@t +separate sEp@reIt $verb +semen si:m@n +semicolon sEmIk'oUl0n +senator sEn@t3 +sens sEns // for sensible +sentient sEnti@nt +sequine si:kwIn +series si:ri:z +serene s@ri:n +sergeant sA@dZ@nt +settee $2 +severe sIv'i@ $only +severely sIv'i@lI2 $verbf +several sEvr@L +shampoo $2 +sheriff S'ErIf +shew SoU +shia Si:@ +shillelagh S,Il'eIl@ +shiver SIv3 +shone S0n +shoulder SoUld3 +shrilly SrIllI2 $verbf +sibelius sI2beIli@s +sierra sI'e@r@ +sikh si:k +silhouette sIlUw'Et +simon saIm@n +simultaneous $3 +singly sINglI2 $verbf +sincerest sIns'i@@st +sinew sInju: +sir s,3: +?5 sir s,VR +site saIt // for sited +ski ski: +skies skaIz +skied ski:d +snooker snu:k3 +society s@saI@tI2 +sofa soUf@ +soldier soUldZ3 +solemn s0l@m +solicit s@lIsIt // solicited,ing +solute s0lju:t +solution s@lu:S@n +son sVn +sonar soUnA@ +sonny sVnI2 +sooth su:D +soundbite saUndbaIt +souvenir su:v@n'i@ +sorbet sO@beI +soviet soUvi@t +spaghetti spag'EtI2 +spasm spas@m +specific sp@sIfIk +specimen spEsIm@n +spraycan spreIkan +spinach spInItS +spinal spaIn@L +squirrel skwIr@L +standby standbaI +stagnate $2 +stampede $2 +strychnine str'Ikni:n +slavish sleIvIS +sterile stEraIl +stomata stoUm@t@ +stonily stoUnIlI2 +storytell stO:rI2tEl +stripy straIpI2 +suave swA:v +subjected sVbdZ'EktId +sublime $2 +subordinate $2 +subpoena su:p'i:n@ +subsequent sVbsIkw@nt +subside s@bsaId +subtly sVt@lI2 $verbf +suede sweId +suet su:It +suffice s@faIs +suffuse $2 +sundae sVndeI +sundial sVndaI@l +suite swi:t $onlys +superb su:p'3:b +superman su:p3man +supplier s@plaI3 +suppose $2 +suprise $2 // misspell +surest SU@@st +surrogate sVr@geIt +survey s3:veI $onlys +?5 survey sVRveI $onlys +survey $verb +suse su:s@ +(su se) su:s@ +suspect sVspEkt $onlys +suspect $verb +symbol sImbVl +sync sINk +synthesis sInT@sIs $only +synthesise sInT@saIz +syringe $2 + +tablet tabl@t +taboo $2 +tabu tabu: +talent tal@nt +tallyho talI'hoU +tampon tamp0n +tangerine tandZ@r'i:n +taoiseach ti:S@x +tapestry tap@strI2 +tarantula t@rantjUl@ +tariff tarIf +taskforce t'askf,o@s +tatar tA:t3 +tearing te@r-I2N +tear ti@ $onlys +tear te@ $verb +teddybear t'Ed,Ib,e@ +ten tEn // untenable +termini t3:mInaI +terrain t@reIn +testes tEsti:z +tobacco $2 +telephon tElI2foUn // for telephoning +temperature tEmprItS3 +temporary tEmpr@rI2 +thames tEmz +thereof ,De@'0v +thereon ,De@'0n +thereto ,De@'tu: +thesis Ti:sIs +theta Ti:t@ +tho DoU +thousand TaUz@nd +throughout $2 +tidal taId@L +tidy taIdI2 +tilde tIld@ +timetable taImteIb@L +timider tImId3 +tiny taInI2 +tirade taIr'eId +tis tIz +titan taIt@n +today t@deI +todo t@du: +tombola t0mb'oUl@ +ton tVn $onlys +tonage tVnIdZ +tone toUn +tonight t@naIt +tonne tVn +tornado tO@n'eIdoU +touche tu:SeI $only +transcript $1 $onlys +transfer $1 $onlys +transfer $verb +transport transpo@t $only +transport $verb +transports transpo@t|s $nounf +trajectory tr@dZEkt@rI2 +travesty trav@stI2 +treatise tri:tIz +triage tri:A:Z +tribunal traIb'ju:n@L +trilogy trIl@dZI2 +trio tri:oU +trojan troUdZ@n +trolley tr0lI2 +trophy troUfI2 +truely tru:lI2 $verbf +truest tru:@st +tryst trIst +tudor tju:d3 +tulip tju:lIp +turnkey t3:nki: +?5 turnkey tVRnki: +tuna tju:n@ +twas tw0z +twilight twaIlaIt +twos tu:z +typo taIpoU +tyr taI@ + +ukulele ju:k@l'eIlI2 +ultraviolet $3 +umbrella $2 +unable Vn'eIb@L +unaware Vn@w'e@ +uncle VNk@L +undeny VndIn'aI +undermine Vnd3m'aIn +undo Vnd'u: +uni ju:nI2 +uninterest Vn'Int@r@st +university ju:nIv'3:sItI2 +unite ju:n'aIt +unread Vnr'Ed $only +unsure VnS'U@ +untidy Vnt'aIdI2 +untie Vnt'aI +unty Vnt'aI // for untying +unwind Vnw'aInd +unwound Vnw'aUnd +update $1 $onlys +update $verb +upgrade $1 $onlys +upgrade $verb +uproot $2 +uplift $2 +upset $1 $onlys +upset Vps'Et $past +upstart $1 +uptight $2 +urine jU@rIn +usable ju:z@b@L +usage ju:sIdZ +use ju:s $onlys +use ju:z $verb +useage ju:sIdZ +using ju:zIN +useful ju:sf@L +useless ju:sl@s +utensil ju:t'Ens@L + +valentine val@ntaIn +vagary veIg@rI2 +vagina v@dZaIn@ +(van den) vandEn +(van der) vand3: +variety v@raI@tI2 +vase vA:z +veg vEdZ +vegetable vEdZIt@b@L +vehicle vi@k@L +vegan vi:g@n +vengeance vEndZ@ns +venus vi:n@s +versus v3:sIz +vestige vEstIdZ +vex vEks // for vexed +vicar vIk3 +vigilante vIdZIl'antI2 +villi vIlaI +vinyl vaInIl +violin $2 +virus vaI@r@s +viral vaI@r@L +visa vi:z@ +visit vIzIt +voila vwal'a +volcano v0lk'eInoU + +wane weIn +wannabe w0na2bi: +warily we@IlI2 $verbf +warring wO@rIN +wastage weIstIdZ +wast weIst // wasted +watershed wO:t3SEd +watson w0t|s@n +waxy waksI2 +webpage wEbpeIdZ +weekend $2 +wehrmacht ve@maxt +website wEbsaIt +weekend wi:k'End +wheelbarrow w'i:l_b,aroU +whichever $2 +whitish waItIS +whois hu:'Iz +whol hoUl // for wholly +whore ho@ +wicked wIkId +wilderness wIld3nEs +winding waIndI2N // verb +wind waInd $verb +winded wIndId +winged wINd +wither wID3 // not with+er +without $2 +wordprocessor $2 +wordprocess $2 +workshy w3:kSaI +workstation w'3:kst,eIS@n +?5 workstation w'VRkst,eIS@n +wound wu:nd +wound waUnd $past +(wound up) w,aUnd||'Vp +wounded wu:ndId +wretched rEtSId +writable raIt@b@L +writh raID +wrongdoing r0Ndu:IN + +xmas Eksma2s + +ya ja2 +yer j3 +ye ji: +yea jeI +yoghurt j0g3t +yoyo joUjoU + +zulu zu:lu: + +// place names + +Altrincham O:ltrIN@m +Anglesey aNg@LsI2 +Argyle A@g'aIl +Bacup beIk@p +Berwick bErIk +Betws bEtUs +Cambridge keImbrIdZ +Cheadle tSi:d@L +Cheshire tSES3 +Chiswick tSIzIk +Dolgellau d0lg'EClaI +Dumfries dVmfr'i:s +Dyfed d'VvId +Edinburgh EdInb%Vr@ +Ely i:lI2 +Exeter EksIt3 +Exmoor EksmU@ +Fylde faIld +Glasgow glaazgoU +Glenrothes gl,Enr'0TI2s +Greenwich grEnItS +Harwich harIdZ +Hasting heIstI2N +Kirkcaldy kIRk'0dI2 +Leven li:v@n +Lincoln lInk@n +Malvern mO:lv3n +Morecambe mo@k@m +Norfolk nO@f@k +Norwich n0rItS +Plymouth plIm@T +Regis ri:dZI2s +Rhyl rIl +Salisbury sO:lsbrI2 +Southend sA:f'End +Suffolk sVf@k +Walsall wO:lsO:l +Watford w0tf@d +Welwyn wElIn +Wirral wIr@L + + +Ababa aba2b@ +Accra akra2 +Addis adIs +Adelaide ad@leId +Aegean $2 +Afghan afgan +Aires aIrIz +Alamo al@moU +Albuquerque alb@k'3:kI +Algiers $2 +Amman a2m'A:n +Andes andi:z +Angeles andZ@li:z +Antarctica $2 +Antigua ant'i:g@ +Antilles ant'Ili:z +Apennine ap@naIn +Arkansas A@k@nsO: +Athens aTInz +Bahrain $2 +Belgrade $2 +Barents bar@nt|s +Bangledesh baNgl@d'ES +Beijing $2 +Beirut beIr'u:t +Belize bEl'i:z +Bengal b,Eng'O:l +Benin bEnIn +Berlin b3:l'In +Bhutan bu:t'an +Bogata b0ga2t'A: +Bucharest bu:k@r'Est +Budapest bu:d@p'Est +Buenos bweIn0s +Burundi bUr'UndI +Brazil braz'Il +Cadiz $2 +Cairo kaIroU +Calcutta $2 +Canada kan@d@ +Carolina kar@l'aIn@ +Caribbean kar@b'i@n +Chicago SIk'A:goU +Chile tSIlI2 +Ceylon $2 +Cologne k@loUn +Congo $1 +Copenhagen koUp@nh'eIg@n +Cruz kru:z +Cyprus saIpr@s +Dahomey $2 +Damascus da2mask@s +Danish deInIS +Delhi dElI2 +Djibouti dZIb'u:tI +Egyptian IdZ'IpS@n +Eire e@r@ +Geneva dZ@ni:v@ +Harare h@rA:rI +Hanoi han'OI +Hawaii h@w'aIi: +Hawaiian h@w'aI@n +Hebrew hi:bru: +Hebrides hEbr@di:z +Honduras h0nd'jU@ra2s +Houston hju:st@n +Idaho $1 +Illinois Il@n'OI +Indochina IndoUtS'aIn@ +Israeli Izr'eIlI2 +Istanbul ,Ist,anb'Ul +Italia It'alI2@ // Italian(s) +Jakarta $2 +Jerusalem dZ@ru:s@l@m +Johannesburg $2 +Kalgoorlie kalgU@lI2 +Karachi k@rA@tSI2 +Kiev ki:Ev +Khmer kmi@ +Korea kOr'i:@ +Korean kOr'i:@n +Kuala kwA:la2 +Lagos leIg0s +Leone li:'oUn +Lesotho l@s'u:tu: +Liberia laIb'i@ri:@ +Lima li:ma2 +Luxembourg lVks@mb3:g +?5 Luxembourg lVks@mbVRg +Madagascar mad@g'ask3 +Madras m@draas +Madrid m@drId +Malawi ma2lA:wI2 +Maldives mO:ld'i:v +Mali mA:lI2 +Manhatten $2 +Massachusetts $3 +Maya maI@ +Mayan maI@n +Melbourne mElb3n +Memphis mEmfIs +Mexico $1 +Milan $2 +Mindanao mInd@n'aU +Missouri mIs'U@rI +Montreal m0ntrI'O:l +Morocco m@r0koU +Munich mju:nIk +Nairobi naIr'oUbI +Nauru naUru: +Nepal nEp'O:l +Noumea nu:m'eI@ +Oahu oU'A:hu: +Ohio oUh'aIoU +Oman oUm'an +Oregon 0rIg@n +Pacific pa2sIfIk +Palestine pal@staIn +Palestinian pal@st'Ini:@n +Panama pan@mA: +Paris parIs +Peking pi:k'IN +Peru p@ru: +Phillipine fIlIpi:n +Philipine fIlIpi:n // misspell +Poland poUl@nd +Polish poUlIS $capital $only +Portuguese po@tju:g'i:z +Prague prA:g +Pyrenees pIr@n'i:z +Qatar katA@ +Quebec kwI2bEk +Rico ri:koU +Saigon saIg'0n +Santiago santI'A:goU +Savannah $2 +Savoy sa2vOI +Seattle si:'at@L +Seychelle seIS'El +Slovak sloUvak +Seoul soUl +(sri lanka) sr,i:||l'anka2 +Sudan su:d'an +Suez su:Iz +Sulawesi su:la2w'eIsI +Suriname sU@rIn'am +Taipei t,aIp'eI +Taiwan taI'wan +(tel aviv) t,El||a2v'i:v +Tibet tIb'Et +Totonto t@r0ntoU +Timor ti:mo@ +Tokyo toUkIoU +Toulouse tu:l'u:z +Ukraine ju:kr'eIn +Ural ju:@r@L +Utah ju:tA: +Utrecht ju:trECt +Vancouver $2 +Vegas veIg@s +Vienna vI'En@ +Winnipeg wInI2pEg +Wisconsin wIsk'0nsIn +Wyoming waI'oUmI2N +Xhosa kO:s@ +zaire zaI'i@ +zimbabwe zI2mbA:bwI2 + +Aaron e@r@n +Abe eIb +Abu abu: +Abraham eIbr@ham +Ada eId@ $onlys +Adrian eIdri@n +Agnes agn@s +Ahab eIhab +Ahmed axmEd +Alan al@n +Alec alIk +Alex alIks +Alfred alfrId +Alice alIs +Allen al@n +Alison alIs@n +Amanda $2 +Amy eImI2 +Andre 0ndreI +Anthony ant@nI2 +Anton ant0n +Ares e@ri:z +Astley astlI2 +Barbara bA@b@r@ +Boris b0rIs +Brien braI@n +Carol kar@l +Calliope ka2laI@pI +Canberra kanb@r@ +Cassandra k@sandr@ +Cassey keIsI2 +Catherine kaTrIn +Chris krIs +Connor k0n3 +Daphne dafnI2 +Darryl dar@L +Davie deIvI2 +Davis deIvIs +Denise d@ni:s +Derek dErIk +Dinah daIn@ +Dominic d0mInIk +Donald d0n@Ld +Dougall du:g@L +Dylan dIl@n +Edith i:dIT +Elizabeth I2lIz@b@T +Emma Em@ +Evan Ev@n +Gary garI2 +Geraint gEraInt +Gilbert gIlb3t +Giles gaIlz +Glynn glIn +Graeme greI@m +Graham greI@m +Hadrian heIdri:@n +Hugh hju: +Hughes hju:z +Huw hju: +Iain i:@n +Ian i:@n +Igor i:go@ +Imogen Im@dZ@n +Irene aIri:n +Isaac aIs@k +Isabel Iz@bEl +Isiah aIz'aI@ +Ivan aIv@n +Jacob dZeIk@b +Jamie dZeImI2 +Jesus dZi:z@s +José hoUs'eI +Jose hoUs'eI +Juan hwA:n +Judy dZu:dI2 +Karen kar@n +Karene ka2ri:n +Katherine kaTrIn +Kieran ki@r@n +Laurence l0r@ns +Lawrence l0r@ns +Lenore lEn'o@ +Leroy li:rOI +Liam li:@m +Louis lu:I +Louise lu:w'i:z +Mahmoud maxm'u:d +Malcolm malk@m +Maria ma2ri:@ +Marie ma2ri: +Margaret mA@gr@t +Marilyn mar@lIn +Matilda ma2tIld@ +Matthew maTju: +Maurice m0rIs +Mavis meIvIs +Melissa $2 +Miami maI'amI +Michael maIk@L +Michelle mI2SEl +Miguel mi:Q'El +Mohammad moUh'amId +Muhammad moUh'amId +Moira mOIr@ +Neville nEvIl +Nicholas nIk@l@s +Nicosia nIk@s'i:@ +Nigel naIdZ@L +Omar oUmA@ +Oscar 0sk3 +Ottawa 0ta2w@ +Pamela pam@l@ +Pandora $2 +Penelope p@nEl@pI2 +Phoebe fi:bi: +Rachel reItS@L +Rica ri:ka2 +Robert r0b3t +Roderick r0drIk +Samantha s@manT@ +Sarah se@r@ +Seamus SeIm@s +Sean SO:n +Sheila Si:l@ +Sonia s0nj@ +Sophie soUfI2 +Stephen sti:v@n +Stewart stju:3t +Stuart stju:3t +Theresa t@ri:z@ +Thomas t0m@s +Tina ti:n@ +Tracy treIsI2 +Tricia trIS@ +Wally w0lI2 +Yvonne $2 +Zoe zoUI + +Andromeda andr'0mId@ +Buchannan bju:k'an@n +Campbell kamb@l +Disney dIznI2 +Patel p@t'El +Prentice prEntIs +Reuter rOIt3 +Ubuntu u:b'u:ntu: +Yaesu jeIsu: +zhivago ZI2vA:goU + + + +(de jure) deIdZ'U@rI2 +(en masse) ,0n||m'as +(en route) ,0n||r'u:t +(each of) i:tS||@v $pause +(far more) f'A@_m,o@ +(few more) f'ju:m,o@ + +(first place) f'3:st_pl,eIs +?5 (first place) f'IRst_pl,eIs +(here and there) h'i@||@nd||D'e@ +(most of) moUst||@v +(such as) sVtS||_a2z $pause + +(too few) t'u:||f,ju: +(too many) t'u:||m,EnI +(too much) t'u:||m,VtS + +//************************************************************************* +// COMMON WORDS +//************************************************************************* + +(no one) 'noU'w0n +(no longer) n,oU||l'0N3 +(no more) n'oU,mo@ + +so ,soU $strend2 $verbf +(so far) s'oU||f,A@ $strend2 +(so many) s,oU||m'EnI +(so much) s'oU||m,VtS + +//prepositions +// these should be stressed at the end of a sentence + +of 0v $u $only +?6 of Vv $u $only +(of a) @v@ $nounf +(of an) @v@n $nounf +(of which) 0vw'ItS $pause +?6 (of the) %VD@2 $nounf +?6 (of which) Vvw'ItS $pause + +for fO@ $u +(for a) f@@ $nounf +(for an) f@@n $nounf +(for the) f3D@2 $nounf +(for a while) f@@||w'aIl +(for one) fO@w'0n $atend + +to t@5 $verbf // @ change to U before vowel +(to be) t@bI2 $pastf +(to be) t@||'bi: $atend +(to to) %tU_t@5 $verbf +(to and fro) tu:@ndfr'oU +to tu: $u $atend + + +at at $nounf $only $u +(at a) %at@ $nounf +(at once) a2t_w0ns +(at will) a2t_w'Il + +with wI2D +(with the) wI2DD@2 $nounf + +in I2n $strend $only $nounf +(in the) I2nD@2 +(in which) In||w,ItS $pause + +on ,0n $strend2 +(on the) %0nD@2 + +(out of) ,aUt@v +into ,IntU +onto ,0ntU $strend2 +unto ,VntU +upon @p,0n +from %fr0m +(from where) %fr0m||w'e@ $pause +(from which) %fr0m||w'ItS $pause +up ,Vp $strend2 +down ,daUn $only $strend2 +by %baI +across @kr,0s $strend2 +per %p3: +(per cent) p3||s'Ent +(per se) p,3:||s'eI +through %Tru: $strend2 +toward %tUwO@d +over ,oUv3 $strend2 $only +under ,Vnd3 $strend2 $only +within %wID,In +without %wID,aUt $strend2 +above @b,Vv $strend2 +about a2b,aUt $strend2 +against a2gEnst +ahead a2hEd +among a2m,VN $strend2 +amongst a2m,VNst $strend2 +around a2raUnd +before bI2f,o@ $strend2 +behind bI2h,aInd $strend2 +below bI2l,oU $strend2 +beneath bI2n,i:T $strend2 +beyond bI2j,0nd $strend2 +beside bI2s,aId $strend2 +between bI2tw,i:n $strend2 +together t@g,ED3 $strend2 +near ,ni@ $strend2 +thence DEns + + +//aux. verbs + +be %bi: $pastf $only +been ,bi:n $pastf $only +being ,bi:IN $pastf $only $strend2 +is I2z $pastf $only // use contraction for 'is a' +am %am $nounf $only +are %A@ $pastf $only +was %w0z $pastf $only +wast %w0st $only $pastf $only +were %w3: $pastf $only +isn't ,Iz@nt $pastf $strend2 +aren't ,A@nt $pastf $strend2 +weren't ,w3:nt $pastf $strend2 + +will $u+ $only $verbf $strend2 +(will to) wIlt@5 +would $u+ $verbf $only $strend2 +(would have) w%Udh%a2v $pastf +(would have) wUdhav $pastf $atend +(would have to) wUd,havt@5 $verbf $strend2 +(wouldn't have) ,wUdnt@v $pastf $strend2 +(wouldn't have to) ,wUdntavt@5 $verbf $strend2 +won't woUnt $u+ $verbf $strend2 $only +wouldst $u+ +(won't have) woUnta2v $pastf $u1 +(won't have) woUnthav $pastf $atend +(won't have to) w'oUntavt@5 $verbf $strend2 + +must $verbf +(must have) mVsta2v $pastf $1 +(must have) mVsthav $pastf $atend +(must have to) m,Vstavt@5 $pastf +mustn't mVsnt $verbf +(mustn't have) mVsntha2v $pastf $u1+ +(mustn't have to) m'Vsnthavt@5 $pastf + +shall ,Sal $verbf $only $strend2 +shalt ,Salt $verbf $only +should ,SUd $verbf $only $strend2 +(should have) SUd@v $pastf $u1+ +(should have to) SUd,havt@5 $verbf $strend2 +shouldn't ,SUdnt $verbf $strend2 $only +(shouldn't have) SUdnth@v $pastf $u1+ +(shouldn't have to) 'SUdntavt@5 $verbf $strend2 +shalln't ,SA:nt $verbf $strend2 +shan't ,SA:nt $verbf $strend2 + +can %kan $verbf $only $strend2 +can't kA:nt $verbf $only $strend2 +(can't have) kA:nta2v $pastf +(can't have to) ,kA:nt'avt@5 $verbf $atend +could %kUd $verbf $strend2 $only +(could have) ,kUda2v $pastf +(could have) kUdhav $pastf $atend +(could have to) kUd,havt@5 $verbf $strend2 +couldn't ,kUd@nt $verbf $strend2 +(couldn't have) kUd@nt@v $pastf $u1+ +(couldn't have to) 'kUd@ntavt@5 $verbf $strend2 + +may meI $verbf $strend2 +(may have) meIha2v $pastf $u1+ +(may have to) ,meIh'avt@5 $verbf $atend +might ,maIt $verbf $strend2 $only +(might have) maItha2v $pastf $u1+ +(might have to) ,maIth'avt@5 $verbf $atend + +have %hav $pastf $only +(have been) %hav%bIn $pastf +(have to) havtU $atend +has %ha2z $pastf $only +has haz $only $atend +(has been) %haz%bIn $pastf +hath %haT $pastf $only +had %had $pastf $strend2 $only +(had been) %had%bIn $pastf +having ,havI2N $strend2 $pastf $only +haven't hav@nt $pastf +hadn't had@nt $pastf +hasn't haz@nt $pastf + +get %gEt $strend2 $pastf $only +getting ,gEtIN $strend2 $pastf $only +got %g0t $strend2 $pastf $only + +go ,goU $strend2 $only +goes %goUz $strend2 $only +going ,goUI2N $strend2 $only +gone %g0n $strend2 $only +went %wEnt $strend2 $only + +do du: $verbf +(do not) du:n0t $verbf $u2+ +does dVz $verbf +(does not) dVzn0t $verbf $u2+ +don't doUnt $verbf +doesn't dVz@nt $verbf +doesnt dVz@nt $verbf +doing ,du:I2N $strend2 $only +did dId $verbf +(did not) dIdn0t $verbf $u2+ +didn't dIdnt $verbf +done dVn + +putting pUtIN +put ,pUt $onlys $strend2 + +begin bI2gIn +beginning bI2gInI2N +began bI2gan +begun bI2gVn + +become bI,kVm $strend2 +became bI,keIm $strend2 + +we're %wi@ +you're %jO@ +?7 you're %jU@ +they're %DeI3 +it'd %It@d +that'd %Dat@d +there'd %De@d + +I'll %aIl $verbf +you'll %ju:l $verbf +he'll %hi:l $verbf +she'll %Si:l $verbf +we'll %wi:l $verbf +they'll %DeIl $verbf +there'll %De@l $verbf + +I've %aIv $pastf +you've %ju:v $pastf +he's %hi:z $pastf +she's %Si:z $pastf +we've %wi:v $pastf +they've %DeIv $pastf + +I aI $u+ $verbf $only +(I am) %aIa2m +he %hi: $verbsf +she %Si: $only $verbsf +it %It $verbsf +(it has) I2t||h'az $atend +we %wi: $verbf $only +you %ju: $verbf +they %DeI $verbf + +thee ,Di: +thou DaU +thy ,DaI +thine ,DaIn + +me ,mi: $only +him ,hIm $only +us ,Vz $only +them ,DEm $only + +my %maI $nounf $strend2 +his h%Iz $nounf $only $strend2 +her %h3: $nounf $only +hers %h3:z $strend2 +its %Its $nounf +our %aU@ $nounf $only +?3 our %aU3 $nounf $only +your %jO@ $nounf $only +?7 your %jU@ $nounf $only +their %De@ $nounf $only +theirs De@z + +none n0n +noone noUw0n +anyone EnIw0n +everyone EvrIw0n +someone sVmw0n + +//conjunctions + +although OlD'oU $pause +and %and $pause $only +as ,az $pause $only +(as is) ,az,Iz $pause +(as it is) azIt'Iz_ +because bIk'Vz $pause +once $pause +or %O@ $pause $only +nor nO@ $pause $only +but ,bVt $pause $only +if ,If $pause $only +despite $pause +instead $pause +otherwise VD3waIz $pause +regardless $pause +since sIns $pause +thus DVs $pause +though ,DoU +whenever wEn,Ev3 $pause +within $pause +whoever hu:'Ev3 +whatever w0t'Ev3 $pause +while $pause +whilst waIlst $pause +(rather than) r'A:D3||Da2n $pause + +//some adverbs (note -ly suffix already implies verb-follows) + +just $verbf +never $verbf +now $verbf +soon $verbf +still $verbf +also $verbf +already O:lr,EdI2 $verbf $strend2 + +not ,n0t $verbextend $only $strend +(not have) n0ta2v $pastf $u1 +(not have) n0thav $pastf $atend +(not have to) ,n0thavt@5 $pastf $strend +(not a) ,n0t@ $nounf +only oUnlI2 $verbextend + +any ,EnI2 $nounf $only +many mEnI2 $nounf +(many of) mEnI|@v +some ,sVm $nounf $unstressend $only +(some one) sVmw0n +one w0n $nounf $onlys $unstressend +ones w0nz $only $unstressend + +this %DIs $nounf $strend $verbsf +(this one) D'Isw,0n $verbsf +that %Dat $nounf $strend2 $verbsf +(that a) ,Dat@ $nounf +(that an) ,Dat@n $nounf +(that it) ,Da2tIt $verbsf +(that one) D'atw,0n +(that the) %DatD@2 +these %Di:z $nounf $strend2 $only +those %DoUz $nounf $strend2 $only +there %De@ $strend2 $only + +than %Dan $only +(than a) ,Dan@ $nounf +(than an) ,Dan@n $nounf +then DEn $verbf + +// these should be stressed at the start of a sentence +which ,wItS $pause $strend2 $only $verbsf +who ,hu: $verbsf $pause $strend2 $onlys +whose ,hu:z $pause $only +what ,w0t $strend2 $onlys +how ,haU $strend2 $onlys +where ,we@ $pause $strend2 $onlys +why ,waI $strend2 $onlys +when ,wEn $strend2 $onlys + +wherever w%e@r-Ev3 +whereever w%e@r-Ev3 + + + +an a2n $nounf $only +a $nounf +a eI $atend +(a while) a2||waIl +(a la) ala +the D@2 $only $nounf +(the while) D@2||waI@l + +like laIk $strend2 + + + + +?6 noone noUwVn +?6 anyone EnIwVn +?6 everyone EvrIwVn +?6 someone sVmwVn +?6 (some one) sVmw0n +?6 one wVn $nounf $onlys $unstressend +?6 ones wVnz $only $unstressend + \ No newline at end of file diff --git a/dictsource/en_rules b/dictsource/en_rules new file mode 100644 index 00000000..00a580db --- /dev/null +++ b/dictsource/en_rules @@ -0,0 +1,5171 @@ + +// *************************************************************************** +// * Copyright (C) 2005,2006 by Jonathan Duddington * +// * jonsd@users.sourceforge.net * +// * * +// * This program is free software; you can redistribute it and/or modify * +// * it under the terms of the GNU General Public License as published by * +// * the Free Software Foundation; either version 2 of the License, or * +// * (at your option) any later version. * +// * * +// * This program 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 General Public License for more details. * +// * * +// * You should have received a copy of the GNU General Public License * +// * along with this program; if not, write to the * +// * Free Software Foundation, Inc., * +// * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * +// ***************************************************************************/ + +// This file is UTF-8 encoded + +// Conditional rules +// ?2 Use long 'a' in 'bath' +// ?3 General American +// ?4 Not General American +// ?5 split [3:] er [3:], ir [IR], ur [VR] +// ?6 'one' = [wVn], 'of' = [Vv] +// ?7 Scottish + + +.group a + _) a (_ a2 + _) a (- 'eI + _) a (_D ,eI + _) a's (_ eIz + D_) a (_ eI + a a + _C) a (_ A: + _CC) a (_ A: + a (Be# eI + a (BeCo_ a + a (BerC a + a (BerA a + @) a (Bia 'eI + @) a (Biu 'eI + a (Bet a + a (Bing E + _C) a (By_ eI + _CC) a (By_ eI + a (Ca_ 'A: + a (Cable 'eI + a (Cably 'eI + a (Cability eI + a (Cible 'eI + n) a (Cal eI + _) a (ve a + _) any EnI2 + _) a (von eI + &) a (_ @ + &b) a (_ =@ + grandC) a (_ A: + aa A: + aar 'A@ + a (Bo_ 'A: + _C) a (ble eI + _CC) a (ble eI + CCC) a (ble eI + _en) a (bl 'eI + _dis) a (ble 'eI + _un) a (ble 'eI + r) a (ciA eI + _r) a (cis eI + ae i: + ae (val 'i: + aea i@ + @) aed (_$2 d + _) ae (on i: + _) aer (o e@ + ae (l eI + h) ae (m i: + h) aemorrh Em@r + aer e@ + _c) aer %e@ + r) aer 'A@ + _) aero e@roU + aero (plan e@r@ + aero (sol e@r@ + m) ae (st aI + ah (_ A: + ah (C A: + &) ah (_ @ + m) a (hog @ + m) a (jes a + m) a (jesti @ + m) a (jor_ eI + _) a (k@ a2 + @) a (ki_ 'a + n) aked eIkId + @) ak (ia ak + aku (_ 'A:ku: + ao eI0 + ao (_ =aU + m) ao aU + t) ao aU + aor eI'o@ + g) ao (l eI@ + m) ao (ri aU + _) a (qu %a + aqu (a akw + aqua (t @kwa + aque (o eIkwI + aqui akwI + squ) a (sh 0 + a (sion eI + er) a (sur eI + l) a (th aa + a (the_+ eI + p) a (tien eI + a (tion 'eI + @) a (tious 'eI + _r) a (tion a + irr) a (tio a + n) a (tional a + n) a (tur eI + n) a (tura a + sign) a (ture I + st) a (tus eI + _) aw (a+ a2w + _) aw (ok a2w + aw O: + aw (AB aw + awal O:l + awe (B O: + awe (_ O: + _) awe O: + _) aw (f O: + _) aw (k O: + @) awi (_ 'A:wI + a (way_ @ + _) a (wh@ a2 + _) a (x a + _) a (x+ a + C) a (x+ a + ay eI + _) ay aI + _) ayle eI@L + _) ayr e@ + g) a (zeC% @ + h) a (z eI + h) a (zar 'a + l) a (z eI + r) a (z eI + @) a (zi_ 'A: + br) a (zil a + bl) a (zon eI + r) a (zor eI + sw) a (B 0 + sw) a (m_ a + sw) a (nk a + sw) a (th eI + sw) a (z A: + w) a (Be# eI + w) a (b 0 + w) a (d 0 + ow) a (d @ + w) a (s 0 + w) a (tc 0 + w) a (ter O: + _) a (viat eI + w) ay eI + @k) aze (_ 'A:zI2 + a (zy eI + a (zide 'eI + a (zz_ 'a + +.group ab + _) ab (@ a2b + ab (acA ab + @) abad (_ =a2bad + ab (att ab + _) abb ab + _) abbo ab@ + _) abb (rev a2b + _) ab (d ab + _) ab (duc a2b + + _) abel eIb@L + _) ab (er@ ,ab + C) aber (@ ab@ + _) aber (r a2bE + _) ab (i ab + _) ab (ide a2b + st) ab (il eIb + C) ab (ilit+ @b + ab (ject ab + ab (lativ ab + able eIb@L + abling 'eIblIN + ably eIblI2 + ab (neg ab + ab (olit ,ab + _) ab (ori ,ab + l) ab (our eIb + _) above (@P5 a2b,Vv + _) ab (ram eIb + _) ab (ra ab + _) ab (rad a2b + ab (ras a2b + ab (rog ab + ab (ruc ab + ab (sce ab + ab (sei ab + absen (t ,abs@n + ab (solu ab + ab (sti ab + ab (ular 'ab + b) ab (y eIb + b) ab (yl ab + &) able (_$4iev @b@L // suffix + &c) able (_ @b@L + @ct) able (_ =@b@L + &) ability ($7iev @b'IlItI2 // suffix + &) abilities ($9iev @b'IlItIz // suffix + &) ably (_$4iefv @blI2 + &c) ably (_$4fv @blI2 + +.group ac + _) ac (@ a2k + _) acc (@ a2k + _) acc (e a2ks + _) acqu a2kw + aca (dem ak@ + aca (demy a2ka + v) ac (a eIk + ac (a_ 'ak + ac (cent ak + ac (centu %ak + ac (cid ak + acc (ol ak + accou (t a2ku: + accu (ra akjU + accus (A a2kju:z + ace (_ eIs + _) ac (e a2s + acean (_ 'eIS@n + pl) ac (at a2k + pl) ac (eb @s + _pl) ac (ent @s + ac (erb as + _) ac (erbi a2s + _) ace (t asI + _) ace (ti a2si: + _) ache (+ eIk + d) ache (_ eIk + h) ache (_ eIk + r) ache (_ eIk + rt) ache (_ eIk + d) aches (_ eIks + h) aches (_ eIks + r) aches (_ eIks + rt) aches (_ eIks + tr) ach (e @k + _) ach a2tS + achia 'eIS@ + f) ac (ilit @s + _m) ace (d asI + m) achi (n @Si: + m) achina (t aSI2neI + ach (rom ak + ac (id_ as + _) ac (i a2s + acious 'eIS@s + _) ack (_ ak + _) ac (o ak + ac (on ak + ac (orn eIk + acme akmI2 + acne aknI2 + acou (st a2ku: + ac (quie ,a + _) acre eIk@ + ac (rid ak + ac (ro ak + m) acro (@ akr@ + _) ac (t ak + ac (tory 'ak + actu (A aktSu: + ac (ture 'ak + ac (um ak + ac (up ak + ac (ular 'ak + urf) ac (e_ Is + @n) ac (e_ Is + sol) ac (e_ Is + al) ac (e_ Is + im) ac (e_ Is + rr) ac (e_ Is + _b) ac (o eIk + y) ach (t 0 + &) ac (y_ @s + +.group ad + _) ad (@ a2d + _) add (@ a2d + _) adj a2dZ + cr) ad eId + ad (ag ad + ad (am ad + add (er ad + adequa adIkw@ + add (itiv ad + _) add (l ad + ad (en ad + l) ad (en eId + c) ad (enc eId + ad (eq ad + _) ad (i ad + adjec adZEk + ad (le eId + ad (junct_ ad + ad (jutan a + ad (man_ ad + ad (min_ ad + ad (mira ad + ado (les ad@ + ad (ol ad + ad (on ad + _) ad (ri@ ad + ad (ula ad + ad (ult_ ad + _) ad (um ad + ad (vent ad + ad (ventu a2d + ad (ver ad + adver (s adv'3: + ad (versa a2d + ad (vert_ ad + ad (vert a2d + ad (vo ad + hex) ad (e ad + torn) ad eId + _r) ad (A eId + b) ad (os_ eId + ad (iA eId + s) ad (is eId + _tr) ad (it a2d + qu) ad 0d + l) ad (y eId + mal) ad (y @d + r) ad (ic ad + +.group af + _) af (@ a2f + _) aff (@ a2f + af (ea a2f + st) aff aaf + aff (ab af + aff (er af + _) affia a2faI@ + aff (lu af + w) aff 0f + _) af (g af + afore a2fo@ + af (ri af + afro afroU + af (t+ aaf + @) af (ter 'aaf + +.group ag + _) ag (e eIdZ + _) agg (@ a2g + _) agg (rav ag + _) agg (reg ag + @) age (_ IdZ + @) ager (_ IdZ3 + c) age (_ eIdZ + _) age (i eIdZ + _) age (l eIdZ + _) ag (is eIdZ + &h) agen (_ A:g@n + ag (end a2dZ + agg (res a2g + agg (riev a2g + _) ag (o_ a2g + ag (ree a2g + _) ag (ron a2g + ag (o_ eIg + fl) age (_ A:Z + teen) ag (e eIdZ + _tr) ag adZ + bc) age eIdZ + dc) age eIdZ + ng) ag (e_ 'eIdZ + Cp) age (_ eIdZ + pp) age (_ IdZ + _ant) ag 'ag + enr) ag (e_ 'eIdZ + outr) ag (e_ eIdZ + der) ag (e_ eIdZ + st) ag (e eIdZ + mont) ag (e_ A:Z + @) age (ment IdZ + g) age (ment 'eIdZ + m) ag (enta @dZ + agh (_ A: + agio (_ 'A:dZIoU + _) ag (l@ a2g + &) ag (on_ @g + dr) agon ag@n + w) agon ag@n + agon (al 'ag@n + fl) ag (ran eIg + fr) ag (r eIg + v) ag (ra eIg + ague eIg + ag (a_ 'A:g + agi (_ 'A:gI + @) agua (_ 'agju:@ + +.group ai + _) ai eI + _) air e@ + ai eI + ai (_ aI + aic (_ 'eIIk + aic (al 'eIIk + ai (i aI + @) ai (Ca_ 'eI + aig (n 'eI + curt) ai (l 'eI + ent) ai (l 'eI + air e@ + aire (_ e@ + s) ai (d E + n) ai (v aI'i: + pt) ai I + apl) ai I + ount) ai I + berl) ai I + barg) ai I + cert) ai @ + curt) ai @ + brit) ai @ + vill) ai @ + ft) ai @ + d) ain (_ 'eIn + d) ained (_ 'eInd + aire 'e@ + aise (_ 'eIz + +.group al + _) al (@ a2l + _) alaba al@b'a + @) aland (_ =@la2nd + _) al (ast al + m) alay @l'eI + _) al (b al + _) alber (tA alb'3: + _) al (c al + alco (h alk@ + _) al (d O:l + alde (hy 'aldI + ale (_ eIl + ale (h eIl + k) alei (d @laI + aleph alEf + _) al (ex al + _) alexan alIgz'aan + _) alfa alf@ + _) al (g al + &) al (iBe @l + &) al (iBati @l + al (ia eIl + ret) al (ia al + v) al (ia al + al (ien eIl + _) al (i al + _) al (ig a2l + _) ali (Be a2laI + &) al (isC_ @l + &) al (isCic @l + _) al (k al + _) all (@ a2l + _) all (C@P3 O:l + _) all (a al + _) all (eg al + alle (ge a2lE + all (egr a2l + all (el al + all (er al + alley alI2 + _) all (i al + _) all (ian a2l + _) all (iter a2l + _) all (o al + _) allo (ca al@ + _) all (ot a2l + all (otr al + _) all (ow a2l + _) ally alaI + _) al (m 0l + al (mig %0l + _) al (ms A: + &) alo (_ @loU + _) al (p al + alpha alf@ + alp (ho alp + _) al (r %O:l + also 0lsoU + _) al (t O:l + &) al (ty_ @L + _) alti altI + al (ternato Ol + al (to al + al (um_ al + st) al (w O:l + _) alw Olw + _) al (v al + _) al (y al + alz alt|s + &) al (_ @L + &) ally (_$2 lI2 + @@ic) ally (_$4 lI2 + inst) al (_ O:l + &) al (d @L + b) al (d O:l + b) al (k O:l + f) al (k 0l + b) all (_ O:l + &b) all (er_ O:l + _c) al (e al + _sc) al (A eIl + c) al (f A: + h) al (f A: + s) al (f 0l + @) algia (_ 'aldZ@ + g) al (i_ 'A:l + al (ity 'al + s) al (iva @l + p) al (et al + qu) al (@ 0l + b) al (m A: + c) al (m A: + p) al (m A: + ps) al (m A: + qu) al (m A: + equ) al @l + equ) al (it 0l + ch) al (k O: + t) al (k O: + w) al (C 0l + w) al (k O: + all (_ O:l + aller (_ O:l3 + allers (_ O:l3z + c) all (in O:l + f) all O:l + f) all (a al + f) all (ib al + _C) all (ow al + h) all (w O:l + sm) all O:l + st) all O:l + t) all O:l + t) all (A al + t) all (y al + t) all (e O:l + thr) all O:l + Av) al (en @l + w) all (A 0l + w) alle O:l + w) all (et 0l + w) all O:l + w) all (a 0l + al (tAr 0l + _h) al (o eIl + al (ong a2l + &) alry (_ @LrI2 + _) al (s al + f) al (s 0l + _C) al (tA 0l + al (t_ 0l + _h) al (t 0l + s) al (t 0l + s) al (ut @l + s) al (uta al + h) al (v A: + m) al (no %al + +.group am + C) am (d aam + C) am (pl aam + l) am (pl am + &) am (o_ @m + &d) am (_ @m + @erd) am (_ am + &h) am (_ @m + &s) am (_ @m + @r) am (a 'A:m + _) am (al a2m + amateur am@t3 + amaz a2meIz + amaz (o am@z + ambi (d ambI + ch) am (b eIm + As) ame (_ 'A:mE + &) am (ent @m + amer (ic @mEr + c) am (el am + am (i_ 'A:m + ami (g a2mi: + _d) am (i eIm + und) am (en @m + _) am (en a2m + ame (nab a2mi: + l) ame (nt %amE + amm (end a2m + amoeb a2mi:b + f) am (ous eIm + &) am (ent @m + &) ame (nta @m'E + _) ame (nt a2mE + amphib amf'Ib + ampton 'ampt@n + _) am (id a2m + &) amine (_ =a2mi:n + _) am (ino a2m + _) am (iss a2m + am (use a2m + +.group an + @) ana (_ 'A:n@ +?2 C) an (c aan + c) an (c an + f) an (c an + n) an (c an + p) an (c an +?2 @m) an (d aan +?2 sl) an (d aan +?2 C) an (t aan + an (ath a2n + ann (eal a2n + ann (ih a2n + ann (oun a2n + ann (oy a2n + ann (ui a2n + ann (ul a2n + ann (un a2n + an (alog a2n + _) an (em a2n + _) ane (mi a2ni: + _) anna an@ + _) an (oi a2n + _) an (om a2n + anomal a2n0m@L + &) an (_ @n + @u) an (_$1 n + @i) an (_$1 n + Cc) an (_ an + l) an (_ an + ll) an (_ @n + &m) an (_ @n + p) an (_ an + r) an (_ an + @@r) an (_ @n + st) an (_ an + m) an (_ an + hum) an (_ @n + &) an (t_ @n + pl) an (t_ an + &) an (ce_ @n + fin) an (c 'an +?2 h) an (ce_ aan +?2 z) an (ce_ aan + &) an (cy @n + adv) an (c an + _) an (cie eIn + &l) an (d @n + usb) an (d @n + @) an (Ca_ 'an + ando (_ 'andoU + @) andu (_ ,and'u: + anean (_ 'eIni@n + @) aneous 'eIni@s + p) an (el an + &) an (ese @n + an (gul 'an + &) ani (_ 'A:nI2 + an (ia 'eIn + z) ania a2n'i@ + _l) an (ia an + sp) an (ia an + m) anipu @nIpjU + w) an (t_ 0n + &) an (y_ @n + &) an (ies_ @n + ang (el_ eIndZ + ang (el andZ + ch) ang (e eIndZ + ch) anging eIndZIN + d) ang (er eIndZ + r) ang (e eIndZ + r) anging eIndZIN + r) anged ($1 d + perm) an @n + ang (er aNg + m) anoeu (v @nu: + _qu) an 0n + _w) an 0n + _tr) an (s %an + tr) ansfer %ansf3: + tr) an (si an + tr) ansis anz'Is + tr) an (som an + ante (lo antI2 + ante (nn ant'E + _) anti (@P4 ,antI2 // prefix + ant (iq ant + anti (ci ant'I + anti (bo antI2 + an (za 'an + +.group ap + _) ap (@ a2p + _) aph (@ a2f + ap (ath ap + _) ap (e eIp + aper (ie a2pi@ + _) aperi (t a2pEr@ + _) aper (t ap@ + _) aph (id eIf + _) aph (o af + &gr) aph (er =@f + aphro afr@ + &gr) aph (y =@f + ap (ia eIp + ap (ic ap + ap (is eIp + _p) ap (is eIp + ap (og ap + ap (oli ap + _) app (@ a2p + app (ara ap + app (eti ap + app (le ap + app (lic ap + app (licab a2p + appre (h ,aprI + apres apreI + _) apprec (i a2pri:S + _) ap (ri eIp + ap (ro eIp + _) ap (s ap + _) ap (t ap + c) ap (ac @p + tr) ape (z @pi: + tr) ape (zo apI + app (ear a2p + ap (el_ ap + p) ap (er eIp + m) ap (le eIp + st) ap (le eIp + c) ap (on eIp + _v) ap (o eIp + +.group ar + ar A@ + ar (A A:r + ar (_ A@ + ar (o ar + _) ar (A ar + _) ar (os a2r + _) ar (ou a2r + ar (a ar + ar (a_ 'A:r + ar (r a + arr (_ A@ + _) arr (@ a2r + _) arr (ant ar + _) arr (o ar + ar (i_ 'A:r + @) ar (io_ 'A:r + c) ar (i ar + ar (ious e@ + cl) ar (i ar + aring e@r-I2N + g) aring @r-I2N + &d) ar (_ 3 + &g) ar (_ 3 + &l) ar (_ 3 + &m) ar (_ 3 + _p) ara ar@ + qu) ar (a 0r + _p) ara (de @reI + &t) ar (_ 3 + st) ar (_ A@ + guit) ar (_ A@ + _t) ar (_ A@ + &) ar (dis 3 + &) ar (diz 3 + &d) ar (d_ 3 + gg) ar (d_ 3 + &h) ar (d_ 3 + &k) ar (d_ 3 + &st) ar (d_ 3 + &w) ar (d_ 3 + aw) ar (d O@ + eot) ar (d_ A@ + &z) ar (d_ 3 + h) ar (ass @r + &m) aran @ran + sep) ar (at @r + w) ar (e e@ + k) ar (y ar + c) arbo (h ,A@boU + _) arch (@P4 ,A@tS // prefix + _) archai A@k'eII + _) arche (o A@kI + _) arch (er A@tS + _) archi (CA A@kI + -) archiv (+ A@kaIv + @) arch (y A@k + @) arch (i A@k + an) arch 3k + mon) arch 3k + &) ar (dy_ 3 + h) ar (dy_ A@ + are e@ + area e@ri@ + ar (en ar + p) are (nth @rE + c) ar (eer ar + c) are (C@ e@ + p) are (nt e@r@ + pp) ar (enC ar + sp) ar (enC ar + ar' (nt A@ + are (t ar@ + ar (iaC_ 'e@ + ar (ia_ 'e@ + arily (_ 'Er@lI2 + ch) ar (it ar + m) ar (i @r + m) ar (ig ar + m) ar (inaC ar + m) ar (iner ar + m) ar (io ar + htm) ar e@ + &) arise (_ @raIz + log) ar (i @r + m) ar (it ar + p) ar (i ar + p) ar (in e@ + &) ar (in_ @r + v) ar (iA e@r + @) ar (ity ar + ar (ium 'e@r + arom (at a2roUm + arre (_ A@ + arred (_ A@d + arring (_ A@I2N + qu) ar (r 0 + p) ar (ticu 3 + qu) ar (t O@ + ar (til %A@ + ary (_ @rI2 + _C) ary e@rI2 + _CC) ary e@rI2 + w) ar O@ + wh) ar O@ + w) ar (r 0 + w) ar (i e@ + w) ar (y e@ + w) ar (r 0 + w) ar (d 3 + w) arw (i 0r + rew) ar (d O@ + tow) ar (d o@ + _w) ar (d O@ + sw) ar (d O@ + chw) ar (d O@ + +.group as + _) as (@ a2s + _) ass (@ a2s + c) ass (_ @s + tl) ass (_ @s + omp) ass (_ @s + sp) ass (_ @s + rr) ass @s + &v) ass (_ @s + ascii askI + f) asc (ia eIS + f) asci (s aSI + _) as (e as + as (exu %eIs + _) ash aS + _) ash (a a2S + _) ash (o a2S + _) asia eIS@ + as (k aas + _) as (o eIs + C) as (p aas + w) as (p 0s + C) as (pe aas + _) as (per a2s + _) as (pe as + as (pha as + as (pi as + _) as (pire a2s + Cl) ass aas + Cr) ass aas + p) ass aas + _) p) ass (o as + p) assion aS@n + cl) ass (iC as + ass (ag as + &v) ass (_ @s + ass (et as + ass (on as + ass (u @S + ass (ump a2s + assur @SjU@ + C) as (t aas + as (ter aas + as (tern a2s + as (thm as + as (tral as + as (tro aas + as (trolog a2s + as (trono a2s + ass (ym as + purch) as (e Is + ph) ase (_ eIz + r) ase (_ eIz + asey (_ @sI2 + b) as (i eIs + b) as (il az + as (sist a2 + j) as (on eIs + m) as (on eIs + m) as (oni as + h) as (te eIs + p) as (te_ eIs + t) as (t eIs + nt) as (t as + cat) as (t as + as (ive 'eIs + as (ymp as + &) asy (_ @sI2 + w) ast (e eIst + +.group at + pal) ate (_ @t + consul) ate (_ @t + macul) ate (_ @t + tim) ate (_ @t + tim) ated (_ eItI2d + tim) ating (_ eItIN + din) ate (_ @t + ion) ate (_ @t + nion) ate (_ eIt + der) ate (_ @t + mper) ate (_ @t + _it_separ) ate (_ @t + par) ates (_ eIt|s + @) ated (++_ eItId + @) ati (_ 'A:tI + at (im_ 'eIt + @) ating (++_ eItIN + &) at (ive @t +// &) ately (_ @tlI2 + ul) at (ory 'eIt + sen) at @t + pl) at (ea at + &) at (eer_ @t + g) at (eau at + fr) at (ern a2t + c) atego atIg@ + c) atego (ric atIg'0 + at (ia eIS + &) atism @tIz@m + st) at (ist @t + w) at (t 0t + athed (_ eIDd + athei eITI2I + @) athy =@TI2 + @) ath (is =@T + _) at (lan a2t + at (omi a2t + _) ato (n a2toU + _) ato (na %eItoU + atron (_ eItr@n + _) at (roc a2t + @) atry (_ =@trI2 + _) att (@ a2t + att (ic at + att (it at + _vers) at @t + bl) at (A eIt + clim) at (e @t + c) at (eC at + c) at (er_ eIt + m) ater (n @t3: + m) at (eri @t + d) ata eIt@ + f) at (al eIt + str) at (eg at + m) at (er at + p) at (ern @t + f) ath (er A:D + b) ath aaT + b) ath (e eID + p) ath aaT + ath (lon aT + n) at (ive eIt + _c) ati (on ataI + at (or_ eIt + @) at (or_ 'eIt + @@) at (or_ eIt + @) at (ra_ 'A:t + at (um 'A:t + d) at (um_ 'eIt + m) at (um_ 'eIt + c) atur @tSU@ + m) atur @tSU@ + l) ature (_ @tS3 + +.group au + au O: + g) au (s aU + s) au (s 0 + l) au (t_ aU + au (str 0 + au (_ aU + _) auch %O:x + aud (_ 'O:d + augh O: + l) augh aaf + sl) augh O: + dr) augh aaf + augment O:gm'Ent + aul (t 0l + c) au (li 0 + aul (k O: + _) au (nt A: + aur (_ O@ + s) au (rus_ 'O: + @) au (ri 'O: + C) aus (_ aUs + au (t_ aU + n) au (t_ O: + authen %O:TEn + _) auto (@P4 ,O:toU // prefix + auto (ma O:t@ + auto (n %O:t0 + +.group av + av (ail a2v + avar (ic av@r + av (eng a2v + _) av (erC a2v + av (oA a2v + d) av (id eIv + j) av (a A:v + j) av (el av + l) av (en av + al) av (er 'A:v + sc) av (en av + aver (s av'3: + _) avi (a eIvI + l) av (i av + sl) av (i A:v + r) av (el av + s) av (i eIv + _) av (on eIv + f) av (o eIv + fl) av (o eIv + s) av (o eIv + avow a2vaU + +.group b + b b + b (b + m) b (_ + _) bally (@ b,alI2 + _) balli (@ b,alI2 + balli (st ba2l'I + _) ba (mb@ b%a + _) book (@@P4 b'Uk + su) bt (l t + de) bt t + _) bug (le bju:g + @) bury (_$4i brI2 + _) by baI + + +.group be + may) be (_ bi: + _) be (CA bI2 + _) be (C% bE + _) be (b bi: + _) be (cl bI2 + _) be (ck bE + _) be (cq bE + _) be (dC bE + _) be (dra bI2 + _) be (gg bE + _) be (lC bE + _) be (lli bI2 + _) be (sC bI2 + _) be (stia bE + _) be (tC bI2 + _) be (v bE + be (gA bI2 + be (gr bI2 + be (lat bI2 + be (lie bI2 + beha (v bI2heI + be (mu bI2 + _) bene bEnI + benevo b@nEv@ + be (qu bI2 + _) ber (s b3 + be (see bI2 + be (sie bI2 + _) be (sto bI2 + _) be (th bE + be (tray bI2 + _) be (w bI2 + h) bed (_ bEd + er) bed (_ bEd + t) bed (_ bEd + +.group bi + _) bi (C@@ %baI + _) bi (_ baI + _) bi (C% bI + bi (bli bI + bi (bu bI + bi (ck bI + bi (cy baI + _) bi (en b%aI + bi (g+ bI + bigh (t baI + bi (ker baI + bi (lb bI + bi (lg bI + bi (lio bI + bi (lk bI + bi (nary baI + bi (nd baI + _) bi (ng bI + bi (nm bI + bi (noc bI2 + bio baIoU + _) bio (@P3 b,aIoU + bi (otic baI + @) bi (osA baI + bi (oC_ bI + bi (ous bI + bio (g baI'0 + bio (log baI'0 + bio (ni baI'0 + bio (ps baI'0 + bir (C b3: +?5 bir (C bIR + bi (ri bI + bi (ry bI + bi (sc bI + bi (sec b%aI + bi (sh bI + bi (sm bI + bi (sq bi: + bi (str bi: + o) bi (tA baI + _) bi (tC bI + bi (tu bI + bi (z+ bI + +.group c + c k + cc k + ck k + c (e s + c (é s + s) c (e + c (E s + c (i s + c (y s + c (q + cc (e ks + so) cc (er k + cc (i ks + co) cc (i_ k + c (aes s + caco (ph ka2k'0 + _) cement sI2mEnt + chara (ct karI + cien S@n + cion S@n + ceous S=@s + cious S=@s + cch k + c (elt k + cial (_ S@L + cial S@l + cian (_ S@n + cian Si@n + cia (lit SIa + cia (b Si@ + ma) c (in k + ciph (er saIf + cism (_ sIz@m + e) cua kwa + czech tSEk + +.group ch + ch tS + ch (r k + chry (sa krI + @) ch (ia k + ch (io k + chion S@n + ch (io_ S + ch (ae k + _) cha (o keI + chaos keI0s + chap (ero Sap + chario (t tSari@ + cha (ris k@ + ch (asm k + ch (ass S + ch (atea S + chauffeu SoUf@ + chauvi SoUv@ + ch (é+ S + ch (ef S + ch (em k + ch (ev S + chez SeI + Ca) ch (e S + ba) che tS@ + tra) ch k + cre) ch S + e) ch (el S + cli) ch S + fi) ch S + li) ch k + ni) ch S + clo) ch S + _o) ch (e S + ico) ch S + _ar) ch (A k + ar) ch (er tS + _or) ch (es k + me) ch (a k + mi) ch (a k + ch (irA k + a) ch (il k + bra) ch k + te) ch k + ch (isC k + ch (ic_ k + @@Car) ch (_ k + _ar) ch (a k + _ar) chi (@ kI + ar) ch (ive k + or) ch (i k + ch (lor k + chloro kl,O:roU + choir kwaI@ + ch (ol k + choly k@lI2 + ch (ond k + ch (orA k + ch (ore_ tS + ch (ord k + an) ch (or k + o) ch (_ k + _ta) ch k + ta) ch tS + sta) ch S + e) ch (o k + bron) ch k + ch (ute S + ch (ure S + +.group co + _) co (eCP2 k,oU + _) coe (l si: + co (hab k%oU + co (llab k@ + co (llap k@ + co (llat k%0 + co (llec k@ + co (llis k@ + co (llid k@ + co (llu k@ + co (loss %k0 + _) co (m@ k@ + _) co (ma koU + co (me_ kV + co (mbina k0 + come (b kVm + co (mba k0 + co (medy k0 + come (di k@mi: + _) co (mf kV + comfor (t kVmf3 + _) co (mi k0 + coming kVmI2N + co (mmanda k0 + co (mma_ k0 + co (mmen k0 + co (mmens k@ + co (mmerce k0 + co (mmodor k0 + common k0m@n + commun k0mju:n + co (mmunic++ k@ + co (mmuta k0 + co (mpany kV + comparab k0mp@r@b + co (mpass_ kV + co (mpens k0 + co (mper k0 + compe (tAn k0mpI + co (mpila k0 + co (mplem k0 + co (mplex_ k0 + co (mplica k0 + co (mplim k0 + co (mposit k0 + co (mpost k0 + co (mpou k0 + comprehen k0mprIh'En + co (mprom k0 + co (mpt k0 + co (mputa k,0 + _) co (mr k0 + _) con k%0n + _) conce (ntra k0ns@ + _) co (ncept_ k0 + _) co (ncret k0 + _) conde (sc k,0ndI2 + _) co (ndim k0 + _) co (ndom k0 + _) co (ndor k0 + _) co (nduit k0 + _) co (nferen k0 + _) co (nfid k0 + _) co (nfide k%0 + _) confi (den k0nfI + _) co (nfis k0 + _) co (nflu k0 + _) co (ngress k0 + congru k0ngru: + _) co (ni k0 + _) co (njug k0 + _) co (njur kV + _) co (nnect k@ + _) co (nnex k@ + conniv k@naIv + _) co (nnois k0 + _) co (nque k0 + _) co (nsc k0 + co (nsec k0 + co (nsecu k%0 + _) conse (q k0nsI + conser (v k%0ns3: + conser (vatio k0ns@ + consider k%0nsId@ + co (nson k0 + _) co (nstabl k0 + co (nstan k0 + _) co (nstip k0 + co (nstit k0 + co (nstituA k%0 + _) co (nsole k0 + _) co (nsul k0 + _) co (nsult k%0 + _) co (ntact k0 + _) co (ntempl k0 + _) co (ntext k0 + co (ntine k0 + _) co (ntour k0 + _) co (ntrA k0 + _) contra (C@P6 k,0ntr@ + _) contrast k0ntraast + contrac (t k%0ntrak + contrar k%0ntre@ + _) co (ntrib k0 + _) co (ntro k0 + _) co (ntrol k%0 + conva (l k0nv@ + _) co (nvoy k0 + _) copy k0pI + coro (lla k@r0 + co (rrect k@ + correspo k,0rIsp'0 + co (rro k@ + co (rrup k@ + _) counter (@P7 k'aUnt@ // prefix + +.group d + d d + d (d + _) d' (AP2 d + @@e) d (_$1 d // suffix + ddh d + dj dZ + dg (_ dZ + dg (C dZ + dg (e dZ + dged (_ dZd + dg (i dZ + dg (y dZ + _) dir (_ daI@ + we) dne (sd n + dual (_ dZu:@L + du (cat dZu: + @) dum (_ =d@m + du (pl dZu: + dur (A djU@ + dur (_ djU@ + ce) dure dZ3 + _) dye daI + +.group de + de (act d%i: + de (arc d%i: + de (bug di: + _) de (ba dI2 + _) de (c@ dI2 + deca (den dEk@ + de (cenc di: + de (cib dE + de (cil dE + de (cim dE + de (ck dE + de (com di: + de (cor dE + deco (ra dEk@ + de (coru dI2 + de (creas di: + de (crem dE + de (du dI2 + _) de (f@ dI2 + de (fect_ di: + de (finit dE + de (flat d%i: + de (feren dE + de (ft dE + _) de (g@ dI2 + _) de (hyd ,di: + _) de (l@ dI2 + de (law dE + de (leg dE + de (lica dE + de (ll dE + de (lph dE + _) de (lt dE + delu (g dElju: + de (lv dE + de (ma dI2 + de (mea dI2 + de (men dI2 + de (mise dI2 + de (mocrac dI2 + dem (oni di:m + de (mor dI2 + de (mot dI2 + de (mur dI2 + deni (tri d%i:naI + _) de (no dI2 + _) de (o d%i: + _) de (p@ dI2 + de (per d%i: + de (pol d%i: + de (pop d%i: + depo (siti dEp@ + depot dEpoU + de (pt dE + de (put dE + _) de (rai dI2 + de (rel dE + de (riC dI2 + de (rog dI2 + de (rACatio dE + _) des (@ dI2s + des (ca dE + des (ec dEs + des (eg d%i:s + dese (l d,i:sI2 + des (en d%i:s + _) des (h dEs + des (ic dEs + _) des (i dI2z + des (igna dEz + des (is dI2s + _) des (k dEs + des (ol dEs + des (pot dEs + _) dess dI2z + desta (b d%i:steI + desti dEstI + des (ul d%i:s + _) de (t@ dI2 + de (tail di: + deter dI2t3: + deter (i dI2ti@ + detest dI2tEst + de (th d%i: + de (ton dE + de (tou di: + de (tox d%i: + de (trai d%i: + de (tri dE + _) de (vA dI2 + de (val d%i: + _) devas dEv@s + de (via di: + de (vil dE + de (vio di: + de (von dE + +.group di + _) dia daI|@ + _) dia (gon daI'a + _) dia (l daI@ + _) dia (n daI'a + dicho (t daIk'0 + di (chro daI + di (ctat dI2 + di (ffrac dI2 + di (ffus dI2 + dige (st d%aIdZE + di (gres d%aI + dili (g dIlI + _) di (h@ d%aI + dilu (t daIl'u: + di (mens d%aI + di (min dI2 + di (ox d%aI + _) di (s@ dI2 + _) di (sa@ ,dI + _) disa (p ,dIs@ + di (sast dI2 + di (sbe@ ,dI + di (sc_ dI + discipli dIsIplI + di (sco_ dI + di (scon ,dI + di (scord_ dI + di (scot dI + di (scount dI + di (scov dI2 + _) di (se ,dI + di (sh_ dI + di (shC dI + _) dis (hA dI2s + _) di (si ,dI + di (sint dI2 + di (sk dI + di (sol dI + di (sob ,dI + di (sposit dI + di (sposs ,dI + di (sprop ,dI + _) di (sre ,dI + di (srepu dI2 + di (ssect daI + di (ssid dI + di (ssip dI + di (ssolu dI + di (sson dI + di (stan dI + di (stillate dI + di (stri dI + di (sul daI + di (verC d%aI + di (vest d%aI + di (vid dI2 + divi (den dIvI + di (vin dI2 + di (vis dI2 + di (vorc dI2 + di (vul d%aI + +.group e + e E + &) e (_ + e (_ =@ + _C) e (_ i: + _CC) e (_ i: + _C) e (Be_ i: + _CC) e (Be_ i: + _CCC) e (Be_ i: + @) e (Cia_ 'i: + e (Bo_ 'i: + e (Boe_ 'i: + acB) e (_ I2 + e (Cic_ E + e (Cical 'E + t) ech (_ Ek + m) e (chanic I + @@) eble (_ @b@L + vert) e (b I + cel) e (bra @ + sp) e (cia E + sp) e (cies i: + _) e (cl I2 + @) e (ctive 'E + _) eco (s i:koU + econo (m Ik'0n@ + econo (mic Ek@n'0 + &) ecy (_ @sI2 + ee i: + ee (m 'i: + eer 'i@ + t) ee (n_ 'i: + ees (_ i:z + ch) eese i:z + d) e (fault i: + e (ffec I2 + e (ffic I2 + efier (_ I2faI3 + e (ful + @@) efy (_ I2faI + &) eg (y @dZ + @) e (gic 'i: + l) e (gal i: + r) e (gal i: + l) e (git @ + int) e (ge I + int) e (gra I + n) e (got I2 + l) egion i:dZ@n + egy (pt i:dZI + n) e (gro i: + ei eI + _) ei aI + c) ei i: + _) e (jA I2 + v) ej (_ eI + &) e (m_ @ + @) e (mber 'E + @@) e (ment_ + e (me_ i: + _el) e (men I + e (mail i: + f) e (male i: + e (meou i: + _C) e (mur i: + &) e (n @ + Ah) e (n E + ll) e (nge I + e (o I2 + _) e (phem I2 + cr) e (pe+ E + _) epi EpI + _) epider EpId'3: + _) ep (isC I2p + ep (ox I2p + e (qual i: + _) e (qua i: + e (quat I2 + fr) e (q i: + _s) e (que i: + e (quip I2 + e (quiv I2 + e'er e@ + &f) e's (_$2i s + &k) e's (_$2i s + &p) e's (_$2i s + &t) e's (_$2i s + &c) e's (_$2i Iz + &g) e's (_$2i Iz + &ch) e's (_$2i Iz + &ph) e's (_$2i Iz + &s) e's (_$2i Iz + &sh) e's (_$2i Iz + &th) e's (_$2i z + &r) e's (_$2i z + &x) e's (_$2i Iz + &C) e's (_$2i z + &Cr) e's (_ @z + e (tion i: + discr) e (tion E + eu ju: + d) eu (ts OI + r) eu (d OI + eu (m_ i: + s) eu (m_ 'i@ + eur 3: +?5 eur VR + eur (_ '3: +?5 eur (_ 'VR + &) eus (_ =I2@s + _) euro jU@roU + _) euro (pe jU@r-@ + ew ju: + ew (_ ju: + j) ew (+ u: + j) ewe (l u:@ + l) ew (+ u: + r) ew (+ u: + _s) ew u: + _s) ew (_ oU + e (work + eway (_$3 weI + @) ez (_ =Ez + +.group ea + ea i: + @) ea (_ i@ + Cs) ea (_ i: + r) ea (_ 'i@ + &) ea (bl @ + &) eably @blI2 + &) ea (bili @ + tr) ea (cher E + d) ea (d E + h) ea (d E + h) ea (dmA@ %E + h) ea (dq %E + _l) eaded EdI2d + l) ea (den E + r) ea (dy E + r) ea (dily E + r) ea (died E + r) eadme i:dmi: + br) ea (d E + dr) ea (d E + tr) ea (d E + spr) ea (d E + thr) ea (d E + st) ea (d E + d) ea (f E + br) ea (k eI + st) ea (k eI + w) eapo Ep@ + eager i:g3 + j) ealou El@ + &) eal (_ i@l + z) ea (lo E + C) ea (lt E + m) ea (lt i: + f) ea (lt i: + eam (t_ Emp + ean (_ i@n + p) ean (_ 'i@n + _l) ea (mi E + b) ea (n i: + _C) ea (n_ i: + _CC) ea (n_ i: + ear i@ + _) ear (l 3: + _) ear (n 3: + ear (th 3: + b) ear e@ + b) ear (d i@ + h) ear (d 3: + h) ear (th A@ + h) ear (k A@ + h) ear (se 3: + reh) ear (s 3: + h) ear (t A@ + l) ear (n 3: + p) ear (l 3: + s) ear (ch 3: + t) ear (A e@ + sw) ear e@ + w) ear e@ + w) ear (y i@ + y) ear (n 3: + eas (an Ez + eas (en Ez + easo (n i:z@ + easur EZ3 + br) ea (s E + ease (@ i:s + @) ea (tive =i@ + d) ea (th E + f) ea (th E + h) ea (ther E + th) ea (t i@ + th) ea (tri i:a + l) ea (th E + br) ea (th E + br) ea (the i: + cr) ea (t i:'eI + gr) ea (t eI + thr) ea (t E + w) eath ED + sw) ea (t E + eau oU + eau (t ju: + eaux oU + h) ea (v i: + _h) ea (vi E + h) ea (vy E + end) ea (v E + C) ea (ven E + +.group ed + @@) ed (_$2dvei d + @C) ed (_$2dvei d + @c) ed (_$2vdei t + @d) ed (_$2dvei I2d + &ch) ed (_$2vei t + &sh) ed (_$2vei t + Csh) ed (_ Ed + @f) ed (_$2vdei t + @g) ed (_$1vi d + @k) ed (_$2vdei t + &en) ed (_$2v d + cl) ed (_$1v d + @p) ed (_$2vdei t + @@er) ed (_$2v d + @ss) ed (_$2dv t + @t) ed (_$2vdei I2d + @fr) ed (_$2v Id + @x) ed (_$2vei t + y) ed (_$2v d + edly (_ IdlI2 + c) ed (e_ 'i:d + p) ed (e_ i:d + rs) ed (e 'i:d + m) ed (ia i:d + @) ed (ien 'i:d + m) ed (io i:d + m) ed (iu i:d + @m) ediate i:dI2@t + cr) edib EdIb + @dr) ed (_ Id + t) ed (i i:d + sw) ed i:d + h) ed (ral 'i:d + h) ed (ron 'i:d + h) ed (ra 'i:d + @) edur 'i:dZ3 + + +.group ei + l) eice (st E + eigh eI + l) eigh i: + sl) eigh eI + k) eigh i:T + h) eigh (t aI + eighth eItT + eig (n eI + n) eil i:@L + @) ei (n_ i: + b) ei (ng i:I + eir e@ + w) eir i@ + l) ei (s E + _s) eis (m aIz + f) ei (t_ I + ei (th aI + ei (th_ i: + ei (v i: + ei (z i: + +.group el + _) el (A I2l + _) ele (ctro I2l,E + _) ele (ctron ElE + _) ele (g ElI + _) elem ElIm + _) ele (p ElI + _) ele (va ElI + el (igi 'El + _) elit I2li:t + &) el (_ @L + &) ella (_ 'El@ + &v) eller (_ @l@ + @) elli (_ 'ElI2 + &) ell (ous @l + &) el (s_ @L + cib) el (_ El + xc) el (_ 'El + onn) el (_ 'El + p) el (_ 'El + all) el El + all) el (o 'El + v) elop 'El@p + elo (q El@ + d) el (iv @l + f) el (ix i:l + s) el (ect I2l + _) ell (ip I2l + v) el (oc @l + t) el (p @L + _) else Els + + +.group em + _) em %Em + _) em (a I2m + em (ana Em + emba (s Emb@ + em (blem Em + em (bry Em + em (eral Em + _) em (e I2m + em (ery Em + em (i Em + em (issi I2m + _) em (it I2m + emm (e Em + emm (an I2m + _) em (o I2m + em (path Em + em (per Em + em (phas Em + em (pres Em + em (pti Em + em (pty Em + em (ul Em + em (uls I2m + h) em (o i:m + h) emorrh Em@r + +.group en + _) en (@ %En + chick) en In + en (a_ 'i:n + en (al_ i:n + en (ary 'i:n + _) ena (m I2na + &) en (Ance @n + &) en (ch En + encha (n %EntSaa + enclav EnkleIv + en (core 0n + &) ency (_ @nsI2 + ency (cli %EnsI + _) en (d En + _) en (da %En + eg) en (d @n + en (dea %En + en (dous En + _) endo EndoU + endow End'aU + _) endor %Endo@ + _) en (du %En + _) en (e En + t) enem En@m + _) ener En3 + @@th) enes (_ =@ni:z + &) en (ger In + eng (lA INg + eng (in EndZ + eng (_ 'EN // place names + en (ig En + en (igma_ %En + &) enine @ni:n + &) enko (_ 'EnkoU + enli (v %EnlaI + _) en (m En + &) en (ment @n + en (mes %En + _) enn %En + enn (ia 'En + _) en (o I2n + carp) en @n + enrage %EnreIdZ + enrol %EnroUl + @) enous (_ =@n@s + ost) en (s 'En + en (sig En + ensk (_ 'Ensk + enshrine %EnSraIn + m) entary (_ 'Ent@rI2 + en (ter En + en (tert ,En + enthra (l %EnTrO: + &) entice %EntaIs + _) en (ti %En + _c) enti EntI + en (tity En + en (tran En + en (trec 0n + en (trep ,0n + en (tri En + en (tro En + _) en (try En + _) en (u I2n + @) en (tu 'En + @) en (tous 'En + en (viA En + enviro %EnvaIr@ + en (voy En + en (vy En + en (zy En + &) en (_ @n + &) en (ed_ @n + ene (_ i:n + &) en (er_ @n + sc) en (e i:n + g) en (iA i:n + _s) en (i i:n + en (ia 'i:n + mill) en (ia 'En + engin EndZI2n + l) eni (e i:nI + v) eni (e i:nI + &) en (t_ @n + @) en (tal 'En + en (ti En + en (tial 'En + perc) en (t En + desc) en (t En + asc) en (t En + ns) en (t En + ss) en (t 'En + _res) en (t En + epres) en (t 'En + nt) en (t En + xt) en (t En + v) en (t_ En + lv) en (t_ @n + @@v) en (t_ @n + &) en (th_ @n + &) en (ce_ @n + f) en (ce_ En + g) ener (al En@r + _) en (ough I2n + +.group eo + @@) eo (_ 'eIoU + g) eo I20 + eo (d_ aU + g) eo (ff E + g) eon @n + ch) eon @n + j) eo (p E + _l) eo i@ + g) eor (gA O@ + p) eo (pl i: + @) eosis i:'oUsIs + &) eous (_ =i@s + th) eo (@ I2@ + th) eo (r i@ + th) eo (logy I'0 + th) eo (logis I'0 + eover oUv@ + eos (_ I2oUz + eoes (_ I2oUz + +.group er + &) er 3 + @@@) er (_$2de 3 // suffix + %C) er (_$3 3 + %C) ers (_$4 3z + ss) er (_$2 3 + all) er (_ 3 + &) er (_ 3 + mb) er (_ 3 + lin) er (_S1 3 + er 3: + _) er (A I2r + _) er 3: + _) err (A Er + _C) err Er + _CC) err Er + erre 'e@ + erred (_ '3:d + er (_ 3: + er (B_ 3: + &) ere (_ 3 + ere (_ 3: + &) er (s_ 3 + g) eral (d Er@L + er (bial '3: + _d) er (b A@ + &) er (A @r + @) er (o_ 'e@r + eri (A 'i@rI2 + er (iC Er + &) er (ing @r + er (ie_ @r + er (ie @r + eries (_S2i z + &) er (ous =@r + m) er (c 3: + p) er (cen 3 + exp) eri (en i@rI2 + _C) er 3: + _h) er (A Er + _CC) er 3: + _qu) er 3: + c) er (am I2r + &) ere (_ 3 + _C) ere (_ i@ + _CC) ere (_ i@ + sph) ere (_ i@ + c) ere (_ 'i@ + i) ere (_ I2e@ + ev) ere (_ i@ + mp) ere (_ e@ + _h) ere i@ + h) ere (f ErI2 + h) ere (di I2rE + h) ere (s Er@ + h) ere (t I2rE + @) er (ence_ r + er (ent_ r + adh) er (e 'i@ + coh) er (e 'i@ + h) er (ed I2r + c) ere (mon ErI2 + h) er (en i@r + st) ereo ErI2oU + _st) er (A Er + m) er (ge '3: + erging '3:dZI2N + v) er (ge '3: + er (ic_ 'Er + er (ical 'Er + p) er (hap 3 + _p) erio (d i@rI2@ + _p) erio (dic i@rI2'0 + ereal 'i@rI2@L + @) er (ity 'Er + &) erise (_ @raIz + &) erize (_ @raIz + &) eris (a @raIz + &) eriz (a @raIz + p) ermea (b 3:mi@ + _f) erme (nt %3:mE + er (nal_ '3: + &) er (n_ 3 + c) er (n_ 3: + er (se 3: + er (sal '3: + @) er (sial '3: + @) er (sy 3: + er (sib 3: + er (sif 3: + er (sion '3: + er (siv 3: + &) er (t_ 3 + conc) er (t_ 3: + er (tion 3: + h) er (tf A@ + c) er (t 3: + asc) er (t 3 + v) er (t 3: + @v) er (t_ 3: + h) erto (_ @tu: + _) er (ud Er + er (ve 3: + s) er (van 3: + ery (_ @rI2 + ery @rI + _v) ery ErI2 + _ev) ery rI2 + qu) ery i@rI2 + z) er (o i@ + _C) er (o_ i@ + er (rA E + err (_ 3: + +.group es + &) es (_$1i z + ese (_ i:z + @n) ese (_ 'i:z + &f) es (_$1 s + &k) es (_$1 s + &p) es (_$1 s + &t) es (_$1 s + &c) es (_$1 I2z + &g) es (_$1 I2z + &ch) es (_$1 I2z + &ph) es (_$1 I2z + neri) es (_$2i z + &s) es (_$1 I2z + &us) es (_$2e I2z + &rus) es (_$2 I2z + &tus) es (_$2 I2z + &ss) es (_$2 I2z + sh) es (_$2 I2z + &th) es (_$1 z + &r) es (_$1 z + &qu) es (_$1 s + &x) es (_$2 I2z + &z) es (_$2 I2z + &C) es (_$1i z + es (carp I2s + es (cape %Es + es (capi %Es + _) es (p@ %Es + es (peci I2s + _) es (pl Es + _) es (tab I2s + es (tate I2s + @) esc (enC 'Es + pr) es (ent Ez + magn) es (i 'i:z + es (ic 'i:z + r) esis (_ 'i:sIs + es (ive 'i:s + h) esion 'i:Z@n + nec) essa (ry @s@ + _ax) es i:z + esopha Is'0f@ + er) ess (_ @s + &tr) ess (_ @s + dist) ess (_ Es + &) es (y_ @s + &) es (t_ @s + Cr) es (t Es + v) es (t+ Es + harv) es (t Is + v) es (ty @s + +.group et + _) et (on i:t + @) et (ate It + @) et (ation It + ete (_ i:t + _) et (ern I2t + _) eth (A i:T + eth (ane i:T + _) eth (a ET + eth (ic ET + eth (y i:T + @C) eth (_$3e @T + etta (_ 'Et@ + ette (_ 'Et + pal) ett (e @t + eted (_ I2tId + l) eted (_ 'i:tId + cr) eted (_ 'i:tId + eting (_ I2tIN + l) eting (_ 'i:tIN + m) eter (_ i:t3 + _m) et (ic @t + @) et (_ It + rk) et It + ll) et (_ It + &l) et (_ @t + j) et (_ Et + s) et (_ Et + t) et (_ Et + An) et (_ Et + phab) et (_ Et + ber) et (_ eI + gr) et (+ Et + f) et (a i: + _m) et (e i:t + _p) et (e i:t + et (itor 'Et + m) etre i:t3 + m) etry =@trI2 + +.group ev + _) ev I2v + _) eve i:v + _) even i:v@n + _) eve (nt I2vE + st) ev (e i:v + ever (_ Ev3 + ever (c ,Ev3 + ever (g Ev3 + ever (l ,Ev3 + ever (m ,Ev3 + f) ever (+ i:v3 + _l) ever i:v3 + cl) ever Ev3 + cl) eve (l i:v + every EvrI2 + l) ev (el Ev + _) ev (i Ev + _) ev (ict I2v + ev (il i:v + _) ev (is I2v + abbr) ev i:v + all) ev i:v + +.group ex + _) ex %Eks + excav Eksk@v + _) exc (e %Eks + exc (i %Eks + exc (elle Eks + exe (cutio EksI + ex (erc Eks + _) ex (A %Egz + _) exh %Egz + _) ex (it Egz + exor (c Eks3 + exped (it Eksp@d + ex (pert Eks + experim %EkspErIm + @) ex (ia 'Eks + ss) ex (_ Iks + exter (C Ekst'3: + extra (pol Ekstr'a + extra Ekstr@ + extra (n EkstreI + extra (or %Ekstr + extra (ct Ekstra + extrava (g %Ekstrav@ + +.group ey + &) ey (_ I2 + @) ey (C@ I + Cv) ey (_ eI + _C) ey eI + _CC) ey eI + _ab) ey eI + _k) ey (+ i: + ey aI + ey (an eI + _) eye aI + eye eI + @m) eyer (_ aI3 + eyor (_ 'eI3 + +.group f + f f + f (f + fa (ciA feI + fa (miliar f@ + er) fed (_ fEd + _) fi (tz@ fI2 + for (bid f@ + for (bad f@ + for (see f%O@ + ft (en f + +.group g + g g + gg g + g (e dZ + _) gaol dZeIl + g) ged (_ gId + g (eek g + geous dZ=@s + g (E dZ + g (i dZ + gi (_ gI2 + _) g (il g + l) ging dZI2N + g (y dZ + _) g (n + exa) gg (er dZ + ght t + _) gh g + gh (_ g + C) gh (A g + gh (C g + gm (_ m + gn (_ n + _) gnu g@nu: + hun) g g + g (ear g + g (et g + g (ette_ dZ + ve) g (et dZ + o) g (et dZ + er) g (et dZ + for) ge (t gE + &) gia (_ dZ@ + &) gia (C_ dZ@ + &) giu (m dZ@ + _) g (id g + _) g (im g + _) giga gIg@ + g (igg g + g (ilt g + r) ging dZI2N + g (ift g + g (ird g + g (irl g + g (irt g + g (ive g + @) guay (_ gwaI + gue (_ g + _) gue gE + _) guer (n g3: + ar) gue gju: + +.group h + h h + h (h + h (_ + _B) h + &) ham (_ @m + @) hammed h'amId + A) han (_ h'an // places + ha (st heI + _) he' %hi: + @) head (_$4 hEd + heir e@ + _) hetero hEtroU + K) hl L + &) hold (_$4 hoUld + holme hoUm + _) h (our + _) h (ono + hone (st 0nI + _) horri h0rI + _) horse hO@s + _) house (@ haUs + house (_$5 haUs + houses (_$6 haUzI2z + +.group i + i I + _) i' %aI + _C) i (_ aI + _CC) i (_ aI + b) i (_ aI + c) i (_ aI + c) is (_ Is + @@h) i (_ =I2 + h) i (_ =aI + &sk) i (_ =I2 + i (CCi_ 'I + _C) i (Ca_ i: + i (Be# aI + i (Bee I + i (Bel_ I + i (Bet_ I + @) i (Cer I + _C) i (Cer_ aI + _CC) i (Cer_ aI + i (ani_ I + i (ber_ aI + i (der+_ aI + @) i (Cing aI + &) i (Cent I + &) i (Cenc I + _) i (Cy_ aI + _C) i (Cy_ aI + _p) i (ty_ I + _CC) i (Cy_ aI + ntell) i I + @) ing (_+$3dve I2N + @) ings (_$4dve I2Nz + @) ingly (_$5dve I2Ng-lI + @) ingment (_$7dve I2Ng-m@nt + logu) ing (_$4v I2N + @@om) ing (_$3dv I2N + en) ing (_$3v I2N + en) ings (_$4v I2Nz + en) ingly (_$5vf I2Ng-lI + er) ing (_$3v I2N + er) ings (_$4v I2Nz + er) ingly (_$5vf I2Ng-lI + er) ingment (_$7v I2Ng-m@nt + Br) ing (_ IN + _) i (a aI + _) i (b aI + _) i (c aI + _) i (d aI + i (deo I + _) i (di I + C) i (ler aI + _) i (o aI + &) ial (_ =I2@l + @) ibab aIb@b + @) ible (_$4ev @b@L + @) ibly (_$4efv @blI2 + i (bilit I + l) i (bel aI + b) i (ble_ aI + i (bo_ i: + v) i (br aI + f) i (bre aI + _l) i (br aI + _l) i (bre i: + l) i (ber I + scr) i (ber aI + @) i (butive 'I + @) i (butor 'I + &) i (c_ =I + &) i (ca_ =I + &) i (cal =I + i (cial 'I + ician 'IS@n + @) i (ce_ I + @) i (ced_ I + @) i (cence I + pr) i (ce aI + ent) i (ce aI + adv) i (ce aI + dev) i (ce aI + _) ich Ik + @) i (cip 'I + i (cus_ =I + _) id (_ aIdi: + idea aId'i@ + acc) i (d I + c) i (dal 'aI + fr) i (day aI + _) i (dle aI + br) i (dl aI + f) i (del I2 + br) i (dA aI + br) i (dg I + ybr) i (d I + _s) i (der aI + i (der_+ aI + @) i (do_ 'i: + ifier (_ IfaI@ + man) ife (s IfE + &) ify (_ =I2faI + if (icAnC 'If + r) i (fl aI + st) i (fl aI + n) ihi aI|@ + ii (_ IaI + f) i (j i: + h) i (j aI + @) illa (_ 'Il@ + @) ila (_ 'Il@ + _) il (l I2 + _) ill (_ Il + _) il (ln I + _) il (lust I + _C) i (lage aI + ch) i (ld aI + ch) i (ldr I + _m) i (ld aI + _w) i (ld aI + w) i (lderC I + i (leA I + &) ile (ge @lI + sacr) ile IlI + @) i (less I + s) i (len aI + _C) i (lo aI + _k) i (lo I + _l) i (Cy_ I + &) ily (_ I2lI2 + l) i (m@ I + cl) i (m aI + l) ime aIm + l) i (mer I + d) ime (ns aImE + im (ent+ Im + ime (ter_ Imi: + ime (tre Imi: + @) i (metr I + s) imile 'ImI2lI2 + _pr) i (ma aI + sh) i (ma_ 'i: + i (mum I + @) i (ness I + io (_ =I2oU +?7 io (_ =i:oU + b) io aIoU + b) io (logy aI0 + v) io aI0 + i (o I2 +?7 i (o i: + io (li_ I2'oU + &) ion (_ =i@n + n) ion =i@n + v) io (l aI@ + g) io (n @ + m) io (n I20 + sh) io (n @ + _) io (n aI0 + _l) io (n aI@ + z) io (n aI@ + r) ior (_ I3 + &) ior (+ i@ + &) ior (_ j3 + iority I'0rItI2 + iou (rA j@ + iour (K j3 + @) ious (_ =I2@s + _r) io (t aI@ + io (t_ I|@ + ipede Ipi:d + _s) i (ph aI + i (que_ 'i: + i (qu_ i: + mun) ique IkeI + iquette I2kEt + @) i (scenC 'I + &) i (zabl aI + &) i (sabl aI + @) is (co_ 'Is + _) is (lan aI + _) is (le aI + _) is (o aIs + is (o_ aIz + ise (_ aIz + iser (_ aIz3 + @) ism (_$3de Iz@m + @iB) ism (_$3d Iz@m + is (er+_ aIz + iz (er_ aIz + prAm) is Is + @Cs) is (_ =Is + ize (_ aIz + ise (d_ aIz + ize (d_ aIz + isa (tion aIzeI + iza (tion aIzeI + _d) i (se I2 + &) ish (_ I2S + i (sive aI + is (land aI + is (le_ aI + @) iste (_ 'i:st + @) is (tic 'Is + chr) i (st_ aI + adv) is aIz + v) is (coun aI + is (or_ aIz + issimo (_ 'IsImoU + @) istan (_ =Istan + @) istani (_ Ist'A:nI2 + r) is (y_ =@s + ithe (_ aID + i (tion 'I + &) ius I2@s + &) iu (m =i@ + i (wo 'i: + C) i (x++ I + s) i (zA aI + p) izz (a i:t|s + +.group ia + _C) ia aI|@ + _CC) ia aI|@ + &) iac (_ =Iak + C) iar aI@ + iar (iC Iar + &) iary =j@rI2 + &l) iary =i@rI2 + _) ian i@n + @) ia (_ =i:@ + @@) ia (_ =i@ + @) ian (cy I|@n + l) iais I2|eIz + p) ia (no Ia + f) ia (b aI@ + r) ia (b I2@ + t) ia (b I2@ + &) iage (_ IdZ + iah (_ 'aI@ + ia (m I2@ + &) ia (n i@ + &) ia (n@ I'a + ia (ng_ ja + _f) ia (nc I'0 + _f) iance I'0nseI + ef) ia (nce 'aI@ + l) ia (nce 'aI@ + ill) ia (nce I2@ + f) ia (nt 'aI@ + pl) ia (nt 'aI@ + ill) ia (nt I2@ + al) ia (nt I2@ + iar aI@ + @l) iar (_ i@ + iara (_ I'A:r@ + iarch I2A@k + iard (_ I23d + iai I2aI + @) iate (_ =I2eIt + opr) iate (_ I|@t + iath 'aI@T + @) ia (tive =i@ + +.group ie + ie I + ie (_ I2 + _) ie (_ aIi: + ied (_$2i d // suffix + ie (c aI + ie (ce i: + _C) ie (_ aI + _r) ie i: + iedly IdlI2 + _z) ie i: + p) ie (_ aI + pp) ie (_ I2 + ie (f i: + iege i:dZ + ie (go I'eI + ieh (C i: + iei (_ i:aI + iej i:'eI + ie (k i: + ie (l i: + ie (llA I2'E + n) iel (_ I2@L + &r) iel (_ =i:@L + ie (n i@ + ie (ntal I'E + g) ie (n i: + _sc) ie (n aI@ + ie (nCiA I2'E + fr) ie (nd E + f) ie (nd i: + @) ienne (_ I'En + cl) ie (nt aI@ + &) ier (y I2@r + ier i@ + ier (_ i@ + _h) ie (r aI@ + pl) ier (_ aI@ + _Cr) ier aI@ + ier (c i@ + ierre (_ I2e@ + ie (t aI@ + @) ie (th i@ + iesta i:'Est@ + iette I2'Et + @) iety 'aI@tI2 + l) ieu u: + l) ieu (te %Ef + med) ie (val I2i: + ie (v i: + iew (_ ju: + iew ju: + ies (_$2i z + spec) ies (_ i:z + ser) ies (_ i:z + _ar) ies (_ i:z + iesc I2Es + &) ie (st_ I2@ + pr) ie (st i: + _v) ie (t %i@ + ie (ve i: + s) ie (ve I + ie (z i: + +.group ig + am) ig (a_ i:g + t) ig (e+ aIg + t) ig (r aIg + igh (t aI + h) igh aI + n) igh aI + s) igh aI + &) igib IdZ@b + igm (_ aIm + ign (_ aIn + ign (C aIn + n) igan (_ =Ig@n + @) ig (ne aI + @) ig (n_ aI + d) ig (nA Ig + _) ig (ni I2g + ig (no I2g + ig (noran Ig + ig (na Ig + _m) ig (ra aIg + _m) ig (rat %aIg + igu (e 'i:g + igu (_ 'i:g + +.group im + _) im (@ I2m + im (age Im + im (it Im + _) imm (@ I2m + imm (at ,Im + imm (em ,Im + imm (ig Im + imm (in Im + imm (unis Im + @) imous (_ =Im@s + im (pac Im + im (pecu ,Im + imper (C@ I2mp3: + im (petus Im + im (plant_ Im + im (ple Im + im (plica Im + impo (ten Imp@ + im (portu ,Im + im (pregna ,Im + im (presa ,Im + im (provis Im + im (pulse_ Im + +.group in +?7 &) in (_ @n + _) in (@P2 I2n + _) in (b In + _) in (can In + _) in (cens In + _) in (ch In + inci (de InsI + _) in (comA In + _) in (corp I2n + _) in (cre In + _) in (cred I2n + increm InkrIm + _) in (cub In + _) in (cul In + _) in (deP2 ,In + _) ind (efin I2nd + in (dex In + in (dia In + _) in (dic In + _) indi (ge ,IndI2 + _) in (digo In + _) in (dir In + _) in (disP2 ,In + _) in (divP2 ,In + _) in (dol In + in (exP2 ,In + _) inex (or In'Eks + _) infa (l I2nfa + _) in (fam In + _) infan Inf@n + _) in (fid In + _) in (fil In + in (finite In + _) in (flo In + _) in (flu In + _) in (fo_ In + _) infra (P5 ,Infr@ + _) infra (c I2nfrak + in (got IN + _) in (gro IN + _) in (jur In + _) in (k IN + _) in (l In + _) in (m In + _) inno (ce In@ + _) inno (v In@ + _) inn (um I2n + _) in (of In + _) in (org In + _) in (p In + _) in (que In + _) in (quis In + _) in (r In + in (sect In + _) in (secP2 ,In + _) in (set In + _) in (sh In + _) in (sigh In + _) in (signifP2 ,In + _) in (sincP2 ,In + _) in (sof In + _) in (sola In + _) in (sole In + _) in (somu In + _) in (spir In + _) in (stan In + _) in (sti In + _) in (stil I2n + _) in (strum In + _) in (sub In + _) in (sul In + _) in (tak In + _) in (teg In + _) in (tegri I2n + inte (llec Int@ + _) inter (@P5 ,Int3 // prefix + _) inter (AP5 ,Int@r + inter (est Int@r + interfer Int@f'i@ + _) int (erio+ I2nt + _) inter (n_ I2nt3: + _) inter (nal I2nt3: + _) inter (pr I2nt3: + _) inter (pol@ I2nt3: + interpre (t I2nt3:prI + _) inter (rog I2ntE + inter (view Int3 + _) in (tima In + intrigu Intr'i:g + intrica IntrIk@ + _) in (tona In + _) intro (@ ,Intr@ + _) intro (v Intr@ + _) in (un In + _) in (voi In + _) in (wa In + @) inous (_ =In@s + _m) ini InI + adm) ini InI + m) iniatur InItS3 + m) inera (l In@r@ + &m) inal (_ =In@L + f) in (a aIn + g) in (a_ aIn + ch) in (a aIn + k) in (a_ 'i:n + l) in (a_ 'i:n + r) in (a_ 'i:n + t) in (a_ 'i:n + @) in (ate =In + @) in (cial 'In + b) in (d aIn + f) in (d aIn + h) in (d_ aIn + @) inda (_ 'Ind@ + h) in (dB aIn + sh) in (i aIn + @f) ini (te In@ + beh) in (d aIn + k) in (d aIn + k) in (dl In + k) in (dr In + k) in (derg In + bl) in (d aIn + m) in (d aIn + _r) in (d aIn + gr) in (d aIn + w) in (der_ aIn + w) in (ding aIn + rew) in (d aIn + unw) in (d aIn + v) in (eg In + in (ea In + in (ee In + c) in (e In + inc) in (e In + bas) in (_ @n + @c) ine (_ i:n + &d) ine (_ i:n + Ach) ine (_ i:n + ph) ine (_ i:n + nal) ine (_ In + il) ine (_ i:n + ol) ine (_ i:n + ul) ine (_ In + p) ine (_ aIn + erm) ine (_ In + @r) ine (_ i:n + cr) ine (_ aIn + @t) ine (_ i:n + @@ent) ine (_ aIn + z) ine (_ i:n + xam) in (e In + nfr) ing IndZ + @) ini (_ 'i:nI + tr) in (i In + &) inin (_ =@nIn + &) in (enC In + inism (_ InIz@m + infor (matio Inf3 + ino (_ 'i:noU + _m) in (us aIn + _) intra Intr@ + _) intra (CC I2ntra + +.group ir + _) ir (a I2r + ir (a_ 'i@r + ir (able 'aI@ + m) ir (ac Ir + sp) ir (al aI@r + @) ir (ation Ir + ir (at %aIr + ire aI@ + s) ir (en aI@ + c) ire (n aIr@ + ir (ect %aIr + ir (ety aIr + irer (_ aI@r@ + ir 3: +?5 ir IR + @C) ir (_ i@ + st) ir (_ 3: +?5 st) ir (_ IR + ir (i Ir + ir (i_ 'i@r + asp) ir (i r + _) ir (ish aIr + ir (o I2r + g) ir (o aIr + _C) ir (o_ aIr + @) ir (o_ 'i@ + _) iron aI@n + iron (A aIr'0n + v) iro (n aIr@ + p) ir Ir + _p) ira (c aI@ + p) ire aI@ + des) ir aI@ + _) irre (C ,IrI + irr (econ I2r + _) irr (egu I2r + _) irr (ele I2r + irr (eso I2r + irr (evere I2r + irr (evoc I2r + _) ir (rA I + ir (ro I + ir (ru I + iry (_ aI@rI2 + +.group it + _) it' I2t + _m) it (o aIt + it (o_ 'i:t + _C) ity (_ ItI2 + _ed) it It + cred) it It + v) it (al aIt + t) it (l aIt + &) ity (_ =ItI2 + orb) it It + @@) it (an_ =It + gran) it (e It + nfin) it (e It + ur) it (e It + pos) it (e It + quis) it (e It + &) it (e_ It + &) it (e_N aIt + &) ites (_ aIts + pos) ites (_ Its + c) it (e_ aIt + c) it (er_ aIt + v) it (er_ aIt + am) it (e aIt + un) it (e aIt + _sp) it (e aIt + _s) it (e aIt + x) ite (_ aIt + it (erat It + l) it (er It + wr) it (er aIt + ithe_ aID + l) ithe aID + _sl) ith ID + it (i_ 'i:t + itius (_ 'IS@s + itis (_ 'aItIs + &) itous =It@s + l) itre i:t3 + n) it (rA aIt + n) itro aItroU + n) itro (ge aItr@ + it (um aIt + +.group iv + @) iva (_ 'aIv@ + @) iv (e Iv + iv (e# aIv + h) iv (e_ aIv + l) ive (l aIv + l) iv (en aIv + r) ival aIv@L + ct) iv (al 'aIv + v) iv (al 'aIv + ive (ness Iv + _al) iv (e aIv + _arr) iv (e aIv + dr) iv (e_ aIv + contr) iv (e 'aIv + depr) iv (e aIv + der) iv (e aIv + _r) iv (er_ Iv + r) iv (el Iv + r) iv (en Iv + r) iv (et Iv + _l) iv (el aIv + _C) iv (el Iv + _CC) iv (el Iv + _g) iv (e Iv + _l) iv (e Iv + r) iv (er Iv + dr) iv (er aIv + sh) iv (er Iv + v) iv (e aIv + _CC) iv (en Iv + _CCC) iv (en Iv + iv (or_ aIv + +.group j + j dZ + j (j + _) jere (C dZEr@ + _) jes (ui dZEz + _) joa (n@ dZoU'a + +.group k + k k + k (k + _) kn n + kn (if n + kn (iv n + kn (it n + kn (ob n + kn (ow n + kha kA: + khar kA@ + _) ki (lC@ kI2 + _) ki (ll@ kI + kuan kwan + ku (ch ku: + kuwait ku:w'eIt + +.group l + l l + l (l + l (_ l + A') ll l + A) ll l + A) l (ly_ l + y) ll l + A) ll (A l + l (C l + ll (C l + _) llan L%an + l (E l + lle (_ l + @@o) lled (_$3v d + @@) lled (_$3v d + B) l (_ @L + w) l (_ l + r) l (_ l + Al) l (_ + &) la (nd_ la2 + over) la (nd la + &) lim (ent lIm + &t) ling (_ _lI2N + &B) ling (_ lI2N + linux lInVks + listen lIs@n + lu (na lu: + @) ly (_$2if lI2 + @l) ly (_$2f I2 + f) ly (_ laI + ief) ly (_$2f lI2 + ff) ly (_$2f lI2 + of) ly (_$2f lI2 + multip) ly laI + &p) ly (_$2f lI2 + p) ly (_ laI + _) ly (d lI + +.group le + &) le (_ l + &C) le (_ @L + &r) le (_ l + legged lEgId + Ab) le @L + C) le (ton_ @L + Ab) ler (_ l@ + Ab) le (C_ l@ + Ab) led (_ @Ld + &) lem (ent @Lm + &p) lem (ent lIm + %C) le (B@ @L + %C) le (Bia l'i: + @b) le (C@ @L + @b) ler (C@ l3 + @d) le (B@ @L + @t) le (B@ @L + tt) le (@ @-l + &C) le (ss l@ + @) less (_$4i l@s + @) lessly (_$6i l@slI2 + @) lessness (_$8i l@sn@s + +.group m + m m + mm m + h) m (_ @m + B) m (_ @m + l) m (_ m + _) mac (adP3 m@k + _) mac (bP3 m@k + _) mac (dP3 m@k + _) mac (lP3 m@k + _) mac (mP3 m@k + _) mal (fP3 m,al + _) mal (i m@l + _) mal (ev m@l + _) mal (nP3 m,al + _) mal (pP3 m,al + _) mal (trP3 m,al + _) ma (m ma + mayor me@ + mb (_ m + mbly mblI2 + li) mb (e m + o) mb (e m + du) mb (e m + _) m (c m@ + mn (_ m + _) mn n + &B) me (_ mI2 + @) men (_ mEn + &) ment (_$4 m@nt + &) ments (_$5 m@nt|s + mEnt (_ m@nt + tor) me (nt m'E + C) mented m'EntId + mEntary (_ m'Ent@rI2 + _) meta mEt@ + metabo mEt'ab0 + _) meta (llu m%Eta + millen mI2lEn + _) mobile moUbaIl + im) mobile moUbaIl + mobile m@bi:l + mo (noto m@ + _) mono m0noU + mon (opol m@n + mon (ox m0n + @) most(_$4 moUst + &) mouth (_ m@T + _) multi mVltI + +.group mi + _) milli (C mIlI + _) mis (@P3 mI2s // prefix + mis (chie mIs + mis (ci mIs + mis (dem mIs + mis (er maIz + miserab mIz@r@b + mis (fi mIs + mis (hap mIs + _) mis (in m,Is + mish (ma mIS + miss mIs + mi (ssi mI + _) mis (ti mIs + _) mis (tim m%Is + _) mis (tit m%Is + mis (ty mIs + mistle mIs@L + mis (tral mIs + mis (tres mIs + mi (sta mI2 + micr (o maIkr + micro (CC@ maIkr@ + micro (CA@ maIkroU + _) mi (nAr maI + mi (nera mI + +.group n + n n + n) n + &ia) n (_$1 n + &ia) ns (_$2 nz + @) name (_ neIm + _) nano (P4 n,anoU + necessit n@sEsIt + &) ness (_$4i n@s + @) n (cC N + @) n (ch n + n (c_ N + 2_) nd (_ + &B) ne (_ nI2 + &n) ne (_ + _) neo ni:oU + _) news (P4 n'ju:z + ng N + n (x N + nging (_ NI2N + nk Nk +?7 nk nk // ?? Scottish + n (kn n + n't nt + E) n (_ @n + B) n (_ @n + g) n (ing+ n + n) n (_ + g) n (_ n + l) n (_ n + ninth naInT + n (Co_ =n + _) non (@P3 n,0n + +.group ng + ng (l Ng + ng (r Ng + ng (A Ng + ng (iti ndZ + ng (e ndZ + nged ndZd + o) nged Nd + spo) nged ndZd + _a) ng (er Ng + ba) ng (er Ng + cla) ng (er Ng + ta) ngi ndZI + i) ng (er Ng + gi) ng (er ndZ + o) ng (er Ng + you) ng (er Ng + ng (est Ng + co) nge (st ndZE + ngue N + +.group o + o 0 + _) o'(P2 %oU // prefix + o (Be# oU + o (BenC oU + o (BeCo_ 0 + o (Bing oU + o (BiA 'oU + _) o (Bal oU + _C) o (Bal oU + _CC) o (Bal oU + o (_ oU + @@C) o (_ =oU + ig) o (_ oU + o (Ba_ 'oU + o (Beon 'oU + _C) o (Bus_ oU + _CC) o (Bus_ oU + @) o (Ci_ 'oU + o (Co_ 'oU + @) o (lo_ 0 + o (Cic_ '0 + o (Cical '0 + o (Cemic 0 + of (fen @ + oa (_ 'oU@ + oa oU + oar (_ o@ + oar o@ + o (atia oU + br) oa (d O: + o (ba oU + t) o (bacc @ + o (bed oU + _) o (bes %oU + o (bic_ 'oU + n) o (bil oU + n) o (bl oU + _m) o (bil oU + o (bje %0 + _) o (bl %0 + o (bliga 0 + o (bligato %0 + o (blo 0 + r) o (bot oU + _) o (bs %0 + _) obs (er %0bz + obso (l 0bs@ + o (bstin 0 + o (bt %0 + o (bu %0 + f) o (cA oU + ff) o (cA @ + _l) o (cA oU + l) o (cat %oU + o (cclu @ + tr) och oUk + _v) o (cA oU + &%C) ock (_ @k + l) o (com ,oU + o (cre_ 'oU + cr) o (cu oU + _h) o (cu oU + o (ccasi @ + d) o (cil oU + occur @k3: + occurr @k3: +?5 occur @kVR +?5 occurr @kVR + meth) o (d_ @ + peri) o (d_ @ + cust) o (d @ + cust) o (di 'oU + o (da_ oU + k) o (dA oU + d) o (dec %oU + m) o (del 0 + m) o (der 0 + m) o (dest 0 + odo (rA oUd@ + mm) o (dor @ + odor oUd3 + odour oUd3 + oe oU + o'er o@ + oea (_ i@ + oer oU@ + oe (soph I2 + sh) oe u: + f) oe (tA i: + p) oe (m oUI + p) oe (t oUI + p) oe (ti oUE + oe (ve ,oU'E + o (ffici @ + o (gan_ oU + &) o (gen_ @ + hom) o (gen '0 + ogeni (c oUdZ'EnI + r) o (ger 0 + l) o (gy @ + l) o (gies @ + r) ogue oUg + v) ogue oUg + @@) ogue 0g + @) oged 0gd + oh oU + o (hA oU + j) oh (n 0 + oi OI + oia OI@ + oi (c_ oUI2 + oi(na_ 'OI + o (ing oU + d) o (ing u: + c) o (inci %oU + oire wA@ + oir wA@ + @) ois (_ wA: + o (ism oU + @) o (ist oU + oix (_ wa + o (ky_ oU + &c) on (_ @n + &) oped (_ @pd + _) o (per 0 + _) ope (n oUp@ + un) ope (n oUp@ + @) opol '0p@L + opolitan @p'0lIt@n + oppor (t 0p3 + opp (res @p + pr) o (pe 0 + appr) o (p oU + bish) o (p @ + &) o (p_ @ + sh) o (p_ 0 + fl) o (p_ 0 + p) o (p_ 0 + r) o (p_ 0 + t) o (p_ 0 + &) ophe (_ =@fI2 + s) o (phistic @ + &) o (pher =@ + o (pini @ + o (se_ oU + gg) ot (_ @t + rr) ot (_ @t + n) o (ta oU + n) o (tor oU + r) o (ta oU + t) o (ta oU + piv) o (t @ + o (tat oU + _C) o (ti oU + m) o (tiv oU + c) o (tan oU + p) o (tenti @ + n) otic (A oUtI2s + o (tion oU + o (ther V + b) o (th oU + b) o (ther 0 + cl) othe oUD + tr) othe oUD + l) oth (ian oUD + _r) o (ther 0 + ph) oto oUtoU + ph) o (ton oU + ph) otocop oUt@k0p + ph) oto (grapher @t0 + ph) oto (graphy @t0 + pr) oto oUtoU + pr) oto (n oUt0 + m) otor oUt@ + otro (py '0tr@ + m) o (x @ + o (x++ 0 + ox (ide '0ks + oxy 0ksI + oy OI + d) o (zen V + _) o (zo oU + o (zy_ oU + +.group ol + &st) ol (_ @L + ol (ar oUl + @@) ol (ar 'oUl + h) ol (ar 0l + m) ole (st @lE + b) ol (t oUl + c) ol (our Vl + @@) ol (us 'oUl + patr) ol oUl + contr) ol oUl + ext) ol oUl + _id) ol @L + _id) ol (a 0l + petr) ol (_ @L + s) ol (em 0l + t) ol (er 0l + m) ol (ec @l + m) ol (ecule 0l + old oUld + w) olf Ulf + p) olice @li:s + &p) olis =@lIs + p) ol (ite @l + s) ol (idi @l + f) ol (k oU + y) ol (k oU + p) oll (u @l + r) oll oUl + car) oll @l + br) oll 0l + t) oll oUl + at) oll 0l + w) oll oUl + olm (_ oUm + olo (gy '0l@ + olo (gi '0l@ + olo (gic @l'0 + v) olt oUlt + w) olv Ulv + _p) oly ,0lI + +.group om + &) om (_ @m + c) om (_ 0m + c) om (pan Vm + r) om (_ 0m + n) om (ad oUm + t) oma (to @mA: + c) omb (_ oUm + t) om (b u:m + w) omb (_ u:m + c) ombe (_ u:m + c) om (e Vm + c) omm (e Vm + _d) om (a @m + d) om (est @m + d) om (ini @m + @@in) ome (_ 'oUmeI + ome (ter '0mI + @) ome (tre '0mI + @) ome (try '0m@ + gl) om (er 0m + _p) om (e 0m + _s) ome Vm + s) om (e_ Vm + st) omach Vm@k + r) om (an oUm + r) oman (ti oUm'an + chr) om oUm + w) oma (n Um@ + w) ome (n ImI + _) om (iC %oUm + omin (o '0mIn + &) om (ise_ =@m + &) om (ize_ =@m + @) om (ist_ =@m + &) omy (_ =@mI2 + +.group on + @@) on (_ @n + &b) on (_ @n + Cd) on (_ @n + &s) on (_ @n + &t) on (_ @n + &tr) on (_ 0n + fl) on (_ 0n + il) on (_ 0n + yl) on (_ 0n + &m) on (_ @n + dr) on (_ @n + or) on (_ 0n + cr) on (_ 0n + phot) on @n + pers) on @n + pers) on (i '0n + postp) on 'oUn + d) on (at %oUn + on (an_ oUn + _) on (io Vn + ec) on (d @n + m) on (d_ @n + &C) oned (_$2v d + &C) oning (_$3v I2N + _) one w0n + _) once (_ w0ns +?6 _) one wVn +?6 _) once (_ wVns + g) on (e 0n + &) on (er_ @n + ph) on (eti @n + h) oney VnI2 + n) on (e 0n + m) one (ta VnI + _) one (r oUn@ + m) oney VnI + und) one (_ Vn + m) ong (er VNg + on (i_ 'oUn + &) onism (_ =@nIz@m + &) onist (_ =@nIst + @) on (ica '0n + m) on (k Vn + sp) on (ge Vn + fr) on (t Vn + m) on (th Vn + &) onous @n@s + onus oUn@s + w) on Vn + w) on (k 0n + w) on (t 0n + _) only oUnlI2 + &) ony (_ @nI2 + _C) ony oUnI2 + _CC) ony oUnI2 + onymous '0nIm@s + +.group oo + oo u: + h) oo (d U + h) oo (k U + w) oo (d U + h) oo (d U + bl) oo (d V + fl) oo (d V + st) oo (d U + g) oo (d U + C) oo (k U + k) oo (k u: + p) oo (k u: + &) oo (n 'u: + m) oo (n_ u: + sp) oo (n_ u: + f) oo (t U + s) oo (t U + s) oo (th u: + w) oo (l U + _c) oo (p oU'0 + oor o@ + oor (_ o@ + _m) oor U@ + p) oor U@ + c) oor (d oU'O@ + oos (e u:s + ch) oose u:z + ch) oos (en oUz + oot (ic_ u:'0t + +.group or + or o@ + _) or O@ + or (ch_ O@ + or (m_ O@ + or (n_ O@ + or (se_ O@ + or (t O@ + p) or (t o@ + or (A o@r + @@) or (_$2d 3 // suffix + &) or (_ 3 + _c) or (@ O@ + c) or (k O@ + c) or (e_ o@ + d) or (_ o@ + _f) or (@ O@ + f) or (k O@ + ch) or (d O@ + l) or (d O@ + _m) or O@ + _m) ore o@ + nd) or (_ 3 + nt) or (_ o@ + vent) or (_ 3 + y) or (k O@ + &) or (ation @r + _) ora (to 0r@ + @) or (ca_ 'O@ + w) orce (st U + &f) or (d_ 3 + ore o@ + oresc @r'Es + ora (cl 0r@ + or (eB_ 0r + or (eA o@r + or (enC 0r + or (et o@r + or (ex o@r + or (i_ 'O@r + @) or (ical '0r + @) or (ic_ '0r + or (ig 0r + &) ored (_ @d + _f) ore (C O@ + f) ore (clo %o@ + f) ore (st 0rI + f) ore (go %o@ + f) ore (se %o@ + f) ore (to %o@ + @) or (iti 0r + @) or (ity 0r + _) or (iC 0r + @t) ore (_ 3 + st) ore (_ o@ + h) ori (z @raI + h) ori (zont 0rI + _h) or (o 0r + orr (_ o@ + or (r 0 + bb) or (n 3 + f) oreign 0r@n + f) or (ever O@ + f) or (gAt 3 + f) org (iv @g + fl) or (i 0r + or (igina @r + chl) or (ic o@r + chl) or (ous o@r + pl) or o@ + m) or (al 0r + w) or 3: +?5 w) or VR + w) or (m 3: +?5 w) or (m VR + w) or (se 3: +?5 w) or (se VR + w) or (th 3: +?5 w) or (th VR + sw) or o@ + &) or (ous @ + orough Vr@ + eff) or (t 3 + w) or (t_ o@ + w) or (r V + w) or (n o@ + w) or (e o@ + &) ory (_ @rI2 + _st) ory o@rI + +.group os + os (al_ 'oUz + _l) os (e u:z + purp) ose (_ @s + c) os (ec oUs + c) os (ine_ oUs + osis (_ 'oUsIs + p) os (itio @z + os (ity '0s + os (ive 'oUs + p) oss (ess @z + gr) oss oUs + h) ost (_ oUst + gh) ost oUst + m) ost oUst + p) ost oUst + p) ost (eri 0st + p) ost (u 0st + ap) ost 0st + prep) ost 0st + imp) ost 0st + rep) ost 0st + comp) ost 0st + exp) ost 0st + hyp) ost 0st + osure 'oUZ3 + _C) os (y oUz + +.group ou + ou aU + ou (_ u: + ou (t aU + y) oung VN + oua wA: + d) ou (b V + d) oub (t aU + k) ou u: + r) ou (bl u: + tr) ou (bl V + t) ou (ch V + t) ou (can u: + gl) ouce (s 0 + d) ouch u:S + b) ou (d u: + ou (f u: + d) ou (g V + n) ou (ga u: + r) ouge u:Z + _) ough O: + ough (t O: + ough (* OI + ough oU + b) ough aU + b) ough (t O: + c) ough 0f + d) ough oU + d) ough (t aU + h) ough oU + h) ough (t O: + l) ough Vf + pl) ough aU + rl) ough oU + sl) ough aU + n) ough Vf + n) ough (t O: + r) ough Vf + br) ough (_ @ + br) ough (t O: + dr) ough aU + thr) ough u: + or) ough @ + tr) ough 0f + wr) ough O: + t) ough Vf + ou (i u: + oul (d U + ou (lA u: + b) ou (ld oU + b) ou (ll u: + gh) ou (l u: + m) ou (lC oU + sh) ou (lder oU + f) ou (le aU + p) ou (lt oU + s) ou (l oU + h) ou (m ju: + @) ou (m_ 'u: + c) ou (ntr V + y) ou (ng V + w) ou (ndA u: + w) ou (ndC u: + ou (p u: + c) ou (pl V + &) our (_ 3 + np) our (_ o@ + &) oured @d + ev) our (ed aU@ + our (n 3: +?5 our (n VR + b) our (n o@ + m) our (n o@ + b) our (se U@ + _) our aU@ + c) our (s o@ + c) our (t o@ + c) our (te 3: +?5 c) our (te VR + c) our (tesa o@ + sc) our aU@ + c) ou (rag V + _d) our aU@ + _f) our o@ + _g) our (d U@ + h) our aU@ + fl) our aU@ + n) our (i Vr + p) our o@ + Ap) our 3 + s) our aU@ + s) ource o@s + t) our U@ + t) our (_ U@ + t) our (n U@ + st) our aU@ + dev) our aU@ + _y) our o@ +?7 _y) our U@ + our 3: +?5 our VR + &B) ous (_ =@s + &dr) ous (_ =@s + &l) ous (_ @s + &) ous (_ @s + &) ousy (_ @sI2 + &n) ous (_ @s + _) out (@P3 %aUt // prefix out + c) ou (si V + m) ou (sse u: + r) ou (te u: + r) ou (tin u: + Cr) ou (t aU + c) ou (th u: + s) ou (ther V + y) ou (th u: + ou (v u: + oux (_ u: + +.group ov + @) ov (al u:v + _) ov (en Vv + ov (er oUv + _) over (@P4 ,oUv3 // prefix + over (coa oUv3 + over (dos oUv3 + over (dra oUv3 + over (dri oUv3 + over (sig oUv3 + over (ton oUv3 + over (tur oUv3 + over (vie oUv3 + &) over (_ oUv3 + c) over (_ Vv3 + pr) over (_ u:v3 + _) ov (A oUv + _) ov (ul 0v + c) ov (en Vv + c) ov (enC 0v + c) over Vv3 + c) ov (et Vv + d) ove Vv + g) ov (ern Vv + sh) ov (+ Vv + h) ov (el 0v + h) ov (er 0v + l) ov Vv + l) ov (e Vv + _l) ove Vv + cl) ov (e oUv + pl) ov oUv + pull) ov oUv + m) ov (A u:v + n) ov (el 0v + p) ov (er@ 0v + pr) ov (e# u:v + gr) ov (el 0v + tr) ov (er 0v + pr) ov (er 0v + m) ov (i u:v + s) overeign 0v@rIn + @) ovitch (_ =@vItS + +.group ow + ow oU + ow (ay_ @w + kn) owle (d 0lI + _) ow (l aU + a) ow aU + b) ow (el aU + b) ow (er aU + b) ow (sA aU + b) ow (sp aU + c) ow aU + mosc) ow oU + _d) ow aU + d) ow (n aU + end) ow aU + f) ow aU + g) ow aU + h) ow aU + ch) ow aU + sh) ow oU + sh) ow (er aU + wh) ow aU + yh) ow aU + j) ow aU + k) ow aU + _all) ow aU + sall) ow aU + cl) ow aU + fl) ow (er aU + gl) ow (er aU + pl) ow aU + _n) ow (_ aU + _n) ow (t aU + en) ow (n aU + n) ow (ad aU + p) ow aU + r) ow (d aU + br) ow aU + cr) ow (n aU + dr) ow aU + fr) ow aU + gr) ow (l aU + pr) ow aU + tr) ow (e aU + t) ow (el aU + t) ow (er aU + t) ow (n aU + v) ow aU + w) ow aU + y) ow aU + +.group p + p p + p (p + ph f + phenome (n fI2n0mI + phenyl f,i:naIl + p (haza p + ph (erd p + phila fIla + p (hole p + sym) pa p@ + _) pico pi:koU + piece (_$5 pi:s + por (tray p%o@ +// _) post (@@P4 p,oUst // prefix + pneu nju: + pota (t p@teI + _) ps s + psyche saIk@ + psycho saIkoU + psycho (lo saIk'0 + _) pt t + ei) pt t + ras) p (b + _) pur (su p3 + put (_ pUt + pyon pj0n + _) pyro (@@P4 p,aIroU + pyrom (e paIr'0m + +.group pe + peace pi:s + _) pe (nr p%E + pe (ninsu p@ + per (cep p3 + per (cei p3 + per (culi p3 + per (fec p3 + per (iph p@r + perme (a p3:mI + per (miss p3 + per (mit p3 + per (pet p3 + per (petr p3: + per (ple p3 + per (sis p3 + persever p3:sIv'i@ + per (sp p@ + perspi (ra p3:sp@ + per (su p3 + per (tai p3 + per (tu p3 + per (v@ p3 + per (vi p3: + per (form p3 + per (su p3 + +.group pr + _) pre (_ pri: + _) pre (C@ prI2 + _) prea (ch pri: + _) pre (am pri: + pre (cio prE + preda (to prEd@ + prede (ces pri:dI + predi (lect pri:dI + _) pre (emp prI2 + _) pre (feren prE + pre (fix pri: + _) pre (gn prE + pre (hist pri: + _) pre (in@P3 pr,i: + pre (judi prE + _) pre (mi prE + _) pre (miu pri: + _) pre (mol pr%i: + _) pre (p_ prE + _) pre (posi prE + _) pre (qu pri: + pres (enc prEz + _) pres (enta prEz + _) pres (ent prI2z + presi (den prEzI + _) pre (sc pri: + _) pre (scr prI2 + _) pre (ss prE + _) pre (st prE + _) pre (val prE + _) pre (vio pri: + _) pre (view pri: + _) pri (o praI + prio (rit praI'0 + _) privat praIv@t + probab pr0b@b + pro (ced pr@ + pro (cee pr@ + pro (cessi pr@ + pro (clai pr@ + pro (cur pr@ + pro (duc pr@ + pro (duct pr0 + pro (fan pr@ + pro (fes pr@ + pro (fic pr@ + pro (fou pr@ + pro (fu pr@ + pro (gres pr@ + pro (hib pr@ + pro (jec pr@ + pro (lif pr@ + pro (lon pr@ + prome (th proUmi: + pro (mot pr@ + pro (nounc pr@ + pro (nun pr@ + pro (pan pr'oU + pro (pel pr@ + pro (pens pr@ + pro (per pr0 + pro (pit pr@ + _) pro (pA pr@ + _) pro (pag pr0 + pro (ph pr0 + pro (posit pr0 + pro (prie pr@ + pro (pul pr@ + _) pro (sa pr@ + _) pro (sc pr@ + pro (spectA pr@ + pro (tec pr@ + pro (test pr@ + pro (testan pr0 + pro (trac pr@ + pro (tru pr@ + pro (vid pr@ + pro (viden pr0 + pro (vis pr@ + pro (voc pr@ + pro (vok pr@ + pro (sec pr0 + pro (fil proU + pro (gra proU + pro (log proU + +.group q + _) q (B kju: + q k + q (q + qu kw + qu (C kw@ + s) qua (B kw0 + quas (A kweIz + quasi kweIzaI + @) que (_ k + _) que (_ kwE + qu (er_ k + quest kwEst + quet (_ keI + quette (_ kEt + queu kju: + qu (_ k + quay ki: + li) quor k3 + quy kwI + +.group r + r r + rr r + r) r (_ + C) r (_ r@ + e) r (_ 3 + @) r (B @ + 3_) rd (_ + rEr (_ r3 + _) rh r + C) rh r + rheu ru: + rhi (n raI + rhi (z raI + _) rho (d roU + _) rho (t roU + rhyth rID + _) rm ,A@Em + rrhoea r'i@ + _) run (a rVn + _) run (o rVn + _) rw r%U + +.group re + // _) re (@P2 %ri: + _) re (C@ rI2 + // _) re (A rI2 + &Ct) red (_ @d + &B) red (_ r@d + noeuv) re @ + rer (_ r@ + re (_ 3 + A) re (_ r@ + _) re (C_ rE + _) re (CC_ rE + un) re (C@ rI2 + un) reli (a rI2laI + re (Cel_ rE + rea (C% r,i:@ + _) rea (dC r,i:@ + rea (gen rI2eI + re (ck rE + reckon rEk@n + reco (g rEk@ + recon (c rEk@n + re (ct rE + re (dC rE + _) rede (C ,ri:dI2 + un) rede (C ,ri:dI2 + re (dem+ rI2 + _) re (dC rE + _) re (dr r%i: + _) re (eduP2 r%i: + _) re (eqP2 r%i: + _) re (enP2 r%i: + _) re (exP2 r%i: + referend rEf@r'End + re (fug rE + re (gen ri: + re (gener %ri: + re (gion ri: + regim rEdZIm + re (gist rE + _) re (i@P2 r,i: + _) rele (g rElI2 + rele (nt rI2lE + rele (v rElI + reli (a rI2laI + regu (l rEgju: + _) re (cent ri: + re (act rI2 + rement rIm@nt + _) re (nd rE + _) reper (t rEp3 + repe (tit rEp@ + repe (titiv rI2pE + re (pli rE + re (prim rE + re (pt rE + re (sidue rE + res (ign rI2z + rese (l ri:sE + re (solu rE + re (son rE + re (stl rE + res (ult rI2z + re (tail ri: + re (tic rE + re (tina rE + retro (P5 r,EtroU // prefix + reve (nA rEv@ + re (veren rE + re (volu rE + rea (l ri@ +?3 rea (l ri: + rea (lit rI2a + rea (lloc rI2a + rea (lm rE + rea (lte rI20 + re (ment r@ + represent rEprI2z'Ent + resi (den rEzI2 + _) re (unP2 r,i: + +.group s + _) s (_ Es + D_) s (_ z + D_') s (_ z + 6_) s (_ I2z + 16_) s (_ z + s s + s (s + s (sh s + _) sch S + _) sch (e sk + _) sch (ism sk + _) schiz skIts + sch (o sk + sch (C S + sch (_ S + _) sch (ed S + _) sch (il S + _) scar (A ske@ + _) scar (a skar + scarc ske@s + sc (i s + s (cious + sc (ept sk + mu) sc (l s + m) s (i z + a) s (el_ z + m) s (y z + a) s (e s + pha) s (e z + la) s (e z + ma) s (e z + pa) s (e z + ra) s (e z + _ea) s (e z + plea) s (e z + pea) s (e z + tea) s (e z + _re) s (o z + ai) s (e z + ui) se (_ z + _Coi) s (e z + o) se (_ z + do) se (_ z + oo) se (_ s + choo) se z + to) se (_ z + au) se (_ z + fu) se (_ z + w) se z + Co) s (Er z + Co) s (En z + r) s (d z + secur sI2kjU@ + self (_ 'sElf + selves (_ 'sElvz + sh S + _mi) s (h s + @) s (head_ s + @) s (hill_ s + @) s (hous s + _) she' %Si: + &) ship (_$4 SIp + &) ships (_$5 SIps + &) shire (_$5 S@ + sia (_ =Zi@ + ssia (_ S@ + sian (_ =Zi@n + ssian (_ S@n + ea) sib z@b + &) sib s@b + ea) s (ie z + ea) s (il z + _) sid (e# saId + C) sion S@n + A) sion Z@n + a) sin (_ s@n + ai) sin (_ z@n + u) sin (_ z@n + _) soma (li s@mA: + pri) s (o z + @) some (_S4 sVm + o) some (_S4 soUm + ssion S@n + ssion (_ =S@n + 1_) st (_ + _) st (_ s@nt + stein StaIn + ti) ssue Su: + _) s (u s + ssure S3 + a) ssur SU@ + a) ssure S'U@ + ea) s (y z + s (_ z + @) s (_$1 z + _BA) s (_ s + &se) s (_$1 I2z + &sse) s (_$2 I2z + ss (_ s + sse (_ s + c) s (_ s + @ce) s (_$1 Iz + f) s (_ s + ng) s (_$1 z + k) s (_ s + n) s (_$1 z + p) s (_ s + th) s (_ s + t) s (_$1 s + te) s (_$1 s + &c) s (_$1 s + &f) s (_$1 s + &k) s (_$1 s + &p) s (_$1 s + &pe) s (_$1 s + &th) s (_$1 s + &t) s (_$1 s + plu) s s + _ha) s (_ z + +.group su + _ca) su Zu: + _) sus (A su:z + _) su (b sV + su (bdue s%V + su (bmerg s@ + su (bmi s@ + su (bscrib s@ + su (bser s%V + su (bsis s%V + su (btra s%V + su (burba s@ + su (bv s@ + substa (nt s@bsta + su (ccA s@ + su (ffic s@ + sugar SUg3 + re) su (mA zju: + re) sumab zju:m@b + su (ppl s@ + su (pple sV + su (pplic sV + su (ppor s@ + su (ppres s@ + _) sur s3: +?5 _) sur sVR + _) sure SU@ + sur (an SU@ + sur (m s3 + sur (pa s3 + sur (pr s3 + sur (r s3 + sur (rey sV + sur (v s3 + sur s3: +?5 sur sVR + &) sure (_ Z3 + ea) sur Z3 + en) sur SU@ + in) sur (A SU@ + un) sur (p s3 + o) sur Z3 + _) susc (e s@s + _) sus (p s@s + _) sus (tai s@s + +.group t + t t + t) t + tch tS + _) tele tElI2 + r) tga (g gI + &) tia (_ S@ + @) t (ia S + pi) t (ia t + is) t (ian+ t + &) tian (_ S@n + _) tian tjan + &) tial S@L + &) ti (ali SI + &) tien S@n + &) tience S@ns + &) tion S=@n + &s) tion tS@n + tion (al S=@-n + &) tious S=@s + for) tuna (t tS@n@ + s) t (l + to (morr t@ + @) town (_$4 taUn + _) tri (A traI + _) trie traI + _) tri (CA traI + _) tri (Cy traI + _) tri (bu trI + _) tri (g trI + _) tri (ni trI + _) tri (vi trI + tsch tS + _) two tu: + @) tur (A tS@r + @) tur (al_ tS=@r + @) tur (y tS@r + @) tur (_ tS3 + ture (_ tS3 + +.group th + th T + D0_) th (_ @T + 10_) th (_ T + 00_) th (_ T + th (and th + th (ood th + th (ouse th + th (ill th + ee) thing DI2N + the (_ D + ou) thed (_ Dd + th (en_ D + g) th (en_ T + thai taI + theless D@l'Es + theque tEk + ther (_ D3 + th (erC D + there (_ D3 // thering + th (est D + n) th (er T + therap TEr@p + th (erm T + ca) th (eri T + _e) th (er T + th (ern_ D + th (ith D + th (ole th + _) th (om@ t + ph) th T + boo) th D + smoo) th D + wor) th (_ T + r) th (y D + or) th (i D + r) th (ier D + ear) th (y T + _) there De@ + _) them D%Em + _) the (mA Ti: + +.group u + u V + u (_ ju: + r) u (_ u: + l) u (_ u: + h) u (_ =u: + u (ga_ 'u: + u (ki_ 'u: + u (ma_ 'u: + u (mo_ 'u: + u (CA ju: + u (CeCo_ ju: + l) u (CA u: + _l) u (a u: + j) u (CA u: + &j) u (CA u: + s) u (CA u: + s) u (CA_ 'u: + s) u (le_ ju: + w) u (CA u: + w) u (chA u: + vol) u (m ju: + r) u (CA u: + rh) u (CA u: + u (CiA 'ju: + r) u (CiA 'u: + man) u ju: + _sol) u (C ju: + u (a ju: + r) u (aC+ u: + ua (_ wA: + @g) ua (ge wI + uary (_ ju:@rI2 + r) uary (_ u:rI2 + g) ua (rA a + g) uar (d A@ + _g) ua wA: + s) ua (d weI + s) uag weIdZ + s) ua (s weI + ual (_ ju:@L + l) u (bri u: + lett) u (ce I + _l) u (c u: + l) u (ck V + ucul VkjUl + n) ucle ju:klI + n) uclear ju:kli@ + @) u (ctive 'V + u (guC V + f) u (gal 'ju: + pl) ug Vg + ug (er_ u:g + s) ugge (st @dZE + mp) ug (n ju: + uh (C u: + u (i ju: + s) u (i u: + r) u (i u: + g) u (i w + &f) ul (_ @L + &f) ully (_ @lI2 + f) ul (fil %Vl + u (le_ ju: + u (lA jU + _) u (lA u: + @) u (la_ =jU + @) u (late =jU + @) u (lar =jU + @) u (lum =jU + ll) u (l ju: + j) u (li u: + b) ull Ul + b) ully UlI2 + b) ul (r Ul + b) ul (w Ul + _f) ully UlI2 + f) ull Ul + p) ull Ul + u (ly u: + d) u (ly ju: + u (lul V + h) u (man ju: + u (me ju: + r) ument @m@nt + fl) uor u:3 + u (o ju: + @) uous =ju:@s + uoy OI + _) us (_ Vz + _) us (A ju:z + &) us (_ @s + usua (l ju:Zu: + u (sh V + b) u (sh U + c) u (sh U + p) u (sh U + usion 'ju:Z@n + r) usion 'u:Z@n + l) usion 'u:Z@n + p) u (ss U + b) us (iA Iz + usurp ju:z'3:p +?5 usurp ju:z'VRp + b) us (y Iz + b) usiness Izn@s + b) u (tch U + r) u (th u: + _) u (til ju: + u (tion 'ju: + n) u (tri ju: + u (ty ju: + min) u (te I + vac) uu ju: + uu (m ju:@ + l) uxur VgZu:3 + uy aI + uy (A_ 'u:j + +.group ue + ue ju: + uee ju:i: + l) ue u: + val) ue ju: + r) ue u: + _s) ue u: + _C) ue (l ju:@ + _CC) ue (l u:@ + ue (n ju:@ + uene (_ ju:i:n + ue (nd ju:'E + l) ue (n u:@ + l) ue (nti u:'E + uer (t we@ + ue (t ju:@ + +.group ui + b) ui (l I + sc) ui (t I + g) ui (lC I + _g) ui (le aI + @) ui (ty 'ju:I + g) ui (dA aI + g) uide (l aId + beg) ui (l aI + _g) ui (n I + g) ui (se aI + sl) ui u: + fl) ui (d u:I + dr) ui (d u:I + c) uisine wIzi:n + circ) ui (t I + g) ui (ta I2 + j) ui (c u: + uir (_ jU@ + n) ui (s ju: + r) uis (e u:z + r) ui (t u: + gr) ui (t u:I2 + jes) ui (t ju:I2 + s) ui (t u: + +.group un + _) un (@P2 %Vn // prefix + _) un (AP2 %Vn // prefix + _) unn %Vnn + _) un (u %Vn + @) un (al 'ju:n + une (_ ju:n + j) une (_ u:n + l) une (_ u:n + r) une (_ u:n + _) una (b ,Vna2 + t) un (e ju:n + _) un (if ju:n + un (ani %ju:n + _) under (@P5 ,Vnd3 // prefix + _) un (deP2 ,Vn + _) un (enP2 ,Vn + _) un (exP2 ,Vn + _) un (ic ju:n + _) un (imP2 ,Vn + _) unin ,VnI2n + un (inj %Vn + _) un (il ,ju:n + _) un (io ju:n + _) un (iq %ju:n + _) un (is ju:n + _) un (it ju:n + _) un (iv ju:n + _) un (ix ju:n + un (i ju:n + p) un (ish Vn + r) un (i u:n + un (A Vn + un (er ju:n + _) un (reC@P2 ,Vn + un (regi %Vn + +.group up + _) up (b %Vp + _) up (c %Vp + _) up (d %Vp + _) up (g %Vp + _) up (h %Vp + _) up (se %Vp + _) up (st %Vp + occ) upy jUpaI + occ) up jUp + scr) up u:p + s) uper u:p3 + s) uperi (o u:p'i@rI + upon Vp0n + s) up (re %u:p + +.group ur + ur (_ 3: +?5 ur (_ VR + &g) ur (_ 3 + &h) ur (_ 3 + &m) ur (_ 3 + &p) ur (_ U@ + sp) ur (_ 3: +?5 sp) ur (_ VR + ur (B 3: +?5 ur (B VR + _) ur (A jU@ + urr (_ 3: +?5 urr (_ VR + C) ur (A jUr + l) ur (A+ U@ + t) ur (A j@r + r) ur (A+ U@r + b) ur (y Er + b) urg (er 3:g +?5 b) urg (er VRg + b) ur (i Er + b) urr (o Vr + f) urr (y 3: +?5 f) urr (y VR + _f) ur (A jU@ + _f) ur (y jU@ + @) ur (y jUr + j) ur (i U@ + _j) ur (y U@ + j) ur (y @r + @) ura (t jUreI + @) ur (ation jUr + ure (_ jU@ + ur (ed_ jU@ + g) ured (_ @d + b) ur (e ju:@r + g) ure (_ 3 + nj) ure (_ 3 + il) ure (_ i@ + en) ure (_ j@ + r) ure (_ i@ + &s) ure (_ j@ + icat) ure (_ jU@ + sat) ur (d 3 + iz) ure 3 + +.group v + v v + v (v + _) vehem vi@m + _) vi (brat v%aI + vivi (@ vIvI + viv (_ vaIv + +.group w + w w + w (w + C) w (_ w@ + wh w + wr r + C) we (_ =wI + were (w wi@ + th) west w'Est + we (w wi: + where we@ + what w0t + which wItS + who (_ hu: + who (d hu: + who (m hu: + who (s hu: + who' hu: + wh (ol h + m) w (ich_ + B) wing (_ wIN + @) wise (_$4 waIz + e) with (_ w'ID + with (C wI2D + with (A wI2D + with (e wID + s) wor (d o@ + ss) wor (d w3: +?5 ss) wor (d wVR + wor (th_ w3: +?5 wor (th_ wVR + l) w (y u: + s) w (ick + +.group x + _) x (C Eks + x ks + x) x (A + _) xy zaI + _) x z + xio (n kS@ + xious =kS@s + +.group y + y j + y (C_ I + y (CC I + C) y (abl I2 + y (y + y (C I + y (Be# aI + @C) y (Be# aI + ye (_ aI + _C) y (Ce aI + C) y (i I + y (iC_ j + sf) y (_ aI + Cf) y (_ I2 + %Af) y (_ I2 + _C) y aI + _C) y (ph aI + _C) y (st I + _CC) y aI + _CCC) y aI + CC) y (n_ I + Cr) y I2 + c) y (cl aI + c) y (clic_ aI + bic) y (cl I + ereb) y (_ aI + earb) y (_ aI + h) y (Cr aI + c) y (lin I + th) y (l_ aI + gl) y (ph I + k) y (l_ aI + n) y (l_ aI + t) y (l_ aI + y (lum aI + yang j'aN // chinese names + d) ynam aInam + @C) y (mAn_ I + d) y (nas I + w) y (n I + cr) y (CC I + gl) y (ce I + d) yse (n Is@ + f) y (_ aI + ff) y (_ I + &sk) y (_ =I2 + den) y (_ aI + bel) y (_ aI + &) y (_ I2 + y (_ aI + y (Cic_ 'I + y (Cical 'I + y (Cify 'I + _s) y I + @) y (ra_ 'aI + yse (+_ aIz + ysing (_ aIzI2N + ysed (_ aIzd + yzed (_ aIzd + &) ysis (_ =@sIs + yte (_ aIt + you' %ju: + yu ju: + yeo (C joU + y (er_ aI + C) yes (_ aIz + _) yes jEs + yeah jEh + @C) y (gen I + d) y (nas I + s) ynch Ink + t) ype aIp + t) y (pist aI + t) y (pic I + t) y (p_ aI + y (pal 'aI + h) ypocri (t Ip@krI + h) y (pocr I2 + t) y (rann I + ph) ys (i Iz + yr (_ @ + c) y (ni I + l) y (ri I + p) y (ra I + p) y (ri I + p) y (th aI + st) y (re aI + C) yx (_ Iks + t) yone (_ Iw'0n +?6 t) yone (_ Iw'Vn + t) ytwo (_ It'u: + t) yfour (_ If'o@ + t) yfive (_ If'aIv + t) yseven (_ Is'Ev@n + t) yeight (_ I'eIt + +.group z + z z + z (z + @) zales (_ z'A:lEs + zes (_ zI2z + zh Z + zu (_ =zu: + zue zw'eI + zure Z3 + zo (olo zu: + +.group E + E // silent 'e' , ignore by default + E (B_ @ + E (BC_ @ + E (BCe_ @ + E (Cia 'i: + Ea (_ =i@ + @@) Ed (_$2vei d + &C) Ed (_$2vei d + &c) Ed (_$2vei t + &d) Ed (_$2vei Id + &ch) Ed (_$2vei t + &k) Ed (_$2vei t + &@@om) Ed (_$2v d + &p) Ed (_$2vei t + &t) Ed (_$2vei Id + ur) Ed (_$1vi d + &x) Ed (_$2v t + y) Ed (_ d + Edly (_$4e IdlI2 + E (dia_ i: + E (dic_ i: + nak) E (d I + Ee (d i: + EE (_ i: + Ee (_ 'i: + Eer (_ 'i@ + Ei (n_ i: + Ei (_ aI + El (_ @L + Ele (_ @L + Ell (+ @L + Ella (_ 'El@ + Em (_ @m + @) E (mber 'E + Eme (_ i:m + Ensk (_ 'Ensk + En (_ @n + En (atA @n + E (ndous E + Ener (_ _n@ + Ening (_ _nI2N + Ene (_ i:n + Ened (_ @nd + E (nt_ @ + E (ning E + E (nti 'E + E (ntu 'E + E (ntous 'E + E (o_ I2 + Eous (_ =j@s + Eri (A 'i@rI2 + Er (ie_ @r + Er (ic_ Er + Er (_ 3 + Er (C 3 + Ery (_ @rI2 + E (x_ E + &) Es (_$2e z + c) Es (_$2e I2z + c) E's (_$3e I2z + f) Es (_$2e s + g) Es (_$2e I2z + ch) Es (_$2e I2z + ph) Es (_$2e I2z + k) Es (_$2e s + p) Es (_$2e s + s) Es (_$2e I2z + s) E's (_$2e I2z + sh) Es (_$2e I2z + t) Es (_$2e s + x) Es (_$2 I2z + Cr) Es (_$2e @z + Ese (_ i:z + E (sia 'i: + Esque 'Esk + E (ss E + Ess (_ Es + E (tric E + Etta (_ 'Et@ + Ette (_ 'Et + E (tic_ E + Eus (_ I2@s + ob) Ey (_ eI + + +.group ' + 's (_$2 z + f) 's (_$2 s + p) 's (_$2 s + t) 's (_$2 s + k) 's (_$2 s + se) 's (_$2 I2z + s) 's (_$2 I2z + ce) 's (_$2 I2z + ch) 's (_$2 I2z + och) 's (_$2 s + sh) 's (_$2 I2z + x) 's (_$2 I2z + z) 's (_$2 I2z + 6_) 's (_ I2z + 16_) 's (_ z + 're (_$3 @ + 've (_$3 v + 'd (_$2 d + 'll (_$3 @L + + +.group 0xce +// $group (++ _^_EL + + α 'alf@_ + ά 'alf@_ + β b'i:t@_ + γ g'am@_ + δ d'Elt@_ + ε 'EpsIl0n_ + έ 'EpsIl0n_ + ζ z'i:t@_ + η 'i:t@_ + ή 'i:t@_ + θ T'i:t@_ + ι aI'oUt@_ + ί aI'oUt@_ + κ k'ap@_ + λ l'amd@_ + μ m'ju:_ + ν n'ju:_ + ξ ks'aI_ + ο oUm'aIkr0n_ + +.group 0xcf +// $group (++ _^_EL + + π p'aI_ + ρ r'oU_ + σ s'Igm@_ + ς s'Igm@_ + τ t'aU_ + υ 'UpsIl0n_ + ύ 'UpsIl0n_ + φ f'aI_ + χ tS'aI_ + ψ ps'aI_ + ω 'oUmIg@_ + ώ 'oUmIg@_ + ό oUm'aIkr0n_ + + +// default group for "non of the above" + +.group + +// non-ascii characters with specified pronunciations + é eI + _) é I2 + ä E + ë E + ï i: + ö 3: +?5 ö VR + ü u: + ç s + ß s + _) ß (_ b'i:t@_ + č tS + š S + ş S + ž Z + + + \\ bakstroUk + / stroUk + ' + £ paUnd + ! _:Ekskl@meIS@n_: + !) ! + ? (? kwEstS@nmA@ks + ?) ? + : koUl0n + $ d0l@ + % p3sEnt +?5 % pVRs'Ent + @ at_: + & _!%and + != n0ti:kw@Lz + >= greIt@O@i:kw@L + <= lEsO@i:kw@L + + + __) - (_D m'aIn@s + A_) - (_D _ + C_) - (_D _ + --) - + + + plVs + _) ++ (_ plVspl'Vs + \+\+\+) + // ignore + after the first 3 + + # (\#\# + \#\#) # (\# + \#\#) # (_ _:: + + . d0t + D) . (D+ ,pOInt + . (. _: + \.) . + + = __i:kw@Lz_ + = (== + =) = (= + ==) = (_ _:: + + * ast@rIsk + *) * (* + ** + **) * (_ _:: + % (%% + %) % (% + %%) % (_ _:: + +// extra symbols + ¥ jEn + § sEkS@n + ¶ par@graf + ¶¶ par@grafs + ¤ kVr@nsI2saIn + © k0pI2raIt + ° dI2gri:z + − maIn@s + ± plVs@maIn@s + µ maIkroU + ¼ a2kwO@t3 + ½ a2hA:f + ¾ Tri:kwO@t3 + × taImz + ÷ dI2vaIdbaI + € jU@roUz + ♯ SA@p + ♭ flat + ff f + fi fI + fl fl diff --git a/dictsource/eo_list b/dictsource/eo_list new file mode 100644 index 00000000..d62ab732 --- /dev/null +++ b/dictsource/eo_list @@ -0,0 +1,190 @@ +// This file is UTF-8 encoded + + +// Numbers +_0 nul +_1 'unu +_2 d'u +_3 tr'i +_4 kv'ar +_5 kv'in +_6 s'es +_7 s'ep +_8 'ok +_9 n'aU +_1X d'ek +_2X d'udek +_3X tr'idek +_4X kv'ardek +_5X kv'indek +_6X s'esdek +_7X s'epdek +_8X 'okdek +_9X n'aUdek +_1C ts'ent +_0C tsent +_1M1 m'il_ +_0M1 m,il_ +_0M2 mili'ono +_0M3 mili'ardo +_0M4 duili'ono +_dpt komo_ + +_. punkto + +t.e t'e,e + + +// includes both accented characters and ascii digraph alternatives (cx, gx, ux, etc) + +l' la +la %la +ne $u+ // negative +cxu $u // interogative particle +cxi $u +ĉu $u // cxi interogative particle +ĉi $u // cxi interogative particle +ia $u // any + +// prepositions +de $u+ $brk +(de la) dela $u $brk + +antaux $u+ $pause +antaŭ $u+ $pause +apud $u+ $pause +ol $u+ $brk +ĉe $u+ $pause +da $u+ +al $u+ $brk +(al la) alla $u $brk +el $u+ $pause +(el la) ella $u $pause +en $u+ $brk +(en la) enla $u $brk +ĝis $u+ $pause +inter $u+ $pause +je $u $brk + +kun $u+ $pause +laŭ $u+ $brk +laux $u+ $brk +per $u+ $brk +preter $u+ $brk +pri $u+ $pause +por $u+ $pause +post $u+ $pause +pro $u+ $pause +sen $u+ $pause +sub $u+ $pause +sur $u+ $pause + +dum $u $pause +tra $u $pause + +// misc adverbs etc +eĉ $brk +(pli ol) pliol + +// pronouns +mi $u +ci $u +li $u +sxi $u +ŝi $u +gxi $u +ĝi $u +ni $u +vi $u +ili $u +oni $u +si $u + +mia $u+ +cia $u+ +lia $u+ +sxia $u+ +ŝia $u+ +gxia $u+ +ĝia $u+ +nia $u+ +via $u+ +ilia $u+ +sia $u+ + +miaj $u+ +ciaj $u+ +liaj $u+ +sxiaj $u+ +ŝiaj $u+ +gxiaj $u+ +ĝiaj $u+ +niaj $u+ +viaj $u+ +iliaj $u+ +siaj $u+ + +// aux verbs +esti $u+ +estas $u+ +estis $u+ +estos $u+ +estus $u+ + +povas $u+ // can +povis $u+ +povos $u+ +povus $u+ + +devas $u+ // must +devis $u+ +devos $u+ +devus $u+ + +iras $u+ // go +iris $u+ +iros $u+ +irus $u+ + +metas $u+ // put +metis $u+ +metos $u+ +metus $u+ + +havi $u+ +havas $u+ +havis $u+ +havos $u+ + +eble $u // may + +kia $u+ $pause +kie $u+ $pause +kiel $u+ $pause +kio $u+ $pause +kiu $u+ $pause +kiuj $u+ $pause +kiun $pause +kiunj $pause +kiam $u+ $pause + +tio $u+ +tiam $brk + + +// conjunctions +ke $u $pause // that (conj) +aux $u $pause +aŭ $u $pause // aux +cxar $u $pause +ĉar $u $pause +kaj $u $pause +sed $u $pause +nek $u $pause +se $u $pause +ju $u $brk +des $u $pause +do $pause // therefore, so, then +ekde $pause // since + + diff --git a/dictsource/eo_rules b/dictsource/eo_rules new file mode 100644 index 00000000..1b3af2e4 --- /dev/null +++ b/dictsource/eo_rules @@ -0,0 +1,212 @@ +// translation rules +// This file is UTF-8 encoded + +// includes both accented characters and ascii digraph alternatives (cx, gx, ux, etc) + +.group a + _) a(_ a + a a + aj aI + a (jx a + aux aU + aŭ aU + D_-_) a (_ %a //'a' after a number + D_-_) an (_ %an //'an' after a number + D_) a (_ %a //'a' after a number + D_) an (_ %an //'an' after a number + +.group b + _) b(_ bo + b b + +.group c + _) c(_ tso + _) ch(_ tSo + _) cx(_ tSo + c ts + ch (K tS // foreign words + K) ch tS // foreign words + cx tS + + +.group d + _) d(_ do + d d + +.group e + _) e(_ e + e e + ej eI + e (jx e + eux eU + eŭ eU + +.group f + _) f(_ fo + f f + +.group g + _) g(_ go + _) gx(_ dZo + g g + gh (K dZ + gx dZ + +.group h + _) h(_ ho + _) hx(_ xo + h h + hh x + hx x + + +.group i + _) i(_ i + i i + +.group j + _) j(_ jo + _) jx(_ Zo + j j + jh (C Z + jx Z + +.group k + _) k(_ ko + k k + +.group l + _) l(_ lo + l l + ll (_ l + +.group m + _) m(_ mo + m m + +.group n + _) n(_ no + n n + n (_S1 n + +.group o + _) o(_ o + o o + oj OI + o (jx o + +.group p + _) p(_ po + p p + ph (K f // foreign words + K) ph f // foreign words + +.group q + _) q(_ kwo + q k + qu kv + +.group r + _) r(_ ro + r r + rr @-*r + A) r (A * +// A) r (A @-* + C) r (A @-* + +.group s + _) s(_ so + _) sh(_ So + _) sx(_ So + s s + sx S + sh (K S // foreign words + K) sh S // foreign words + + +.group t + _) t(_ to + t t + th (K T // foreign words + K) th T // foreign words + +.group u + _) u(_ u + _) ux(_ wo + u u + uj uI + u (jx u + ux w + + +.group v + _) v(_ vo + v v + +.group w + _) w(_ du'oblav,o + w w + K) wh w // foreign words + +.group x + _) x(_ ikso + x ks + +.group y + _) y(_ ipsilono + y j + K) y (K i + + +.group z + _) z(_ zo + z z + + +.group + _) ĉ (_ tSo + ĉ tS + + _) ĝ (_ dZo + ĝ dZ + + _) ĥ (_ xo + ĥ x + + _) ĵ (_ Zo + ĵ Z + + _) ŝ (_ So + ŝ S + + _) ŭ (_ wo + ŭ w + + + = ,,egala, + \ malantaIstreko + / streko + ' + + plus + _) ++ (_ plusplus + + . punkto + . (. _: + \.) . + + + . (D _:k'omo_ + * asterisko + pundo + (D _pundOI_: + ! ,ekkrio, + : dupunkto + - _ + - (_a + $ dolaro + $ (D _dolarOI_: + % protsento + @ po + & %kaI + + diff --git a/dictsource/es_list b/dictsource/es_list new file mode 100644 index 00000000..2e41dcb5 --- /dev/null +++ b/dictsource/es_list @@ -0,0 +1,290 @@ + +// This file in UTF8 encoded + +// Letters +// If a letter has a "word" pronunciation which is different from its +// "letter" name, then include the letter name here, with the letter +// prefixed by a _ character. +_a a +_o o +_y ,igr'iEQa + +_. punto + + +// numbers +_0 TE*o +_1 'uno +_2 d'os +_3 t@-*'es +_4 kw'at@-*o +_5 T'inko +_6 s'eIs +_7 sj'Ete +_8 'otSo +_9 nw'Eve +_1X dj'ET +_11 'onTe +_12 d'oTe +_13 t@-*'ETe +_14 kat'orTe +_15 k'inTe +_20 v'eInte +_2X v'eInt +_3X t@-*'eInta +_4X kwa*'Enta +_5X Tinkw'Enta +_6X sEs'Enta +_7X sEt'Enta +_8X otS'Enta +_9X nov'Enta +_0C T'ientos +_1C0 T'ien // exactly one hundred +_1C T'iento +_5C kinj'Entos +_0M1 m'il +_1M1 m'il // no '1' before thousand +_0M2 mil^'ones +_1M2 'unmil^'on +_0M4 _bil^'ones +_1M4 'unbil^'on +_0and i +_dpt koma + + + +// articles +el $u +los $u +la $u +las $u +lo $u +les $u + +un $u +una $u +unos $u +unas $u + +este $u+ // this +esta $u+ +estos $u+ +estas $u+ +esto $u+ + +ese $u+ // that +esa $u+ +esos $u+ +esas $u+ +eso $u+ + +aquel $u+ // that +aquella $u+ +aquellos $u+ +aquellas $u+ + + + +// pronouns +yo $u+ +tu $u+ +tú $u+ +usted $u+ +él $u+ +ella $u+ +nosotros $u+ +nosotras $u+ +vosotros $u+ +vosotras $u+ +as $u+ +ustedes $u+ +ellos $u+ +ellas $u+ +ud $u+ +uds $u+ + +me $u+ // reflexive pronouns +te $u+ +se $u+ +nos $u+ +os $u+ + + +// possessives +mi $u+ +mis $u+ +tu $u+ +tus $u+ +su $u+ +sus $u+ +nuestro $u+ +nuestros $u+ +nuestra $u+ +nuestras $u+ +vuestro $u+ +vuestros $u+ +vuestra $u+ +vuestras $u+ + +// prepositions +a $u $brk // at +al $u $brk +de $u // of,from +del $u +(de la) d,ela +en $u $brk +con $u $pause // with +por $u $pause // for,through,along,via +para $u $pause // for,in order,by +entre $u $pause +desde $pause // from,since +después $pause // after + +// conjunctions +y %i $pause // and +o $u $pause // or + +así $pause +aunque $u $pause // although +siquiera $pause +porque $pause // because + +// questions +que $u+ $pause // what +cuál $pause // which +cuáles $pause +cómo $pause // how + +// negative +no $u + +// auxillary verbs +ser $u +soy $u +eras $u +es $u +somos $u +sois $u +son $u + +fui $u +fuiste $u +fue $u +fuimos $u +fuisteis $u +fueron $u + +era $u +eras $u +éramos $u +erais $u +eran $u + +seré $u +serás $u +será $u +seremos $u +seréis $u +serán $u + +sería $u +serías $u +seríamos $u +seríais $u +serían $u + + +estar $u +estoy $u +estás $u +está $u +estamos $u +estáis $u +están $u + +estuve $u +estuviste $u +estuvo $u +estuvimos $u +estuvisteis $u +estuvieron $u + +estaba $u +estabas $u +estaba $u +estábamos $u +estabais $u +estaban $u + +estaré $u +estarás $u +estará $u +estaremos $u +estaréis $u +estarán $u + +estaría $u +estarías $u +estaríamos $u +estaríais $u +estarían $u + +haber $u +he $u +has $u +hay $u +hemos $u +habéis $u +han $u +ha $u // ?? + +hube $u +hubiste $u +hubo $u +hubimos $u +hubisteis $u +hubieron $u + +había $u +habías $u +habíamos $u +habíais $u +habían $u + +habré $u +habrás $u +habrá $u +habremos $u +habréis $u +habrán $u + +tener $u // to have +tengo $u +tienes $u +tiene $u +tenemos $u +tenéis $u +tienen $u + +hacer $u+ // to do/make +hago $u+ +haces $u+ +hace $u+ +hacemos $u+ +hacéis $u+ +hacen $u+ + + +// some common adjectives and adverbs +algún $u // some +algunos $u +alguna $u + + + + +// pronunciation exceptions + +méxico mExiko +mexicano mExikano + diff --git a/dictsource/es_rules b/dictsource/es_rules new file mode 100644 index 00000000..54748ae2 --- /dev/null +++ b/dictsource/es_rules @@ -0,0 +1,225 @@ +// translation rules +// This file is UTF-8 encoded + + +.group a + _) a (_ a + a a + ai aI + ay aI + ay (_ 'aI + + +.group b + _) b (_ be + b B + _) b b + m) b b + n) b b + + +.group c + _) c (_ Te + _) ch (_ tSe + c k + c (Y T // ce, ci + ch tS + + +.group d + _) d (_ de + d D + _) d d + m) d d + n) d d + + +.group e + _) e (_ e + e E + e (_ e + ei eI + ey eI + ey (_ 'eI + _) eu eU + + +.group f + _) f (_ 'Efe + f f + + +.group g + _) g (_ xe + g Q + _) g g + m) g g + n) g g + g (Y+ x // ge gi + + +.group h + _) h (_ 'atSe + h // silent + + +.group i + _) i (_ i + i i + i (A j + l) i (A %i + r) i (A %i + + +.group j + _) j (_ x'ota + j x + + +.group k + _) k (_ ka + k k + + +.group l + _) l (_ Ele + _) ll (_ Eje + l l + ll l^ + + +.group m + _) m (_ Eme + m m + + +.group n + _) n (_ Ene + n n + n (b m + n (v m + n (f m + n (p m +// n (g N // ?? +// n (k N // ?? + + +.group o + _) o (_ o + o o + oy oI + oy (_ 'oI + + +.group p + _) p (_ pe + p p + + +.group q + _) q (_ ku + q k + qu k + + +.group r + _) r (_ E*e + r r + _) r R + A) r (A * + C) r (A @-* + rr *R + + +.group s + _) s (_ Ese + s s + &) s (_S1 s + + +.group t + _) t (_ te + t t + + +.group u + _) u (_ u + u u + u (A w + l) u (A %u + r) u (A %u + + g) u (Y // gue gui + + +.group v + _) v (_ ve + v v + _) v v + m) v v + n) v v + + +.group w + _) w (_ d'oBle,u + w w + + +.group x + _) x (_ Ekis + x ks + A) x (A ks + x (_ =ks + + +.group y + _) y (_ ,ig@-*'iEQa + y i + y (A j + + +.group z + _) z (_ TEta + z T + + +.group + á ''a + é ''E + í ''i + ó ''o + ú ''u + ü u + ñ n^ + _)ñ (_ En^e + + $ d'olar + € eU*o + % porTj'Ento + & ampErs'ant + @ a*R'oBa + / b'a*Ra + © k,opi*R'aIt + + + m'as + _) ++ (_ masm'as + \+\+\+) + // ignore + after the first 3 + + # almoaD'il^a + \#) # + + __) - (_D m'Enos + A_) - (_D _ + C_) - (_D _ + --) - + + * astE*'isko + *) * (* + ** + **) * (_ _:: + + . punto + . (. _: + \.) . + + , (D koma diff --git a/dictsource/fi_list b/dictsource/fi_list new file mode 100755 index 00000000..183d302e --- /dev/null +++ b/dictsource/fi_list @@ -0,0 +1,268 @@ + +// This file in UTF8 encoded + +// Letters +// If a letter has a "word" pronunciation which is different from its +// "letter" name, then include the letter name here, with the letter +// prefixed by a _ character. + +å r'uotsalainen'o: +š h'at:u&s +ž h'at:uts,et + +_. piste +_! hu:tomerk:i +_" lainaus +_# rist:o +_$ dollarin +_% prosent:i +_& etmerk:i +_' heit:o + +// numbers +_0 n'olla +_1 'yksi +_2 k'aksi +_3 k'olme +_4 n'elj& +_5 v'i:si +_6 k'u:si +_7 s'eitsem&n +_8 k'ahdeksan +_9 'yhdeks&m +_10 k'ymmenen +_11 'yksitoista +_12 k'aksitoista +_13 k'olmetoista +_14 n'elj&toista +_15 v'i:sitoista +_16 k'u:sitoista +_17 s'eitsem&nt,oista +_18 k'ahdeksant,oista +_19 'yhdeks&nt,oista +_2X k'aksikymment& +_3X k'olmekymment& +_4X n'elj&kymment& +_5X v'i:sikymment& +_6X k'u:sikymment& +_7X s'eitsem&nk,ymment& +_8X k'ahdeksank,ymment& +_9X 'yhdeks&mk,ymment& +_0C s'ata:_ +_1C s'ata +_0M1 t'uhata: +_1M1 t'uhat // no '1' before thousand +_0M2 m'iljo:na: +_1M2 m'iljo:na +_0M3 m'iljardi +_1M3 m'iljardi +_0M4 b'iljo:na: +_1M4 b'iljo:na +_dpt pilk:u // comma + + +// articles + + +// pronouns +minä $u +sinä $u +hän $u +se $u +me $u +te $u +he $u +ne $u + +itse $u $double // reflexive pronoun + +tämä $u+ // this +tämän $u+ +tätä $u+ +tässä $u+ +tästä $u+ +tähän $u+ +tällä $u+ +tältä $u+ +tälle $u+ +tänä $u+ + +tuo $u+ // that +tuon $u+ +tuota $u+ +tuossa $u+ +tuosta $u+ +tuohon $u+ +tuolla $u+ +tuolta $u+ +tuolle $u+ +tuona $u+ + +nämä $u+ // these +näiden $u+ +näitten $u+ +näitä $u+ +näissä $u+ +näistä $u+ +näihin $u+ +näillä $u+ +näiltä $u+ +näille $u+ +näinä $u+ + +nuo $u+ // those +noiden $u+ +noitten $u+ +noissa $u+ +noista $u+ +noihin $u+ +noilla $u+ +noilta $u+ +noille $u+ +noina $u+ + +joka $u+ +jonka $u+ +jota $u+ +jossa $u+ +josta $u+ +johon $u+ +jolla $u+ +jolle $u+ +jolta $u+ +jona $u+ + +jotka $u+ +joiden $u+ +joita $u+ +joissa $u+ +joista $u+ +joihin $u+ +joilla $u+ +joilta $u+ +joille $u+ +joina $u+ + + +// possessives + +// prepositions + +// conjunctions +ja $u $pause // and +entä $u $pause // and +tai $u $pause // or +vai $u $pause +mutta $u $pause // but + +// negative + +en $u +et $u +ei $u // not +emme $u +ette $u +eivät $u + +// questions + + +// auxillary verbs +olla $u // to be +olen $u +olet $u +on $u +olemme $u +olette $u +ovat $u + +ole $u $double +olleet $u +ollut $u +olin $u +olit $u +oli $u +olimme $u +olitte $u +olivat $u +olisin $u +olisit $u +olisi $u +olisimme $u +olisitte $u +olisivat $u + +lienen $u +lienet $u +lienee $u +lienemme $u +lienette $u +lienevät $u +liene $u +lienneet $u + + +// some common adjectives and adverbs +vähän $u // some + +// words that cause doubling +kiinni $double +luo $double +taa $double +terve $double +tuore $double + +aihe $double +aste $double +kone $double +laite $double +lause $double +luode $double +näyte $double +oire $double +puhe $double +purje $double +tunne $double +vene $double +virhe $double + +aja $double +auta $double +mene $double +ota $double +pue $double +pure $double +syö $double +tule $double + +// Pronunciation exceptions + +ok oo_,ko: +// ok _^_EN // Translates to english o'kay. +okay okei + +// Jogurtti (also: jugurtti or jukurtti) +yoghurt jogurtti +yogurt jogurtti + + +// Abbreviations + +abc 'a:,be:,se: +os o:&s: $dot +ad a:de: $dot // anno Domini, Herran vuonna +ca 'se:a: $dot // circa +em e:,&m $dot +ekr 'e:,ko:,&r $dot // ennen Kristuksen syntymää +etc et_setera $dot // et cetera, ym., jne. +ym ynn&_mu:ta $dot // ynnä muuta (etc) +eg esimerkiksi $dot // exempli gratia, esimerkiksi +jne 'ji,&n,e: $dot // ja niin edelleen +(à la) 'ala $dot // jonka mukaan +ky ko:y: $dot // kommandiittiyhtiö +oy o:y: // osakeyhtiö +nro numero $dot + + + + diff --git a/dictsource/fi_rules b/dictsource/fi_rules new file mode 100755 index 00000000..aeafad0d --- /dev/null +++ b/dictsource/fi_rules @@ -0,0 +1,247 @@ +// Finnish translation rules +// This file is UTF-8 encoded + + +.group a + _) a (_ a: + a a + aa a: + ai ai + au au + + &) a (lla_ %a + + _austr) a (l a: // double the middle a in australia and its inflections. + + +.group ä + _) ä (_ &: + ä & + ää &: + äi &i + äy &y + + &) ä (lla_ %& + + +.group b + _) b (_ be: + b b + bb b: + + +.group c + _) c (_ se: + c k + c (i s + c (e s // Pronounce c as s. Mostly foreign words such as celcius, center, cervantes, cezanne. + cc k: // Utter cc as k. This includes rebecca, accord, puccini etc. + + city siti // Pronounce foreign word city as siti. Include all inflections and compound words. + // eg. city, citystä, intercity. + + +.group d + _) d (_ de: + d d + dd d: + + +.group e + _) e (_ e: + e e + ee e: + ei ei + eu eu + ey ey + + &) e(lla_ %e + &) e(llä_ %e + +.group f + _) f (_ &f + f f + + +.group g + _) g (_ ge: + g g + gg g: + + +.group h + _) h (_ ho: + h h + + +.group i + _) i (_ i: + i i + ii i: + iu iu + ie ie + iy iy + + // iä ii& // Improve the i in iä words. Eg. ryhmiä (ryhmä), äitiä. + // ia iia // Improve the i in ia words. Eg. mattia, lattia. + + &) i (lla_ %i + + +.group j + _) j (_ ji: + j j + + +.group k + _) k (_ ko: + k k + kk k: + + +.group l + _) l (_ &l + l l + + @) lle (_ lle_X1 // double the initial consonant of the next word + + +.group m + _) m (_ &m + m m + + _sydä) m (A m: // double the m in sydämelinnen + + +.group n + _) n (_ &n + n n + ng N: + ng (_ N + n (p m + n (_p m + n (k N + n (_k N + + @) nne (_ nne_X1 // double the initial consonant of the next word + + + +.group o + _) o (_ o: + o o + oo o: + oi oi + ou ou + + symb) o (l oo // double the o in symboli. Include inflections and compound words. + + + +.group ö + _) ö (_ Y: + ö Y + öö Y: + öi Yi + öy Yy + + + +.group p + _) p (_ pe: + p p + pp p: + + _ole) p (a p: // double the p in olepa, olepahan. + _ota) p (a p: // double the p in otapa, otapahan. + + kam) p (anj p: // double the p in kampanja. Include inflections and compound words. + + sam) p (oo p: // double the p in sampoo. Include inflections and compound words. + sham) p (o p: // double the p in shampo. Include inflections and compound words. + + +.group q + _) q (_ ku: + q k + qq k: + + +.group r + _) r (_ &r + r r + A) r (A * + C) r (A @-* + rr *r + + +.group s + _) s (_ &s + s s + ss ss2 // [s2] is a continuation for [s] + K) sh S + + @) sti (_ sti_X1 // double the initial consonant of the next word + + +.group t + _) t (_ te: + t t + tt t: + + @) tse (_ tse_X1 // double the initial consonant of the next word + + +.group u + _) u (_ u: + u u + uu u: + ui ui + uo uo + + +.group v + _) v (_ ve: + v v + + +.group w + _) w (_ k'aksoisv,e: + w v + + +.group x + _) x (_ &ks + x ks + xx k:s + + +.group y + _) y (_ y: + y y + yy y: + yi yi + yö yY + + +.group z + _) z (_ tset + z ts + zz t:s + K) zh Z + + pi) zza tsa // Pronounce pizza as pitsa. Include inflections and compound words. + + +.group 9 + +.group + å o + å o: + š S + ž Z + + € euroa + $ dollarin + % prosent:i + * asteriski diff --git a/dictsource/fr_list b/dictsource/fr_list new file mode 100755 index 00000000..e9a16fd7 --- /dev/null +++ b/dictsource/fr_list @@ -0,0 +1,572 @@ + +// This file in UTF8 encoded + +// 2006-11-18 Gilles Casse +// +// * Numbers, a few abbreviations and exceptions. +// + + +// Letters +// If a letter has a "word" pronunciation which is different from its +// "letter" name, then include the letter name here, with the letter +// prefixed by a _ character. + +_à a:aksA~grav +â a:aksA~sirkO~flEks +ä a:trema +ç sesedij +ë @:trema +é @:aksA~Egy +è @:aksA~grav +ê @:aksA~sirkO~flEks +ï i:trema +ë @:trema +ñ Entilde +ô o:aksA~sirkO~flEks +ö o:trema +ù u:aksA~grav +û u:aksA~sirkO~flEks +ü u:trema +_y i:gr'Ek + + + +// character names + +//_cap k,ap@-t@L +_?A lEt@ +_?? sE~b'OL + +! Eksklamassj'O~ +_" gijm'E +_# dj'Ez +_$ dOl'ar +_% purs'A~ +_& e +_' apOstr'Of +_( 'uvr@-parA~t'Ez +_) f'Erm parA~t'Ez +_* astErisk: +_+ plys +_, virg'yl +_- tir'E +_. pw'E~ +_/ sl'aS +_: d'Ypw'E~ +_; pw'E~virg'yl +_< E~ferj'Wr +_= eg'al +_> syperj'Wr +_? kEstj'O~ +_@ at +_[ uvr@-_kroS'E +_\ b'aksl'aS +_] f'Erm_kroS'E +_^ sirkOnfl'Eks +__ sulin^'e +_` aks'A~_gr'av +_{ uvr_akOl'ad +_| b'ar +_} f'Erm_akOl'ad +_~ tild'e +_¢ sEnt +_¥ i;'En +_£ l'ivr +_° d@gr'e +_± pl'yz_'u_mw'E~ +_× myltip@-lj'e_p'ar +_÷ diviz'e_p'ar +_¼ W~_k'ar +_½ W~_d@m'i +_¾ trw'a k'ar +_© _^_k'0pIr,aIt_^_ +_® r@Zistr'@d_m'ark + + + +// numeric + +_0 zer'o +_1 W~ +_2 d'Y +_3 trw'a +_4 k'atr +_5 s'E~c +_6 s'is +six siz2 +_7 s'Et +_8 'w^it +_9 n'@f +_10 d'is +dix diz2 +_11 O~z +_12 d'uz +_13 tr'Ez +_14 kat'Orz +_15 k'E~z +_16 s'Ez +_17 d'is:'Et +_18 d'is:'w^it +_19 d'is:n'@f +_20 v'E~ +_21 v'E~te:E~ +_22 v'E~td'Y +_23 v'E~t:trw'a +_24 v'E~tk'atr +_25 v'E~ts'E~c +_26 v'E~ts'is +_27 v'E~ts'Et +_28 v'E~tw^it +_29 v'E~tn'@f +_3X tr'A~t +_31 tr'A~te:E~ +_4X kar'A~t +_41 kar'A~te:E~ +_5X sE~k'A~t +_51 sE~k'A~te:E~ +_6X swas'A~t +_61 swas'A~te:E~ +_7X swas'A~t:d'is +_71 swas'A~te:O~z +_72 swas'A~t:d'uz +_73 swas'A~t:tr'Ez +_74 swas'A~t:kat'Orz +_75 swas'A~t:k'E~z +_76 swas'A~t:s'Ez +_77 swas'A~t:d'is:'Et +_78 swas'A~t:d'is:'w^it +_79 swas'A~t:d'is:n'@f +_8X k'atr@v'E~ +_80 k'atr@v'E~z2 +_9X k'atr@v'E~d'is +_91 k'atr@v'E~:O~z +_92 k'atr@v'E~:d'uz +_93 k'atr@v'E~:tr'Ez +_94 k'atr@v'E~:kat'Orz +_95 k'atr@v'E~:k'E~z +_96 k'atr@v'E~:s'Ez +_97 k'atr@v'E~:d'is:'Et +_98 k'atr@v'E~:d'is:'w^it +_99 k'atr@v'E~:d'is:n'@f +_0C s'A~ +_1C0 s'A~t2 +_0M1 m'il +_1M1 m'il +_0M2 milj'O~ +_0M3 milj'ar +_0and e +_dpt pw'E~ + + +// ABBREVIATIONS +//************** + +(http ://) aSt,et,ep'e +abc 'a b'e s'e +ac 'a s'e +api 'a p'e 'i +cio s'e'i;'o +ctrl kO~tr'ol +dept depart@m'A~ +etc etseter'a +hmm h@m +ibm 'i:b'e:'Em +ip 'i:p'e +kde kade@ +m. m@sj'Y +mbrola Em'bRola +mlle mad@mwaz'El +mme mad'am +mr m@sj'Y +p.s pOstkript'Om +ratp 'Er:'a:t'e:p'e +s.t.p s'il:t'@:pl'E +s.v.p s'il:v'u:pl'E +st s'E~ +ste s'E~t +stp s'il:t'@:pl'E +svp s'il:v'u:pl'E +url 'y:'Er:'El +usb 'y:'Es:'be +utf y:te:Ef +xfce iksEfse@ +xy 'iks:igr'Ek + +ii d'Y $abbrev // roman numerals +iii trw'a $abbrev +iv k'atr $abbrev + + +dr dOkt'Wr $dot $capital +prof $dot + + + +// numbers + +// articles +le $u $nounf +la $u $nounf +les lEz2 $u $nounf +?2 les lez2 $u $nounf +un $u $nounf +une $u $nounf + + +// conjonctions +et e $u $pause +ou $u $pause +car $u $pause +soit $u $pause +mais $u $pause +ou u $u $pause +donc $u $pause +or $u $pause +ni $u $pause +car $u $pause +cependant $u $pause +néanmoins $u $pause +toutefois $u $pause + + +comme $u $pause +lorsque $u $pause +puisque $u $pause +quand $u $pause +que $u $pause +qui $u $pause +quoique $u $pause +si $u $pause + +// (à cause que) $u $pause +// (ainsi que) $u $pause +// (à mesure que) $u $pause +// (après que) $u $pause +// (à moins que) $u $pause +// (au lieu que) $u $pause +// (aussitôt que) $u $pause +// (pendant que) $u $pause +// (pourvu que) $u $pause + +// pronouns +je $u $verbf +tu $u $verbf +elle $u $verbf +il $u $verbf +nous $u+ $verbf +vous $u+ $verbf +elles $u+ $verbf +ils $u+ $verbf +on $u $verbf + +me $u +te $u +se $u + +ce $u $nounf +ces sEz2 $u $nounf + +// possessives +ma $u+ $nounf +mon $u+ $nounf +mes mEz2 $u+ $nounf +ta $u+ $nounf +ton $u+ $nounf +tes tEz2 $u+ $nounf +sa $u+ $nounf +son $u+ $nounf +ses sEz2 $u+ $nounf +notre $u+ +votre $u+ +leur $u+ +nos $u+ +vos $u+ +leurs $u+ + +// prepositions +de $u $nounf +du $u+ $nounf +des dEz2 $u $nounf +?2 des dez2 $u+ $nounf + + +à $u $brk +au $u $brk +aux $u $brk + +dans $u+ $pause +sur $u+ $pause +par $u+ $pause +pour $u+ $pause +en $u+ $brk +(en effet) A~nEf'E $pause + +vers $u+ $pause +avec $u+ $pause +sans $u+ $pause +sous $u+ $pause +entre $u+ $pause +contre $u+ $pause + +durant $pause + +// negative +ne $u + +// questions +où $pause + +// auxillary verbs (be, have, can, etc) +suis $u+ $verb +est E $u+ +sommes $u+ +êtes $u+ +sont $u+ + +étais $u+ +était $u+ +étions $u+ +étiez $u+ +étaient $u+ + +serai $u+ +sera $u+ +seras $u+ +serons $u+ +serez $u+ +seront $u+ + +eus yz2 $u+ +eut yt2 $u+ + +// some common adjectives and adverbs + +quelque $u +tout $u + + +// Letters which can be words +//=========================== +à a:aksA~grav $atend +y i:gr'Ek $atend + + + +// pronunciation exceptions + +scient si +bénéficient benefisi $verb +président prezidA~t2 +président prezidt2 $verb + + +// MAIN WORD DICTIONARY +//********************* + +monsieur m@sjY // monsieur +montréal mO~real // Montréal +(il y a) ili;a $u +(il y) ili $u +(n'est ce pas) nEspa +(qu'est ce que) kEsk@ $u +(ce qui) s@ki $brk +(cent un) s'A~||W~ +(cent unième) s'A~||ynj'Em +(cent une) s'A~||yn +(cent onzième) s'A~||O~zj'Em +(cent onze) s'A~||O~z +(en haillon) A~||naj'O~ +(on habille) O~||nab'ij +(un haillon) W~||naj'O~ +(mon haillon) m'O~||najO~ +(son haillon) s'O~||najO~ +(ton haillon) tO~||na=jO~ +bus bys +echo Eko +fils fis +mars mars +pays pEi +sens sA~s +c'est sEt2 $u +qu'à ka +qu'y ki +(sud est) sydEst +(nord est) nOREst + +processus pROsEsys + +// ut (t is said) +août ut +azimut azim'yt +brut br'yt +but by $verb +but byt +connecticut kOnEktik'yt +helmut Elmut +mazout mazut +out aut +rut ryt +scorbut skOrbyt +scout skut +scouts skut +stout staut +uppercut ypErk'yt +ut yt +zut syt + + +// et (t is said) + +//Downing_street +//Dun_and_Bradstreet +bridget bRidZ'Et +exocet EgzOs'Et +fret fR'Et +gadget gadZ'Et +hamlet aml'Et +internet E~tErn'Et +jacket Zak'Et +knesset knEs'Et +lazaret lazar'Et +margaret margar'Et +net n'Et +offset OfsEt +pickpocket pikpOk'Et +racket Rak'Et +set sEt +soviet sOvjEt +//ticket tikE + +// ct (ct are not said) +aspect aspE +aspects aspE +circonspect circO~spE +irrespect irEspE +prospect prOspE +respect rEspE +suspect syspE + +// st (t is not said) +prévost prevo + +// urt (t is said) +kurt kurt +yaourt jaurt +yoghourt yogurt +yogourt yogurt + +// ort (t said) +short SOrt + +// art (t said) +stewart stiwart +steward stiwart +stuttgart Stutgart +hart art +kart kart +smart smart + +// irt +flirt fl@rt +(sweat shirt) swEtS@rt +tee-shirt tiS@rt + +parfum parfW~ +forum fOR@m + +// words from other languages +boy bOj +byte bajt +bytes bajts +debian dEbj'An +download dOnlod +emacs Emaks +emacspeak Emakspik +espeak @spik +firefox faj@rfOks +thunderbird f@ndErb@rd +girl g@rl +gnome gnom +gnu gnu +insight insajt +liszt list +(mac os x) makoEs'iks +night najt +redhat rEdat +schubert SubEr +sun s@n +sunlight s@nlajt +ubuntu ubuntu +viavoice viavOjs +windows windoz +word wOrd +wright wrajt +yacht jot + + +// tions (tjO~ instead of sjO~) +achetions aS@tjO~z2 +ajoutions aZutjO~z2 +apportions apOrtjO~z2 +apprêtions aprEtjO~z2 +arrêtions arEtjO~z2 +assistions asistjO~ +bastions bastjO~z2 +battions batjO~z2 +chantions SA~tjO~z2 +citions sitjO~z2 +combattions kO~batjO~z2 +comptions kO~tjO~z2 +congestions kO~ZEstjO~z2 +constations kO~statjO~z2 +contentions kO~tA~tjO~z2 +dations datjO~z2 +digestions diZEstjO~z2 +discutions diskytjO~z2 +doutions dutjO~z2 +débutions debytjO~z2 +désertions dezErtjO~z2 +détentions detA~tjO~z2 +escomptions EskO~tjO~z2 +existions EgzistjO~z2 +exploitions EksplwatjO~z2 +exportions EkspOrtjO~z2 +gestions ZEstjO~z2 +habitions abitjO~z2 +heurtions @rtjO~z2 +indigestions E~diZEstjO~z2 +insistions E~sistjO~z2 +jetions Z@tjO~z2 +limitions limitjO~z2 +manifestions manifEstjO~z2 +méritions meritjO~z2 +partions partjO~z2 +pressentions prEsA~tjO~z2 +présentions prezA~tjO~z2 +prêtions prEtjO~z2 +quittions kitjO~z2 +rations ratjO~z2 +redoutions r@dutjO~z2 +regrettions r@grEtjO~z2 +représentions r@prezA~tjO~z2 +respections rEspEktjO~z2 +ressentions r@sA~tjO~z2 +restions rEstjO~z2 +répétions repetjO~z2 +sentions sA~tjO~z2 +sortions sOrtjO~z2 +souhaitions suEtjO~z2 +soumettions sumEtjO~z2 +supportions sypOrtjO~z2 +tentions tA~tjO~z2 +traitions tREtjO~z2 +votions vOtjO~z2 $u +écoutions ekutjO~z2 +étions etjO~z2 +évitions evitjO~z2 + +// no liaison +(quelqu'un) kElkW~ +vincent vE~sA~ + diff --git a/dictsource/fr_rules b/dictsource/fr_rules new file mode 100755 index 00000000..9642ca84 --- /dev/null +++ b/dictsource/fr_rules @@ -0,0 +1,775 @@ +// French translation rules +// This file is UTF-8 encoded + +// 2006-11-18 Gilles Casse +// +// * The rules are based on Cicero TTS. +// + +// Letter classes: +// A all vowels: a e i o u y â ä é ê è î ï ô ö ù û +// C all consonants +// Y front vowels: e i y é ê è î +// K not a vowel (i.e. consonant, space, ) + + +.group a + + + ae (_ e // reggae vitae + aen A~ // caen (diff Cicero: aA~) + ae ae // maestro + aî E // maître + aim (K W~ // faim + ain (K W~ // pain + f) ai (sA @ // faisons faisan + a (ill a + a (ils_ a + a (il_ a + aie (me E // paiement + ai E // aile + am (b A~ // jambon + am (p A~ // camp + am (m a // programmation + am (m a // programmation + am (n am // amnistie + a (nnA a // manne + an (C A~ // ancien + an (_ A~ // élan + aoû u // août + au (l_ O // Paul + au o // autruche + p) ay (s Ei // pays paysage + ay (C E // aymé + ay Ej // paye + a a // bateau + +.group b + _) b (_ be // b + bb b // abbé + om) b (_ // plomb applomb + b b // aube + +.group c + _) c (_ se // c + c' s // s + cch k // bacchanale + cc (Y ks // accéder + cc k // occuper + ar) ch (ét k // archétype architecte + or) ch (esC k // orchestre + or) ch (iC k // orchidée + sy) ch (o k // psycho + _) ch (or k // chorale + ch (r k // chrétien + ch (l k + ch (n k + ch (s k + ch (to k + ch S // chien + ck k // nickel + cqu k // grecque + cq k // pecq + s) c (Y // + x) c (Y + c (Y s // cède + ban) c (_ // banc + blan) c (_ // blan + cler) c (_ // leclerc + tchou) c (_ + taba) c (_ + se) c (ond g // seconde secondaire + c k // recoin donc + + s) cien (t jA~ // conscient scientifique + cien (t_ i // ils appr�ient, remercient. + i) cien (t_ sjA~ // coefficient + + +.group d + _) d (_ de + dd d // addition + _) d' (P2 d + _lan) d (_ d // land + Clan) d (_ d + _san) d (_ d + Csan) d (_ d + _tan) d (_ d // stand + Ctan) d (_ d + + Can) d (_ t2 // grand ami, grand marchand + Cen) d (_ t2 + Con) d (_ t2 + quan) d (_ t2 + quen) d (_ t2 + quon) d (_ t2 + + dt (_ t // Schmidt + r) d (_ // lourd placard + d d // don bled + +.group e + + _) e (_ @ // e + e (Ce_ E + eau o // bateau cheveaux + j) e (a // Jean Jeanne + ect (_ Ekt // direct + _trépi) ed e + _pi) ed e // pied + ee i // meeting + _cl) ef (_ e // clef + ein (C E~ // peindre + ein (_ E~ + e (il E // vieille + ei E // neige + ell El // selle + el (C El // celsius + el (_ El // caramel + em (me a // femme patiemment + em (b A~ // décembre + em (m A~ // emmencher + em (p A~ + en (_ A~ // en + en (hA A~n // enharmonique + en (A A~n // enivrer + en (_A A~n // en avion + + C) en (d_ A~ // comprend dépend + C) en (ds_ A~ + qu) en (d_ A~ + qu) en (ds_ A~ + + pati) en A~ // patient patience + _) en (nu A~ // ennui + + C) en (A @n // menu + + en (nA E // penne ennemi + Ci) en (nA E // mienne + + éC) en (t_ A~ // récent différent élément + + _C) en (t_ A~ // cent vent lent dent + cc) en (t_ A~ // accent + + _jac) en (t_ A~ // sous-jacent + + ti) en (t_ E~ // retient + ati) en (t_ A~ // patient + oti) en (t_ A~ // quotient + + vi) en (t_ E~ + + al) en (t_ A~ // talent équivalent + xcell) en (t_ A~ // excellent + + mm) en (t_ A~ + em) en (t_ A~ // vitement + mom) en (t_ A~ // moment + Aaim) en (t_ A~ + Caim) en (t_ A~ + cum) en (t_ A~ + gum) en (t_ A~ + lum) en (t_ A~ + rum) en (t_ A~ // prudemment + + _cli) en (t_ A~ // client + _laur) en (t_ A~ + _mécont) en (t_ A~ + _cont) en (t_ A~ + mpét) en (t_ A~ // compétent + prés) en (t_ A~ + _souv) en (t_ A~ // souvent + + s_couv) en (t_ // elles couvent + qui_couv) en (t_ + + _couv) en (t_ A~ // le couvent + en (t_ // étaient mangent + + Ci) en (_ E~ // viendra + Ci) en (C E~ // tien + Ci) en (c A~ // science + + _am) en (_ En // amen + + AA) en (_ E~ + AC) en (_ E~ // examen + CA) en (_ E~ // rien + CC) en (_ E~ + + en (s_ A~ + en (CA A~ // pentathlon + en (CC A~ // entre + + _C) er (_ ER // fer + _Ch) er (_ ER // cher + _env) er (_ ER + _hi) er (_ ER // hier + _hiv) er (_ ER // hiver + _trav) er (_ ER + _ti) er (_ ER + + th) er (_ WR // brother + th) er (s_ WR + w) er (_ WR // power + w) er (s_ WR + + er (_ e // parler léger + er (_A eR // parler léger + er (s_ e + + i) ert (_t2 e // requiert + + d) e (ssous_ @ // dessous + d) e (ssus_ @ // dessus + + _d) es (bA e + _d) es (jA e // Desjardins + _d) es (nA e + _d) es (qA e // desquels + + _l) es (qA e // lesquels + + _m) es (dA e // mesdames + _m) es (nA e + Am) es (dA e + Am) es (nA e // Dumesnil + + d) esh (A ez // Deshormeaux + + _r) es (A @s // resaisir resaluer + + _r) e (ss @ // ressembler + _r) e (stra @ + _r) e (stre @ + _r) e (stro @ + _r) e (stru @ // restructurer + -) est (_ Est // -est + + Cr) es (_C @ + rC) es (_C @ // fortes dames + + ') eu (_ y // eu + eu (r_ W // peur + eu (rs_ W // tracteurs + + eu (b @ // meuble + eu (f @ // neuf + eu (i @ + eu (l @ // fieul + eu (n @ // jeune + eu (p @ + eu (r @ + eu (v @ + + eu Y // meute tueuse jeu gueuze + _) eû y // eût + eû Y // jeûne + + e (x E // exact + ey (_ e // dahomey + ey (C e // ceylan + ey Ej // asseye + + ez (_ ez2 // nez mangez chez + _C) e (_ @ // je te + _CC) e (_ @ + _qu) e (_ @ // que + + Cr) e (_C @ // quatre pattes + rC) e (_C @ + + e (_ // montre + + g) e (A // mangeons + + AC) e (ment // vitement sûrement + Aqu) e (ment + enC) e (ment + enqu) e (ment + + _d) e (ch @ + _d) e (Cl @ + _d) e (Cr @ // degré + _r) e (ch @ // recherche + _r) e (Cl @ + _r) e (Cr @ // retracer + + _l) e (xA E + _l) e (CA @ + _l) e (ChA @ + _l) e (ClA @ // Leclerc + _l) e (CrA @ // Lebrun + tr) e (CA @ + tr) e (ChA @ + tr) e (ClA @ + tr) e (CrA @ // entreprise + + e (CC E // infect pelle mettre + e (C_ E + + ll) e (m // actuellement guillemets + + As) e (gA + As) e (pA + Ass) e (gA + Ass) e (pA // passeport + Av) e (gA // sauvegarde + Av) e (pA + + e @ // menue + +.group ë + u) ë // ambiguë + ë E // citroën noël + +.group f + _) f (_ Ef + f f + f (f + _neu) f (_ans v // liaison: neuf ans + _neu) f (_heures v + + +.group g + _) g (_ Ze + g g + + su) gg (Y gZ // suggérer suggestif + gg g // agglomérer + ai) gni n^ // craignions châtaignier + gn n^ // agneau + _quatre_vin) gts (_ z2 // quatre-vingts ans + _quatrevin) gts (_ z2 + + vin) gt (_A t // liaison: vingt ans + + vin) gt (_un + vin) gt (_deux t + vin) gt (_trois t //liaison: vingt-trois + vin) gt (_quatr t + vin) gt (_cinq t + vin) gt (_six t + vin) gt (_sept t + vin) gt (_huit t + vin) gt (_neuf t + + gt (_ // vingt doigts + + gt t // vingtaine doigté + ai) gu (il gy // aiguillage + in) gu (is gy // linguiste + g (C g + g (a g // langage + g (u g + g (â g + g (o g + g (û g + + _ran) g (_ // rang + _san) g (_ // sang + _lon) g (_ // long + + g (_ g // grog gag goulag + g Z // congé george + +.group h + _) h (_ aS + h // ahuri + +.group i + _) i (_ i + i i // cri + + ie (ment i // remerciement balbutiement + i (es_ i // parties + i (e_ i + i (A j // fermier portier patio renier + _) ill ill // illégal + _m) ill il // mille + v) ill il // village + u) ill ij // cuillière cueillir + A) ill j // caillou + ill ij // famille + a) il (_ j // bail + e) il (_ j + u) il (_ j // deuil + + imm imm // immaculé + im (_ im // karim + im (C E~ // timbre + ing (_ iN // parking + in (h in // inhumain + inct (_ E~ // distinct + in (n i // innombrable + in (C E~ // vingt + // in (_ E~ // vin + in (_ W~ // vin + ique (_ ik + + +.group î + î i // abîme + în (i in // vînimes + +.group ï + ïn (C E~ // coïncider + ïn (_ E~ + a) ï j // aïeul + ï i // ambiguïté + +.group j + _) j (_ Zi + j Z // adjoint joujoux + + +.group k + _) k (_ ka + k k // kafka + ket (_ kEt // basket + kets (_ kEt // basket + +.group l + _) l (_ El + l l // lit + ll l // aller + au) lt // hérault + outi) l (_ // outil + ui) ll j // juillet + + +.group m + _) m (_ Em + m m // film + mm m // pomme + + +.group n + _) n (_ En + n n // une + nn n + ng (_ N + + _) n' (P2 n + + A) ng (_ N // parking meeting + nn n // panne + +.group o + _) o (_ o + + cr) oc (_ o // escroc + + o (ch o // cochon + oe (ll wa // moelleux + _) oe (C Y // oesophage + o (eu // soeur oeuf + o (eC o // coefficient + _) oi (gnon O // oignons + oin (C wE~ + oin (_ wE~ // coin + oi wa // poil + oê (l wE // poêle + oî wa // boîte + _) ok (_ oke // OK + o (mm O // comme + dr) o (me_ o // vélodrome + om (b O~ // bombe + om (p O~ // pompe + n) om (_ O~ // nom + om (_ Om // www.web.com + on (K O~ // mon + on (n O // bonne + onsh (A O~z // bonshommes + onh (A On // bonhomme + + b) on (_A On // liaison: bon élève + m) on (_A O~n // mon appui + s) on (_A O~n + t) on (_A O~n + + z) o (ne_ o // amazone + c) o (ne_ o + h) o (ne_ o + r) o (ne_ o + z) o (nes_ o + c) o (nes_ o + h) o (nes_ o + r) o (nes_ o + + alc) oo (l O // alcool + z) oo o // zoo + oo u // pool + _gal) op (_ o // galop + + _sir) op (_ o // sirop + + _tr) op (_ o // trop + v) ost (_ o // Prévost + o (sA o // poser + ot (_ o // mot dépots + c) oup (_ u // beaucoup + l) oup (_ u // loups + + + ou u // hibou brouillard + où u // où + oû u // coûter + oyes (_ wa // troyes + oy (A waj // noyer voyelles + oy wa // roy + o (_ o // zorro allégro + o (z_ o // berlioz + o (mo o // momo + o (no o // nono + om) o o // monocorde + on) o o // + + o O // sobre notions émotions + +.group ô + ôt (_ o // rôt + ô o // cône + +.group p + _) p (_ pe + p p // pas + p (p // appliquer + ph f // phrase + + m) ps (_ // temps champs + r) ps (_ // corps + + cham) p (_ // contrechamp + + cam) p (_ // camp + + dra) p (_ // sparadrap + + ba) p (t // baptiser compte + com) p (t // baptiser compte + + C) pt (_ // prompt exempt + + se) pt (_ t // sept + se) pt (iè t // septième + +.group q + _) q (_ ky + q k // coq + qu k // quatre + que (_ k@ // puisque + _) qu' (P3 k // qu'il + n) q (_ k // cinq cent + +.group r + _) r (_ ER + right _^_EN // copyright + _su) rr RR // surréaliste + ou) rr RR // courrai + rr R // erreur + r R // rien + +.group s + _) s (_ Es + s s // verser sien + + s (_S1 z2 + + _) s' (P2 s // s'amène + sç s // immisça + sch (iz sk // schizophrène + sch (ol sk + sch (oo sk + + sch S // schéma + dé) sh (A z // déshabiller + sh S // shérif + ss s // assez + + ai) s (em s // vraisemblable + ub) s (is z // subsister + han) s (on s // chanson + A) s (A z // baiser + y) s (A z // paysage + CCan) s (A z // transition + + + ibu) s (_ s + mbu) s (_ s + + cu) s (_ s // focus phallus cumulus minus + iu) s (_ s + mu) s (_ s + nu) s (_ s + pu) s (_ s + llu) s (_ s + ulu) s (_ s + + atu) s (_ s // stratus cactus motus + ctu) s (_ s + itu) s (_ s + otu) s (_ s + + _tou) s (_C + _tou) s (_ s + + s (b z // sbire + s (d z + s (g z + s (j z + s (v z + +.group t + _) t (_ te + t t // bataille + t (_ t2 // silent at end of word unless next word starts with a vowel + ts (_ z2 // silent at end of word unless next word starts with a vowel + C) t (_ t // compost watt soft script malttact abrupt + n) t (_ t2 // emprunt + r) t (_ t2 // fort + + aul) t (_ // Renault + + tt t // attitude + + s) th (m // asthme + th t // théorie + hui) t (_ t // huit + + _) t t // tien tiers + an) t (ia t // Santiago + + t (io_ s // ratio + + a) t (ia s // spatial + en) t (ia s // confidentialit� + u) t (ia s // balbutiait + r) t (ia s // impartial + i) t (ia s // initia + p) t (ia s // nuptial + an) t (iat s // transsubstantiation + + + t (ion s // programmation + s) t (ion t // gestion + + t (iel s // partiel patiemment + t (iem s + + mar) t (ien s // martien vénitienne + i) t (ien s + pa) t (ien s + o) t (ien s + + Cu) t (ie_ s // minutie + Cu) t (ies_ s + + cra) t (ie_ s // démocratie + cra) t (ies_ s + + ner) t (ie_ s // inertie + ner) t (ies_ s + + _ce) t (_ t + + +.group u + _) u (_ y + u y // cruel nuage brut + ui w^i + + g) ueill Wj // orgueilleux + g) ueil (_ Wj // orgueil + + c) ueill Wj + c) ueil (_ Wj + + um (_ Om // album + um (b W~ // humble + um (p W~ + un (C W~ // emprunt lundi + un (_ W~ // brun + un (_A W~n // un avion + + g) u (A // fatigue + g) u (ï y // ambiguïté + g) u (ë y // ambiguë + +.group v + _) v (_ ve + v v + +.group w + _) w (_ dubl@v'e + w w + ware (_ _^_EN // hardware, software + + +.group x + _) x (_ iks + x ks + xs ks // lexique lexicaux vox + _e) x (A gz // exagérer exemple + _e) x (h gz // exhumer + + ai) x (_ // voix paix prix + oi) x (_ + ri) x (_ + + _soi) x (A s // soixante + + au) x (_ z2 // faux beaux + eu) x (_ z2 // jeux + ou) x (_ z2 // choux genoux + + _au) x (quel // auxquels + + _di) x (_neuf z // liaison: dix-neuf + _si) x (_neu s // liaison: six-neuf + + di) x (iè z // dixième + si) x (iè z // sixième + deu) x (iè z // deuxième + + +.group y + y i // cryogénique myope + + ym (b E~ // symbolique + ym (p E~ // tympan + y (nn i + y (n_ i + + yn E~ // laryngite + +.group z + _) z (_ zEd + z z + zz z + t) z s // tzigane + + +.group +// accented characters, these could have their own groups if they need more rules + â a: + ñ n^ + + ç s // rançon + é e // été + è E // règle + ê E // fête + ñ Ni // niño + ö O // angström + œ W + œu W: // sœur + û y // fûtes + ü y // bülcher + + +// symbols that are normally spoken when reading text + @ arobas + $ dOlar + , (D pilk:u diff --git a/dictsource/hi_list b/dictsource/hi_list new file mode 100755 index 00000000..52330a0a --- /dev/null +++ b/dictsource/hi_list @@ -0,0 +1,271 @@ +// This file is UTF8 encoded + +// Numbers +// devanagari numbers are changed to latin characters before translation +_0 S'u:n.j@3 +_1 'e:k +_2 d'o: +_3 t'i:n +_4 c'a:r: +_5 p'a:nc +_6 ch'@2 +_7 s'a:t +_8 'a:t.h +_9 n'O: +?3 _9 n'aU + +_10 dVs +_11 gj'a:r@2 +_12 b'a:r@2 +_13 t'E:r@2 +_14 ch'O:d@2 +_15 p'Vndr@2 +_16 s'o:l@2 +_17 s'Vt:r@2 +_18 Vt.h:'a:r@2 +_19 Unn'Is + +_20 b'i:s +_21 Ik:'Is +_22 b'a:Is +_23 t'e:Is +_24 c'O:bIs +_25 p@c:'Is +_26 ch@bb'i:rs +_27 s@t:'a:Is +_28 ath:'a:Is +_29 Unt'Is +_30 t'i:s + +_31 Ik@t:'Is +_32 bat:'Is +_33 tE~t'Is // E~ ? +_34 cO~t'Is +_35 pE~t'Is +_36 chaT'tIs +_37 sE~t'Is +_38 art'Is +_39 Unta:l'Is + +_40 ca:l'Is +_41 Ikta:l'Is +_42 baIa:l'Is +_43 tE~ta:l'Is +_44 cO:wa:l'Is +_45 paI'nta:l'Is +_46 chhIja:l'Is +_47 sE~ta:l'Is +_48 arta:l'Is +_49 'Un^ca:s + +_50 p@c'a:s +_51 Ikj'a:wVn +_52 b'a:wVn +_53 t'IrpVn +_54 c'Ou:wVn +_55 p'achpVn +_56 chh@p:'Vn +_57 sVt:'a:w@n +_58 ath:'a:w@n +_59 Uns'Vth + +_60 s'a:t.h +_61 'Iks@t.h +_62 b'a:s@t.h +_63 t'Irs@t.h +_64 c'O~s@t.h +_65 paIns@t.h +_66 ch'Ija:s@t.h +_67 s'Vrs@t.h +_68 ars@t.h +_69 Un@h,at:'Vr: + +_70 sat:'Vr: +_71 Ikhat:'Vr: +_72 b@hat:'Vr: +_73 tIhat:'Vr: +_74 cO:hat:'Vr: +_75 pach,at:'Vr: +_76 chIhat:'Vr: +_77 s@t@hat:'Vr: +_78 athhat:'Vr: +_79 ,Un^Ia:s'i: + +_80 ,Vss'i: +_81 Ikja:s'i: +_82 baIa:s'i: +_83 tIra:s'i: +_84 cO:ra:s'i: +_85 pI'ca:s'i: +_86 chIja:s'i: +_87 sVt:a:s'i: +_88 ath:a:s'i: +_89 nVwa:s'i: + +_90 nVb:'e: +_91 Ikj'a:n@we: +_92 b'a:n@we: +_93 tIr'a:n@we: +_94 cO:r'a:m@we: +_95 p@c'a:n@we: +_96 chIj'a:n@we: +_97 s@t:'a:n@we: +_98 ath:'a:n@we: +_99 nIn^j'a:n@we: + +_0C s'O: +_0M1 h@z'a:r +_0M2 d,Vsla:kh@_ // until we fix numbers > 100,000 +_1M2 d,Vsla:kh@_ // until we fix numbers > 100,000 +_0L l'a:kh +_dpt _d@s@ml'o:_ // ?? what is Hi for "." ? + +// Single consonants +क k@ +क़ q@ +ख kh@ +ख़ x@ +ग g@ +ग़ Q@ +घ gh@ +ङ N@ +च c@ +छ ch@ +ज J@ +ज़ z@ +झ Jh@ +ञ n^@ +ट t.@ +ठ t.h@ +ड d.@ +ढ d.h@ +ण n@ // should be n.@ +त t@ +थ th@ +द d@ +ध dh@ +न n@ +प p@ +फ ph@ +फ़ f@ +ब b@ +भ bh@ +म m@ +य j@ +र r@ +ऱ r@ +व v@ +श S@ +ष S@ // should be retroflex [S] +स s@ +ह H@ +क़ q@ +ख़ x@ +ग़ Q@ +ज़ z@ +ड़ r-@ +ढ़ hr@ +फ़ f@ +य़ j@ + +// Pronouns +मैं $u // main: I +मुझे $u +मेरा $u +मेरी $u +मेरे $u + +हम $u // we +हमें $u +हमारा $u +हमारी $u +हमारे $u + + +आप $u // you(formal) +आपको $u +आपका $u +आपकी $u +आपके $u + +तुम $u // you (informal) +तुम्हें $u +तुम्हारा $u +तुम्हारी $u +तुम्हारे $u + +तू $u // you (informal) +तुझे $u +तेरा $u + +यह $u // he/she/it +ये $u +इस्से $u +इसका $u + +ये $u // they +इन्हें $u +इनका $u + +वह $u // he/she/it +वो $u +उस्से $u +उसका $u +उसकी $u +उसके $u + +वे $u // they +वो $u +उन्हें $u // unheṃ: them +उनका $u +उनकी $u +उनके $u + + +// Prepositions/Postpositions +का $u // kā: of, possessive particle +की $u // kī +के $u // ke + +को $u // ko: to +तक $u // tak: until, for(time) +बिना $u $pause // without (preposition) +में $u // me: in +से $u // se: from, with, by + + +// Questions +क्या $u $pause // interrogative particle + + +// Conjunctions + +और $u $pause // aur: and +य j@ $u $pause // ja: or +अगर $u $pause // agar: if +यदि $u $pause // yadi: if, whether +अगरचे $pause // agarce: although, even +पर $pause // par: but, still, yet +मगर $pause // magar: however, unless + + + +// Verbs +हूँ $u // to be +हो $u +है $u +हैं $u + +था $u // thā: past aux +थे $u // the +थी $u // thī +थीं $u // thīh + +रहा $u // rahā: continuous +रहे $u // rahe +रही $u // rahī + + +// Exceptions +क्रिकेट krIk'Et +सायबर s'aIb@r diff --git a/dictsource/hi_rules b/dictsource/hi_rules new file mode 100755 index 00000000..81ec0dec --- /dev/null +++ b/dictsource/hi_rules @@ -0,0 +1,518 @@ + +// This file is UTF8 encoded + +// letter groups: +// B - vowel signes and virama ् + +// conditional rules +// ?1 drop schwa at end of word +// ?2 use diphthong for "ai" +// ?3 use diphthong for "au" + + +// Vowels + +.group अ + अ V + अ (ह E // (h + अह) अ E + +.group आ + आ a: + +.group इ + इ I + +.group ई + ई i: + ई (_ i + +.group उ + उ U + +.group ऊ + ऊ u: + +.group ऋ + ऋ rI + +.group ऌ + ऌ l- // vocalic l + +.group ऍ + ऍ E // candra e + +.group ऎ + ऎ e + +.group ए + ए e: + +.group ऐ + ऐ E: // ?? [aI] [E:] [&:] +?2 ऐ aI // ?? [aI] [E:] [&:] + + +.group ऑ + ऑ O // candra O + +.group ऒ + ऒ o + +.group ओ + ओ o: + ओं o~ // +anusvara + ओँ o~ // +candrabindu + +.group औ + औ O: // ?? [aU] [O:] + औं O~ // +anusvara + औँ O~ // +candrabindu +?3 औ aU // ?? [aU] [O:] + + +// Vowel Signs + +.group ा + ा a: + ाव aU + +.group ि + ि I + +.group ी + ी i: + ी (_ i + +.group ु + ु U + +.group ू + ू u: + +.group ृ + ृ rI + +.group ॄ + ॄ rI + +.group ॅ + ॅ E + +.group ॆ + ॆ e + +.group े + े e: + +.group ै + ै E: // ?? [aI] [E:] [&:] +?2 ै aI // ?? [aI] [E:] [&:] + +.group ॉ + ॉ O + +.group ॊ + ॊ o + +.group ो + ो o: + ों o~ + ोँ o~ + +.group ौ + ौ O: // [O:] or [aU] ?? + ौं O~ + ौँ O~ +?3 ौ aU // [O:] or [aU] ?? + +.group ॢ // vowel sign l + ॢ l- + +.group ॣ // vowel sign ll + ॣ l-: + +.group ॐ + ॐ o~m + +// Consonants + +.group क + क kV + क (B k + क (्य k: +?1 क (_ k + क़ qV + क़ (B q +?1 क़ (_ q + +.group ख + ख khV + ख (B kh +?1 ख (_ kh + ख़ xV + ख़ (B x +?1 ख़ (_ x + +.group ग + ग gV + ग (B g +?1 ग (_ g + ग़ QV + ग़ (B Q +?1 ग़ (_ Q + +.group घ + घ ghV + घ (B gh +?1 घ (_ gh + +.group ङ + ङ NV + ङ (B N +?1 ङ (_ N + ्) ङ (_ NV + +.group च + च c@3 + च (B c + च (्य c: +?1 च (_ c + +.group छ + छ ch@3 + छ (B ch +?1 छ (_ ch + +.group ज + ज J@3 + ज (B J +?1 ज (_ J + ज़ zV + ज़ (B z +?1 ज़ (_ z + +.group झ + झ Jh@3 + झ (B Jh +?1 झ (_ Jh + +.group ञ + ञ n^@3 + ञ (B n^ +?1 ञ (_ n^ + ्) ञ (_ n^ + +.group ट + ट t.V + ट (B t. + ट (्य t.: +?1 ट (_ t. + +.group ठ + ठ t.hV + ठ (B t.h +?1 ठ (_ t.h + +.group ड + ड d.V + ड (B d. +?1 ड (_ d. + +.group ढ + ढ d.hV + ढ (B d.h +?1 ढ (_ d.h + ढ़ r-V // nukta (should retroflex flap) + ढ़ (B r- // nukta +?1 ढ़ (_ r- // nukta + +.group ण + ण nV // (temporary) same as dental [n] + ण (B n +?1 ण (_ n + ्) ण (_ nV + +.group त + त tV + त (B t + त (्य t: +?1 त (_ t + +.group थ + थ thV + थ (B th +?1 थ (_ th + +.group द + द dV + द (B d +?1 द (_ d + +.group ध + ध dhV + ध (B dh +?1 ध (_ dh + +.group न + न n.V + न (B n. +?1 न (_ n. + ्) न (_ n.V + र्) न (_ n. // r +virama + + +.group ऩ + ऩ n: // should this be a long [n] ? + +.group प + प pV + प (B p + प (्य p: +?1 प (_ p + +.group फ + फ phV + फ (B ph +?1 फ (_ ph + फ़ fV + फ़ (B f +?1 फ़ (_ f + +.group ब + ब bV + ब (B b +?1 ब (_ b + +.group भ + भ bhV + भ (B bh +?1 भ (_ bh + +.group म + म mV + म (B m +?1 म (_ m + ्) म (_ mV + र्) म (_ m // r +virama + न्) म (_ m // n +virama + +.group य + य j@3 + य (B j +?1 य (_ j + ्) य (_ j@3 + +.group र + र rV + र (B r +?1 र (_ r + ्) र (_ r@- + +.group ऱ // rra + ऱ rV // (temporary) same as [r] + ऱ (B r +?1 ऱ (_ r + ्) ऱ (_ rV + +.group ल + ल lV + ल (B l +?1 ल (_ l + ्) ल (_ lV + +.group ळ + ळ lV // (temporary) same as [l] + ळ (B l +?1 ल (_ l + ्) ल (_ lV + +.group ऴ + ऴ lV // (temporary) same as [l] + ऴ (B l +?1 ल (_ l + ्) ल (_ lV + +.group व + व vV + व (B v + _) व wV + _) व (B w + _) व (् v // +virma +?1 व (_ v + +.group श + श SV + श (B S +?1 श (_ S + +.group ष + ष SV //?? or retroflex [S] + ष (B S //?? +?1 ष (_ S //?? + +.group स + स sV + स (B s +?1 स (_ s + +.group ह + ह HV + ह (B H +?1 ह (_ H + + + // nukta, modifies a consonant + +.group ऽ // avagraha, lengthens a vowel ?? + ऽ : + +.group ँ + ँ n // candrabindu + +.group ं + ं N // anusvara + ं (प m + ं (फ m + ं (ब m + ं (भ m + ं (म m + + ं (ट n. + ं (ठ n. + ं (ड n. + ं (ढ n. + ं (ण n. + + ं (च n^ + ं (छ n^ + ं (ज n^ + ं (झ n^ + ं (ञ n^ + ं (य n^ + + ं (क N + ं (ख N + ं (ग N + ं (घ N + ं (ङ N + ं (ह N + +.group ः + ः H // visarga + + + +// Extra consonants + +.group क़ // qa + क़ qV + क़ (B q +?1 क़ (_ q + +.group ख़ // khha + ख़ xV + ख़ (B x +?1 ख़ (_ x + +.group ग़ // ghha + ग़ QV + ग़ (B Q +?1 ग़ (_ Q + +.group ज़ // za + ज़ zV + ज़ (B z +?1 ज़ (_ z + +.group ड़ // dddha (should retroflex flap) + ड़ r-V + ड़ (B r- +?1 ड़ (_ r- + +.group ढ़ // rha (aspirated version of dddha) + ढ़ hrV + ढ़ (B hr +?1 ढ़ (_ hr + +.group फ़ // fa + फ़ fV + फ़ (B f +?1 फ़ (_ f + +.group य़ // yya + य़ jV + य़ (B j +?1 य़ (_ j + +.group ॠ // rr + ॠ V-rr + +.group ॡ // ll + ॡ l-: // long syllabic l + + +// If we find a Latin letter a-z, then translate as English + +.group a + a _^_EN +.group b + b _^_EN +.group c + c _^_EN +.group d + d _^_EN +.group e + e _^_EN +.group f + f _^_EN +.group g + g _^_EN +.group h + h _^_EN +.group i + i _^_EN +.group j + j _^_EN +.group k + k _^_EN +.group l + l _^_EN +.group m + m _^_EN +.group n + n _^_EN +.group o + o _^_EN + D__) of (__D    me + +.group p + p _^_EN +.group q + q _^_EN +.group r + r _^_EN +.group s + s _^_EN +.group t + t _^_EN +.group u + u _^_EN +.group v + v _^_EN +.group w + w _^_EN +.group x + x _^_EN +.group y + y _^_EN +.group z + z _^_EN + + + +.group + $ dOlV + % pVsEnt + + diff --git a/dictsource/hr_list b/dictsource/hr_list new file mode 100644 index 00000000..327473b6 --- /dev/null +++ b/dictsource/hr_list @@ -0,0 +1,208 @@ + // translation rules for Croatian +// This file is UTF-8 encoded + +// Letters +b b@ +c ts@ +č tS@ +ć tS;@2 +d d@ +dž dZ@ +đ dZ;@2 +f f@ +g g@ +h x@ +j j@2 +k k@ +l l@ +lj l^@ +m m@ +n n@ +nj n^@ +p p@ +q kvE +r r- +_s s@ +š S@ +t t@ +v v@ +w dv'ost@-*UkovE +x iks +y ipsilon +z z@ +ž Z@ + +_?? znak // unknown symbol +_?A slovo // unknown letter +© 'aUtorsk&||p@-*'av& +% posto ++ plus +€ Eu*o +@ _Et +& _End +! 'usklItSnIk +: dv'ototSk& +# b@-*'oj +/ k@-*'oz +\\ b'EkslES +^ tsirkUmflEks +~ tild& +¤ valUt& +§ oldom&k +µ mikro +¶ tSlan&k +° st'up&n^ + +_$ dol&r +_- minus +_* zvj'ezdIts@ +_= jedn&ko +_@ t'r-gov,&tSko||'i +_( 'otvo*,En&||'ok@-*Ugl& +_) z'atvo*,En&||'ok@-*Ugl& +_' apost@-*of +_* zvjezdIts& +_, za*Ez +_- tsr-tIts& +_. totSk& +_; t'otSk&z,a*Ez +_< man^I +_= jedn&ko +_> vEtS;I +_? upItnIk +_& t'r-gov,&tSk||'a +_[ 'otvo*,En&||'ugl&t& +_] z'atvo*,En&||'ugl&t& +__ ts'r-t& +_` g@-*'avIs +_{ 'otvo*,En&||v'itItS,&st& +_| okom,It& +_} z'atvo*,En&||v'itItS,&st& + + + + +// Numbers +_0 n'ul& +_1 j'ed&n +_2 dv'a +_2f dv'ije +_3 t@-*'i +_4 tS'EtI*I +_5 p'Et +_6 S'Est +_7 s'Ed&m +_8 'os&m +_9 d'EvEt +_10 d'EsEt +_11 j'ed&naIst +_12 dv'anaIst +_13 t@-*'inaIst +_14 tS'Etr-naIst +_15 p'EtnaIst +_16 S'EsnaIst +_17 s'Ed&mnaIst +_18 'os&mnaIst +_19 d'EvEtnaIst +_2X dv'adEsEt +_3X t@-*'idEsEt +_4X tS'Etr-dEsEt +_5X p'EdEsEt +_6X S'EzdEsEt +_7X s'Ed&mdEsEt +_8X 'os&mdEsEt +_9X d'EvEdEsEt +_0C st'o_ +_2C dvj'est'o +_6C S'Est'o +_0M1 t'isUtS;& +_0MA1 t'isUtS;e +_1M1 t'isUtS;U +_0M2 m'ilijUna +_0MA2 m'ilijUna +_1M2 m'ilijUn +_0M3 m'iliardI +_0MA3 m'iliarde +_1M3 m'iliardU +_0M4 b'ilijUna +_1M4 b'ilijUn +_dpt _:z'a*Ez_ + + +// Demonstratives +tko $u+ +što $u+ +koga $pause +čega $pause + + +// Pronouns + + +// Prepositions +o $u $brk +u $u $brk +s s_ $brk + + +// Conjunctions +a $u $pause // and +i $u $pause // and +but $pause // but +nego $pause // but +ili $u $pause // or + + + + +// Auxillary verbs +li $u // question +da $u+ // ?? + +sam $u // to be, short form +si $u +je $u +smo $u +ste $u +su $u + +bio $u // to be, past tense +bila $u +bilo $u +bili $u + +nisam $u+ // to be, negative +nisi $u+ +nije $u+ +nismo $u+ +niste $u+ +nisu $u+ + +imam $u+ // to have +imaš $u+ +ima $u+ +imamo $u+ +imate $u+ +imaju $u+ + +nemam $u+ // to have, negative +nemaš $u+ +nema $u+ +nemamo $u+ +nemate $u+ +nemaju $u+ + + + + + +// treat as letters if at the end of the clause +a a $atend // letter-a +i i $atend // letter-i +o o $atend // letter-o +s s@ $atend +u u $atend + + +// Exceptions + diff --git a/dictsource/hr_rules b/dictsource/hr_rules new file mode 100644 index 00000000..a1a2bd7b --- /dev/null +++ b/dictsource/hr_rules @@ -0,0 +1,145 @@ +// translation rules for Croatian +// This file is UTF-8 encoded + +.group a + a a + aj (K aI + +.group b + b b + +.group c + c ts + +.group č + č tS + +.group ć + ć tS; + +.group d + d d + dz dz + dž dZ + +.group đ + đ dZ; + +.group e + e E + j) e e + e (j e + +.group f + f f + +.group g + g g + +.group h + h h + _) h x + +.group i + i i + +.group j + j j + +.group k + k k + +.group l + l l + K) l (K l- + lj (+ l^ + +.group m + m m + +.group n + n n + n (g N + n (k N + + nj n^ + +.group o + o o + ou oU + +.group p + p p + +.group q + q k + qu kv + +.group r + r r + A) r (A * + K) r (A @-* + rr *r + + K) r (K r- + + +.group s + s s + +.group š + š S + +.group t + t t + +.group u + u u + +.group v + v v + +.group w + w v + +.group x + x ks + +.group y + y j + K) y (K i + + +.group z + z z + +.group ž + ž Z + +.group + á a: + é e: + í i: + ó o: + ú u: + + $ dol&r + + . totSk& + . (. _: + \.) . + + __) - (_D minus + A_) - (_D _ + C_) - (_D _ + --) - + + * zvj'ezdIts@ + *) * (* + ** + **) * (_ _:: + + = _j'edn&ko_ + = (== + =) = (= + ==) = (_ _:: diff --git a/dictsource/hu_list b/dictsource/hu_list new file mode 100644 index 00000000..4b843db3 --- /dev/null +++ b/dictsource/hu_list @@ -0,0 +1,157 @@ +// Letters +_a A: +b be: +c tse: +d de: +f Ef +g ge: +h ha: +j je: +k ka: +l El +m Em +n En +p pe: +q ku: +r Er +s S_ +s ES $atend +_s ES +v ve: +w duplAve: +x iks +y ipsilAn +z ze: +_. pont + + +// Numbers + +_0 n'ullA +_1 'EJ +_2 k'EttY: +_3 h'a:rom +_4 n'e:J +_5 'Yt +_6 h'At +_7 h'e:t +_8 n^'olts +_9 k'ilEnts +_10 t'i:z +_1X t'izEn +_20 h'u:s +_2X h'uson +_3X h'Armints +_4X n'EJvEn +_5X 'YtvEn +_6X h'AtvAn +_7X h'EtvEn +_8X n^'oltsvAn +_9X k'ilEntsvEn +_0C s'a:z_ +_1C s'a:z + +_0M1 'EzEr +_1M1 'EzEr +_2M1 k'e:t,EzEr +_0M2 m'illio: +_1M2 m'illio: +_2M2 k'e:tm,illio: +_0M3 m'illia:rd +_1M3 m'illia:rd +_1M3 k'e:tm,illia:rd +_0M4 b'illio: +_1M4 b'illio: +_2M4 k'e:tb,illio: +_dpt v,Ess2Y: + + +// Articles +a $u +a A: $atend +az $u + +ez $u // this + + +// Pronouns + +// If these are only used for emphasis then then don't need $u +// én $u +// te $u +// ő $u +// mi $u +// ti $u +// ők $u +// maga $u +// maguk $u + + +// Conjunctions +és $u $pause // and +de $u $pause // but +vagy $u $pause // or + +mert $pause // because +miatt $pause // because +bár $pause // although +habár $pause // although + +ha $u $pause // if + + +// Negative +nem $u+ +ne $u+ + + +// Unstressed adverbs etc. +néhány $u+ + + +// Verbs + +vagyok $u // to be, present +vagy $u +van $u +vagyunk $u +vagytok $u +vannak $u + +voltam $u // to be, past +voltál $u +volt $u +voltunk $u +voltatok $u +voltak $u + +leszek $u // to be, future +leszel $u +lesz $u +leszünk $u +lesztek $u +lesznek $u + + +kell $u+ // should + +szabad $u+ // can (allowed) + +fog $u+ // going to +fogok $u+ +fogsz $u+ +fogunk $u+ +fogtok $u+ +fognak $u+ + +tud $u+ // can +tudok $u+ +tudsz $u+ +tudunk $u+ +tudtok $u+ +tudnak $u+ + + +// Main Exceptions List +//===================== + diff --git a/dictsource/hu_rules b/dictsource/hu_rules new file mode 100644 index 00000000..8a95804d --- /dev/null +++ b/dictsource/hu_rules @@ -0,0 +1,220 @@ +// Hungarian translation rules +// This file is UTF-8 encoded + + +.group a + a A + +.group á + á a: + +.group b + b b + bb b: + +.group c + c ts + cc ts: + cs tS + ccs tS: + +.group d + d d + dd d: + dz dz + A) dz (A dz: + dzs dZ + A) dzs dZ: + + C) ds tS + ds (C tS + A) ds (A tS: + dsz dz + dsz (C ts + A) dsz (A ts: + dz dz + A) dz (A d:z + C) dzs Z + A) dzs (A Z: + C) dj J + A) dj (A J: + + +.group e + e E + + D_-_) es (_ %ES + +.group é + é e: + +.group ë + ë e + +.group f + f f + +.group g + g g + gg g: + gy J + ggy J: + + gys tS + A) gys (A tS: + gysz ts + A) gysz (A ts: + gyz dz + A) gyz (A d:z + C) gyzs Z + A) gyzs (A Z: + C) gyj J + A) gyj (A J: + +.group h + h h + h (_ + +.group i + i i + +.group í + í i: + +.group j + j j + C) j (K C + +.group k + k k + kk k: + +.group l + l l + ly j + lj jj + +.group m + m m + +.group n + n n + n (g N + n (k N + n (p m + n (b m + ny n^ + ny (k N + ny (g N + + nj n^ + nyj n^ + + +.group o + o o + +.group ó + ó o: + +.group ö + ö Y + +.group ő + ő Y: + +.group p + p p + pp p: + +.group q + q kv + qu kv + +.group r + r r + A) r (A * + C) r (A @-* + rr *r + +.group s + s S + sz s + ssz ss2 + +.group t + _) t (_ te: + -) t (_ t + t t + tt t: + ty c + tty c: + + ts tS + A) ts (A tS: + tys tS + A) tys (A tS: + tsz ts + A) tsz (A ts: + tysz ts + A) tysz (A ts: + tz dz + A) tz (A d:z + tyz dz + A) tyz (A d:z + C) tzs Z + A) tzs (A Z: + C) tyzs Z + A) tyzs (A Z: + C) tj c + A) tj (A c: + C) tyj c + A) tyj (A c: + + +.group u + u u + +.group ú + ú u: + +.group ü + ü y + +.group ű + ű y: + +.group v + v v + +.group w + w v + +.group x + x ks + +.group y + y j + K) y (K i + +.group z + z z + zs Z + + +.group + % sa:zAle:k + $ dolla:r + @ kukAts + € Eu*o + + plus + + . pont + . (. _: + \.) . + + + * tS'illAg // asterisk + *) * (* + ** + **) * (_ _:: diff --git a/dictsource/it_list b/dictsource/it_list new file mode 100644 index 00000000..24e4c3f8 --- /dev/null +++ b/dictsource/it_list @@ -0,0 +1,369 @@ +// This file is UTF-8 encoded + +// Italian: any [E] or [O] phonemes in unstressed words must be listed explicitly + +// Letters +// If a letter has a "word" pronunciation which is different from its +// "letter" name, then include the letter name here, with the letter +// prefixed by a _ character. +_e e: +_i i: +_o O: + +// character names +_cap k'apital +_?? s'imbolo + +_! p'Untoesklamat'ivo +_" virgolet:e +_# kantSellet:o +_$ dolla:ro +_% pertS'ento +_& _!e: +_' ap'Ostrofo +_( ap'ertapar'entezi +_) kj,Uzapar'entezi +_* asterisko +_+ pjU +_, v'irgola +_- trat:ino +_. pUnto +_/ slaS +_: d,Uep'Unte +_; p'Untoev'irgola +_< ap'erta'angolo +_= Ugwale +_> kj,Uza'angolo +_? p'UntointeRogat'ivo +_@ ki'otS:ola +_[ ap'ertakw'adra +_\ bakslaS +_] kj,Uzakw'adra +_^ kap:UtS:o +__ 'Underskore +_` bakpraIm +_{ ap'ertagr'af:a +_| b'aRa +_} kj,Uzagr'af:a +_~ tilde + + + +// numbers +_0 dz'eRo +_1 'Uno +_2 d'Ue +_3 tR'e +_4 kw'at:Ro +_5 tS'inkwe +_6 s'ej +_7 s'Et:e +_8 'Ot:o +_9 n'Ove +_10 di'etSi +_11 'unditSi +_12 d'oditSi +_13 tr'editSi +_14 kwat:'OrditSi +_15 kw'imditSi +_16 s'editSi +_17 ditSas:'Et:e +_18 ditS'Ot:o +_19 ditSann'ove +_2X v'ente +_3X tr'enta +_4X kwar'anta +_5X tSinkw'anta +_6X sess'anta +_7X set:'anta +_8X ot'anta +_9X nov'anta +_0C tS'ento +_0M1 m'ila +_1M1 m'ille +_0M2 mili'oni +_1M2 unmili'one +_0M3 mili'ardi +_1M3 unmili'ardo +_0M4 bili'oni +_1M4 unbili'one +_dpt _v'irgola +_0Z2 tSent'ezimi // 100ths +_0Z3 mill'ezimi // 1000ths + +// abbreviations +(http ://) 'ak:at,i:t,i:p'i:_ + +// articles +i $u +il $u +la $u +le $u +lo $u +un $u +una $u + +gli l^i $u + + +// pronouns +io $u+ +tu $u+ +lui $u+ +lei $u+ +noi $u+ +voi $u+ +loro $u+ + +egli $u+ +ella $u+ +essa $u+ +esse $u+ +essi $u+ + +mi $u+ +ti $u+ +si $u+ +ci $u+ +vi $u+ +li $u+ + + +// words that double the following consonant +qualche $double +come $double + +// possessive adjectives +mio $u +tuo $u +suo $u +nostro $u +vostro $u +loro $u +mia $u +tua $u +sua $u +nostra $u +vostra $u +miei $u +tuoi $u +suoi $u +nostri $u +vostri $u +mie $u +tue $u +sue $u +nostre $u +vostre $u + +questo $u // this +questa $u // this +questi $u // these +queste $u // these + +quel $u // that +quella $u // that +quei $u // those +quegli $u // those +quelle $u // those + + + +// conjunctions +e $u $pause $double // and +ed $u $pause +o $u $pause $double // or +se $pause // if +ma $pause // but +perché $pause // because +benchè $pause // though +anche $pause // although +tuttavia $pause // however +invece $pause // instead +malevolenza $pause // despite +pertanto $pause // therefore +né $pause // neither-nor + +(in cui) in||kw2,i $pause // in which +che $u $pause // which + + +// prepositions +a $u $double +al $u +allo $u +alla $u +ai $u +agli $u +alle $u + +ad $u $brk + +da $u $brk // by +dal $u +dallo $u +dalla $u // by the +dai $u +dagli $u +dalle $u + +di $u $brk // of +del $u +dello $u +della $u // of the +dei $u +degli $u +delle $u +de $u + +in $u $brk // in +nel $u $brk +nello $u $brk +nella $u $brk // in the +nei $u $brk +negli $u $brk +nelle $u $brk +ne $u $brk + +su $u $double // on +sul $u +sullo $u +sulla $u // on the +sui $u +sugli $u +sulle $u + +con $u $pause // with +col $u +coi $u + +attraverso $u+ $brk // across, through +contro $u+ $brk // against +accanto $u+ $brk // beside +verso $u+ $brk // toward +sopra $u+ $brk // above +sotto $u+ $brk // below +per $u $pause // for +eccetto $pause // except +senza $pause // without +durante $pause // during + + +// aux verb, to be +sono $u +sei $u +è E $u $double +siamo $u +siete $u +sono $u +fui $u +fosti $u +fu $u $double +fummo $u +foste $u +furono $u +ero $u +eri $u +era $u +eravamo $u +eravate $u +erano $u +sarò sa/r'O $u +sarai $u +sarà $u +saremo $u +srete $u +saranno $u + +sia $u +siate $u +siano $u +fossi $u +fosse $u +fossimo $u +fossero $u +sarei $u +saresti $u +sarebbe $u +saremmo $u +sareste $u +sarebbero $u + +// aux verb, to have +ho $u $double +hai $u $double +ha $u $double +abbiamo $u +avete $u +hanno $u + +ebbi $u +avesti $u +ebbe $u +avemmo $u +aveste $u +ebbero $u + +avevo $u +avevi $u +aveva $u +avevamo $u +avevate $u +avevano $u + +avrò a/vr'O $u +avrai $u +avrà $u +avremo $u +avrete $u +avranno $u + +abbia $u+ +abbiamo $u+ +abbiate $u+ +abbiano $u+ +avessi $u +avesse $u +avessimo $u +aveste $u +avessero $u + +avrei $u +avresti $u +avrebbe $u +avremmo $u +avreste $u +avrebbero $u + +// to do/make +fare $u+ +faccio $u+ +facciamo $u+ +fai $u+ +fate $u+ +fa $u+ +fanno $u+ + +facevo $u+ +facevi $u+ +faceva $u+ +facevamo $u+ +facevate $u+ +facevano $u+ + + +// exceptions +aereo $2 +difficile $2 +pneumatici $3 + +nott nOt: $stem +tavol $1 $stem +vent vEnt $stem + +celsius tsElsj'us +conoscerla $1 +no nO +posta pOsta +tesser tess'Er +uomini $1 diff --git a/dictsource/it_rules b/dictsource/it_rules new file mode 100644 index 00000000..6fe308d8 --- /dev/null +++ b/dictsource/it_rules @@ -0,0 +1,347 @@ +// translation rules +// This file is UTF-8 encoded + + +.group a + _) a(_ a: + a a: + a (CK a + ai aI (K + ao (_ aU + + &) a (_S1q a // lookup it_list without suffix + + @) a (ce_ =a + @) a (ci_ =a + a (ista_ a + a (ismo_ a + @) a (bile_ 'a + @) a (ggine_ 'a + + _) ae (ro aI + @) avano (_S5 'avano + +.group b + _) b(_ bi: + b b + bb b: + +.group c + _) c(_ tSi: + c k + cc k: + c (e tS + c (é tS + c (è tS + c (i tS + c (ì tS + cc (e tS: + cc (é tS: + cc (è tS: + cc (i tS: + cc (ì tS: + ch k + cch k: + ci (a tS + ci (à tS + ci (o tS + ci (ò tS + ci (u tS + ci (ù tS + cci (a tS: + cci (à tS: + cci (o tS: + cci (ò tS: + cci (u tS: + cci (ù tS: + +.group d + _) d(_ di: + d d + dd d: + +.group e + _) e(_ e: + e e: + e (CK e + ei ej (K + + &) e (_S1q e // lookup it_list without suffix + @) e (ce_ =e + @) e (ci_ =e + + @) e (nte_ E + @m) e (nte_ e + @) e (nza_ E + @) e (vole_ 'e + @) e (rrimo_ 'E + @) e (simo_ 'e + + @) evano(_S5 'evano + + +.group f + _) f(_ Effe + f f + + @A) f (ico_ =f + @A) f (ilo_ =f + @A) f (ero_ =f + +.group g + _) g(_ dZi: + g g + gg g: + gh g + g (e dZ + g (é dZ + g (è dZ + g (i dZ + g (ì dZ + gi (a dZ + gi (à dZ + gi (o dZ + gi (ò dZ + gi (u dZ + gi (ù dZ + gg (e dZ: + gg (é dZ: + gg (è dZ: + gg (i dZ: + gg (ì dZ: + ggi (a dZ: + ggi (à dZ: + ggi (o dZ: + ggi (ò dZ: + ggi (u dZ: + ggi (ù dZ: + gl (i l^ + gl (ì l^ + gli (A l^ + _) gl gl + gn n^ + gu (A gw + + @) g (ero_ =g + + +.group h + _) h(_ ak:a + h + +.group i + _) i(_ i: + i i: + i (CK i + i (A j + l) i (A %i + r) i (A %i + _C) i (a i + i (o i + i (ò i + @) ia (_ =i%a + @) io (_ =i%o + a) i (+ j + e) i (+ j + o) i (+ j + + &) i (_S1q i // lookup it_list without suffix + + @) i (ce_ =i + @) i (ci_ =i + @) i (de_ =i + @) i (do_ =i + @) i (le_ =i + @) i (li_ =i + @) iera (_ i'E:ra + @) iere (_ i'E:re + @) i (ente_ i + @) i (ante_ i + @) i (bile_ 'i + @) issimo(_S6 'issimo + @) issero(_S6 'issero + + +.group j + _) j(_ dZe:j + j j + +.group k + _) k(_ kap:a + k k + kk k: + +.group l + _) l(_ Elle + l l + ll (C l_ + ll (_ l + +.group m + _) m(_ Emme + m m + +.group n + _) n(_ Enne + n n + n (g N + n (k N + +.group o + _) o(_ O: + o o: + o (CK o + oi oI (K + + &) o (_S1q o // lookup it_list without suffix + + @) o (ista_ o + @) o (ismo_ o + @) o (gnolo_ 'o + @) o (nzolo_ 'o + @) o (grafo_ 'O + @) o (fono_ 'O + @) o (metro_ 'O + @) o (logo_ 'O + + +.group p + _) p(_ pi: + p p + pp p: + _) pn (@@ n + _) ps (A@ s + +.group q + _) q(_ ku: + q kw + qu kw + +.group r + _) r(_ ERRe + r R + rr RR + A) r (A r + +.group s + _) s(_ Esse + s z + _) s s + + l) s s + p) s s + k) s s + s (c s + s (f s + s (k s + s (p s + s (q s + ss ss + s (t s + s (x s + sc (e S + sc (é S + sc (è S + sc (i S + sc (ì S + A) sc (e SS + A) sc (é SS + A) sc (è SS + A) sc (i SS + A) sc (ì SS + sch (e sk + sch (é sk + sch (è sk + sch (i sk + sch (ì sk + sh (K S // foreign words + K) sh S // foreign words + + +.group t + _) t(_ ti: + t t + tt t: + +.group u + _) u(_ U: + u U: + u (CK U + u (A w2 + Kr) u (A U + Kl) u (A U + + @) u (dine_ 'u + @) u (colo_ 'u + +.group v + _) v(_ vU: + v v + +.group w + _) w(_ d'op:jav'U + w w2 + +.group x + _) x(_ 'iks + x ks + +.group y + _) y(_ 'ipsilon + y j + y (K i // foreign words + + +.group z + _) z(_ ze:ta + z ts + A) z ts: + A) zz ts: + + _) z (i dz + +.group + à 'a: + à (CK 'a + é 'e: + é (CK 'e + è 'E: + è (CK 'E + ì 'i: + ì (CK 'i + ó 'o: + ó (CK 'o + ò 'O: + ò (CK 'O + ù 'U: + ù (CK 'U + + % pertS'ento + $ dolla:ro + ₤ lira + £ sterl'ina + & _!e + @ ki'otS:ola + © k'opiraIt + + pjU + . pUnto + , (D v'irgola + : d,Uep'Unte + ; p'Untoev'irgola + ! _p'Untoesklamat'ivo_ + !) ! + ? _p'UntointeRogat'ivo_ + ?) ? + \\ bakslaS + / slaS + + __) - (_D meno + A_) - (_D _ + C_) - (_D _ + --) - + − meno + + * asterisko + *) * (* + ** + **) * (_ _:: diff --git a/dictsource/nl_list b/dictsource/nl_list new file mode 100644 index 00000000..dd29a71b --- /dev/null +++ b/dictsource/nl_list @@ -0,0 +1,209 @@ + +// This file in UTF8 encoded + +// Letters +// If a letter has a "word" pronunciation which is different from its +// "letter" name, then include the letter name here, with the letter +// prefixed by a _ character. + +_s Es +_t te: + +_. p8nt + +// numbers +_0 n'8l +_1 'e:n +_2 tv2'e: +_3 dr'i +_4 f'ir +_5 f'EIf +_6 z'Es +_7 z'e:f@n +_8 'Axt +_9 n'e:x@n +_10 t'in +_11 'Elf +_12 tw'Alf +_13 d'e:rtin +_14 f'e:rtin +_15 f'EIftin +_16 z'Estin +_17 z'e:f@ntin +_18 'Axtin +_19 n'e:x@ntin +_2X tv2'Int@x +_3X d'e:rt@x +_4X f'e:rt@x +_5X f'EIft@x +_6X z'Est@x +_7X z'e:f@nt@x +_8X t'Axt@x +_9X n'e:g@nt@x +_0C h'OndErt +_0M2 d'WyzEnt +_1M1 d'WyzEnt +_0M2 m'iljun +_0M3 m'iljArt +_0M4 b'iljun +_0and En +_dpt _k'Oma: + + +// articles +de d@ +het h@t +een @n + + +// pronouns +ik $u +me $u +jij $u +je $u +gij $u +ge $u +u $u +hij $u +zij $u +ze $u +het $u +wij $u +we $u +jullie $u +hen $u +zich $u + +// possessives +mijn $u +m'n m@n +jouw $u +uw $u +zijn $u +z'n $u +haar $u +d'r $u +ons $u +onze $u +jullie $u +hun $u + +// demonstrative +deze $u +die $u $brk +dit $u +dat $u +wat $u +er $u +waar $pause + +// prepositions +in $u+ $brk // in +op $u+ $brk // in +aan $u+ $pause // at, on +bij $u+ $pause // at, near +om $u+ $brk // at +met $u+ $pause // with, by +over $u+ $pause // about +na $u+ $pause // after +door $u+ $pause // through, by +tot $u+ $pause // until +uit $u+ $pause // from, out of +voor $u+ $pause // for, in front of +van $u+ $brk // from, of +zonder $u+ $pause // without + + +// conjunctions +en $u $pause // and +dus $u $pause // so +maar $u $pause // but +of $u $pause // or +want $u $pause // for + +als $u $pause // if,when +alsof $pause // as if +behalve $pause // except +dat $u $pause // that +hoewel $pause // although +of $u $pause // whether +omdat $pause // because +nadat $pause // after +nudat $pause // now that +sinds $pause // since +tenzij $pause // unless +terwijl $pause // while +totdat $pause // until +toen $pause // when (in past) +voordat $pause // before +wanneer $pause // when +zoals $pause // just +zolang $pause // as long as +zover $pause // as far as + + + +// negative +niet $u+ + + +// questions + + +// auxillary verbs (be, have, can, etc) +zijn $u // to be +ben $u +bent $u +is $u +was $u +waren $u +geweest $u + +hebben $u // to have +heb $u +hebt $u +heeft $u +hadden $u +gehad $u + +zullen $u // will, shall +zal $u +zult $u +zou $u +zouden $u + +kunnen $u // can +kan $u +kunt $u +kon $u +konden $u +gekund $u + +mogen $u // to be allowed +mag $u +mocht $u +mochten $u +gemogen $u + +willen $u // to want +wil $u +wilt $u +wou $u +wilde $u +wilden $u +gewild $u + +worden $u +wordt $u +werd $u + +// some common adjectives and adverbs + + +// Pronounce as English +game _^_EN +player _^_EN +the _^_EN + +// pronunciation exceptions + diff --git a/dictsource/nl_rules b/dictsource/nl_rules new file mode 100644 index 00000000..21526d6a --- /dev/null +++ b/dictsource/nl_rules @@ -0,0 +1,238 @@ +// This file is UTF-8 encoded + +.group a + _) a (_ a: + a a: + a (CC A + a (C_ A + aa a: + aai a:j + au VU + ay a:j + + +.group b + _) b (_ be: + b b + bb b + b (_N p + bs (_N ps + + _) be (@P2 b@ + _) bee be: + _) beu bY: + + +.group c + _) c (_ se: + c (e s + c (i s + c k + a) ch x + o) ch x + ch C + + +.group d + _) d (_ de: + d d + dd d + dt t + d (_N t + ds (_N ts + + +.group e + _) e (_ e: + e e: + C) e (_ @ + e (CC E + e (C_ E + e (r I: + eï (+ @_I + ei (+ EI + ee (r I: + ee e: + eeuw eU + eu Y: + @) en (_ @n + @) er (_ @r + @) eren (_ @r@n + eau o: //words with French origin + + _) er (@P2 Er + + &) e (nB@ @ + &) e (rC@ @ + + +.group f + _) f (_ Ef + f f + ff f + + +.group g + _) g (_ Qe: + g x + _) g Q + gg g + + _) ge (@P2 Q@ + _) gee Qe: + _) geu QY: + + +.group h + _) h (_ hA: + h h + C) h (K + + _) her (@P3 hEr + + +.group i + _) i ( i: + i i + ij (+ EI + i (CC I + i (C_ I + ie i + ieuw iw + + @) ig (_ @x + + +.group j + _) j (_ je: + j j + + +.group k + _) k (_ kA + k k + kk k + + +.group l + _) l (_ El + l l + ll l + @) lijk lIk + + +.group m + _) m (_ Em + m m + mm m + + +.group n + _) n (_ En + n n + nn n + ng (_ N + nj n^ + + +.group o + _) o (_ o: + o o: + o (CC O + o (C_ O + o (r o: + oo (r o: + ooi o:j + oo o: + oe u + oei uj + ou VU + + _) ont (@P3 Ont + _) onder Ond@r + + +.group p + _) p (_ pe: + p p + pp p + + +.group q + _) q (_ ky + q k + qu kv + + +.group r + _) r (_ Er + r r + A) r (A * + C) r (A @-* + rr *r + + +.group s + s s + ss s + sch s; + sj S + + +.group t + _) t (_ te: + t t + tt t + tie (_ tsi + tj t; + tsj tS + + +.group u + _) u (_ y + u y + u (CC 8 + u (C_ 8 + uu y + ui Wy + uw yU + uw (_ yU + + +.group v + _) v (_ fe: + v v + + _) ver (@P3 v@r + + +.group w + _) w (_ ve: + w v2 + + +.group x + _) x (_ Iks + x ks + + +.group y + _) y (_ EI + y i + + +.group z + _) z (_ zEt + z z + + + +.group + éé e: + , (D k'Oma: + % pro:s'Ent + @ 'a:pEnst,a:rt;@ + + . p8nt + . (. _: + \.) . diff --git a/dictsource/no_list b/dictsource/no_list new file mode 100755 index 00000000..2c99c726 --- /dev/null +++ b/dictsource/no_list @@ -0,0 +1,168 @@ + +// This file in UTF8 encoded + +// Letters +// If a letter has a "word" pronunciation which is different from its +// "letter" name, then include the letter name here, with the letter +// prefixed by a _ character. + + +// character names +//**************** + + +// numeric +//******** +_0 n'Ul +_1 'E:n +_2 t'u: +_3 tr'e: +_4 f'i:rE +_5 f'E:m +_6 s'Eks +_7 S'u-: +_8 'Ot:@2 +_9 n'i: + + + + +// abbreviations +//************** + + +// articles +en $u +et $u +ei $u + + +// pronouns +jeg $u+ +du $u+ +han $u+ +hun $u+ +vi $u+ +dere $u+ +de $u+ + +meg $u+ +deg $u+ +ham $u+ +henne $u+ +oss $u+ +dere $u+ +dem $u+ + +denne $u+ +dette $u+ +disse $u+ +den $u+ +det $u+ +de $u+ + + +// possessive adjectives +min $u+ +mi $u+ +mitt $u+ +mine $u+ +din $u+ +di $u+ +ditt $u+ +dine $u+ +hans $u+ +hennes $u+ +vår $u+ +vårt $u+ +våre $u+ +deres $u+ +sin $u+ +si $u+ +sitt $u+ +sine $u+ + + +// prepositions +i $u $brk // in +å $u $brk // to +av $u $brk // of, off, by +bak $pause // behind +etter $u $pause // after +for $u $pause // for +foran $pause // in front of +fra $u $pause // from +in $u $brk // in +innen $pause // within +hos $u $pause // with, by, at +langs $u $pause // along +med $u $pause // with +mellom $pause // between +mens $u $pause // while +mot $u $pause // against, towards +ned $pause // down +om $u $brk // about +over $brk // over +på $u $brk // on +som $u $pause // as, that, which +til $u $brk // to +under $brk // under +uten $brk // without + +// conjunctions +at $u $pause // that +og $u $pause // and +samt $u $pause // and +men $u $pause // but +så $u $pause // so +fordi $pause // because +før $pause // before +hvis $u $pause // if +dersom $pause // if +eller $u $pause // or +enn $u $pause // than +mens $pause // while + +// negative +ikke $u + +// questions + + +// auxillary verbs (be, have, can, etc) + +være $u+ +er $u +var $u +vært $u + +ha $u+ +har $u +hadde $u +hatt $u + +// bli +blir $u+ +ble $u+ +blitt $u+ + +vil $u+ +kan $u+ +kunne $u+ +kunnet $u+ + +skal $u+ +skulle $u+ +skullet $u+ + +bør $u+ + + + +// some common adjectives and adverbs +bare $u // only +også $brk // also + + +// MAIN WORD DICTIONARY +//********************* diff --git a/dictsource/no_rules b/dictsource/no_rules new file mode 100644 index 00000000..e712609a --- /dev/null +++ b/dictsource/no_rules @@ -0,0 +1,195 @@ + +// This file is UTF8 encoded + +// C% indicates a double consonant (same letter twice) + + +.group a + a A: + a (C% A + a (_ A + ai AI + au aU + + aa o: // å + aa (C% O + ae a: // æ + ae (C% a + +.group b + b b + bb b: + + _) be (@ b@ + + +.group c + c k + cc k: + c (i s + c (y s + c (ei s + c (øy s + ch S + +.group d + d d + dd d: + r) d (_ + +.group e + e e: + e (C% E + ei aI + e (rC a // ?? + &) e (_ @2 + &) e (C_ @ + &) en (_ @n + &) ens (_ @ns + &) es (_ @s + &) et (_ @t + +.group f + f f + +.group g + g g + gg g: + g (n N + gj j + g (i j + g (y j + g (ei j + g (øy j + +.group h + h h + hj j + hv v + +.group i + i i: + i (C% I + &) ig (_ I + +.group j + j j + +.group k + k k + kk k: + kj x + k (i x + k (y x + k (ei x + k (øy x + +.group l + l l + lj j + +.group m + m m + +.group n + n n + ng N + n (k N + +.group o + o u: + o (C% O + oi OI + + oe Y: // ø + oe (C% W + oey Yy + + o (nd U + o (rt U + o (st U + +.group p + p p + pp p: + +.group q + q k + qq k: + qu kw + +.group r + r r + r) r + rs (_ S + +.group s + s s + ss ss + sch S + sj S + skj S + sk (i S + sk (y S + sk (ei S + sk (øy S + r) s S + s (l S + A) s (lA s + +.group t + t t + tt t: + ti (on S + tj s; + + + +.group u + u u-: + u (C% u- + ui u-I + +.group v + v v + +.group w + w v + +.group x + x ks + x (x + +.group y + y y: + y (C% y + +.group z + z s + zz z + +.group å + å o: + å (C% O + +.group æ + æ E: + æ (r a: + æ (C% a + +.group ø + ø Y: + ø (C% W + øy Yy + +.group ä + ä E: + ä (C% E + +.group ö + ö Y: + ö (C% W + +.group + é 'e: + diff --git a/dictsource/pl_list b/dictsource/pl_list new file mode 100644 index 00000000..267c03fe --- /dev/null +++ b/dictsource/pl_list @@ -0,0 +1,2209 @@ + +// This file is UTF8 encoded + +// Letters +// If a letter has a "word" pronunciation which is different from its +// "letter" name, then include the letter name here, with the letter +// prefixed by a _ character. + +// Numbers +_0 z'ErO +_1 j'EdEn +_2 dv'a +_3 t|S'y +_4 tSt'Ery +_5 p;'En^ts; +_6 S'ES;ts; +_7 S;'EdEm +_8 'OS;Em +_9 dz;'Ev;En^ts; +_10 dz;'ES;En^ts; +_11 jEdEn'aS;ts;E +_12 dvan'aS;ts;E +_13 t|Syn'aS;ts;E +_14 tStErn'aS;ts;E +_15 pjEtn'aS;ts;E +_16 SEsn'aS;ts;E +_17 S;EdEmn'aS;ts;E +_18 OS;Emn'aS;ts;E +_19 dz;Ev;Etn'aS;ts;E +_2X dvadz;'ES;ts;a +_3X t|Sydz;'ES;c;i +_4X tStErdz;'ES;c;i +_5X p;En^dz;'ES;Ont +_6X SEZ;dz;'ES;Ont +_7X S;EdEmdz;'ES;Ont +_8X OS;Emdz;'ES;Ont +_9X dz;Ev;En^dz;'ES;Ont + +_1C st'O +_2C dv;'ES;c;E +_3C t|S'ysta +_4C tCt'Erysta +_5C p;'En^ts;sEt +_6C S'ES;sEt +_7C S;'EdEmsEt +_8C 'OS;EmsEt +_9C dz;'Ev;En^ts;sEt + +_0M1 tyS;'Entsy +_1M1 t'yS;Onts +_0MA1 tyS;'OntsE // alternative form +_0MA2 m;ilj'Ony +_1M2 m;'iljOn +_0M2 m;ilj'Onuf +_0MA3 m;ilj'ardy +_1M3 m;'iljard +_0M3 m;ilj'arduf +_0MA4 b;ilj'Ony +_1M4 b;'iljOn +_0M4 b;ilj'Onuf + +_dpt _pSEts;'inEk_ + +_a a +ą O~ +b bE +c tsE +ć ts;i +d dE +e E +ę E~ +f Ef +g gjE +h xa +_i i +j jOt +k ka +l El +ł Ew +m Em +n En +ń En^ +_o O +ó ,u_ krEskOv'anE +p pE +q ku +r Er +s Es +ś ES; +t tE +_u u +v faw +_w wu +x iks +y 'igrEk +_z zEt +ż ZEt +ź Z;jEt + +// all my keyboard... + +_! vykSykn^ik +_= *'uvna||S;E +_< mn^EjSE +_> w;ENkSE +_" tsudzyswuf +_. k@-*Opka +_, pSEts;inEk +_- myS;lnik // or minus? +_? znak||zapytan^a +_~ tylda +__ pOdkrES;lEn^E +_: dvuk@-*OpEk +_; S;@-*Edn^ik +_( lEvy||nav;as +_) p@-*avy||nav;as +_[ lEvy||nav;as||kvad@-*atOvy +_] p@-*avy||nav;as||kvad@-*atOvy +_{ lEvy||nav;as||klam@-*atOvy +_} p@-*avy||nav;as||klam@-*atOvy +_' apOst@-*Of +_/ dz;ElOnE +_* gv;astka +_\ bEkslES +_| k@-*Eska||p;OnOva +_# haS +_$ dOla* +_% p@-*OtsEnt +_^ pOtENga // what's be better? +_& ampE*sant +_` Odv@-*Otny||apOst@-*Of + +// some exceptions +arcus arkus +jebut $2 +babach $2 +rock rOk + +maximum $1 +maksimum $1 +minimum $1 +optimum $1 + +// wice- arcy- archi- with single-syllable nouns +wicekról $3 +archidiak $3 +archirej $3 +arcyleń $3 +arcyłgarz $3 +arcyłotr $3 +arcymag $3 +arcymistrz $3 +arcypies $3 + +// pronouns +ja $u+ // I +ty $u+ // you (sng) +on $u+ // he +ona $u+ // she +ono $u+ +my $u+ // we +wy $u+ // you +oni $u+ // they (m) +one $u+ // they (f) +się $u // (reflexive) + +który $u+ // which,what,that (+declines) +którego $u+ +któremu $u+ +którym $u+ +która $u+ +którą $u+ +której $u+ +które $u+ +których $u+ +którzy $u+ +niektóry $u+ // some (+declines) +niektórego $u+ +niektóremu $u+ +niektórym $u+ +niektóra $u+ +niektórą $u+ +niektórej $u+ +niektóre $u+ +niektórych $u+ +niektórzy $u+ + +to $u // this +tego $u $strend2 +temu $u $strend2 +tym $u $strend2 +ta $u $strend2 +tej $u $strend2 +tą $u $strend2 +ci $u $strend2 +te $u $strend2 +tych $u $strend2 +tymi $u $strend2 +ten $u $strend2 + +mi $u +mu $u +jej $u +mnie $u +jemu $u +im $u +ich $u +wam $u +dla $u + +od $u + +// questions +czy $u +czemu $u+ +czym $u1+ +czyj $u $strend2 // does not work hgw why +czyim $u+ + +// prepositions +w wy $u $atend +z zy $u $atend +na $u+ // in/on +po $u+ +do $u+ +we $u +o $u+ +obok $u+ // near/next to +przy $u+ // near/at +nad $u+ // over +pod $u+ +między $u+ // between +przed $u+ // in front of, before +za $u+ // beyond, at the back + +// misc +nie $u+ // not, no +taki $u+ // such + +// verbs + +być $u+ // to be +jestem $u+ // am +jesteś $u+ // are +jest $u+ // is +jesteśmy $u+ // (we) are +jesteście $u+ // (you) are +są $u+ // (they) are +byłem $u+ // past +byłam $u+ +byłeś $u+ +byłaś $u+ +był $u+ +była $u+ +było $u+ +byliśmy $u+ +byliście $u+ +byli $u+ +byłyśmy $u+ +byłyście $u+ +były $u+ +będę $u+ // future +będziesz $u+ +będzie $u+ +będziemy $u+ +będziecie $u+ +będą $u+ + +mieć $u+ // to have +mam $u+ +masz $u+ +ma $u+ +miałem $u+ +miałaś $u+ +miał $u+ +mamy $u+ +macie $u+ +mają $u+ +mieliśmy $u+ +mieliście $u+ +mieli $u+ +miałyśmy $u+ +miałyście $u+ +miały $u+ + +// conjunctions +a $u $brk // and/but +i $u $brk // and +oraz $u $brk // and +bo $pause // because +gdyż $pause // because +ponieważ $pause // because +ale $u+ $brk // but +ani $u+ $pause // neither +też $pause // also, as well, too +przecież $u+ $pause // after all +tylko $u+ + +//dr, mgr and so... + +dr d'OktOr $dot +mgr mag'istEr $dot +doc d'OtsEnt $dot +prof prOf'EsOr $dot +hab habilitOv'any $dot +inż inZ'yn^Er $dot +mec mEtsEnas $dot +ks kS;Onts $dot +bp biskup $dot +bpa biskupa +hr h@-*ab;ja $dot + +gen gEnE*aw $dot +płk puwk'Ovnik $dot // declinated forms in pl_rules +ppłk pOtpuwk'Ovnik $dot +mjr m'ajOr $dot +kpt kap'itan $dot +por pOr'utSn^ik $dot +ppor pOdpOr'utSn^ik $dot +kpr kap@-*al $dot + +// abbr + +tzn tO||znatSy $dot +itd i||tak||dalEj $dot +itp i||tEmu||pOdObnE $dot +etc Ets'EtE*a $dot +św S;v;Enty $dot +śp S;v;EntEj||pam;En^ts;i $dot + +// words marked with $alt2 are combined with word marked with $alt +// (used for 'nie' with single-syllable verbs) + +nie $u $alt2 +ni $u $alt2 + +// autogenerated + +bacz $alt +bać $alt +baw $alt +bądź $alt +becz $alt +bić $alt +bij $alt +bił $alt +bladł $alt +blakł $alt +błądź $alt +błoć $alt +błyszcz $alt +bocz $alt +boć $alt +bódł $alt +bódź $alt +bój $alt +bóść $alt +brać $alt +brak $alt +brakł $alt +bredź $alt +brną $alt +brnąc $alt +brnąć $alt +brnął $alt +brnę $alt +brnie $alt +brniesz $alt +brnij $alt +brocz $alt +broć $alt +brodź $alt +broń $alt +bródź $alt +brudź $alt +bruźdź $alt +brzęcz $alt +brzmi $alt +brzmiał $alt +brzmią $alt +brzmiąc $alt +brzmię $alt +brzmij $alt +brzmioł $alt +brzmisz $alt +brzydł $alt +brzydź $alt +bycz $alt +być $alt +był $alt +bzdurz $alt +bzycz $alt +bździ $alt +bździć $alt +bździł $alt +bździsz $alt +bżdżą $alt +bżdżąc $alt +bżdżę $alt +cedź $alt +charcz $alt +chcą $alt +chcąc $alt +chce $alt +chceń $alt +chcesz $alt +chcę $alt +chciał $alt +chcieć $alt +chciej $alt +chcioł $alt +chlać $alt +chlaj $alt +chlał $alt +chlap $alt +chlaszcz $alt +chlej $alt +chlip $alt +chloć $alt +chloł $alt +chlup $alt +chłepcz $alt +chłoszcz $alt +chłódł $alt +chłódź $alt +chmurz $alt +chodź $alt +chódź $alt +chrap $alt +chroń $alt +chrup $alt +chrypł $alt +chrzań $alt +chrzci $alt +chrzcić $alt +chrzcij $alt +chrzcił $alt +chrzcisz $alt +chrzczą $alt +chrzcząc $alt +chrzczę $alt +chrzęść $alt +chudł $alt +chwal $alt +chwiać $alt +chwiał $alt +chwiej $alt +chwioć $alt +chwioł $alt +chwyć $alt +chyl $alt +ciąć $alt +cichł $alt +ciec $alt +ciekł $alt +cierp $alt +cierpł $alt +ciesz $alt +clą $alt +cląc $alt +clę $alt +cli $alt +clić $alt +clij $alt +clił $alt +clisz $alt +cnić $alt +cnię $alt +cnij $alt +cnił $alt +cnisz $alt +cuć $alt +czaj $alt +czci $alt +czcić $alt +czcij $alt +czcił $alt +czcisz $alt +czczą $alt +czcząc $alt +czczę $alt +czesz $alt +czkać $alt +czkaj $alt +czkał $alt +czkam $alt +czkasz $alt +czkną $alt +czknąć $alt +czknął $alt +czknę $alt +czknie $alt +czkniesz $alt +czknij $alt +czkoć $alt +czkoł $alt +czkom $alt +człap $alt +czuj $alt +czuł $alt +czyń $alt +czyść $alt +ćmi $alt +ćmią $alt +ćmiąc $alt +ćmić $alt +ćmię $alt +ćmij $alt +ćmił $alt +ćmisz $alt +ćpa $alt +ćpać $alt +ćpaj $alt +ćpał $alt +ćpam $alt +ćpasz $alt +ćpoć $alt +ćpoł $alt +ćpom $alt +ćwicz $alt +dać $alt +daj $alt +dał $alt +dam $alt +dasz $alt +dąć $alt +dął $alt +dąż $alt +dbać $alt +dbaj $alt +dbał $alt +dbam $alt +dbasz $alt +dboć $alt +dboł $alt +dbom $alt +depcz $alt +dłub $alt +dmąc $alt +dmij $alt +dniał $alt +dnieć $alt +dniej $alt +dnioł $alt +doć $alt +dojdź $alt +dojść $alt +doł $alt +dom $alt +dój $alt +drap $alt +drą $alt +drąż $alt +drepcz $alt +drę $alt +dręcz $alt +drga $alt +drgać $alt +drgaj $alt +drgał $alt +drgam $alt +drgasz $alt +drgną $alt +drgnąć $alt +drgnął $alt +drgnę $alt +drgnie $alt +drgniesz $alt +drgnij $alt +drgoć $alt +drgoł $alt +drgom $alt +drwią $alt +drwiąc $alt +drwić $alt +drwię $alt +drwij $alt +drwił $alt +drwisz $alt +drzeć $alt +drzyj $alt +drżał $alt +drżą $alt +drżąc $alt +drżeć $alt +drżę $alt +drżoł $alt +drży $alt +drżyj $alt +drżysz $alt +duć $alt +duj $alt +duł $alt +dupcz $alt +duś $alt +dyb $alt +dziab $alt +dziać $alt +dział $alt +dziel $alt +dzierż $alt +dziob $alt +dzioć $alt +dzioł $alt +dzwoń $alt +dźga $alt +dźgać $alt +dźgaj $alt +dźgał $alt +dźgam $alt +dźgasz $alt +dźgną $alt +dźgnąć $alt +dźgnął $alt +dźgnę $alt +dźgnie $alt +dźgniesz $alt +dźgnięć $alt +dźgnij $alt +dźgoć $alt +dźgoł $alt +dźgom $alt +dźwięcz $alt +dżdży $alt +dżdżyć $alt +dżdżył $alt +furcz $alt +gap $alt +garb $alt +gasł $alt +gaś $alt +giąć $alt +giął $alt +giń $alt +ględź $alt +gładź $alt +głaszcz $alt +głoś $alt +głódź $alt +głuchł $alt +gna $alt +gnać $alt +gnaj $alt +gnał $alt +gnam $alt +gnasz $alt +gną $alt +gnąc $alt +gnę $alt +gnęb $alt +gnić $alt +gnie $alt +gnieć $alt +gniesz $alt +gnieść $alt +gnieźdź $alt +gnij $alt +gnił $alt +gniótł $alt +gnoć $alt +gnoł $alt +gnom $alt +gol $alt +goń $alt +gość $alt +grać $alt +graj $alt +grał $alt +gram $alt +grandź $alt +grasz $alt +groć $alt +grodź $alt +groł $alt +grom $alt +gródź $alt +gryzł $alt +gryź $alt +gryźć $alt +grzać $alt +grzał $alt +grząźć $alt +grzesz $alt +grzmi $alt +grzmiał $alt +grzmią $alt +grzmiąc $alt +grzmieć $alt +grzmię $alt +grzmij $alt +grzmioł $alt +grzmisz $alt +grzmoć $alt +grzoć $alt +grzoł $alt +guzdrz $alt +gwałć $alt +gwarz $alt +gwiżdż $alt +gzią $alt +gzić $alt +gżąc $alt +hańb $alt +hucz $alt +idą $alt +idę $alt +idź $alt +iść $alt +jadł $alt +jąć $alt +jął $alt +jątrz $alt +je $alt +jedz $alt +jedź $alt +jem $alt +jesz $alt +jeść $alt +jeźdź $alt +jęcz $alt +jojcz $alt +judź $alt +karć $alt +karm $alt +każ $alt +kąp $alt +kąsz $alt +kisł $alt +klap $alt +klaszcz $alt +kląć $alt +klął $alt +kleć $alt +klej $alt +klęsł $alt +klną $alt +klnąc $alt +klnę $alt +klnie $alt +klniesz $alt +klnij $alt +kładł $alt +kładź $alt +kłam $alt +kłap $alt +kłaść $alt +kłom $alt +kłoń $alt +kłoś $alt +kłóć $alt +kłuć $alt +kłuj $alt +kłuł $alt +knoć $alt +knuć $alt +knuj $alt +knuł $alt +kończ $alt +kopć $alt +korć $alt +koś $alt +kój $alt +kórz $alt +kpi $alt +kpiarz $alt +kpią $alt +kpiąc $alt +kpić $alt +kpię $alt +kpij $alt +kpił $alt +kpiorz $alt +kpisz $alt +kracz $alt +kradł $alt +kraś $alt +kraść $alt +krąż $alt +kreśl $alt +kręć $alt +krój $alt +krusz $alt +krwaw $alt +kryć $alt +kryj $alt +krył $alt +krzep $alt +krzepł $alt +krztuś $alt +krzycz $alt +krzywdź $alt +kształć $alt +kuć $alt +kuj $alt +kuł $alt +kuś $alt +kwicz $alt +kwil $alt +kwitł $alt +lać $alt +lał $alt +lazł $alt +lągł $alt +ląkł $alt +lecz $alt +leć $alt +legł $alt +lej $alt +leź $alt +leźć $alt +leż $alt +lgną $alt +lgnąc $alt +lgnąć $alt +lgnął $alt +lgnę $alt +lgnie $alt +lgnieć $alt +lgniesz $alt +lgnij $alt +licz $alt +liź $alt +liż $alt +loć $alt +loł $alt +lśni $alt +lśnią $alt +lśniąc $alt +lśnić $alt +lśnię $alt +lśnij $alt +lśnił $alt +lśnisz $alt +lżą $alt +lżąc $alt +lżę $alt +lży $alt +lżyć $alt +lżyj $alt +lżył $alt +lżysz $alt +ładź $alt +łap $alt +łaszcz $alt +łącz $alt +łgać $alt +łgał $alt +łgoć $alt +łgoł $alt +łka $alt +łkać $alt +łkaj $alt +łkał $alt +łkam $alt +łkań $alt +łkasz $alt +łkoć $alt +łkoł $alt +łkom $alt +łów $alt +łudź $alt +łzaw $alt +łżą $alt +łżąc $alt +łże $alt +łżesz $alt +łżę $alt +łżyj $alt +ma $alt +mam $alt +marszcz $alt +martw $alt +marz $alt +marzł $alt +maść $alt +maż $alt +mąć $alt +mądrz $alt +mdlał $alt +mdlą $alt +mdląc $alt +mdleć $alt +mdlej $alt +mdlę $alt +mdli $alt +mdlić $alt +mdlił $alt +mdlisz $alt +mdloł $alt +męcz $alt +miał $alt +miażdż $alt +miął $alt +mieć $alt +miej $alt +miel $alt +mierz $alt +mieś $alt +mieść $alt +milcz $alt +milkł $alt +miń $alt +mioł $alt +miożdż $alt +miótł $alt +mizdrz $alt +mkną $alt +mknąc $alt +mknąć $alt +mknął $alt +mknę $alt +mknie $alt +mkniesz $alt +mknij $alt +mleć $alt +młóć $alt +mnij $alt +mnóż $alt +mocz $alt +mom $alt +mość $alt +módl $alt +mógł $alt +mókł $alt +mów $alt +mrą $alt +mrąc $alt +mrę $alt +mrocz $alt +mroź $alt +mrucz $alt +mruż $alt +mrze $alt +mrzeć $alt +mrzesz $alt +mszczą $alt +mszcząc $alt +mszczę $alt +mści $alt +mścić $alt +mścij $alt +mścił $alt +mścisz $alt +myć $alt +myj $alt +mył $alt +myśl $alt +mżą $alt +mżąc $alt +mży $alt +mżyć $alt +mżył $alt +mżysz $alt +najdź $alt +najść $alt +nęć $alt +niańcz $alt +nieś $alt +nieść $alt +nikł $alt +niończ $alt +niósł $alt +niszcz $alt +noś $alt +nuć $alt +nudź $alt +ostrz $alt +padł $alt +pal $alt +parz $alt +pasł $alt +paś $alt +paść $alt +patrz $alt +pcha $alt +pchać $alt +pchaj $alt +pchał $alt +pcham $alt +pchasz $alt +pchną $alt +pchnąć $alt +pchnął $alt +pchnę $alt +pchnie $alt +pchniesz $alt +pchnij $alt +pchoć $alt +pchoł $alt +pchom $alt +pełzł $alt +pędź $alt +piać $alt +piał $alt +piąć $alt +pichć $alt +pić $alt +piej $alt +piekł $alt +piel $alt +pieprz $alt +pierzchł $alt +pieść $alt +pij $alt +pił $alt +pioć $alt +pioł $alt +piszcz $alt +pleć $alt +pleń $alt +pleść $alt +plótł $alt +pluć $alt +pluj $alt +pluł $alt +pluń $alt +pluszcz $alt +plwa $alt +plwać $alt +plwaj $alt +plwał $alt +plwam $alt +plwasz $alt +plwoć $alt +plwoł $alt +plwom $alt +płacz $alt +płać $alt +płoć $alt +płódź $alt +pną $alt +pnąc $alt +pnąć $alt +pnę $alt +pnie $alt +pniesz $alt +pnij $alt +popstrz $alt +pość $alt +pój $alt +pójdź $alt +pójść $alt +prać $alt +prał $alt +praż $alt +prą $alt +prąc $alt +prę $alt +pręż $alt +proć $alt +proł $alt +proś $alt +pruć $alt +pruj $alt +pruł $alt +prządł $alt +prządź $alt +przągł $alt +prząść $alt +prząż $alt +przeć $alt +przejdź $alt +przejść $alt +przędź $alt +przyjdź $alt +przyjść $alt +przykrz $alt +psoć $alt +pstrzą $alt +pstrząc $alt +pstrzę $alt +pstrzy $alt +pstrzyć $alt +pstrzyj $alt +pstrzył $alt +pstrzysz $alt +psuć $alt +psuj $alt +psuł $alt +puchł $alt +puść $alt +pyl $alt +racz $alt +radź $alt +rań $alt +raź $alt +rąb $alt +ręcz $alt +rodź $alt +roń $alt +rób $alt +ródź $alt +rósł $alt +róść $alt +rwać $alt +rwał $alt +rwą $alt +rwąc $alt +rwę $alt +rwie $alt +rwiesz $alt +rwij $alt +rwoć $alt +rwoł $alt +rycz $alt +ryć $alt +ryj $alt +rył $alt +rządź $alt +rzedł $alt +rzekł $alt +rzeźb $alt +rzęź $alt +rzęż $alt +rzuć $alt +rżał $alt +rżą $alt +rżąc $alt +rżeć $alt +rżę $alt +rżną $alt +rżnąc $alt +rżnąć $alt +rżnął $alt +rżnę $alt +rżnie $alt +rżniesz $alt +rżnięć $alt +rżnij $alt +rżoł $alt +rży $alt +sadź $alt +sącz $alt +sądź $alt +scal $alt +scedź $alt +schla $alt +schlać $alt +schlaj $alt +schlał $alt +schlam $alt +schlap $alt +schlasz $alt +schlaszcz $alt +schlej $alt +schli $alt +schloć $alt +schloł $alt +schlom $alt +schła $alt +schłam $alt +schłaś $alt +schłem $alt +schłeś $alt +schło $alt +schłodź $alt +schłom $alt +schłoszcz $alt +schłódź $alt +schły $alt +schną $alt +schnąc $alt +schnąć $alt +schnę $alt +schnie $alt +schniesz $alt +schnij $alt +schodź $alt +schódź $alt +schroń $alt +schrup $alt +schrypł $alt +schrzań $alt +schudł $alt +schwyć $alt +scukrz $alt +sczep $alt +sczesz $alt +sczyść $alt +sechł $alt +sęp $alt +sfajcz $alt +sfruń $alt +siać $alt +siadł $alt +siał $alt +siądź $alt +siąp $alt +siąść $alt +siecz $alt +siej $alt +siekł $alt +sierdź $alt +sil $alt +sioć $alt +siodł $alt +sioł $alt +siorb $alt +skacz $alt +skaml $alt +skarć $alt +skarż $alt +skaź $alt +skaż $alt +skąp $alt +skisł $alt +skląć $alt +sklął $alt +skleć $alt +sklej $alt +sklęsł $alt +sklną $alt +sklnę $alt +sklnie $alt +sklniesz $alt +sklnij $alt +skłoń $alt +skłóć $alt +skłuć $alt +skłuj $alt +skłuł $alt +sknoć $alt +skocz $alt +skończ $alt +skopć $alt +skorć $alt +skoś $alt +skradł $alt +skraść $alt +skręć $alt +skrob $alt +skrop $alt +skróć $alt +skrój $alt +skrusz $alt +skrwaw $alt +skryć $alt +skryj $alt +skrył $alt +skrzą $alt +skrząc $alt +skrzepł $alt +skrzesz $alt +skrzę $alt +skrzy $alt +skrzycz $alt +skrzyć $alt +skrzyj $alt +skrzył $alt +skrzyp $alt +skrzysz $alt +skrzyw $alt +skrzywdź $alt +skub $alt +skuć $alt +skuj $alt +skul $alt +skuł $alt +skurw $alt +skuś $alt +skwaś $alt +skwiercz $alt +słabł $alt +słać $alt +słał $alt +słoć $alt +słodź $alt +słoł $alt +słódź $alt +służ $alt +słyń $alt +słysz $alt +smaż $alt +smęć $alt +smrodź $alt +smródź $alt +smuć $alt +snuć $alt +snuj $alt +snuł $alt +sól $alt +spadł $alt +spal $alt +spał $alt +sparz $alt +spasł $alt +spaś $alt +spaść $alt +spełń $alt +spełzł $alt +spesz $alt +spędź $alt +spiąć $alt +spiął $alt +spić $alt +spiec $alt +spiecz $alt +spiekł $alt +spieprz $alt +spierdź $alt +spierz $alt +spierzchł $alt +spiesz $alt +spiętrz $alt +spij $alt +spił $alt +spisz $alt +splam $alt +spleć $alt +spleść $alt +splom $alt +splótł $alt +spluń $alt +spłacz $alt +spłać $alt +spłaszcz $alt +spłoć $alt +spłoń $alt +spłosz $alt +spłódź $alt +spłucz $alt +spłyć $alt +spłyń $alt +spolszcz $alt +społ $alt +spój $alt +sprać $alt +sprał $alt +spraw $alt +sprawdź $alt +spręż $alt +sproć $alt +sproł $alt +sproś $alt +spruć $alt +spruj $alt +spruł $alt +sprządł $alt +sprządź $alt +sprzągł $alt +sprząść $alt +sprząż $alt +sprzędź $alt +sprzykrz $alt +spsiał $alt +spsieć $alt +spsiej $alt +spsioł $alt +spsoć $alt +spuść $alt +ssać $alt +ssał $alt +ssą $alt +ssąc $alt +ssę $alt +ssią $alt +ssiesz $alt +ssij $alt +ssoć $alt +ssoł $alt +stać $alt +stał $alt +stań $alt +stąp $alt +stchórz $alt +stercz $alt +stęchł $alt +stlą $alt +stlę $alt +stli $alt +stlić $alt +stlij $alt +stlił $alt +stlisz $alt +stłamś $alt +stłocz $alt +stłuc $alt +stłucz $alt +stłukł $alt +stocz $alt +stoć $alt +stoł $alt +stój $alt +strać $alt +strasz $alt +strąć $alt +streść $alt +stręcz $alt +stroć $alt +stroń $alt +strój $alt +struć $alt +strudź $alt +struj $alt +struł $alt +strwoń $alt +strwóż $alt +strząsł $alt +strząś $alt +strząść $alt +strzegł $alt +strzel $alt +strzep $alt +strzeż $alt +strzęś $alt +strzyc $alt +strzygł $alt +strzyż $alt +studź $alt +stul $alt +stwierdź $alt +stwórz $alt +stygł $alt +suń $alt +susz $alt +swędź $alt +syć $alt +szarp $alt +szcza $alt +szczać $alt +szczał $alt +szczam $alt +szczasz $alt +szczą $alt +szcząc $alt +szczeć $alt +szczę $alt +szczędź $alt +szczoć $alt +szczoł $alt +szczom $alt +szczuć $alt +szczuj $alt +szczuł $alt +szczy $alt +szczyć $alt +szczyj $alt +szczyp $alt +szczysz $alt +szemrz $alt +szepcz $alt +szklą $alt +szkląc $alt +szklę $alt +szkli $alt +szklić $alt +szklij $alt +szklił $alt +szklisz $alt +szkodź $alt +szkol $alt +szkódź $alt +szpeć $alt +szyć $alt +szydź $alt +szyj $alt +szył $alt +ściąć $alt +ściął $alt +ścichł $alt +ściec $alt +ściekł $alt +ściel $alt +ścierp $alt +ścierpł $alt +ścisz $alt +ściub $alt +ślą $alt +śląc $alt +śle $alt +ślepł $alt +ślesz $alt +ślę $alt +ślęcz $alt +śmiać $alt +śmiał $alt +śmiardł $alt +śmiąc $alt +śmieć $alt +śmiej $alt +śmierdł $alt +śmiesz $alt +śmioć $alt +śmioł $alt +śmiordł $alt +śni $alt +śnią $alt +śniąc $alt +śnić $alt +śnię $alt +śnij $alt +śnił $alt +śnisz $alt +śpi $alt +śpią $alt +śpiąc $alt +śpiesz $alt +śpię $alt +śpisz $alt +świadcz $alt +świeć $alt +święć $alt +świń $alt +świodcz $alt +świszcz $alt +tańcz $alt +tchną $alt +tchnąc $alt +tchnąć $alt +tchnął $alt +tchnę $alt +tchnie $alt +tchnieć $alt +tchniesz $alt +tchnij $alt +tęchł $alt +tęp $alt +tka $alt +tkać $alt +tkaj $alt +tkał $alt +tkam $alt +tkasz $alt +tkną $alt +tknąć $alt +tknął $alt +tknę $alt +tknie $alt +tkniesz $alt +tknij $alt +tkoć $alt +tkoł $alt +tkom $alt +tkwi $alt +tkwią $alt +tkwiąc $alt +tkwić $alt +tkwię $alt +tkwij $alt +tkwił $alt +tkwisz $alt +tlał $alt +tlą $alt +tląc $alt +tlę $alt +tli $alt +tlić $alt +tlił $alt +tloł $alt +tłocz $alt +tłucz $alt +tłukł $alt +tłuść $alt +tnąc $alt +tocz $alt +toń $alt +traf $alt +trą $alt +trąb $alt +trąc $alt +trę $alt +trocz $alt +troszcz $alt +truć $alt +trudź $alt +truj $alt +truł $alt +trwa $alt +trwać $alt +trwaj $alt +trwał $alt +trwam $alt +trwasz $alt +trwoć $alt +trwoł $alt +trwom $alt +trwoń $alt +trwóż $alt +trząsł $alt +trząś $alt +trząść $alt +trzeć $alt +trzep $alt +trzesz $alt +trzeszcz $alt +trzęś $alt +twierdź $alt +twórz $alt +tyj $alt +tył $alt +ujdź $alt +ujść $alt +wadź $alt +wal $alt +walcz $alt +waż $alt +wątp $alt +wbić $alt +wbiec $alt +wbiegł $alt +wbij $alt +wbił $alt +wchłoń $alt +wchodź $alt +wchódź $alt +wchrzcić $alt +wchrzcij $alt +wchrzcił $alt +wchrzcisz $alt +wchrzczą $alt +wchrzcząc $alt +wchrzczę $alt +wciąć $alt +wciął $alt +wciekł $alt +wciel $alt +wczuć $alt +wczuj $alt +wczuł $alt +wćwicz $alt +wda $alt +wdać $alt +wdaj $alt +wdał $alt +wdam $alt +wdarł $alt +wdasz $alt +wdepcz $alt +wdoć $alt +wdoł $alt +wdom $alt +wdrap $alt +wdróż $alt +wduś $alt +wdziać $alt +wdział $alt +wdziej $alt +wdzięcz $alt +wdzioć $alt +wdzioł $alt +wejdź $alt +wejść $alt +weź $alt +wędź $alt +węsz $alt +wgiąć $alt +wgiął $alt +wgięć $alt +wgnieć $alt +wgnieść $alt +wgniótł $alt +wgra $alt +wgrać $alt +wgraj $alt +wgrał $alt +wgram $alt +wgrasz $alt +wgroć $alt +wgroł $alt +wgrom $alt +wgryzł $alt +wgryź $alt +wgryźć $alt +wiać $alt +wiał $alt +wiądł $alt +wiąż $alt +wichrz $alt +wić $alt +widź $alt +wie $alt +wiedz $alt +wiej $alt +wielb $alt +wiem $alt +wieńcz $alt +wierć $alt +wierz $alt +wiesz $alt +wieszcz $alt +wietrz $alt +wieź $alt +wieźć $alt +więdł $alt +wij $alt +wilgł $alt +wił $alt +wiń $alt +wioć $alt +wioł $alt +wiózł $alt +wiś $alt +wjedź $alt +wklej $alt +wklep $alt +wkłuć $alt +wkłuj $alt +wkłuł $alt +wkop $alt +wkradł $alt +wkraść $alt +wkręć $alt +wkrocz $alt +wkrop $alt +wkrój $alt +wkuć $alt +wkuj $alt +wkuł $alt +wkup $alt +wkurw $alt +wkurz $alt +wlać $alt +wlał $alt +wlazł $alt +wlec $alt +wlecz $alt +wleć $alt +wlej $alt +wlekł $alt +wlep $alt +wleź $alt +wleźć $alt +wlicz $alt +wliź $alt +wloć $alt +wloł $alt +wlókł $alt +włam $alt +właź $alt +włącz $alt +włom $alt +włócz $alt +włóż $alt +wmarzł $alt +wmieść $alt +wmiótł $alt +wmów $alt +wmuś $alt +wnieś $alt +wnieść $alt +wniósł $alt +wnoś $alt +woź $alt +wparł $alt +wpaść $alt +wpatrz $alt +wpełzł $alt +wpędź $alt +wpiąć $alt +wpiął $alt +wpić $alt +wpij $alt +wpił $alt +wpisz $alt +wpleć $alt +wpleść $alt +wplótł $alt +wpłać $alt +wpłoć $alt +wpłyń $alt +wpój $alt +wpraw $alt +wproś $alt +wprząc $alt +wprządł $alt +wprządź $alt +wprzągł $alt +wprząść $alt +wprząż $alt +wprzędź $alt +wpuść $alt +wraź $alt +wrą $alt +wrąb $alt +wrę $alt +wręcz $alt +wrodź $alt +wrób $alt +wróć $alt +wródź $alt +wrósł $alt +wróść $alt +wróż $alt +wryć $alt +wryj $alt +wrył $alt +wrze $alt +wrzeć $alt +wrzep $alt +wrzeszcz $alt +wrzuć $alt +wsadź $alt +wsiać $alt +wsiadł $alt +wsiał $alt +wsiądź $alt +wsiąkł $alt +wsiąść $alt +wsiej $alt +wsioć $alt +wsiodł $alt +wsioł $alt +wskaż $alt +wskocz $alt +wskrześ $alt +wsław $alt +wsnuć $alt +wsnuj $alt +wsnuł $alt +wspiąć $alt +wspiął $alt +wstać $alt +wstał $alt +wstań $alt +wstaw $alt +wstąp $alt +wstoć $alt +wstoł $alt +wstrzel $alt +wstydź $alt +wsuń $alt +wszcząć $alt +wszczął $alt +wszczep $alt +wszczną $alt +wszcznę $alt +wszcznie $alt +wszczniesz $alt +wszcznij $alt +wszedł $alt +wszepcz $alt +wszyć $alt +wszyj $alt +wszył $alt +wścib $alt +wściekł $alt +wściel $alt +wtarł $alt +wtaszcz $alt +wtłocz $alt +wtocz $alt +wtop $alt +wtrąć $alt +wtrój $alt +wtryń $alt +wtul $alt +wwal $alt +wwierć $alt +wwieź $alt +wwieźć $alt +wwiódł $alt +wwiózł $alt +wwoź $alt +wyć $alt +wyj $alt +wyjdź $alt +wyjść $alt +wył $alt +wzbić $alt +wzbierz $alt +wzbij $alt +wzbił $alt +wzbroń $alt +wzburz $alt +wzdąć $alt +wzdął $alt +wzejdź $alt +wzejść $alt +wzgardź $alt +wziąć $alt +wziął $alt +wzleć $alt +wzmóc $alt +wzmógł $alt +wzmóż $alt +wznieć $alt +wznieś $alt +wznieść $alt +wzniósł $alt +wznoś $alt +wznów $alt +wzrósł $alt +wzróść $alt +wzrusz $alt +wzuć $alt +wzuj $alt +wzuł $alt +wżął $alt +wżeń $alt +wżyć $alt +wżyj $alt +wżył $alt +zajdź $alt +zajść $alt +zapstrz $alt +zbaw $alt +zbądź $alt +zbić $alt +zbiec $alt +zbiegł $alt +zbierz $alt +zbieś $alt +zbij $alt +zbił $alt +zbladł $alt +zblakł $alt +zbliż $alt +zbłaźń $alt +zbłądź $alt +zbocz $alt +zbrakł $alt +zbrocz $alt +zbroj $alt +zbrudź $alt +zbruźdź $alt +zbryl $alt +zbrzydł $alt +zbrzydź $alt +zbudź $alt +zburz $alt +zbyć $alt +zbył $alt +zdać $alt +zdaj $alt +zdał $alt +zdam $alt +zdarł $alt +zdarz $alt +zdasz $alt +zdąż $alt +zdechł $alt +zdepcz $alt +zderz $alt +zdjąć $alt +zdjął $alt +zdław $alt +zdoć $alt +zdoł $alt +zdom $alt +zdób $alt +zdradź $alt +zdrap $alt +zduś $alt +zdwój $alt +zdyb $alt +zdziel $alt +zdzierż $alt +zejdź $alt +zejść $alt +zgadł $alt +zgań $alt +zgarb $alt +zgasł $alt +zgaś $alt +zgęstł $alt +zgęść $alt +zgiąć $alt +zgiął $alt +zgiń $alt +zgładź $alt +zgłoś $alt +zgłusz $alt +zgnić $alt +zgnieć $alt +zgnieść $alt +zgnij $alt +zgnił $alt +zgniótł $alt +zgnój $alt +zgol $alt +zgorsz $alt +zgódź $alt +zgra $alt +zgrab $alt +zgrać $alt +zgraj $alt +zgrał $alt +zgram $alt +zgrandź $alt +zgrasz $alt +zgroć $alt +zgroł $alt +zgrom $alt +zgryzł $alt +zgryź $alt +zgryźć $alt +zgrzesz $alt +zgwałć $alt +zhańb $alt +ziać $alt +ział $alt +ziej $alt +zioć $alt +zioł $alt +ziść $alt +zjadł $alt +zje $alt +zjedz $alt +zjedź $alt +zjem $alt +zjesz $alt +zjeść $alt +zjeźdź $alt +zlać $alt +zlał $alt +zlazł $alt +zląkł $alt +zleć $alt +zlej $alt +zleź $alt +zleźć $alt +zlicz $alt +zliź $alt +zloć $alt +zloł $alt +złaj $alt +złam $alt +złap $alt +złaź $alt +złącz $alt +złoć $alt +złom $alt +złój $alt +złów $alt +złóż $alt +złudź $alt +złuszcz $alt +zmarł $alt +zmarszcz $alt +zmartw $alt +zmarzł $alt +zmaż $alt +zmąć $alt +zmądrz $alt +zmęcz $alt +zmiażdż $alt +zmiąć $alt +zmiął $alt +zmień $alt +zmierz $alt +zmierzchł $alt +zmierzw $alt +zmierź $alt +zmieść $alt +zmiękcz $alt +zmilcz $alt +zmilkł $alt +zmiożdż $alt +zmiótł $alt +zmłóć $alt +zmniejsz $alt +zmocz $alt +zmóc $alt +zmógł $alt +zmókł $alt +zmórz $alt +zmów $alt +zmóż $alt +zmroź $alt +zmruż $alt +zmuś $alt +zmyć $alt +zmyl $alt +zmył $alt +zmysł $alt +zmyśl $alt +znacz $alt +znaj $alt +znajdź $alt +znał $alt +znam $alt +znasz $alt +zniemcz $alt +znieś $alt +znieść $alt +znikł $alt +zniósł $alt +zniszcz $alt +zniż $alt +znoł $alt +znom $alt +znoś $alt +znudź $alt +znuż $alt +zrań $alt +zraź $alt +zrodź $alt +zroś $alt +zrób $alt +zródź $alt +zrósł $alt +zróść $alt +zrusz $alt +zryć $alt +zryj $alt +zrył $alt +zrzec $alt +zrzedł $alt +zrzekł $alt +zrzędź $alt +zrzuć $alt +zsadź $alt +zsiadł $alt +zsiodł $alt +zstąp $alt +zsuń $alt +zsyp $alt +zszarp $alt +zszyć $alt +zszyj $alt +zszył $alt +ztarł $alt +zwab $alt +zwać $alt +zwal $alt +zwalcz $alt +zwał $alt +zwarł $alt +zwarz $alt +zważ $alt +zwą $alt +zwąc $alt +zwątp $alt +zwę $alt +zwędź $alt +zwęź $alt +zwiać $alt +zwiał $alt +zwiądł $alt +zwiąż $alt +zwichrz $alt +zwić $alt +zwidź $alt +zwie $alt +zwiedź $alt +zwiej $alt +zwiem $alt +zwieńcz $alt +zwiesz $alt +zwieś $alt +zwieść $alt +zwieź $alt +zwieźć $alt +zwiększ $alt +zwij $alt +zwiń $alt +zwioć $alt +zwioł $alt +zwiódł $alt +zwiózł $alt +zwisł $alt +zwlec $alt +zwlecz $alt +zwlekł $alt +zwlókł $alt +zwłócz $alt +zwoć $alt +zwoł $alt +zwoź $alt +zwódź $alt +zwróć $alt +zwykł $alt +zziąbł $alt +zzuć $alt +zzuj $alt +zzuł $alt +zżąć $alt +zżął $alt +zżółkł $alt +zżuć $alt +zżuj $alt +zżuł $alt +zżyć $alt +zżyj $alt +zżył $alt +żga $alt +żgać $alt +żgaj $alt +żgał $alt +żgam $alt +żgasz $alt +żgną $alt +żgnąc $alt +żgnąć $alt +żgnął $alt +żgnę $alt +żgnie $alt +żgniesz $alt +żgnij $alt +żgoć $alt +żgoł $alt +żgom $alt +żłop $alt +żółkł $alt +żrą $alt +żrąc $alt +żre $alt +żreć $alt +żresz $alt +żrę $alt +żryj $alt +żuć $alt +żuj $alt +żuł $alt +życz $alt +żyj $alt +żył $alt + + diff --git a/dictsource/pl_rules b/dictsource/pl_rules new file mode 100644 index 00000000..417bd513 --- /dev/null +++ b/dictsource/pl_rules @@ -0,0 +1,409 @@ + +.group a + a a + a (_A a_ + ae (_ E // latin plural + +// czasowniki forma przypuszczająca - trzecia sylaba od końca + @ł) a (by_ =a + @ł) a (bym_ =a + @ł) a (byś_ =a + + @) a (łby_ =a + @) a (łbym_ =a + @) a (łbyś_ =a + +.group ą + ą O~ + ą (_ O~_ + ą (_A O~_ + ą (p Om + ą (b Om + ą (t On + ą (c On + ą (d On + ą (ć On^ + ą (dź On^ + ą (ci On^ + ą (dzi On^ + ą (k ON + ą (g ON + ą (l O + ą (ł O + +.group b + b b + ja) bł (ko p + b (_A p + b (i b; + bi (A b;j + +.group c + c ts + ch h + ch (i C + chi (A hj + psy) chi (a Ci + c (i ts; + ci (A ts; + cz tS + c (osin k + c (osecans k + c (otang k + cose) c (ans k + ch (ev S // chevrolet + ch (err S + _ro) ck (A k + +.group ć + ć ts; + ć (b dz; + ć (g dz; + +.group d + d d + d (_A t + d (i d; + di (A dj + dz dz + dz (_A ts + dz (i dz; + dzi (A dz; + dź dz; + dź (_A ts; + dż dZ + dż (_A tS + _o) dż d|Z + _po) dż d|Z + +.group e + e E + _osi) e (mset_ =E + _sied) e (mset_ =E + e (_A E_ + +.group ~ + ~ + +.group ę + ę E~ + ę (_ E + ę (_A E_ + ę (p Em + ę (b Em + ę (t En + ę (c En + ę (d En + _dziewi) ę (ćset =En^ + ęć (dzie En^ + ę (dzi En^ // kędzior + ę (ci En^ + ę (ć En^ + ę (si En^ + ę (ś En^ + ę (dź En^ + ę (k EN + ę (g EN + ę (l E + ę (ł E + i) ę (tna E // piętnaście + +.group f + f f + fi (A f;j + +.group g + g g + g (i g; + hi) gi (e gj + g (_A k + gł (_ g + gł (_A k + gate (s gEjt + +.group h + h h + hi (A hj + h (i C + +.group i + i i + i (A_+ j + A) i (A j + C) i (A ; + + _kl) i (e ;ij + + _martyn) i (k i + _martyn) i (c i + _kon) i (c++ i + _kon) i (k++ i + _lajkon) i (c i + _lajkon) i (k i + +// pentatonika etc. - not complete yet + @n) i (kA_ =i + @n) i (ce_ =i + @n) i (kach_ =i + @n) i (ków_ =i + @n) i (kom_ =i + @tm) i (kA_ =i + @tm) i (ce_ =i + @tm) i (kach_ =i + @tm) i (ków_ =i + @tm) i (kom_ =i + +// czasowniki tryb przypuszczający + + @) i (łby_ =i + @) i (łbym_ =i + @) i (łbyś_ =i + @l) i (by_ =i + @n) i (by_ =i + @l) i (śmy_ =i + @n) i (ście_ =i + @l) i (ście_ =i + + @) i (byśmy_ =i + @) i (byście_ =i + + @C) ie (libyśmy_ =;E + @C) ie (libyście_ =;E + @C) ie (liby_ =;E + + @C) ia (łybyśmy_ =;a + @C) ia (łybyście_ =;a + @C) ia (łyby_ =;a + +.group j + j j + +.group k + k k + k (i c + kł (_ k + ki (A kj + +.group l + l l + l (_ l_ + li (A lj + _po) li (A li + +.group ł + ł w + A) ł (_ w_ + mys) ł (_ w_ + ł (_ + +.group m + m m + m (_ m_ + A) mi (A mj + _zie) mi (A m; + _) mj (rA majO + +.group n + n n + n (_ n_ + n (i n^ + ni (A n^; + n (k N + n (g N + n (ć n^ + n (ci n^ + n (dź n^ + n (dzi n^ + +.group ń + ń n^ + ń (_ n^_ + +.group o + o O + o (_A O_ + +// notebook + declination + _n) oteboo (C Owtbu + +.group ó + ó u + +.group p + p p + ph (A f + _ko) pi (A pj + _fotoko) pi (A pj +// base form also in 'pl_list' + _) ppł (k pOtpuwkOvni + _) ppł (c pOtpuwkOvni + _) pł (k puwkOvni + _) pł (c puwkOvni + +.group q + q k + qu (A kv // quorum + +.group r + r * + K) r (A @-* + ri (A *j + rz Z + c) rz (A S + ć) rz (A S + cz) rz (A S + f) rz (A S + h) rz S + k) rz S + p) rz S + s) rz (A S + ś) rz (A S + sz) rz (A S + t) rz S + r (zi * + A) r (zł * // obmierzły + ma) r (zn r // marznąć etc. + ma) r (zlin * // zmarzlina + _zama) r (za * // zamarzać + _zma) r (za * + odma) r (za * + +.group s + s s + si (nus si + si (liko si + elik) si (r si + plek) si (g si + _mak) si (_ si + _mak) si (m si + s (i S; + si (A S; + sz S + +.group ś + ś S; + ść (dzie Z; + +.group t + t t + t (i t; + ti (A tj + t (rz t| // trzetrzelewska + t (s t| + +.group u + u u + u(_A u_ + a) u w // autobus + e) u w + na) u (k u + na) u (cz u + de) u (s u + +.group v + v v + +.group w + w v + ier) wsz (A S // pierwszy + w (_A f + c) w (A f + ć) w (A f + cz) w (A f + + f) w (A f + h) w (A f + k) w (A f + p) w (A f + s) w (A f + ś) w (A f + sz) w (A f + t) w (A f + _) window wyndOw + +.group x + x ks + +.group y + y y + y (_A y_ + _) y (A j + czter) y (stA =y + _pat) y (++ y + @t) y (kA_ =y + @t) y (ce_ =y + @t) y (kach_ =y + @t) y (ków_ =y + @t) y (kom_ =y + muz) y (kA_ =y + muz) y (ce_ =y + muz) y (kach_ =y + muz) y (ków_ =y + muz) y (kom_ =y + +// czasowniki i spójniki + + @ł) y (byśmy_ =y + @ł) y (byście_ =y + @ł) y (by_ =y + + eb) y (śmy_ =y + eb) y (ście_ =y + _ab) y (ście_ =y + _ab) y (śmy_ =y + +.group z + z z + z (_A s + z (i Z; + zi (A Z; + _ro) z (iC z + +.group ź + ź Z; + ź (_A S; + +.group ż + ż Z + ż (_A S + +// "Polished" pronunciation +.group th + _e) th (anak t // my nick!!! + th s + _) th z + +// "Polished" simple pronunciation of some foreign letters + +.group ü + ü i + +.group ö + ö E + +.group ä + ä E + +.group ž + ž Z + +.group č + č tS + +.group š + š S + +// ... and some common non-alphabetic characters +.group + $ dOla* + @ mawpa + % p@-*OtsEnt + + plus + # haS + = *'uvna||S;E + / dz;ElOnE + * gv;astka + | k@-*Eska||p;OnOva + ^ pOtENga + & End + ` Odv@-*Otny||apOst@-*Of diff --git a/dictsource/pt_list b/dictsource/pt_list new file mode 100755 index 00000000..f2087c1b --- /dev/null +++ b/dictsource/pt_list @@ -0,0 +1,627 @@ + +// This file in UTF8 encoded + +// Options +// ?1 European Portuguese +// ?2 Brazilian Portuguese + + +// Letters +// If a letter has a "word" pronunciation which is different from its +// "letter" name, then include the letter name here, with the letter +// prefixed by a _ character. + + +// character names + +_á ,a&g'udu +_à ,ag@-*'avi +_â ,asirkuNfl'Eksu +_ã ,atS'iU +_ç s,esed'elj& +_é ,e&g'udu +_ê ,asirkuNfl'Eksu +_í ,i&g'udu +_ó ,o&g'udu +_ô ,osirkuNfl'Eksu +_õ ,otS'iU +_ú ,u&g'udu +_ü ,utr@-*'em& + +_cap maI'uskulu +_?A l'et@-*& +_?? s'imbolu + +_. p'oNtu +_! ,eskl&mas'&U~ +_" 'asp&s +_# k,ardZin'aU +_$ s,if@-*'&U~ +_% pors'eINtu +_& 'e +_' ap'Ost@-*,ofu +_( ,ab@-*ipa*'eINtezi +_) f,ES&pa*'eINtezi +_* ,aste*'isku +_+ m'aIs +_, v'irgul& +_- 'ifeIN +_/ b'aQ& +_: d,oIsp'oNtus +_; p,oNtu_iv'irgul& +_< men'Or +_= igw'aU +_> maI'Or +_? ,iNtex,ogas'&U~ +_@ ax'ob& +_[ ,ab@-*ikowS'etSi +_\ b,ax&,iNvertS'id& +_] f,ES&kowS'etSi +_^ s,irkuNfl'Eksu +__ s,ublin^'adu +_` g@-*'avi +_{ ,ab@-*iS'avi +_| b,ax&v,ertSik'aU +_} f,ES&S'avi +_~ tS'iU +_¡ ,eskl&mas,&U~,iNvertS'id& +_¿ ,iNtex,ogas,&U~,iNvertS'id& +_" 'ab@-*i;'asp&z d'upl&s + + +// numeric +//******** + +?1_0 z'Eru +?2_0 z'Exu +?1_1 'um +?2_1 'uN +?1_2 d'oIS +?2_2 d'oIs +?1_3 tr'eS +?2_3 t@-*'es +?1_4 kw'atru +?2_4 kw'at@-*u +_5 s'iNku +?1_6 s'eIS +?2_6 s'eIs +?1_7 s'Et +?2_7 s'EtSi +_8 'oItu +?1_9 n'Ov +?2_9 n'Ovi +?1_10 d'ES +?2_10 d'Ez +?1_11 'oNz +?2_11 'oNzi +?1_12 d'oz +?2_12 d'ozi +?1_13 t:r'ez +?2_13 t@-*'ezi +?1_14 k&t'Orz +?2_14 kat'Orzi +?1_15 k'iNz +?2_15 k'iNzi +?1_16 dyz&s'eiS +?2_16 d,ezes'eIs +?1_17 dyz&s'Et +?2_17 d,ezes'EtSi +?1_18 dyz'Oitu +?2_18 dez'oItu +?1_19 dyz&n'Ov +?2_19 dezen'Ovi +?1_2X v'iNt +?2_2X v'iNtSi +?1_3X tr'iNt& +?2_3X t@-*'iNt& +?1_4X kw&r'eNt& +?2_4X kwa*'eINt& +_5X siNkw'eINt& +?1_6X sys'eINt& +?2_6X ses'eINt& +?1_7X syt'eINt& +?2_7X set'eINt& +_8X oIt'eINt& +_9X nov'eINt& +_1C0 s'eIN +?1_0C s'eINtuS +?2_0C s'eINtuz +_1C s'eINtu +?1_2C duz'eINtuS +?2_2C duz'eINtuz +?1_3C trez'eNtuS +?2_3C t@-*ez'eNtuz +?1_5C kin^'eINtuS +?2_5C kin^'eINtuz +?1_0M1 m'il_ +?2_0M1 m'iU_ +?1_1M1 m'il_ +?2_1M1 m'iU_ + +?1_0M2 milj'o~jS +?2_0M2 milj'o~jz +_1M2 'u~milj'&U~ +?1_0M3 bilj'o~jS +?2_0M3 bilj'o~jz +_1M3 'u~mbilj'&U~ +?1_0M4 trilj'o~jS +?2_0M4 trilj'o~jz +_1M4 'u~ntrilj'&U~ +_0and _i +_dpt _v'irgul& +_0Z2 seNt'Ezim& // 100ths +_0Z3 mil'Ezim& // 1000ths + + +// ABBREVIATIONS +//************** +(http ://) ag,atete'pe_ +a.c ,as'e +d.c d,es'e +etc ,ets'Ete*& + + +// articles +o $u+ +a $u+ +os $u+ +as $u+ +?1 a & $u+ + +um $u +uma $u +uns $u +umas $u + + +// pronouns +eu $u+ +tu $u+ +você $u+ +ele $u+ +ela $u+ +nós $u+ +vós $u+ +vocês $u+ +eles $u+ +elas $u+ + +me $u // reflexive +te $u +nos $u +//se $u + +este $u+ // this +esta 'Est& $brk $u+ +esse $u+ // that +essa 'Es& $brk $u+ +aquele $u+ // that +aquela $u+ + +que $u $pause + +// possessive adjectives +meu $u+ +minha $u+ +meus $u+ +minhas $u+ +teu $u+ +tua $u+ +teus $u+ +tuas $u+ +seu $u+ +sua $u+ +seus $u+ +suas $u+ +nosso $u+ +nossa $u+ +nossos $u+ +nossas $u+ +dele $u+ +dela $u+ +deles $u+ +delas $u+ + + +// prepositions +de $u // of,from +do $u +da $u +dos $u +das $u +dum $u +duma $u +duns $u +dumas $u + +em $u $brk // in,on,at +no nu $u $brk +na $u $brk +nos nus $u $brk +?1 nos nuS $u $brk +nas $u $brk +num $u $brk +numa $u $brk +nuns $u $brk +numas $u $brk + +por $u $brk // by,for,through +pelo $u $brk +pela $u $brk +pelos $u $brk +pelas $u $brk + +a $u $brk // to,at +?1 a & $u $brk +ao $u $brk +à ,a: $brk +aos $u $brk +às ,a:s $brk + +para $u $brk // for,to +pro $u $brk +pra $u $brk +?1 pra pr& $u $brk +pros $u $brk +pras $u $brk +prò $u $brk +prà $u $brk +pròs $u $brk +pràs $u $brk + +com $u $brk // with +sem $pause // without +até $u $pause // until +desde $u $pause // from,since +entre $pause // between,among +por $u $pause // by,for,through +sobre $pause // on,above,about +sob $pause // under,below +debaixo $pause // under,below + +durante $pause + + +// conjunctions +e i $u $pause // and +se $u $brk // if + + +mas $u $pause // but +porém $pause // however +todavia $pause // yet +contudo $pause // nevertheless + +ou $u $pause // or +quer $pause // whether + +assim $pause // thus +portanto $pause // therefore + +porque $pause // because +pois $pause // because +como $u $pause // as + +embora $pause // although +apesar $pause // despite + + +caso $pause // if +(desde que) d'esdZiki/ $pause // provided that +(exceto se) es'Etusi/ $pause // unless +(salvo se) s'alvusi/ $pause // unless + +(para que) p,a*&ki/ $pause // so that + + + +quando $pause // when +onde $u $pause // where +apenas $pause // as soon as +mal $pause // as soon as, hardly +(logo que) l'Oguki/ $pause // as soon as +(antes que) '&~NtSiski/ $pause // before +(depois que) dep'OIski/ $pause // after +(sempre que) s'eNpriki/ $pause // whenever +enquanto $pause // while + + +// negative + +// questions + + +// auxillary verbs (be, have, can, etc) + // ser, to be +ser $u +sou $u +é E $u +és Es $u +somos $u +sois $u +são $u + +era $u // .. imperfect +éramos $u +éreis $u +eram $u + +fui $u // .. preterite +foste $u +foi $u +fomos $u +fostes $u +foram $u + +fora $u // .. pluperfect +fômamos $u +fôreis $u +foram $u + +serei $u // .. future +será $u +seremos $u +sereis $u +serão $u + +seria $u // .. conditional +seríamos $u +seríeis $u +seriam $u + + // estar - to be +estar $u +estou $u +está $u +estamos $u +estais $u +estão $u + +estava $u +estávamos $u +astavam $u + +estive $u +esteve $u +estivemos $u +estiveram $u + +estarei $u +estará $u +estaremos $u +estarão $u + + + // ter - to have +ter $u +tenho $u +tens $u +tem $u +temos $u +tendes $u +têm $u + +tinha $u +tínhamos $u +tínheis $u +tinham $u + +tive $u +tiveste $u +teve $u +tivemos $u +tivestes $u +tiveram $u + +tivera $u +tivéramos $u +tivéreis $u +tiveram $u + +terei $u +terás $u +terá $u +teremos $u +tereis $u +terão $u + + // fazer - to do +fazer $u+ +faço $u+ +faz $u+ +fazemos $u+ +fazem $u+ + + + // poder - can +poder $u+ +posso $u+ +pode $u+ +podemos $u+ +podem $u+ + +podia $u+ +podíamos $u+ +podiam $u+ + +pude $u+ +pôde $u+ +pudemos $u+ +puderam $u+ + +poderei $u+ +poderá $u+ +poderemos $u+ +poderão $u+ + + + // ir - to go (used to make future tense) +vou $u+ +vai $u+ +vamos $u+ +vão $u+ + + // haver +há $u+ + + +// Letter names +_a a +_e E +_o O +a a $atend +e E $atend // assume letter-e at end of sentence +o O $atend + + +// some common adjectives and adverbs +alguns $u // some +algumas $u // some +não n,&U~ $strend // not + + + +// MAIN WORD DICTIONARY +//********************* +mui mu~j +muito m'u~jtu // -s is included as a suffix +muita m'u~jt& + +// $alt changes the first [o] phoneme to [O] +costa $alt +forte $alt +porta $alt +novos $alt +novas $alt +morte $alt +mortos $alt +porte $alt +norte $alt +corpos $alt +modos $alt +fogos $alt +sorte $alt +toque $alt +bloco $alt +blocos $alt +floco $alt +flocos $alt + + +// Open [E] +nela n'El& +nessa n'Es& +era 'Er& + +abacaxi abakaSi +axé aSE +elixir eliSir +?1fixe fiSe +lixo l'iSu +roxo x'oSu + +// foreign words +?1 alt 'alt +?1 bacalhau b,&k&lj'aU +?1 caps k'aps +?1 ctrl k'oNt:r'Ol +?1 delete dil'i:t +?1 design diz'aIn //? In Brasilian Portuguese +?1 down d'aUn +?1 download d'aUnloUd +?1 escape Sk'eIpy +?1 eyes w'aIz +?1 google g'u:g&l +hardware h'ardwe@ +?1 kernel k'ErnEl +?2 kernel k'ErnEU +?1 line l'aIn +layout l'eI,aUt +?1 lock _^_EN +?1 mail meIl +?2 mail m'eja +?1 menu mEnU +?1 num _^_EN +?1 ok Ok'eI +?1 pause p'au:z +?1 page p'eIdZ +?1 scroll _^_EN +site s'aIt +software s'Oftwe@ +?1 up _^_EN +?1 upload _^_EN +?1 window _^_EN +?1 yes j'Es + + +// common person names +alan 'al@n + + +// foreign product names +?1 access 'aksEs +debian d'Ebj&~N +espeak isp'i:k +speak spi:k +firefox f'ai@foks +?1 hal hal +?1 jaws dZ'au:z +?1 linux l'inUks +?2 linux l'inuks +openoffice 'opeIN|'Ofis +?1 reader r'i:d&@ +slackware sl'akwe@ +suse z'u:ts@ +ubuntu ub'untu +unix j'u:niks +?1 windows _^_EN + + + +// historical/famous person names +babbage b'abidZ +bernhard bern'ard +darwin d'Arwin +dijkstra d'ijkstrA: +einstein _!'aInSt,aIn +feynman f'ainm@n +freud fr'OId +friedrich fr'i:driS +gauss g'aUs +geisel g'aIzEU +gottfried g'Otfri:t +hawking h'o:king +heisenberg h'aIzEnberg +hitler h'itler +isaac iz'&k +lavoisier lavwazj'e +leibniz l'aIbni:ts +montesquieu m,oNteskj'e +neumann n'OIman +newton n'i;utoN +oppenheimer _!'Op@nh,aImar +richard x'iS&rd +riemann r'i:man +rijndael x'ain;d'al +rousseau Rus'o +schrödinger Sr'edinger +stephen st'i:v@n +steve st'i:v +turing t'u*iNg +voltaire vOlt'Er +von f'On + + +// foreign common names/surnames +klein kl'aIn // Very common on southern Brazil. +krueger k@-*'iZer +krüger k@-*'iZer +kühl k'il +mueler m'iler +mueller m'iler +müler m'iler +müller m'iler +ronchi r'OnCi: +vogel f'o:g@l +volkmann f'Olkman + diff --git a/dictsource/pt_rules b/dictsource/pt_rules new file mode 100755 index 00000000..a6ff94e6 --- /dev/null +++ b/dictsource/pt_rules @@ -0,0 +1,602 @@ +// translation rules Brazilian +// This file is UTF-8 encoded + +// Options +// ?1 European Portuguese +// ?2 Brazilian Portuguese + +// Letter groups +// A a vowel +// C a consonant +// G a voiced consonant +// K not a vowel + +.group a + _) a (_ a + a a + &) a (_ =& // in final unstressed syllable + &) a (s_ =& + &) a (_a =&/ // ?? elide final a before a + &) a (_à =&/ +?1 a (_ =& // in final unstressed syllable +?1 a (s_ =& +?1 a (_a =&/ // ?? elide final a before a +?1 a (_à =&/ + + a (C_ & + a (r_ 'a +?1 p) a (d_ =E + a (CC_ & +?1 al (_ 'al // eg: Portugal, capital, etc. +?2 al (K aU +?2 alh alj + + a (m &~ + a (n &~ + am (_ =&~N + am (C &~m + an (K &~N + a (nhA &~ + am (_ =&U~ + + ai aI + ai (s aI + a (iCK a + ay aI + ao aU + au aU + au (s aU + a (uCK a + + +.group â + â ''& + â (m ''&~ + â (n ''&~ + âm (K ''&~m + ân (K ''&~N + ânh ''&~n^ + + +.group à + à a + _) à (s_ aI + + à (m &~ + à (n &~ + àm (K &~m + àn (K &~N + à (nhA &~n^ + + +.group á + á ''a + ái ''aI + ái (s ''aI + á (iCK ''a + áy ''aI + áu ''aU + áu (s ''aU + á (uCK ''a + + +.group ã + ã &~ + ão &U~ + + +.group b + _) b (_ be + b b + b (b + + +.group c + _) c (_ se + c k + c (Y s // ce ci + ch S + c (c //drop “c” in European Portuguese (eg: seleccionar) +?1 A) ct t //drop “c” in European Portuguese (eg: exacto) +?1 A) cç s //drop “c” in European Portuguese (eg: selecção) +?1 conta) ct ct + + +.group d + _) d (_ de + d d + d (d +?2 d (i dZ +?2 d (í dZ +?2 d (e_ dZ + + +.group e + _) e (_ E + e e + e (_ =i + e (s_ =i +?2 e (_AN =i/ // ?? elide to [j] if next word starts with a vowel +?2 &l) e (_AN =i // but not after l or r +?2 &r) e (_AN =i +?1 e (_ =y +?1 e (s_ =y +?1 e (_iN =i/ // drop final [i] is next word starts with another i + +?1 e (e i //eg: candeeiro +?2 ee i + + e (be_ E + e (bes_ E + e (ce_ E + e (ces_ E +?2 el (K EU +?2 elh elj + +?1 e (rtA_ 'E // Eg: Alberto, aberta, etc... + em (C eIm + en (K eIN + enh en^ + + em (_ =eIN + em (s_ =eIN + en (_ =eIN + en (s_ =eIN + + + ei eI + ei (s eI + e (iCK e + ey eI + eu eU + eu (s eU + e (uCK e + +?1 _) es (C@@ S // drop initial "e". +?1 _) e (f i // efectuar, etc. +?1 C) e (cC 'E // eg: seleccionar, efectuar, selecção, etc... +?1 C) e (ã i // leão, panteão, etc. +?1 C) e (a i // oceano, etc. +?1 _C) e (CACA =y //definições. +?1 _C) e (CCACAr =y // desligar. +?1 _C) e (CKAr =y // fechar +?1 _C) e (CCACAr =y // terminar. +?1 _C) e (CACC =y // recicla, reciclagem, etc... +?1 _f) e (rrament =y // ferramenta, ferramentas. +?1 hip) e (r ,E // eg: hiper +?1 sup) e (r ,E // super +?1 int) e (rC 'E // Interno +?1 int) e (rr E // Interno +?1 n) e (t ,E // eg: net + +?1 e (l_ ,E + + +.group é + é ''E + éi ''EI + éi (s ''EI + é (iCK ''E + éy ''eI + éu ''EU + éu (s ''EU + é (uCK ''E + ém (_ ''eIN + ém (s_ ''eIN + én (_ ''eIN + én (s_ ''eIN + + +.group ê + ê ''e + êm (_ ''eIN + êm (C ''eIm + ên (K ''eIN + ênh ''en^ + êm (_ ''eIN + + +.group f +?1 _) f (_ Ef; // individual letter +?1 _) f (__ Ef // individual letter at end-of-word + _) f (_ 'Efe + f f + f (f + + +.group g +?1 _) g (_ ge + _) g (_ Ze + g g + g (g + g (Y Z // ge gi + gu (Y g +?1 guen (C gw'eIN // aguenta, etc. +?1 n) gu (A gw // eg: língua, etc. + + +.group h + _) h (_ ag'a + h // silent + + +.group i + _) i (_ i + i i + i (A j + Cr) i i + Cl) i i + i (_ 'i + +?2 il (K iU +?2 ilh ilj + + im (_ iN + im (C im + in (g iN + in (k iN + inh in^ + + i (A_ 'i + io (_ iU + io (s_ iU + i (oCK i + iu (_ iU + iu (s_ iU + i (uCK i + + áC) i (A_ j + áCC) i (A_ j + âC) i (A_ j + âCC) i (A_ j + éC) i (A_ j + éCC) i (A_ j + êC) i (A_ j + êCC) i (A_ j + íC) i (A_ j + íCC) i (A_ j + óC) i (A_ j + óCC) i (A_ j + ôC) i (A_ j + ôCC) i (A_ j + úC) i (A_ j + úCC) i (A_ j + +?1 @) ing (_ _^_EN +?1 @) ings (_ _^_EN + + +.group í + í ''i + í (m ''i + í (n ''i + ím (_ ''iN + ím (C ''im + ín (K ''iN + ính ''in^ + + +.group j + _) j (_ Z'Ot& + j Z + +.group k +?1 _) k (_ k'ap& +?2 _) k (_ ka + k k + k (k + + +.group l +?1 _) l (_ El; // individual letter +?1 _) l (__ El // individual letter at end-of-word + _) l (_ 'Ele + l l + l (l + lh l^ + A) lh lj +?1 A) lh l^ // ?? + + +.group m +?1 _) m (_ Em; +?1 _) m (__ Em + _) m (_ 'eme + m m + m (m + + +.group n +?1 _) n (_ En; +?1 _) n (__ En + _) n (_ 'ene + n n + n (n + nh n^ +?1 A) nn n //drop “n” in European Portuguese (eg: connosco). + + +.group o + o o + @) o (_ =u + o (s_ =u +?1 @) o (_ =U +?1 o (s_ =U + ou ow + oi oI + oi (s oI + o (iCK o + oo u +?1 v) oo (_ ow + oy OI + + o (Ca_ O +?1 o (Cá_ 'O +?1 o (Cé_ 'O +?1 o (Cí_ 'O +?1 o (Có_ 'O +?1 o (Cú_ 'O +?1 ol (_ Ol +?2 ol (K Ow +?2 olh olj + +?1 om (_ 'om +?2 om (_ oN + o (ma_ o +?1 om (C 'om +?2 om (C om + on (K oN + o (na_ o + onh on^ + o (rmA_ O + o (rmAC O + +?1 oz (_ OS +?2 oz (_ Oz + o (zes_ O + o (ra_ O + o (ras_ O +?1 _C) o (CACACC =u // Documento, documentação, etc. +?1 _C) o (CCAC =u // formatar, formato. + + +.group ô + ô ''o + ôm (_ ''oN + ôm (C ''om + ôn (K ''oN + ônh ''on^ + + +.group ó + ó ''O + + ói ''OI + ói (s ''OI + ó (iCK ''O + óu ''Ow + óy ''OI + + +.group õ + õ o~ + õe o~j + + +.group p + _) p (_ pe + p p + p (p +?1 ph f //Didn’t use in European Portuguese (eg: English) +?1 ple (_ _^_EN + + +.group q + _) q (_ ke + q k + qu kw + qü kw + qu (Y k + qu (K ku +?1 _) qua kwa // quatro, etc. +?1 _) que ke // quente, etc. +?1 C) quen (C kw'eIN // cinquenta, etc. +?1 A) quen (C kw'eIN // frequência, etc. +?1 quec kes // esquece, etc. +?1 queç kes // esqueça. +?1 A) que (nA_ ke // pequeno, etc. +?1 C) quê (_ ke // porquê, etc. +?1 que (l ke // aquele, etc. +?1 que (r_ ke // qualquer, etc. +?1 qui ki // quinta, esquilo, etc. +?1 _) quind kuind // quindecágono, etc. +?1 tran) qui kui // tranquilo, etc. +?1 _) quo kuo // quoficiente, etc. + + +.group r +?1 _) r (_ 'Err; // individual letter +?1 _) r (__ 'Err // individual letter at end-of-word + _) r (_ 'Exe + _) r (_\$ xe'aU // currency + r r +?1 A) r (A :r +?2 A) r (A * +?1 A) r (_A :r +?2 A) r (_A * + rr x +?1 C) r (A :r +?2 C) r (A @-* + _) r x + l) r x + n) r x + s) r x +?1 A) r (_ =@- //now, tis sound isn’t perfect but is is acceptable. + + +.group s +?1 _) s (_ 'Ess|; [s]+[;] not [s;] phoneme +?1 _) s (__ 'Ess + _) s (_ 'Ese + s s + ss s + sc (Y s + sç s + A) s (A z +?1 s (_ S +?2 s (_ s + s (_A z // next word starts with vowel + s (_G z // next word starts with voiced consonant + + A) s (_S1 s + A) s (_AS1 z // next word starts with vowel + A) s (_GS1 z // next word starts with voiced consonant + +?1 A) s (C S +?1 A) ss s +?1 A) s (G+ Z +?1 A) s (_KS1 S +?1 A) s (_G+S1 Z + + +.group t + _) t (_ te + t t + t (t +?2 t (i tS +?2 t (í tS +?2 t (e_ tS +?1 th _^_EN +?1 tion (_ _^_EN + + +.group u + _) u (_ u + u u + u (A w + u (_A w + r) u (A u + r) u (_A u + u (A_ 'u + + ui 'uI + ui (_ uI + ui (s 'uI + u (iCK u + uy uI + + um (_ u~N + um (C u~m + un (K u~N + unh u~n^ + + g) u (Y + + +.group ú + ú ''u + úm (_ ''u~N + úm (C ''u~m + ún (K ''u~N + únh ''u~n^ + +.group v + _) v (_ ve + v v + v (v + + +.group w + _) w (_ d'ablju + w w +?1 w (_ _^_EN + + +.group x +?1 _) x (_ SiS +?2 _) x (_ Sis + x (A S + A) x (A ks + e) x (A z + e) x (o_ ks + ai) x (A S + ei) x (A S + au) x s + ou) x s + x (C s + x (s + x (_ ks + ale) x (a S + pro) x (i s // aproximado, aproximadamente, aproximar, etc. + pró) x (i s // próximo, etc. + + +.group y + _) y (_ 'ipsiloN + y i + y (A j + + +.group z + _) z (_ ze + z z + z (z +?1 z (_ S +?2 z (_ s + z (_A z + z (_G z + +?1 A) z (C S +?1 A) z (G+ Z +?1 A) z (_C S +?1 A) z (_G+ Z + +.group + ç s + _) ç (_ s'esed'il^& + + ü u + + ß s + + % pors'eNtu + $ sif@-*'&U~ + _r_) $ + − m'enus + + maIs + & 'e + @ ax'ob& + ¤ 'eU*u + € 'eU*u + § pa*'ag@-*,afu + + // don't speak multiple occurances of these symbols + , (D v'irgul& + . p'oNtu + . (. _: + \.) . + + * aste*r'isku + *) * (* + ** + **) * (_ _:: + + __) - (_D m'enus + A_) - (_D _ + C_) - (_D _ + --) - + + = __igw'&l_ + = (== + =) = (= + ==) = (_ _:: + + + + + + + + + + diff --git a/dictsource/ro_list b/dictsource/ro_list new file mode 100644 index 00000000..74fd6afd --- /dev/null +++ b/dictsource/ro_list @@ -0,0 +1,511 @@ + +// This file in UTF8 encoded + +// Letters +//======== +// If a letter has a "word" pronunciation which is different from its +// "letter" name, then include the letter name here, with the letter +// prefixed by a _ character. + +// Use ş ţ (with cedilla) not ș ț (with comma) in these translation files + +// character names +_a a +_ă '@ +_â ,ydin'a +b be +c tSe +d de +_e e +f fe +g dZe +h haS +_i i +_î ,ydin'i +j Ze +k ka +_l le +_m me +_n ne +_o o +p pe +q kju +r re +_s se +ş Se +t te +ţ tse +_u u +v ve +w dublu've +x iks +y 'igrek +z zet + +â ,ydin'a $atend +ă '@ $atend +î ,ydin'i $atend + +_. punkt + + +// numeric +//******** +_0 z'e*o +_1 'unu +_2 d'oI +_2f d'ou@ +_3 t@-*'eI +_4 p'at@-*u +_5 tS'intSI^ +_6 S'ase +_7 S'apte +_8 'opt +_9 n'oU@ +_10 z'etSe + +_11 'unsp@-*ez,etSe +_12 d'oIsp@-*ez,etSe +_13 t@-*'eIsp@-*ez,etSe +_14 p'aIsp@-*ez,etSe +_15 tS'intSI^sp@-*ez,etSe +_16 S'aIsp@-*ez,etSe +_17 S'aptesp@-*ez,etSe +_18 'optsp@-*ez,etSe +_19 n'oU@sp@-*ez,etSe + +//_11 'unSpe +//_12 d'oISpe +//_13 t@-*'eISpe +//_14 p'aISpe +//_15 tS'inSpe +//_16 S'aISpe +//_17 S'apteSpe +//_18 'optiSpe +//_19 n'oU@Spe + +_20 doU@z'etSI^ +_30 t@-*eIz'etSI^ +_40 pat@-*uz'etSI^ +_50 tSintSI^z'etSI^ +_60 SaIz'etSI^ +_70 Saptez'etSI^ +_80 optz'etSI^ +_90 noU@z'etSI^ + +_2X d'oU@zetSI^ +_3X t@-*'eIzetSI^ +_4X p'at@-*uzetSI^ +_5X tS'intSI^zetSI^ +_6X S'aIzetSI^ +_7X S'aptezetSI^ +_8X 'optzetSI^ +_9X n'oU@zetSI^ + +_0C s'ute +_1C ,os'ut@ +_2C d'oU@s'ute + +_0M1 m'iI +_1M1 ,om'ie +_ofM1 m'iI +_0M2 mil'jOane +_1M2 'unmil'jon +_0M3 mil'jarde +_1M3 'unmil'jard +_0M4 bil'jOane +_1M4 'unbil'jon +_0M5 bil'jarde +_1M5 'unbil'jard + +_0of de +_0and _Si +_dpt _v'irgul@ +_0Z2 s'utimi +_0Z3 m'iImi + + +// Abbreviations +//************** +etc ettS'ete*a +s.a Si'aSa +ş.a. Si'aSa +s.a.m.d Se|aSamaIdeparte +ş.a.m.d Se|aSamaIdeparte + + +// articles +un $u +o $u +nişte $u +unui $u +unei $u +unor $u +unele $u // some + +ăsta $u1+ // this +asta $u+ +acest $u+ // this +aceasta $u+ +această $u+ + +acel $u+ // that +acea $u+ // that +acei $u+ // those +acele $u+ // those + +cei $u+ // the, those +cel $u+ // that, he who +cea $u+ // that, she who +cele $u+ // those + +// pronouns +eu jeU $u+ +tu $u+ +el jel $u+ +ea ja $u+ +//noi $u+ +voi $u+ +ele jele $u+ + +mă $u +te $u +îl $u +o $u +ne $u +vă $u +îi $u +le $u +se $u +îmi $u +îţi $u +ţi $u +mi $u +şi $u + +care $u $brk // who that which what +ceea $u $brk // that + + +// possessive adjectives +meu $u+ +mei $u+ +mea $u+ +//mele $u+ +tău $u+ +tăi $u+ +ta $u+ +tale $u+ +său $u+ +săi $u+ +sa $u+ +sale $u+ +lui $u+ +ei jeI $u+ +//nostru $u+ +noştri $u+ +noastră $u+ +//noastre $u+ +vostru $u+ +voştri $u+ +voastră $u+ +voastre $u+ +lor $u+ + + + +// prepositions +al $u $brk // of, genative article +a $u $brk $verbf +ai $u $brk +ale $u $brk + +in $u $brk +în $u $brk +pe $u $brk +ce $u $brk +la $u $brk +de $u +(de la) dela $u +din $u $brk +pentru $u $brk +cu $u // with +fără f,@r@ $pause // without +fara f,@r@ $pause // (fără) +lângă $brk // beside +prin $brk // through +după $brk // after, behind +dupa dup@ $brk // (după) +dintre $brk // between +intre $brk // between +asupra $brk // about, on, with +sub $brk // below +până $pause // from, until +despre $brk // about, on +spre $brk // towards +către k'@t@-*e $brk // towards + + +// conjunctions +// şi $u $pause // and +iar $pause // and, again +sau $u $pause // or +ori $u $pause // or +dar $u $pause // but +deoarece $pause // because +dacă $u $pause // if +daca dak@ $u $pause // (dacă) +când $u $pause // when +cum $pause // how, as, since +astfel $pause // thus +deşi $2 $pause // although +fie fie $u // either +însă $pause // but, yet, however +atunci $pause // therefore +(de atunci) d%e||at'untSi $pause // since then +nici $pause // neither +deci $pause // therefore, so that +fiindcă $pause // because, since, as +fiind $pause + + +// negative +nu $u+ + +// questions + + +// some common adjectives and adverbs +aşa $2 $brk // so, thus +orice $u3+ // any +totuşi $1 $brk // never, though, nevertheless +totusi $1 $brk // (totuşi) +unde $brk // where + + +// auxillary verbs (be, have, can, etc) +să $u + + +sunt $u+ // to be +eşti jeStI^ $u+ +este jeste $u+ +suntem $u1+ +sunteţi $u1+ +sunt $u+ +e je $u +e e $atend +fost $u+ // been +eram je*am $u2+ // was +erai je*aI $u2+ +era je*a $u2+ +eraţi je*ats;I^ $u2+ +erau je*aU $u2+ + +avea ave|a $u3+ // to have +as $u+ $verbf +ai $u+ $verbf +ar $u+ $verbf +am $u+ $verbf +aţi $u+ $verbf +au $u+ +are $u+ // ?? +avem $u+ +aveţi $u+ + +voi $u+ $verbf // will +vei $u+ $verbf +va $u+ $verbf +vom $u+ $verbf +veţi $u+ $verbf +vor $u+ $verbf + +există $u // there is + +face $u+ // to do + +putea $u2+ // may +pot $u+ $verbf +poţi $u+ $verbf +poate $u+ $verbf +putem $u+ $verbf +puteţi $u+ $verbf + +trebui t@-*ebw'i // to have to +trebuie $2 // @- + + + +// Final "i" is stressed +absolvi $3 +ciocni $2 +citi $2 +dărui d@*w'i +deosebi $3 +descoperi $4 +deveni $3 +întâlni $3 +izbi $2 +lovi $2 +opri $2 +pocni $2 +răsuci $3 +teori $2 + + +// hyphenated contractions +(să l) s@l $u +(să i) s@I $u +(să şi) s@S;I^ $u +(să mi) s@m;I^ $u +(te am) team $u +(te ai) teaj $u +(ne am) team $u +(l a) la $u +(l au) laU $u +(l am) lam $u +(l aţi) lats;I^ $u +(v aţi) vats;I^ $u +(i am) jam $u +(a şi) aS;I^ $u +(într o) ynt@-*o +(dintr o) dint@-ro + +// MAIN WORD DICTIONARY +//********************* +// Use of $alt: +// replaces final [j] by ['i] (i.e. "i" is stressed if followed by a vowel) + +abil $2 +abzice $2 +acelaş $2 +adventice $3 +aer aIer +aici a'itSI^ +altceva $3 +apoi $2 +artefice $3 +asemenea $2 + +biseric $2 + +capitol $2 +careva $3 +cândva $2 +câteva $3 +cerbice $2 +ceva $2 +cicatrice $3 // @- +cineva $3 +chimi $alt +chimic $1 +complice $2 +contrazice $3 +creier $1 // @- + +deja $2 +denzic $2 +denzice $2 +deoarece $4 +destul $2 +dincolo $1 +director $2 +dori $2 + +edit $1 +egale $2 +energi $alt +elice $2 +exista $3 + +factice $2 +fenicşi $1 +fenix $1 +ferice $1 +filozofi $alt +filozofii $4 +fizic $1 +fizicul $1 +folosi $3 + +gastronomi $alt +gâgâlice $3 +găurice $2 +ghilimele $3 +gimnastic $2 +gimnaziu dZimn'azju + +imagin $2 +înainte yna'inte +interzice $3 + +latice $2 +limit $1 +lipsi $2 +logic $1 + +matrice $2 +maxim $1 +maximum $1 +merit $1 +mia m'ia +mie m'ie +minum $1 +minumum $1 +murdărie murd@*'ie +muzik $1 + +nimic $2 +novice $2 +numai $1 // only + +oareşice $4 +obişnuit obiSnw'it +ocol $2 +ordin $1 +orice $3 +ovidiu ovidj'u + +pagin $1 +parodi pa*od'i +parodii $3 +plânger $1 +politic $2 +pricin $1 +prieten $2 +prietenie p@-*jeten'ie +privi $3 +propice $2 +protocol $4 + +regul $1 +reguli $1 +repede $1 +repezi $1 +români romyn'i +rotocol $3 + +sadic $1 +sâmbătă $1 +securice $3 +sergiu sergj'u +sigur $1 +simbolic $2 +spaţiu spatsju + +tanti tanti +târcol $2 +târziu tyrz'iu +terapi $alt +terapii $3 + +ultim $1 +undeva $3 + +veder $2 +vineri $1 +vinovăţi $alt +vinovăţii $4 +virgulă $1 +virus $1 + diff --git a/dictsource/ro_rules b/dictsource/ro_rules new file mode 100644 index 00000000..d4313a37 --- /dev/null +++ b/dictsource/ro_rules @@ -0,0 +1,329 @@ +// translation rules for Romanian +// This file is UTF-8 encoded + + + +.group a + a a + ai aI + ai (_ 'aI + au aU // ?? only at end of word ?? + au (_ 'aU + a (AAA a + &) a (_S1q a + gi) a (_S1q 'a + V@) a (_ 'a + ăi) a (_ 'a + @) abil (_ 'abil + _) anti (@P4 anti + @) ale (_ 'ale + +.group ă + ă @ + ăi @I + ău @U // ?? only at end of word ?? + ău (_ @U + + ăi (m_ @'i + ăi (t_ @'i + ăi (ţi_ @'i + + &) ă (_S1 @ + ări (A_ @*'i + ării (_ @*'iI + ări (AA_ @*'i + +.group â + â y + âi yI + âu yU + + +.group b + b b + @) b (i_ b; + + @) b (il_ =b + mo) bil (_ b'il + + +.group c + c k + c (e tS + c (i tS + ci (o tS + cii tSiI + ch k + @@) col (_ =kol + @@) coli (_S1t =I^ + @@) cole (_S1t =e + +.group d + d d + @) d (i_ d; + + +.group e + e e + ei eI +// eu eU // only at end of word ?? +// eu e[u // ?? + eu (_ 'eU + ea ea + &) ea (_S2q ea + eai eaj + eau eaw + eoa 'eOa + eo eo + e (AAA e + + &) e (_S1q e + &C) e (re_ %e + + _ac) ee (a eI + + r) ei (er_ 'eI + + @) e (re_ =e + @) e (ri_ =e + @) e (rea_ =e + i) e (re_ e + i) e (ri_ e + i) e (rea_ e + + +.group f + f f + @) f (i_ f; + + +.group g + g g + g (e dZ + g (i dZ + gii dZiI + gh g + + +.group h + h h + @) h (i_ C + + +.group i + i i + i (A j + &C) i (_N$1q i/ + &) i (_N$1q i + &) i (-N$1q i // don't reduce to [I^] if a hyphen follows + &') i (_ i + ţi-) i (_ _ // combined with previous word as [iI] + Cr) i (_ i + V&) i (_ 'i // verb + ăC) ia (_ 'ia + âC) ia (_ 'ia + ăC) ie (_ 'ie + âC) ie (_ 'ie + @) ie (_S1q =ie + iei (_ 'ieI + ii iI + &) ii (_S2q iI + iii iji + iu (_ iU + iu ju + + &) ic (_ =ik + &) ice (_ =itSe + &) ing (_ %iNg // foreign words + i (t_ 'i + + @ic) ii (_S2q ilor + @ic) ilor (_S4q ilor + + +.group î + î y + + +.group j + j Z + @) j (i_ Z; + + +.group k + k k + + +.group l + l l + @) l (i_ l; + _) l (_ le + -) l (_ l // -l + + iu) l (_S1t l + &) le (_S2t le + &) lor (_S3t lor + &) lui (_S3t luI + &) logi (A_ lodZ'i + &) logii (_ lodZ'iI + +.group m + _) m (_ me + m m + @) m (i_ m; + _) m (-a m + + +.group n + _) n (_ ne + n n + @) n (i_ n; + n (g N + n (k N + @) n (tic_ =n + @) n (ic_ =n + _) n (-a n + + +.group o + o o + oa Oa + oai Oaj + oi oI + oi (_ 'oI + ou oU + ou (_ 'oU + o (AAA o + + +.group p + p p + @) p (i_ p; + + + +.group q + q k + qu kw + + +.group r + r r + A) r (A * + C) r (A @-* + rr *r + A) r (i_ *; + + _) re (@P2v re + _) re (gul re + @u) ri (_NS2t rI^ + @u) rile (_S4t rile + + +.group s + _) s (_ se + _) s (-a s + s s + @) s (i_ s; + + &) sprezece (_S8t sp@-*ez,etSe + + +.group ş + ş S + @) ş (i_ S; + + +.group t + t t + tt (_ t + @) t (i_ t; + + +.group ţ + ţ ts + @) ţ (i_ ts; +// @) ţi (-mă ts;'i +// @) ţi (-vă ts;'i +// @) ţi (-le ts;'i +// @) ţi (-i ts;'iI +// @) ţi (-l ts;'i + + +.group u + u u + u (A w + ui uI + ui (e wi + V&) ui (_ w2'i + ui (m_ w2'i + ui (t_ w2'i + ui (ţi_ w2'i + &) ul (_S2t ul + + @ic) ul (_S2 ul + @ic) uri (_S3 urI^ + @ic) urile (_S5 urile + @ic) urilor (_S6 urilor + + +.group v + v v + @) v (i_ v; + + +.group w + w w + + +.group x + x ks + A) x (A gz + ma) x (i ks + e) x (e ks + cone) x (iu ks + i) x (e ks + o) x (e ks // boxele + o) x (i ks // oxigen + a) x (ia ks // axial + ale) x ks + ta) x ks + + +.group y + y i + y (A j + + +.group z + z z + @) z (i_ z; + + + +.group + ö Y + + % prosent // ?? + $ dolar + + plus + & perlwet + @ a*'ond + / sleS + € 'eU*o + + , (D v'irgol@ + + . puntk + . (. _: + \.) . + + __) - (_D m'inus + A_) - (_D _ + C_) - (_D _ + --) - + + * aste*isk + *) * (* + ** + **) * (_ _:: diff --git a/dictsource/ru_list b/dictsource/ru_list new file mode 100644 index 00000000..00391980 --- /dev/null +++ b/dictsource/ru_list @@ -0,0 +1,161 @@ + +// This file is UTF8 encoded + +// NOTE: An additional file: ru_listx contains a large collection of +// Russian words which are marked with their correct stress position. +// +// To improve Russian pronunciation, download this from +// http://espeak.sourceforge.net and put the ru_listx file in the same +// directory as this ru_list file, and then do the command: +// speak --compile=ru + + + +// Numbers +_0 n'ol +_1 Od;'in +_2 dv'A +_3 t;r'i +_4 ts;It'yr;I +_5 p;'jat; +_6 S'Es;t; +_7 s;'em +_8 v'os;E2m +_9 d;'ev;It; +_10 d;'es;It; +_11 Od;'innVttsVt; +_12 dv;In'AttsVt; +_13 tr;In'AttsVt; +_14 ts;It'y@-*nVttsVt; +_15 p;Itn'AttsVt; +_16 SE#stn'AttsVt; +_17 s;Imn'AttsVt; +_18 vOs;Imn'AttsVt; +_19 d;E2v;Itn'AttsVt; +_2X dv'AttsVt; +_3X tr;'ittsVt; +_4X s'o@-*Ok +_5X p;Id;d;Is;'jat +_6X SE2z;d;d;Is;'jat +_7X s;'emd;E2s;It +_8X v'os;E2md;E2s;It +_9X d;E2v;In'ostO +_0C st'o +_2C dv;'es;t;I +_3C tr;'ista +_4C ts;It'yr;E2sta +_5C p;,It;s'ot +_6C S,E#s;t;s'ot +_7C s;,Ims'ot +_8C vOs;Ims'ot +_9C d;E2v;It;s'ot +_0M1 t'ys;Its;V +_1M1 t'ys;Its;V // no '1' before thousand +_0M2 m;,IlI;'on +_0M3 m;,IlI;'art +_dpt _:'i_: // start of decimal fraction +_dpt2 _d;Is;'atYx // end of decimal fraction + +// prepositions +в v $u // to,in,at +от $u // from +с s $u // with,from,since +у u $u // by +на $u // on +для $u // for + + +// conjunctions +и i $u $pause // and +а $u $pause // and +а $atend +но $u $pause // but +ибо $u $pause // for + +ибо $u $pause // if +хотя $2 $pause // although +чтобы $pause // in order that + + +// pronouns +я $u // I + + +// questions +что Sto $u $pause // what, that + + +// misc. +не $u // negative + + +// auxillary verbs +быть $u1 // to be +побыть $u2 + +есмь $u1 +еси $u2 +есть $u1 +есмы $u1 +есте $u1 +суть $u1 + +был $u1 +были $u1 +было $u1 +побыл $u1 +побыла $u3 +побыло $u2 +побыли $u2 + +буду $u1 +будешь $u1 +будет $u1 +будем $u1 +будете $u1 +будут $u1 +побуду $u2 +побудешь $u2 +побудет $u2 +побудем $u2 +побудете $u2 +побудут $u2 + +мочь $u // can +смочь $u1 + +могу $u2 +можешь $u1 +может $u1 +можем $u1 +можете $u1 +могут $u1 + +мог $u1 +могла $u2 +могло $u2 +могли $u2 +смог $u1 +смогла $u2 +смогло $u2 +смогли $u2 + +смогу $u1 +сможешь $u1 +сможет $u1 +сможем $u1 +сможете $u1 +смогут $u1 + +// Letters +// If a letter has a "word" pronunciation which is different from its +// "letter" name, then include the letter name here, with the letter +// prefixed by a _ character. +_в vE +в vE $atend +_с Es +с Es $atend + + +// exceptions +радио r'ad;Io diff --git a/dictsource/ru_rules b/dictsource/ru_rules new file mode 100755 index 00000000..62ce34b2 --- /dev/null +++ b/dictsource/ru_rules @@ -0,0 +1,701 @@ +// Russian translation rules +// This file is UTF8 encoded + +// Special characters: +// A vowel: а о у ы э е ё и ю я +// B soft consonant: ь й ч щ +// C any consonant: +// F consonant, not hard: ?? +// G voiced: б в г д ж з +// H hard consonant: ъ ж ц ш +// Y iotated vowel, softsign: ь е ё и ю я +// L08 кпстфх +// L09 бгджзлмнр + + +.group а + _) а (_ a + _) а a + а (_ a + B) а (_ V + а V + +.group б + _) б (_ bE + б (_ p + б (кь p + б (кY p + б (сь p + б (сY p + б (ть p + б (тY p + б (хь p + б (хY p + б (хкь p + б (хкY p + б (ч p + б (щ p + + б (ь b; + б (Y b; + б (бь b; + б (бY b; + б (бмь b; + б (бмY b; + б (бвь b; + б (бвY b; + б (мь b; + б (мY b; + б (вY b; + б (вь b; + + б (ь_ p; + б (пь p; + б (пY p; + б (фь p; + б (фY p; + б (ффь p; + б (ффY p; + + б b + +.group в + _) в (_ vE + в (_ f + в (кь f + в (кY f + в (сь f + в (сY f + в (ть f + в (тY f + в (хь f + в (хY f + в (хкY f + в (хкь f + в (ч f + в (щ f + + в (ь v; + в (Y v; + в (бь v; + в (бY v; + в (мь v; + в (мY v; + в (вь v; + в (вY v; + в (вбь v; + в (вбY v; + в (вмь v; + в (вмY v; + + в (ь_ f; + в (п' f; + в (ф' f; + + в v + +.group г + _) г (_ gE + г (_ k + г (кь k + г (кY k + г (пY k + г (пь k + г (сь k + г (сY k + г (ть k + г (тY k + г (фь k + г (фY k + г (ффь k + г (ффY k + г (хь k + г (хY k + г (хкY k + г (хкь k + + г (ь g; + г (Y g; + + г g + +.group д + _) д (_ dE + д (_ t + + д (кь t + д (кY t + д (пь t + д (пY t + д (фь t + д (фY t + д (ффь t + д (ффY t + д (хь t + д (хY t + д (хкY t + д (хкь t + д (щ t + + д (ь d; + д (Y d; + д (дь d; + д (дY d; + д (зь d; + д (зY d; + д (нь d; + д (B d; + + д (ь_ t; + д (ть t; + д (тY t; + д (сь t; + д (сY t; + + д (ш t + д (щ t + + д d + +.group е + _) е (_ je + _) е jI3 //second position + A) е (_ jI3 //second position + ъ) е (_ jI3 //second position + ь) е (_ jI3 //second position + + A) е jE2 + ъ) е jE2 + ь) е jE2 + + + H) е (_ E# + H) е E2 + + е (_ I2 + е E3 + + +.group ж + _) ж (_ ZE + ж (кY S + ж (кь S + ж (пY S + ж (пь S + ж (сь S + ж (сY S + ж (ть S + ж (тY S + ж (фь S + ж (фY S + ж (ффь S + ж (ффY S + ж (хь S + ж (хY S + ж (хкY S + ж (хкь S + + ж Z + +.group з + _) з (_ zE + + з (_ s + + з (кY s + з (кь s + з (пь s + з (пY s + з (фь s + з (фY s + з (ффь s + з (ффY s + з (хь s + з (хY s + з (хкY s + з (хкь s + з (щ s + + з (ь z; + з (Y z; + з (дь z; + з (дY z; + з (зь z; + з (зY z; + з (здь z; + з (здY z; + з (знь z; + з (знY z; + з (знB z; + з (нь z; + з (нY z; + з (нB z; + + з (зь_ s; + з (зY_ s; + з (здь_ s; + з (здY_ s; + з (знь_ s; + з (знY_ s; + з (знB_ s; + з (ть s; + з (тY s; + з (сь s; + з (сY s; + + з (ж Z + з (ш S + з (щ s;s; + з (ч s;s; + з z + +.group и + _) и (_ i + _) и I + и (_ I + и I# + H) и y // preceded by hard consonant + + +.group й + _) й (_ ,i'k@-*'AtkOjI + й j + +.group к + _) к (_ kA + к (б g + к (бь g + к (бY g + к (г g + к (гь g + к (гY g + к (д g + к (дь g + к (дY g + к (дB g + к (ж g + к (з g + к (зь g + к (зY g + + к (ь k; + к (Y k; + + к k + +.group л + _) л (_ El^ + л (_ l^ + л (Y l^ + л l + +.group м + _) м (_ Em + м (ь m; + м (Y m; + м (бь m; + м (бY m; + м (пY m; + м (пь m; + м (вь m; + м (вY m; + м (фь m; + м (фY m; + м (ффь m; + м (ффY m; + + м m + +.group н + _) н (_ En + н (ь n; + н (Y n; + н (B n; + н (дь n; + н (дY n; + н (дB n; + н (ть n; + н (тY n; + н (зь n; + н (зY n; + н (сь n; + н (сY n; + н (нь n; + н (нY n; + н (нB n; + + н n + + +.group о + о o + +.group п + _) п (_ pE + п (б b + п (г b + п (гY b + п (гь b + п (д b + п (дь b + п (дY b + п (дB b + п (ж b + п (з b + п (зь b + п (зY b + + п (ь p; + п (Y p; + п (пь p; + п (пY p; + п (пфь p; + п (пфY p; + п (пмь p; + п (пмY p; + п (фь p; + п (фY p; + п (ффь p; + п (ффY p; + п (мь p; + п (мY p; + + п (б' b; + + п p + +.group р + _) р (_ E* + р (_ r; + р (Y r; + р (B r; + р @-* + +.group с + _) с (_ Es + + с (б z + с (г z + с (д z + с (ж z + с (з z + + с (ь s; + с (Y s; + с (ть s; + с (тY s; + с (сь s; + с (сY s; + с (нь s; + с (нY s; + с (нB s; + + с (зь z; + с (зY z; + с (дь z; + с (дY z; + с (дB z; + + с (ж Z + с (ш S + с (щ s;s; + с (ч s;s; + + с s + +.group т + _) т (_ tE + + т (б d + т (г d + т (д d + т (ж d + т (з d + + т (ь t; + т (Y t; + т (ть t; + т (тY t; + т (сь t; + т (сY t; + т (нь t; + т (нY t; + т (нB t; + + т (зь d; + т (зY d; + т (дь d; + т (дY d; + т (дB d; + + т (ж d + + т t + +.group у + _) у (_ u + B) у u# + у u + +.group ф + _) ф (_ Ef + ф (б v + ф (г v + ф (гь v + ф (гY v + ф (д v + ф (дь v + ф (дY v + ф (дB v + ф (ж v + ф (з v + ф (зь v + ф (зY v + + ф (ь f; + ф (Y f; + ф (пь f; + ф (пY f; + ф (пфь f; + ф (пфY f; + ф (пмь f; + ф (пмY f; + ф (фY f; + ф (фь f; + ф (мь f; + ф (мY f; + + ф (б' v; + + ф f + +.group х + _) х (_ xA + х (б x + х (бь x + х (бY x + х (бмь x + х (бмY x + х (бвь x + х (бвY x + х (г x + х (гь x + х (гY x + х (д x + х (дь x + х (дY x + х (дB x + х (ж x + х (з x + х (зь x + х (зY x + х (_бы x + + х (ь x//С надо сделать эту фонему + х (Y x//С + х (кь x//С + х (кY x//С + + х x + +.group ц + _) ц (_ tsE + ц (б dz + ц (бь dz + ц (бY dz + ц (бмь dz + ц (бмY dz + ц (бвь dz + ц (бвY dz + ц (г dz + ц (гь dz + ц (гY dz + ц (д dz + ц (дь dz + ц (дY dz + ц (дB dz + ц (ж dz + ц (з dz + ц (зь dz + ц (зY dz + + ц ts + +.group ч + _) ч (_ tS;e + ч (б dZ; + ч (бь dZ; + ч (бY dZ; + ч (бмь dZ; + ч (бмY dZ; + ч (бвь dZ; + ч (бвY dZ; + ч (г dZ; + ч (гь dZ; + ч (гY dZ; + ч (д dZ; + ч (дь dZ; + ч (дY dZ; + ч (дB dZ; + ч (ж dZ; + ч (з dZ; + ч (зь dZ; + ч (зY dZ; + + ч tS; + + +.group ш + _) ш (_ SA + ш (б Z + ш (бь Z + ш (бY Z + ш (бмь Z + ш (бмY Z + ш (бвь Z + ш (бвY Z + ш (г Z + ш (гь Z + ш (гY Z + ш (д Z + ш (дь Z + ш (дY Z + ш (дB Z + ш (ж Z + ш (з Z + ш (зь Z + ш (зY Z + + ш S + +.group щ + _) щ (_ S;ja + щ (б Z; + щ (бь Z; + щ (бY Z; + щ (бмь Z; + щ (бмY Z; + щ (бвь Z; + щ (бвY Z; + щ (г Z; + щ (гь Z; + щ (гY Z; + щ (д Z; + щ (дь Z; + щ (дY Z; + щ (дB Z; + щ (ж Z; + щ (з Z; + щ (зь Z; + щ (зY Z; + + щ S; + + +.group ъ + _) ъ (_ tv;'8@-*dyjzn'Ak + ъ (Y j + ъ + +.group ы + _) ы (_ y + ы y + +.group ь + _) ь (_ m;'jak;I#jzn'Ak + ь + ь (Y j + +.group э + _) э (_ e + _) э E# + э (_ E# + э E2 + +.group ю + _) ю (_ ju + ю u" + _) ю ju + ь) ю ju + ъ) ю ju + A) ю ju + + + +.group я + _) я (_ ja + _) я jI //second position + A) я (_ jI //second position + ъ) я (_ jI //second position + ь) я (_ jI //second position + + A) я jV + ъ) я jV + ь) я jV + я (_ V# + я I3 + +.group ё + _) ё (_ j8 + _) ё j8 + ж) ё O + ш) ё O + ё 8 + +// If we find a Latin letter a-z, then translate as English +.group a + a _^_EN +.group b + b _^_EN +.group c + c _^_EN +.group d + d _^_EN +.group e + e _^_EN +.group f + f _^_EN +.group g + g _^_EN +.group h + h _^_EN +.group i + i _^_EN +.group j + j _^_EN +.group k + k _^_EN +.group l + l _^_EN +.group m + m _^_EN +.group n + n _^_EN +.group o + o _^_EN +.group p + p _^_EN +.group q + q _^_EN +.group r + r _^_EN +.group s + s _^_EN +.group t + t _^_EN +.group u + u _^_EN +.group v + v _^_EN +.group w + w _^_EN +.group x + x _^_EN +.group y + y _^_EN +.group z + z _^_EN + +.group + $ dolar + diff --git a/dictsource/sk_list b/dictsource/sk_list new file mode 100644 index 00000000..af91ce4a --- /dev/null +++ b/dictsource/sk_list @@ -0,0 +1,238 @@ + // translation rules for Slovak +// This file is UTF-8 encoded + +// Letters +_a a: +á d,l-he:'a: +ä 'a:prehlasovane: +b be: +c tse: +č tSe: +d de: +ď d;e: +e e: +é d,l-he:'e: +f ef +g ge: +h ha: +i i: +í d,l-he:'i: +j je: +_k ka: +l el +ľ el^ +ĺ d,l-he:'el +m em +n en +ň en^ +_o o: +ó d,l-he:'o: +ô 'o:sv,oka:n^om +p pe: +q kve: +r er +_s es +š eS +t te: +ť t;e: +u u: +ú dl-he:'u: +_v ve: +w dv'ojite:,ve: +x iks +y ipsilon +ý d,l-he:'i: +_z zet +ž Zet + + + +// Numbers +_0 n'ula +_1 j'ed;en +_2 dv'a +_3 t'@-*i +_4 St'i*i +_5 p'&t; +_6 S'est; +_7 s'ed;em +_8 'osem +_9 d;'ev&t; +_10 d;'esat; +_11 j'ed;ena:st; +_12 dv'ana:st; +_13 t@-*'ina:st; +_14 Str-n'a:st; +_15 p'&tna:st; +_16 S'estna:st; +_17 s'ed;emna:st; +_18 'osemna:st; +_19 d;'ev&tna:st; +_2X dv'adsat; +_3X t@-*'idsat; +_4X St'i*idsat; +_5X p'&t;d;esjat +_6X S'est;d;esjat +_7X s'ed;emdsjat +_8X 'osemd;esjat +_9X d'ev&t;d;esjat +_0C st'o +_2C dv'est'o +_0M1 t;'isi:ts +_1M1 t;'isi:ts +_2M1 dv'et;'isi:ts +_0M2 m'ilio:n +_0M3 m'iljarda +_dpt _:tSj,arka_ + + +// Pronouns +sa $u+ // reflexive +si $u+ // reflexive +ho $u+ + +// Prepositions +o o_ $u $brk $alt2 +k k $brk // at,on,to +v v_ $brk // at,in,into +z z_ $brk // from,of +na $u $alt2 // at,for,into +po $pause $alt2 // about,after +pod $pause $alt2 // under +s s_ $pause // with +so $pause $alt2 // with +bezo $pause $alt2 // without +bez $pause $alt2 // without +pri $pause $alt2 // about,beside,at + +// Conjunctions +a $u $pause // and +alebo $u $pause // or +inak $u $pause // or +síce $u $pause // or +ale $pause // however +však $pause // but +okrem $pause // except +mimo $pause // except +čo $u $pause // which,whatever +aj $u $pause // even +že $u $pause // if,that + +ako $u $pause // as + +// Negative +nie $u + + +// Auxillary verbs + +byť $u // to be +som $u +si $u +je $u +sme $u +ste $u +sú $u +bol $u+ // been + + +// treat as letters if at the end of the clause +a a: $atend // letter-a +k ke: $atend // letter-k +o o: $atend // letter-o +s es $atend +v ve: $atend +z zet $atend + +// Exceptions + +// don't soften (d,n,t) before e,i +aktívni $alt +definitívne $alt +demo $alt +depresívni $alt +diagnostík diagnosti:k +enter $alt +fénix $alt +flexibilní $alt +hodni $alt +ídea $alt +ídee $alt +ideí $alt +ídei $alt +ídeou $alt +ídeu $alt +ídey $alt +individuálne $alt +iní $alt +init $alt +introvertní $alt +jeden $alt +júni $alt +každej $alt +legislatívne $alt +logistík $alt +mánia $alt +mánie $alt +mániou $alt +mániu $alt +martin $alt +matkini $alt +matkiní $alt +midi $alt +mimovládne $alt +mladej $alt +mladí $alt +nadísť $alt +negatívne $alt +odeň $alt +odísť $alt +okienečko $alt +okolití $alt +onen $alt +oní $alt +opatrní $alt +ostatní $alt +pekní $alt +peter $alt +pijatika $alt +podeň $alt +podísť $alt +postihnutí post;ihnuti: +poverení $alt +požiarne $alt +predeň $alt +predísť $alt +presvedčení $alt +príbuzní $alt +priemerní $alt +prijatí $alt +pripravení $alt +rôzne $alt +samotní $alt +schopní $alt +štatutárni $alt +súčasní $alt +sveter $alt +teda $alt +tejto $alt +televízne $alt +temer $alt +ten $alt +teraz $alt +tí $alt +tie $alt +tieto $alt +títo $alt +únia $alt +únie $alt +únii $alt +úniu $alt +vážení $alt +vínečko $alt +vinen $alt +vinní $alt +všeteční $alt +vtedy $alt +žiadni $alt +zruční $alt diff --git a/dictsource/sk_rules b/dictsource/sk_rules new file mode 100644 index 00000000..61219cb6 --- /dev/null +++ b/dictsource/sk_rules @@ -0,0 +1,624 @@ +// translation rules for Slovak +// This file is UTF-8 encoded + +.group a + a a + +.group á + á a: + +.group ä + ä e + +.group b + b b + b (_ p + b (_G b + +.group c + c ts + ch x + +.group č + č tS + +.group d + d d + d (_ t + d (_G d + d (e d; + d (e_ d + d (i d; + d (í d; + d (eT d // word has $alt attribute + d (iT d + d (íT d + dz dz + dz (_ ts + dz (_G dz + dž dZ + dž (_ tS + dž (_G dZ + + d (istic d + _) d (ekor d + _) d (eleg d + _) d (elim d + _) d (epres d + _) d (eviz d + _) d (ivíz d + _han) d (i d +_korešpon) d (en d + _na) d (íd d + _na) d (íď d + _pre) d (izb d +_štandar) d (iz d + _vi) d (ea d + _vi) d (eo d + _vi) d (eu d + a) d (e d + in) d (i d + man) d (it d + mé) d (i d + mo) d (er d + or) d (i d + _prezi) d (ent d + _) d (etektí d + _) d (iftín d + d (izmus d + _i) d (enti d + _pre) d (iš d + _) d (efinitív d + _o) d (iš d + d (idakti d + _mo) d (i d + _o) d (in d + _o) d (is d + _) d (iec d + _) d (iet t + _štú) d (i d + melo) d (i d + _mo) d (el d + _mo) d (em d + _fe) d (er d + _evi) d (en d + _) d (isk d + _e) d (it d + _skan) d (i d +_invali) d (iz d + _meto) d (i d + _) d (einte d + _) d (ekád d + _in) d (ex d + tra) d (i d + _) d (imen d + _šta) d (i d + _) d (iá d + _) d (ié d + _) d (ez d + _) d (etail d + me) d (i d + _) d (ekór d + _) d (ia d + _) d (ig d + _) d (ip d + _) d (is d + d (ef d + d (ió d + d (etek d + d (if d + d (io d + d (ir d + _štá) d (i d + _au) d (i d + d (ick d + o) d (ic d + o) d (ik d + _) d (ekrét d + _po) d (íď d + d (ik_ d +_invali) d (it d + _po) d (íd d + d (ikt d + d (eterm d + d (isp d + d (ist d + _štu) d (i d +_štipen) d (i d + _i) d (eá d + kre) d (i d + _ra) d (ikál d + _i) d (ea d + _) d (evíz d + i) d (en d + i) d (eo d + _i) d (il d + _i) d (io d + _ko) d (ifi d + _expe) d (i d + meló) d (i d + _) d (esig d + _tra) d (í d + _štu) d (en d + _au) d (i d + _) d (esti d + d (iskre d + diskre) d (i d + _ka) d (et d + _) d (eci d + d (isku d + _pre) d (íď d + _pre) d (íd d + _) d (ekrement d + _o) d (íď d + + +.group ď + ď d; + ď (_ t; + ď (_G d; + +.group e + e e + +.group é + é e: + +.group f + f f + +.group g + g g + g (_ k + g (_G g + +.group h + h h + h (_ x + h (_G h + +.group i + i i + ia %ia + ie %ie + iu %iu + +.group í + í i: + +.group j + j j + +.group k + k k + +.group l + l l + K) l (K l- + +.group ĺ + ĺ l: + +.group ľ + ľ l^ + +.group m + m m + +.group n + n n + n (g N + n (k N + n (e n^ + n (e_ n + n (i n^ + n (í n^ + n (eT n // word has $alt attribute + n (iT n + n (íT n + + n (ent n + _be) n (ef n + _bota) n (i n + _fo) n (e n + _gé) n (i n + _kolo) n (i n + _li) n (e n + _miest) n (e n + _mu) n (i n + _part) n (er n +_personál) n (e n + _prázd) n (e n + _tu) n (is n + _vin) n (e n + _žiad) n (e n + a) n (im n + ál) n (i n + fó) n (i n + fo) n (ic n + ge) n (e n + go) n (i n + harmó) n (i n + ch) n (ic n + ch) n (ik n + ma) n (i n + mag) n (e n + n (eho_ n + orga) n (iz n + ro) n (ic n + ro) n (ik n + sociál) n (e n + správ) n (e n + tro) n (i n + vole) n (í n + _e) n (erg n + inter) n (e n + _defi) n (itív n +_aktuál) n (e n + _mo) n (i n + _re) n (es n + _tré) n (er n + _defi) n (íc n + endro) n (i n + _komu) n (i n + _) n (eón n +_kultúr) n (e n + _) n (egatív n + _) n (egác n + _) n (eoklas n + _me) n (ež n + tré) n (i n + _) n (eutrál n + harmo) n (i n + _te) n (is n + _) n (ikoti n + lí) n (i n +_konkrét) n (e n + _matki) n (e n + _sig) n (i n + _tech) n (i n + gó) n (i n + _reál) n (e n + i) n (ici n + n (ist n + _) n (eg n + mu) n (ik n + mu) n (is n + tago) n (is n + rôz) n (e n + _mecha) n (i n + _koló) n (i n + _) n (eoprén n + _mi) n (i n + _ge) n (i n + _imu) n (i n +_špeciál) n (e n + o) n (ic n + o) n (ik n + o) n (is n + _admi) n (ist n +_administratív) n (e n + n (izmus_ n + _váž) n (e n + formál) n (e n + _štát) n (e n + štát) n (e_ n + riad) n (e n + _pa) n (el n + _) n (eore n + _) n (erv n + natív) n (e n + _) n (ext n + +.group ň + ň n^ + +.group o + o o +// ou (_ ow + ou oU + +.group ó + ó o: + +.group ô + ô uo + +.group p + p p + +.group q + q k + qu kv + +.group r + r r + A) r (A * + C) r (A @-* + rr *r + + K) r (K r- + + +.group ŕ + ŕ r: + +.group s + s s + +.group š + š S + +.group t + t t + t (e t; + t (e_ t + t (i t; + t (í t; + t (eT t // word has $alt attribute + t (iT t + t (íT t + + _teres) t (ri t + + t (ik_ t + t (ing t + t (ist t + _atlan) t (i t +_automa) t (i t + _cer) t (i t + _herme) t (i t + _ins) t (i t +_konkre) t (iz t + _konš) t (i t + _kozme) t (i t +_matema) t (i t + _sensi) t (i t + _ver) t (i t + a) t (in t + a) t (iz t + ak) t (i t + ama) t (ic t + ama) t (ik t + an) t (i t + as) t (ic t + ro) t (ic t + ro) t (ik t + komple) t (iz t + ma) t (ick t + op) t (i t + par) t (i t + t (ick t + rk) t (i t + _sa) t (ir t + _sa) t (is t + _iden) t (i t + _exo) t (i t + pres) t (iž t +_farmaceu) t (i t + os) t (ic t +_diagnos) t (i t + _s) t (imul t + didak) t (i t + _kon) t (i t + i) t (ic t + _synte) t (i t + _abs) t (i t + _) t (iran t + _reš) t (i t + _tex) t (il t + _pu) t (ik t + o) t (ic t + o) t (ik t + ven) t (il t + ak) t (ik t + _magne) t (i t + ma) t (ik t + e) t (ic t + e) t (ik t +_preven) t (ív t + _inš) t (i t + _deinš) t (i t + t (izmus_ t + tema) t (i t + inves) t (i t + ek) t (í t + _balis) t (i t + ek) t (i t + en) t (in t + a) t (ick t +_produk) t (i t + _) t (itan t + _fone) t (i t + _niko) t (i t + _šta) t (i t +_štatis) t (i t + cha) t (ic t + cha) t (ik t + li) t (ic t + _) t (itul t + _kul) t (i t + _kri) t (ic t + _kri) t (ik t + _kri) t (iz t + _apa) t (i t + _chao) t (ic t + _chao) t (ik t + ep) t (ic t + ep) t (ik t +_charakteris) t (i t +_charakteris) t (ík t + _š) t (ipendi t + _cen) t (i t + _ak) t (iv t + ý) t (ic t + mo) t (iv t + s) t (ic t + n) t (ic t + n) t (in t + _mul) t (i t + _kons) t (i t + _jus) t (i t + i) t (ik t + _des) t (i t + _an) t (i t +_antipa) t (i t + ema) t (i t + _) t (imotej t + + _sensi) tí ti: + _dif) tí (n ti: + _) tí (mov ti: +_defini) tí (v ti: + _ak) tí (v ti: + _detek) tí ti: + mo) tí (v ti: + _pales) tí ( ti: + _nega) tí (v ti: + i) tí (v ti: + a) tí (v ti: + _audi) tí (v ti: + or) tí (m ti: + spek) tí (v ti: +_produk) tí (v ti: +_alterna) tí (v ti: +_konštruk) tí (v ti: + _jus) tí ti: + viknu) tí ti: + + + +.group te + _) te (letext te + _) te (rap te + _) te (ras te + _) te (rez te + _exis) te (n te + _ho) te (l te +_charak) te (r te + _in) te (l te + _in) te (n te + _kompe) te (n te + _ma) te (mati te + _ma) te (ria te + _ma) te (riá te + _stra) te (g te + ia) te (_ te + me) te (r_ te + v) te (dajš te + zavia) te ( te + _de) te (ktí te + _) te (ó te + in) te (rne te + _) te (o te + te (x te + _) te (lec te + _) te (lef te + _) te (leg te + _) te (lek te + _) te (lem te + _) te (leo te + _) te (lep te + _al) te (r te + _) te (ler te + _) te (lev te + _) te (lex te + _syn) te (ti te + _wal) te (r te + _) te (ch te + _) te (x te + te (rajš te + _) te (mp te + _) te (nd te + _) te (rč te + _) te (dajš te + _s) te (p te + _archi) te (k te + _pas) te te + _pa) te (nt te + te (mati te + _dein) te ( te + _sep) te (mb te + _é) te (r te + _asis) te (n te + _) te (nis te + nás) te (_ te + _vše) te (č te + _) te (rén te + _) te (réz te + de) te (k te + te (ho_ te + _) te (nto te + s) te (r_ te + _ka) te (d te + _ka) te (g te + _) te (lesk te + te (raz te + _) te (lesen te + _ka) te (ch te + _al) te (rnatív te + de) te (rm te +_charak) te (r te + te (j_ te + te (s_ te + s) te (r te + te (rm te + te (st te + ex) te (r te + _) te (leter te + _tele) te (r te + _po) te (n te + in) te (r te + _sys) te (m te + _al) te (rn te + _syn) te ( te + + + +.group ť + ť t; + +.group u + u u + +.group ú + ú u: + +.group v + v v + A) v (K w + A) v (n v + A) v (ň v + v (stať v +o) v (_ u + +.group w + w v + +.group x + x ks + +.group y + y i + +.group ý + ý i: + +.group z + z z + z (_ s + z (_G z + +.group ž + ž Z + ž (_ S + ž (_G Z + +.group + ě e + ů u: // czech + $ dola:r + % percento + + plus + +// 557 \ No newline at end of file diff --git a/dictsource/sv_list b/dictsource/sv_list new file mode 100755 index 00000000..39c09126 --- /dev/null +++ b/dictsource/sv_list @@ -0,0 +1,286 @@ + +// This file in UTF8 encoded + +// Letters +// If a letter has a "word" pronunciation which is different from its +// "letter" name, then include the letter name here, with the letter +// prefixed by a _ character. + + +// character names +//*************** +a A: +b be: +c se: +d de: +e e: +f Ef +g ge: +h hO: +i i: +j ji: +k kO: +l El +m Em +n En +//o o: +p pe: +q ku- +r Er +s Es +t te: +//u u- +v ve: +w d'8b@lve: +x Eks +y y: +z s'e:t@ + +_. p'8Nkt + + +// numeric +//******** +_0 n'Ol +_1 'Et +_2 tv'o: +_3 tr'e: +_4 f'y:ra +_5 f'Em +_6 s'Eks +_7 sx'u- +_8 'Ota +_9 n'i:u: +_10 t'i:;u: +_11 'Elva +_12 t'Olv +_13 tr'EtOn +_14 fj'u:rtOn +_15 f'EmtOn +_16 s'EkstOn +_17 sx'8tOn +_18 'A:rtOn +_19 n'ItOn +_2X S;'u-gu: +_3X tr'Eti: +_4X f'Y:rtI +_5X f'Emti: +_6X s'Eksti: +_7X sx'8ti: +_8X 'Oti: +_9X n'Iti: +_0C h'8ndra +_0M1 t'u-sEn +_0M2 mIlj'u:nEr +_1M2 mIlj'u:n +_0M3 bIlj'u:nEr +_1M3 bIlj'u:n +_dpt p'8Nkt + +// abbreviations +//************** + + +// articles +en En $u +ett $u + + + +// pronouns +jag jA:g $u +du $u +han han $u +hon hUn $u +den dEn $u +det de:t $u +man man $u +vi $u +ni $u +de $u + + +// possessive adjectives +min mIn $u+ +mitt $u+ +mina $u+ +din dIn $u+ +ditt $u+ +dina $u+ +sin sIn $u+ +sitt $u+ +sina $u+ +hans $u+ +hennes $u+ +dess $u+ +vår $u+ +vårt $u+ +våra $u+ +er $u+ +ert e:rt $u+ +era $u+ +erat E:rat $u+ +eran E:ran $u+ +deras de:ras $u+ + +// prepositions +i i: $u $brk // in +på $u // on, in, at +vid $u $brk // by, at, next to +av $u // of, by +med $u $brk // with +för $u $brk + +om $u $brk // about +till $u $brk // to +från fr'o:n $u $brk // from +mot $u $brk // towards +över $brk // over +längs $brk // along +genom $brk // through +efter $brk // after +innan $brk // before +under $brk // during + + +// conjunctions +och 'Ok $u $pause // and +eller $u $pause // or +om $u $pause // if +då $u $brk // as +fastän $pause // although +medan $pause // while + +än En $u // than +att $u $pause // that +som $u $pause // that, which + +// negative + +// questions + + +// auxillary verbs (be, have, can, etc) +är 'E:r $u // is +var vA:r $u // was + +har $u // has +hade hadE $u // had + +ska skA: $u // will (future) + +kan k'an $u // can +kunde $u // could +vill $u // want to +ville $u // wanted to +ska skA: $u // should, supposed to +skulle $u +bör $u // should, ought to +borde $u +brukar $u // usually +brukade $u // used to + + +// some common adjectives and adverbs +någon n,o:gOn $u // some +något n,o:gOt $u +några n'o:gra $u + + +// MAIN WORD DICTIONARY +//********************* +andas andas +andras andras +arkiv 'arki:v +av A:v $u +bäste b'EstE +betala b'Et'A:l,a +betalt b'Et'A:lt +bort bOrt +botten b'OtEn +bra brA: +dan dA:n +dem dEm +dig dEj +dra drA: +därför d'ErfY:r +emot Em'u:t +ett 'Et +fem fEm +fram fr'am +framme fr'amE +gemensam jEm'e:nsam +gemensamt jEm'e:nsamt +ha hA: +har hA:r $u +hej hEj +honom hOnOm +idag Id,A:g +in In +ja jA: +jan jA:n +klar klA:r +log l'u:g +mat mA:t +men mEn +mig mEj +ost Ust +program prUgr'am +redigera rEdIS;'e:ra +sex s'Eks +sig sEj +skolan sk'u:lan +son so:n +stan stA:n +svar svA:r +tar tA:r +ta tA: +tomt t'Umt +tom t'Um +torsdag t'u:SdA:g +vad vA:d $u +var vA:r $u +vem vEm + + +// some words to translate using English (mostly for screenreaders) +adobe _^_EN +browser _^_EN +button _^_EN +cancel _^_EN +checked _^_EN +desktop _^_EN +dot _^_EN +email _^_EN +Explorer _^_EN +firefox _^_EN +frame _^_EN +graphic _^_EN +heading _^_EN +image _^_EN +internet _^_EN +jaws _^_EN +leaving _^_EN +level _^_EN +link _^_EN +mail _^_EN +messenger _^_EN +Microsoft _^_EN +mozilla _^_EN +name _^_EN +no _^_EN +office _^_EN +one _^_EN +online _^_EN +orca _^_EN +password _^_EN +read _^_EN +software _^_EN +submenu _^_EN +tray _^_EN +unchecked _^_EN +unselected _^_EN +user _^_EN +view _^_EN +web _^_EN +word _^_EN diff --git a/dictsource/sv_rules b/dictsource/sv_rules new file mode 100755 index 00000000..dcd3ffa3 --- /dev/null +++ b/dictsource/sv_rules @@ -0,0 +1,368 @@ + +// Swedish translation rules +// This file is UTF8 encoded + +.group a + a A: + a (vs A: + a (vb A: + a (vd A: + a (va a + a (rt_ A: + a (r_ a + a (r_ a + b) a (r_ A: + bb) a (r_ a + a (CC a + a (_ a + &) a (_ a2 + a (re_ a + a (rn A: + a (rna a + l) a (rs A: + k) a (ta ,a + m) a (j a + om) a (t A: + st) a (rt A: + gr) a (m a + a (x a + p) a (nel a + k) a (n a + j) a (n a + r) a (de a + eg) a (n a + er) a (d a + er) a (t a + d) a (n_ a + tot) a (l 'A: + v) a (ld A: + v) a (rd A: + sm) a (rt A: + r) a (t A: + s) a (maC a + ng) a (d a + m) a (n a + t) a (t A: + ent) a (r A: + a (t_ a + a (st a + s) a (s_ a + s) a (d_ a + er) a (t_ a + åg) a (n a + t) a (n_ a + el) a (d a + nn) a (n a + mell) a (n a + arbet arbe:t + +.group b + b b + b (b + +.group c + c k + cc k + cc (A k: // ?? + c (e s + c (i s + c (y s + c (ä s + c (ö s + ch S + ck k + ck (A k: // ?? + computer _^_EN + click _^_EN + +.group d + d d + d (d + dagen dA:gEn + +.group e + e e: + h) e (m E + e (CC E + med) e (l E + b) e (s E + b) e (k E + e (j E + d) e (lv e: + d) e (ln e: + d) e (lt e: + + e (ta E + e (x E + &) e (_ E + &) es (_ Es + &) en (_ En + &) ens (_ Ens + &) er (_ Er + &) et (_S2 Et // ?? + e (ve E + t) e (lef E + h) et (_ e:t + m) e (ny E + n) e (ds e: + br) e (v e: + sv) e (r E + _s) e (p E + ka) e (l E + b) e (l_ E + nyh) e (t e: + r) e (sul E + r) e (sur E + pr) e (n E + _) e (tik E + r) e (ce E + +espeak _^_EN + +.group f + f f + f (f + +.group g + g g + gg g + g (e j + g (i j + g (y j + g (ä j + g (ö j + g (t k + g (n N + gj j + group _^_EN + +.group h + h h + h (h + hj j + heading _^_EN + +.group i + i i: + i (CC I + i (g_ I + item _^_EN + _fl) i (k i: + t) i (d i: + skr) i (v i: + v) i (sn i: + imag _^_EN + +.group j + j j + +.group k + k k + +// kk k +// kk (A k: // double k not used +// k ( er k +// k ( en k + kj S; + _) k (e S; + _) k (iC% k + _) k (i S; + _) k (y S; + _) k (ä S; + _) k (ö S; + k (öp S; + karta kA:rta + kategori katEg,u:ri: + kalend kal'End + känsl SEnsl + +.group l + l l + l (l + lg (_ lj + _) lj j + +.group m + m m + m (m + menu _^_EN + människ m'EnIsx, + medlem m'e:dlEm + maga maga + motor m'u:tOr + motorer m'Otu:rEr + +.group n + n n + n (n + ng N + n (k N + network _^_EN + normal nOrmA:l + +.group o + o u: + o (CC O + o (rC u: + o (rr O + o (ll O + o (m_ O + d) o (k O + o (rk O + o (rg O + o (ck O + f) o (n 'o: + l) o (g 'o: + l) o (v 'o: + l) o (gg 'O + b) o (x 'O + s) o (r 'O + k) o (pi 'O + f) o (rm 'O + pr) oj Usx + o (ns U + ss) o (n O + C) o (rs O + k) o (rta O + b) o (rt O + osparat u:spA:rat + och 'Ok + k) o (ns O + pr) o (cent O + +.group p + p p + p (p + paket pak'e:t + +.group q + q k + q (q + qu kw + +.group r + r r + r) r + rs S + rsi (o rsx' + rsk Sk + rsk (i rsx + rss S + rg (_ rj + radera rad'e:ra + +.group s + s s + ss s + sch S + sj sx + sk (e sx + sk (i sx + sk (y sx + sk (ä sx + sk (ö sx + skj sx + stj sx + ssio (n sx'u: + sport spOrt + select _^_EN + säg sEj + sparat spA:rat + svarat svA:rat + + +.group t + t t + tt t + tt (A t: // ?? + ti (on sx' + tj S; + + &C) te (_S2 tE // ?? + task _^_EN + talsyntes t'A:lsynt,e:s + tabell tab'El + +.group u + u u- + u (tb u- + u (tf u- + u (ts u- + u (tr u- + u (tv u- + dat) u (m 8 + u (CC 8 + u (n 8 + u (tl u- + r) u (m_ 8: + +.group v + v v + v (v + +.group w + w v + window _^_EN + wise _^_EN + wire _^_EN + +.group x + x ks + x (x + +.group y + y y: + y (CC y + +.group z + z s + zz z + +.group å + å o: + å (CC O + tr) å (d 'o: + v) å (rt 'o: + +.group ä + ä E: + ä (CC E + ä (r E: + tr) ä (d E: + v) ä (lk E: + l) ä (st E: + + +.group ö + ö Y: + ö (CC 'W + f) ö (rd 'Y: + ö (vr 'Y: + + +.group + é 'e: + + + % prOs'Ent + $ d'Olar + + pl8s + & _:'Ok + @ sn'A:bElA: + / sn'e:dstrEk + € 'Evru: + + + . p'8Nt + . (. _: + \.) . + + __) - (_D m'i:n8s + A_) - (_D _ + C_) - (_D _ + --) - + + * sx'E:rna + *) * (* + ** + **) * (_ _:: diff --git a/dictsource/sw_list b/dictsource/sw_list new file mode 100644 index 00000000..e5052dfc --- /dev/null +++ b/dictsource/sw_list @@ -0,0 +1,198 @@ +// Swahili translation list +// This file is UTF-8 encoded. + +// letters (just guesses) +b bi +c si +d di +f ef +g Ji +h etSi +j Je +k ke +l el +_m em +n en +p pi +q kju +r ar +s es +t ti +v vi +w dabalju +x eks +y jai +z zedi + + + + +// numbers +_0 sif'u*i +_1 m'oJa +_2 _|mb'ili +_3 t'atu +_4 'n-ne +_5 t'ano +_6 s'ita +_7 s'aba +_8 n'ane +_9 t'isa +_1X k'umi +_2X iSi*'ini +_3X TeleT'ini +_4X a*oba'ini +_5X hams'ini +_6X sit'ini +_7X sab'ini +_8X Teman'ini +_9X tis'ini +_0C m'ia +_1C m,iam'oJa +_2C m,ia_|mb'ili +_3C m,iat'atu +_4C m,ia'n-ne +_5C m,iat'ano +_6C m,ias'ita +_7C m,ias'aba +_8C m,ian'ane +_9C m,iat'isa +_1L l'akim'oJa +_2L l'aki_|mb'ili +_3L l'akit'atu +_4L l'aki'n-ne +_5L l'akit'ano +_6L l'akis'ita +_7L l'akis'aba +_8L l'akin'ane +_9L l'akit'isa +_0M1 'elfu +_1M1 ,elfum'oJa +_2M1 ,elfu_|mb'ili +_3M1 ,elfut'atu +_4M1 ,elfu'n-ne +_5M1 ,elfut'ano +_6M1 ,elfus'ita +_7M1 ,elfus'aba +_8M1 ,elfun'ane +_9M1 ,elfut'isa +_0M2 _|mili'oni +_dpt _nukta +_0and _|na + + +li $u // it +si $u // is-not +yu $u // he,she,it +zi $u // they,them +u $u+ // you,it + +ni $u+ // i,me,you, is,are +ku $u+ // it,you +m $u+ // you,him,it +m em $atend +tu $u+ // we,us,only,just + +nami $u+ +nawe $u+ +naye $u+ +nasi $u+ +nanyi $u+ +nao $u+ + + +// pronouns +mimi $u+ +sisi $u+ +wewe $u+ +nyinyi $u+ +yeye $u+ +wao $u+ + +hii $u // this, these +hilo $u+ // this,that (previously menioned) + +wake $u+ // his,her,its +yake $u+ +zake $u+ + + +// prepositions +wa $u $brk // of +ya $u $brk // of,by they,them +la $u $brk // of +cha $u $brk // of +vya $u $brk // of +za $u $brk // of +pa $u $brk // of +kwa $u $brk // of +mwa $u $brk // of + +bi $u $brk // in +fi $u $brk // in,on +pa $u $brk // at + +min $u $brk // from +toka $u $brk // from +katika $u $brk // from, out of +kuanzia $brk // from,since +tangu Su $brk // from,between +hata $u $pause // until +baada $u $brk // after +bila $u $pause // without +hadi $u $pause // up to +huko $u $brk // there, as when + +kwacho $pause // by means of which +kwalo $pause // by means of which +kwao $pause // by means of which +kwavyo $pause // by means of which +kwaye $pause // by means of which + +kwa $u $brk // with +mwenye $u $brk // with +wenye $u $brk // with +yenye $u $brk // with +1enye $u $brk // with +chenye $u $brk // with +vyenye $u $brk // with +zenye $u $brk // with + + +// conjunctions +na $u $pause // and +ama $u $pause // or +ao $u $pause // or +au $u $pause // or +aidha $pause // and +bali $u $pause // but +ila $pause // but,except +angao $pause // although +badalaya $pause // instead +basi $u+ $pause // so,then +ili $u+ $pause // so that +ilikwamba $pause // so that +ijapo $pause // although, even if +ijapokuwa $pause // although +ingawa $pause // although +iwapo $pause // when +japo $pause +(juu ya) J,u:ja/ $pause // as for +kama $u+ $pause // if,like +kisha $pause // moreover +kusudi $pause // in order to +kuwa $u $pause // that +(kwa kuwa) kwa||k,uwa/ $pause // becuse +kwamba $u $pause // that +lakini $pause // however +walakini $pause // however +pamoja $pause // together with +panapo $pause // when it is +pindi $u+ $pause // if,when +taraa $u+ $pause // if +wala $pause // either,neither +yaani $pause // i.e. + + + + diff --git a/dictsource/sw_rules b/dictsource/sw_rules new file mode 100644 index 00000000..3d0ef017 --- /dev/null +++ b/dictsource/sw_rules @@ -0,0 +1,129 @@ + +// Swahili translation rules +// This file is UTF-8 encoded + + +.group a + a a + aa a: + +.group b + b b + +.group c + c k + ch tS + +.group d + d d + dh D + +.group e + e e + ee e: + +.group f + f f + +.group g + g g + gh Q + + +.group h + h h + +.group i + i i + ii i: + +.group j + j J + +.group k + k k + kh x + +.group l + l l + +.group m + m m + _) m m- + m (A m + K) m (@@ _|m + K) m (C m- + K) m (b@@ _|m + K) m (v@@ _|m + K) m (w@@ _|m + +.group n + n n + _) n n- + n (A n + n (@@ n + ny n^ + n (ch n^ + n (j n^ + ng' N + n (k N + _) n (k N- + _) n (k@@ N- + n (g N + _) n (g N- + _) n (g@@ N- + +.group o + o o + oo o: + +.group p + p p + +.group q + q k + +.group r + r r + A) r (A * + C) r (A @-* + rr *r + +.group s + s s + sh S + +.group t + t t + th T + +.group u + u u + uu u: + +.group v + v v + +.group w + w w + +.group x + x ks + +.group y + y j + +.group z + z z + + +.group + $ dola + % asilimia + + * n^ota + *) * (* + ** + **) * (_ _:: + + diff --git a/dictsource/vi_list b/dictsource/vi_list new file mode 100644 index 00000000..f7989e74 --- /dev/null +++ b/dictsource/vi_list @@ -0,0 +1,85 @@ +// letters +b be +c se +d de +đ d@: +f E3p +g g@: +h ha3t +j gi +k ka: +l E +m Em +n En +p pe +q kwi +r E +s E3t +t te +v ve +w v'ek,E3p +x i3ts; +z zE3t + +// numbers +_0 z'ez,o +_1 m'o6t[ +_2 h'a:I +_3 _b'a: +_4 _b'o3n +_5 n'am +_6 s'aU3 +_7 _b'aI4 +_8 t['a:3m +_9 ts;'i3n + + + +// symbols + + +// ?? found in festival wow_vi_ptn_phrasing.scm +bị $u +bởi $u +các $u +cái $u +chẳng $u +cho $u +chưa $u +con $u +còn $u +của $u +dẫu $u +dù $u +đang $u +đã $u +đến $u +để $u +được $u +hoặc $u +khi $u +khoảng $u +không $u +là $u +lúc $u +mà $u +mọi $u +mỗi $u +nên $u +nếu $u +như $u +nhưng $u +những $u +phải $u +sẽ $u +thì $u +tới $u +từ $u +và $u +vẫn $u +vì $u +với $u + + +internet int@:n'E3t + diff --git a/dictsource/vi_rules b/dictsource/vi_rules new file mode 100644 index 00000000..503d5755 --- /dev/null +++ b/dictsource/vi_rules @@ -0,0 +1,575 @@ + +.group a + a a: + ai a:I + aì a:I2 + aí a:I3 + aỉ a:I4 + aĩ a:I5 + aị a:I6 + ay aI + aỳ aI2 + aý aI3 + aỷ aI4 + aỹ aI5 + aỵ aI6 + ao a:U + aò a:U2 + aó a:U3 + aỏ a:U4 + aõ a:U5 + aọ a:U6 + au aU + aù aU2 + aú aU3 + aủ aU4 + aũ aU5 + aụ aU6 + +.group à + à a:2 + ài a:I2 + ày aI2 + ào a:U2 + àu aU2 + +.group á + á a:3 + ái a:I3 + áy aI3 + áo a:U3 + áu aU3 + +.group ả + ả a:4 + ải a:I4 + ảy aI4 + ảo a:U4 + ảu aU4 + +.group ã + ã a:5 + ãi a:I5 + ãy aI5 + ão a:U5 + ãu aU5 + +.group ạ + ạ a:6 + ại a:I6 + ạy aI6 + ạo a:U6 + ạu aU6 + +//================================ +.group ă + ă a + +.group ằ + ằ a2 + +.group ắ + ắ a3 + +.group ẳ + ẳ a4 + +.group ẵ + ẵ a5 + +.group ặ + ặ a6 + +//================================= +.group â + â @ + ây @I + âu @U + +.group ầ + ầ @2 + ầy @I2 + ầu @U2 + +.group ấ + ấ @3 + ấy @I3 + ấu @U3 + +.group ẩ + ẩ @4 + ẩy @I4 + ẩu @U4 + +.group ẫ + ẫ @5 + ẫy @I5 + ẫu @U5 + +.group ậ + ậ @6 + ậy @I6 + ậu @U6 + +//================================ +.group b + b b + _) b _b + +.group c + c k + c (_ kh + ch c // try [ts;] [tS] [c] [dZ] [dz;] + +.group d + d z + +.group đ + đ d + _) đ _d + + +//=========================== +.group e + e E + eo EU + eò EU2 + eó EU3 + eỏ EU4 + eỗ EU5 + eọ EU6 + +.group è + è E2 + èo EU2 + +.group é + é E3 + éo EU3 + +.group ẻ + ẻ E4 + ẻo EU4 + +.group ẽ + ẽ E5 + ẽo EU5 + +.group ẹ + ẹ E6 + ẹo EU6 + +//============================ + +.group ê + ê e + êu eU + +.group ề + ề e2 + ều eU2 + +.group ế + ế e3 + ếu eU3 + +.group ể + ể e4 + ểu eU4 + +.group ễ + ễ e5 + ễu eU5 + +.group ệ + ệ e6 + ệu eU6 + +//============================ +.group f + f f + + +.group g + g Q // try [g] [Q] + gh Q // or [g] [Q] + gi D // ??? [dZ] + + +.group h + h h + + +//============================ +.group i + i i + i (A j + ia i@ + ià i@2 + iá i@3 + iả i@4 + iã i@5 + iạ i@6 + iê i@ + iề i@2 + iế i@3 + iể i@4 + iễ i@5 + iệ i@6 + iu iU + iù iU2 + iú iU3 + iủ iU4 + iũ iU5 + iụ iU6 +// iêu i@U + +.group ì + ì i2 + ì (A j2 + ìa i@2 + ìu iU2 + +.group í + í i3 + í (A j3 + ía i@3 + íu iU3 + +.group ỉ + ỉ i4 + ỉ (A j4 + ỉa i@4 + ỉu iU4 + +.group ĩ + ĩ i5 + ĩ (A j5 + ĩa i@5 + ĩu iU5 + +.group ị + ị i6 + ị (A j6 + ịa i@6 + ịu iU6 + + +//============================= +.group j + j Z + + +.group k + k k + k (_ kh + kh x + +.group l + l l + +.group m + m m + +.group n + n n + ng N + ngh N + nh n^ + +.group ñ + ñ n^ + +//========================= +.group o + o O + o (A w + oi OI + oì OI2 + oí OI3 + oỉ OI4 + oĩ OI5 + oị OI6 + +.group ò + ò O2 + òi OI2 + ò (A w2 + +.group ó + ó O3 + ói OI3 + ó (A w3 + +.group ỏ + ỏ O4 + ỏi OI4 + ỏ (A w4 + +.group õ + õ O5 + õi OI5 + õ (A w5 + +.group ọ + ọ O6 + ọi OI6 + ọ (A w6 + + +//============================= +.group ô + ô o + ôi oI + +.group ồ + ồ o2 + ồi oI2 + +.group ố + ố o3 + ối oI3 + +.group ổ + ổ o4 + ổi oI4 + +.group ỗ + ỗ o5 + ỗi oI5 + +.group ộ + ộ o6 + ội oI6 + + + +//============================= +.group ơ + ơ @: + ơi @:I + ơu @:U + +.group ờ + ờ @:2 + ời @:I2 + ờu @:U2 + +.group ớ + ớ @:3 + ới @:I3 + ớu @:U3 + +.group ở + ở @:4 + ởi @:I4 + ởu @:U4 + +.group ỡ + ỡ @:5 + ỡi @:I5 + ỡu @:U5 + +.group ợ + ợ @:6 + ợi @:I6 + ợu @:U6 + + +//============================ +.group p + p p + ph f + +.group q + q k + q (_ kh + qu kw + +.group r + r D + +.group s + s s + +.group t + t t[ + th t + tr c // try [ts;] [tS] [c] [dZ] [dz;] + +//============================= +.group u + u u + u (A w + ui uI + uì uI2 + uí uI3 + uỉ uI4 + uĩ uI5 + uị uI6 + ua u@ + uà u@2 + uá u@3 + uả u@4 + uã u@5 + uạ u@6 + uô u@ + uồ u@2 + uố u@3 + uổ u@4 + uỗ u@5 + uộ u@6 + uôi u@j + uồi u@j2 + uối u@j3 + uổi u@j4 + uỗi u@j5 + uội u@j6 + +.group ù + ù u2 + ù (A w2 + ùi uI2 + ùa u@2 + +.group ú + ú u3 + ú (A w3 + úi uI3 + úa u@3 + +.group ủ + ủ u4 + ủ (A w4 + ủi uI4 + ủa u@4 + +.group ũ + ũ u5 + ũ (A w5 + ũi uI5 + ũa u@5 + +.group ụ + ụ u6 + ụ (A w6 + ụi uI6 + ụa u@6 + +//============================= +.group ư + ư y + ưi yI + ưa y@ + ươ y@ + ườ y@2 + ướ y@3 + ưở y@4 + ưỡ y@5 + ượ y@6 + ưu yw + ươi y@j + ười y@j2 + ưới y@j3 + ưởi y@j4 + ưỡi y@j5 + ượi y@j6 + ươu y@w + ườu y@w2 + ướu y@w3 + ưởu y@w4 + ưỡu y@w5 + ượu y@w6 + +.group ừ + ừ y2 + ừi yI2 + ừa y@2 + ừu yw2 + +.group ứ + ứ y3 + ứi yI3 + ứa y@3 + ứu yw3 + +.group ử + ử y4 + ửi yI4 + ửa y@4 + ửu yw4 + +.group ữ + ữ y5 + ữi yI5 + ữa y@5 + ữu yw5 + +.group ự + ự y6 + ựi yI6 + ựa y@6 + ựu yw6 + + +//============================= +.group v + v v + +.group w + w w + +.group x + x s + +.group y + y i + y (A j + ya i@ + yà i@2 + yá i@3 + yả i@4 + yã i@5 + yạ i@6 + yê i@ + yề i@2 + yế i@3 + yể i@4 + yễ i@5 + yệ i@6 +// yêu i@U + +.group ỳ + ỳ i2 + ỳ (A j2 + ỳa i@2 + +.group ý + ý i3 + ý (A j3 + ýa i@3 + +.group ỷ + ỷ i4 + ỷ (A j4 + ỷa i@4 + +.group ỹ + ỹ i5 + ỹ (A j5 + ỹa i@5 + +.group ỵ + ỵ i6 + ỵ (A j6 + ỵa i@6 + + +.group z + z z + +.group + $ d'o||l'a + % f'@2n||tS;'am + + diff --git a/dictsource/zhy_rules b/dictsource/zhy_rules new file mode 100644 index 00000000..754d4f4f --- /dev/null +++ b/dictsource/zhy_rules @@ -0,0 +1,141 @@ +// Cantonese Chinese + +// condition ?1 Speak English letters as English words +// condition ?2 Speak English letter as jyutping romanisation + + + +.group a +?1 a _^_EN +?2 a a +?2 ai ai +?2 au au +?2 aa aa +?2 aai aai +?2 aau aau +?2 aang aang + +.group b +?1 b _^_EN +?2 b b + +.group c +?1 c _^_EN +?2 c c +?2 ch tS + +.group d +?1 d _^_EN +?2 d d + +.group e +?1 e _^_EN +?2 e e +?2 ei ei +?2 eu eu +?2 eo eo +?2 eoi eoi + +.group f +?1 f _^_EN +?2 f f + +.group g +?1 g _^_EN +?2 g g + +.group h +?1 h _^_EN +?2 h h + +.group i +?1 i _^_EN +?2 i i +?2 iu iu + +.group j +?1 j _^_EN +?2 j j + +.group k +?1 k _^_EN +?2 k k + +.group l +?1 l _^_EN +?2 l l + +.group m +?1 m _^_EN +?2 m m + +.group n +?1 n _^_EN +?2 n n +?2 ng N + +.group o +?1 o _^_EN +?2 o o +?2 oi oi +?2 ou ou +?2 oe oe +?2 ong ong + +.group p +?1 p _^_EN +?2 p p + +.group q +?1 q _^_EN +?2 q k +?2 qu kw + +.group r +?1 r _^_EN +?2 r r + +.group s +?1 s _^_EN +?2 s s + +.group t +?1 t _^_EN +?2 t t + +.group u +?1 u _^_EN +?2 u u +?2 ui ui + +.group v +?1 v _^_EN +?2 v v + +.group w +?1 w _^_EN +?2 w w + +.group x +?1 x _^_EN +?2 x ks + +.group y +?1 y _^_EN +?2 y j +?2 yu yu + +.group z +?1 z _^_EN +?2 z z + +.group + 1 1 + 2 2 + 3 3 + 4 4 + 5 5 + 6 6 + 7 1 + 8 3 + 9 6 diff --git a/phsource/b/b b/phsource/b/b new file mode 100644 index 00000000..3f13124a Binary files /dev/null and b/phsource/b/b differ diff --git a/phsource/b/b@ b/phsource/b/b@ new file mode 100644 index 00000000..28527ae9 Binary files /dev/null and b/phsource/b/b@ differ diff --git a/phsource/b/b@2 b/phsource/b/b@2 new file mode 100644 index 00000000..7b2af8ac Binary files /dev/null and b/phsource/b/b@2 differ diff --git a/phsource/b/b_ b/phsource/b/b_ new file mode 100644 index 00000000..278dc468 Binary files /dev/null and b/phsource/b/b_ differ diff --git a/phsource/b/ba b/phsource/b/ba new file mode 100644 index 00000000..4e73160e Binary files /dev/null and b/phsource/b/ba differ diff --git a/phsource/b/be b/phsource/b/be new file mode 100644 index 00000000..36301dfa Binary files /dev/null and b/phsource/b/be differ diff --git a/phsource/b/bh b/phsource/b/bh new file mode 100644 index 00000000..f89e5d9f Binary files /dev/null and b/phsource/b/bh differ diff --git a/phsource/b/bh2 b/phsource/b/bh2 new file mode 100644 index 00000000..89223467 Binary files /dev/null and b/phsource/b/bh2 differ diff --git a/phsource/b/bh_ b/phsource/b/bh_ new file mode 100644 index 00000000..e2d30c89 Binary files /dev/null and b/phsource/b/bh_ differ diff --git a/phsource/b/bh_1 b/phsource/b/bh_1 new file mode 100644 index 00000000..22842549 Binary files /dev/null and b/phsource/b/bh_1 differ diff --git a/phsource/b/bi b/phsource/b/bi new file mode 100644 index 00000000..e7600a39 Binary files /dev/null and b/phsource/b/bi differ diff --git a/phsource/b/bo b/phsource/b/bo new file mode 100644 index 00000000..3cadb045 Binary files /dev/null and b/phsource/b/bo differ diff --git a/phsource/b/bu b/phsource/b/bu new file mode 100644 index 00000000..391414ca Binary files /dev/null and b/phsource/b/bu differ diff --git a/phsource/b/xb b/phsource/b/xb new file mode 100644 index 00000000..e859cb8e Binary files /dev/null and b/phsource/b/xb differ diff --git a/phsource/compile_report b/phsource/compile_report new file mode 100644 index 00000000..63f9ad28 --- /dev/null +++ b/phsource/compile_report @@ -0,0 +1,596 @@ +33 phoneme tables + new total + base 89 89 + en 52 136 + en_n 29 136 + en_us 36 136 + en_sc 39 138 + en_rp 34 136 + en_wm 30 136 + af 37 120 + cy 30 115 + de 28 112 + eo 15 101 + fi 40 120 + fr 32 113 + fr_ca 11 113 + hi 50 125 + hu 24 106 + nl 25 109 + pl 17 100 + sk 22 115 + cs 6 116 + hr 15 119 + ru 35 116 + it 28 109 + es 7 109 + pt 25 124 + pt_pt 17 124 + ro 36 133 + el 7 109 + sv 25 111 + no 29 115 + vi 41 126 + zh_yue 32 117 + sw 14 98 + + 3 b/b base hi ro + 2 b/b_ base hi + 2 b/b@ base hi + 2 b/b@2 base hi + 2 b/ba base hi + 2 b/be base hi + 3 b/bi base hi ro + 2 b/bo base hi + 2 b/bu base hi + 2 b/xb base hi + 14 d/d base fi fr hi hu pl ru it ro el sw + 15 d/d_ base fi fr hi hu pl ru it ro el sw + 1 d/d_dnt hi + 16 d/dr base fi fr hi hu pl ru it ro el sw + 1 d/tap ro + 2 d/tap1 base + 2 d/tap2 base + 2 d/tap3 base + 1 d/tap_i ro + 12 d/xd base fi fr hi hu pl ru it ro el sw + 1 d/xd_dnt hi + 2 d/xd_pzd pl ru + 1 d/x_tap base + 5 dzh/dzh base hi ru + 5 dzh/dzh_ base hi ru + 2 dzh/dz_pzd base hi + 2 dzh/dz_pzd_ base hi + 5 dzh/xdzh base hi ru + 2 dzh/xdz_pzd base hi + 4 envelope/p_fall vi zh_yue + 1 envelope/p_fallrise vi + 3 envelope/p_level vi zh_yue + 3 envelope/p_rise vi zh_yue + 1 envelope/vi_5 vi + 1 envelope/vi_5amp vi + 1 envelope/vi_6 vi + 1 envelope/vi_6amp vi + 1 g2/g base + 1 g2/g_ base + 2 g2/xg base hi + 4 g/g base cy hi es + 4 g/g_ base cy hi es + 3 g/xg base cy es + 1 j2/_j2 base + 1 j2/j2@ base + 1 j2/j2a base + 1 j2/j2e base + 1 j2/j2i base + 1 j2/j2o base + 1 j2/j2u base + 1 j2/xj2 base + 1 j/_j base + 1 j/j_ base + 1 j/j@ base + 1 j/ja base + 1 j/je base + 1 j/ji base + 1 j/jo base + 1 j/ju base + 6 j/xj base + 1 l^/j2@ base + 1 l^/j2a base + 1 l^/j2e base + 1 l^/j2i base + 1 l^/j2o base + 1 l^/j2u base + 1 l^/_l^ base + 1 l^/l^ base + 7 l/l base en af sk ru pt ro + 9 l/_l base en af de sk ru pt ro + 1 l/l_ base + 2 l/l@ base + 1 l/L1_aL base + 1 l/L1_eL base + 1 l/L1_iL base + 1 l/L1_@L base + 1 l/L1_oL base + 1 l/L1_uL base + 5 l/l_2 en af sk ru pt + 1 l/L2_aL base + 1 l/L2_eL base + 1 l/L2_iL base + 2 l/L2_@L base en_sc + 2 l/L2_oL base en_sc + 5 l/L2_uL base en en_n en_us en_rp + 1 l/l_3 de + 2 l/la base + 2 l/le base + 1 l/L_eL_af af + 2 l/li base + 2 l/l_long base ro + 2 l/lo base + 2 l/lu base + 7 l/tl base en af sk ru pt ro + 6 l/xl base + 2 m/_m base ro + 2 m/m_ base ro + 1 m/m@ base + 1 m/ma base + 1 m/me base + 1 m/mi base + 2 m/mj base ro + 1 m/mo base + 1 m/mu base + 1 n^/_n^ base + 1 n^/n^_ base + 1 n^/n^@ base + 6 n/_n base ro + 3 n/n_ base ro + 1 n/n@ base + 1 n^/n^a base + 1 n/na base + 1 n^/n^e base + 1 n/ne base + 1 n^/n^i base + 1 n/ni base + 1 nn/inn base + 4 n/nj base ro + 3 nn/_nn base en zh_yue + 3 nn/nn_ base en zh_yue + 1 nn/nn@ base + 1 nn/nna base + 1 nn/nne base + 1 nn/nni base + 2 nn/nnj base zh_yue + 1 nn/nno base + 1 nn/nnu base + 1 n^/n^o base + 1 n/no base + 1 n^/n^u base + 1 n/nu base + 1 r2/_r2 base + 1 r2/r2@ base + 1 r2/r2a base + 1 r2/r2e base + 1 r2/r2i base + 1 r2/r2o base + 1 r2/r2u base + 8 r3/r_ base af cy eo fr pl ru it + 1 r3/r_@ base + 1 r3/r_a base + 1 r3/r_e base + 1 r3/r_i base + 7 r3/r_n base cy eo fr pl ru it + 1 r3/r_o base + 1 r3/r_u base + 29 r3/rx base af cy eo fr fr_ca pl ru it pt_pt ro + 2 r3/@tap base + 2 r3/@tap_i base + 7 r/r base en_sc de fr hu it + 5 r/_r base en_sc fr hu it + 18 r/r_ base en_sc af cy de eo fi fr hu nl pl ru ++ + 1 r/r@ base + 1 r/ra base + 1 r/re base + 1 r/ri base + 1 r/ro base + 32 r/rr base af cy de eo fi nl pl ru it es ro ++ + 1 r/ru base + 15 r/tr base en_sc fr hu it + 63 r/trr base af cy de eo fi nl pl ru it es ro ++ + 11 r/xr base + 1 ufric/ch base + 3 ufric/f base de ro + 2 ufric/f_ base ro + 4 ufric/h_ base fi hi + 5 ufric/h@ base fi hi + 4 ufric/ha base fi hi + 4 ufric/he base fi hi + 4 ufric/hi base fi hi + 3 ufric/ho base hi + 3 ufric/hu base hi + 2 ufric/hu_fi fi + 1 ufric/ll base + 2 ufric/s base es + 10 ufric/s_ base fi fr hu es ro + 12 ufric/s! base fi hu es + 2 ufric/s_continue fi hu + 1 ufric/sh base + 1 ufric/sh_ base + 2 ufric/sh_pzd base ro + 3 ufric/sh_pzd_ base + 5 ufric/s_pzd base ro + 1 ufric/sx_sv sv + 1 ufric/th base + 1 ufric/th_ base + 2 ufric/x base vi + 4 ufric/x2 af nl pt + 1 ufric/xx hr + 1 ustop/c base + 5 ustop/k base en fr hi sw + 9 ustop/k_ base en fi fr hi hu it el sw + 11 ustop/ki base en af fi fr hi hu it sw + 10 ustop/kl base en fi fr hi hu it el sw + 10 ustop/kr base en fi fr hi hu it el sw + 9 ustop/k_unasp base fi hi hu it el + 2 ustop/p base hi + 2 ustop/p_ base hi + 1 ustop/percus10 base + 8 ustop/pl base fi hi hu hr it ro + 8 ustop/pr base fi hi hu hr it ro + 7 ustop/p_unasp base fi hi hu hr it ro + 6 ustop/p_unasp_ fi hi hu hr it ro + 2 ustop/t base hi + 4 ustop/t_ base hi el + 26 ustop/t_dnt base fi fr hi hu pl hr ru it ro vi sw + 2 ustop/t_dnt2 hi vi + 4 ustop/t_pzd pl ru + 6 ustop/tr base hi ru el + 8 ustop/ts de eo hu pl ru it ro zh_yue + 2 ustop/tsh base zh_yue + 2 ustop/tsh_ base zh_yue + 2 ustop/t_short hi el + 8 ustop/ts_pzd base hi ru + 2 ustop/ts_pzd_ hi hu + 2 ustop/ts_pzd2 hi hu + 2 vdiph/0i pt vi + 2 vdiph/0i_2 en_sc no + 2 vdiph2/e@ en_sc + 1 vdiph2/ea ro + 1 vdiph2/eo ro + 1 vdiph2/e[u ro + 1 vdiph2/i@ en_n + 1 vdiph2/ie fi + 1 vdiph2/ii@ en + 1 vdiph2/ii@_2 en_wm + 1 vdiph2/ii@_3 vi + 3 vdiph2/iu it vi zh_yue + 1 vdiph2/iu_2 fi + 1 vdiph2/iu_3 af + 2 vdiph2/iu_4 cy + 1 vdiph2/iy fi + 1 vdiph2/o@ af + 1 vdiph2/oa ro + 1 vdiph2/u-@ vi + 1 vdiph2/u#@ en_sc + 1 vdiph2/uo fi + 4 vdiph2/uu@ en en_n en_wm vi + 1 vdiph2/y#@ af + 1 vdiph2/yu nl + 1 vdiph2/y-y# fi + 1 vdiph/aai zh_yue + 2 vdiph/aai_2 af cy + 1 vdiph/aai_3 fi + 1 vdiph/aau fi + 3 vdiph/aau_2 de nl zh_yue + 1 vdiph/aau_3 hi + 1 vdiph/aau_4 vi + 1 vdiph/ae fr_ca + 1 vdiph/ae_2 en_n + 5 vdiph/ai eo hr it pt vi + 3 vdiph/ai_2 en_us cy + 1 vdiph/ai_3 no + 1 vdiph/ai_4 af + 1 vdiph/ai_5 de + 1 vdiph/ai_6 en_rp + 4 vdiph/ai_7 en_sc + 1 vdiph/ai_en en + 3 vdiph/au en af vi + 1 vdiph/au# en_sc + 2 vdiph/au_2 en_us zh_yue + 1 vdiph/au_3 en_rp + 4 vdiph/au_4 cy eo sk it + 1 vdiph/ee-e hi + 3 vdiph/eei en pt vi + 2 vdiph/eei_2 eo fi + 3 vdiph/eei_3 en_us en_rp sk + 1 vdiph/eei_4 nl + 3 vdiph/eeu pt vi zh_yue + 1 vdiph/eeu_2 pt_pt + 2 vdiph/eeu_3 en_n en_wm + 1 vdiph/eey fi + 5 vdiph/ei nl it pt vi zh_yue + 8 vdiph/eu en cy eo nl sk it pt vi + 1 vdiph/eu_2 fi + 2 vdiph/&i fi hi + 3 vdiph/@i_2 af cy + 1 vdiph/i@_2 af + 3 vdiph/@i_3 en_wm ro zh_yue + 1 vdiph/&i_3 vi + 1 vdiph/@i_4 vi + 1 vdiph/ii ro + 1 vdiph/i#i ro + 4 vdiph/oi en_wm de it vi + 1 vdiph/oi_2 af + 10 vdiph/ooi en en_n en_us en_rp cy eo fi no zh_yue + 1 vdiph/ooi_2 af + 1 vdiph/ooi_3 en_wm + 2 vdiph/ou fi zh_yue + 2 vdiph/ou_2 sk ro + 1 vdiph/@u en_wm + 1 vdiph/@u_2 en_rp + 1 vdiph/@u_3 ro + 3 vdiph/@u_en en vi + 6 vdiph/ui en eo fi it vi zh_yue + 1 vdiph/u-i vi + 1 vdiph/ui_2 af + 2 vdiph/ui_3 cy + 1 vdiph/Vi vi + 1 vdiph/Vu af + 2 vdiph/Vu_2 en_us en_wm + 1 vdiph/Vu_3 nl + 2 vdiph/&y fi nl + 2 vdiph/yi fi no + 1 vdiph/y#i fi + 1 vdiph/yi_fr fr + 1 vdiph/y#y fi + 2 vdiph/y#y_2 af zh_yue + 1 vdiph/y#y_3 nl + 2 vnasal/aa_n en fr + 1 vnasal/aa_n3 af + 2 vnasal/ee_n en fr_ca + 3 vnasal/ee_n2 hi pl pt_pt + 2 vnasal/e_n af pt + 1 vnasal/i_n pt + 1 vnasal/m- sw + 1 vnasal/&_n pt + 1 vnasal/n- sw + 1 vnasal/nn- sw + 1 vnasal/oi_n pt + 2 vnasal/o_n hi pt + 1 vnasal/o_n2 af + 2 vnasal/oo_n en fr + 2 vnasal/oo_n2 hi pl + 1 vnasal/&u_n pt + 1 vnasal/u_n pt + 3 vnasal/W_n en fr + 1 voc/bh base + 2 voc/dh base es + 2 voc/dh_ base es + 2 voc/Q base + 4 voc/Q_ base nl pt + 2 voc/Q_less nl pt + 5 voc/v base fi hi nl ro + 6 voc/v_ base fi hi nl ro + 4 vocw/dh base es + 2 vocw/Q base + 3 vocw/Q_ base nl + 1 vocw/Q2 nl + 6 vocw/v base ro + 4 vocw/zh base ro + 1 vocw/zh_rfx cs + 3 voc/z base fr ro + 3 voc/z_ base fr ro + 2 voc/zh base ro + 2 voc/zh_ base ro + 1 voc/zh_2 cs + 2 voc/z_pzd base + 2 voc/z_pzd_ base + 14 vowel/@ base en en_us en_rp cy hi hr + 1 vowel/@- base + 4 vowel/& en_rp fi hi sv + 5 vowel/0 en fr hi it pt + 4 vowel/0_2 en_n en_wm pt_pt sw + 5 vowel/0_3 en_us en_sc en_rp hu + 1 vowel/@_2 fr + 6 vowel/@_3 en_sc de hi + 1 vowel/3_2 en_n + 1 vowel/3_3 en_rp + 3 vowel/3_en en en_wm af + 1 vowel/@_4 nl + 2 vowel/8_2 en_us sv + 1 vowel/8_3 zh_yue + 10 vowel/a en_n cy de hu nl pl sk hr + 4 vowel/a# en_sc it pt + 5 vowel/a_2 eo it pt_pt ro vi + 3 vowel/a#_2 hr sv sw + 5 vowel/a_3 en_sc cs + 11 vowel/a#_3 en en_n en_us en_wm de hi pt_pt vi zh_yue + 4 vowel/a_4 en_wm el vi + 2 vowel/a_5 sv sw + 7 vowel/aa en_us fi fr_ca no zh_yue + 1 vowel/aa# fi + 3 vowel/aa_2 en cy + 1 vowel/aa_3 af + 2 vowel/aa_4 sv vi + 2 vowel/aa_5 en_n + 1 vowel/aa_6 de + 2 vowel/aa_7 nl pt + 4 vowel/a_en en fr + 1 vowel/@_bck hi + 13 vowel/e en en_n af cy eo fr hu hr it pt pt_pt vi + 2 vowel/e# en_sc + 7 vowel/e_2 en_sc de hi hu sv no + 1 vowel/e_5 en_sc + 3 vowel/ee fr pl sv + 1 vowel/e_e en_sc + 7 vowel/ee_1 en en_n pl it sv no zh_yue + 4 vowel/ee_2 en cy hu nl + 1 vowel/ee#_2 sv + 3 vowel/ee_3 af pt vi + 3 vowel/ee_6 en_n sk sv + 10 vowel/e_mid en_rp en_wm fr_ca hi sk cs hr es pt_pt no + 10 vowel/e_mid2 af de fi nl sk ro el sw + 1 vowel/@_fnt hr + 1 vowel/@_hgh no + 17 vowel/i en_n en_rp en_wm cy eo fr hu pl it pt pt_pt ro ++ + 1 vowel/i# cy + 3 vowel/i_2 de nl sv + 3 vowel/i_3 af sk hr + 3 vowel/i_4 fi hu it + 5 vowel/i_5 en_sc + 3 vowel/i#_5 pt_pt ro + 3 vowel/i_en en en_us vi + 2 vowel/i_fnt hi + 9 vowel/ii en_wm cy de fr_ca nl zh_yue + 3 vowel/ii# cy pl ru + 7 vowel/ii_3 en_rp fi hi sk hr sv no + 2 vowel/ii_4 en_rp + 6 vowel/ii_en en en_n + 5 vowel/@_low hi ro no + 9 vowel/o en en_wm de fr hi it pt_pt sv + 4 vowel/o_2 cy hi hu no + 2 vowel/o-_2 en_n en_wm + 2 vowel/o_3 en_sc + 1 vowel/o-_3 en_rp + 1 vowel/o_4 en_n + 1 vowel/o_6 nl + 4 vowel/oe en af de fr + 1 vowel/oe_2 no + 1 vowel/oe_4 sv + 2 vowel/o_mid hu ro + 8 vowel/oo en_sc de eo es el sv no zh_yue + 10 vowel/oo_1 en_n en_rp en_wm af fi sk vi + 3 vowel/oo_2 en_sc cy cs + 1 vowel/oo_3 af + 2 vowel/oo_4 hi pl + 6 vowel/oo_en en en_n en_rp + 2 vowelr/aa_r en_sc + 1 vowelr/oo_r en_sc + 1 vowelr/o_r en_sc + 3 vowelr/r-voc hi sk + 2 vowelr/V3_r en en_sc + 1 vowelr/V_r en + 8 vowel/u en_n cy de eo fr hi cs + 5 vowel/u# en en_sc + 3 vowel/u_2 fi sk ro + 1 vowel/u#_2 sv + 1 vowel/u_3 ro + 1 vowel/u#_3 en_n + 1 vowel/u_4 en_us + 2 vowel/u#_4 en_sc + 1 vowel/u_5 sw + 3 vowel/u_6 en_rp pt_pt + 1 vowel/u_7 vi + 14 vowel/u_bck cy fi fr_ca hi hu nl pl sk hr it pt sv ++ + 2 vowel/uu en en_wm + 2 vowel/uu_2 de it + 1 vowel/uu_3 af + 2 vowel/uu_4 fi sv + 7 vowel/uu_bck fr_ca hi hu hr no zh_yue + 2 vowel/V en en_sc + 3 vowel/V_2 af ru + 3 vowel/V_3 en_rp hi vi + 1 vowel/V_4 en_sc + 6 vowel/y en de fi hu nl zh_yue + 10 vowel/y# en en_wm de fi fr hu nl ro vi zh_yue + 2 vowel/y_2 fr + 2 vowel/y#_2 hu sv + 1 vowel/y_3 af + 1 vowel/y_4 no + 1 vowel/y_5 sv + 1 vowel/yy fr_ca + 1 vowel/yy_2 no + 1 vowel/yy_3 sv + 2 vowel/yy_4 de hu + 1 vwl_af/@ af + 1 vwl_af/I af + 2 vwl_af/r@ af + 2 vwl_de/r_y hu + 6 vwl_en/aI@ en en_n en_us en_sc en_rp en_wm + 2 vwl_en/aI@_2 en_sc + 5 vwl_en/aU@ en en_n en_us en_sc en_wm + 12 vwl_en/@L en en_us en_sc en_rp en_wm af + 3 vwl_en/@L_2 en_sc + 1 vwl_en_n/O@ en_n + 1 vwl_en_n/u_ en_n + 4 vwl_en_rp/@ en_rp + 3 vwl_en_rp/aa en_rp + 1 vwl_en_rp/aU@ en_rp + 1 vwl_en_rp/e@ en_rp + 1 vwl_en_rp/i@ en_rp + 1 vwl_en_rp/oo en_rp + 1 vwl_en/u en + 4 vwl_en/u_L en en_n en_us en_rp + 1 vwl_en_us/3_us en_us + 2 vwl_en_us/a en_us + 2 vwl_en_us/ar2 en_us + 1 vwl_en_us/ee en_us + 1 vwl_en_us/er en_us + 1 vwl_en_us/i_final3 en_us + 2 vwl_en_us/ii en_us + 2 vwl_en_us/ir en_us en_sc + 4 vwl_en_us/or en_us en_sc + 1 vwl_en_us/@r_us en_us + 1 vwl_en_us/ur en_us + 1 vwl_en_us/V en_us + 2 vwl_en_wm/aa en_wm + 1 vwl_en_wm/i en_wm + 2 vwl_en_wm/ii en_wm + 2 vwl_fr/@R fr pt_pt + 2 vwl_fr/@R2 fr fr_ca + 1 vwl_hi/A hi + 3 vwl_hi/l-voc hi sk + 2 vwl_no/& no + 1 vwl_no/au- no + 1 vwl_no/u# no + 1 vwl_no/u#2 no + 1 vwl_no/y# no + 1 vwl_no/y#y no + 1 vwl_ro/ii- ro + 1 vwl_ro/li ro + 1 vwl_ro/mi ro + 1 vwl_ro/ni ro + 1 vwl_ru/8 ru + 1 vwl_ru/a ru + 1 vwl_ru/aa ru + 1 vwl_ru/e ru + 2 vwl_ru/E@ ru + 1 vwl_ru/E# ru + 1 vwl_ru/ee ru + 1 vwl_ru/i ru + 1 vwl_ru/i# ru + 3 vwl_ru/ii ru + 1 vwl_ru/ii# ru + 1 vwl_ru/ja ru + 1 vwl_ru/ju ru + 1 vwl_ru/o ru + 1 vwl_ru/oo ru + 1 vwl_ru/u ru + 1 vwl_ru/u# ru + 1 vwl_ru/u#u ru + 1 vwl_sv/r_sv3 sv + 1 vwl_zh/aang zh_yue + 1 vwl_zh/ong zh_yue + 1 w/w base + 1 w/_w base + 1 w/w_ base + 1 w/w@ base + 8 w/w2 pl sk it pt_pt + 1 w/wa base + 1 w/we base + 3 w/wi base vi zh_yue + 10 w/wi2 en en_n en_us en_sc en_rp en_wm de nl sv no + 1 w/wo base + 1 w/wu base + 5 w/xw base + 19 x/b base hi ro + 1 x/b_ base + 6 x/d base hi el + 13 x/d_ base fi fr hi hu pl ru it ro el sw + 22 x/d_dnt base fi fr hi hu pl ru it ro sw + 6 x/d_pzd pl ru + 3 x/dzh base hi + 5 x/dzh_ base hi ru + 4 x/dz_pzd base hi ru + 2 x/dz_pzd_ base hi + 3 x/g_ base cy es + 4 x/g2 base cy hi es + 3 x/g2_ base hi diff --git a/phsource/d/d b/phsource/d/d new file mode 100644 index 00000000..37df0250 Binary files /dev/null and b/phsource/d/d differ diff --git a/phsource/d/d_ b/phsource/d/d_ new file mode 100644 index 00000000..72849774 Binary files /dev/null and b/phsource/d/d_ differ diff --git a/phsource/d/d_dnt b/phsource/d/d_dnt new file mode 100644 index 00000000..641a29a8 Binary files /dev/null and b/phsource/d/d_dnt differ diff --git a/phsource/d/d_pzd b/phsource/d/d_pzd new file mode 100644 index 00000000..63c8178d Binary files /dev/null and b/phsource/d/d_pzd differ diff --git a/phsource/d/dh b/phsource/d/dh new file mode 100644 index 00000000..abdaf7f2 Binary files /dev/null and b/phsource/d/dh differ diff --git a/phsource/d/dr b/phsource/d/dr new file mode 100644 index 00000000..92fa8ac0 Binary files /dev/null and b/phsource/d/dr differ diff --git a/phsource/d/tap b/phsource/d/tap new file mode 100644 index 00000000..a31b7316 Binary files /dev/null and b/phsource/d/tap differ diff --git a/phsource/d/tap1 b/phsource/d/tap1 new file mode 100644 index 00000000..032338dc Binary files /dev/null and b/phsource/d/tap1 differ diff --git a/phsource/d/tap2 b/phsource/d/tap2 new file mode 100644 index 00000000..5417dd88 Binary files /dev/null and b/phsource/d/tap2 differ diff --git a/phsource/d/tap3 b/phsource/d/tap3 new file mode 100644 index 00000000..85bcf94e Binary files /dev/null and b/phsource/d/tap3 differ diff --git a/phsource/d/tap_i b/phsource/d/tap_i new file mode 100644 index 00000000..0c213544 Binary files /dev/null and b/phsource/d/tap_i differ diff --git a/phsource/d/x_tap b/phsource/d/x_tap new file mode 100644 index 00000000..ae0f86f3 Binary files /dev/null and b/phsource/d/x_tap differ diff --git a/phsource/d/xd b/phsource/d/xd new file mode 100644 index 00000000..36eca48d Binary files /dev/null and b/phsource/d/xd differ diff --git a/phsource/d/xd_dnt b/phsource/d/xd_dnt new file mode 100644 index 00000000..3fd39487 Binary files /dev/null and b/phsource/d/xd_dnt differ diff --git a/phsource/d/xd_pzd b/phsource/d/xd_pzd new file mode 100644 index 00000000..0a2e1784 Binary files /dev/null and b/phsource/d/xd_pzd differ diff --git a/phsource/dzh/dz_pzd b/phsource/dzh/dz_pzd new file mode 100644 index 00000000..55addc86 Binary files /dev/null and b/phsource/dzh/dz_pzd differ diff --git a/phsource/dzh/dz_pzd_ b/phsource/dzh/dz_pzd_ new file mode 100644 index 00000000..e61cdcea Binary files /dev/null and b/phsource/dzh/dz_pzd_ differ diff --git a/phsource/dzh/dzh b/phsource/dzh/dzh new file mode 100644 index 00000000..5585cc35 Binary files /dev/null and b/phsource/dzh/dzh differ diff --git a/phsource/dzh/dzh_ b/phsource/dzh/dzh_ new file mode 100644 index 00000000..407d575e Binary files /dev/null and b/phsource/dzh/dzh_ differ diff --git a/phsource/dzh/xdz_pzd b/phsource/dzh/xdz_pzd new file mode 100644 index 00000000..13d26d89 Binary files /dev/null and b/phsource/dzh/xdz_pzd differ diff --git a/phsource/dzh/xdzh b/phsource/dzh/xdzh new file mode 100644 index 00000000..d512d780 Binary files /dev/null and b/phsource/dzh/xdzh differ diff --git a/phsource/envelope/p_211 b/phsource/envelope/p_211 new file mode 100644 index 00000000..1153e96b Binary files /dev/null and b/phsource/envelope/p_211 differ diff --git a/phsource/envelope/p_214 b/phsource/envelope/p_214 new file mode 100644 index 00000000..d59f0bf7 Binary files /dev/null and b/phsource/envelope/p_214 differ diff --git a/phsource/envelope/p_fall b/phsource/envelope/p_fall new file mode 100644 index 00000000..0e8d0228 Binary files /dev/null and b/phsource/envelope/p_fall differ diff --git a/phsource/envelope/p_fallrise b/phsource/envelope/p_fallrise new file mode 100644 index 00000000..c0da66d3 Binary files /dev/null and b/phsource/envelope/p_fallrise differ diff --git a/phsource/envelope/p_level b/phsource/envelope/p_level new file mode 100644 index 00000000..f937f61e Binary files /dev/null and b/phsource/envelope/p_level differ diff --git a/phsource/envelope/p_rise b/phsource/envelope/p_rise new file mode 100644 index 00000000..120b21f7 Binary files /dev/null and b/phsource/envelope/p_rise differ diff --git a/phsource/envelope/vi_2 b/phsource/envelope/vi_2 new file mode 100644 index 00000000..cca3620c Binary files /dev/null and b/phsource/envelope/vi_2 differ diff --git a/phsource/envelope/vi_5 b/phsource/envelope/vi_5 new file mode 100644 index 00000000..bad96f07 Binary files /dev/null and b/phsource/envelope/vi_5 differ diff --git a/phsource/envelope/vi_5amp b/phsource/envelope/vi_5amp new file mode 100644 index 00000000..0ec02021 Binary files /dev/null and b/phsource/envelope/vi_5amp differ diff --git a/phsource/envelope/vi_6 b/phsource/envelope/vi_6 new file mode 100644 index 00000000..5d29dcfe Binary files /dev/null and b/phsource/envelope/vi_6 differ diff --git a/phsource/envelope/vi_6amp b/phsource/envelope/vi_6amp new file mode 100644 index 00000000..086aac05 Binary files /dev/null and b/phsource/envelope/vi_6amp differ diff --git a/phsource/g/g b/phsource/g/g new file mode 100644 index 00000000..108957db Binary files /dev/null and b/phsource/g/g differ diff --git a/phsource/g/g_ b/phsource/g/g_ new file mode 100644 index 00000000..f31219e5 Binary files /dev/null and b/phsource/g/g_ differ diff --git a/phsource/g/gh b/phsource/g/gh new file mode 100644 index 00000000..9e5ae975 Binary files /dev/null and b/phsource/g/gh differ diff --git a/phsource/g/xg b/phsource/g/xg new file mode 100644 index 00000000..a25ec336 Binary files /dev/null and b/phsource/g/xg differ diff --git a/phsource/g2/g b/phsource/g2/g new file mode 100644 index 00000000..0d58f3f5 Binary files /dev/null and b/phsource/g2/g differ diff --git a/phsource/g2/g_ b/phsource/g2/g_ new file mode 100644 index 00000000..f31219e5 Binary files /dev/null and b/phsource/g2/g_ differ diff --git a/phsource/g2/xg b/phsource/g2/xg new file mode 100644 index 00000000..a25ec336 Binary files /dev/null and b/phsource/g2/xg differ diff --git a/phsource/j/_j b/phsource/j/_j new file mode 100644 index 00000000..cef038a1 Binary files /dev/null and b/phsource/j/_j differ diff --git a/phsource/j/j@ b/phsource/j/j@ new file mode 100644 index 00000000..c28d7dac Binary files /dev/null and b/phsource/j/j@ differ diff --git a/phsource/j/j_ b/phsource/j/j_ new file mode 100644 index 00000000..7dd6c1af Binary files /dev/null and b/phsource/j/j_ differ diff --git a/phsource/j/ja b/phsource/j/ja new file mode 100644 index 00000000..72179b53 Binary files /dev/null and b/phsource/j/ja differ diff --git a/phsource/j/je b/phsource/j/je new file mode 100644 index 00000000..84d5c058 Binary files /dev/null and b/phsource/j/je differ diff --git a/phsource/j/ji b/phsource/j/ji new file mode 100644 index 00000000..d81947d1 Binary files /dev/null and b/phsource/j/ji differ diff --git a/phsource/j/jo b/phsource/j/jo new file mode 100644 index 00000000..29fda4ce Binary files /dev/null and b/phsource/j/jo differ diff --git a/phsource/j/ju b/phsource/j/ju new file mode 100644 index 00000000..f31a7319 Binary files /dev/null and b/phsource/j/ju differ diff --git a/phsource/j/xj b/phsource/j/xj new file mode 100644 index 00000000..7d107118 Binary files /dev/null and b/phsource/j/xj differ diff --git a/phsource/j2/_j2 b/phsource/j2/_j2 new file mode 100644 index 00000000..df0b6a68 Binary files /dev/null and b/phsource/j2/_j2 differ diff --git a/phsource/j2/j2@ b/phsource/j2/j2@ new file mode 100644 index 00000000..19067470 Binary files /dev/null and b/phsource/j2/j2@ differ diff --git a/phsource/j2/j2a b/phsource/j2/j2a new file mode 100644 index 00000000..1a9ac505 Binary files /dev/null and b/phsource/j2/j2a differ diff --git a/phsource/j2/j2e b/phsource/j2/j2e new file mode 100644 index 00000000..b079fa60 Binary files /dev/null and b/phsource/j2/j2e differ diff --git a/phsource/j2/j2i b/phsource/j2/j2i new file mode 100644 index 00000000..49b13317 Binary files /dev/null and b/phsource/j2/j2i differ diff --git a/phsource/j2/j2o b/phsource/j2/j2o new file mode 100644 index 00000000..c53166b0 Binary files /dev/null and b/phsource/j2/j2o differ diff --git a/phsource/j2/j2u b/phsource/j2/j2u new file mode 100644 index 00000000..6d03ad5c Binary files /dev/null and b/phsource/j2/j2u differ diff --git a/phsource/j2/xj2 b/phsource/j2/xj2 new file mode 100644 index 00000000..0191fa6e Binary files /dev/null and b/phsource/j2/xj2 differ diff --git a/phsource/l/L1_@L b/phsource/l/L1_@L new file mode 100644 index 00000000..a3061008 Binary files /dev/null and b/phsource/l/L1_@L differ diff --git a/phsource/l/L1_aL b/phsource/l/L1_aL new file mode 100644 index 00000000..a0f3ffc8 Binary files /dev/null and b/phsource/l/L1_aL differ diff --git a/phsource/l/L1_eL b/phsource/l/L1_eL new file mode 100644 index 00000000..c1594169 Binary files /dev/null and b/phsource/l/L1_eL differ diff --git a/phsource/l/L1_iL b/phsource/l/L1_iL new file mode 100644 index 00000000..ef1dfb99 Binary files /dev/null and b/phsource/l/L1_iL differ diff --git a/phsource/l/L1_oL b/phsource/l/L1_oL new file mode 100644 index 00000000..b7621bc0 Binary files /dev/null and b/phsource/l/L1_oL differ diff --git a/phsource/l/L1_uL b/phsource/l/L1_uL new file mode 100644 index 00000000..01a8e3b0 Binary files /dev/null and b/phsource/l/L1_uL differ diff --git a/phsource/l/L2_@L b/phsource/l/L2_@L new file mode 100644 index 00000000..962d9357 Binary files /dev/null and b/phsource/l/L2_@L differ diff --git a/phsource/l/L2_aL b/phsource/l/L2_aL new file mode 100644 index 00000000..5415658c Binary files /dev/null and b/phsource/l/L2_aL differ diff --git a/phsource/l/L2_eL b/phsource/l/L2_eL new file mode 100644 index 00000000..568504ed Binary files /dev/null and b/phsource/l/L2_eL differ diff --git a/phsource/l/L2_iL b/phsource/l/L2_iL new file mode 100644 index 00000000..18628048 Binary files /dev/null and b/phsource/l/L2_iL differ diff --git a/phsource/l/L2_oL b/phsource/l/L2_oL new file mode 100644 index 00000000..7cea492e Binary files /dev/null and b/phsource/l/L2_oL differ diff --git a/phsource/l/L2_uL b/phsource/l/L2_uL new file mode 100644 index 00000000..0a347b13 Binary files /dev/null and b/phsource/l/L2_uL differ diff --git a/phsource/l/L_eL_af b/phsource/l/L_eL_af new file mode 100644 index 00000000..6ffa1801 Binary files /dev/null and b/phsource/l/L_eL_af differ diff --git a/phsource/l/_l b/phsource/l/_l new file mode 100644 index 00000000..1a01ce92 Binary files /dev/null and b/phsource/l/_l differ diff --git a/phsource/l/l b/phsource/l/l new file mode 100644 index 00000000..44af64f6 Binary files /dev/null and b/phsource/l/l differ diff --git a/phsource/l/l@ b/phsource/l/l@ new file mode 100644 index 00000000..b1617619 Binary files /dev/null and b/phsource/l/l@ differ diff --git a/phsource/l/l_ b/phsource/l/l_ new file mode 100644 index 00000000..1922dbdd Binary files /dev/null and b/phsource/l/l_ differ diff --git a/phsource/l/l_2 b/phsource/l/l_2 new file mode 100644 index 00000000..8f680a40 Binary files /dev/null and b/phsource/l/l_2 differ diff --git a/phsource/l/l_3 b/phsource/l/l_3 new file mode 100644 index 00000000..50293cc1 Binary files /dev/null and b/phsource/l/l_3 differ diff --git a/phsource/l/l_long b/phsource/l/l_long new file mode 100644 index 00000000..60517f24 Binary files /dev/null and b/phsource/l/l_long differ diff --git a/phsource/l/la b/phsource/l/la new file mode 100644 index 00000000..40821595 Binary files /dev/null and b/phsource/l/la differ diff --git a/phsource/l/le b/phsource/l/le new file mode 100644 index 00000000..0579449b Binary files /dev/null and b/phsource/l/le differ diff --git a/phsource/l/li b/phsource/l/li new file mode 100644 index 00000000..f4a7bd48 Binary files /dev/null and b/phsource/l/li differ diff --git a/phsource/l/lo b/phsource/l/lo new file mode 100644 index 00000000..09aa1a82 Binary files /dev/null and b/phsource/l/lo differ diff --git a/phsource/l/lu b/phsource/l/lu new file mode 100644 index 00000000..f1968097 Binary files /dev/null and b/phsource/l/lu differ diff --git a/phsource/l/tl b/phsource/l/tl new file mode 100644 index 00000000..6050bca9 Binary files /dev/null and b/phsource/l/tl differ diff --git a/phsource/l/xl b/phsource/l/xl new file mode 100644 index 00000000..610dff35 Binary files /dev/null and b/phsource/l/xl differ diff --git a/phsource/l^/_l^ b/phsource/l^/_l^ new file mode 100644 index 00000000..78096e2b Binary files /dev/null and b/phsource/l^/_l^ differ diff --git a/phsource/l^/j2@ b/phsource/l^/j2@ new file mode 100644 index 00000000..19067470 Binary files /dev/null and b/phsource/l^/j2@ differ diff --git a/phsource/l^/j2a b/phsource/l^/j2a new file mode 100644 index 00000000..1a9ac505 Binary files /dev/null and b/phsource/l^/j2a differ diff --git a/phsource/l^/j2e b/phsource/l^/j2e new file mode 100644 index 00000000..b079fa60 Binary files /dev/null and b/phsource/l^/j2e differ diff --git a/phsource/l^/j2i b/phsource/l^/j2i new file mode 100644 index 00000000..0ba10875 Binary files /dev/null and b/phsource/l^/j2i differ diff --git a/phsource/l^/j2o b/phsource/l^/j2o new file mode 100644 index 00000000..c53166b0 Binary files /dev/null and b/phsource/l^/j2o differ diff --git a/phsource/l^/j2u b/phsource/l^/j2u new file mode 100644 index 00000000..6d03ad5c Binary files /dev/null and b/phsource/l^/j2u differ diff --git a/phsource/l^/l^ b/phsource/l^/l^ new file mode 100644 index 00000000..bdc264ea Binary files /dev/null and b/phsource/l^/l^ differ diff --git a/phsource/m/_m b/phsource/m/_m new file mode 100644 index 00000000..5f4c3c31 Binary files /dev/null and b/phsource/m/_m differ diff --git a/phsource/m/m@ b/phsource/m/m@ new file mode 100644 index 00000000..c0b9b29b Binary files /dev/null and b/phsource/m/m@ differ diff --git a/phsource/m/m_ b/phsource/m/m_ new file mode 100644 index 00000000..fa43e5f1 Binary files /dev/null and b/phsource/m/m_ differ diff --git a/phsource/m/ma b/phsource/m/ma new file mode 100644 index 00000000..e81f7da6 Binary files /dev/null and b/phsource/m/ma differ diff --git a/phsource/m/me b/phsource/m/me new file mode 100644 index 00000000..b0948f08 Binary files /dev/null and b/phsource/m/me differ diff --git a/phsource/m/mi b/phsource/m/mi new file mode 100644 index 00000000..3521a21f Binary files /dev/null and b/phsource/m/mi differ diff --git a/phsource/m/mj b/phsource/m/mj new file mode 100644 index 00000000..293164ee Binary files /dev/null and b/phsource/m/mj differ diff --git a/phsource/m/mo b/phsource/m/mo new file mode 100644 index 00000000..d36ccde5 Binary files /dev/null and b/phsource/m/mo differ diff --git a/phsource/m/mu b/phsource/m/mu new file mode 100644 index 00000000..9d60e925 Binary files /dev/null and b/phsource/m/mu differ diff --git a/phsource/mbrola/af1 b/phsource/mbrola/af1 new file mode 100644 index 00000000..b8c74272 --- /dev/null +++ b/phsource/mbrola/af1 @@ -0,0 +1,71 @@ +0 l/2 NULL 0 l +0 l/ NULL 0 l +0 r/ NULL 0 r +0 r- NULL 0 r +0 w/ NULL 0 w +0 j/ NULL 0 j +0 ; NULL 0 NULL +0 g- NULL 0 NULL +0 @- NULL 0 NULL +0 * NULL 0 r + +0 x2 NULL 0 x +0 S NULL 0 s +0 Z NULL 0 z +0 _! NULL 0 ? +0 e@ NULL 0 e +0 A: NULL 0 a +0 o@ NULL 0 o +0 Y@ NULL 0 2 +0 a NULL 0 A +0 I NULL 0 @ +0 & NULL 0 { +0 W NULL 0 9 +0 eI NULL 0 & +0 @U NULL 0 $ +0 Yy NULL 0 } +0 A~ NULL 0 A +0 e~ NULL 0 E +0 o~ NULL 0 O +0 aI NULL 60 A j +0 AI NULL 75 a j +0 OI NULL 60 O j +0 oI NULL 70 u j +0 uI NULL 60 u j +0 aU NULL 60 A u +0 iu NULL 50 i u +0 e: NULL 0 E +0 i: NULL 0 i +0 u: NULL 0 u + +0 @2 NULL 0 @ +0 @5 NULL 0 @ +0 I2 NULL 0 i +0 a2 NULL 0 a +0 aa NULL 0 a +0 0 NULL 0 O +0 A@ NULL 0 a +0 i@ NULL 0 e +0 e@ NULL 60 E @ +0 o@ NULL 70 O @ +0 O@ NULL 70 O @ +0 U@ NULL 60 u @ +0 O: NULL 0 O +0 oU NULL 0 $ +0 @2 NULL 0 @ +0 3 NULL 0 @ +0 3: NULL 0 @ +0 U NULL 0 u +0 V NULL 0 a +0 aI@ NULL 60 { @ +0 aU@ NULL 70 A @ +0 @L NULL 0 l +0 T NULL 0 t +0 D NULL 0 z +0 dZ NULL 40 d z +0 tS NULL 40 t s +0 c NULL 0 k + + + + diff --git a/phsource/mbrola/cr1 b/phsource/mbrola/cr1 new file mode 100644 index 00000000..f57c2a96 --- /dev/null +++ b/phsource/mbrola/cr1 @@ -0,0 +1,85 @@ +volume 16 + +0 l/2 NULL 0 l +0 l/ NULL 0 l +0 r/ r 5 r _ +0 r 3 5 r _ +0 r/ NULL 0 r +0 r- NULL 0 r +0 l- NULL 0 l +0 w/ NULL 0 w +0 j/ NULL 0 j +2 ; i 0 NULL +0 ; NULL 0 j +0 - NULL 0 NULL +0 g- NULL 0 NULL +0 @- NULL 0 NULL +0 * NULL 0 r + +0 I NULL 0 i +0 U NULL 0 u +0 E NULL 0 e +0 & NULL 0 a +0 @ NULL 0 e +0 aI NULL 60 a j + +0 tS; NULL 0 tS' +0 dZ; NULL 0 dZ' +0 l^ NULL 0 L +0 n^ NULL 0 J +0 N NULL 0 n +0 h NULL 0 x + +// CR1 doesn't like same phonemes twice +0 d d 5 d _ +0 s s 5 s _ +0 z z 5 z _ +0 t t 5 t _ +0 m m 5 m _ +0 n n 5 n _ +0 r r 5 r _ +0 k k 5 k _ +0 e e 5 e _ +0 o o 5 o _ +0 a a 5 a _ +0 & a 5 a _ + +// map English phonemes to Hungarian +0 3 r 5 r _ +0 @ NULL 0 a +0 eI NULL 60 e j +0 aU NULL 60 a u +0 oU NULL 0 o +0 @L NULL 40 e l +0 @2 NULL 0 e // @ +0 @5 NULL 0 e // @ +0 3 NULL 0 r // @ +0 a2 NULL 0 a // @ +0 I2 NULL 0 i +0 I NULL 0 i +0 a NULL 0 a +0 aa NULL 0 a +0 V NULL 0 a // @ +0 U NULL 0 u +0 0 NULL 0 o +0 i: NULL 0 i +0 u: NULL 0 u +0 A: NULL 0 a +0 3: NULL 0 r // @ +0 aI NULL 60 a j +0 OI NULL 60 o j +0 i@ NULL 60 i r // @ +0 e@ NULL 70 e r +0 o@ NULL 70 o r // @ +0 O@ NULL 70 o r // @ +0 O NULL 0 o +0 O: NULL 0 a +0 A: NULL 0 a +0 A@ NULL 70 a r +0 U@ NULL 60 u r // @ +0 aI@ NULL 70 a r // @ +0 aU@ NULL 0 a + +0 T NULL 0 t +0 D NULL 0 z +0 w NULL 0 v \ No newline at end of file diff --git a/phsource/mbrola/cs b/phsource/mbrola/cs new file mode 100644 index 00000000..fa0b2eda --- /dev/null +++ b/phsource/mbrola/cs @@ -0,0 +1,22 @@ +0 l/2 NULL 0 l +0 r/ NULL 0 r +0 r- NULL 0 r +0 l- NULL 0 l +0 w/ NULL 0 w +0 j/ NULL 0 j +0 ; NULL 0 NULL +0 g- NULL 0 NULL +0 @- NULL 0 NULL +0 * NULL 0 r + +0 J NULL 0 d' +0 h NULL 0 h\ +0 n^ NULL 0 n' +0 R NULL 0 r' +0 c NULL 0 t' +0 oU NULL 0 o +0 aU NULL 60 a u +0 N NULL 0 n +0 Q NULL 0 x + + diff --git a/phsource/mbrola/de4 b/phsource/mbrola/de4 new file mode 100644 index 00000000..41957952 --- /dev/null +++ b/phsource/mbrola/de4 @@ -0,0 +1,71 @@ + +0 T r 0 t +0 l eI 0 L +0 l oU 0 L +2 l oU 0 L +2 l @L 0 L +2 l l/2 0 L +2 l eI 0 L +0 r eI 0 r +0 r oU 0 r +2 r oU 0 r +0 r @L 0 r +2 r l/2 0 r +2 3 D 0 @ +2 3 T 0 @ +2 3 @L 0 @ +2 3 oU 0 @ +2 3 w 0 @ +2 3 eI 0 @ + + +0 l/2 NULL 0 L +0 l/ NULL 0 l +0 r/ NULL 0 6 +0 r- NULL 0 r +0 l- NULL 0 l +0 w/ NULL 0 w +0 j/ NULL 0 j +0 ; NULL 0 NULL +0 g- NULL 0 NULL +0 @- NULL 0 NULL +0 * NULL 0 R + +0 E2 NULL 0 E +0 y NULL 0 Y +0 W NULL 0 9 +0 A: NULL 0 a: +0 Y: NULL 0 2: +0 OI NULL 0 OY +0 3 NULL 0 6 +0 _! NULL 0 ? +0 pF NULL 0 pf +0 r NULL 0 R + +0 eI NULL 0 EI +0 oU NULL 0 @U +0 W~ NULL 0 E~ +0 A~ NULL 0 a~ +0 O~ NULL 0 o~ + +// phonemes for English words +0 @L NULL 0 L +0 @2 NULL 0 @ +0 @5 NULL 0 @ +0 a2 NULL 0 @ +0 I2 NULL 0 I +0 aa NULL 0 a +0 V NULL 0 a: +0 0 NULL 0 O +0 3: NULL 0 @ +0 i@ NULL 60 i: @ +0 e@ NULL 60 E @ +0 o@ NULL 70 o: 6 +0 O@ NULL 70 O 6 +0 O: NULL 0 O +0 A@ NULL 70 a: 6 +0 U@ NULL 60 U @ +0 aI@ NULL 70 aI @ +0 aU@ NULL 70 aU @ + +0 dZ NULL 0 tS diff --git a/phsource/mbrola/de5 b/phsource/mbrola/de5 new file mode 100644 index 00000000..6b3dab4c --- /dev/null +++ b/phsource/mbrola/de5 @@ -0,0 +1,53 @@ + +2 w i: 0 v // i:w not allowed + +0 l/2 NULL 40 l +0 l/ NULL 0 l +0 r/ NULL 0 6 +0 r- NULL 0 R +0 l- NULL 0 l +0 w/ NULL 0 w +0 j/ NULL 0 j +0 ; NULL 0 NULL +0 g- NULL 0 NULL +0 @- NULL 0 NULL +0 * NULL 0 R + +0 E2 NULL 0 E +0 y NULL 0 Y +0 W NULL 0 9 +0 A: NULL 0 a: +0 Y: NULL 0 2: +0 OI NULL 0 OY +0 3 NULL 0 6 +0 _! NULL 0 ? +0 pF NULL 0 pf +0 r NULL 0 R + +0 eI NULL 60 E j +0 oU NULL 60 @ w +0 W~ NULL 0 E~ +0 A~ NULL 0 a~ +0 O~ NULL 0 o~ + +// phonemes for English words +0 @L NULL 40 @ l +0 @2 NULL 0 @ +0 @5 NULL 0 @ +0 a2 NULL 0 @ +0 I2 NULL 0 I +0 aa NULL 0 a +0 V NULL 0 a: +0 0 NULL 0 a: +0 3: NULL 0 @ +0 i@ NULL 60 i: @ +0 e@ NULL 60 E @ +0 o@ NULL 70 o: 6 +0 O@ NULL 70 o: 6 +0 O: NULL 0 O +0 A@ NULL 70 a: 6 +0 U@ NULL 60 U @ +0 aI@ NULL 70 aI @ +0 aU@ NULL 70 aU @ + +0 dZ NULL 0 tS diff --git a/phsource/mbrola/en1 b/phsource/mbrola/en1 new file mode 100644 index 00000000..24c754b2 --- /dev/null +++ b/phsource/mbrola/en1 @@ -0,0 +1,28 @@ +//volume 29 +0 oU NULL 0 @U +0 a2 NULL 0 @ +0 @2 NULL 0 @ +0 @5 NULL 0 @ +0 3 NULL 0 @ +0 I2 NULL 0 I +0 a NULL 0 { +0 aa NULL 0 { +0 0 NULL 0 Q +0 E NULL 0 e +0 O NULL 0 O: +0 O@ NULL 0 O: +0 o@ NULL 0 O: +0 A@ NULL 0 A: +0 i@ NULL 0 I@ +0 IR NULL 0 3: +0 VR NULL 0 3: +0 @L NULL 0 5 +0 l/2 NULL 0 5 +0 r/ NULL 0 r +0 r- NULL 0 r +0 w/ NULL 0 w +0 ; NULL 0 NULL +0 g- NULL 0 NULL +0 @- NULL 0 NULL +0 aI@ NULL 60 aI @ +0 aU@ NULL 75 aU @ diff --git a/phsource/mbrola/fr1 b/phsource/mbrola/fr1 new file mode 100644 index 00000000..e68e124b --- /dev/null +++ b/phsource/mbrola/fr1 @@ -0,0 +1,68 @@ +volume 15 +0 l/2 NULL 0 l +0 l/ NULL 0 l +0 r/ NULL 0 R +0 r- NULL 0 R +0 l- NULL 0 l +0 w/ NULL 0 w +0 j/ NULL 0 j +0 ; NULL 0 NULL +0 g- NULL 0 NULL +0 @- NULL 0 NULL +0 * NULL 0 R + +0 Y NULL 0 2 +0 W NULL 0 9 +0 A~ NULL 0 a~ +0 E~ NULL 0 e~ +0 O~ NULL 0 o~ +0 W~ NULL 0 9~ +0 w^i NULL 0 H +0 r NULL 0 R +0 n^ NULL 75 n j +0 c NULL 0 k + +0 I NULL 0 i +0 U NULL 0 u +0 y" NULL 0 y +0 E: NULL 0 E +0 h NULL 0 NULL +0 t2 NULL 0 t +0 z2 NULL 0 z + +0 i: NULL 0 i +0 u: NULL 0 u +0 eI NULL 60 E j +0 aU NULL 60 a w +0 oU NULL 0 o +0 @L NULL 40 @ l +0 @2 NULL 0 @ +0 @5 NULL 0 @ +0 3 NULL 0 @ +0 a2 NULL 0 @ +0 I2 NULL 0 i +0 aa NULL 0 a +0 V NULL 0 @ +0 0 NULL 0 O +0 3: NULL 0 9 +0 aI NULL 60 a j +0 OI NULL 60 O j +0 e@ NULL 0 E +0 i@ NULL 60 i @ +0 e@ NULL 60 E @ +0 o@ NULL 70 o @ +0 O@ NULL 70 O @ +0 O: NULL 0 O +0 A: NULL 0 a +0 A@ NULL 70 a @ +0 U@ NULL 60 u @ +0 aI@ NULL 70 a @ +0 aU@ NULL 0 a + +0 dZ NULL 40 d Z +0 tS NULL 40 t S +0 T NULL 0 t +0 D NULL 0 z + + + diff --git a/phsource/mbrola/hu1 b/phsource/mbrola/hu1 new file mode 100644 index 00000000..1db03653 --- /dev/null +++ b/phsource/mbrola/hu1 @@ -0,0 +1,64 @@ +volume 32 + +0 l/2 NULL 0 l +0 l/ NULL 0 l +0 r/ NULL 0 r +0 r- NULL 0 r +0 l- NULL 0 l +0 w/ NULL 0 w +0 j/ NULL 0 j +2 ; i 0 NULL +0 ; NULL 0 j +0 - NULL 0 NULL +0 g- NULL 0 NULL +0 @- NULL 0 NULL +0 * NULL 0 r + +0 e NULL 0 e: +0 A NULL 0 O +0 Y NULL 0 2 +0 Y: NULL 0 2: + +0 c NULL 0 t' +0 J NULL 0 d' +0 n^ NULL 60 n j +0 N NULL 0 n +0 C NULL 0 x +0 s2 NULL 0 s + + +// map English phonemes to Hungarian +0 @ NULL 0 2 +0 eI NULL 60 e: j +0 aU NULL 60 a: u +0 oU NULL 0 o +0 @L NULL 40 2 l +0 @2 NULL 0 2 // @ +0 @5 NULL 0 2 // @ +0 3 NULL 0 2 // @ +0 a2 NULL 0 a: // @ +0 I2 NULL 0 i +0 I NULL 0 i +0 a NULL 0 a: +0 aa NULL 0 a: +0 V NULL 0 O // @ +0 U NULL 0 u +0 0 NULL 0 O +0 A: NULL 0 O +0 3: NULL 0 2 // @ +0 aI NULL 60 a: j +0 OI NULL 60 o j +0 i@ NULL 60 i 2 // @ +0 e@ NULL 70 e: 2 +0 o@ NULL 70 o 2 // @ +0 O@ NULL 70 O 2 // @ +0 O: NULL 0 O +0 A: NULL 0 O +0 A@ NULL 70 O 2 +0 U@ NULL 60 u 2 // @ +0 aI@ NULL 70 a: 2 // @ +0 aU@ NULL 70 O 2 + +0 T NULL 0 t +0 D NULL 0 z +0 w NULL 0 v \ No newline at end of file diff --git a/phsource/mbrola/in1 b/phsource/mbrola/in1 new file mode 100644 index 00000000..9d150738 --- /dev/null +++ b/phsource/mbrola/in1 @@ -0,0 +1,49 @@ +0 l/2 NULL 0 l +0 l/ NULL 0 l +0 r/ NULL 0 r +0 r- NULL 0 r +0 l- NULL 0 l +0 w/ NULL 0 w +0 j/ NULL 0 j +0 ; NULL 0 NULL +0 g- NULL 0 NULL +0 @- NULL 0 NULL +0 * NULL 0 r + +0 @ NULL 0 a +0 V NULL 0 a +0 a NULL 0 a +0 @2 NULL 0 a +0 @3 NULL 0 a +0 @4 NULL 0 a +0 i: NULL 0 ii +0 I NULL 0 i +0 e: NULL 0 e +0 e NULL 0 e +0 E: NULL 0 ai +0 E NULL 0 ai +0 E~ NULL 0 ai +0 &: NULL 0 ai +0 a: NULL 0 aa +0 o: NULL 0 o +0 o NULL 0 o +0 O: NULL 0 au +0 o~ NULL 0 o +0 O~ NULL 0 au +0 U NULL 0 uu +0 u: NULL 0 uu +0 aI NULL 0 ai +0 aU NULL 0 au + +0 H NULL 0 h +0 t. NULL 0 T +0 t.h NULL 0 Th +0 d. NULL 0 D +0 d.h NULL 0 Dh +0 J NULL 0 j +0 Jh NULL 0 jh +0 n. NULL 0 N +0 n^ NULL 0 N +0 j NULL 0 y +0 S NULL 0 sh + diff --git a/phsource/mbrola/nl b/phsource/mbrola/nl new file mode 100644 index 00000000..98cf95c8 --- /dev/null +++ b/phsource/mbrola/nl @@ -0,0 +1,73 @@ + +0 l/2 NULL 0 L +0 l/ NULL 0 L +0 r/ NULL 0 R +0 r- NULL 0 r +0 l- NULL 0 l +0 w/ NULL 0 W +0 j/ NULL 0 J +0 ; NULL 0 NULL +0 g- NULL 0 NULL +0 @- NULL 0 NULL +0 * NULL 0 r + +0 t; NULL 0 tj +0 c NULL 0 tj +0 d; NULL 0 dj +0 J NULL 0 dj +0 n^ NULL 0 nj +0 v2 NULL 0 v +0 s; NULL 0 S +0 C NULL 0 x +0 Q NULL 0 G + +0 8 NULL 0 Y +0 e: r/ 0 I: +0 e: NULL 0 e +0 Y: r/ 0 Y: +0 Y: NULL 0 2 +0 o: r/ 0 O: +0 o: NULL 0 o +0 a: NULL 0 a +0 EI NULL 0 Ei +0 Wy NULL 0 9y +0 VU NULL 0 Au +0 eU NULL 70 e W + + +// phonemes for English words +0 i: NULL 0 i +0 u: NULL 0 u +0 eI NULL 0 Ei +0 aU NULL 0 Au +0 oU NULL 0 o +0 @L NULL 40 @ l +0 @2 NULL 0 @ +0 @5 NULL 0 @ +0 3 NULL 0 @ +0 a2 NULL 0 @ +0 I2 NULL 0 I +0 aa NULL 0 a +0 V NULL 0 @ +0 U NULL 0 u +0 0 NULL 0 O +0 3: NULL 0 2 +0 aI NULL 60 A J +0 OI NULL 60 O J +0 e@ NULL 0 E +0 i@ NULL 60 i @ +0 e@ NULL 60 E @ +0 o@ NULL 70 o @ +0 O@ NULL 70 O @ +0 O: NULL 0 O +0 A: NULL 0 A +0 A@ NULL 70 A @ +0 U@ NULL 60 u @ +0 aI@ NULL 70 a @ +0 aU@ NULL 70 Au @ + +0 dZ NULL 0 dj +0 tS NULL 0 tj +0 T NULL 0 t +0 D NULL 0 z + diff --git a/phsource/mbrola/pl1 b/phsource/mbrola/pl1 new file mode 100644 index 00000000..c6ceef21 --- /dev/null +++ b/phsource/mbrola/pl1 @@ -0,0 +1,70 @@ + +2 l/2 E 40 I l +0 l/2 NULL 0 l +0 l/ NULL 0 l +0 r/ NULL 0 r +0 r- NULL 0 r +0 l- NULL 0 l +0 w/ NULL 0 w +0 j/ NULL 0 j +2 ; i 0 NULL +0 ; NULL 0 j +0 - NULL 0 NULL +0 g- NULL 0 NULL +0 @- NULL 0 NULL +0 * NULL 0 r + +0 y NULL 0 I +0 E NULL 0 e +0 O NULL 0 o +0 O~ NULL 0 o~ +0 E~ NULL 0 e~ +0 S; NULL 0 s' +0 Z; NULL 0 z' +0 ts; NULL 0 ts' +0 dz; NULL 0 dz' +0 n^ NULL 0 n' +0 c NULL 0 k +0 Q NULL 0 x +0 d; NULL 0 d +0 t; NULL 0 t + + +// map English phonemes to Polish +0 h NULL 0 x +0 @ NULL 0 I // @ +0 i: NULL 0 i +0 u: NULL 0 u +0 eI NULL 60 e j +0 aU NULL 60 a w +0 oU NULL 0 o +0 @L NULL 40 I l +0 @2 NULL 0 I // @ +0 @5 NULL 0 I // @ +0 3 NULL 0 I // @ +0 a2 NULL 0 a // @ +0 I2 NULL 0 I +0 aa NULL 0 a +0 V NULL 0 a // @ +0 U NULL 0 u +0 0 NULL 0 o +0 A: NULL 0 a +0 3: NULL 0 I // @ +0 aI NULL 60 a j +0 OI NULL 60 o j +0 i@ NULL 60 i I // @ +0 e@ NULL 0 e +0 o@ NULL 70 o I // @ +0 O@ NULL 70 o I // @ +0 O: NULL 0 o +0 A: NULL 0 a +0 A@ NULL 0 a +0 U@ NULL 60 u I // @ +0 aI@ NULL 70 a I // @ +0 aU@ NULL 0 a + +0 T NULL 0 t +0 D NULL 0 z + + + diff --git a/phsource/mbrola/ro1 b/phsource/mbrola/ro1 new file mode 100644 index 00000000..0d35be6e --- /dev/null +++ b/phsource/mbrola/ro1 @@ -0,0 +1,91 @@ + +0 i/ NULL 0 i +0 y NULL 0 1 +0 l/ NULL 0 l +0 l/2 NULL 0 l +0 r/ NULL 0 r +0 r- NULL 0 r +0 g- NULL 0 NULL +0 w/ NULL 0 w +0 * NULL 0 r +0 ; NULL 0 NULL +0 a e 15 a _ +0 a NULL 0 a +0 @- NULL 0 NULL +0 I^ _ 0 I +0 I^ NULL 20 I _ +0 @U NULL 60 @ w +0 aU NULL 60 a w +0 eU NULL 60 e w +0 iU NULL 60 i w +0 yU NULL 60 l w +0 oU NULL 60 o w +0 @I NULL 60 @ j +0 iI NULL 60 i j +0 aI NULL 60 a j +0 eI NULL 60 e j +0 oI NULL 60 o j +0 uI NULL 60 u j +0 yI NULL 60 1 j +0 ea NULL 50 E a +0 eo NULL 50 E o +0 e[u NULL 50 E u +0 Oa NULL 50 O a +0 Y NULL 0 @ +0 Z NULL 0 J +0 ts NULL 0 T +0 tS _ 0 T // [C - _] not allowed +0 tS NULL 0 C +0 dZ NULL 0 G +0 l; NULL 0 l +0 m; NULL 0 m +0 n; NULL 0 n +0 p; NULL 0 p +0 t; NULL 0 t +0 ts; NULL 0 T +0 f; NULL 0 f +0 s; NULL 0 s +0 S; NULL 0 S +0 b; NULL 0 b +0 d; NULL 0 d +0 *; NULL 0 r +0 v; NULL 0 v +0 z; NULL 0 z +0 Z; NULL 0 J +0 w2 NULL 0 w +0 N NULL 0 n + +// phonemes for English words +0 i: NULL 0 i +0 u: NULL 0 u +0 I NULL 0 i +0 E NULL 0 e +0 @L NULL 40 @ l +0 @2 NULL 0 @ +0 @5 NULL 0 @ +0 3 NULL 0 @ +0 a2 NULL 0 @ +0 I2 NULL 0 i +0 aa NULL 0 a +0 V NULL 0 @ +0 U NULL 0 u +0 0 NULL 0 o +0 3: NULL 0 @ +0 OI NULL 60 o J +0 i@ NULL 60 i @ +0 e@ NULL 60 e @ +0 o@ NULL 70 o @ +0 O@ NULL 70 o @ +0 O: NULL 0 o +0 O NULL 0 o +0 A: NULL 0 e +0 A@ NULL 70 a @ +0 U@ NULL 60 u @ +0 aI@ NULL 70 a @ +0 aU@ NULL 0 a + +0 T NULL 0 t +0 D NULL 0 z +0 x NULL 0 k + + diff --git a/phsource/mbrola/sv b/phsource/mbrola/sv new file mode 100644 index 00000000..8dbf6718 --- /dev/null +++ b/phsource/mbrola/sv @@ -0,0 +1,72 @@ +// 1 r/ d 0 rd +// 1 r/ t 0 rt +// 1 r/ n 0 rn +// 1 r/ s 0 rs +// 1 r/ l 0 rl + +0 l/2 NULL 0 l +0 l/ NULL 0 l +0 r/ NULL 0 r +0 r- NULL 0 r +0 l- NULL 0 l +0 w/ NULL 0 w +0 j/ NULL 0 j +0 ; NULL 0 NULL +0 g- NULL 0 NULL +0 @- NULL 0 NULL +0 * NULL 0 r + +0 S; NULL 0 C +0 sx NULL 0 S +0 S NULL 0 rs +0 u- NULL 0 }: +0 Y: NULL 0 2: +0 y NULL 0 Y +0 8 NULL 0 u0 +0 W NULL 0 2 +0 E NULL 0 e +0 @ N 0 e +0 a2 NULL 0 a +0 E: r 0 {: +0 Y: r 0 9: +0 E r 0 { +0 W r 0 9 + +4 p VWL 0 ph +4 t VWL 0 th +4 k VWL 0 kh + + +// phonemes for English words +0 @2 NULL 0 @ +0 @5 NULL 0 @ +0 I2 NULL 0 I +0 V NULL 0 u0 +0 aa NULL 0 a +0 0 NULL 0 A: +0 3 NULL 0 @ +0 3: NULL 0 2: +0 aI NULL 60 a j +0 eI NULL 60 e j +0 OI NULL 60 O j +0 aU NULL 60 a U +0 oU NULL 0 o: +0 i@ NULL 60 i: @ +0 e@ NULL 0 E: +0 o@ NULL 70 o: @ +0 O@ NULL 70 O @ +0 O: NULL 0 O +0 A@ NULL 0 A: +0 U@ NULL 60 U @ +0 @L NULL 40 @ l +0 aI@ NULL 70 a @ +0 aU@ NULL 70 A: u0 +0 T VWL 0 th +0 T NULL 0 t +0 D NULL 0 z +0 w NULL 0 v +0 z NULL 0 s +0 tS NULL 50 t rs +0 dZ NULL 50 d rs +0 Z NULL 0 rs + diff --git a/phsource/mbrola/us b/phsource/mbrola/us new file mode 100644 index 00000000..ed437991 --- /dev/null +++ b/phsource/mbrola/us @@ -0,0 +1,44 @@ +0 a2 NULL 0 @ +0 @2 NULL 0 @ +0 @5 NULL 0 @ +0 3 NULL 0 r= +0 I2 NULL 0 I +0 a NULL 0 { +0 aa NULL 0 { +0 @L NULL 0 l +0 l/2 NULL 0 l +0 r/ NULL 0 r +0 r- NULL 0 r +0 w/ NULL 0 w +0 ; NULL 0 NULL +0 g- NULL 0 NULL +0 @- NULL 0 NULL +0 aI@ NULL 60 AI r +0 aU@ NULL 75 aU r + + +0 * NULL 0 4 +0 3: NULL 0 r= +0 IR NULL 0 r= +0 VR NULL 0 r= +0 i: NULL 0 i +0 A: NULL 0 A +0 u: NULL 0 u +0 a NULL 0 { +0 eI NULL 0 EI +0 aI NULL 0 AI +0 oU NULL 0 @U +0 O: NULL 0 O + +0 0 NULL 0 A +0 O NULL 0 O +0 O@ NULL 50 O r +0 o@ NULL 50 O r +0 A@ NULL 50 A r +0 e@ NULL 50 E r +0 U@ NULL 50 U r +0 i@ NULL 50 I @ + +0 p NULL 0 p_h +0 t NULL 0 t_h +0 k NULL 0 k_h diff --git a/phsource/mbrola/us3 b/phsource/mbrola/us3 new file mode 100644 index 00000000..3b66a0eb --- /dev/null +++ b/phsource/mbrola/us3 @@ -0,0 +1,42 @@ +0 a2 NULL 0 @ +0 @2 NULL 0 @ +0 @5 NULL 0 @ +0 3 NULL 0 r= +0 I2 NULL 0 I +0 a NULL 0 { +0 aa NULL 0 { +0 @L NULL 0 l= +0 l/2 NULL 0 l +0 r/ NULL 0 r +0 r- NULL 0 r +0 w/ NULL 0 w +0 ; NULL 0 NULL +0 g- NULL 0 NULL +0 @- NULL 0 NULL +0 aI@ NULL 60 AI r +0 aU@ NULL 75 aU r + + +0 * NULL 0 4 +0 3: NULL 0 r= +0 IR NULL 0 r= +0 VR NULL 0 r= +0 i: NULL 0 i +0 A: NULL 0 A +0 u: NULL 0 u +0 a NULL 0 { +0 eI NULL 0 EI +0 aI NULL 0 AI +0 oU NULL 0 @U +0 O: NULL 0 O + +0 0 NULL 0 A +0 O NULL 0 O +0 O@ NULL 50 O r +0 o@ NULL 50 O r +0 A@ NULL 50 A r +0 e@ NULL 50 E r +0 U@ NULL 50 U r +0 i@ NULL 50 I @ + + diff --git a/phsource/n/_n b/phsource/n/_n new file mode 100644 index 00000000..04cabf4d Binary files /dev/null and b/phsource/n/_n differ diff --git a/phsource/n/n@ b/phsource/n/n@ new file mode 100644 index 00000000..0f058bbe Binary files /dev/null and b/phsource/n/n@ differ diff --git a/phsource/n/n_ b/phsource/n/n_ new file mode 100644 index 00000000..5203c44b Binary files /dev/null and b/phsource/n/n_ differ diff --git a/phsource/n/na b/phsource/n/na new file mode 100644 index 00000000..0ee44ef6 Binary files /dev/null and b/phsource/n/na differ diff --git a/phsource/n/ne b/phsource/n/ne new file mode 100644 index 00000000..21d9d98d Binary files /dev/null and b/phsource/n/ne differ diff --git a/phsource/n/ni b/phsource/n/ni new file mode 100644 index 00000000..dbecc6ff Binary files /dev/null and b/phsource/n/ni differ diff --git a/phsource/n/nj b/phsource/n/nj new file mode 100644 index 00000000..5ce2d792 Binary files /dev/null and b/phsource/n/nj differ diff --git a/phsource/n/no b/phsource/n/no new file mode 100644 index 00000000..9a027754 Binary files /dev/null and b/phsource/n/no differ diff --git a/phsource/n/nu b/phsource/n/nu new file mode 100644 index 00000000..b32d6dd8 Binary files /dev/null and b/phsource/n/nu differ diff --git a/phsource/n^/_n^ b/phsource/n^/_n^ new file mode 100644 index 00000000..33616bab Binary files /dev/null and b/phsource/n^/_n^ differ diff --git a/phsource/n^/n^@ b/phsource/n^/n^@ new file mode 100644 index 00000000..33737b1c Binary files /dev/null and b/phsource/n^/n^@ differ diff --git a/phsource/n^/n^_ b/phsource/n^/n^_ new file mode 100644 index 00000000..c8f3f359 Binary files /dev/null and b/phsource/n^/n^_ differ diff --git a/phsource/n^/n^a b/phsource/n^/n^a new file mode 100644 index 00000000..09f3d9cd Binary files /dev/null and b/phsource/n^/n^a differ diff --git a/phsource/n^/n^e b/phsource/n^/n^e new file mode 100644 index 00000000..30118f2e Binary files /dev/null and b/phsource/n^/n^e differ diff --git a/phsource/n^/n^i b/phsource/n^/n^i new file mode 100644 index 00000000..38dc32ea Binary files /dev/null and b/phsource/n^/n^i differ diff --git a/phsource/n^/n^o b/phsource/n^/n^o new file mode 100644 index 00000000..4cc2b43a Binary files /dev/null and b/phsource/n^/n^o differ diff --git a/phsource/n^/n^u b/phsource/n^/n^u new file mode 100644 index 00000000..59b57d4c Binary files /dev/null and b/phsource/n^/n^u differ diff --git a/phsource/nn/_nn b/phsource/nn/_nn new file mode 100644 index 00000000..c4f19e73 Binary files /dev/null and b/phsource/nn/_nn differ diff --git a/phsource/nn/inn b/phsource/nn/inn new file mode 100644 index 00000000..6006c27c Binary files /dev/null and b/phsource/nn/inn differ diff --git a/phsource/nn/nn@ b/phsource/nn/nn@ new file mode 100644 index 00000000..9aab5c79 Binary files /dev/null and b/phsource/nn/nn@ differ diff --git a/phsource/nn/nn_ b/phsource/nn/nn_ new file mode 100644 index 00000000..d2a2d2b0 Binary files /dev/null and b/phsource/nn/nn_ differ diff --git a/phsource/nn/nna b/phsource/nn/nna new file mode 100644 index 00000000..2086a9be Binary files /dev/null and b/phsource/nn/nna differ diff --git a/phsource/nn/nne b/phsource/nn/nne new file mode 100644 index 00000000..640e5615 Binary files /dev/null and b/phsource/nn/nne differ diff --git a/phsource/nn/nni b/phsource/nn/nni new file mode 100644 index 00000000..3d902cc4 Binary files /dev/null and b/phsource/nn/nni differ diff --git a/phsource/nn/nnj b/phsource/nn/nnj new file mode 100644 index 00000000..be99cb06 Binary files /dev/null and b/phsource/nn/nnj differ diff --git a/phsource/nn/nno b/phsource/nn/nno new file mode 100644 index 00000000..64cc26a1 Binary files /dev/null and b/phsource/nn/nno differ diff --git a/phsource/nn/nnu b/phsource/nn/nnu new file mode 100644 index 00000000..411a66c6 Binary files /dev/null and b/phsource/nn/nnu differ diff --git a/phsource/ph_af b/phsource/ph_af new file mode 100644 index 00000000..715e198e --- /dev/null +++ b/phsource/ph_af @@ -0,0 +1,301 @@ + + +//**************************************************************** +// VOWELS +//**************************************************************** + + +phoneme @ // Schwa, but always unstressed + vowel starttype (@) endtype (@) + length 140 + formants vwl_af/@ + unstressed + before r/ vwl_af/r@+50 +endphoneme + + +phoneme a // short A + vowel starttype (a) endtype (a) + length 140 + formants vowel/V_2 +endphoneme + + +phoneme E // short E + vowel starttype (i) endtype (e) + length 140 + formants vowel/e_mid2 +endphoneme + +phoneme I // short I, Schwa + vowel starttype (@) endtype (@) + length 140 + formants vwl_af/I + before r/ vwl_af/r@+50 +endphoneme + + +phoneme O // short O + vowel starttype (o) endtype (o) + length 140 + formants vowel/oo_3 +endphoneme + + +phoneme W // short U + vowel starttype (@) endtype (@) + length 140 + formants vowel/oe +endphoneme + + +phoneme u // short OE + vowel starttype (u) endtype (u) + length 140 + formants vowel/uu_3 +endphoneme + + +phoneme & // more open [E] + vowel starttype (e) endtype (e) + length 150 + formants vowel/ee_3 + before l/2 DFT-30+l/L_eL_af +endphoneme + + +phoneme @L // syllabic L + vowel starttype (@) endtype l + length 160 + formants vwl_en/@L + unstressed + before _ vwl_en/@L +endphoneme + + + +phoneme A: // long A + vowel starttype (a) endtype (a) + length 230 + formants vowel/aa_3 +endphoneme + + +phoneme e@ // long E + vowel starttype (i) endtype (@) + length 230 + formants vdiph/i@_2 +endphoneme + + +phoneme i // long I + vowel starttype (i) endtype (i) + length 130 + formants vowel/i_3 + linkout ; +endphoneme + + +phoneme o@ // long O + vowel starttype (u) endtype (@) + length 250 + formants vdiph2/o@ +endphoneme + + +phoneme y // long U + vowel starttype (i) endtype (i) + length 180 + formants vowel/y_3 +endphoneme + + +phoneme iu + vowel starttype (i) endtype (u) + length 220 + formants vdiph2/iu_3 +endphoneme + + +phoneme @U + vowel starttype (@) endtype (u) + length 220 + formants vdiph/Vu +endphoneme + + +phoneme aI + vowel starttype (a) endtype (i) + length 220 + formants vdiph/ai_4 + linkout ; +endphoneme + + +phoneme AI + vowel starttype (a) endtype (i) + length 310 + formants vdiph/aai_2 + linkout ; +endphoneme + + +phoneme eI + vowel starttype (e) endtype (i) + length 170 + formants vdiph/@i_2 + linkout ; +endphoneme + + +phoneme OI + vowel starttype (o) endtype (i) + length 230 + formants vdiph/ooi_2 + linkout ; +endphoneme + + +phoneme oI + vowel starttype (o) endtype (i) + length 290 + formants vdiph/oi_2 + linkout ; +endphoneme + + +phoneme uI + vowel starttype (u) endtype (i) + length 240 + formants vdiph/ui_2 + linkout ; +endphoneme + + +phoneme Yy + vowel starttype (@) endtype (i) + length 220 + formants vdiph/y#y_2 + linkout ; +endphoneme + + +phoneme Y@ + vowel starttype (i) endtype (@) + length 210 + formants vdiph2/y#@ +endphoneme + + +phoneme aU + vowel starttype (a) endtype (u) + length 230 + formants vdiph/au +endphoneme + + +// circumflex accent vowels + +phoneme e: + vowel starttype (e) endtype (e) + length 210 + formants vowel/e +endphoneme + + +phoneme O: + vowel starttype (o) endtype (o) + length 240 + formants vowel/oo_1 +endphoneme + + +phoneme 3: + vowel starttype (@) endtype (@) + length 230 + formants vowel/3_en +endphoneme + + +// Nasal vowels + +phoneme A~ + vowel starttype (a) endtype (a) + length 240 + formants vnasal/aa_n3 +endphoneme + + +phoneme e~ + vowel starttype (e) endtype (e) + length 240 + formants vnasal/e_n +endphoneme + + +phoneme o~ + vowel starttype (o) endtype (o) + length 240 + formants vnasal/o_n2 +endphoneme + + + +// CONSONANTS +//=========== + +phoneme x2 + vls vel frc + vowelin f1=0 f2=2300 200 400 f3=-100 100 + vowelout f1=0 f2=2300 300 400 f3=-100 100 rms=20 + length 100 + lengthmod 3 + wave ufric/x2%60 // stronger version of [x] +endphoneme + + + +phoneme r + liquid + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants r/rr + after _ r/rr + after t r/trr p r/trr k r/trr + before _ r/r_ +endphoneme + + +phoneme r/ // used for [r] when not preceding a vowel + liquid + length 100 + lengthmod 7 // + formants r3/r_+r3/rx + after @ NULL + after _ r/rr + after t r/trr p r/trr k r/trr +endphoneme + + +phoneme l + liquid + length 100 + lengthmod 7 + beforenotvowel l/2 // 'dark' [l] + formants l/l + after _ l/_l t l/tl + before _ l/l_2 +endphoneme + +phoneme c + vls pal stop palatal + vowelin f1=0 f2=2700 400 600 f3= 200 80 + vowelout f1=0 f2=2700 400 600 f3= 200 80 rms=20 + lengthmod 2 + wave ustop/ki + switchvoicing g +endphoneme + + diff --git a/phsource/ph_croatian b/phsource/ph_croatian new file mode 100644 index 00000000..1b32fdfd --- /dev/null +++ b/phsource/ph_croatian @@ -0,0 +1,116 @@ +phoneme @ // Schwa + vowel starttype (@) endtype (@) + formants vowel/@ + length 140 +endphoneme + +phoneme @2 // Schwa (raised) + vowel starttype (@) endtype (@) + formants vowel/@_fnt + length 140 +endphoneme + + +phoneme a + vowel starttype (a) endtype (a) + length 140 + formants vowel/a + reduceto & 4 +endphoneme + + +phoneme & + vowel starttype (a) endtype (a) + length 140 + formants vowel/a#_2 +endphoneme + + +phoneme aI + vowel starttype (a) endtype (i) + length 250 + formants vdiph/ai +endphoneme + + +phoneme E + vowel starttype (e) endtype (e) + length 130 + formants vowel/e_mid +endphoneme + + +phoneme e + vowel starttype (e) endtype (e) + length 130 + formants vowel/e +endphoneme + + +phoneme i + vowel starttype (i) endtype (i) + length 120 + formants vowel/i_3 + linkout ; + reduceto I 4 +endphoneme + + +phoneme I + vowel starttype (i) endtype (i) + length 120 + formants vowel/ii_3 + linkout ; +endphoneme + + +phoneme u + vowel starttype (u) endtype (u) + length 130 + formants vowel/u_bck + reduceto U 4 +endphoneme + +phoneme U + vowel starttype (u) endtype (u) + length 130 + formants vowel/uu_bck +endphoneme + + + + +phoneme p + vls blb stop + vowelin f1=0 f2=1000 -50 -100 f3=-200 80 + vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=30 + lengthmod 2 + wave ustop/p_unasp + before _ ustop/p_unasp_%80 + before r ustop/pr + before l ustop/pl + switchvoicing b +endphoneme + + +phoneme t // dental variant of /t/ + vls dnt stop + vowelin f1=0 f2=1600 -300 300 f3=-100 80 + vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/t_dnt%50 + before _ ustop/t_dnt%35 + switchvoicing d +endphoneme + + +phoneme x + vls vel frc + vowelin f1=0 f2=2300 200 400 f3=-100 80 + vowelout f1=0 f2=2300 300 400 f3=-100 80 rms=20 + length 100 + lengthmod 3 + wave ufric/xx + switchvoicing Q +endphoneme + diff --git a/phsource/ph_czech b/phsource/ph_czech new file mode 100644 index 00000000..f545b5bd --- /dev/null +++ b/phsource/ph_czech @@ -0,0 +1,38 @@ +phoneme e + vowel starttype (e) endtype (e) + length 130 + formants vowel/e_mid +endphoneme + +phoneme a: + vowel starttype (a) endtype (a) + length 290 + formants vowel/a_3 +endphoneme + +phoneme o + vowel starttype (o) endtype (o) + length 130 + formants vowel/oo_2 +endphoneme + +phoneme u: + vowel starttype (u) endtype (u) + length 280 + formants vowel/u +endphoneme + + +phoneme R + vcd pla frc sibilant + vowelin f1=0 f2=1700 -300 300 f3=-300 80 + vowelout f1=2 f2=1700 -300 300 f3=-300 80 brk + formants voc/zh_2+vocw/zh_rfx%130 + lengthmod 6 +// switchvoicing S +endphoneme + + + + + diff --git a/phsource/ph_dutch b/phsource/ph_dutch new file mode 100644 index 00000000..493ec89d --- /dev/null +++ b/phsource/ph_dutch @@ -0,0 +1,192 @@ + + +//========================================================= +// Dutch +//========================================================= + + +// Vowels +//======= + + +phoneme @ // Schwa + vowel starttype (@) endtype (@) + formants vowel/@_4 + unstressed + length 125 +endphoneme + +phoneme i + vowel starttype (i) endtype (i) + length 160 + formants vowel/i_2 + after w w/wi2 +endphoneme + +phoneme I + vowel starttype (i) endtype (i) + length 130 + formants vowel/ii +endphoneme + +phoneme y + vowel starttype (u) endtype (u) + length 180 + formants vowel/y +endphoneme + +phoneme 8 + vowel starttype (u) endtype (u) + length 140 + formants vowel/y# +endphoneme + +phoneme u + vowel starttype (u) endtype (u) + length 150 + formants vowel/u_bck +endphoneme + +phoneme E + vowel starttype (e) endtype (e) + length 140 + formants vowel/e_mid2 +endphoneme + +phoneme E2 // as[E] but reduces to @ if unstressed + vowel starttype (e) endtype (e) + length 140 + formants vowel/ee_2 + reduceto @ 0 +endphoneme + +phoneme O + vowel starttype (o) endtype (o) + length 150 + formants vowel/o_6 +endphoneme + +phoneme a: + vowel starttype (a) endtype (a) + length 210 + formants vowel/a +endphoneme + +phoneme A + vowel starttype (a) endtype (a) + length 160 + formants vowel/aa_7 +endphoneme + + +// Diphthongs +//=========== + +phoneme e: + vowel starttype (e) endtype (i) + length 190 + formants vdiph/ei +endphoneme + +phoneme Y: + vowel starttype (@) endtype (@) + length 220 + formants vdiph/y#y_3 +endphoneme + +phoneme o: + vowel starttype (o) endtype (u) + length 200 + formants vdiph/Vu_3 +endphoneme + + +phoneme EI + vowel starttype (a) endtype (i) + length 210 + formants vdiph/eei_4 +endphoneme + +phoneme Wy + vowel starttype (@) endtype (u) + length 220 + formants vdiph/&y +endphoneme + +phoneme VU + vowel starttype (a) endtype (o) + length 220 + formants vdiph/aau_2 +endphoneme + +phoneme eU + vowel starttype (e) endtype (u) + length 220 + formants vdiph/eu +endphoneme + +phoneme yU + vowel starttype (u) endtype (u) + length 220 + formants vdiph2/yu +endphoneme + + + + +// CONSONANTS +//=========== + + +phoneme r + liquid + lengthmod 7 + beforenotvowel r/ + trill + formants r/rr + after _ r/rr + after t r/trr p r/trr k r/trr + before _ r/r_ +endphoneme + + +phoneme r/ // variant of [r] when not preceding a vowel + liquid vowel2 + length 100 + lengthmod 7 // + formants NULL +endphoneme + + +phoneme v2 // approximant, not fricative + vcd lbd frc + vowelin f1=0 f2=1000 -300 -200 f3=-300 100 + vowelout f1=0 f2=1000 -500 -300 f3=-300 60 len=50 + lengthmod 6 + formants voc/v + before _ voc/v_ + switchvoicing f +endphoneme + +phoneme Q + vcd vel frc + vowelin f1=2 f2=2300 200 300 f3=-300 80 + vowelout f1=2 f2=2300 250 300 f3=-300 80 brk + lengthmod 6 + formants voc/Q_less+vocw/Q2%140 + before _ voc/Q_+vocw/Q_ + switchvoicing x +endphoneme + + + +phoneme x2 // a stronger version of [x] (for Afrikaans) + vls vel frc + vowelin f1=0 f2=2300 200 400 f3=-100 100 + vowelout f1=0 f2=2300 300 400 f3=-100 100 rms=20 + length 100 + lengthmod 3 + wave ufric/x2 // stronger version +endphoneme + + diff --git a/phsource/ph_english b/phsource/ph_english new file mode 100644 index 00000000..5efdf63f --- /dev/null +++ b/phsource/ph_english @@ -0,0 +1,421 @@ + + +phoneme k + vls vel stop + vowelin f1=0 f2=2300 200 400 f3=-100 80 + vowelout f1=0 f2=2300 300 400 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/k + before _ ustop/k_ + before r ustop/kr + before l ustop/kl + before i: ustop/ki + before i@ ustop/ki +endphoneme + + +phoneme N + vcd vel nasal + vowelout f1=3 f2=2300 300 400 f3=-200 80 len=40 rms=20 brk + length 100 + formants NULL + after _ nn/_nn + before _ nn/nn_ + lengthmod 8 // longer than 'n' + linkout g- +endphoneme + + +phoneme l + liquid + length 100 + lengthmod 7 + beforenotvowel l/2 // use 'dark' [l] after a vowel + formants l/l + after _ l/_l t l/tl + before _ l/l_2 +endphoneme + + + +//******************************************************************* +// VOWELS +//******************************************************************* + + +phoneme @ // Schwa + vowel starttype (@) endtype (@) + formants vowel/@ + unstressed + linkout r- + length 140 +endphoneme + + +phoneme 3 // Schwa, used for rhotic schwa in American + vowel starttype (@) endtype (@) + formants vowel/@ + unstressed + linkout r- + beforevowel @ + length 140 +endphoneme + + +phoneme @2 // Schwa, changes to I before a vowel + vowel starttype (@) endtype (@) + formants vowel/@ + unstressed + beforevowel I2 + length 120 +endphoneme + +phoneme @5 // Schwa, changes to U before a vowel + vowel starttype (@) endtype (@) + formants vowel/@ + unstressed + beforevowelpause U + length 140 +endphoneme + + +phoneme @L + vowel starttype (@) endtype l + length 160 + formants vwl_en/@L + unstressed + before _ vwl_en/@L +endphoneme + + +phoneme a + vowel starttype (a) endtype (a) + length 150 + formants vowel/a_en + reduceto a2 0 +endphoneme + + +phoneme a2 + vowel starttype (@) endtype (a) + unstressed + length 150 + formants vowel/a#_3 + linkout r- +endphoneme + + +phoneme aa // 'bath' etc. + vowel starttype (a) endtype (a) + length 150 + formants vowel/a_en + linkout r- +endphoneme + + +phoneme E + vowel starttype (e) endtype (e) + length 140 + formants vowel/ee_2 + reduceto I 0 +endphoneme + + +phoneme I + vowel starttype (i) endtype (i) + length 130 + formants vowel/ii_en + linkout ; +endphoneme + +phoneme I2 + vowel starttype (i) endtype (i) + unstressed + length 140 + formants vowel/ii_en + linkout ; +endphoneme + + +phoneme i // optional variant of [I] for end of words + vowel starttype (i) endtype (i) + length 220 + formants vowel/ii_en + linkout ; +endphoneme + + +phoneme 0 + vowel starttype (o) endtype (o) + length 140 + formants vowel/0 + reduceto @ 0 +endphoneme + + +phoneme V + vowel starttype (a) endtype (@) + length 140 + formants vowel/V + reduceto @ 0 +endphoneme + + +phoneme U + vowel starttype (u) endtype (u) + length 150 + formants vowel/uu +endphoneme + + +phoneme A: + vowel starttype (a) endtype (a) + length 230 + formants vowel/aa_2 + linkout r- +endphoneme + + +phoneme A@ // Used for [A:] when followed by 'r', becomes [A:]+[r] in American + vowel starttype (a) endtype (a) + length 230 + formants vowel/aa_2 + linkout r- +endphoneme + + +phoneme 3: + vowel starttype (@) endtype (@) + length 210 + formants vowel/3_en + reduceto @ 0 + linkout r- +endphoneme + + +phoneme i: + vowel starttype (i) endtype (i) + length 175 + formants vowel/i_en + after w w/wi2 + linkout ; +endphoneme + + +phoneme O: + vowel starttype (o) endtype (o) + length 230 + formants vowel/oo_en + reduceto @ 0 +// linkout r- +endphoneme + + +phoneme O@ + vowel starttype (o) endtype (@) + length 240 + formants vowel/oo_en + linkout r- +endphoneme + + +phoneme o@ + vowel starttype (o) endtype (@) + length 240 + formants vowel/oo_en + linkout r- +endphoneme + + +phoneme O + vowel starttype (o) endtype (o) + length 150 + formants vowel/oo_en + reduceto @ 0 +endphoneme + + +phoneme u: + vowel starttype (u) endtype (u) + length 210 + formants vwl_en/u + before l/2 vwl_en/u_L-40+l/L2_uL +endphoneme + + +phoneme aU + vowel starttype (a) endtype (u) + length 230 + formants vdiph/au +endphoneme + + +phoneme oU + vowel starttype (@) endtype (u) + length 220 + formants vdiph/@u_en +endphoneme + + +phoneme aI + vowel starttype (a) endtype (i) + length 230 + formants vdiph/ai_en +endphoneme + + +phoneme eI + vowel starttype (e) endtype (i) + length 210 + formants vdiph/eei +endphoneme + + +phoneme OI + vowel starttype (o) endtype (i) + length 230 + formants vdiph/ooi +endphoneme + + +phoneme e@ + vowel starttype (e) endtype (@) + length 220 + formants vowel/ee_1 + linkout r- +endphoneme + + +phoneme i@ + vowel starttype (i) endtype (@) + length 250 + formants vdiph2/ii@ + linkout r- +endphoneme + + +phoneme U@ + vowel starttype (u) endtype (@) + length 200 + formants vdiph2/uu@ + linkout r- +endphoneme + + +phoneme aI@ + vowel starttype (a) endtype (@) + length 270 + formants vwl_en/aI@ + linkout r- +endphoneme + + +phoneme aU@ + vowel starttype (a) endtype (@) + length 270 + formants vwl_en/aU@ + linkout r- +endphoneme + + +// extra vowels + +phoneme e: + vowel starttype (e) endtype (e) + length 210 + formants vowel/e +endphoneme + + +phoneme o: + vowel starttype (o) endtype (o) + length 220 + formants vowel/o +endphoneme + + +phoneme eU + vowel starttype (e) endtype (u) +length 240 +formants vdiph/eu +endphoneme + + +phoneme uI + vowel starttype (u) endtype (i) + length 240 + formants vdiph/ui +endphoneme + + +phoneme IR // used for "ir" when [3:] is split (Scottish) + vowel starttype (@) endtype (@) + length 190 + formants vowelr/V_r + appendph r +endphoneme + +phoneme VR // used for "or"/"ur" when [3:] is split (Scottish) + vowel starttype (@) endtype (@) + length 210 + formants vowelr/V3_r + appendph r +endphoneme + + + +phoneme A~ + vowel starttype (a) endtype (a) + length 260 + formants vnasal/aa_n +endphoneme + + +phoneme E~ + vowel starttype (e) endtype (e) + length 260 + formants vnasal/ee_n +endphoneme + + +phoneme O~ + vowel starttype (o) endtype (o) + length 260 + formants vnasal/oo_n +endphoneme + + +phoneme W~ + vowel starttype (@) endtype (@) + length 260 + formants vnasal/W_n +endphoneme + + +phoneme y: + vowel starttype (u) endtype (u) + length 220 + formants vowel/y +endphoneme + + +phoneme Y: + vowel starttype (@) endtype (@) + length 230 + formants vowel/y# +endphoneme + + +phoneme W + vowel starttype (@) endtype (@) + length 170 + formants vowel/oe +endphoneme + + +phoneme u- + vowel starttype (u) endtype (u) + length 200 + formants vowel/u# +endphoneme + diff --git a/phsource/ph_english_n b/phsource/ph_english_n new file mode 100644 index 00000000..187e7a21 --- /dev/null +++ b/phsource/ph_english_n @@ -0,0 +1,238 @@ + + +//******************************************************************* +// VOWELS +//******************************************************************* + + +phoneme a + vowel starttype (a) endtype (a) + length 140 + formants vowel/a + reduceto a2 0 +endphoneme + + +phoneme E + vowel starttype (e) endtype (e) + length 150 + formants vowel/ee_6 + reduceto I 0 +// before l/ DFT-30+L/eL_af +endphoneme + + +phoneme I + vowel starttype (i) endtype (i) + length 130 + formants vowel/ii_en + linkout ; +endphoneme + +phoneme i // optional variant of [I] for end of words + vowel starttype (i) endtype (i) + length 220 + formants vowel/ii_en + linkout ; +endphoneme + + +phoneme 0 + vowel starttype (o) endtype (o) + length 140 + formants vowel/0_2 + reduceto @ 0 +endphoneme + + +phoneme V + vowel starttype (o) endtype (o) + length 140 + formants vowel/o-_2 + reduceto @ 0 +endphoneme + + +phoneme U + vowel starttype (u) endtype (u) + length 150 + formants vowel/u +endphoneme + + +phoneme I2 + vowel starttype (i) endtype (i) + unstressed + length 140 + formants vowel/ii_en + linkout ; +endphoneme + + +phoneme a2 + vowel starttype (@) endtype (@) + unstressed + length 140 + formants vowel/a#_3 + linkout r- +endphoneme + + +phoneme A: + vowel starttype (a) endtype (@) + length 240 + formants vowel/aa_5 + linkout r- +endphoneme + + +phoneme A@ + vowel starttype (a) endtype (@) + length 240 + formants vowel/aa_5 + linkout r- +endphoneme + + +phoneme aa // 'bath' etc. + vowel starttype (a) endtype (a) + length 150 + formants vowel/a + linkout r- +endphoneme + + +phoneme 3: + vowel starttype (@) endtype (@) + length 230 + formants vowel/3_2 + reduceto @ 0 + linkout r- +endphoneme + + +phoneme i: + vowel starttype (i) endtype (i) + length 175 + formants vowel/i + after w w/wi2 + linkout ; +endphoneme + + +phoneme O: + vowel starttype (o) endtype (o) + length 240 + formants vowel/oo_1 + reduceto @ 0 + linkout r- +endphoneme + + +phoneme O@ + vowel starttype (o) endtype (@) + length 240 + formants vowel/oo_1 + linkout r- +endphoneme + + +phoneme O@ + vowel starttype (o) endtype (@) + length 240 + formants vwl_en_n/O@ + linkout r- +endphoneme + + +phoneme O + vowel starttype (o) endtype (o) + length 150 + formants vowel/oo_en + reduceto @ 0 +endphoneme + + +phoneme u: + vowel starttype (u) endtype (u) + length 200 + formants vowel/u#_3 + before _ vwl_en_n/u_ + before l/2 vwl_en/u_L-40+l/L2_uL +endphoneme + + +phoneme aU + vowel starttype (a) endtype (u) + length 230 + formants vdiph/eeu_3 +endphoneme + + +phoneme oU + vowel starttype (o) endtype (u) + length 210 + formants vowel/o_4 +endphoneme + + +phoneme aI + vowel starttype (a) endtype (i) + length 230 + formants vdiph/ae_2 +endphoneme + + +phoneme eI + vowel starttype (i) endtype (i) + length 210 + formants vowel/e +endphoneme + + +phoneme OI + vowel starttype (o) endtype (i) + length 230 + formants vdiph/ooi +endphoneme + + +phoneme e@ + vowel starttype (e) endtype (@) + length 220 + formants vowel/ee_1 + linkout r- +endphoneme + + +phoneme i@ + vowel starttype (i) endtype (@) + length 240 + formants vdiph2/i@ + linkout r- +endphoneme + + +phoneme U@ + vowel starttype (u) endtype (@) + length 200 + formants vdiph2/uu@ + linkout r- +endphoneme + + +phoneme aI@ + vowel starttype (a) endtype (@) + length 270 + formants vwl_en/aI@ + linkout r- +endphoneme + + +phoneme aU@ + vowel starttype (a) endtype (@) + length 270 + formants vwl_en/aU@ + linkout r- +endphoneme + diff --git a/phsource/ph_english_rp b/phsource/ph_english_rp new file mode 100644 index 00000000..c0794c78 --- /dev/null +++ b/phsource/ph_english_rp @@ -0,0 +1,273 @@ + +//******************************************************************* +// VOWELS +//******************************************************************* + + +phoneme @ // Schwa + vowel starttype (@) endtype (@) + formants vowel/@ + before _ vwl_en_rp/@ + unstressed + linkout r- + length 140 +endphoneme + + +phoneme 3 // Schwa, used for rhotic schwa in American + vowel starttype (@) endtype (@) + formants vowel/@ + before _ vwl_en_rp/@ + unstressed + linkout r- + beforevowel @ + length 140 +endphoneme + +phoneme @2 // Schwa, changes to I before a vowel + vowel starttype (@) endtype (@) + formants vwl_en_rp/@ + unstressed + beforevowel I + length 120 +endphoneme + +phoneme @5 // Schwa, changes to U before a vowel + vowel starttype (@) endtype (@) + formants vwl_en_rp/@ + unstressed + beforevowelpause U + length 140 +endphoneme + + +phoneme @L + vowel starttype (@) endtype l + length 160 + formants vwl_en/@L + unstressed + before _ vwl_en/@L +endphoneme + + +phoneme a + vowel starttype (a) endtype (a) + length 170 + formants vowel/& + reduceto a2 0 +endphoneme + + +phoneme E + vowel starttype (e) endtype (e) + length 140 + formants vowel/e_mid + reduceto I 0 +endphoneme + + +phoneme I + vowel starttype (i) endtype (i) + length 130 + formants vowel/ii_4 + linkout ; +endphoneme + +phoneme i // optional variant of [I] for end of words + vowel starttype (i) endtype (i) + length 140 + formants vowel/ii_3 + linkout ; +endphoneme + + +phoneme 0 + vowel starttype (o) endtype (o) + length 140 + formants vowel/0_3 + reduceto @ 0 +endphoneme + + +phoneme V + vowel starttype (a) endtype (@) + length 140 + formants vowel/V_3 +// formants vwl_af/a + reduceto @ 0 +endphoneme + + +phoneme U + vowel starttype (u) endtype (u) + length 150 + formants vowel/o-_3 +endphoneme + + +phoneme I2 + vowel starttype (i) endtype (i) + unstressed + length 140 + formants vowel/ii_4 + linkout ; +endphoneme + + +phoneme a2 + vowel starttype (@) endtype (@) + unstressed + length 150 + formants vowel/@ + linkout r- +endphoneme + + +phoneme A: + vowel starttype (a) endtype (a) + length 240 + formants vwl_en_rp/aa + linkout r- +endphoneme + + +phoneme A@ + vowel starttype (a) endtype (a) + length 240 + formants vwl_en_rp/aa + linkout r- +endphoneme + + +phoneme aa // 'bath' etc. + vowel starttype (a) endtype (a) + length 190 + formants vwl_en_rp/aa + linkout r- +endphoneme + + +phoneme 3: + vowel starttype (@) endtype (@) + length 210 + formants vowel/3_3 + reduceto @ 0 + linkout r- +endphoneme + + +phoneme i: + vowel starttype (i) endtype (i) + length 175 + formants vowel/i + after w w/wi2 + linkout ; +endphoneme + + +phoneme O: + vowel starttype (o) endtype (o) + length 230 + formants vowel/oo_1 + reduceto @ 0 + linkout r- +endphoneme + + +phoneme O@ + vowel starttype (o) endtype (@) + length 230 + formants vowel/oo_1 + linkout r- +endphoneme + + +phoneme O + vowel starttype (o) endtype (o) + length 150 + formants vowel/oo_en + reduceto @ 0 +endphoneme + + +phoneme u: + vowel starttype (u) endtype (u) + length 190 + formants vowel/u_6 + before l/2 vwl_en/u_L-40+l/L2_uL +endphoneme + + +phoneme aU + vowel starttype (a) endtype (u) + length 230 + formants vdiph/au_3 +endphoneme + + +phoneme oU + vowel starttype (@) endtype (u) + length 220 + formants vdiph/@u_2 +endphoneme + + +phoneme aI + vowel starttype (a) endtype (i) + length 230 + formants vdiph/ai_6 +endphoneme + + +phoneme eI + vowel starttype (i) endtype (i) + length 210 + formants vdiph/eei_3 +endphoneme + + +phoneme OI + vowel starttype (o) endtype (i) + length 230 + formants vdiph/ooi +endphoneme + + +phoneme e@ + vowel starttype (e) endtype (@) + length 220 + formants vwl_en_rp/e@ + linkout r- +endphoneme + + +phoneme i@ + vowel starttype (i) endtype (@) + length 240 + formants vwl_en_rp/i@ + linkout r- +endphoneme + + +phoneme U@ + vowel starttype (u) endtype (@) + length 230 + formants vwl_en_rp/oo + linkout r- +endphoneme + + +phoneme aI@ + vowel starttype (a) endtype (@) + length 270 + formants vwl_en/aI@ + linkout r- +endphoneme + + +phoneme aU@ + vowel starttype (a) endtype (@) + length 270 + formants vwl_en_rp/aU@ + linkout r- +endphoneme diff --git a/phsource/ph_english_sc b/phsource/ph_english_sc new file mode 100644 index 00000000..72699c30 --- /dev/null +++ b/phsource/ph_english_sc @@ -0,0 +1,355 @@ + + +//******************************************************************* +// VOWELS +//******************************************************************* + + +phoneme @ // Schwa + vowel starttype (@) endtype (@) + formants vowel/@_3 + unstressed + linkout r- + length 140 +endphoneme + + +phoneme 3 // Schwa, used for rhotic schwa in American + vowel starttype (@) endtype (@) + formants vowel/V + before _ vowelr/V3_r + unstressed + linkout r- + beforevowel @ + length 140 +endphoneme + + +phoneme @2 // Schwa, changes to I before a vowel + vowel starttype (@) endtype (@) + formants vowel/@_3 + unstressed + beforevowel I2 + length 120 +endphoneme + +phoneme @5 // Schwa, changes to U before a vowel + vowel starttype (@) endtype (@) + formants vowel/@_3 + unstressed + beforevowelpause U + length 140 +endphoneme + + +phoneme @L + vowel starttype (@) endtype l + length 160 + formants vwl_en/@L + unstressed + before _ vwl_en/@L +endphoneme + + +phoneme a + vowel starttype (a) endtype (a) + length 200 + formants vowel/a_3 + reduceto a/ 4 +endphoneme + +phoneme a/ + vowel starttype (a) endtype (a) + length 160 + formants vowel/a_3 + reduceto a2 0 +endphoneme + + +phoneme a2 + vowel starttype (@) endtype (@) + unstressed + length 140 + formants vowel/a# + linkout r- +endphoneme + + +phoneme aa // 'bath' etc. + vowel starttype (a) endtype (a) + length 220 + formants vowel/a_3 + linkout r- +endphoneme + + +phoneme E + vowel starttype (e) endtype (e) + length 170 + formants vowel/e_e + reduceto I 0 +endphoneme + + +phoneme I + vowel starttype (e) endtype (e) + length 110 + formants vowel/e# + before l/2 vowel/@_3-30+l/L2_@L +endphoneme + +phoneme I2 + vowel starttype (e) endtype (e) + unstressed + length 110 + formants vowel/e# +endphoneme + + +phoneme i // optional variant of [I] for end of words + vowel starttype (i) endtype (e) + length 150 + formants vowel/e_5 + linkout ; +endphoneme + + +phoneme 0 + vowel starttype (o) endtype (o) + length 180 + formants vowel/oo_2 + reduceto @ 0 +endphoneme + + +phoneme V + vowel starttype (a) endtype (@) + length 140 + formants vowel/V_4 + reduceto @ 0 +endphoneme + + +phoneme U + vowel starttype (u) endtype (u) + length 140 + formants vowel/u#_4 +endphoneme + + +phoneme A: + vowel starttype (a) endtype (a) + length 220 + formants vowel/a_3 + before r vowelr/aa_r+30 + linkout r- +endphoneme + + +phoneme A@ // Used for [A:] when followed by 'r', becomes [A:]+[r] in American + vowel starttype (a) endtype (@) + length 250 + formants vowelr/aa_r + appendph r +endphoneme + + +phoneme 3: + vowel starttype (e) endtype (@) + length 210 + formants vdiph2/e@ + appendph r + reduceto VR 4 // also need "replace 02 3: VR" in voice file +endphoneme + + +phoneme i: + vowel starttype (i) endtype (i) + length 130 + formants vowel/i_5 + before v vowel/i_5+50 + before z vowel/i_5+50 + before D vowel/i_5+50 + before _ vowel/i_5+50 + after w w/wi2 + linkout ; +endphoneme + + +phoneme O: + vowel starttype (o) endtype (o) + length 200 + formants vowel/oo + before r vwl_en_us/or + reduceto @ 0 +endphoneme + + +phoneme O@ + vowel starttype (o) endtype (@) + length 230 + formants vowelr/oo_r + appendph r +endphoneme + +phoneme o@ + vowel starttype (o) endtype (@) + length 230 + formants vowelr/o_r + appendph r +endphoneme + + +phoneme O + vowel starttype (o) endtype (o) + length 150 + formants vowel/0_3 + reduceto @ 0 +endphoneme + + +phoneme u: + vowel starttype (u) endtype (u) + length 160 + formants vowel/u# + before v vowel/u#+40 + before z vowel/u#+40 + before D vowel/u#+40 + before _ vowel/u#_4+40 +endphoneme + + +phoneme aU + vowel starttype (a) endtype (u) + length 200 + formants vdiph/au# +endphoneme + + +phoneme oU + vowel starttype (o) endtype (u) + length 190 + formants vowel/o_3 + before l/2 vowel/o_3-60+l/L2_oL +endphoneme + + +phoneme aI + vowel starttype (a) endtype (i) + length 190 + beforevowel aI2 +// formants vdiph/&i_2 + formants vdiph/ai_7 + before v vdiph/ai_7+50 + before z vdiph/ai_7+50 + before l/2 vwl_en/aI@_2+vwl_en/@L_2 +endphoneme + +phoneme aI2 + vowel starttype (a) endtype (i) + length 240 + formants vdiph/ai_7 +endphoneme + + +phoneme eI + vowel starttype (e) endtype (i) + length 190 + formants vowel/e_2 +endphoneme + + +phoneme OI + vowel starttype (o) endtype (i) + length 210 + formants vdiph/0i_2 +endphoneme + + +phoneme e@ + vowel starttype (e) endtype (@) + length 220 + formants vdiph2/e@ + appendph r +endphoneme + + +phoneme i@ + vowel starttype (i) endtype (@) + length 220 + formants vwl_en_us/ir +// formants vdiph2/i@_2 + appendph r +endphoneme + + +phoneme U@ + vowel starttype (u) endtype (@) + length 240 + formants vdiph2/u#@ + linkout r- +endphoneme + + +phoneme aI@ + vowel starttype (a) endtype (@) + length 270 + formants vwl_en/aI@ + linkout r- +endphoneme + + +phoneme aU@ + vowel starttype (a) endtype (@) + length 270 + formants vwl_en/aU@ + linkout r- +endphoneme + + +phoneme @L + vowel starttype (o) endtype l + length 160 + formants vwl_en/@L_2 + unstressed + before _ vwl_en/@L_2 +endphoneme + + +phoneme aI@ + vowel starttype (a) endtype (@) + length 270 + formants vwl_en/aI@_2 + linkout r- +endphoneme + + + + +//============== +// Consonants +//============== + +phoneme r/ // used for [r] when not preceding a vowel + liquid + length 100 + lengthmod 2 // + formants NULL +endphoneme + +phoneme r + liquid + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants r/r + after _ r/_r t r/tr p r/tr k r/tr + before _ r/r_ +endphoneme + + + + + + diff --git a/phsource/ph_english_us b/phsource/ph_english_us new file mode 100644 index 00000000..9e48f4db --- /dev/null +++ b/phsource/ph_english_us @@ -0,0 +1,299 @@ + + +//******************************************************************* +// VOWELS +//******************************************************************* + + +phoneme @ // Schwa + vowel starttype (@) endtype (@) + formants vowel/@ + unstressed + linkout r- + length 140 +endphoneme + + +phoneme 3 // Schwa, used for rhotic schwa in American + vowel starttype (@) endtype (@) + formants vwl_en_us/@r_us + unstressed + linkout r- + beforevowel @ + length 175 +endphoneme + + +phoneme @2 // Schwa, changes to I before a vowel + vowel starttype (@) endtype (@) + formants vowel/@ + unstressed + beforevowel I2 + length 120 +endphoneme + +phoneme @5 // Schwa, changes to U before a vowel + vowel starttype (@) endtype (@) + formants vowel/@ + unstressed + beforevowelpause U + length 140 +endphoneme + + +phoneme @L + vowel starttype (@) endtype l + length 160 + formants vwl_en/@L + unstressed + before _ vwl_en/@L +endphoneme + + +phoneme a + vowel starttype (a) endtype (@) + length 180 + formants vwl_en_us/a + reduceto a2 0 +endphoneme + + +phoneme a2 + vowel starttype (@) endtype (@) + unstressed + length 140 + formants vowel/a#_3 + linkout r- +endphoneme + + +phoneme aa // 'bath' etc. + vowel starttype (a) endtype (@) + length 190 + formants vwl_en_us/a +// formants vowel/a_2 + linkout r- +endphoneme + + +phoneme E + vowel starttype (e) endtype (e) + length 160 + formants vwl_en_us/ee +// formants vowel/ee_2 + reduceto I 0 +endphoneme + + +phoneme I + vowel starttype (i) endtype (i) + length 130 + formants vwl_en_us/ii + linkout ; +endphoneme + +phoneme I2 + vowel starttype (i) endtype (i) + unstressed + length 130 + formants vwl_en_us/ii + linkout ; +endphoneme + + +phoneme i // optional variant of [I] for end of words + vowel starttype (i) endtype (i) + length 170 + formants vwl_en_us/i_final3 + linkout ; +endphoneme + + +phoneme 0 + vowel starttype (o) endtype (o) + length 190 + formants vowel/aa + reduceto @ 0 +endphoneme + + +phoneme V + vowel starttype (a) endtype (@) + length 150 + formants vwl_en_us/V +// formants vowel/V_2 + reduceto @ 0 +endphoneme + + +phoneme U + vowel starttype (u) endtype (u) + length 150 + formants vowel/8_2 +endphoneme + + +phoneme A: + vowel starttype (a) endtype (a) + length 210 + formants vowel/aa + before r vwl_en_us/ar2 + linkout r- +endphoneme + + +phoneme A@ // Used for [A:] when followed by 'r', becomes [A:]+[r] in American + vowel starttype (a) endtype (@) + length 250 + formants vwl_en_us/ar2 + appendph r +endphoneme + + +phoneme 3: + vowel starttype (@) endtype (@) + length 230 + formants vwl_en_us/3_us + reduceto @ 0 + linkout r- +endphoneme + + +phoneme i: + vowel starttype (i) endtype (i) + length 165 + formants vowel/i_en + after w w/wi2 + linkout ; +endphoneme + + +phoneme O: + vowel starttype (o) endtype (o) + length 210 + formants vowel/0_3 + before r vwl_en_us/or + reduceto @ 0 +endphoneme + + +phoneme O@ + vowel starttype (o) endtype (@) + length 240 + formants vwl_en_us/or + appendph r +endphoneme + + +phoneme o@ + vowel starttype (o) endtype (@) + length 240 + formants vwl_en_us/or + appendph r +endphoneme + + +phoneme O + vowel starttype (o) endtype (o) + length 150 + formants vowel/0_3 + reduceto @ 0 +endphoneme + + +phoneme u: + vowel starttype (u) endtype (u) + length 190 + formants vowel/u_4 + before l/2 vwl_en/u_L-40+l/L2_uL +endphoneme + + +phoneme aU + vowel starttype (a) endtype (u) + length 210 + formants vdiph/au_2 +endphoneme + + +phoneme oU + vowel starttype (@) endtype (u) + length 210 + formants vdiph/Vu_2 +endphoneme + + +phoneme aI + vowel starttype (a) endtype (i) + length 210 + formants vdiph/ai_2 +endphoneme + + +phoneme eI + vowel starttype (e) endtype (i) + length 210 + formants vdiph/eei_3 +endphoneme + + +phoneme OI + vowel starttype (o) endtype (i) + length 230 + formants vdiph/ooi +endphoneme + + +phoneme e@ + vowel starttype (e) endtype (@) + length 250 + formants vwl_en_us/er + appendph r +endphoneme + + +phoneme i@ + vowel starttype (i) endtype (@) + length 240 + formants vwl_en_us/ir + appendph r +endphoneme + + +phoneme U@ + vowel starttype (@) endtype (@) + length 240 + formants vwl_en_us/ur + linkout r- +endphoneme + + +phoneme aI@ + vowel starttype (a) endtype (@) + length 270 + formants vwl_en/aI@ + linkout r- +endphoneme + + +phoneme aU@ + vowel starttype (a) endtype (@) + length 270 + formants vwl_en/aU@ + linkout r- +endphoneme + + +//============== +// Consonants +//============== + +phoneme r/ // used for [r] when not preceding a vowel + liquid + length 100 + lengthmod 2 // + formants NULL +endphoneme + + + diff --git a/phsource/ph_english_wm b/phsource/ph_english_wm new file mode 100644 index 00000000..a774b4d1 --- /dev/null +++ b/phsource/ph_english_wm @@ -0,0 +1,242 @@ + + +//******************************************************************* +// VOWELS +//******************************************************************* + + + +phoneme @L + vowel starttype (@) endtype l + length 160 + formants vwl_en/@L + unstressed + before _ vwl_en/@L +endphoneme + + +phoneme a + vowel starttype (a) endtype (a) + length 170 + formants vowel/a_4 + reduceto a2 0 +endphoneme + + +phoneme E + vowel starttype (e) endtype (e) + length 150 + formants vowel/e_mid + reduceto I 0 +// before l/ DFT-30+L/eL_af +endphoneme + + +phoneme I + vowel starttype (i) endtype (i) + length 140 + formants vwl_en_wm/ii + before l vowel/ii + linkout ; +endphoneme + +phoneme i // optional variant of [I] for end of words + vowel starttype (i) endtype (i) + length 220 + formants vowel/i + linkout ; +endphoneme + + +phoneme 0 + vowel starttype (o) endtype (o) + length 140 + formants vowel/0_2 + reduceto @ 0 +endphoneme + + +phoneme V + vowel starttype (o) endtype (o) + length 140 + formants vowel/o-_2 + reduceto @ 0 +endphoneme + + +phoneme U + vowel starttype (u) endtype (u) + length 150 + formants vowel/uu +endphoneme + + +phoneme I2 + vowel starttype (i) endtype (i) + unstressed + length 140 + formants vwl_en_wm/ii + before l vowel/ii + linkout ; +endphoneme + + +phoneme a2 + vowel starttype (@) endtype (@) + unstressed + length 140 + formants vowel/a#_3 +// linkout r- +endphoneme + + +phoneme A: + vowel starttype (a) endtype (a) + length 240 + formants vwl_en_wm/aa + linkout r- +endphoneme + + +phoneme A@ + vowel starttype (a) endtype (a) + length 240 + formants vwl_en_wm/aa + linkout r- +endphoneme + + +phoneme aa // 'bath' etc. + vowel starttype (a) endtype (a) + length 150 + formants vowel/a_4 + linkout r- +endphoneme + + +phoneme 3: + vowel starttype (@) endtype (@) + length 250 + formants vowel/y# + reduceto @ 0 + linkout r- +endphoneme + + +phoneme i: + vowel starttype (i) endtype (i) + length 220 + formants vwl_en_wm/i + after w w/wi2 + linkout ; +endphoneme + + +phoneme O: + vowel starttype (o) endtype (o) + length 240 + formants vowel/oo_1 + reduceto @ 0 + linkout r- +endphoneme + + +phoneme O@ + vowel starttype (o) endtype (@) + length 240 + formants vowel/o + linkout r- +endphoneme + + +phoneme O + vowel starttype (o) endtype (o) + length 150 + formants vowel/o + reduceto @ 0 +endphoneme + + +phoneme u: + vowel starttype (u) endtype (u) + length 200 + formants vdiph/@u +// before l/ vwl_en/u:L2-40+L/uL +endphoneme + + +phoneme aU + vowel starttype (a) endtype (u) + length 230 + formants vdiph/eeu_3 +endphoneme + + +phoneme oU + vowel starttype (@) endtype (u) + length 220 + formants vdiph/Vu_2 +endphoneme + + +phoneme aI + vowel starttype (o) endtype (i) + length 240 + formants vdiph/ooi_3 +endphoneme + + +phoneme eI + vowel starttype (@) endtype (i) + length 210 + formants vdiph/@i_3 +endphoneme + + +phoneme OI + vowel starttype (o) endtype (i) + length 230 + formants vdiph/oi +endphoneme + + +phoneme e@ + vowel starttype (e) endtype (@) + length 240 + formants vowel/3_en + linkout r- +endphoneme + + +phoneme i@ + vowel starttype (i) endtype (@) + length 240 + formants vdiph2/ii@_2 + linkout r- +endphoneme + + +phoneme U@ + vowel starttype (u) endtype (@) + length 200 + formants vdiph2/uu@ + linkout r- +endphoneme + + +phoneme aI@ + vowel starttype (a) endtype (@) + length 270 + formants vwl_en/aI@ + linkout r- +endphoneme + + +phoneme aU@ + vowel starttype (a) endtype (@) + length 270 + formants vwl_en/aU@ + linkout r- +endphoneme + + diff --git a/phsource/ph_esperanto b/phsource/ph_esperanto new file mode 100644 index 00000000..b876911d --- /dev/null +++ b/phsource/ph_esperanto @@ -0,0 +1,120 @@ + +//==================================================== +// Esperanto +//==================================================== + + +phoneme a + vowel starttype (a) endtype (a) + length 180 + formants vowel/a_2 +endphoneme + + +phoneme e + vowel starttype (e) endtype (e) + length 170 + formants vowel/e +endphoneme + + +phoneme i + vowel starttype (i) endtype (i) + length 160 + formants vowel/i + linkout ; +endphoneme + + +phoneme o + vowel starttype (o) endtype (o) + length 170 + formants vowel/oo +endphoneme + + +phoneme u + vowel starttype (u) endtype (u) + length 170 + formants vowel/u +endphoneme + + +phoneme aU + vowel starttype (a) endtype (u) + length 240 + formants vdiph/au_4 +endphoneme + + +phoneme eU + vowel starttype (e) endtype (u) + length 240 + formants vdiph/eu +endphoneme + + +phoneme aI + vowel starttype (a) endtype (i) + length 260 + formants vdiph/ai +endphoneme + + +phoneme eI + vowel starttype (e) endtype (i) + length 250 + formants vdiph/eei_2 +endphoneme + + +phoneme OI + vowel starttype (o) endtype (i) + length 260 + formants vdiph/ooi +endphoneme + + +phoneme uI + vowel starttype (u) endtype (i) + length 250 + formants vdiph/ui +endphoneme + + +// CONSONANTS +//=========== + +phoneme r + liquid + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants r/rr + after _ r/rr + after t r/trr p r/trr k r/trr + before _ r/r_ +endphoneme + + +phoneme r/ // used for [r] when not preceding a vowel + liquid + length 100 + lengthmod 2 // + formants r3/r_+r3/rx + before n r3/r_n+r3/rx + after _ r/rr + after t r/trr p r/trr k r/trr +endphoneme + + +phoneme ts + vls alv afr sibilant + vowelin f1=0 f2=1700 -300 300 f3=-100 80 + vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/ts +endphoneme + + diff --git a/phsource/ph_finnish b/phsource/ph_finnish new file mode 100644 index 00000000..d802363d --- /dev/null +++ b/phsource/ph_finnish @@ -0,0 +1,348 @@ + +//==================================================== +// Finnish +//==================================================== + +phoneme : // Lengthen previous vowel by "length" + virtual + length 150 +endphoneme + + + +phoneme i + vowel starttype (i) endtype (i) + length 140 + formants vowel/i_4 + linkout ; + reduceto I 1 +endphoneme + +phoneme I + vowel starttype (i) endtype (i) + length 140 + formants vowel/ii_3 + linkout ; +endphoneme + + + +phoneme e + vowel starttype (e) endtype (e) + length 150 + formants vowel/e_mid2 +endphoneme + + +phoneme & + vowel starttype (a) endtype (a) + length 150 + formants vowel/& +endphoneme + + +phoneme a + vowel starttype (a) endtype (a) + length 170 + formants vowel/aa + reduceto a2 1 +endphoneme + +phoneme a2 + vowel starttype (a) endtype (a) + length 170 + formants vowel/aa# +endphoneme + + +phoneme o + vowel starttype (o) endtype (o) + length 155 + formants vowel/oo_1 +endphoneme + +phoneme Y + vowel starttype (@) endtype (@) + length 155 + formants vowel/y# +endphoneme + + +phoneme u + vowel starttype (u) endtype (u) + length 140 + formants vowel/u_bck +endphoneme + +phoneme u1 // TEST + vowel starttype (u) endtype (u) + length 140 + formants vowel/u_2 +endphoneme + +phoneme U // TEST + vowel starttype (u) endtype (u) + length 140 + formants vowel/uu_4 +endphoneme + + + +phoneme y + vowel starttype (u) endtype (u) + length 155 + formants vowel/y +endphoneme + + + + +// Diphthongs +//=========== + +phoneme ai + vowel starttype (a) endtype (i) + length 310 + long + formants vdiph/aai_3 +endphoneme + +phoneme &i + vowel starttype (a) endtype (i) + length 290 + long + formants vdiph/&i +endphoneme + +phoneme oi + vowel starttype (o) endtype (i) + length 280 + long + formants vdiph/ooi +endphoneme + +phoneme ei + vowel starttype (e) endtype (i) + length 280 + long + formants vdiph/eei_2 +endphoneme + +phoneme Yi + vowel starttype (@) endtype (i) + length 270 + long + formants vdiph/y#i +endphoneme + +phoneme ui + vowel starttype (u) endtype (i) + length 270 + long + formants vdiph/ui +endphoneme + +phoneme yi + vowel starttype (u) endtype (i) + length 270 + long + formants vdiph/yi +endphoneme + + +phoneme au + vowel starttype (a) endtype (u) + length 300 + long + formants vdiph/aau +endphoneme + +phoneme ou + vowel starttype (o) endtype (u) + length 280 + long + formants vdiph/ou +endphoneme + +phoneme eu + vowel starttype (e) endtype (u) + length 280 + long + formants vdiph/eu_2 +endphoneme + +phoneme iu + vowel starttype (i) endtype (u) + length 280 + long + formants vdiph2/iu_2 +endphoneme + + +phoneme &y + vowel starttype (a) endtype (u) + length 280 + long + formants vdiph/&y +endphoneme + +phoneme ey + vowel starttype (e) endtype (u) + length 280 + long + formants vdiph/eey +endphoneme + +phoneme Yy + vowel starttype (@) endtype (u) + length 270 + long + formants vdiph/y#y +endphoneme + +phoneme iy + vowel starttype (i) endtype (u) + length 260 + long + formants vdiph2/iy +endphoneme + + +phoneme uo + vowel starttype (u) endtype (o) + length 280 + long + formants vdiph2/uo +endphoneme + +phoneme ie + vowel starttype (i) endtype (e) + length 280 + long + formants vdiph2/ie +endphoneme + +phoneme yY + vowel starttype (u) endtype (@) + length 280 + long + formants vdiph2/y-y# +endphoneme + + + + +// CONSONANTS +//=========== + + + +phoneme r + liquid starttype r endtype r + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants r/rr + after _ r/rr + after t r/trr p r/trr k r/trr + before _ r/r_ +endphoneme + + + +phoneme v // approximant, not fricative + vcd lbd frc + vowelin f1=0 f2=1000 -300 -200 f3=-300 100 + vowelout f1=0 f2=1000 -500 -300 f3=-300 60 len=50 + lengthmod 6 + formants voc/v + before _ voc/v_ + switchvoicing f +endphoneme + + +phoneme t // dental variant of /t/ + vls dnt stop + vowelin f1=0 f2=1600 -300 300 f3=-100 80 + vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/t_dnt%50 + before _ ustop/t_dnt%35 + switchvoicing d +endphoneme + + + +phoneme d // (weak) dental variant of /d/ + vcd dnt stop + vowelin f1=2 f2=1700 -100 200 f3=0 80 + vowelout f1=2 f2=1700 -100 200 f3=0 80 rms=20 +// vowelin f1=2 f2=2095 100 200 f3=100 80 +// vowelout f1=2 f2=3000 100 200 f3=100 80 rms=20 len=1 + formants d/d+x/d_dnt%60 + before _ d/d_+x/d_ + before r d/dr+x/d_dnt%60 + after _ NULL + after @ d/xd + lengthmod 5 + switchvoicing t +endphoneme + + + +phoneme p + vls blb stop + vowelin f1=0 f2=1000 -50 -100 f3=-200 80 + vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=30 + lengthmod 2 + wave ustop/p_unasp + before _ ustop/p_unasp_%80 + before r ustop/pr + before l ustop/pl + switchvoicing b +endphoneme + + + +phoneme k + vls vel stop + vowelin f1=0 f2=2300 200 400 f3=-100 80 + vowelout f1=0 f2=2300 300 400 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/k_unasp%60 // weaker + before _ ustop/k_ + before r ustop/kr + before l ustop/kl + before (i) ustop/ki + switchvoicing g +endphoneme + + +phoneme s2 + vls alv frc sibilant + vowelin f1=0 f2=1700 -300 300 f3=-100 80 + vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + lengthmod 3 + wave ufric/s_continue + before _ ufric/s_ + before p ufric/s! + before t ufric/s! + before k ufric/s! + switchvoicing z +endphoneme + + +phoneme h + vls glt apr + length 100 + lengthmod 3 + wave ufric/h_%70 // no vowel following + before (@) ufric/h@ + before (a) ufric/ha + before (e) ufric/he + before (i) ufric/hi + before (o) ufric/hu_fi%70 + before (u) ufric/hu_fi%80 +endphoneme + diff --git a/phsource/ph_french b/phsource/ph_french new file mode 100644 index 00000000..01b0c75a --- /dev/null +++ b/phsource/ph_french @@ -0,0 +1,279 @@ + +//==================================================== +// French +//==================================================== + +phoneme : // Lengthen previous vowel by "length" + virtual + length 40 // shorter than for fr-ca +endphoneme + + + +phoneme @ + vowel starttype (@) endtype (@) + length 120 + formants vowel/@_2 +endphoneme + + +phoneme a + vowel starttype (a) endtype (a) + length 166 + formants vowel/a_en +endphoneme + + +phoneme e + vowel starttype (e) endtype (e) + length 172 + formants vowel/e +endphoneme + + +phoneme E + vowel starttype (e) endtype (e) + length 164 + formants vowel/ee +endphoneme + + +phoneme i + vowel starttype (i) endtype (i) + length 158 + formants vowel/i + linkout ; +endphoneme + + + +phoneme o + vowel starttype (o) endtype (o) + length 166 + formants vowel/o +endphoneme + + +phoneme O + vowel starttype (o) endtype (o) + length 190 + formants vowel/0 +endphoneme + + + +phoneme u + vowel starttype (u) endtype (u) + length 174 + formants vowel/u +endphoneme + + +phoneme y + vowel starttype (e) endtype (u) + length 148 + formants vowel/y_2 +endphoneme + + +phoneme Y + vowel starttype (@) endtype (@) + length 214 + formants vowel/y# +endphoneme + + +phoneme W + vowel starttype (@) endtype (@) + length 198 + formants vowel/oe +endphoneme + + +phoneme w^i + vowel starttype (i) endtype (i) + length 220 + formants vdiph/yi_fr +endphoneme + + + + +phoneme A~ + vowel starttype (a) endtype (a) + length 222 + formants vnasal/aa_n +endphoneme + + +phoneme E~ // same as W~ for fr-fr + vowel starttype (e) endtype (e) + length 192 + formants vnasal/W_n +endphoneme + + +phoneme O~ + vowel starttype (o) endtype (o) + length 222 + formants vnasal/oo_n +endphoneme + + +phoneme W~ + vowel starttype (@) endtype (@) + length 204 + formants vnasal/W_n +endphoneme + + + +// These vowels map to others in fr-fr, but are distinct in fr-ca + +phoneme I // same as [i] + vowel starttype (i) endtype (i) + length 158 + formants vowel/i + linkout ; +endphoneme + +phoneme U // same as [u] + vowel starttype (u) endtype (u) + length 174 + formants vowel/u +endphoneme + +phoneme y" // same as [y] + vowel starttype (u) endtype (u) + length 148 + formants vowel/y_2 +endphoneme + +phoneme E: // slightly longer than [E] + vowel starttype (e) endtype (e) + length 212 + formants vowel/e +endphoneme + +phoneme A // same as [a] + vowel starttype (a) endtype (a) + length 166 + formants vowel/a_en +endphoneme + + + + +// CONSONANTS +//=========== +// uses the consonants in file "phonemes", unless overridden here + +phoneme r + liquid + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants r/r + after _ r/_r t r/tr p r/tr k r/tr + before _ r/r_ +endphoneme + + + +phoneme R + liquid +// vcd uvl frc + vowelin f1=0 f2=1500 -400 400 f3=-400 80 + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants vwl_fr/@R+r3/rx%80 +endphoneme + + +phoneme R2 + liquid +// vcd uvl frc + vowelin f1=0 f2=1500 -400 400 f3=-400 80 + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants vwl_fr/@R2+r3/rx%120 +endphoneme + + +phoneme r/ // used for [r] when not preceding a vowel + liquid + length 100 + lengthmod 2 // + formants r3/r_+r3/rx + before n r3/r_n+r3/rx +endphoneme + + + +phoneme t // dental variant of /t/ + vls dnt stop + vowelin f1=0 f2=1600 -300 300 f3=-100 80 + vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/t_dnt%50 + before _ ustop/t_dnt%40 + switchvoicing d +endphoneme + + +phoneme t2 // silent unless followed by vowel + beforenotvowel NULL + vls dnt stop + vowelin f1=0 f2=1600 -300 300 f3=-100 80 + vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/t_dnt%50 + before _ ustop/t_dnt%40 +endphoneme + + +phoneme z2 // silent unless followed by vowel + beforenotvowel NULL + vcd alv frc sibilant + vowelout f1=0 f2=1700 -300 300 f3=-100 60 len=50 + formants voc/z+ufric/s_ + before _ voc/z_+ufric/s_ + lengthmod 6 +endphoneme + + +phoneme d // dental variant of /d/ + vcd dnt stop + vowelin f1=2 f2=1500 -300 300 f3=-150 80 + vowelout f1=2 f2=1500 -300 300 f3=-150 80 + formants d/d+x/d_dnt%110 + before _ d/d_+x/d_ + before r d/dr+x/d_dnt%110 + after _ NULL + after @ d/xd + lengthmod 5 + switchvoicing t +endphoneme + + + +phoneme k + vls vel stop + vowelin f1=0 f2=2300 200 400 f3=-100 80 + vowelout f1=0 f2=2300 300 400 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/k%60 // reduce strength of noise burst + before _ ustop/k_ + before r ustop/kr + before l ustop/kl + before (i) ustop/ki + switchvoicing g +endphoneme + + + diff --git a/phsource/ph_french_ca b/phsource/ph_french_ca new file mode 100644 index 00000000..cea2fc6a --- /dev/null +++ b/phsource/ph_french_ca @@ -0,0 +1,88 @@ + +//==================================================== +// French - Canadian +//==================================================== + +// Based on French. +// This file redefines phonemes which differ from those in ph_french + + +phoneme : // Lengthen previous vowel by "length" + virtual + length 70 +endphoneme + + + + +phoneme E + vowel starttype (e) endtype (e) + length 164 + formants vowel/e_mid +endphoneme + + +phoneme u + vowel starttype (u) endtype (u) + length 174 + formants vowel/u_bck +endphoneme + + +phoneme E~ + vowel starttype (e) endtype (e) + length 192 + formants vnasal/ee_n +endphoneme + + +phoneme I + vowel starttype (i) endtype (i) + length 158 + formants vowel/ii + linkout ; +endphoneme + +phoneme U + vowel starttype (u) endtype (u) + length 150 + formants vowel/uu_bck +endphoneme + + +phoneme y" + vowel starttype (u) endtype (u) + length 140 + formants vowel/yy // was sv_y2 +endphoneme + +phoneme E: // [ae] diphthong + vowel starttype (@) endtype (e) + length 230 + formants vdiph/ae +endphoneme + +phoneme A + vowel starttype (a) endtype (a) + length 166 + formants vowel/aa +endphoneme + + + + + +// CONSONANTS +//=========== +// uses the consonants in file "phonemes", unless overridden here + +phoneme R + liquid + vowelin f1=0 f2=1500 -400 400 f3=-400 80 + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants vwl_fr/@R2+r3/rx%120 +endphoneme + diff --git a/phsource/ph_german b/phsource/ph_german new file mode 100755 index 00000000..da30e7ef --- /dev/null +++ b/phsource/ph_german @@ -0,0 +1,238 @@ + + +//========================================================= +// German +//========================================================= + + + +phoneme @ // Schwa + vowel starttype (@) endtype (@) + formants vowel/@_3 + unstressed + before r/ vowel/a#_3 // replace [@r] by [3] + length 125 +endphoneme + + +phoneme 3 // open Schwa + vowel starttype (@) endtype (@) +// formants vwl_de/3 + formants vowel/a#_3 + unstressed + // length 160 + length 125 +endphoneme + + +phoneme a + vowel starttype (a) endtype (a) + // length 140 + length 110 + formants vowel/a + before * DFT+40 +endphoneme + + +phoneme E + vowel starttype (e) endtype (e) + length 120 + formants vowel/e_mid2 + before * DFT+40 +endphoneme + + +phoneme E2 // as[E] but reduces to @ if unstressed + vowel starttype (e) endtype (e) + length 120 + formants vowel/e_mid2 + before * DFT+40 + reduceto @ 0 +endphoneme + + +phoneme I + vowel starttype (i) endtype (i) + length 120 + formants vowel/ii + before * DFT+40 + linkout ; +endphoneme + + +phoneme I: + vowel starttype (i) endtype (i) + length 190 + formants vowel/ii +endphoneme + + +phoneme O + vowel starttype (o) endtype (o) + length 140 + formants vowel/oo + before * DFT+40 +endphoneme + + +phoneme U + vowel starttype (u) endtype (u) + length 140 + formants vowel/uu_2 + before * DFT+40 +endphoneme + + +phoneme A: + vowel starttype (a) endtype (a) + length 240 + formants vowel/aa_6 +endphoneme + + +phoneme i: + vowel starttype (i) endtype (i) + length 180 + formants vowel/i_2 + after w w/wi2 + before * DFT+40 +endphoneme + + +phoneme u: + vowel starttype (u) endtype (u) + length 190 +// formants vwl_de/u: + formants vowel/u + before * DFT+40 +endphoneme + + +phoneme aU + vowel starttype (a) endtype (u) + length 220 + formants vdiph/aau_2 +endphoneme + + +phoneme aI + vowel starttype (a) endtype (i) + length 210 + formants vdiph/ai_5 +endphoneme + + +phoneme OI + vowel starttype (o) endtype (i) + length 220 + formants vdiph/oi +endphoneme + + +phoneme E: + vowel starttype (e) endtype (e) + length 190 + formants vowel/e_mid2 +endphoneme + + +phoneme e: + vowel starttype (e) endtype (e) + length 200 + formants vowel/e_2 + before * DFT+40 +endphoneme + + +phoneme o: + vowel starttype (o) endtype (o) + length 200 + formants vowel/o + before * DFT+40 +endphoneme + + +phoneme y: + vowel starttype (u) endtype (u) + length 200 + formants vowel/y + before * DFT+40 +endphoneme + + +phoneme y + vowel starttype (u) endtype (u) + length 150 + formants vowel/yy_4 + before * DFT+40 +endphoneme + + +phoneme Y: + vowel starttype (@) endtype (@) + length 220 + formants vowel/y# + before * DFT+40 +endphoneme + + +phoneme W + vowel starttype (@) endtype (@) + length 160 + formants vowel/oe + before * DFT+40 +endphoneme + + + +// CONSONANTS +//=========== + +phoneme ts + vls alv afr sibilant + vowelin f1=0 f2=1700 -300 300 f3=-100 80 + vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/ts +endphoneme + + +phoneme pF + vls blb afr + vowelout f1=0 f2=1000 -500 -350 f3=-200 80 + lengthmod 2 + wave ufric/f // could replace this with a [pf] wav file +endphoneme + +phoneme l/ // used for [l] when not before a vowel + liquid + length 100 + lengthmod 7 + formants l/l_3 + before (r) l/_l + beforevowel l +endphoneme + + +// This is actually the ENGLISH "rolling r". For german, we now use * in the dictionary, +// so this phoneme will only be used in english words in german texts. +phoneme r + liquid + lengthmod 7 + beforenotvowel r/ + trill + formants r/r + after _ r/rr + after t r/trr p r/trr k r/trr + before _ r/r_ +endphoneme + + +phoneme r/ // variant of [r] when not preceding a vowel, in english words only + liquid vowel2 + length 100 + lengthmod 7 // + formants NULL +endphoneme + + diff --git a/phsource/ph_greek b/phsource/ph_greek new file mode 100644 index 00000000..9a0d59ad --- /dev/null +++ b/phsource/ph_greek @@ -0,0 +1,67 @@ + +//==================================================== +// Greek - based on Italian +//==================================================== + + +phoneme a/ + vowel starttype (@) endtype (@) + length 180 + formants vowel/a_4 +endphoneme + +phoneme e + vowel starttype (e) endtype (e) + length 180 + formants vowel/e_mid2 +endphoneme + +phoneme o + vowel starttype (o) endtype (o) + length 180 + formants vowel/oo +endphoneme + + + +// CONSONANTS + +phoneme t // revert to alveolar /t/ + vls alv stop + vowelin f1=0 f2=1700 -300 300 f3=-100 80 + vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/t_short%80 + before _ ustop/t_ + before r ustop/tr + switchvoicing d +endphoneme + +phoneme d // revert to alveolar /d/ + vcd alv stop + vowelin f1=2 f2=1700 -300 300 f3=-100 80 + vowelout f1=2 f2=1700 -300 300 f3=-100 80 + formants d/d+x/d + before _ d/d_+x/d_ + before r d/dr+x/d + after _ NULL + after @ d/xd + lengthmod 5 + switchvoicing t +endphoneme + + +phoneme k + vls vel stop + vowelin f1=0 f2=2300 200 400 f3=-100 80 + vowelout f1=0 f2=2300 300 400 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/k_unasp%70 + before _ ustop/k_ + before r ustop/kr + before l ustop/kl +// before (i) ustop/ki + + switchvoicing g +endphoneme + diff --git a/phsource/ph_hindi b/phsource/ph_hindi new file mode 100644 index 00000000..54092416 --- /dev/null +++ b/phsource/ph_hindi @@ -0,0 +1,549 @@ + +//==================================================== +// Hindi +//==================================================== + +phoneme : // Lengthen the previous vowel by "length" + virtual + length 80 +endphoneme + +phoneme @ + vowel starttype (@) endtype (@) + length 130 + formants vowel/@_bck + before H vowel/@_low + reduceto NULL 0 +endphoneme + +phoneme V + vowel starttype (@) endtype (@) + length 130 + formants vowel/V_3 + before H vowel/@_low + reduceto @ 4 +endphoneme + +phoneme @2 + vowel starttype (@) endtype (@) + length 130 + formants vowel/@_low +endphoneme + +phoneme @3 + vowel starttype (@) endtype (@) + length 130 + formants vowel/@_3 + reduceto @- 0 +endphoneme + +phoneme @4 + vowel starttype (@) endtype (@) + length 130 + formants vowel/@ +endphoneme + + + + +phoneme i: + vowel long starttype (i) endtype (i) + length 220 + formants vowel/i_fnt + linkout ; +endphoneme + +phoneme i // as [i:] but not marked as 'long' + vowel starttype (i) endtype (i) + length 220 + formants vowel/i_fnt + linkout ; +endphoneme + +phoneme I + vowel starttype (i) endtype (i) + length 100 + formants vowel/ii_3 + linkout ; +endphoneme + +phoneme e: + vowel long starttype (e) endtype (e) + length 210 + formants vowel/e_2 +endphoneme + +phoneme e + vowel starttype (e) endtype (e) + length 130 + formants vowel/e_2 +endphoneme + +phoneme E: + vowel long starttype (e) endtype (e) + length 210 + formants vdiph/ee-e +endphoneme + +phoneme E + vowel starttype (e) endtype (e) + length 130 + formants vowel/e_mid +endphoneme + +phoneme E~ + vowel starttype (e) endtype (e) + length 230 + formants vnasal/ee_n2 +endphoneme + + +phoneme &: + vowel long starttype (a) endtype (a) + length 210 + formants vowel/& +endphoneme + + +phoneme a: + vowel long starttype (a) endtype (a) + length 230 + formants vwl_hi/A +endphoneme + +phoneme a + vowel long starttype (a) endtype (a) + length 130 + formants vowel/a#_3 +endphoneme + + +phoneme o: + vowel long starttype (o) endtype (o) + length 210 + formants vowel/o_2 +endphoneme + +phoneme o + vowel starttype (o) endtype (o) + length 130 + formants vowel/o +endphoneme + +phoneme O: + vowel long starttype (o) endtype (o) + length 200 + formants vowel/oo_4 +endphoneme + +phoneme o~ + vowel long starttype (o) endtype (o) + length 220 + formants vnasal/o_n +endphoneme + +phoneme O~ + vowel long starttype (o) endtype (o) + length 230 + formants vnasal/oo_n2 +endphoneme + + +phoneme O + vowel starttype (o) endtype (o) + length 130 + formants vowel/0 +endphoneme + + +phoneme U + vowel starttype (u) endtype (u) + length 120 + formants vowel/uu_bck +endphoneme + + +phoneme u: + vowel long starttype (u) endtype (u) + length 220 + formants vowel/u_bck +endphoneme + +phoneme u2: + vowel long starttype (u) endtype (u) + length 220 + formants vowel/u +endphoneme + + + +phoneme r- + vowel starttype (@) endtype (@) + unstressed + length 220 + formants vowelr/r-voc +endphoneme + +phoneme l- + vowel starttype (@) endtype (@) + unstressed + length 200 + formants vwl_hi/l-voc +endphoneme + + + +// Diphthongs +//=========== + + +phoneme aI + vowel long starttype (@) endtype (i) + length 240 + long + formants vdiph/&i +endphoneme + +phoneme aU + vowel long starttype (a) endtype (u) + length 240 + long + formants vdiph/aau_3 +endphoneme + + + +// CONSONANTS +//=========== + + +phoneme v // no fricative noise + vcd lbd frc + vowelin f1=1 f2=900 -300 -300 f3=-100 100 + vowelout f1=1 f2=900 -500 -300 f3=-100 60 len=50 + lengthmod 6 + formants voc/v + before _ voc/v_ + switchvoicing f +endphoneme + + + +phoneme h // use with voiced aspirated conants [bh] [dh] etc + vls glt apr + length 100 + lengthmod 3 + wave ufric/h_%70 // no vowel following + before (@) ufric/h@+35 + before (a) ufric/ha+35 + before (e) ufric/he+35 + before (i) ufric/hi+35 + before (o) ufric/ho+35 + before (u) ufric/hu+35 +endphoneme + +phoneme H // use for full "h" + vls glt apr + length 100 + lengthmod 3 + wave ufric/h_%70 // no vowel following + before (@) ufric/h@ + before (a) ufric/ha + before (e) ufric/he + before (i) ufric/hi + before (o) ufric/ho + before (u) ufric/hu +endphoneme + + + +// bilabial plosives +//================== + +phoneme p + vls blb stop + vowelin f1=1 f2=1000 -50 -100 f3=-200 80 + vowelout f1=1 f2=1000 -500 -350 f3=-300 80 rms=30 + lengthmod 2 + wave ustop/p_unasp + before _ ustop/p_unasp_%80 + before r ustop/pr + before l ustop/pl + switchvoicing b +endphoneme + + +phoneme ph + vls blb stop + vowelin f1=0 f2=1000 -50 -100 f3=-200 80 + vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=30 + lengthmod 2 + wave ustop/p + before _ ustop/p_ + before r ustop/pr + before l ustop/pl + switchvoicing b +endphoneme + + +phoneme b // this is [b] + vcd blb stop + vowelout f1=1 f2=1000 -500 -300 f3=-300 80 brk + formants b/b+x/b + before _ b/b_+x/b + before (a) b/ba+x/b + before (@) b/b@+x/b + before (e) b/be+x/b + before (i) b/bi+x/b + before (o) b/bo+x/b + before (u) b/bu+x/b + before @- b/b@2+x/b + after _ NULL + after @ b/xb + lengthmod 5 + switchvoicing p +endphoneme + + +//phoneme bh // use [b]+[h] +// vcd blb stop +// vowelout f1=1 f2=1000 -500 -300 f3=-300 80 brk +// formants b/b+x/b +// before _ b/b_+x/b_ +// before (a) b/ba+x/b +// before (@) b/b@+x/b +// before (e) b/be+x/b +// before (i) b/bi+x/b +// before (o) b/bo+x/b +// before (u) b/bu+x/b +// before @- b/b@2+x/b +// after _ NULL +// after @ b/xb +// lengthmod 5 +// switchvoicing p +//endphoneme + + + +// dental plosives +//================== + +phoneme t // dental variant of /t/ + vls dnt stop + vowelin f1=1 f2=1600 -300 300 f3=-100 80 + vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/t_dnt2%60 + before _ ustop/t_dnt%35 + switchvoicing d +endphoneme + +phoneme th // dental variant of /t/ Same as [t] for now + vls dnt stop + vowelin f1=0 f2=1600 -300 300 f3=-100 80 + vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/t_dnt%50+ufric/h@ + switchvoicing d +endphoneme + + + +phoneme d // (weak) dental variant of /d/ + vcd dnt stop + vowelin f1=2 f2=1700 -300 300 f3=-100 80 + vowelout f1=2 f2=1700 -300 300 f3=-100 80 rms=20 len=1 + formants d/d_dnt+x/d_dnt%50 + before _ d/d_+x/d_ + before r d/dr+x/d_dnt%60 + after _ NULL + after @ d/xd_dnt + lengthmod 5 + switchvoicing t +endphoneme + +//phoneme dh // use [d]+[h] +// vcd dnt stop +// vowelin f1=1 f2=1700 -200 200 f3=100 80 +// vowelout f1=1 f2=1700 -200 200 f3=100 80 rms=20 len=1 +// formants d/d+x/d_dnt%60 +// before _ d/d_+x/d_ +// before r d/dr+x/d_dnt%60 +// after _ NULL +// after @ d/xd +// lengthmod 5 +// switchvoicing t +//endphoneme + + + +// retroflex plosives +//=================== + +phoneme t. + vls rfx stop + vowelin f1=0 f2=1800 -300 300 f3=-400 80 + vowelout f1=0 f2=1800 -300 250 f3=-400 80 rms=20 colr=2 + lengthmod 2 + wave ustop/t_short + before _ ustop/t_ + before r ustop/tr + switchvoicing d +endphoneme + +phoneme t.h + vls rfx stop + vowelin f1=0 f2=1800 -300 300 f3=-400 80 + vowelout f1=0 f2=1800 -300 250 f3=-400 80 rms=20 colr=2 + lengthmod 2 + wave ustop/t + before _ ustop/t_ + before r ustop/tr + switchvoicing d +endphoneme + +phoneme d. + vcd rfx stop + vowelin f1=1 f2=1800 -300 300 f3=-400 80 + vowelout f1=1 f2=1800 -300 300 f3=-400 80 colr=2 + formants d/d+x/d + before _ d/d_+x/d_ + before r d/dr+x/d + after _ NULL + after @ d/xd + lengthmod 5 + switchvoicing t +endphoneme + +//phoneme d.h // use [d.]+[h] +// vcd rfx stop +// vowelin f1=1 f2=1800 -300 300 f3=-400 80 +// vowelout f1=1 f2=1800 -300 300 f3=-400 80 colr=2 +// formants d/d+x/d +// before _ d/d_+x/d_ +// before r d/dr+x/d +// after _ NULL +// after @ d/xd +// lengthmod 5 +// switchvoicing t +//endphoneme + + + +// palatal plosives +//================= + +// also try [tS] and [dZ] + +phoneme c // this is [ts;] + vls pal afr sibilant + vowelin f1=0 f2=2700 400 600 f3=300 80 rate len=70 + vowelout f1=0 f2=2700 400 600 f3=300 80 colr=1 + lengthmod 2 + wave ustop/ts_pzd2%80 + before _ ustop/ts_pzd_ + switchvoicing J +endphoneme + + +phoneme ch // this is [ts;] + vls pal afr sibilant + vowelin f1=0 f2=2700 400 600 f3=300 80 rate len=70 + vowelout f1=0 f2=2700 400 600 f3=300 80 colr=1 + lengthmod 2 + wave ustop/ts_pzd + before _ ustop/ts_pzd + switchvoicing J +endphoneme + + +phoneme J // this is [dz;] + vcd pla afr sibilant + vowelin f1=1 f2=2700 400 600 f3=300 80 rate len=70 + vowelout f1=2 f2=2700 400 600 f3=300 80 colr=1 + formants dzh/dzh+x/dz_pzd + before _ dzh/dzh_+x/dzh_ + after _ NULL @ dzh/xdzh + lengthmod 5 + switchvoicing c +endphoneme + +phoneme J2 // TEST + vcd pla afr sibilant + vowelin f1=2 f2=2700 400 600 f3=300 80 rate len=70 + vowelout f1=2 f2=2700 400 600 f3=300 80 colr=1 + formants dzh/dz_pzd+x/dzh%40 + before _ dzh/dz_pzd_+x/dz_pzd_%70 + after _ NULL + after @ dzh/xdz_pzd + lengthmod 5 + switchvoicing c +endphoneme + + + +//phoneme xJh // use [J]+[h] +// vcd pla afr sibilant +// vowelin f1=1 f2=2700 400 600 f3=300 80 rate len=70 +// formants dzh/dzh+x/dz_pzd +// before _ dzh/dzh_+x/dzh_ +// after _ NULL @ dzh/xdzh +// lengthmod 5 +// switchvoicing ts; +//endphoneme + + + +// velar plosives +//================== + + +phoneme k + vls vel stop + vowelin f1=0 f2=2300 200 300 f3=-150 80 + vowelout f1=0 f2=2300 300 400 f3=-150 80 rms=20 + lengthmod 2 + wave ustop/k_unasp%60 // weaker + before _ ustop/k_unasp%50 + before r ustop/kr + before l ustop/kl + before (i) ustop/ki + switchvoicing g +endphoneme + +phoneme kh // this is english [k] + vls vel stop + vowelin f1=0 f2=2300 200 300 f3=-150 80 + vowelout f1=0 f2=2300 300 400 f3=-150 80 rms=20 + lengthmod 2 + wave ustop/k + before _ ustop/k_ + before r ustop/kr + before l ustop/kl + switchvoicing g +endphoneme + + +phoneme g // + vcd vel stop + vowelin f1=1 f2=2300 200 300 f3=-300 80 + vowelout f1=1 f2=2300 250 300 f3=-300 80 brk + formants g/g+x/g2 + before _ g/g_+x/g2_ + after _ NULL + after @ g2/xg + lengthmod 5 +endphoneme + +//phoneme gh // this is English [g] // use [g]+[h] +// vcd vel stop +// vowelin f1=1 f2=2300 200 400 f3=-100 80 +// vowelout f1=1 f2=2300 250 300 f3=-300 80 brk +// formants g/g+x/g +// before _ g/g_+x/g_ +// after _ NULL +// after @ g/xg +// lengthmod 5 +// switchvoicing k +//endphoneme + diff --git a/phsource/ph_hungarian b/phsource/ph_hungarian new file mode 100644 index 00000000..9e6676bd --- /dev/null +++ b/phsource/ph_hungarian @@ -0,0 +1,205 @@ + +phoneme i + vowel starttype (i) endtype (i) + length 130 + formants vowel/i_4 + linkout ; +endphoneme + +phoneme i: + vowel starttype (i) endtype (i) + length 200 + formants vowel/i + linkout ; +endphoneme + +phoneme E + vowel starttype (e) endtype (e) + length 130 + formants vowel/ee_2 +endphoneme + +phoneme e + vowel starttype (e) endtype (e) + length 140 + formants vowel/e +endphoneme + +phoneme e: + vowel starttype (e) endtype (e) + length 240 + formants vowel/e_2 +endphoneme + +phoneme A + vowel starttype (a) endtype (a) + length 160 + formants vowel/0_3 +endphoneme + +phoneme a: + vowel starttype (o) endtype (o) + length 240 + formants vowel/a +endphoneme + +phoneme o + vowel starttype (o) endtype (o) + length 140 + formants vowel/o_mid +endphoneme + +phoneme o: + vowel starttype (o) endtype (o) + length 240 + formants vowel/o_2 +endphoneme + +phoneme u + vowel starttype (u) endtype (u) + length 140 + formants vowel/uu_bck +endphoneme + +phoneme u: + vowel starttype (u) endtype (u) + length 200 + formants vowel/u_bck +endphoneme + +phoneme y + vowel starttype (u) endtype (u) + length 140 + formants vowel/yy_4 + before r/ vwl_de/r_y+60 +endphoneme + +phoneme y: + vowel starttype (u) endtype (u) + length 220 + formants vowel/y + before r/ vwl_de/r_y+70 +endphoneme + +phoneme Y + vowel starttype (@) endtype (@) + length 140 + formants vowel/y#_2 +endphoneme + +phoneme Y: + vowel starttype (@) endtype (@) + length 240 + formants vowel/y# +endphoneme + + + +// CONSONANTS +//=========== + +phoneme r + liquid + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants r/r + after _ r/_r t r/tr p r/tr k r/tr + before _ r/r_ +endphoneme + + +phoneme ts + vls alv afr sibilant + vowelin f1=0 f2=1700 -300 300 f3=-100 80 + vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/ts +endphoneme + + +phoneme t // dental variant of /t/ + vls dnt stop + vowelin f1=0 f2=1600 -300 300 f3=-100 80 + vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/t_dnt%50 + before _ ustop/t_dnt%35 + switchvoicing d +endphoneme + + +phoneme d // dental variant of /d/ + vcd dnt stop + vowelin f1=2 f2=1500 -300 300 f3=-150 80 + vowelout f1=2 f2=1500 -300 300 f3=-150 80 + formants d/d+x/d_dnt%110 + before _ d/d_+x/d_ + before r d/dr+x/d_dnt%110 + after _ NULL + after @ d/xd + lengthmod 5 + switchvoicing t +endphoneme + + +phoneme c + vls pal afr sibilant + vowelin f1=0 f2=2700 400 600 f3=300 80 rate len=70 + vowelout f1=0 f2=2700 400 600 f3=300 80 colr=1 + lengthmod 2 + wave ustop/ts_pzd2%70 + before _ ustop/ts_pzd_ + switchvoicing J +endphoneme + + + + +phoneme p // unaspirated + vls blb stop + vowelin f1=0 f2=1000 -50 -100 f3=-200 80 + vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=30 + lengthmod 2 + wave ustop/p_unasp + before _ ustop/p_unasp_%80 + before r ustop/pr + before l ustop/pl + switchvoicing b +endphoneme + + + +phoneme k // unsapirated + vls vel stop + vowelin f1=0 f2=2300 200 400 f3=-100 80 + vowelout f1=0 f2=2300 300 400 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/k_unasp%70 // weaker + before _ ustop/k_ + before r ustop/kr + before l ustop/kl + before (i) ustop/ki + switchvoicing g +endphoneme + + + + + +phoneme s2 // second part of geminated [s:] + vls alv frc sibilant + vowelin f1=0 f2=1700 -300 300 f3=-100 80 + vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + lengthmod 3 + wave ufric/s_continue + before _ ufric/s_ + before p ufric/s! + before t ufric/s! + before k ufric/s! + switchvoicing z +endphoneme + + + diff --git a/phsource/ph_italian b/phsource/ph_italian new file mode 100644 index 00000000..f8734d3a --- /dev/null +++ b/phsource/ph_italian @@ -0,0 +1,253 @@ + +//==================================================== +// Italian +//==================================================== + +phoneme : // Lengthen previous vowel by "length" + virtual + length 70 +endphoneme + + + + +phoneme a + vowel starttype (a) endtype (a) + length 180 + formants vowel/a_2 + reduceto a/ 4 +endphoneme + + +phoneme a/ + vowel starttype (@) endtype (@) + length 180 + formants vowel/a# +endphoneme + + +phoneme e + vowel starttype (e) endtype (e) + length 170 + formants vowel/e +endphoneme + + +phoneme E + vowel starttype (e) endtype (e) + length 170 + formants vowel/ee_1 + reduceto e 4 // [E] only in stressed syllables +endphoneme + + +phoneme i + vowel starttype (i) endtype (i) + length 150 + formants vowel/i + linkout ; +endphoneme + +phoneme i2 + vowel starttype (i) endtype (i) + length 150 + formants vowel/i_4 + linkout ; +endphoneme + + +phoneme o + vowel starttype (o) endtype (o) + length 170 + formants vowel/o +endphoneme + + +phoneme O + vowel starttype (o) endtype (o) + length 170 + formants vowel/0 + reduceto o 4 // [O] only in stressed syllables +endphoneme + + +phoneme U + vowel starttype (u) endtype (u) + length 160 + formants vowel/uu_2 +endphoneme + + +phoneme u + vowel starttype (u) endtype (u) + length 160 + formants vowel/u_bck +endphoneme + + +phoneme aU + vowel starttype (a) endtype (u) + length 270 + formants vdiph/au_4 +endphoneme + + +phoneme eU + vowel starttype (e) endtype (u) + length 260 + formants vdiph/eu +endphoneme + + +phoneme iU + vowel starttype (i) endtype (u) + length 240 + formants vdiph2/iu +endphoneme + + +phoneme aI + vowel starttype (a) endtype (i) + length 250 + formants vdiph/ai +endphoneme + + +phoneme eI + vowel starttype (e) endtype (i) + length 250 + formants vdiph/ei +endphoneme + + +phoneme oI + vowel starttype (o) endtype (i) + length 230 + formants vdiph/oi +endphoneme + + +phoneme uI + vowel starttype (u) endtype (i) + length 240 + formants vdiph/ui +endphoneme + + + +// CONSONANTS +//=========== + + +phoneme r + liquid + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants r/r + after _ r/_r t r/tr p r/tr k r/tr + before _ r/r_ +endphoneme + + + + +phoneme R + liquid starttype r endtype r + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants r/rr + after _ r/rr + after t r/trr p r/trr k r/trr + before _ r/r_ +endphoneme + + +phoneme r/ // used for [r] when not preceding a vowel + liquid + length 100 + lengthmod 2 // + formants r3/r_+r3/rx + before n r3/r_n+r3/rx + after _ r/rr + after t r/trr p r/trr k r/trr +endphoneme + + +phoneme w2 + starttype w endtype w + liquid + length 100 + beforenotvowel w/ + lengthmod 7 + formants w/w2 + after _ w/w2 +endphoneme + + +phoneme p + vls blb stop + vowelin f1=0 f2=1000 -50 -100 f3=-200 80 + vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=30 + lengthmod 2 + wave ustop/p_unasp + before _ ustop/p_unasp_%80 + before r ustop/pr + before l ustop/pl + switchvoicing b +endphoneme + +phoneme ts + vls alv afr sibilant + vowelin f1=0 f2=1700 -300 300 f3=-100 80 + vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/ts +endphoneme + + +phoneme t // dental variant of /t/ + vls dnt stop + vowelin f1=0 f2=1600 -300 300 f3=-100 80 + vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/t_dnt%50 + before _ ustop/t_dnt%35 + switchvoicing d +endphoneme + + + +phoneme d // dental variant of /d/ + vcd dnt stop + vowelin f1=2 f2=1500 -300 300 f3=-150 80 + vowelout f1=2 f2=1500 -300 300 f3=-150 80 + formants d/d+x/d_dnt%110 + before _ d/d_+x/d_ + before r d/dr+x/d_dnt%110 + after _ NULL + after @ d/xd + lengthmod 5 + switchvoicing t +endphoneme + + + +phoneme k + vls vel stop + vowelin f1=0 f2=2300 200 400 f3=-100 80 + vowelout f1=0 f2=2300 300 400 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/k_unasp%70 // weaker + before _ ustop/k_ + before r ustop/kr + before l ustop/kl + before (i) ustop/ki + switchvoicing g +endphoneme + + + diff --git a/phsource/ph_norwegian b/phsource/ph_norwegian new file mode 100644 index 00000000..1d9da9be --- /dev/null +++ b/phsource/ph_norwegian @@ -0,0 +1,203 @@ + + +//======================================================== +// Norwegian +//========================================================= + + +// Vowels +//======= + +phoneme @ // close schwa + vowel starttype (@) endtype (@) + unstressed + length 120 + formants vowel/@_hgh +endphoneme + +phoneme @2 // open schwa + vowel starttype (@) endtype (a) + unstressed + length 120 + formants vowel/@_low +endphoneme + +phoneme I + vowel starttype (i) endtype (i) + length 100 + formants vowel/ii_3 + linkout ; +endphoneme + +phoneme i: + vowel starttype (i) endtype (i) + length 210 + formants vowel/i + after w w/wi2 + linkout ; +endphoneme + +phoneme y + vowel starttype (u) endtype (u) + length 120 + formants vowel/yy_2 +endphoneme + +phoneme y: + vowel starttype (u) endtype (u) + length 240 + formants vowel/y_4 +endphoneme + +phoneme W + vowel starttype (@) endtype (@) + length 120 + formants vowel/oe_2 +endphoneme + +phoneme Y: + vowel starttype (@) endtype (@) + length 240 + formants vwl_no/y# +endphoneme + + +phoneme E + vowel starttype (e) endtype (e) + length 120 + formants vowel/e_mid + reduceto @ 1 +endphoneme + +phoneme E: + vowel starttype (e) endtype (e) + length 240 + formants vowel/ee_1 +endphoneme + +phoneme e: + vowel starttype (e) endtype (e) + length 240 + formants vowel/e_2 +endphoneme + + +phoneme a + vowel starttype (a) endtype (a) + length 120 + formants vwl_no/& +endphoneme + +phoneme a: + vowel starttype (a) endtype (a) + length 250 + formants vwl_no/& +endphoneme + +phoneme A + vowel starttype (a) endtype (a) + length 130 + formants vowel/aa +endphoneme + +phoneme A: + vowel starttype (a) endtype (a) + length 250 + formants vowel/aa +endphoneme + +phoneme O + vowel starttype (o) endtype (o) + length 120 + formants vowel/oo +endphoneme + +phoneme o: + vowel starttype (o) endtype (o) + length 240 + formants vowel/o_2 +endphoneme + +phoneme U + vowel starttype (u) endtype (u) + length 120 + formants vowel/uu_bck +endphoneme + +phoneme u: + vowel starttype (u) endtype (u) + length 220 + formants vowel/u_bck +endphoneme + + +phoneme u- + vowel starttype (u) endtype (u) + length 120 + formants vwl_no/u# +endphoneme + +phoneme u-: + vowel starttype (u) endtype (u) + length 240 + formants vwl_no/u#2 +endphoneme + + +// Diphthongs +//=========== +phoneme AI + vowel starttype (a) endtype (i) + length 270 + formants vdiph/0i_2 + linkout ; +endphoneme + +phoneme aI + vowel starttype (a) endtype (i) + length 270 + formants vdiph/ai_3 + linkout ; +endphoneme + +phoneme OI + vowel starttype (o) endtype (i) + length 270 + formants vdiph/ooi + linkout ; +endphoneme + +phoneme u-I + vowel starttype (u) endtype (i) + length 270 + formants vdiph/yi + linkout ; +endphoneme + +phoneme Yy + vowel starttype (@) endtype (u) + length 270 + long + formants vwl_no/y#y +endphoneme + + +phoneme aU + vowel starttype (a) endtype (u) + length 270 + formants vwl_no/au- +endphoneme + + + +phoneme r + liquid + lengthmod 7 + beforenotvowel r/ + trill + formants r/rr + after _ r/rr + after t r/trr p r/trr k r/trr + before _ r/r_ +endphoneme + diff --git a/phsource/ph_polish b/phsource/ph_polish new file mode 100644 index 00000000..bc595ee6 --- /dev/null +++ b/phsource/ph_polish @@ -0,0 +1,160 @@ + +//==================================================== +// Polish +//==================================================== + + +phoneme a + vowel starttype (a) endtype (a) + length 190 + formants vowel/a +endphoneme + + +phoneme E + vowel starttype (e) endtype (e) + length 180 + formants vowel/ee + before _ vowel/ee_1 +endphoneme + + +phoneme i + vowel starttype (i) endtype (i) + length 170 + formants vowel/i + linkout ; +endphoneme + + +phoneme O + vowel starttype (o) endtype (o) + length 180 + formants vowel/oo_4 +endphoneme + + +phoneme u + vowel starttype (u) endtype (u) + length 180 + formants vowel/u_bck +endphoneme + + +phoneme y // close central unrounded (i-bar) + vowel starttype (i) endtype (i) + length 180 + formants vowel/ii# +endphoneme + + +phoneme E~ + vowel starttype (e) endtype (e) + length 250 + formants vnasal/ee_n2 +endphoneme + + +phoneme O~ + vowel starttype (o) endtype (o) + length 250 + formants vnasal/oo_n2 +endphoneme + + +// CONSONANTS +//=========== + +phoneme t + vls dnt stop + vowelin f1=0 f2=1600 -300 300 f3=-100 80 + vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/t_dnt%60 + before _ ustop/t_dnt%35 + switchvoicing d +endphoneme + +phoneme t; + vls pal stop palatal + vowelin f1=0 f2=2700 400 600 f3=300 80 rate len=70 + vowelout f1=1 f2=2700 400 600 f3=200 70 len=50 colr=1 + lengthmod 2 + wave ustop/t_pzd%60 + before _ ustop/t_pzd%30 + switchvoicing d; +endphoneme + + +phoneme d + vcd dnt stop + vowelin f1=2 f2=1500 -300 300 f3=-150 80 + vowelout f1=2 f2=1500 -300 300 f3=-150 80 + formants d/d+x/d_dnt%110 + before _ d/d_+x/d_ + before r d/dr+x/d_dnt%110 + after _ NULL + after @ d/xd + lengthmod 5 + switchvoicing t +endphoneme + +phoneme d; + vcd alv stop palatal + vowelin f1=2 f2=2700 400 600 f3=200 80 rate len=80 + vowelout f1=2 f2=2700 400 600 f3=200 80 rate len=100 colr=1 + formants d/d+x/d_pzd%80 + before _ d/d_+x/d_pzd%40 + before r d/dr+x/d_pzd%80 + after _ NULL + after @ d/xd_pzd + lengthmod 5 + switchvoicing t; +endphoneme + + + +phoneme ts + vls alv afr sibilant + vowelin f1=0 f2=1700 -300 300 f3=-100 80 + vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/ts +endphoneme + + + + +phoneme r + liquid + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants r/rr + after _ r/rr + after t r/trr p r/trr k r/trr + before _ r/r_ +endphoneme + + +phoneme r/ // used for [r] when not preceding a vowel + liquid + length 100 + lengthmod 2 // + formants r3/r_+r3/rx + before n r3/r_n+r3/rx + after _ r/rr + after t r/trr p r/trr k r/trr +endphoneme + + +phoneme w + liquid + length 100 + beforenotvowel w/ + lengthmod 7 + formants w/w2 + after _ w/w2 +endphoneme + diff --git a/phsource/ph_portuguese b/phsource/ph_portuguese new file mode 100644 index 00000000..d5090264 --- /dev/null +++ b/phsource/ph_portuguese @@ -0,0 +1,137 @@ + +//==================================================== +// Portuguese/Portugal - based on Portuguese/Brazil +//==================================================== + + + +phoneme & + vowel starttype (@) endtype (@) + length 180 + formants vowel/a#_3 + unstressed +endphoneme + +phoneme &/ // Used for final "a" when next word starts with "a" + vowel starttype (@) endtype (@) + beforevowel NULL + length 180 + formants vowel/a#_3 +endphoneme + +phoneme a + vowel starttype (a) endtype (a) + length 180 + formants vowel/a_2 + reduceto & 4 +endphoneme + +phoneme &~ + vowel starttype (e) endtype (@) + length 240 + formants vnasal/ee_n2 +endphoneme + + + +phoneme E + vowel starttype (e) endtype (e) + length 170 + formants vowel/e_mid + reduceto y 2 +endphoneme + +phoneme e + vowel starttype (e) endtype (e) + length 160 + formants vowel/e + reduceto y 2 +endphoneme + +phoneme y + vowel starttype (@) endtype (@) + length 100 + formants vowel/i#_5 +endphoneme + + +phoneme i + vowel starttype (i) endtype (i) + length 150 + formants vowel/i + linkout ; +endphoneme + + +phoneme i/ // changes to NULL before a vowel + vowel starttype (i) endtype (i) + beforevowel NULL + length 100 + formants vowel/i#_5 + linkout ; +endphoneme + + +phoneme O + vowel starttype (o) endtype (o) + length 170 + formants vowel/0_2 +// reduceto o 4 +endphoneme + + +phoneme o + vowel starttype (o) endtype (o) + length 170 + formants vowel/o + reduceto u 2 +endphoneme + + +phoneme u + vowel starttype (u) endtype (u) + length 160 + formants vowel/u_6 +endphoneme + +phoneme U + vowel starttype (u) endtype (u) + length 100 + beforevowel w + formants vowel/u_6 +endphoneme + + +phoneme EU + vowel starttype (e) endtype (u) + length 220 + formants vdiph/eeu_2 +endphoneme + + + +phoneme w + starttype w endtype w + liquid + length 100 + beforenotvowel w/ + lengthmod 7 + formants w/w2 + after _ w/w2 +endphoneme + + + +phoneme x // [r] for Portugal + liquid +// vcd uvl frc + vowelin f1=0 f2=1500 -400 400 f3=-400 80 + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants vwl_fr/@R+r3/rx%120 +endphoneme + + + diff --git a/phsource/ph_pt_brazil b/phsource/ph_pt_brazil new file mode 100644 index 00000000..4483d180 --- /dev/null +++ b/phsource/ph_pt_brazil @@ -0,0 +1,185 @@ + +//==================================================== +// Portuguese - based on Italian +//==================================================== + +phoneme e~ + vowel starttype (e) endtype (e) + length 240 + formants vnasal/e_n +endphoneme + +phoneme i~ + vowel starttype (i) endtype (i) + length 240 + formants vnasal/i_n + linkout ; +endphoneme + +phoneme o~ + vowel starttype (o) endtype (o) + length 240 + formants vnasal/o_n +endphoneme + +phoneme u~ + vowel starttype (u) endtype (u) + length 180 + formants vnasal/u_n +endphoneme + +phoneme &~ + vowel starttype (@) endtype (@) + length 240 + formants vnasal/&_n +endphoneme + +phoneme &U~ + vowel starttype (a) endtype (@) + length 240 + formants vnasal/&u_n +endphoneme + +phoneme oI~ + vowel starttype (o) endtype (i) + length 260 + formants vnasal/oi_n +endphoneme + + + + +phoneme & + vowel starttype (@) endtype (@) + length 180 + formants vowel/a# +endphoneme + +phoneme &/ // Used for final "a" when next word starts with "a" + vowel starttype (@) endtype (@) + beforevowel NULL + length 180 + formants vowel/a# +endphoneme + +phoneme A // for "al" in European Portuguese + vowel starttype (a) endtype (a) + length 180 + formants vowel/aa_7 +// reduceto & 4 +endphoneme + + +phoneme E + vowel starttype (e) endtype (e) + length 170 + formants vowel/ee_3 +endphoneme + +phoneme e + vowel starttype (e) endtype (e) + length 160 + formants vowel/e +endphoneme + + +phoneme y // this is the same as [i] for Brazil + vowel starttype (i) endtype (i) + length 150 + formants vowel/i + linkout ; +endphoneme + + +phoneme i/ // changes to [j] before a vowel + vowel starttype (i) endtype (i) + beforevowel j + length 150 + formants vowel/i + linkout ; +endphoneme + + +phoneme O + vowel starttype (o) endtype (o) + length 170 + formants vowel/0 +endphoneme + + +phoneme u + vowel starttype (u) endtype (u) + length 160 + formants vowel/u_bck +endphoneme + + + +phoneme aI + vowel starttype (a) endtype (i) + length 230 + formants vdiph/ai +endphoneme + + +phoneme eI + vowel starttype (e) endtype (i) + length 210 + formants vdiph/ei +endphoneme + + +phoneme EI + vowel starttype (e) endtype (i) + length 230 + formants vdiph/eei +endphoneme + + +phoneme OI + vowel starttype (o) endtype (i) + length 230 + formants vdiph/0i +endphoneme + + +phoneme eU + vowel starttype (e) endtype (u) + length 230 + formants vdiph/eu +endphoneme + + +phoneme EU + vowel starttype (e) endtype (u) + length 230 + formants vdiph/eeu +endphoneme + + + + +phoneme l + liquid + length 100 + lengthmod 7 + beforenotvowel l/2 // use 'dark' [l] after a vowel, should be [w] + formants l/l + after _ l/_l + after t l/tl + before _ l/l_2 +endphoneme + + + +phoneme x // for "r" + vcd vel frc + vowelin f1=0 f2=1500 0 400 f3=-500 100 + vowelout f1=0 f2=1500 0 400 f3=-500 100 rms=20 + lengthmod 6 + formants voc/Q_less+ufric/x2%110 + before _ voc/Q_+ufric/x2 + switchvoicing x +endphoneme + + diff --git a/phsource/ph_romanian b/phsource/ph_romanian new file mode 100644 index 00000000..6855b9be --- /dev/null +++ b/phsource/ph_romanian @@ -0,0 +1,317 @@ + +//==================================================== +// Romanian - based on Italian +//==================================================== + +// Vowels + + +phoneme I^ // "silent i", palatilizes the preceding consonant + vowel starttype (i) endtype (i) + length 70 + unstressed + formants vwl_ro/ii- + beforevowel ; + after l; vwl_ro/li-10 + after m; vwl_ro/mi + after n; vwl_ro/ni +endphoneme + +phoneme i/ // used for "i" at end of word + vowel starttype (i) endtype (i) + length 150 + formants vowel/i + linkout ; + reduceto I^ 4 +endphoneme + +phoneme e + vowel starttype (e) endtype (e) + length 180 + formants vowel/e_mid2 +endphoneme + +phoneme y + vowel starttype (@) endtype (@) + length 180 + formants vowel/i#_5 +endphoneme + +phoneme a + vowel starttype (a) endtype (a) + length 180 + formants vowel/a_2 +endphoneme + +phoneme @ + vowel starttype (@) endtype (@) + length 170 +// unstressed + formants vowel/@_low +endphoneme + +phoneme o + vowel starttype (o) endtype (o) + length 170 + formants vowel/o_mid +endphoneme + +phoneme u + vowel starttype (u) endtype (u) + length 160 + formants vowel/u_2 +endphoneme + +phoneme Y + vowel starttype (@) endtype (@) + length 180 + formants vowel/y# +endphoneme + + + +// Diphthongs + + +phoneme @I + vowel starttype (@) endtype (i) + length 250 + formants vdiph/@i_3 +endphoneme + +phoneme @U + vowel starttype (@) endtype (u) + length 260 + formants vdiph/@u_3 +endphoneme + +phoneme oU + vowel starttype (o) endtype (u) + length 260 + formants vdiph/ou_2 +endphoneme + + + +phoneme iI + vowel starttype (i) endtype (i) + length 250 + formants vdiph/ii +endphoneme + +phoneme yI + vowel starttype (@) endtype (i) + length 210 + formants vdiph/i#i +endphoneme + +phoneme yU + vowel starttype (@) endtype (u) + length 230 + formants vowel/u_3 +endphoneme + +phoneme ea + vowel starttype (e) endtype (a) + length 250 + formants vdiph2/ea +endphoneme + +phoneme eo + vowel starttype (e) endtype (o) + length 270 + formants vdiph2/eo +endphoneme + +phoneme e[u + vowel starttype (e) endtype (u) + length 250 + formants vdiph2/e[u +endphoneme + +phoneme Oa + vowel starttype (o) endtype (a) + length 250 + formants vdiph2/oa +endphoneme + + +// Consonants + +phoneme r + liquid starttype r endtype r + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants r/rr + after _ r/rr + after t r/trr p r/trr k r/trr + before _ r/r_ +endphoneme + + +phoneme l; + liquid starttype l + vowelout colr=1 + length 100 + lengthmod 7 + beforenotvowel l/ + formants l/l + after _ l/_l + after t l/tl + after l/ l/l_long // double l, make it longer +endphoneme + +phoneme m; + vcd blb nasal + vowelout f1=2 f2=1000 -500 -350 f3=200 80 brk colr=1 + starttype m endtype m + length 100 + lengthmod 4 + formants NULL + after _ m/_m + before _ m/m_ + before (r) m/mj +endphoneme + + +phoneme n; + vcd alv nasal + vowelout f1=2 f2=1700 -300 250 f3=200 80 rms=20 brk colr=1 + starttype n endtype n + length 100 + lengthmod 4 + formants NULL + after _ n/_n + after n n/_n // lengthen [nn] + before _ n/n_ + before (r) n/nj +endphoneme + + +phoneme p; + vls blb stop + vowelin f1=0 f2=1000 -50 -100 f3=-200 80 + vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=30 colr=1 + lengthmod 2 + wave ustop/p_unasp + before _ ustop/p_unasp_%80 + before r ustop/pr + before l ustop/pl + switchvoicing b +endphoneme + + +phoneme t; // dental variant of /t/ + vls dnt stop + vowelin f1=0 f2=1700 100 300 f3=0 80 + vowelout f1=0 f2=1700 100 250 f3=0 80 rms=20 colr=1 + lengthmod 2 + wave ustop/t_dnt%50 + before _ ustop/t_dnt%35 + switchvoicing d +endphoneme + +phoneme ts; + vls alv afr sibilant + vowelin f1=0 f2=1700 -300 300 f3=-100 80 + vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 colr=1 + lengthmod 2 + wave ustop/ts +endphoneme + + +phoneme f; + vls lbd frc + vowelout f1=0 f2=1000 -500 -350 f3=-200 80 colr=1 + lengthmod 3 + wave ufric/f + before _ ufric/f_ + switchvoicing v +endphoneme + +phoneme s; + vls alv frc sibilant + vowelin f1=0 f2=1700 -300 300 f3=-100 80 + vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 colr=1 + lengthmod 3 + wave ufric/s_pzd%50 + switchvoicing z; +endphoneme + + +phoneme S; + vls pla frc sibilant + vowelin f1=0 f2=2100 100 300 f3=-100 80 + vowelout f1=0 f2=2100 100 300 f3=-100 80 colr=1 + length 100 + lengthmod 3 + wave ufric/sh_pzd + switchvoicing Z; +endphoneme + + +phoneme b; + vcd blb stop + vowelout f1=2 f2=1000 -500 -300 f3=-300 80 brk colr=1 + formants b/b+x/b + before (i) b/bi+x/b + lengthmod 5 + switchvoicing p +endphoneme + + +phoneme d; // dental variant of /d/ + vcd dnt stop + vowelin f1=2 f2=1700 100 300 f3=0 80 + vowelout f1=2 f2=1700 100 300 f3=0 80 colr=1 + formants d/d+x/d_dnt%110 + before _ d/d_+x/d_ + before r d/dr+x/d_dnt%110 + after _ NULL + after @ d/xd + lengthmod 5 + switchvoicing t +endphoneme + +phoneme *; // flap + vcd alv flp + vowelout f1=3 f2=1700 -300 300 f3=-300 80 rms=35 len=15 colr=1 + formants d/tap+r3/rx + vowelin f1=0 f2=1700 -300 300 f3=-400 80 rms=20 + before (i) d/tap_i+r3/rx + lengthmod 2 +endphoneme + + +phoneme v; + vcd lbd frc + vowelin f1=0 f2=1000 -300 -200 f3=-300 100 + vowelout f1=0 f2=1000 -500 -300 f3=-300 60 len=50 colr=1 + lengthmod 6 + formants voc/v+vocw/v + before _ voc/v_+vocw/v + switchvoicing f +endphoneme + +phoneme z; + vcd alv frc sibilant + vowelout f1=0 f2=1700 -300 300 f3=-100 60 len=50 colr=1 + formants voc/z+ufric/s_ + before _ voc/z_+ufric/s_ + lengthmod 6 + switchvoicing s +endphoneme + + +phoneme Z; + vcd pla frc sibilant + vowelin f1=0 f2=2000 0 300 f3=-200 80 colr=1 + vowelout f1=2 f2=2000 0 300 f3=-200 80 brk + formants voc/zh+vocw/zh + before _ voc/zh_+vocw/zh + lengthmod 6 + switchvoicing S +endphoneme + diff --git a/phsource/ph_russian b/phsource/ph_russian new file mode 100755 index 00000000..4d3c1679 --- /dev/null +++ b/phsource/ph_russian @@ -0,0 +1,281 @@ + + +phoneme l + liquid + length 100 + lengthmod 7 + beforenotvowel l/2 // use 'dark' [l] after a vowel + formants l/l + after _ l/_l t l/tl + before _ l/l_2 +endphoneme + + +phoneme r + liquid starttype r endtype r + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants r/rr + after _ r/rr + after t r/trr p r/trr k r/trr + before _ r/r_ +endphoneme + + +phoneme r/ // used for [r] when not preceding a vowel + liquid + length 100 + lengthmod 2 // + formants r3/r_+r3/rx + before n r3/r_n+r3/rx + after _ r/rr + after t r/trr p r/trr k r/trr +endphoneme + + +phoneme ts + vls alv afr sibilant + vowelin f1=0 f2=1700 -300 300 f3=-100 80 + vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/ts +endphoneme + + +phoneme dZ; + vcd pal afr sibilant palatal + vowelin f1=2 f2=2700 400 600 f3=300 80 rate len=70 + formants dzh/dzh+x/dz_pzd + before _ dzh/dzh_+x/dzh_ + after _ NULL + after @ dzh/xdzh + lengthmod 5 + switchvoicing ts; +endphoneme + + +phoneme tS; + vls pal afr sibilant palatal + vowelin f1=0 f2=2700 400 600 f3=300 80 rate len=70 + lengthmod 2 + wave ustop/ts_pzd + before _ ustop/ts_pzd + switchvoicing dz; +endphoneme + + + +// Palatalized versions of consonants + +phoneme t + vls dnt stop + vowelin f1=0 f2=1600 -300 300 f3=-100 80 + vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/t_dnt%60 + before _ ustop/t_dnt%30 + before r ustop/tr + switchvoicing d +endphoneme + +phoneme t; + vls pal stop palatal + vowelin f1=0 f2=2700 400 600 f3=300 80 rate len=70 + vowelout f1=1 f2=2700 400 600 f3=200 70 len=50 + lengthmod 2 + wave ustop/t_pzd%60 + before _ ustop/t_pzd%30 + switchvoicing d; +endphoneme + + +phoneme d + vcd dnt stop + vowelin f1=2 f2=1500 -300 300 f3=-150 80 + vowelout f1=2 f2=1500 -300 300 f3=-150 80 + formants d/d+x/d_dnt%110 + before _ d/d_+x/d_ + before r d/dr+x/d_dnt%110 + after _ NULL + after @ d/xd + lengthmod 5 + switchvoicing t +endphoneme + +phoneme d; + vcd alv stop palatal + vowelin f1=2 f2=2700 400 600 f3=200 80 rate len=80 + vowelout f1=2 f2=2700 400 600 f3=200 80 rate len=100 + formants d/d+x/d_pzd%80 + before _ d/d_+x/d_pzd%40 + before r d/dr+x/d_pzd%80 + after _ NULL + after @ d/xd_pzd + lengthmod 5 + switchvoicing t; +endphoneme + + + +//******************************************************************* +// VOWELS +//******************************************************************* + +phoneme i + vowel starttype (i) endtype (i) + length 130 + formants vwl_ru/i +endphoneme + +phoneme I# + vowel starttype (i) endtype (i) + length 80 + formants vwl_ru/ii# +endphoneme + +phoneme y + vowel starttype (i) endtype (i) + length 130 + formants vwl_ru/i# +endphoneme + +phoneme I + vowel starttype (i) endtype (i) + length 80 + formants vwl_ru/ii +endphoneme + +phoneme I2 + vowel starttype (i) endtype (i) + length 80 + formants vwl_ru/ii +endphoneme + +phoneme I3 + vowel starttype (i) endtype (i) + length 80 + formants vwl_ru/ii +endphoneme + +phoneme E + vowel starttype (e) endtype (e) + length 200 + formants vwl_ru/e +endphoneme + +phoneme E# + vowel starttype (e) endtype (e) + length 100 + formants vwl_ru/E# +endphoneme + +phoneme E2 + vowel starttype (e) endtype (e) + length 80 + formants vwl_ru/E@ +endphoneme + +phoneme E3 + vowel starttype (e) endtype (e) + length 80 + formants vwl_ru/E@ +endphoneme + +phoneme A + vowel starttype (a) endtype (a) + length 150 + formants vwl_ru/a +endphoneme + +phoneme o + vowel starttype (o) endtype (o) + length 100 + formants vwl_ru/o +endphoneme + +phoneme O + vowel starttype (o) endtype (o) + length 80 + formants vwl_ru/oo +endphoneme + +phoneme u + vowel starttype (u) endtype (u) + length 150 + formants vwl_ru/u +endphoneme + +phoneme u# + vowel starttype (u) endtype (u) + length 80 + formants vwl_ru/u# +endphoneme + +phoneme u" + vowel starttype (u) endtype (u) + length 150 + formants vwl_ru/u#u +endphoneme + +phoneme 8 + vowel starttype (o) endtype (o) + length 150 + formants vwl_ru/8 + reduceto V 4 +endphoneme + +phoneme e + vowel starttype (e) endtype (e) + length 190 + formants vwl_ru/ee +endphoneme + +phoneme ju + vowel starttype (u) endtype (u) + length 190 + formants vwl_ru/ju +endphoneme + +phoneme ja + vowel starttype (i) endtype (a) + length 200 + formants vwl_ru/ja +endphoneme + +phoneme V + vowel starttype (a) endtype (@) + length 80 + formants vowel/V_2 + unstressed +endphoneme + +phoneme V# + vowel starttype (a) endtype (@) + length 80 + formants vowel/V_2 + unstressed +endphoneme + +//phoneme U +// vowel starttype (u) endtype (u) +// length 140 +// formants vowel/uu +// unstressed +//endphoneme + +phoneme Y // will not be used in future + vowel starttype (u) endtype (u) + length 140 + formants vowel/ii# + unstressed +endphoneme + +phoneme a + vowel starttype (a) endtype (a) + formants vwl_ru/aa + length 100 +endphoneme + + diff --git a/phsource/ph_slovak b/phsource/ph_slovak new file mode 100644 index 00000000..47ec700f --- /dev/null +++ b/phsource/ph_slovak @@ -0,0 +1,141 @@ + +phoneme i + vowel starttype (i) endtype (i) + length 120 + formants vowel/ii_3 + linkout ; +endphoneme + +phoneme i: + vowel starttype (i) endtype (i) + length 230 + formants vowel/i_3 + linkout ; +endphoneme + +phoneme & + vowel starttype (e) endtype (e) + length 130 + formants vowel/ee_6 +endphoneme + +phoneme e + vowel starttype (e) endtype (e) + length 130 + formants vowel/e_mid2 +endphoneme + +phoneme e: + vowel starttype (e) endtype (e) + length 280 + formants vowel/e_mid +endphoneme + +phoneme a + vowel starttype (a) endtype (a) + length 140 + formants vowel/a +endphoneme + +phoneme a: + vowel starttype (a) endtype (a) + length 290 + formants vowel/a +endphoneme + +phoneme o + vowel starttype (o) endtype (o) + length 130 + formants vowel/oo_1 +endphoneme + +phoneme o: + vowel starttype (o) endtype (o) + length 280 + formants vowel/oo_1 +endphoneme + +phoneme u + vowel starttype (u) endtype (u) + length 130 + formants vowel/u_2 +endphoneme + +phoneme u: + vowel starttype (u) endtype (u) + length 280 + formants vowel/u_bck +endphoneme + + +phoneme aU + vowel starttype (a) endtype (u) + length 270 + formants vdiph/au_4 +endphoneme + + +phoneme eU + vowel starttype (e) endtype (u) + length 260 + formants vdiph/eu +endphoneme + +phoneme oU + vowel starttype (o) endtype (u) + length 260 + formants vdiph/ou_2 +endphoneme + +phoneme eI + vowel starttype (e) endtype (i) + length 260 + formants vdiph/eei_3 +endphoneme + + + +phoneme r- + vowel starttype (@) endtype (@) + length 220 + formants vowelr/r-voc +endphoneme + +phoneme r: + vowel starttype (@) endtype (@) + length 300 + formants vowelr/r-voc +endphoneme + +phoneme l- + vowel starttype (@) endtype (@) + length 140 + formants vwl_hi/l-voc +endphoneme + +phoneme l: + vowel starttype (@) endtype (@) + length 250 + formants vwl_hi/l-voc +endphoneme + +phoneme l + liquid + length 100 + lengthmod 7 + beforenotvowel l/2 // use 'dark' [l] after a vowel + formants l/l + after _ l/_l t l/tl + before _ l/l_2 +endphoneme + +phoneme w + liquid + length 100 + beforenotvowel w/ + lengthmod 7 + formants w/w2 + after _ w/w2 +endphoneme + + diff --git a/phsource/ph_spanish b/phsource/ph_spanish new file mode 100644 index 00000000..e2f8652c --- /dev/null +++ b/phsource/ph_spanish @@ -0,0 +1,73 @@ + +//==================================================== +// Spanish - based on Italian +//==================================================== + +phoneme E + vowel starttype (e) endtype (e) + length 180 + formants vowel/e_mid +endphoneme + +phoneme o + vowel starttype (o) endtype (o) + length 170 + formants vowel/oo +endphoneme + + + + + +phoneme g + vcd vel stop + vowelin f1=2 f2=2300 200 300 f3=-300 80 + vowelout f1=2 f2=2300 250 300 f3=-300 80 brk + formants g/g+x/g2 // weaker [g] + before _ g/g_+x/g_ + after _ NULL + after @ g/xg + lengthmod 5 + switchvoicing k +endphoneme + + + + + +phoneme R + liquid starttype r endtype r + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants r/rr + after _ r/rr + after t r/trr p r/trr k r/trr + before _ r/r_ +endphoneme + + + +phoneme D + vcd dnt frc + vowelout f1=0 f2=1700 -300 300 f3=-100 60 len=50 + formants voc/dh+vocw/dh + before _ voc/dh_+vocw/dh%40 + lengthmod 6 + switchvoicing T +endphoneme + +phoneme s + vls alv frc sibilant + vowelin f1=0 f2=1700 -300 300 f3=-100 80 + vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + lengthmod 3 + wave ufric/s + before _ ufric/s_%60 // quieter 's' at end of word + before p ufric/s! + before t ufric/s! + before k ufric/s! + switchvoicing z +endphoneme + diff --git a/phsource/ph_swahili b/phsource/ph_swahili new file mode 100644 index 00000000..3a9eeb2c --- /dev/null +++ b/phsource/ph_swahili @@ -0,0 +1,119 @@ + +//==================================================== +// Swahili +//==================================================== + +// Vowels + +phoneme i + vowel starttype (i) endtype (i) + length 165 + formants vowel/i +// linkout ; +endphoneme + + +phoneme e + vowel starttype (e) endtype (e) + length 180 + formants vowel/e_mid2 +endphoneme + +phoneme a/ + vowel starttype (@) endtype (@) + length 180 + formants vowel/a#_2 +endphoneme + + +phoneme a + vowel starttype (a) endtype (a) + length 180 + formants vowel/a_5 + reduceto a/ 2 +endphoneme + + +phoneme o + vowel starttype (o) endtype (o) + length 180 + formants vowel/0_2 +endphoneme + +phoneme u + vowel starttype (u) endtype (u) + length 170 + formants vowel/u_5 +endphoneme + +phoneme m- + vowel starttype (o) endtype (o) + length 190 + formants vnasal/m- +endphoneme + +phoneme n- + vowel starttype (e) endtype (e) + length 190 + formants vnasal/n- +endphoneme + +phoneme N- + vowel starttype (e) endtype (e) + length 190 + formants vnasal/nn- +endphoneme + + +// Consonants + +phoneme r + liquid starttype r endtype r + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants r/rr + after _ r/rr + after t r/trr p r/trr k r/trr + before _ r/r_ +endphoneme + +phoneme t // dental variant of /t/ + vls dnt stop + vowelin f1=0 f2=1600 -300 300 f3=-100 80 + vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/t_dnt%50 + before _ ustop/t_dnt%35 + switchvoicing d +endphoneme + + +phoneme d // dental variant of /d/ + vcd dnt stop + vowelin f1=2 f2=1500 -300 300 f3=-150 80 + vowelout f1=2 f2=1500 -300 300 f3=-150 80 + formants d/d+x/d_dnt%110 + before _ d/d_+x/d_ + before r d/dr+x/d_dnt%110 + after _ NULL + after @ d/xd + lengthmod 5 + switchvoicing t +endphoneme + +phoneme k + vls vel stop + vowelin f1=0 f2=2300 100 200 f3=-200 80 + vowelout f1=0 f2=2300 300 400 f3=-200 80 rms=20 + lengthmod 2 + wave ustop/k + before _ ustop/k_ + before r ustop/kr + before l ustop/kl + before (i) ustop/ki + switchvoicing g +endphoneme + + diff --git a/phsource/ph_swedish b/phsource/ph_swedish new file mode 100644 index 00000000..cf6b9b77 --- /dev/null +++ b/phsource/ph_swedish @@ -0,0 +1,183 @@ + + +//========================================================= +// Swedish +//========================================================= + + +// Vowels +//======= + +phoneme i: + vowel starttype (i) endtype (i) + length 180 + formants vowel/i_2 + after w w/wi2 + linkout ; +endphoneme + +phoneme I + vowel starttype (i) endtype (i) + length 130 + formants vowel/ii_3 + linkout ; +endphoneme + +phoneme e: + vowel starttype (e) endtype (e) + length 210 + formants vowel/e_2 +endphoneme + +phoneme E + vowel starttype (e) endtype (e) + length 140 + formants vowel/ee + reduceto @ 2 +endphoneme + +phoneme E: + vowel starttype (e) endtype (@) + length 220 + formants vowel/ee_1 +endphoneme + +phoneme E3 + vowel starttype (e) endtype (e) + length 140 + formants vowel/ee_6 + reduceto @ 0 +endphoneme + +phoneme E- + vowel starttype (@) endtype (@) + unstressed + length 140 + formants vowel/ee#_2 +endphoneme + + + +phoneme y: + vowel starttype (u) endtype (u) + length 220 + formants vowel/y_5 +endphoneme + +phoneme y + vowel starttype (u) endtype (u) + length 140 + formants vowel/yy_3 +endphoneme + +phoneme u- + vowel starttype (u) endtype (u) + length 200 + formants vowel/u#_2 +endphoneme + +phoneme Y: + vowel starttype (@) endtype (@) + length 220 + formants vowel/y#_2 +endphoneme + +phoneme W + vowel starttype (@) endtype (@) + length 140 + formants vowel/oe_4 +endphoneme + +phoneme 8 + vowel starttype (u) endtype (u) + length 140 + formants vowel/8_2 +endphoneme + + + +phoneme a + vowel starttype (a) endtype (a) + length 140 + formants vowel/a_5 +endphoneme + +phoneme a2 + vowel starttype (a) endtype (a) + length 140 + formants vowel/a#_2 +endphoneme + +phoneme & + vowel starttype (a) endtype (a) + length 140 + formants vowel/& +endphoneme + +phoneme A: + vowel starttype (a) endtype (a) + length 240 + formants vowel/aa_4 +endphoneme + +phoneme O + vowel starttype (o) endtype (o) + length 140 + formants vowel/oo +endphoneme + +phoneme o: + vowel starttype (o) endtype (o) + length 210 + formants vowel/o +endphoneme + +phoneme U + vowel starttype (u) endtype (u) + length 140 + formants vowel/uu_4 +endphoneme + +phoneme u: + vowel starttype (u) endtype (u) + length 210 + formants vowel/u_bck +endphoneme + + +//=================================================== + +// CONSONANTS +//=========== + + +phoneme r + liquid + lengthmod 7 + beforenotvowel r/ + trill + formants vwl_sv/r_sv3 +// formants r/rr +// after _ r/rr + after t r/trr p r/trr k r/trr +// before _ r/r_ +endphoneme + + +phoneme r/ // variant of [r] when not preceding a vowel + liquid vowel2 + length 100 + lengthmod 7 // + formants NULL +endphoneme + + +phoneme sx // Swedish "sj" sound + vls vel frc + vowelin f1=0 f2=2300 300 400 f3=200 100 + vowelout f1=0 f2=2300 300 400 f3=200 100 rms=20 + length 100 + lengthmod 3 + wave ufric/sx_sv%60 +endphoneme + diff --git a/phsource/ph_vi b/phsource/ph_vi new file mode 100644 index 00000000..96e87edb --- /dev/null +++ b/phsource/ph_vi @@ -0,0 +1,298 @@ + +//==================================================== +// Vietnamese Phonemes +//==================================================== + + +phoneme 1 // tone: level + stress + length 11 + tone 28 32 envelope/p_level NULL +endphoneme + + +phoneme 2 // tone: low falling + stress + length 12 + tone 20 8 envelope/p_fall NULL +endphoneme + + +phoneme 3 // tone rising + stress + length 13 + tone 28 43 envelope/p_rise NULL +endphoneme + + +phoneme 4 // tone curve (dipping rising) + stress + length 14 + tone 28 5 envelope/p_fallrise NULL +endphoneme + + +phoneme 5 // tone: broken (creaking rising) + stress + length 15 + tone 28 45 envelope/vi_5 envelope/vi_5amp +endphoneme + + +phoneme 6 // tone drop (constricted) + stress + length 16 + tone 30 5 envelope/vi_6 envelope/vi_6amp +endphoneme + + +phoneme 7 // tone 1 at end of clause + stress + length 17 + tone 30 20 envelope/p_fall NULL +endphoneme + + +// Vowels +//======= + + +phoneme a + vowel starttype (@) endtype (@) + length 130 + formants vowel/a_4 +endphoneme + +phoneme a: + vowel starttype (a) endtype (a) + length 260 + formants vowel/a_2 +endphoneme + + +phoneme E + vowel starttype (e) endtype (e) + length 200 + formants vowel/ee_3 +endphoneme + +phoneme e + vowel starttype (e) endtype (e) + length 200 + formants vowel/e +endphoneme + + +phoneme i + vowel starttype (i) endtype (i) + length 190 + formants vowel/i_en + after w w/wi + linkout ; +endphoneme + + +phoneme O + vowel starttype (o) endtype (o) + length 200 + formants vowel/aa_4 +endphoneme + +phoneme o + vowel starttype (o) endtype (o) + length 200 + formants vowel/oo_1 +endphoneme + + +phoneme u + vowel starttype (u) endtype (u) + length 200 + formants vowel/u_7 +endphoneme + +phoneme y + vowel starttype (u) endtype (u) + length 200 + formants vowel/y# +endphoneme + + + +phoneme @ + vowel starttype (@) endtype (a) + length 130 + formants vowel/a#_3 +endphoneme + + +phoneme @: + vowel starttype (@) endtype (@) + length 260 + formants vowel/V_3 +endphoneme + + + +// Diphthongs +//=========== + +phoneme aI + vowel starttype (a) endtype (i) + length 250 + formants vdiph/&i_3 +endphoneme + + +phoneme a:I + vowel starttype (a) endtype (i) + length 250 + formants vdiph/ai +endphoneme + + +phoneme @I + vowel starttype (@) endtype (i) + length 250 + formants vdiph/@i_4 +endphoneme + + +phoneme @:I + vowel starttype (@) endtype (i) + length 250 + formants vdiph/Vi +endphoneme + + +phoneme eI + vowel starttype (e) endtype (i) + length 200 + formants vdiph/ei +endphoneme + + +phoneme EI + vowel starttype (e) endtype (i) + length 200 + formants vdiph/eei +endphoneme + + +phoneme OI + vowel starttype (o) endtype (i) + length 200 + formants vdiph/0i +endphoneme + + +phoneme oI + vowel starttype (o) endtype (i) + length 200 + formants vdiph/oi +endphoneme + + +phoneme uI + vowel starttype (u) endtype (i) + length 200 + formants vdiph/ui +endphoneme + +phoneme yI + vowel starttype (u) endtype (i) + length 200 + formants vdiph/u-i +endphoneme + + + + +phoneme aU + vowel starttype (a) endtype (u) + length 230 + formants vdiph/aau_4 +endphoneme + + +phoneme a:U + vowel starttype (a) endtype (u) + length 250 + formants vdiph/au +endphoneme + + +phoneme eU + vowel starttype (e) endtype (u) + length 200 + formants vdiph/eu +endphoneme + + +phoneme EU + vowel starttype (e) endtype (u) + length 200 + formants vdiph/eeu +endphoneme + +phoneme iU + vowel starttype (i) endtype (u) + length 200 + formants vdiph2/iu +endphoneme + +phoneme @U + vowel starttype (@) endtype (u) + length 200 + formants vdiph/@u_en +endphoneme + +phoneme @:U + vowel starttype (@) endtype (u) + length 250 + formants vdiph/@u_en +endphoneme + + + +phoneme i@ + vowel starttype (i) endtype (@) + length 230 + formants vdiph2/ii@_3 +endphoneme + +phoneme y@ + vowel starttype (i) endtype (@) + length 200 + formants vdiph2/u-@ +endphoneme + +phoneme u@ + vowel starttype (u) endtype (@) + length 200 + formants vdiph2/uu@ +endphoneme + + + +phoneme t[ // dental variant of /t/ + vls dnt stop + vowelin f1=1 f2=1600 -300 300 f3=-100 80 + vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/t_dnt2%60 + before _ ustop/t_dnt%30 + switchvoicing d +endphoneme + + +phoneme kh + vls vel frc + vowelin f1=0 f2=2300 200 400 f3=200 80 + vowelout f1=0 f2=2300 300 400 f3=200 80 rms=20 + length 100 + lengthmod 3 + wave ufric/x%50 + switchvoicing Q +endphoneme + diff --git a/phsource/ph_welsh b/phsource/ph_welsh new file mode 100644 index 00000000..35d9aec9 --- /dev/null +++ b/phsource/ph_welsh @@ -0,0 +1,244 @@ + +//==================================================== +// Welsh +//==================================================== + + +// Short Vowels +//============= + +phoneme a + vowel starttype (a) endtype (a) + length 150 + formants vowel/a +endphoneme + + +phoneme E + vowel starttype (e) endtype (e) + length 150 + formants vowel/ee_2 +endphoneme + + +phoneme I + vowel starttype (i) endtype (i) + length 150 + formants vowel/ii +endphoneme + + +phoneme Y // symbol used in place of I" (I bar) + vowel starttype (i) endtype (i) + length 150 + formants vowel/ii# +endphoneme + + +phoneme O + vowel starttype (o) endtype (o) + length 150 + formants vowel/oo_2 +endphoneme + + +phoneme U + vowel starttype (u) endtype (u) + length 150 + formants vowel/u_bck +endphoneme + + +phoneme V + vowel starttype (@) endtype (@) + length 150 + formants vowel/@ +endphoneme + + +// Long Vowels +//============ + +phoneme i: + vowel starttype (i) endtype (i) + length 180 + formants vowel/i + reduceto I 4 +endphoneme + + +phoneme y: // symbol used in place of i" (i bar) + vowel starttype (i) endtype (i) + length 180 + formants vowel/i# + reduceto Y 4 +endphoneme + + +phoneme u: + vowel starttype (u) endtype (u) + length 190 + formants vowel/u + reduceto U 4 +endphoneme + + +phoneme e: + vowel starttype (e) endtype (e) + length 210 + formants vowel/e + reduceto E 4 +endphoneme + + +phoneme o: + vowel starttype (o) endtype (o) + length 210 + formants vowel/o_2 + reduceto O 4 +endphoneme + + +phoneme A: + vowel starttype (a) endtype (a) + length 230 + formants vowel/aa_2 + reduceto a 4 +endphoneme + + +// Diphthongs +//=========== + +phoneme AY + vowel starttype (a) endtype (i) + length 250 + formants vdiph/aai_2 +endphoneme + + +phoneme aI + vowel starttype (a) endtype (i) + length 210 + formants vdiph/ai_2 +endphoneme + + +phoneme aY + vowel starttype (a) endtype (i) + length 210 + formants vdiph/ai_2 +endphoneme + + +phoneme aU + vowel starttype (a) endtype (u) + length 210 + formants vdiph/au_4 +endphoneme + + +phoneme @I + vowel starttype (@) endtype (i) + length 210 + formants vdiph/@i_2 +endphoneme + + +phoneme @Y + vowel starttype (@) endtype (i) + length 210 + formants vdiph/@i_2 +endphoneme + + +phoneme eU + vowel starttype (e) endtype (u) + length 210 + formants vdiph/eu +endphoneme + + +phoneme Iu + vowel starttype (i) endtype (u) + length 210 + formants vdiph2/iu_4 +endphoneme + + +phoneme Yu + vowel starttype (i) endtype (u) + length 210 + formants vdiph2/iu_4 +endphoneme + + +phoneme OI + vowel starttype (o) endtype (i) + length 210 + formants vdiph/ooi +endphoneme + + +phoneme OY + vowel starttype (o) endtype (i) + length 210 + formants vdiph/ooi +endphoneme + + +phoneme uI + vowel starttype (u) endtype (i) + length 210 + formants vdiph/ui_3 +endphoneme + + +phoneme uY + vowel starttype (u) endtype (i) + length 210 + formants vdiph/ui_3 +endphoneme + + +// CONSONANTS +//=========== + +phoneme r + liquid + length 100 + lengthmod 7 + beforenotvowel r/ + trill + formants r/rr + after _ r/rr + after t r/trr p r/trr k r/trr + before _ r/r_ +endphoneme + + +phoneme r/ // used for [r] when not preceding a vowel + liquid + length 100 + lengthmod 2 // + formants NULL + before _ r3/r_+r3/rx + before n r3/r_n+r3/rx + after _ r/rr + after t r/trr p r/trr k r/trr +endphoneme + + + +phoneme g + vcd vel stop + vowelin f1=2 f2=2300 200 300 f3=-300 80 + vowelout f1=2 f2=2300 250 300 f3=-300 80 brk + formants g/g+x/g2%150 + before _ g/g_+x/g_%140 + after _ NULL + after @ g/xg + lengthmod 5 + switchvoicing k +endphoneme + diff --git a/phsource/ph_zh_yue b/phsource/ph_zh_yue new file mode 100644 index 00000000..e9cb7d7c --- /dev/null +++ b/phsource/ph_zh_yue @@ -0,0 +1,235 @@ + +//==================================================== +// Tone Numbers +//==================================================== + + +phoneme 1 // tone: high level + stress + tone 50 30 envelope/p_fall NULL +endphoneme + + +phoneme 2 // tone: rise + stress + tone 30 50 envelope/p_rise NULL +endphoneme + + +phoneme 3 // tone: mid level + stress + tone 30 30 envelope/p_level NULL +endphoneme + + +phoneme 4 // tone: low fall + stress + tone 20 10 envelope/p_fall NULL +endphoneme + + +phoneme 5 // tone: low rise + stress + tone 10 30 envelope/p_rise NULL +endphoneme + + +phoneme 6 // tone: low level + stress + tone 20 20 envelope/p_level NULL +endphoneme + + +//==================================================== +// Consonants +//==================================================== + + +phoneme z // [ts] + vls alv afr sibilant + vowelin f1=0 f2=1700 -300 300 f3=-100 80 + vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/ts +endphoneme + + +phoneme c // [tS] + vls pla afr sibilant + vowelin f1=0 f2=2300 200 400 f3=-100 80 + lengthmod 2 + wave ustop/tsh + before _ ustop/tsh_ + switchvoicing dZ +endphoneme + + +phoneme ng // synonym for [N] + vcd vel nasal + starttype N endtype N + vowelout f1=3 f2=2300 300 400 f3=-200 80 len=40 rms=20 brk + length 100 + formants NULL + after _ nn/_nn + before _ nn/nn_ + before (r) nn/nnj + lengthmod 8 // longer than 'n' +endphoneme + + + +//==================================================== +// Vowels and Diphtnongs +//==================================================== + + + +phoneme aa + vowel starttype (a) endtype (a) + length 230 + formants vowel/aa +endphoneme + +phoneme aai + vowel starttype (a) endtype (i) + length 270 + formants vdiph/aai +endphoneme + +phoneme aau + vowel starttype (a) endtype (u) + length 260 + formants vdiph/aau_2 +endphoneme + +phoneme aang + vowel starttype (a) endtype (u) + length 270 + formants vwl_zh/aang +endphoneme + + + +phoneme a + vowel starttype (@) endtype (@) + length 150 + formants vowel/a#_3 +endphoneme + +phoneme ai + vowel starttype (@) endtype (i) + length 200 + formants vdiph/@i_3 +endphoneme + +phoneme au + vowel starttype (a) endtype (u) + length 200 + formants vdiph/au_2 +endphoneme + + +phoneme e + vowel starttype (e) endtype (e) + length 220 + formants vowel/ee_1 +endphoneme + +phoneme ei + vowel starttype (e) endtype (i) + length 220 + formants vdiph/ei +endphoneme + +phoneme eu + vowel starttype (e) endtype (u) + length 260 + formants vdiph/eeu +endphoneme + + +phoneme i + vowel starttype (i) endtype (i) + length 190 + formants vowel/i + before k vowel/ii-40 + before N vowel/ii-40 + after w w/wi + linkout ; +endphoneme + +phoneme iu + vowel starttype (i) endtype (u) + length 200 + formants vdiph2/iu +endphoneme + + + +phoneme o + vowel starttype (o) endtype (o) + length 170 + formants vowel/oo +endphoneme + +phoneme oi + vowel starttype (o) endtype (i) + length 200 + formants vdiph/ooi +endphoneme + +phoneme ou + vowel starttype (o) endtype (u) + length 200 + formants vdiph/ou +endphoneme + +phoneme ong + vowel starttype (o) endtype (u) + length 220 + formants vwl_zh/ong +endphoneme + + +phoneme u + vowel starttype (u) endtype (u) + length 170 + formants vowel/u_bck + before k vowel/uu_bck + before N vowel/uu_bck +endphoneme + +phoneme ui + vowel starttype (u) endtype (i) + length 220 + formants vdiph/ui +endphoneme + + +phoneme oe + vowel starttype (@) endtype (@) + length 230 + formants vowel/y# +endphoneme + + +phoneme eo + vowel starttype (@) endtype (@) + length 170 + formants vowel/8_3 +endphoneme + +phoneme eoi + vowel starttype (@) endtype (i) + length 220 + formants vdiph/y#y_2 +endphoneme + + + +phoneme yu + vowel starttype (u) endtype (u) + length 220 + formants vowel/y +endphoneme + diff --git a/phsource/phonemes b/phsource/phonemes new file mode 100644 index 00000000..99e0262c --- /dev/null +++ b/phsource/phonemes @@ -0,0 +1,1162 @@ + +// This is the master phoneme file. + + +// These are fixed phoneme code numbers, which can be used +// directly within the program. +phonemenumber 1 < +phonemenumber 2 %% +phonemenumber 3 % +phonemenumber 4 , +phonemenumber 5 ,, +phonemenumber 6 ' +phonemenumber 7 '' +phonemenumber 8 = // stress previous syllable +phonemenumber 9 _: // pause +phonemenumber 10 _ // short pause +phonemenumber 11 _! // short pause, no link +phonemenumber 12 : +phonemenumber 13 @ +phonemenumber 14 @- +phonemenumber 15 || +phonemenumber 16 (r) +phonemenumber 17 1 // (numeral 1) default tone (for tone language) +phonemenumber 18 (X1) // capital letter indication +phonemenumber 19 ? // glottal stop +phonemenumber 20 - // syllabic consonant +phonemenumber 21 _^_ // Change language +phonemenumber 22 _X1 // a language specific action +phonemenumber 23 _| // very short pause + +// The base phoneme table contains the utility phonemes, the consonants, +// and a schwa. The vowels are defined in the language specific phoneme +// tables, which can also redefine consonants if they wish. + + +//******************************************************************* +// UTILITY PHONEMES +//******************************************************************* + +phoneme < // Start of control string + pause + length 0 + lengthmod 1 +endphoneme + +phoneme %% // Unstressed + stress + length 0 +endphoneme + +phoneme % // Diminished stress + stress + length 1 +endphoneme + +phoneme , // Secondary stress + stress + length 2 +endphoneme + +phoneme ,, // Secondary stress + stress + length 3 +endphoneme + +phoneme ' // Primary stress + stress + length 4 +endphoneme + +phoneme '' // Primary stress (priority) + stress + length 5 +endphoneme + +phoneme = // Place stress on previous vowel + stress + length 2 +endphoneme + +phoneme || // End Word + pause + length 0 + lengthmod 1 +endphoneme + +phoneme _ // Short pause + pause + formants NULL + starttype _ endtype _ + length 25 + lengthmod 1 +endphoneme + +phoneme _! // Short pause, don't replace by linking + pause + formants NULL + starttype _ endtype _ + length 25 + lengthmod 1 + nolink +endphoneme + +phoneme _| // Very short pause + pause + formants NULL + starttype _ endtype _ + length 1 + lengthmod 1 +endphoneme + +phoneme _: // Standard pause + pause + formants NULL + starttype _ endtype _ + length 75 + lengthmod 1 +endphoneme + +phoneme _:: // Long pause + pause + formants NULL + starttype _ endtype _ + length 150 + lengthmod 1 +endphoneme + +phoneme _^_ // Change dictionary (followed by language-code in ascii + pause + starttype _ endtype _ + length 10 + lengthmod 1 +endphoneme + +phoneme _X1 // a language specific action + pause + starttype _ endtype _ + length 10 + lengthmod 1 +endphoneme + +phoneme ? // glottal stop + pause + vowelin glstop + vowelout glstop + formants NULL + starttype _ endtype _ + length 45 + lengthmod 5 // ?? + nolink +endphoneme + + +phoneme : // Lengthen previous vowel by "length" + virtual + length 60 +endphoneme + +phoneme - // Indicates the previous phoneme is a syllabic consonant + virtual + length 0 +endphoneme + + +phoneme @ // Schwa + vowel starttype (@) endtype (@) + formants vowel/@ + unstressed + length 140 +endphoneme + + +phoneme @- // very short schwa + vowel + starttype (@) endtype (@) + formants vowel/@- + unstressed + length 50 +endphoneme + + +//******************************************************************* +// Other sounds +//******************************************************************* + +phoneme (X1) // click, use for indicating capital letters + vls alv frc sibilant + lengthmod 3 + wave ustop/percus10 +endphoneme + + +//******************************************************************* +// VIRTUAL - referred to in vowels' vowel starttype and endtype +// These each apply to a class of vowels +//******************************************************************* + +phoneme (@) virtual + after j j/j@ + after ; j2/j2@ + after w w/w@ + after l l/l@ + after L l/l@ + after l^ l^/j2@ + after r r/r@-15 + after r- r2/r2@ + after m m/m@ + after n n/n@ + after N nn/nn@ + after n^ n^/n^@ + before l/ DFT-60+l/L1_@L + before l/2 DFT-60+l/L2_@L + before l DFT-50+l/xl + before w DFT-30+w/xw + before j DFT-30+j/xj + before r DFT-50+r/xr + before r- DFT-60+r/xr + before r/ DFT+r3/r_@ +endphoneme + +phoneme (a) virtual + after j j/ja + after ; j2/j2a + after w w/wa + after l l/la + after L l/la + after l^ l^/j2a + after r r/ra-15 + after r- r2/r2a + after m m/ma + after n n/na + after N nn/nna + after n^ n^/n^a + before l/ DFT-40+l/L1_aL + before l/2 DFT-40+l/L2_aL + before l DFT-40+l/xl + before w DFT-30+w/xw + before j DFT-30+j/xj + before r DFT-50+r/xr + before r- DFT-60+r/xr + before r/ DFT+r3/r_a +endphoneme + +phoneme (e) virtual + after j j/je + after ; j2/j2e + after w w/we + after l l/le + after L l/le + after l^ l^/j2e + after r r/re-15 + after r- r2/r2e + after m m/me + after n n/ne + after N nn/nne + after n^ n^/n^e + before l/ DFT-30+l/L1_eL + before l/2 DFT-40+l/L2_eL + before l DFT-40+l/xl + before w DFT-30+w/xw + before j DFT-30+j/xj + before r DFT-50+r/xr + before r- DFT-60+r/xr + before r/ DFT+r3/r_e +endphoneme + +phoneme (i) virtual + after j j/ji + after ; j2/j2i + after w w/wi + after l l/li-10 + after L l/li + after l^ l^/j2i + after r r/ri-15 + after r- r2/r2i + after m m/mi + after n n/ni + after N nn/nni + after n^ n^/n^i + before l/ DFT-30+l/L1_iL + before l/2 DFT-30+l/L2_iL + before N DFT-40+nn/inn + before ; DFT-40+j2/xj2 + before l DFT-40+l/xl + before j DFT-30+j/xj + before r- DFT-60+r/xr + before r/ DFT+r3/r_i +endphoneme + +phoneme (o) virtual + after j j/jo + after ; j2/j2o + after w w/wo + after l l/lo + after L l/lo + after l^ l^/j2o + after r r/ro-15 + after r- r2/r2o + after m m/mo + after n n/no + after N nn/nno + after n^ n^/n^o + before l/ DFT-40+l/L1_oL + before l/2 DFT-40+l/L2_oL + before l DFT-40+l/xl + before w DFT-30+w/xw + before j DFT-30+j/xj + before r DFT-50+r/xr + before r- DFT-60+r/xr + before r/ DFT+r3/r_o +endphoneme + +phoneme (u) virtual + after j j/ju + after ; j2/j2u + after w w/wu + after l l/lu + after L l/lu + after l^ l^/j2u + after r r/ru-15 + after r- r2/r2u + after m m/mu + after n n/nu + after N nn/nnu + after n^ n^/n^u + before l/ DFT-40+l/L1_uL + before l/2 DFT-40+l/L2_uL + before l DFT-40+l/xl + before w DFT-30+w/xw + before j DFT-30+j/xj + before r DFT-50+r/xr + before r- DFT-60+r/xr + before r/ DFT+r3/r_u +endphoneme + +phoneme (r) virtual +// use to mean general sonorant +endphoneme + + +//******************************************************************* +// SONORANTS +//******************************************************************* + + +phoneme r + liquid + length 100 + lengthmod 7 + beforenotvowel r/ + formants r/r + after _ r/_r + after t r/tr + after p r/tr + after k r/tr + before _ r/r_ +endphoneme + + +phoneme r/ // used for [r] when not preceding a vowel + liquid + length 100 + lengthmod 2 // + formants r3/r_+r3/rx + before n r3/r_n+r3/rx + after _ r/rr + after t r/trr + after p r/trr + after k r/trr +endphoneme + + +phoneme r- // linking r, used between certain vowels and a following vowel + liquid + length 100 + lengthmod 0 + formants r/r + after _ r2/_r2 +endphoneme + + +phoneme l + liquid + length 100 + lengthmod 7 + beforenotvowel l/ + formants l/l + after _ l/_l + after t l/tl + after l/ l/l_long // double l, make it longer +endphoneme + + +phoneme l/ // used for [l] when not before a vowel + liquid + length 100 + lengthmod 7 + formants l/l_ + before (r) l/_l + beforevowel l +endphoneme + + +phoneme l/2 // 'dark' [l] after a vowel + liquid + length 100 + lengthmod 7 + beforevowel l +endphoneme + + +phoneme l^ // palatal l + vowelout len=60 lenadd rate + liquid + formants l^/l^ + after _ l^/_l^ + lengthmod 7 +endphoneme + + +phoneme w + liquid + length 100 + beforenotvowel w/ + lengthmod 7 + formants w/w + after _ w/_w +endphoneme + + +phoneme w/ // used for [w] when not before a vowel + liquid + vowelout len=50 + length 100 + formants w/w_ + lengthmod 7 + beforevowel w +endphoneme + + +phoneme j + liquid + palatal + length 100 + beforenotvowel j/ + formants NULL + after _ j/_j + lengthmod 7 +endphoneme + + +phoneme j/ // used for [j] when not before a vowel + liquid + palatal + vowelout len=70 + length 100 + formants j/j_ + lengthmod 7 + beforevowel j +endphoneme + + + + +phoneme ; // linking j, (formerly [j-]) used between (i) vowels + // and a following vowel + // also to palatalize consonants + liquid + palatal + length 100 + lengthmod 0 + formants NULL + beforenotvowel NULL // this is to ignore this phoneme if not before a vowel + after _ j2/_j2 +endphoneme + + +phoneme m + vcd blb nasal + vowelout f1=2 f2=1000 -500 -350 f3=-200 80 brk + length 100 + lengthmod 4 + formants NULL + after _ m/_m + before _ m/m_ + before (r) m/mj +endphoneme + + +phoneme n + vcd alv nasal + vowelout f1=2 f2=1700 -300 250 f3=-100 80 rms=20 brk + length 100 + lengthmod 4 + formants NULL + after _ n/_n + after n n/_n // lengthen [nn] + before _ n/n_ + before (r) n/nj +endphoneme + + +phoneme n. + vcd rfx nasal + starttype n endtype n + vowelout f1=2 f2=1700 -300 250 f3=-400 80 rms=20 brk colr=2 + length 100 + lengthmod 4 + formants NULL + after _ n/_n + after n n/_n // lengthen [nn] + before _ n/n_ + before (r) n/nj +endphoneme + + + +phoneme n^ + vcd pal nasal palatal + vowelout f1=3 f2=2300 300 400 f3=100 80 brk rate + length 100 + lengthmod 4 + formants NULL + after _ n^/_n^ + before _ n^/n^_ + before (r) n/nj +endphoneme + + + +phoneme N + vcd vel nasal +// vowelout brk + vowelout f1=3 f2=2300 300 400 f3=-200 80 len=40 rms=20 brk + length 100 + formants NULL + after _ nn/_nn + before _ nn/nn_ + before (r) nn/nnj + lengthmod 8 // longer than 'n' +endphoneme + +phoneme ** // TEST flap after consonant + liquid alv + vowelout f1=3 f2=1700 -300 300 f3=-300 80 rms=35 len=15 + vowelin f1=0 f2=1700 -300 300 f3=-300 80 rms=20 + formants r3/@tap+r3/rx + vowelin f1=0 f2=1700 -300 300 f3=-400 80 rms=20 + before (i) r3/@tap_i+r3/rx + before (e) r3/@tap_i+r3/rx + vowelin f1=2 f2=1700 -300 300 f3=-300 80 rms=20 + before (a) r3/@tap+r3/rx +endphoneme + + + +//******************************************************************* +// VOICED STOPS +//******************************************************************* + + + +phoneme b + vcd blb stop + vowelout f1=2 f2=1000 -500 -300 f3=-300 80 brk + formants b/b+x/b + before _ b/b_+x/b_ + before (a) b/ba+x/b + before (@) b/b@+x/b + before (e) b/be+x/b + before (i) b/bi+x/b + before (o) b/bo+x/b + before (u) b/bu+x/b + before @- b/b@2+x/b + after _ NULL + after @ b/xb + lengthmod 5 + switchvoicing p +endphoneme + + + +phoneme d + vcd alv stop + vowelin f1=2 f2=1700 -300 300 f3=-100 80 + vowelout f1=2 f2=1700 -300 300 f3=-100 80 + formants d/d+x/d + before _ d/d_+x/d_ + before r d/dr+x/d + after _ NULL + after @ d/xd + lengthmod 5 + switchvoicing t +endphoneme + + +phoneme d[ + vcd dnt stop + vowelin f1=2 f2=1500 -300 300 f3=-150 80 + vowelout f1=2 f2=1500 -300 300 f3=-150 80 + formants d/d+x/d_dnt%110 + before _ d/d_+x/d_ + before r d/dr+x/d_dnt%110 + after _ NULL + after @ d/xd + lengthmod 5 + switchvoicing t[ +endphoneme + + +phoneme * // flap + vcd alv flp + vowelout f1=3 f2=1500 -400 300 f3=-200 80 rms=35 len=50 + vowelin f1=0 f2=1500 -300 300 f3=-200 80 rms=20 + formants d/tap3+r3/rx%200 + vowelin f1=0 f2=1500 -300 300 f3=-200 80 rms=20 + before (i) d/tap1+r3/rx%150 + before (e) d/tap1+r3/rx%150 + vowelin f1=2 f2=1500 -300 300 f3=-200 80 rms=20 + before (a) d/tap3+r3/rx%200 + before r d/dr + lengthmod 3 +endphoneme + +phoneme *2 // TEST flap + vcd alv flp + vowelout f1=2 f2=1700 -300 200 f3=-300 60 len=15 brk + vowelin f1=2 f2=1700 -300 150 f3=-200 80 + formants d/tap2+x/d_dnt%30 + after _ NULL + after @ d/x_tap + vowelin f1=1 f2=1700 -300 150 f3=-200 80 + before (i) d/tap2+x/d_dnt%30 + lengthmod 3 + switchvoicing t +endphoneme + + + + +phoneme dZ + vcd pla afr sibilant + vowelin f1=2 f2=2300 200 400 f3=100 80 + vowelout f1=2 f2=2300 250 300 f3=100 80 brk + formants dzh/dzh+x/dzh + before _ dzh/dzh_+x/dzh_ + after _ NULL + after @ dzh/xdzh + lengthmod 5 + switchvoicing tS +endphoneme + + +phoneme dz; // this should be different from dZ; + vcd pla afr sibilant palatal + vowelin f1=2 f2=2700 400 600 f3=300 80 rate len=70 + formants dzh/dzh+x/dz_pzd + before _ dzh/dzh_+x/dzh_ + after _ NULL + after @ dzh/xdzh + lengthmod 5 + switchvoicing ts; +endphoneme + + +phoneme dZ; + vcd pla afr sibilant palatal + vowelin f1=2 f2=2700 400 600 f3=300 80 rate len=70 + formants dzh/dzh+x/dz_pzd + before _ dzh/dzh_+x/dzh_ + after _ NULL + after @ dzh/xdzh + lengthmod 5 + switchvoicing tS; +endphoneme + + +phoneme J + vcd pla afr sibilant + vowelin f1=2 f2=2700 400 600 f3=300 80 rate len=70 + vowelout f1=2 f2=2700 400 600 f3=300 80 colr=1 + formants dzh/dz_pzd+x/dzh%40 + before _ dzh/dz_pzd_+x/dz_pzd_%70 + after _ NULL + after @ dzh/xdz_pzd + lengthmod 5 + switchvoicing c +endphoneme + + + +phoneme g + vcd vel stop + vowelin f1=2 f2=2300 200 300 f3=-300 80 + vowelout f1=2 f2=2300 250 300 f3=-300 80 brk +// formants g/g+x/g + formants g/g+x/g2%150 + before _ g/g_+x/g_ + after _ NULL + after @ g/xg + lengthmod 5 + switchvoicing k +endphoneme + + +phoneme g- // linking g, used between N and a vowel + vcd vel stop + vowelin f1=2 f2=2300 200 400 f3=-100 80 + vowelout f1=2 f2=2300 250 300 f3=-300 80 brk + formants g2/g+x/g2_ + before _ g2/g_+x/g2_ + after _ NULL + after @ g2/xg + lengthmod 5 +endphoneme + + + +//******************************************************************* +// VOICED fricatives +//******************************************************************* + + +phoneme B + vcd blb frc + vowelin f1=2 f2=1000 -300 -200 f3=-100 100 + vowelout f1=2 f2=1000 -500 -300 f3=-100 60 len=50 + lengthmod 6 + formants voc/bh+vocw/v + before _ voc/v_+vocw/v + switchvoicing f +endphoneme + + +phoneme v + vcd lbd frc + vowelin f1=0 f2=1000 -300 -200 f3=-300 100 + vowelout f1=0 f2=1000 -500 -300 f3=-300 60 len=50 + lengthmod 6 + formants voc/v+vocw/v + before _ voc/v_+vocw/v + switchvoicing f +endphoneme + + +phoneme D + vcd dnt frc + vowelout f1=0 f2=1700 -300 300 f3=-100 60 len=50 + formants voc/dh+vocw/dh + before _ voc/dh_+vocw/dh + lengthmod 6 + switchvoicing T +endphoneme + + +phoneme z + vcd alv frc sibilant + vowelout f1=0 f2=1700 -300 300 f3=-100 60 len=50 + formants voc/z+ufric/s_ + before _ voc/z_+ufric/s_%80 + lengthmod 6 + switchvoicing s +endphoneme + + +phoneme Z + vcd pla frc sibilant + vowelin f1=0 f2=2000 0 300 f3=-200 80 + vowelout f1=2 f2=2000 0 300 f3=-200 80 brk + formants voc/zh+vocw/zh + before _ voc/zh_+vocw/zh + lengthmod 6 + switchvoicing S +endphoneme + + +phoneme z; + vcd pal frc sibilant palatal + vowelin f1=2 f2=2700 400 600 f3=300 80 rate len=70 + vowelout f1=2 f2=2300 250 300 f3=-300 80 brk + formants voc/z_pzd+ufric/s_pzd%40 + before _ voc/z_pzd_+ufric/s_pzd%40 + lengthmod 6 + switchvoicing s; +endphoneme + + +phoneme Z; + vcd pal frc sibilant palatal + vowelin f1=2 f2=2700 400 600 f3=300 80 rate len=70 + vowelout f1=2 f2=2300 250 300 f3=-300 80 brk + formants voc/z_pzd+ufric/sh_pzd_ + before _ voc/z_pzd_+ufric/sh_pzd_ + lengthmod 6 + switchvoicing Z; +endphoneme + + + + +phoneme Q + vcd vel frc + vowelin f1=2 f2=2300 200 400 f3=-100 80 + vowelout f1=2 f2=2300 250 300 f3=-300 80 brk + lengthmod 6 + formants voc/Q+vocw/Q + before _ voc/Q_+vocw/Q_ + switchvoicing x +endphoneme + +phoneme Q^ + vcd vel frc + vowelin f1=2 f2=2700 400 600 f3=200 80 + vowelout f1=2 f2=2700 40 600 f3=200 80 brk + lengthmod 6 + formants voc/Q+vocw/Q + before _ voc/Q_+vocw/Q_ + switchvoicing x +endphoneme + + + +//******************************************************************* +// UNVOICED STOPS +//******************************************************************* + + + +phoneme p + vls blb stop +// vowelin f1=0 f2=1000 -50 -50 f3=-200 80 +// vowelout f1=0 f2=1000 -500 -350 f3=-200 80 + vowelin f1=0 f2=1000 -50 -100 f3=-200 80 rms=30 + vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=22 + lengthmod 2 + wave ustop/p + before _ ustop/p_ + before r ustop/pr + before @- ustop/p_unasp + before l ustop/pl + switchvoicing b +endphoneme + + +phoneme t + vls alv stop + vowelin f1=0 f2=1700 -300 300 f3=-100 80 + vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/t + before _ ustop/t_ + before @- ustop/t_dnt%50 + before r ustop/tr + switchvoicing d +endphoneme + + +phoneme t[ // dental variant of /t/ + vls dnt stop + vowelin f1=0 f2=1600 -300 300 f3=-100 80 + vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20 + lengthmod 2 + wave ustop/t_dnt%50 + before _ ustop/t_dnt%25 + before r ustop/tr + switchvoicing d[ +endphoneme + + + +phoneme tS + vls pla afr sibilant + vowelin f1=0 f2=2300 200 400 f3=-100 80 + lengthmod 2 + wave ustop/tsh + before _ ustop/tsh_ + switchvoicing dZ +endphoneme + + +phoneme ts; // this should be different from tS; + vls pal afr sibilant palatal + vowelin f1=0 f2=2700 400 600 f3=300 80 rate len=70 + lengthmod 2 + wave ustop/ts_pzd + before _ ustop/ts_pzd + switchvoicing dz; +endphoneme + + +phoneme tS; + vls pal afr sibilant palatal + vowelin f1=0 f2=2700 400 600 f3=300 80 rate len=70 + lengthmod 2 + wave ustop/ts_pzd + before _ ustop/ts_pzd + switchvoicing dZ; +endphoneme + + + + +phoneme c + vls pal stop + vowelin f1=0 f2=2700 400 600 f3=500 80 rate len=80 + vowelout f1=0 f2=2700 400 600 f3=300 80 + lengthmod 2 + wave ustop/c%130 + before _ ustop/ki%80 +endphoneme + + +phoneme k + vls vel stop + vowelin f1=0 f2=2300 200 300 f3=-200 80 + vowelout f1=0 f2=2300 300 400 f3=-200 80 rms=20 + lengthmod 2 + wave ustop/k + before _ ustop/k_ + before r ustop/kr + before @- ustop/k_unasp%70 + before l ustop/kl + before (i) ustop/ki + switchvoicing g +endphoneme + +phoneme q + vls uvl stop + vowelin f1=1 f2=1700 0 200 f3=-300 80 f4 paus rms=35 + vowelout f1=1 f2=1700 0 200 f3=-300 80 f4 rms=30 + lengthmod 2 + wave ustop/k_unasp%60 + before _ ustop/k_unasp%50 +endphoneme + + + +//******************************************************************* +// UNVOICED fricatives +//******************************************************************* + + + +phoneme f + vls lbd frc + vowelout f1=0 f2=1000 -500 -350 f3=-200 80 + lengthmod 3 + wave ufric/f + before _ ufric/f_ + switchvoicing v +endphoneme + + +phoneme T + vls dnt frc + vowelin f1=0 f2=1700 -300 300 f3=-100 80 + vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + lengthmod 3 + wave ufric/th + before _ ufric/th_ + switchvoicing D +endphoneme + + +phoneme s + vls alv frc sibilant + vowelin f1=0 f2=1700 -300 300 f3=-100 80 + vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 + lengthmod 3 + wave ufric/s + before _ ufric/s_ + before p ufric/s! + before t ufric/s! + before k ufric/s! + switchvoicing z +endphoneme + + +phoneme S + vls pla frc sibilant + vowelin f1=0 f2=2100 100 300 f3=-100 80 + vowelout f1=0 f2=2100 100 300 f3=-100 80 + length 100 + lengthmod 3 + wave ufric/sh + before _ ufric/sh_ + switchvoicing Z +endphoneme + + +phoneme s; + vls pal frc sibilant palatal + vowelin f1=1 f2=2700 400 600 f3=200 70 rate len=70 + vowelout f1=1 f2=2700 400 600 f3=200 70 rate len=70 + length 100 + lengthmod 3 + wave ufric/s_pzd%50 + before _ ufric/s_pzd%50 + switchvoicing z; +endphoneme + + +phoneme S; + vls pal frc sibilant palatal + vowelin f1=1 f2=2700 400 600 f3=200 70 rate len=70 + vowelout f1=1 f2=2700 400 600 f3=200 70 rate + length 100 + lengthmod 3 + wave ufric/sh_pzd + before _ ufric/sh_pzd_ + switchvoicing Z; +endphoneme + + +phoneme L // Welsh "ll" + vls alv frc + length 100 + lengthmod 3 + wave ufric/ll%80 +// before _ ufric/ll_ +endphoneme + + +phoneme C + vls pal frc palatal + vowelin f1=0 f2=2700 400 600 f3=200 70 + vowelout f1=0 f2=2700 400 600 f3=200 70 rms=20 + length 100 + lengthmod 3 + wave ufric/ch +endphoneme + + +phoneme x + vls vel frc + vowelin f1=0 f2=2300 200 400 f3=-100 80 + vowelout f1=0 f2=2300 300 400 f3=-100 80 rms=20 + length 100 + lengthmod 3 + wave ufric/x + switchvoicing Q +endphoneme + + +phoneme h + vls glt apr + length 100 + lengthmod 3 + wave ufric/h_%70 // no vowel following + before (@) ufric/h@ + before (a) ufric/ha + before (e) ufric/he + before (i) ufric/hi + before (o) ufric/ho + before (u) ufric/hu +endphoneme + + + + +//******************************************************************* +// ADDITIONAL PHONEME TABLES +//******************************************************************* + + +phonemetable en base +include ph_english + +phonemetable en_n en +include ph_english_n + +phonemetable en_us en +include ph_english_us + +phonemetable en_sc en +include ph_english_sc + +phonemetable en_rp en +include ph_english_rp + +phonemetable en_wm en +include ph_english_wm + +phonemetable af base +include ph_af + +phonemetable cy base +include ph_welsh + +phonemetable de base +include ph_german + +phonemetable eo base +include ph_esperanto + +phonemetable fi base +include ph_finnish + +phonemetable fr base +include ph_french + +phonemetable fr_ca fr +include ph_french_ca + +phonemetable hi base +include ph_hindi + +phonemetable hu base +include ph_hungarian + +phonemetable nl base +include ph_dutch + +phonemetable pl base +include ph_polish + +phonemetable sk pl +include ph_slovak + +phonemetable cs sk +include ph_czech + +phonemetable hr sk +include ph_croatian + +phonemetable ru base +include ph_russian + + +phonemetable it base +include ph_italian + +phonemetable es it +include ph_spanish + +phonemetable pt it +include ph_pt_brazil + +phonemetable pt_pt pt +include ph_portuguese + +phonemetable ro it +include ph_romanian + +phonemetable el it +include ph_greek + +phonemetable sv base +include ph_swedish + +phonemetable no base +include ph_norwegian + + +phonemetable vi base +include ph_vi + +phonemetable zh_yue base +include ph_zh_yue + +phonemetable sw base +include ph_swahili diff --git a/phsource/r/_r b/phsource/r/_r new file mode 100644 index 00000000..1cfb2ff4 Binary files /dev/null and b/phsource/r/_r differ diff --git a/phsource/r/r b/phsource/r/r new file mode 100644 index 00000000..4e34c5a5 Binary files /dev/null and b/phsource/r/r differ diff --git a/phsource/r/r@ b/phsource/r/r@ new file mode 100644 index 00000000..e6b9c14c Binary files /dev/null and b/phsource/r/r@ differ diff --git a/phsource/r/r_ b/phsource/r/r_ new file mode 100644 index 00000000..20c0f060 Binary files /dev/null and b/phsource/r/r_ differ diff --git a/phsource/r/r_sc.wav b/phsource/r/r_sc.wav new file mode 100644 index 00000000..fa18743b Binary files /dev/null and b/phsource/r/r_sc.wav differ diff --git a/phsource/r/ra b/phsource/r/ra new file mode 100644 index 00000000..f1178316 Binary files /dev/null and b/phsource/r/ra differ diff --git a/phsource/r/re b/phsource/r/re new file mode 100644 index 00000000..7c38429d Binary files /dev/null and b/phsource/r/re differ diff --git a/phsource/r/ri b/phsource/r/ri new file mode 100644 index 00000000..ef2535d4 Binary files /dev/null and b/phsource/r/ri differ diff --git a/phsource/r/ro b/phsource/r/ro new file mode 100644 index 00000000..0d5cb0be Binary files /dev/null and b/phsource/r/ro differ diff --git a/phsource/r/rr b/phsource/r/rr new file mode 100644 index 00000000..8e34822c Binary files /dev/null and b/phsource/r/rr differ diff --git a/phsource/r/ru b/phsource/r/ru new file mode 100644 index 00000000..2bf3ab34 Binary files /dev/null and b/phsource/r/ru differ diff --git a/phsource/r/tr b/phsource/r/tr new file mode 100644 index 00000000..d81545e8 Binary files /dev/null and b/phsource/r/tr differ diff --git a/phsource/r/trr b/phsource/r/trr new file mode 100644 index 00000000..38e3fb1e Binary files /dev/null and b/phsource/r/trr differ diff --git a/phsource/r/xr b/phsource/r/xr new file mode 100644 index 00000000..448d32d5 Binary files /dev/null and b/phsource/r/xr differ diff --git a/phsource/r2/_r2 b/phsource/r2/_r2 new file mode 100644 index 00000000..08288fc0 Binary files /dev/null and b/phsource/r2/_r2 differ diff --git a/phsource/r2/r2@ b/phsource/r2/r2@ new file mode 100644 index 00000000..949df71d Binary files /dev/null and b/phsource/r2/r2@ differ diff --git a/phsource/r2/r2a b/phsource/r2/r2a new file mode 100644 index 00000000..e0c1eec1 Binary files /dev/null and b/phsource/r2/r2a differ diff --git a/phsource/r2/r2e b/phsource/r2/r2e new file mode 100644 index 00000000..1ab16adf Binary files /dev/null and b/phsource/r2/r2e differ diff --git a/phsource/r2/r2i b/phsource/r2/r2i new file mode 100644 index 00000000..62e47a67 Binary files /dev/null and b/phsource/r2/r2i differ diff --git a/phsource/r2/r2o b/phsource/r2/r2o new file mode 100644 index 00000000..b89af778 Binary files /dev/null and b/phsource/r2/r2o differ diff --git a/phsource/r2/r2u b/phsource/r2/r2u new file mode 100644 index 00000000..949df71d Binary files /dev/null and b/phsource/r2/r2u differ diff --git a/phsource/r3/@tap b/phsource/r3/@tap new file mode 100644 index 00000000..07ebef58 Binary files /dev/null and b/phsource/r3/@tap differ diff --git a/phsource/r3/@tap_i b/phsource/r3/@tap_i new file mode 100644 index 00000000..64a2e48c Binary files /dev/null and b/phsource/r3/@tap_i differ diff --git a/phsource/r3/r_ b/phsource/r3/r_ new file mode 100644 index 00000000..44f3c0e7 Binary files /dev/null and b/phsource/r3/r_ differ diff --git a/phsource/r3/r_@ b/phsource/r3/r_@ new file mode 100644 index 00000000..9fde980b Binary files /dev/null and b/phsource/r3/r_@ differ diff --git a/phsource/r3/r_a b/phsource/r3/r_a new file mode 100644 index 00000000..59124b90 Binary files /dev/null and b/phsource/r3/r_a differ diff --git a/phsource/r3/r_e b/phsource/r3/r_e new file mode 100644 index 00000000..fe45eaef Binary files /dev/null and b/phsource/r3/r_e differ diff --git a/phsource/r3/r_i b/phsource/r3/r_i new file mode 100644 index 00000000..cfdca2c1 Binary files /dev/null and b/phsource/r3/r_i differ diff --git a/phsource/r3/r_n b/phsource/r3/r_n new file mode 100644 index 00000000..10f35ec9 Binary files /dev/null and b/phsource/r3/r_n differ diff --git a/phsource/r3/r_o b/phsource/r3/r_o new file mode 100644 index 00000000..8cd87740 Binary files /dev/null and b/phsource/r3/r_o differ diff --git a/phsource/r3/r_u b/phsource/r3/r_u new file mode 100644 index 00000000..566f5aaa Binary files /dev/null and b/phsource/r3/r_u differ diff --git a/phsource/r3/rx.wav b/phsource/r3/rx.wav new file mode 100644 index 00000000..845f1e1a Binary files /dev/null and b/phsource/r3/rx.wav differ diff --git a/phsource/ufric/ch.wav b/phsource/ufric/ch.wav new file mode 100644 index 00000000..1d252c4b Binary files /dev/null and b/phsource/ufric/ch.wav differ diff --git a/phsource/ufric/f.wav b/phsource/ufric/f.wav new file mode 100644 index 00000000..08a7d16d Binary files /dev/null and b/phsource/ufric/f.wav differ diff --git a/phsource/ufric/f_.wav b/phsource/ufric/f_.wav new file mode 100644 index 00000000..e7300ccb Binary files /dev/null and b/phsource/ufric/f_.wav differ diff --git a/phsource/ufric/h@.wav b/phsource/ufric/h@.wav new file mode 100644 index 00000000..c851d447 Binary files /dev/null and b/phsource/ufric/h@.wav differ diff --git a/phsource/ufric/h_.wav b/phsource/ufric/h_.wav new file mode 100644 index 00000000..6dbc5ef1 Binary files /dev/null and b/phsource/ufric/h_.wav differ diff --git a/phsource/ufric/ha.wav b/phsource/ufric/ha.wav new file mode 100644 index 00000000..4268dcf9 Binary files /dev/null and b/phsource/ufric/ha.wav differ diff --git a/phsource/ufric/he.wav b/phsource/ufric/he.wav new file mode 100644 index 00000000..4ee15cd5 Binary files /dev/null and b/phsource/ufric/he.wav differ diff --git a/phsource/ufric/hi.wav b/phsource/ufric/hi.wav new file mode 100644 index 00000000..320df58d Binary files /dev/null and b/phsource/ufric/hi.wav differ diff --git a/phsource/ufric/ho.wav b/phsource/ufric/ho.wav new file mode 100644 index 00000000..d75fc9f6 Binary files /dev/null and b/phsource/ufric/ho.wav differ diff --git a/phsource/ufric/hu.wav b/phsource/ufric/hu.wav new file mode 100644 index 00000000..16cc4f8c Binary files /dev/null and b/phsource/ufric/hu.wav differ diff --git a/phsource/ufric/hu_fi-old1.wav b/phsource/ufric/hu_fi-old1.wav new file mode 100644 index 00000000..b1d79eed Binary files /dev/null and b/phsource/ufric/hu_fi-old1.wav differ diff --git a/phsource/ufric/hu_fi.wav b/phsource/ufric/hu_fi.wav new file mode 100644 index 00000000..7c2494bb Binary files /dev/null and b/phsource/ufric/hu_fi.wav differ diff --git a/phsource/ufric/ll.wav b/phsource/ufric/ll.wav new file mode 100644 index 00000000..f4884e8f Binary files /dev/null and b/phsource/ufric/ll.wav differ diff --git a/phsource/ufric/s!.wav b/phsource/ufric/s!.wav new file mode 100644 index 00000000..a6bfa485 Binary files /dev/null and b/phsource/ufric/s!.wav differ diff --git a/phsource/ufric/s.wav b/phsource/ufric/s.wav new file mode 100644 index 00000000..5d41e962 Binary files /dev/null and b/phsource/ufric/s.wav differ diff --git a/phsource/ufric/s_.wav b/phsource/ufric/s_.wav new file mode 100644 index 00000000..b6ab4bf8 Binary files /dev/null and b/phsource/ufric/s_.wav differ diff --git a/phsource/ufric/s_continue.wav b/phsource/ufric/s_continue.wav new file mode 100644 index 00000000..8bca331d Binary files /dev/null and b/phsource/ufric/s_continue.wav differ diff --git a/phsource/ufric/s_pzd.wav b/phsource/ufric/s_pzd.wav new file mode 100644 index 00000000..775aa16c Binary files /dev/null and b/phsource/ufric/s_pzd.wav differ diff --git a/phsource/ufric/sh.wav b/phsource/ufric/sh.wav new file mode 100644 index 00000000..f8a12ee1 Binary files /dev/null and b/phsource/ufric/sh.wav differ diff --git a/phsource/ufric/sh_.wav b/phsource/ufric/sh_.wav new file mode 100644 index 00000000..4f3a2db4 Binary files /dev/null and b/phsource/ufric/sh_.wav differ diff --git a/phsource/ufric/sh_pzd.wav b/phsource/ufric/sh_pzd.wav new file mode 100644 index 00000000..de2e5b6c Binary files /dev/null and b/phsource/ufric/sh_pzd.wav differ diff --git a/phsource/ufric/sh_pzd_.wav b/phsource/ufric/sh_pzd_.wav new file mode 100644 index 00000000..1558ea37 Binary files /dev/null and b/phsource/ufric/sh_pzd_.wav differ diff --git a/phsource/ufric/sx_sv.wav b/phsource/ufric/sx_sv.wav new file mode 100644 index 00000000..f7b1f350 Binary files /dev/null and b/phsource/ufric/sx_sv.wav differ diff --git a/phsource/ufric/sx_sv1.wav b/phsource/ufric/sx_sv1.wav new file mode 100644 index 00000000..0f25ab92 Binary files /dev/null and b/phsource/ufric/sx_sv1.wav differ diff --git a/phsource/ufric/th.wav b/phsource/ufric/th.wav new file mode 100644 index 00000000..78e407aa Binary files /dev/null and b/phsource/ufric/th.wav differ diff --git a/phsource/ufric/th_.wav b/phsource/ufric/th_.wav new file mode 100644 index 00000000..783a1659 Binary files /dev/null and b/phsource/ufric/th_.wav differ diff --git a/phsource/ufric/x.wav b/phsource/ufric/x.wav new file mode 100644 index 00000000..754ed2e3 Binary files /dev/null and b/phsource/ufric/x.wav differ diff --git a/phsource/ufric/x2.wav b/phsource/ufric/x2.wav new file mode 100644 index 00000000..afdb41bb Binary files /dev/null and b/phsource/ufric/x2.wav differ diff --git a/phsource/ufric/xx.wav b/phsource/ufric/xx.wav new file mode 100644 index 00000000..19619856 Binary files /dev/null and b/phsource/ufric/xx.wav differ diff --git a/phsource/ustop/c.wav b/phsource/ustop/c.wav new file mode 100644 index 00000000..dbad1974 Binary files /dev/null and b/phsource/ustop/c.wav differ diff --git a/phsource/ustop/k.wav b/phsource/ustop/k.wav new file mode 100644 index 00000000..406aae9e Binary files /dev/null and b/phsource/ustop/k.wav differ diff --git a/phsource/ustop/k_.wav b/phsource/ustop/k_.wav new file mode 100644 index 00000000..778ce867 Binary files /dev/null and b/phsource/ustop/k_.wav differ diff --git a/phsource/ustop/k_unasp.wav b/phsource/ustop/k_unasp.wav new file mode 100644 index 00000000..9e770f34 Binary files /dev/null and b/phsource/ustop/k_unasp.wav differ diff --git a/phsource/ustop/ki.wav b/phsource/ustop/ki.wav new file mode 100644 index 00000000..41ec6e3b Binary files /dev/null and b/phsource/ustop/ki.wav differ diff --git a/phsource/ustop/kl.wav b/phsource/ustop/kl.wav new file mode 100644 index 00000000..616bfff6 Binary files /dev/null and b/phsource/ustop/kl.wav differ diff --git a/phsource/ustop/kr.wav b/phsource/ustop/kr.wav new file mode 100644 index 00000000..c12fa0c1 Binary files /dev/null and b/phsource/ustop/kr.wav differ diff --git a/phsource/ustop/p.wav b/phsource/ustop/p.wav new file mode 100644 index 00000000..8999a0e3 Binary files /dev/null and b/phsource/ustop/p.wav differ diff --git a/phsource/ustop/p_.wav b/phsource/ustop/p_.wav new file mode 100644 index 00000000..60be864e Binary files /dev/null and b/phsource/ustop/p_.wav differ diff --git a/phsource/ustop/p_unasp.wav b/phsource/ustop/p_unasp.wav new file mode 100644 index 00000000..97e0d443 Binary files /dev/null and b/phsource/ustop/p_unasp.wav differ diff --git a/phsource/ustop/p_unasp_.wav b/phsource/ustop/p_unasp_.wav new file mode 100644 index 00000000..f915c042 Binary files /dev/null and b/phsource/ustop/p_unasp_.wav differ diff --git a/phsource/ustop/percus10.wav b/phsource/ustop/percus10.wav new file mode 100644 index 00000000..04916450 Binary files /dev/null and b/phsource/ustop/percus10.wav differ diff --git a/phsource/ustop/pl.wav b/phsource/ustop/pl.wav new file mode 100644 index 00000000..350710e9 Binary files /dev/null and b/phsource/ustop/pl.wav differ diff --git a/phsource/ustop/pr.wav b/phsource/ustop/pr.wav new file mode 100644 index 00000000..f3ff01dc Binary files /dev/null and b/phsource/ustop/pr.wav differ diff --git a/phsource/ustop/q.wav b/phsource/ustop/q.wav new file mode 100644 index 00000000..b968fa47 Binary files /dev/null and b/phsource/ustop/q.wav differ diff --git a/phsource/ustop/t.wav b/phsource/ustop/t.wav new file mode 100644 index 00000000..310f252e Binary files /dev/null and b/phsource/ustop/t.wav differ diff --git a/phsource/ustop/t_.wav b/phsource/ustop/t_.wav new file mode 100644 index 00000000..05babfa3 Binary files /dev/null and b/phsource/ustop/t_.wav differ diff --git a/phsource/ustop/t_dnt.wav b/phsource/ustop/t_dnt.wav new file mode 100644 index 00000000..3d5f8ff9 Binary files /dev/null and b/phsource/ustop/t_dnt.wav differ diff --git a/phsource/ustop/t_dnt2.wav b/phsource/ustop/t_dnt2.wav new file mode 100644 index 00000000..9fe6297c Binary files /dev/null and b/phsource/ustop/t_dnt2.wav differ diff --git a/phsource/ustop/t_pzd.wav b/phsource/ustop/t_pzd.wav new file mode 100644 index 00000000..25981bdf Binary files /dev/null and b/phsource/ustop/t_pzd.wav differ diff --git a/phsource/ustop/t_short.wav b/phsource/ustop/t_short.wav new file mode 100644 index 00000000..a36f73a8 Binary files /dev/null and b/phsource/ustop/t_short.wav differ diff --git a/phsource/ustop/tr.wav b/phsource/ustop/tr.wav new file mode 100644 index 00000000..4f37f4da Binary files /dev/null and b/phsource/ustop/tr.wav differ diff --git a/phsource/ustop/ts.wav b/phsource/ustop/ts.wav new file mode 100644 index 00000000..62d39a4a Binary files /dev/null and b/phsource/ustop/ts.wav differ diff --git a/phsource/ustop/ts_pzd.wav b/phsource/ustop/ts_pzd.wav new file mode 100644 index 00000000..23e28e89 Binary files /dev/null and b/phsource/ustop/ts_pzd.wav differ diff --git a/phsource/ustop/ts_pzd2.wav b/phsource/ustop/ts_pzd2.wav new file mode 100644 index 00000000..6c176cac Binary files /dev/null and b/phsource/ustop/ts_pzd2.wav differ diff --git a/phsource/ustop/ts_pzd_.wav b/phsource/ustop/ts_pzd_.wav new file mode 100644 index 00000000..c1d7505d Binary files /dev/null and b/phsource/ustop/ts_pzd_.wav differ diff --git a/phsource/ustop/tsh.wav b/phsource/ustop/tsh.wav new file mode 100644 index 00000000..07b20450 Binary files /dev/null and b/phsource/ustop/tsh.wav differ diff --git a/phsource/ustop/tsh_.wav b/phsource/ustop/tsh_.wav new file mode 100644 index 00000000..33dbe45a Binary files /dev/null and b/phsource/ustop/tsh_.wav differ diff --git a/phsource/vdiph/&i b/phsource/vdiph/&i new file mode 100644 index 00000000..fbb3cde1 Binary files /dev/null and b/phsource/vdiph/&i differ diff --git a/phsource/vdiph/&i_2 b/phsource/vdiph/&i_2 new file mode 100644 index 00000000..ac6dc1fc Binary files /dev/null and b/phsource/vdiph/&i_2 differ diff --git a/phsource/vdiph/&i_3 b/phsource/vdiph/&i_3 new file mode 100644 index 00000000..f45d73d7 Binary files /dev/null and b/phsource/vdiph/&i_3 differ diff --git a/phsource/vdiph/&y b/phsource/vdiph/&y new file mode 100644 index 00000000..9857cf41 Binary files /dev/null and b/phsource/vdiph/&y differ diff --git a/phsource/vdiph/0i b/phsource/vdiph/0i new file mode 100644 index 00000000..c27b749c Binary files /dev/null and b/phsource/vdiph/0i differ diff --git a/phsource/vdiph/0i_2 b/phsource/vdiph/0i_2 new file mode 100644 index 00000000..8f7982a0 Binary files /dev/null and b/phsource/vdiph/0i_2 differ diff --git a/phsource/vdiph/@i b/phsource/vdiph/@i new file mode 100644 index 00000000..041d085f Binary files /dev/null and b/phsource/vdiph/@i differ diff --git a/phsource/vdiph/@i_2 b/phsource/vdiph/@i_2 new file mode 100644 index 00000000..32326697 Binary files /dev/null and b/phsource/vdiph/@i_2 differ diff --git a/phsource/vdiph/@i_3 b/phsource/vdiph/@i_3 new file mode 100644 index 00000000..5743fb8d Binary files /dev/null and b/phsource/vdiph/@i_3 differ diff --git a/phsource/vdiph/@i_4 b/phsource/vdiph/@i_4 new file mode 100644 index 00000000..1f652e77 Binary files /dev/null and b/phsource/vdiph/@i_4 differ diff --git a/phsource/vdiph/@u b/phsource/vdiph/@u new file mode 100644 index 00000000..ad6df487 Binary files /dev/null and b/phsource/vdiph/@u differ diff --git a/phsource/vdiph/@u_2 b/phsource/vdiph/@u_2 new file mode 100644 index 00000000..f02ebafd Binary files /dev/null and b/phsource/vdiph/@u_2 differ diff --git a/phsource/vdiph/@u_3 b/phsource/vdiph/@u_3 new file mode 100644 index 00000000..2fefaa1e Binary files /dev/null and b/phsource/vdiph/@u_3 differ diff --git a/phsource/vdiph/@u_en b/phsource/vdiph/@u_en new file mode 100644 index 00000000..7856edde Binary files /dev/null and b/phsource/vdiph/@u_en differ diff --git a/phsource/vdiph/Vi b/phsource/vdiph/Vi new file mode 100644 index 00000000..325da337 Binary files /dev/null and b/phsource/vdiph/Vi differ diff --git a/phsource/vdiph/Vo b/phsource/vdiph/Vo new file mode 100644 index 00000000..091a52c6 Binary files /dev/null and b/phsource/vdiph/Vo differ diff --git a/phsource/vdiph/Vu b/phsource/vdiph/Vu new file mode 100644 index 00000000..0dd402b5 Binary files /dev/null and b/phsource/vdiph/Vu differ diff --git a/phsource/vdiph/Vu_2 b/phsource/vdiph/Vu_2 new file mode 100644 index 00000000..fa8ffce6 Binary files /dev/null and b/phsource/vdiph/Vu_2 differ diff --git a/phsource/vdiph/Vu_3 b/phsource/vdiph/Vu_3 new file mode 100644 index 00000000..824c68a7 Binary files /dev/null and b/phsource/vdiph/Vu_3 differ diff --git a/phsource/vdiph/aai b/phsource/vdiph/aai new file mode 100644 index 00000000..58b8c054 Binary files /dev/null and b/phsource/vdiph/aai differ diff --git a/phsource/vdiph/aai_2 b/phsource/vdiph/aai_2 new file mode 100644 index 00000000..13672373 Binary files /dev/null and b/phsource/vdiph/aai_2 differ diff --git a/phsource/vdiph/aai_3 b/phsource/vdiph/aai_3 new file mode 100644 index 00000000..78968f0f Binary files /dev/null and b/phsource/vdiph/aai_3 differ diff --git a/phsource/vdiph/aaoo b/phsource/vdiph/aaoo new file mode 100644 index 00000000..fdc5fb33 Binary files /dev/null and b/phsource/vdiph/aaoo differ diff --git a/phsource/vdiph/aau b/phsource/vdiph/aau new file mode 100644 index 00000000..f30e22a4 Binary files /dev/null and b/phsource/vdiph/aau differ diff --git a/phsource/vdiph/aau_2 b/phsource/vdiph/aau_2 new file mode 100644 index 00000000..75f0c0b7 Binary files /dev/null and b/phsource/vdiph/aau_2 differ diff --git a/phsource/vdiph/aau_3 b/phsource/vdiph/aau_3 new file mode 100644 index 00000000..0ff75071 Binary files /dev/null and b/phsource/vdiph/aau_3 differ diff --git a/phsource/vdiph/aau_4 b/phsource/vdiph/aau_4 new file mode 100644 index 00000000..99b29454 Binary files /dev/null and b/phsource/vdiph/aau_4 differ diff --git a/phsource/vdiph/ae b/phsource/vdiph/ae new file mode 100644 index 00000000..90be5957 Binary files /dev/null and b/phsource/vdiph/ae differ diff --git a/phsource/vdiph/ae_2 b/phsource/vdiph/ae_2 new file mode 100644 index 00000000..dbfa3f12 Binary files /dev/null and b/phsource/vdiph/ae_2 differ diff --git a/phsource/vdiph/ai b/phsource/vdiph/ai new file mode 100644 index 00000000..1767f64d Binary files /dev/null and b/phsource/vdiph/ai differ diff --git a/phsource/vdiph/ai_2 b/phsource/vdiph/ai_2 new file mode 100644 index 00000000..c91a4d6d Binary files /dev/null and b/phsource/vdiph/ai_2 differ diff --git a/phsource/vdiph/ai_3 b/phsource/vdiph/ai_3 new file mode 100644 index 00000000..0b257004 Binary files /dev/null and b/phsource/vdiph/ai_3 differ diff --git a/phsource/vdiph/ai_4 b/phsource/vdiph/ai_4 new file mode 100644 index 00000000..a75cadb4 Binary files /dev/null and b/phsource/vdiph/ai_4 differ diff --git a/phsource/vdiph/ai_5 b/phsource/vdiph/ai_5 new file mode 100644 index 00000000..f1efddaf Binary files /dev/null and b/phsource/vdiph/ai_5 differ diff --git a/phsource/vdiph/ai_6 b/phsource/vdiph/ai_6 new file mode 100644 index 00000000..0106397d Binary files /dev/null and b/phsource/vdiph/ai_6 differ diff --git a/phsource/vdiph/ai_7 b/phsource/vdiph/ai_7 new file mode 100644 index 00000000..1e72614f Binary files /dev/null and b/phsource/vdiph/ai_7 differ diff --git a/phsource/vdiph/ai_en b/phsource/vdiph/ai_en new file mode 100644 index 00000000..28a8bb3c Binary files /dev/null and b/phsource/vdiph/ai_en differ diff --git a/phsource/vdiph/au b/phsource/vdiph/au new file mode 100644 index 00000000..5ea097eb Binary files /dev/null and b/phsource/vdiph/au differ diff --git a/phsource/vdiph/au# b/phsource/vdiph/au# new file mode 100644 index 00000000..232b7bf0 Binary files /dev/null and b/phsource/vdiph/au# differ diff --git a/phsource/vdiph/au_2 b/phsource/vdiph/au_2 new file mode 100644 index 00000000..20d82fd8 Binary files /dev/null and b/phsource/vdiph/au_2 differ diff --git a/phsource/vdiph/au_3 b/phsource/vdiph/au_3 new file mode 100644 index 00000000..9a84fb3d Binary files /dev/null and b/phsource/vdiph/au_3 differ diff --git a/phsource/vdiph/au_4 b/phsource/vdiph/au_4 new file mode 100644 index 00000000..1ff14d02 Binary files /dev/null and b/phsource/vdiph/au_4 differ diff --git a/phsource/vdiph/ee-e b/phsource/vdiph/ee-e new file mode 100644 index 00000000..00897d8a Binary files /dev/null and b/phsource/vdiph/ee-e differ diff --git a/phsource/vdiph/eei b/phsource/vdiph/eei new file mode 100644 index 00000000..8d0b4b61 Binary files /dev/null and b/phsource/vdiph/eei differ diff --git a/phsource/vdiph/eei_2 b/phsource/vdiph/eei_2 new file mode 100644 index 00000000..e2da21fb Binary files /dev/null and b/phsource/vdiph/eei_2 differ diff --git a/phsource/vdiph/eei_3 b/phsource/vdiph/eei_3 new file mode 100644 index 00000000..6a1d9e32 Binary files /dev/null and b/phsource/vdiph/eei_3 differ diff --git a/phsource/vdiph/eei_4 b/phsource/vdiph/eei_4 new file mode 100644 index 00000000..e0d0c150 Binary files /dev/null and b/phsource/vdiph/eei_4 differ diff --git a/phsource/vdiph/eeu b/phsource/vdiph/eeu new file mode 100644 index 00000000..41958baf Binary files /dev/null and b/phsource/vdiph/eeu differ diff --git a/phsource/vdiph/eeu_2 b/phsource/vdiph/eeu_2 new file mode 100644 index 00000000..2cd18ad5 Binary files /dev/null and b/phsource/vdiph/eeu_2 differ diff --git a/phsource/vdiph/eeu_3 b/phsource/vdiph/eeu_3 new file mode 100644 index 00000000..3f72a1c7 Binary files /dev/null and b/phsource/vdiph/eeu_3 differ diff --git a/phsource/vdiph/eey b/phsource/vdiph/eey new file mode 100644 index 00000000..2ff7a367 Binary files /dev/null and b/phsource/vdiph/eey differ diff --git a/phsource/vdiph/ei b/phsource/vdiph/ei new file mode 100644 index 00000000..6154eb5d Binary files /dev/null and b/phsource/vdiph/ei differ diff --git a/phsource/vdiph/eu b/phsource/vdiph/eu new file mode 100644 index 00000000..85157cc2 Binary files /dev/null and b/phsource/vdiph/eu differ diff --git a/phsource/vdiph/eu_2 b/phsource/vdiph/eu_2 new file mode 100644 index 00000000..30b54be7 Binary files /dev/null and b/phsource/vdiph/eu_2 differ diff --git a/phsource/vdiph/i#i b/phsource/vdiph/i#i new file mode 100644 index 00000000..24e4b165 Binary files /dev/null and b/phsource/vdiph/i#i differ diff --git a/phsource/vdiph/i@_2 b/phsource/vdiph/i@_2 new file mode 100644 index 00000000..9c66c828 Binary files /dev/null and b/phsource/vdiph/i@_2 differ diff --git a/phsource/vdiph/ii b/phsource/vdiph/ii new file mode 100644 index 00000000..8c7cd4c7 Binary files /dev/null and b/phsource/vdiph/ii differ diff --git a/phsource/vdiph/oi b/phsource/vdiph/oi new file mode 100644 index 00000000..ea7b5b26 Binary files /dev/null and b/phsource/vdiph/oi differ diff --git a/phsource/vdiph/oi_2 b/phsource/vdiph/oi_2 new file mode 100644 index 00000000..31ff7810 Binary files /dev/null and b/phsource/vdiph/oi_2 differ diff --git a/phsource/vdiph/ooi b/phsource/vdiph/ooi new file mode 100644 index 00000000..c378bd6d Binary files /dev/null and b/phsource/vdiph/ooi differ diff --git a/phsource/vdiph/ooi_2 b/phsource/vdiph/ooi_2 new file mode 100644 index 00000000..46bc6b8a Binary files /dev/null and b/phsource/vdiph/ooi_2 differ diff --git a/phsource/vdiph/ooi_3 b/phsource/vdiph/ooi_3 new file mode 100644 index 00000000..4bbc5586 Binary files /dev/null and b/phsource/vdiph/ooi_3 differ diff --git a/phsource/vdiph/ou b/phsource/vdiph/ou new file mode 100644 index 00000000..db264585 Binary files /dev/null and b/phsource/vdiph/ou differ diff --git a/phsource/vdiph/ou_2 b/phsource/vdiph/ou_2 new file mode 100644 index 00000000..36208f13 Binary files /dev/null and b/phsource/vdiph/ou_2 differ diff --git a/phsource/vdiph/u-i b/phsource/vdiph/u-i new file mode 100644 index 00000000..15c338e7 Binary files /dev/null and b/phsource/vdiph/u-i differ diff --git a/phsource/vdiph/ui b/phsource/vdiph/ui new file mode 100644 index 00000000..b2d4a799 Binary files /dev/null and b/phsource/vdiph/ui differ diff --git a/phsource/vdiph/ui_2 b/phsource/vdiph/ui_2 new file mode 100644 index 00000000..fe5f7580 Binary files /dev/null and b/phsource/vdiph/ui_2 differ diff --git a/phsource/vdiph/ui_3 b/phsource/vdiph/ui_3 new file mode 100644 index 00000000..933f2695 Binary files /dev/null and b/phsource/vdiph/ui_3 differ diff --git a/phsource/vdiph/vowelchart.png b/phsource/vdiph/vowelchart.png new file mode 100644 index 00000000..26872318 Binary files /dev/null and b/phsource/vdiph/vowelchart.png differ diff --git a/phsource/vdiph/y#i b/phsource/vdiph/y#i new file mode 100644 index 00000000..faf027f7 Binary files /dev/null and b/phsource/vdiph/y#i differ diff --git a/phsource/vdiph/y#y b/phsource/vdiph/y#y new file mode 100644 index 00000000..8bbb3d32 Binary files /dev/null and b/phsource/vdiph/y#y differ diff --git a/phsource/vdiph/y#y_2 b/phsource/vdiph/y#y_2 new file mode 100644 index 00000000..17df44a3 Binary files /dev/null and b/phsource/vdiph/y#y_2 differ diff --git a/phsource/vdiph/y#y_3 b/phsource/vdiph/y#y_3 new file mode 100644 index 00000000..1b2e20c7 Binary files /dev/null and b/phsource/vdiph/y#y_3 differ diff --git a/phsource/vdiph/yi b/phsource/vdiph/yi new file mode 100644 index 00000000..e3abc3e1 Binary files /dev/null and b/phsource/vdiph/yi differ diff --git a/phsource/vdiph/yi_fr b/phsource/vdiph/yi_fr new file mode 100644 index 00000000..edf2bfcb Binary files /dev/null and b/phsource/vdiph/yi_fr differ diff --git a/phsource/vdiph2/e@ b/phsource/vdiph2/e@ new file mode 100644 index 00000000..c82da06b Binary files /dev/null and b/phsource/vdiph2/e@ differ diff --git a/phsource/vdiph2/e[u b/phsource/vdiph2/e[u new file mode 100644 index 00000000..b3dd9256 Binary files /dev/null and b/phsource/vdiph2/e[u differ diff --git a/phsource/vdiph2/ea b/phsource/vdiph2/ea new file mode 100644 index 00000000..7c5e1687 Binary files /dev/null and b/phsource/vdiph2/ea differ diff --git a/phsource/vdiph2/eo b/phsource/vdiph2/eo new file mode 100644 index 00000000..db531e27 Binary files /dev/null and b/phsource/vdiph2/eo differ diff --git a/phsource/vdiph2/i@ b/phsource/vdiph2/i@ new file mode 100644 index 00000000..a0a5af63 Binary files /dev/null and b/phsource/vdiph2/i@ differ diff --git a/phsource/vdiph2/i@_2 b/phsource/vdiph2/i@_2 new file mode 100644 index 00000000..f0e958b6 Binary files /dev/null and b/phsource/vdiph2/i@_2 differ diff --git a/phsource/vdiph2/ie b/phsource/vdiph2/ie new file mode 100644 index 00000000..abf3b96a Binary files /dev/null and b/phsource/vdiph2/ie differ diff --git a/phsource/vdiph2/ii@ b/phsource/vdiph2/ii@ new file mode 100644 index 00000000..80294433 Binary files /dev/null and b/phsource/vdiph2/ii@ differ diff --git a/phsource/vdiph2/ii@_2 b/phsource/vdiph2/ii@_2 new file mode 100644 index 00000000..8023ab50 Binary files /dev/null and b/phsource/vdiph2/ii@_2 differ diff --git a/phsource/vdiph2/ii@_3 b/phsource/vdiph2/ii@_3 new file mode 100644 index 00000000..e297d3e9 Binary files /dev/null and b/phsource/vdiph2/ii@_3 differ diff --git a/phsource/vdiph2/iioo b/phsource/vdiph2/iioo new file mode 100644 index 00000000..eb208b88 Binary files /dev/null and b/phsource/vdiph2/iioo differ diff --git a/phsource/vdiph2/iu b/phsource/vdiph2/iu new file mode 100644 index 00000000..2cf074cf Binary files /dev/null and b/phsource/vdiph2/iu differ diff --git a/phsource/vdiph2/iu_2 b/phsource/vdiph2/iu_2 new file mode 100644 index 00000000..512e0d47 Binary files /dev/null and b/phsource/vdiph2/iu_2 differ diff --git a/phsource/vdiph2/iu_3 b/phsource/vdiph2/iu_3 new file mode 100644 index 00000000..866591cb Binary files /dev/null and b/phsource/vdiph2/iu_3 differ diff --git a/phsource/vdiph2/iu_4 b/phsource/vdiph2/iu_4 new file mode 100644 index 00000000..b2bc2cf2 Binary files /dev/null and b/phsource/vdiph2/iu_4 differ diff --git a/phsource/vdiph2/iy b/phsource/vdiph2/iy new file mode 100644 index 00000000..2e645b1b Binary files /dev/null and b/phsource/vdiph2/iy differ diff --git a/phsource/vdiph2/o@ b/phsource/vdiph2/o@ new file mode 100644 index 00000000..cbebb3a4 Binary files /dev/null and b/phsource/vdiph2/o@ differ diff --git a/phsource/vdiph2/oa b/phsource/vdiph2/oa new file mode 100644 index 00000000..7c8475f5 Binary files /dev/null and b/phsource/vdiph2/oa differ diff --git a/phsource/vdiph2/u#@ b/phsource/vdiph2/u#@ new file mode 100644 index 00000000..cf4a445b Binary files /dev/null and b/phsource/vdiph2/u#@ differ diff --git a/phsource/vdiph2/u-@ b/phsource/vdiph2/u-@ new file mode 100644 index 00000000..8a5f54ef Binary files /dev/null and b/phsource/vdiph2/u-@ differ diff --git a/phsource/vdiph2/uo b/phsource/vdiph2/uo new file mode 100644 index 00000000..d1885339 Binary files /dev/null and b/phsource/vdiph2/uo differ diff --git a/phsource/vdiph2/uu@ b/phsource/vdiph2/uu@ new file mode 100644 index 00000000..d28d4cde Binary files /dev/null and b/phsource/vdiph2/uu@ differ diff --git a/phsource/vdiph2/vowelchart.png b/phsource/vdiph2/vowelchart.png new file mode 100644 index 00000000..ed4cf49d Binary files /dev/null and b/phsource/vdiph2/vowelchart.png differ diff --git a/phsource/vdiph2/y#@ b/phsource/vdiph2/y#@ new file mode 100644 index 00000000..4360523c Binary files /dev/null and b/phsource/vdiph2/y#@ differ diff --git a/phsource/vdiph2/y-y# b/phsource/vdiph2/y-y# new file mode 100644 index 00000000..8df0014d Binary files /dev/null and b/phsource/vdiph2/y-y# differ diff --git a/phsource/vdiph2/yu b/phsource/vdiph2/yu new file mode 100644 index 00000000..0e477350 Binary files /dev/null and b/phsource/vdiph2/yu differ diff --git a/phsource/vnasal/&_n b/phsource/vnasal/&_n new file mode 100644 index 00000000..3b008b00 Binary files /dev/null and b/phsource/vnasal/&_n differ diff --git a/phsource/vnasal/&u_n b/phsource/vnasal/&u_n new file mode 100644 index 00000000..d9f98de1 Binary files /dev/null and b/phsource/vnasal/&u_n differ diff --git a/phsource/vnasal/W_n b/phsource/vnasal/W_n new file mode 100644 index 00000000..b6ba2a33 Binary files /dev/null and b/phsource/vnasal/W_n differ diff --git a/phsource/vnasal/aa_n b/phsource/vnasal/aa_n new file mode 100644 index 00000000..8b59e9e9 Binary files /dev/null and b/phsource/vnasal/aa_n differ diff --git a/phsource/vnasal/aa_n2 b/phsource/vnasal/aa_n2 new file mode 100644 index 00000000..ac924c6a Binary files /dev/null and b/phsource/vnasal/aa_n2 differ diff --git a/phsource/vnasal/aa_n3 b/phsource/vnasal/aa_n3 new file mode 100644 index 00000000..027ae769 Binary files /dev/null and b/phsource/vnasal/aa_n3 differ diff --git a/phsource/vnasal/e_n b/phsource/vnasal/e_n new file mode 100644 index 00000000..74577c13 Binary files /dev/null and b/phsource/vnasal/e_n differ diff --git a/phsource/vnasal/ee_n b/phsource/vnasal/ee_n new file mode 100644 index 00000000..90b6f0ee Binary files /dev/null and b/phsource/vnasal/ee_n differ diff --git a/phsource/vnasal/ee_n2 b/phsource/vnasal/ee_n2 new file mode 100644 index 00000000..4ac4dd22 Binary files /dev/null and b/phsource/vnasal/ee_n2 differ diff --git a/phsource/vnasal/i_n b/phsource/vnasal/i_n new file mode 100644 index 00000000..7d3471e8 Binary files /dev/null and b/phsource/vnasal/i_n differ diff --git a/phsource/vnasal/m- b/phsource/vnasal/m- new file mode 100644 index 00000000..91385773 Binary files /dev/null and b/phsource/vnasal/m- differ diff --git a/phsource/vnasal/n- b/phsource/vnasal/n- new file mode 100644 index 00000000..c7d5e7e8 Binary files /dev/null and b/phsource/vnasal/n- differ diff --git a/phsource/vnasal/nn- b/phsource/vnasal/nn- new file mode 100644 index 00000000..12b0b08c Binary files /dev/null and b/phsource/vnasal/nn- differ diff --git a/phsource/vnasal/o_n b/phsource/vnasal/o_n new file mode 100644 index 00000000..69a5e493 Binary files /dev/null and b/phsource/vnasal/o_n differ diff --git a/phsource/vnasal/o_n2 b/phsource/vnasal/o_n2 new file mode 100644 index 00000000..358ffdef Binary files /dev/null and b/phsource/vnasal/o_n2 differ diff --git a/phsource/vnasal/oi_n b/phsource/vnasal/oi_n new file mode 100644 index 00000000..5e804f7c Binary files /dev/null and b/phsource/vnasal/oi_n differ diff --git a/phsource/vnasal/oo_n b/phsource/vnasal/oo_n new file mode 100644 index 00000000..e94b5b37 Binary files /dev/null and b/phsource/vnasal/oo_n differ diff --git a/phsource/vnasal/oo_n2 b/phsource/vnasal/oo_n2 new file mode 100644 index 00000000..8c918297 Binary files /dev/null and b/phsource/vnasal/oo_n2 differ diff --git a/phsource/vnasal/uI_n b/phsource/vnasal/uI_n new file mode 100644 index 00000000..e467f008 Binary files /dev/null and b/phsource/vnasal/uI_n differ diff --git a/phsource/vnasal/u_n b/phsource/vnasal/u_n new file mode 100644 index 00000000..6284f676 Binary files /dev/null and b/phsource/vnasal/u_n differ diff --git a/phsource/vnasal/vowelchart.png b/phsource/vnasal/vowelchart.png new file mode 100644 index 00000000..d3964727 Binary files /dev/null and b/phsource/vnasal/vowelchart.png differ diff --git a/phsource/voc/Q b/phsource/voc/Q new file mode 100644 index 00000000..7fd8f235 Binary files /dev/null and b/phsource/voc/Q differ diff --git a/phsource/voc/Q_ b/phsource/voc/Q_ new file mode 100644 index 00000000..25851c5f Binary files /dev/null and b/phsource/voc/Q_ differ diff --git a/phsource/voc/Q_less b/phsource/voc/Q_less new file mode 100644 index 00000000..28010bd8 Binary files /dev/null and b/phsource/voc/Q_less differ diff --git a/phsource/voc/Q_less2 b/phsource/voc/Q_less2 new file mode 100644 index 00000000..d28cad6d Binary files /dev/null and b/phsource/voc/Q_less2 differ diff --git a/phsource/voc/bh b/phsource/voc/bh new file mode 100644 index 00000000..c6c773b6 Binary files /dev/null and b/phsource/voc/bh differ diff --git a/phsource/voc/dh b/phsource/voc/dh new file mode 100644 index 00000000..0b34b3f1 Binary files /dev/null and b/phsource/voc/dh differ diff --git a/phsource/voc/dh_ b/phsource/voc/dh_ new file mode 100644 index 00000000..e32347b9 Binary files /dev/null and b/phsource/voc/dh_ differ diff --git a/phsource/voc/v b/phsource/voc/v new file mode 100644 index 00000000..e4a9570c Binary files /dev/null and b/phsource/voc/v differ diff --git a/phsource/voc/v_ b/phsource/voc/v_ new file mode 100644 index 00000000..532650c0 Binary files /dev/null and b/phsource/voc/v_ differ diff --git a/phsource/voc/z b/phsource/voc/z new file mode 100644 index 00000000..528967f3 Binary files /dev/null and b/phsource/voc/z differ diff --git a/phsource/voc/z_ b/phsource/voc/z_ new file mode 100644 index 00000000..f9710b8e Binary files /dev/null and b/phsource/voc/z_ differ diff --git a/phsource/voc/z_pzd b/phsource/voc/z_pzd new file mode 100644 index 00000000..a573abe3 Binary files /dev/null and b/phsource/voc/z_pzd differ diff --git a/phsource/voc/z_pzd_ b/phsource/voc/z_pzd_ new file mode 100644 index 00000000..ac3c3746 Binary files /dev/null and b/phsource/voc/z_pzd_ differ diff --git a/phsource/voc/zh b/phsource/voc/zh new file mode 100644 index 00000000..8db5bb7b Binary files /dev/null and b/phsource/voc/zh differ diff --git a/phsource/voc/zh_ b/phsource/voc/zh_ new file mode 100644 index 00000000..43ce5b60 Binary files /dev/null and b/phsource/voc/zh_ differ diff --git a/phsource/voc/zh_2 b/phsource/voc/zh_2 new file mode 100644 index 00000000..72c6bdfb Binary files /dev/null and b/phsource/voc/zh_2 differ diff --git a/phsource/vocw/Q.wav b/phsource/vocw/Q.wav new file mode 100644 index 00000000..d1ba84fc Binary files /dev/null and b/phsource/vocw/Q.wav differ diff --git a/phsource/vocw/Q2.wav b/phsource/vocw/Q2.wav new file mode 100644 index 00000000..35331407 Binary files /dev/null and b/phsource/vocw/Q2.wav differ diff --git a/phsource/vocw/Q_.wav b/phsource/vocw/Q_.wav new file mode 100644 index 00000000..e770c21c Binary files /dev/null and b/phsource/vocw/Q_.wav differ diff --git a/phsource/vocw/dh.wav b/phsource/vocw/dh.wav new file mode 100644 index 00000000..7454746b Binary files /dev/null and b/phsource/vocw/dh.wav differ diff --git a/phsource/vocw/v.wav b/phsource/vocw/v.wav new file mode 100644 index 00000000..ddf0dd77 Binary files /dev/null and b/phsource/vocw/v.wav differ diff --git a/phsource/vocw/x.wav b/phsource/vocw/x.wav new file mode 100644 index 00000000..754ed2e3 Binary files /dev/null and b/phsource/vocw/x.wav differ diff --git a/phsource/vocw/zh.wav b/phsource/vocw/zh.wav new file mode 100644 index 00000000..b3d557c4 Binary files /dev/null and b/phsource/vocw/zh.wav differ diff --git a/phsource/vocw/zh_rfx.wav b/phsource/vocw/zh_rfx.wav new file mode 100644 index 00000000..f39f19b2 Binary files /dev/null and b/phsource/vocw/zh_rfx.wav differ diff --git a/phsource/vowel/& b/phsource/vowel/& new file mode 100644 index 00000000..9cd2844a Binary files /dev/null and b/phsource/vowel/& differ diff --git a/phsource/vowel/&_2 b/phsource/vowel/&_2 new file mode 100644 index 00000000..a383d49e Binary files /dev/null and b/phsource/vowel/&_2 differ diff --git a/phsource/vowel/0 b/phsource/vowel/0 new file mode 100644 index 00000000..5a8eb469 Binary files /dev/null and b/phsource/vowel/0 differ diff --git a/phsource/vowel/0_2 b/phsource/vowel/0_2 new file mode 100644 index 00000000..f98aeb59 Binary files /dev/null and b/phsource/vowel/0_2 differ diff --git a/phsource/vowel/0_3 b/phsource/vowel/0_3 new file mode 100644 index 00000000..d92c8f35 Binary files /dev/null and b/phsource/vowel/0_3 differ diff --git a/phsource/vowel/3_2 b/phsource/vowel/3_2 new file mode 100644 index 00000000..35ff3622 Binary files /dev/null and b/phsource/vowel/3_2 differ diff --git a/phsource/vowel/3_3 b/phsource/vowel/3_3 new file mode 100644 index 00000000..6118e049 Binary files /dev/null and b/phsource/vowel/3_3 differ diff --git a/phsource/vowel/3_en b/phsource/vowel/3_en new file mode 100644 index 00000000..3fbfe721 Binary files /dev/null and b/phsource/vowel/3_en differ diff --git a/phsource/vowel/8 b/phsource/vowel/8 new file mode 100644 index 00000000..06461304 Binary files /dev/null and b/phsource/vowel/8 differ diff --git a/phsource/vowel/8_2 b/phsource/vowel/8_2 new file mode 100644 index 00000000..900e9e2b Binary files /dev/null and b/phsource/vowel/8_2 differ diff --git a/phsource/vowel/8_3 b/phsource/vowel/8_3 new file mode 100644 index 00000000..1624be36 Binary files /dev/null and b/phsource/vowel/8_3 differ diff --git a/phsource/vowel/8_4 b/phsource/vowel/8_4 new file mode 100644 index 00000000..c603e42c Binary files /dev/null and b/phsource/vowel/8_4 differ diff --git a/phsource/vowel/@ b/phsource/vowel/@ new file mode 100644 index 00000000..9978716c Binary files /dev/null and b/phsource/vowel/@ differ diff --git a/phsource/vowel/@- b/phsource/vowel/@- new file mode 100644 index 00000000..a808e232 Binary files /dev/null and b/phsource/vowel/@- differ diff --git a/phsource/vowel/@_2 b/phsource/vowel/@_2 new file mode 100644 index 00000000..e48e29a6 Binary files /dev/null and b/phsource/vowel/@_2 differ diff --git a/phsource/vowel/@_3 b/phsource/vowel/@_3 new file mode 100644 index 00000000..40d82c36 Binary files /dev/null and b/phsource/vowel/@_3 differ diff --git a/phsource/vowel/@_4 b/phsource/vowel/@_4 new file mode 100644 index 00000000..d03126f0 Binary files /dev/null and b/phsource/vowel/@_4 differ diff --git a/phsource/vowel/@_bck b/phsource/vowel/@_bck new file mode 100644 index 00000000..67baa0fa Binary files /dev/null and b/phsource/vowel/@_bck differ diff --git a/phsource/vowel/@_fnt b/phsource/vowel/@_fnt new file mode 100644 index 00000000..ce8bfdfb Binary files /dev/null and b/phsource/vowel/@_fnt differ diff --git a/phsource/vowel/@_fr b/phsource/vowel/@_fr new file mode 100644 index 00000000..6e59abbf Binary files /dev/null and b/phsource/vowel/@_fr differ diff --git a/phsource/vowel/@_hgh b/phsource/vowel/@_hgh new file mode 100644 index 00000000..dd4ad1bb Binary files /dev/null and b/phsource/vowel/@_hgh differ diff --git a/phsource/vowel/@_low b/phsource/vowel/@_low new file mode 100644 index 00000000..0a9fd997 Binary files /dev/null and b/phsource/vowel/@_low differ diff --git a/phsource/vowel/V b/phsource/vowel/V new file mode 100644 index 00000000..de4b2e20 Binary files /dev/null and b/phsource/vowel/V differ diff --git a/phsource/vowel/V_2 b/phsource/vowel/V_2 new file mode 100644 index 00000000..d637987d Binary files /dev/null and b/phsource/vowel/V_2 differ diff --git a/phsource/vowel/V_3 b/phsource/vowel/V_3 new file mode 100644 index 00000000..073555a2 Binary files /dev/null and b/phsource/vowel/V_3 differ diff --git a/phsource/vowel/V_4 b/phsource/vowel/V_4 new file mode 100644 index 00000000..e524e487 Binary files /dev/null and b/phsource/vowel/V_4 differ diff --git a/phsource/vowel/a b/phsource/vowel/a new file mode 100644 index 00000000..f865a79c Binary files /dev/null and b/phsource/vowel/a differ diff --git a/phsource/vowel/a# b/phsource/vowel/a# new file mode 100644 index 00000000..d3c89723 Binary files /dev/null and b/phsource/vowel/a# differ diff --git a/phsource/vowel/a#_2 b/phsource/vowel/a#_2 new file mode 100644 index 00000000..c163a58c Binary files /dev/null and b/phsource/vowel/a#_2 differ diff --git a/phsource/vowel/a#_3 b/phsource/vowel/a#_3 new file mode 100644 index 00000000..8870918e Binary files /dev/null and b/phsource/vowel/a#_3 differ diff --git a/phsource/vowel/a_2 b/phsource/vowel/a_2 new file mode 100644 index 00000000..3d157bb8 Binary files /dev/null and b/phsource/vowel/a_2 differ diff --git a/phsource/vowel/a_3 b/phsource/vowel/a_3 new file mode 100644 index 00000000..96d81019 Binary files /dev/null and b/phsource/vowel/a_3 differ diff --git a/phsource/vowel/a_4 b/phsource/vowel/a_4 new file mode 100644 index 00000000..e62c0e7e Binary files /dev/null and b/phsource/vowel/a_4 differ diff --git a/phsource/vowel/a_5 b/phsource/vowel/a_5 new file mode 100644 index 00000000..bd853c60 Binary files /dev/null and b/phsource/vowel/a_5 differ diff --git a/phsource/vowel/a_en b/phsource/vowel/a_en new file mode 100644 index 00000000..1fa61373 Binary files /dev/null and b/phsource/vowel/a_en differ diff --git a/phsource/vowel/aa b/phsource/vowel/aa new file mode 100644 index 00000000..28d26b1d Binary files /dev/null and b/phsource/vowel/aa differ diff --git a/phsource/vowel/aa# b/phsource/vowel/aa# new file mode 100644 index 00000000..bc4d3646 Binary files /dev/null and b/phsource/vowel/aa# differ diff --git a/phsource/vowel/aa_2 b/phsource/vowel/aa_2 new file mode 100644 index 00000000..e6a81d97 Binary files /dev/null and b/phsource/vowel/aa_2 differ diff --git a/phsource/vowel/aa_3 b/phsource/vowel/aa_3 new file mode 100644 index 00000000..994aaa6c Binary files /dev/null and b/phsource/vowel/aa_3 differ diff --git a/phsource/vowel/aa_4 b/phsource/vowel/aa_4 new file mode 100644 index 00000000..6c003cf0 Binary files /dev/null and b/phsource/vowel/aa_4 differ diff --git a/phsource/vowel/aa_5 b/phsource/vowel/aa_5 new file mode 100644 index 00000000..895df7cd Binary files /dev/null and b/phsource/vowel/aa_5 differ diff --git a/phsource/vowel/aa_6 b/phsource/vowel/aa_6 new file mode 100644 index 00000000..d9985896 Binary files /dev/null and b/phsource/vowel/aa_6 differ diff --git a/phsource/vowel/aa_7 b/phsource/vowel/aa_7 new file mode 100644 index 00000000..dbd22415 Binary files /dev/null and b/phsource/vowel/aa_7 differ diff --git a/phsource/vowel/e b/phsource/vowel/e new file mode 100644 index 00000000..8780ac2a Binary files /dev/null and b/phsource/vowel/e differ diff --git a/phsource/vowel/e# b/phsource/vowel/e# new file mode 100644 index 00000000..d894c601 Binary files /dev/null and b/phsource/vowel/e# differ diff --git a/phsource/vowel/e_2 b/phsource/vowel/e_2 new file mode 100644 index 00000000..e8190d0a Binary files /dev/null and b/phsource/vowel/e_2 differ diff --git a/phsource/vowel/e_3 b/phsource/vowel/e_3 new file mode 100644 index 00000000..455d1314 Binary files /dev/null and b/phsource/vowel/e_3 differ diff --git a/phsource/vowel/e_4 b/phsource/vowel/e_4 new file mode 100644 index 00000000..e5094c3b Binary files /dev/null and b/phsource/vowel/e_4 differ diff --git a/phsource/vowel/e_5 b/phsource/vowel/e_5 new file mode 100644 index 00000000..d0a39f17 Binary files /dev/null and b/phsource/vowel/e_5 differ diff --git a/phsource/vowel/e_e b/phsource/vowel/e_e new file mode 100644 index 00000000..720998fc Binary files /dev/null and b/phsource/vowel/e_e differ diff --git a/phsource/vowel/e_mid b/phsource/vowel/e_mid new file mode 100644 index 00000000..f7d8fb11 Binary files /dev/null and b/phsource/vowel/e_mid differ diff --git a/phsource/vowel/e_mid2 b/phsource/vowel/e_mid2 new file mode 100644 index 00000000..4a90b688 Binary files /dev/null and b/phsource/vowel/e_mid2 differ diff --git a/phsource/vowel/ee b/phsource/vowel/ee new file mode 100644 index 00000000..7b7327cf Binary files /dev/null and b/phsource/vowel/ee differ diff --git a/phsource/vowel/ee# b/phsource/vowel/ee# new file mode 100644 index 00000000..af548dd6 Binary files /dev/null and b/phsource/vowel/ee# differ diff --git a/phsource/vowel/ee#_2 b/phsource/vowel/ee#_2 new file mode 100644 index 00000000..bef3ad7b Binary files /dev/null and b/phsource/vowel/ee#_2 differ diff --git a/phsource/vowel/ee_1 b/phsource/vowel/ee_1 new file mode 100644 index 00000000..39a9a016 Binary files /dev/null and b/phsource/vowel/ee_1 differ diff --git a/phsource/vowel/ee_2 b/phsource/vowel/ee_2 new file mode 100644 index 00000000..23483a02 Binary files /dev/null and b/phsource/vowel/ee_2 differ diff --git a/phsource/vowel/ee_3 b/phsource/vowel/ee_3 new file mode 100644 index 00000000..caacd929 Binary files /dev/null and b/phsource/vowel/ee_3 differ diff --git a/phsource/vowel/ee_5 b/phsource/vowel/ee_5 new file mode 100644 index 00000000..5b33da39 Binary files /dev/null and b/phsource/vowel/ee_5 differ diff --git a/phsource/vowel/ee_6 b/phsource/vowel/ee_6 new file mode 100644 index 00000000..139cf611 Binary files /dev/null and b/phsource/vowel/ee_6 differ diff --git a/phsource/vowel/i b/phsource/vowel/i new file mode 100644 index 00000000..be118198 Binary files /dev/null and b/phsource/vowel/i differ diff --git a/phsource/vowel/i# b/phsource/vowel/i# new file mode 100644 index 00000000..4063ca63 Binary files /dev/null and b/phsource/vowel/i# differ diff --git a/phsource/vowel/i#_2 b/phsource/vowel/i#_2 new file mode 100644 index 00000000..a034b7d9 Binary files /dev/null and b/phsource/vowel/i#_2 differ diff --git a/phsource/vowel/i#_3 b/phsource/vowel/i#_3 new file mode 100644 index 00000000..37398ab8 Binary files /dev/null and b/phsource/vowel/i#_3 differ diff --git a/phsource/vowel/i#_4 b/phsource/vowel/i#_4 new file mode 100644 index 00000000..19355b6b Binary files /dev/null and b/phsource/vowel/i#_4 differ diff --git a/phsource/vowel/i#_5 b/phsource/vowel/i#_5 new file mode 100644 index 00000000..419a78a4 Binary files /dev/null and b/phsource/vowel/i#_5 differ diff --git a/phsource/vowel/i#_6 b/phsource/vowel/i#_6 new file mode 100644 index 00000000..7a5fb179 Binary files /dev/null and b/phsource/vowel/i#_6 differ diff --git a/phsource/vowel/i_2 b/phsource/vowel/i_2 new file mode 100644 index 00000000..6a8778a0 Binary files /dev/null and b/phsource/vowel/i_2 differ diff --git a/phsource/vowel/i_3 b/phsource/vowel/i_3 new file mode 100644 index 00000000..566bbe9c Binary files /dev/null and b/phsource/vowel/i_3 differ diff --git a/phsource/vowel/i_4 b/phsource/vowel/i_4 new file mode 100644 index 00000000..e72d4f7c Binary files /dev/null and b/phsource/vowel/i_4 differ diff --git a/phsource/vowel/i_5 b/phsource/vowel/i_5 new file mode 100644 index 00000000..2d0c357d Binary files /dev/null and b/phsource/vowel/i_5 differ diff --git a/phsource/vowel/i_en b/phsource/vowel/i_en new file mode 100644 index 00000000..0e21942b Binary files /dev/null and b/phsource/vowel/i_en differ diff --git a/phsource/vowel/i_fnt b/phsource/vowel/i_fnt new file mode 100644 index 00000000..222f071b Binary files /dev/null and b/phsource/vowel/i_fnt differ diff --git a/phsource/vowel/ii b/phsource/vowel/ii new file mode 100644 index 00000000..9b51105e Binary files /dev/null and b/phsource/vowel/ii differ diff --git a/phsource/vowel/ii# b/phsource/vowel/ii# new file mode 100644 index 00000000..aa28a9a9 Binary files /dev/null and b/phsource/vowel/ii# differ diff --git a/phsource/vowel/ii_2 b/phsource/vowel/ii_2 new file mode 100644 index 00000000..1d51cea6 Binary files /dev/null and b/phsource/vowel/ii_2 differ diff --git a/phsource/vowel/ii_3 b/phsource/vowel/ii_3 new file mode 100644 index 00000000..024d026e Binary files /dev/null and b/phsource/vowel/ii_3 differ diff --git a/phsource/vowel/ii_4 b/phsource/vowel/ii_4 new file mode 100644 index 00000000..8ab977db Binary files /dev/null and b/phsource/vowel/ii_4 differ diff --git a/phsource/vowel/ii_en b/phsource/vowel/ii_en new file mode 100644 index 00000000..aaa1f48e Binary files /dev/null and b/phsource/vowel/ii_en differ diff --git a/phsource/vowel/o b/phsource/vowel/o new file mode 100644 index 00000000..6694f26a Binary files /dev/null and b/phsource/vowel/o differ diff --git a/phsource/vowel/o- b/phsource/vowel/o- new file mode 100644 index 00000000..55d0c8ad Binary files /dev/null and b/phsource/vowel/o- differ diff --git a/phsource/vowel/o-_2 b/phsource/vowel/o-_2 new file mode 100644 index 00000000..4528be62 Binary files /dev/null and b/phsource/vowel/o-_2 differ diff --git a/phsource/vowel/o-_3 b/phsource/vowel/o-_3 new file mode 100644 index 00000000..e7cd0ad6 Binary files /dev/null and b/phsource/vowel/o-_3 differ diff --git a/phsource/vowel/o_2 b/phsource/vowel/o_2 new file mode 100644 index 00000000..4e57c553 Binary files /dev/null and b/phsource/vowel/o_2 differ diff --git a/phsource/vowel/o_3 b/phsource/vowel/o_3 new file mode 100644 index 00000000..da8c0544 Binary files /dev/null and b/phsource/vowel/o_3 differ diff --git a/phsource/vowel/o_4 b/phsource/vowel/o_4 new file mode 100644 index 00000000..6df1bb38 Binary files /dev/null and b/phsource/vowel/o_4 differ diff --git a/phsource/vowel/o_5 b/phsource/vowel/o_5 new file mode 100644 index 00000000..b188e43d Binary files /dev/null and b/phsource/vowel/o_5 differ diff --git a/phsource/vowel/o_6 b/phsource/vowel/o_6 new file mode 100644 index 00000000..6ac26a18 Binary files /dev/null and b/phsource/vowel/o_6 differ diff --git a/phsource/vowel/o_mid b/phsource/vowel/o_mid new file mode 100644 index 00000000..03d8be23 Binary files /dev/null and b/phsource/vowel/o_mid differ diff --git a/phsource/vowel/oe b/phsource/vowel/oe new file mode 100644 index 00000000..ef6388b8 Binary files /dev/null and b/phsource/vowel/oe differ diff --git a/phsource/vowel/oe_2 b/phsource/vowel/oe_2 new file mode 100644 index 00000000..c35aef7f Binary files /dev/null and b/phsource/vowel/oe_2 differ diff --git a/phsource/vowel/oe_3 b/phsource/vowel/oe_3 new file mode 100644 index 00000000..e52aae62 Binary files /dev/null and b/phsource/vowel/oe_3 differ diff --git a/phsource/vowel/oe_4 b/phsource/vowel/oe_4 new file mode 100755 index 00000000..b185cfcd Binary files /dev/null and b/phsource/vowel/oe_4 differ diff --git a/phsource/vowel/oo b/phsource/vowel/oo new file mode 100644 index 00000000..de7f4976 Binary files /dev/null and b/phsource/vowel/oo differ diff --git a/phsource/vowel/oo_1 b/phsource/vowel/oo_1 new file mode 100644 index 00000000..8dbdbf04 Binary files /dev/null and b/phsource/vowel/oo_1 differ diff --git a/phsource/vowel/oo_2 b/phsource/vowel/oo_2 new file mode 100644 index 00000000..1d08288c Binary files /dev/null and b/phsource/vowel/oo_2 differ diff --git a/phsource/vowel/oo_3 b/phsource/vowel/oo_3 new file mode 100644 index 00000000..8cd1f851 Binary files /dev/null and b/phsource/vowel/oo_3 differ diff --git a/phsource/vowel/oo_4 b/phsource/vowel/oo_4 new file mode 100644 index 00000000..c864f799 Binary files /dev/null and b/phsource/vowel/oo_4 differ diff --git a/phsource/vowel/oo_5 b/phsource/vowel/oo_5 new file mode 100644 index 00000000..ad18bde5 Binary files /dev/null and b/phsource/vowel/oo_5 differ diff --git a/phsource/vowel/oo_en b/phsource/vowel/oo_en new file mode 100644 index 00000000..1fad8308 Binary files /dev/null and b/phsource/vowel/oo_en differ diff --git a/phsource/vowel/u b/phsource/vowel/u new file mode 100644 index 00000000..8409c1b1 Binary files /dev/null and b/phsource/vowel/u differ diff --git a/phsource/vowel/u# b/phsource/vowel/u# new file mode 100644 index 00000000..23df5813 Binary files /dev/null and b/phsource/vowel/u# differ diff --git a/phsource/vowel/u#_2 b/phsource/vowel/u#_2 new file mode 100755 index 00000000..9abc35cb Binary files /dev/null and b/phsource/vowel/u#_2 differ diff --git a/phsource/vowel/u#_3 b/phsource/vowel/u#_3 new file mode 100644 index 00000000..91b07ede Binary files /dev/null and b/phsource/vowel/u#_3 differ diff --git a/phsource/vowel/u#_4 b/phsource/vowel/u#_4 new file mode 100644 index 00000000..6f9e90c6 Binary files /dev/null and b/phsource/vowel/u#_4 differ diff --git a/phsource/vowel/u_2 b/phsource/vowel/u_2 new file mode 100644 index 00000000..30c3663b Binary files /dev/null and b/phsource/vowel/u_2 differ diff --git a/phsource/vowel/u_3 b/phsource/vowel/u_3 new file mode 100644 index 00000000..5b3ccb8b Binary files /dev/null and b/phsource/vowel/u_3 differ diff --git a/phsource/vowel/u_4 b/phsource/vowel/u_4 new file mode 100644 index 00000000..f4481e64 Binary files /dev/null and b/phsource/vowel/u_4 differ diff --git a/phsource/vowel/u_5 b/phsource/vowel/u_5 new file mode 100644 index 00000000..6a75f4ba Binary files /dev/null and b/phsource/vowel/u_5 differ diff --git a/phsource/vowel/u_6 b/phsource/vowel/u_6 new file mode 100644 index 00000000..0dd7a2ff Binary files /dev/null and b/phsource/vowel/u_6 differ diff --git a/phsource/vowel/u_7 b/phsource/vowel/u_7 new file mode 100644 index 00000000..f84a3452 Binary files /dev/null and b/phsource/vowel/u_7 differ diff --git a/phsource/vowel/u_bck b/phsource/vowel/u_bck new file mode 100644 index 00000000..9f890538 Binary files /dev/null and b/phsource/vowel/u_bck differ diff --git a/phsource/vowel/u_fnt b/phsource/vowel/u_fnt new file mode 100644 index 00000000..9580996b Binary files /dev/null and b/phsource/vowel/u_fnt differ diff --git a/phsource/vowel/u_unr b/phsource/vowel/u_unr new file mode 100644 index 00000000..4f3fbf21 Binary files /dev/null and b/phsource/vowel/u_unr differ diff --git a/phsource/vowel/uu b/phsource/vowel/uu new file mode 100644 index 00000000..9291f7db Binary files /dev/null and b/phsource/vowel/uu differ diff --git a/phsource/vowel/uu_2 b/phsource/vowel/uu_2 new file mode 100644 index 00000000..2aa8e644 Binary files /dev/null and b/phsource/vowel/uu_2 differ diff --git a/phsource/vowel/uu_3 b/phsource/vowel/uu_3 new file mode 100644 index 00000000..d1e33ea7 Binary files /dev/null and b/phsource/vowel/uu_3 differ diff --git a/phsource/vowel/uu_4 b/phsource/vowel/uu_4 new file mode 100644 index 00000000..2bf77cae Binary files /dev/null and b/phsource/vowel/uu_4 differ diff --git a/phsource/vowel/uu_bck b/phsource/vowel/uu_bck new file mode 100644 index 00000000..a3fabd3e Binary files /dev/null and b/phsource/vowel/uu_bck differ diff --git a/phsource/vowel/vowelchart.png b/phsource/vowel/vowelchart.png new file mode 100644 index 00000000..f1eaed5e Binary files /dev/null and b/phsource/vowel/vowelchart.png differ diff --git a/phsource/vowel/y b/phsource/vowel/y new file mode 100644 index 00000000..303965ac Binary files /dev/null and b/phsource/vowel/y differ diff --git a/phsource/vowel/y# b/phsource/vowel/y# new file mode 100644 index 00000000..f655c438 Binary files /dev/null and b/phsource/vowel/y# differ diff --git a/phsource/vowel/y#_2 b/phsource/vowel/y#_2 new file mode 100644 index 00000000..06f94e95 Binary files /dev/null and b/phsource/vowel/y#_2 differ diff --git a/phsource/vowel/y_2 b/phsource/vowel/y_2 new file mode 100644 index 00000000..f54485cd Binary files /dev/null and b/phsource/vowel/y_2 differ diff --git a/phsource/vowel/y_3 b/phsource/vowel/y_3 new file mode 100644 index 00000000..72ec91c4 Binary files /dev/null and b/phsource/vowel/y_3 differ diff --git a/phsource/vowel/y_4 b/phsource/vowel/y_4 new file mode 100644 index 00000000..04ba2fd0 Binary files /dev/null and b/phsource/vowel/y_4 differ diff --git a/phsource/vowel/y_5 b/phsource/vowel/y_5 new file mode 100755 index 00000000..dda66488 Binary files /dev/null and b/phsource/vowel/y_5 differ diff --git a/phsource/vowel/yy b/phsource/vowel/yy new file mode 100644 index 00000000..1b355fd0 Binary files /dev/null and b/phsource/vowel/yy differ diff --git a/phsource/vowel/yy_2 b/phsource/vowel/yy_2 new file mode 100644 index 00000000..1b355fd0 Binary files /dev/null and b/phsource/vowel/yy_2 differ diff --git a/phsource/vowel/yy_3 b/phsource/vowel/yy_3 new file mode 100644 index 00000000..2feaf41e Binary files /dev/null and b/phsource/vowel/yy_3 differ diff --git a/phsource/vowel/yy_4 b/phsource/vowel/yy_4 new file mode 100644 index 00000000..fcd827a1 Binary files /dev/null and b/phsource/vowel/yy_4 differ diff --git a/phsource/vowelcharts/af b/phsource/vowelcharts/af new file mode 100644 index 00000000..730c79b5 --- /dev/null +++ b/phsource/vowelcharts/af @@ -0,0 +1,32 @@ +@ 536 1420 2420 536 1420 2420 +@- 525 1441 2340 525 1441 2340 +a 659 1278 2583 659 1278 2583 +E 504 1900 2544 496 1920 2552 +I 527 1461 2480 527 1461 2480 +O 552 780 2760 552 780 2760 +W 525 1320 2200 525 1320 2200 +u 352 1000 2240 352 1000 2200 +& 735 1760 2420 675 1738 2420 +@L 485 891 2780 450 792 2980 +A: 664 1040 2800 648 1060 2840 +e@ 264 2180 3040 488 1700 2600 +i 272 2247 3100 288 2247 3100 +o@ 336 1060 2360 480 1480 2500 +y 328 2100 2580 304 2160 2640 +iu 280 2180 3040 272 900 2300 +@U 620 1245 2298 376 880 2280 +aI 768 1200 2820 312 2240 2940 +AI 664 1040 2800 312 2240 2940 +eI 640 1562 2400 355 2222 2720 +OI 504 780 2660 328 2140 2780 +oI 336 1040 2360 304 2360 2680 +uI 352 960 2240 296 2247 3100 +Yy 496 1220 2340 296 2020 2400 +Y@ 296 1980 2480 480 1580 2420 +aU 830 1364 2440 488 900 2240 +e: 464 1980 2520 464 1980 2520 +O: 512 860 2648 512 860 2648 +3: 480 1408 2320 545 1419 2320 +A~ 600 1060 2640 600 1060 2640 +e~ 456 2000 2520 456 2000 2520 +o~ 392 700 2720 392 700 2720 diff --git a/phsource/vowelcharts/af.png b/phsource/vowelcharts/af.png new file mode 100644 index 00000000..d0632273 Binary files /dev/null and b/phsource/vowelcharts/af.png differ diff --git a/phsource/vowelcharts/base b/phsource/vowelcharts/base new file mode 100644 index 00000000..2a8c948b --- /dev/null +++ b/phsource/vowelcharts/base @@ -0,0 +1,2 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 diff --git a/phsource/vowelcharts/base.png b/phsource/vowelcharts/base.png new file mode 100644 index 00000000..d97d43b2 Binary files /dev/null and b/phsource/vowelcharts/base.png differ diff --git a/phsource/vowelcharts/cs b/phsource/vowelcharts/cs new file mode 100644 index 00000000..b8c1b1fe --- /dev/null +++ b/phsource/vowelcharts/cs @@ -0,0 +1,26 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +r- 648 1200 2300 640 1200 2260 +a 925 1320 2700 896 1340 2660 +E 647 1778 2530 647 1778 2530 +i 360 2120 2680 360 2120 2660 +O 584 940 2580 584 940 2580 +u 344 800 2360 344 800 2360 +y 452 1709 2460 452 1709 2460 +E~ 670 1719 2556 710 1672 2671 +O~ 540 896 2632 512 900 2620 +i: 272 2247 3100 288 2247 3100 +& 680 1660 2520 680 1660 2520 +e 584 1820 2560 584 1820 2560 +e: 584 1820 2560 584 1820 2560 +a: 784 1180 2680 768 1220 2680 +o 566 890 2641 566 890 2641 +o: 512 860 2648 512 860 2648 +u: 320 860 2360 320 860 2360 +aU 847 1383 2510 360 800 2360 +eU 460 1929 2512 327 947 2367 +oU 496 900 2520 360 800 2140 +eI 608 1800 2529 408 1960 2520 +r: 648 1200 2300 640 1200 2260 +l- 352 1240 3020 352 1200 3020 +l: 352 1240 3020 352 1200 3020 diff --git a/phsource/vowelcharts/cs.png b/phsource/vowelcharts/cs.png new file mode 100644 index 00000000..a9b3c999 Binary files /dev/null and b/phsource/vowelcharts/cs.png differ diff --git a/phsource/vowelcharts/cy b/phsource/vowelcharts/cy new file mode 100644 index 00000000..746db0b9 --- /dev/null +++ b/phsource/vowelcharts/cy @@ -0,0 +1,28 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +a 925 1320 2700 896 1340 2660 +E 645 1705 2520 645 1705 2520 +I 384 2030 2610 384 2030 2610 +Y 452 1709 2460 452 1709 2460 +O 566 890 2641 566 890 2641 +U 320 740 2400 320 740 2400 +V 525 1441 2340 525 1441 2340 +i: 280 2280 2820 200 2398 2820 +y: 300 2020 2597 300 2020 2597 +u: 320 860 2360 320 860 2360 +e: 464 1980 2520 464 1980 2520 +o: 424 800 2580 408 780 2600 +A: 775 1067 2800 795 1122 2580 +AY 664 1040 2800 312 2240 2940 +aI 848 1260 2820 440 1969 2500 +aY 848 1260 2820 440 1969 2500 +aU 847 1383 2510 360 800 2360 +@I 640 1562 2400 355 2222 2720 +@Y 640 1562 2400 355 2222 2720 +eU 460 1929 2512 327 947 2367 +Iu 405 1790 2442 344 1080 2200 +Yu 405 1790 2442 344 1080 2200 +OI 545 780 2780 310 2002 2300 +OY 545 780 2780 310 2002 2300 +uI 352 960 2340 343 1911 2586 +uY 352 960 2340 343 1911 2586 diff --git a/phsource/vowelcharts/cy.png b/phsource/vowelcharts/cy.png new file mode 100644 index 00000000..213ade32 Binary files /dev/null and b/phsource/vowelcharts/cy.png differ diff --git a/phsource/vowelcharts/de b/phsource/vowelcharts/de new file mode 100644 index 00000000..2134a05f --- /dev/null +++ b/phsource/vowelcharts/de @@ -0,0 +1,23 @@ +@ 528 1500 2380 528 1500 2380 +@- 525 1441 2340 525 1441 2340 +3 658 1408 2460 658 1408 2460 +a 925 1320 2700 896 1340 2660 +E 504 1900 2544 496 1920 2552 +E2 504 1900 2544 496 1920 2552 +I 384 2030 2610 384 2030 2610 +I: 384 2030 2610 384 2030 2610 +O 552 860 2660 552 860 2660 +U 388 940 2420 394 980 2360 +A: 800 1240 2720 781 1280 2580 +i: 280 2247 3100 280 2220 3040 +u: 320 860 2360 320 860 2360 +aU 724 1130 2760 472 780 2500 +aI 925 1320 2700 355 2222 2720 +OI 469 864 2440 310 2040 2440 +E: 504 1900 2544 496 1920 2552 +e: 416 2140 2660 416 2140 2660 +o: 454 812 2559 432 824 2520 +y: 280 1720 2340 280 1720 2340 +y 305 1692 2340 305 1692 2340 +Y: 448 1520 2420 463 1520 2400 +W 525 1320 2200 525 1320 2200 diff --git a/phsource/vowelcharts/de.png b/phsource/vowelcharts/de.png new file mode 100644 index 00000000..f057cd51 Binary files /dev/null and b/phsource/vowelcharts/de.png differ diff --git a/phsource/vowelcharts/el b/phsource/vowelcharts/el new file mode 100644 index 00000000..7f980aa8 --- /dev/null +++ b/phsource/vowelcharts/el @@ -0,0 +1,19 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +a 896 1440 2720 880 1440 2700 +a/ 841 1409 2550 841 1409 2550 +e 504 1900 2544 496 1920 2552 +E 720 1760 2420 672 1562 2520 +i 280 2280 2820 200 2398 2820 +i2 312 2300 2820 312 2300 2820 +o 552 860 2660 552 860 2660 +O 670 946 2620 630 902 2700 +U 388 940 2420 394 980 2360 +u 320 740 2400 320 740 2400 +aU 847 1383 2510 360 800 2360 +eU 460 1929 2512 327 947 2367 +iU 280 2280 2820 328 957 2140 +aI 912 1320 2740 360 2200 2820 +eI 464 1980 2520 328 2280 2720 +oI 469 864 2440 310 2040 2440 +uI 321 965 2377 328 2160 2720 diff --git a/phsource/vowelcharts/el.png b/phsource/vowelcharts/el.png new file mode 100644 index 00000000..45b43ee3 Binary files /dev/null and b/phsource/vowelcharts/el.png differ diff --git a/phsource/vowelcharts/en b/phsource/vowelcharts/en new file mode 100644 index 00000000..cfc0a25d --- /dev/null +++ b/phsource/vowelcharts/en @@ -0,0 +1,49 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +i: 296 2220 2820 200 2398 2820 +i@ 368 2156 2720 528 1595 2460 +3 525 1441 2340 525 1441 2340 +@2 525 1441 2340 525 1441 2340 +I2 440 1837 2520 440 1837 2520 +@5 525 1441 2340 525 1441 2340 +U 445 902 2620 445 902 2620 +@L 485 891 2780 450 792 2980 +a 925 1342 2700 925 1342 2700 +a2 658 1408 2460 658 1408 2460 +aa 925 1342 2700 925 1342 2700 +E 645 1705 2520 645 1705 2520 +I 440 1837 2520 440 1837 2520 +i 440 1837 2520 440 1837 2520 +0 670 946 2620 630 902 2700 +V 605 1232 2620 605 1276 2620 +A: 775 1067 2800 795 1122 2580 +A@ 775 1067 2800 795 1122 2580 +3: 480 1408 2320 545 1419 2320 +O: 465 836 2660 530 1001 2620 +O@ 465 836 2660 530 1001 2620 +o@ 465 836 2660 530 1001 2620 +O 465 836 2660 530 1001 2620 +u: 360 1562 2260 290 1023 2220 +aU 830 1364 2440 488 900 2240 +oU 630 1353 2340 390 957 2140 +aI 860 1133 2820 440 1969 2500 +eI 755 1683 2460 355 2222 2720 +OI 545 780 2780 310 2002 2300 +e@ 720 1760 2420 672 1562 2520 +U@ 430 960 2340 590 1287 2260 +aI@ 860 1133 2820 640 1518 2400 +aU@ 945 1485 2620 705 1342 2300 +e: 464 1980 2520 464 1980 2520 +o: 454 812 2559 432 824 2520 +eU 460 1929 2512 327 947 2367 +uI 321 965 2377 328 2160 2720 +IR 544 1340 2460 616 1190 2450 +VR 648 1180 2595 640 1140 2460 +A~ 640 1120 2640 640 1120 2640 +E~ 672 1660 2624 672 1660 2624 +O~ 512 880 2624 512 880 2620 +W~ 694 1360 2624 694 1360 2624 +y: 280 1720 2340 280 1720 2340 +Y: 448 1520 2420 463 1520 2400 +W 525 1320 2200 525 1320 2200 +u- 392 1700 2240 392 1700 2240 diff --git a/phsource/vowelcharts/en.png b/phsource/vowelcharts/en.png new file mode 100644 index 00000000..ea4833c9 Binary files /dev/null and b/phsource/vowelcharts/en.png differ diff --git a/phsource/vowelcharts/en_n b/phsource/vowelcharts/en_n new file mode 100644 index 00000000..a79c00e6 --- /dev/null +++ b/phsource/vowelcharts/en_n @@ -0,0 +1,49 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +i: 280 2280 2820 200 2398 2820 +i@ 328 2190 2770 515 1520 2360 +3 525 1441 2340 525 1441 2340 +@2 525 1441 2340 525 1441 2340 +I2 440 1837 2520 440 1837 2520 +@5 525 1441 2340 525 1441 2340 +U 320 860 2360 320 860 2360 +@L 485 891 2780 450 792 2980 +a 925 1320 2700 896 1340 2660 +a2 658 1408 2460 658 1408 2460 +aa 925 1320 2700 896 1340 2660 +E 680 1660 2520 680 1660 2520 +I 440 1837 2520 440 1837 2520 +i 440 1837 2520 440 1837 2520 +0 630 920 2627 630 920 2627 +V 477 968 2620 477 968 2620 +A: 915 1243 2620 895 1276 2340 +A@ 915 1243 2620 895 1276 2340 +3: 525 1320 2200 529 1340 2140 +O: 512 860 2648 512 860 2648 +O@ 575 891 2640 580 1023 2480 +o@ 465 836 2660 530 1001 2620 +O 465 836 2660 530 1001 2620 +u: 384 1800 2320 344 1660 2300 +aU 660 1562 2360 340 990 2360 +oU 464 820 2559 440 820 2600 +aI 860 1360 2660 488 1840 2440 +eI 464 1980 2520 464 1980 2520 +OI 545 780 2780 310 2002 2300 +e@ 720 1760 2420 672 1562 2520 +U@ 430 960 2340 590 1287 2260 +aI@ 860 1133 2820 640 1518 2400 +aU@ 945 1485 2620 705 1342 2300 +e: 464 1980 2520 464 1980 2520 +o: 454 812 2559 432 824 2520 +eU 460 1929 2512 327 947 2367 +uI 321 965 2377 328 2160 2720 +IR 544 1340 2460 616 1190 2450 +VR 648 1180 2595 640 1140 2460 +A~ 640 1120 2640 640 1120 2640 +E~ 672 1660 2624 672 1660 2624 +O~ 512 880 2624 512 880 2620 +W~ 694 1360 2624 694 1360 2624 +y: 280 1720 2340 280 1720 2340 +Y: 448 1520 2420 463 1520 2400 +W 525 1320 2200 525 1320 2200 +u- 392 1700 2240 392 1700 2240 diff --git a/phsource/vowelcharts/en_n.png b/phsource/vowelcharts/en_n.png new file mode 100644 index 00000000..40e04f76 Binary files /dev/null and b/phsource/vowelcharts/en_n.png differ diff --git a/phsource/vowelcharts/en_rp b/phsource/vowelcharts/en_rp new file mode 100644 index 00000000..e4395046 --- /dev/null +++ b/phsource/vowelcharts/en_rp @@ -0,0 +1,49 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +i: 280 2280 2820 200 2398 2820 +i@ 416 2068 2720 653 1430 2328 +3 525 1441 2340 525 1441 2340 +@2 584 1427 2393 584 1427 2393 +I2 416 1920 2520 432 1900 2520 +@5 584 1427 2393 584 1427 2393 +U 464 1000 2480 464 1000 2480 +@L 485 891 2780 450 792 2980 +a 744 1560 2500 736 1580 2500 +a2 525 1441 2340 525 1441 2340 +aa 648 1108 2880 632 1140 2880 +E 584 1820 2560 584 1820 2560 +I 416 1920 2520 432 1900 2520 +i 360 2120 2680 360 2120 2660 +0 656 1000 2620 630 960 2700 +V 686 1280 2595 686 1280 2595 +A: 648 1108 2880 632 1140 2880 +A@ 648 1108 2880 632 1140 2880 +3: 536 1408 2320 545 1419 2320 +O: 512 860 2648 512 860 2648 +O@ 512 860 2648 512 860 2648 +o@ 465 836 2660 530 1001 2620 +O 465 836 2660 530 1001 2620 +u: 328 940 2380 328 920 2380 +aU 912 1420 2440 536 940 2300 +oU 568 1620 2340 376 1255 2243 +aI 925 1342 2700 440 1969 2500 +eI 608 1800 2529 408 1960 2520 +OI 545 780 2780 310 2002 2300 +e@ 688 1820 2440 735 1562 2540 +U@ 432 840 2620 440 860 2680 +aI@ 860 1133 2820 640 1518 2400 +aU@ 945 1485 2620 705 1220 2300 +e: 464 1980 2520 464 1980 2520 +o: 454 812 2559 432 824 2520 +eU 460 1929 2512 327 947 2367 +uI 321 965 2377 328 2160 2720 +IR 544 1340 2460 616 1190 2450 +VR 648 1180 2595 640 1140 2460 +A~ 640 1120 2640 640 1120 2640 +E~ 672 1660 2624 672 1660 2624 +O~ 512 880 2624 512 880 2620 +W~ 694 1360 2624 694 1360 2624 +y: 280 1720 2340 280 1720 2340 +Y: 448 1520 2420 463 1520 2400 +W 525 1320 2200 525 1320 2200 +u- 392 1700 2240 392 1700 2240 diff --git a/phsource/vowelcharts/en_rp.png b/phsource/vowelcharts/en_rp.png new file mode 100644 index 00000000..cf20bf77 Binary files /dev/null and b/phsource/vowelcharts/en_rp.png differ diff --git a/phsource/vowelcharts/en_sc b/phsource/vowelcharts/en_sc new file mode 100644 index 00000000..c7a1577a --- /dev/null +++ b/phsource/vowelcharts/en_sc @@ -0,0 +1,51 @@ +@ 528 1500 2380 528 1500 2380 +@- 525 1441 2340 525 1441 2340 +i: 328 2380 2940 280 2440 2980 +i@ 384 2030 2610 520 1460 1900 +3 605 1232 2620 605 1276 2620 +@2 528 1500 2380 528 1500 2380 +I2 504 1700 2560 504 1700 2560 +@5 528 1500 2380 528 1500 2380 +U 407 1500 2160 392 1500 2160 +@L 560 900 2780 450 792 2980 +a 784 1180 2680 768 1220 2680 +a2 760 1420 2600 736 1380 2540 +aa 784 1180 2680 768 1220 2680 +E 518 1882 2540 581 1810 2540 +I 504 1700 2560 504 1700 2560 +i 520 2000 2540 520 2000 2540 +0 566 890 2641 566 890 2641 +V 664 1180 2595 664 1180 2595 +A: 784 1180 2680 768 1220 2680 +A@ 752 1190 2640 688 1320 2480 +3: 464 1980 2520 658 1408 2460 +O: 552 860 2660 552 860 2660 +O@ 552 880 2660 552 1080 2560 +o@ 424 780 2680 504 940 1820 +O 656 1000 2620 630 960 2700 +u: 392 1700 2240 392 1700 2240 +aU 698 1320 2484 280 1600 2340 +oU 412 760 2660 400 760 2740 +aI 760 1200 2680 352 2280 2780 +eI 416 2140 2660 416 2140 2660 +OI 624 980 2620 328 2127 2940 +e@ 464 1980 2520 658 1408 2460 +U@ 344 1740 2240 592 1220 2400 +aI@ 892 1340 2684 552 1800 2480 +aU@ 945 1485 2620 705 1342 2300 +e: 464 1980 2520 464 1980 2520 +o: 454 812 2559 432 824 2520 +eU 460 1929 2512 327 947 2367 +uI 321 965 2377 328 2160 2720 +IR 544 1340 2460 616 1190 2450 +VR 648 1180 2595 640 1140 2460 +A~ 640 1120 2640 640 1120 2640 +E~ 672 1660 2624 672 1660 2624 +O~ 512 880 2624 512 880 2620 +W~ 694 1360 2624 694 1360 2624 +y: 280 1720 2340 280 1720 2340 +Y: 448 1520 2420 463 1520 2400 +W 525 1320 2200 525 1320 2200 +u- 392 1700 2240 392 1700 2240 +a/ 784 1180 2680 768 1220 2680 +aI2 760 1200 2680 352 2280 2780 diff --git a/phsource/vowelcharts/en_sc.png b/phsource/vowelcharts/en_sc.png new file mode 100644 index 00000000..0f7b07c6 Binary files /dev/null and b/phsource/vowelcharts/en_sc.png differ diff --git a/phsource/vowelcharts/en_us b/phsource/vowelcharts/en_us new file mode 100644 index 00000000..3d3797d9 --- /dev/null +++ b/phsource/vowelcharts/en_us @@ -0,0 +1,49 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +i: 296 2220 2820 200 2398 2820 +i@ 384 2030 2610 520 1460 1900 +3 504 1380 1800 504 1360 1700 +@2 525 1441 2340 525 1441 2340 +I2 386 2029 2605 440 1801 2502 +@5 525 1441 2340 525 1441 2340 +U 496 1040 2560 496 1040 2560 +@L 485 891 2780 450 792 2980 +a 856 1540 2690 680 1503 2520 +a2 658 1408 2460 658 1408 2460 +aa 856 1540 2690 680 1503 2520 +E 645 1740 2520 597 1600 2448 +I 386 2029 2605 440 1801 2502 +i 424 1960 2540 416 1960 2540 +0 688 1064 2806 672 1100 2806 +V 659 1278 2583 592 1359 2462 +A: 688 1064 2806 672 1100 2806 +A@ 751 1090 2716 520 1240 1900 +3: 480 1408 2320 552 1400 2160 +O: 656 1000 2620 630 960 2700 +O@ 465 840 2660 520 1160 1900 +o@ 465 840 2660 520 1160 1900 +O 656 1000 2620 630 960 2700 +u: 352 1527 2256 290 1023 2220 +aU 745 1480 2400 456 920 2240 +oU 616 1220 2380 390 957 2140 +aI 848 1260 2820 440 1969 2500 +eI 608 1800 2529 408 1960 2520 +OI 545 780 2780 310 2002 2300 +e@ 552 1800 2529 520 1460 1900 +U@ 496 1040 2560 520 1160 1900 +aI@ 860 1133 2820 640 1518 2400 +aU@ 945 1485 2620 705 1342 2300 +e: 464 1980 2520 464 1980 2520 +o: 454 812 2559 432 824 2520 +eU 460 1929 2512 327 947 2367 +uI 321 965 2377 328 2160 2720 +IR 544 1340 2460 616 1190 2450 +VR 648 1180 2595 640 1140 2460 +A~ 640 1120 2640 640 1120 2640 +E~ 672 1660 2624 672 1660 2624 +O~ 512 880 2624 512 880 2620 +W~ 694 1360 2624 694 1360 2624 +y: 280 1720 2340 280 1720 2340 +Y: 448 1520 2420 463 1520 2400 +W 525 1320 2200 525 1320 2200 +u- 392 1700 2240 392 1700 2240 diff --git a/phsource/vowelcharts/en_us.png b/phsource/vowelcharts/en_us.png new file mode 100644 index 00000000..330b82ab Binary files /dev/null and b/phsource/vowelcharts/en_us.png differ diff --git a/phsource/vowelcharts/en_wm b/phsource/vowelcharts/en_wm new file mode 100644 index 00000000..c5a3df4b --- /dev/null +++ b/phsource/vowelcharts/en_wm @@ -0,0 +1,49 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +i: 304 2020 2700 200 2398 2820 +i@ 395 2068 2720 515 1595 2460 +3 525 1441 2340 525 1441 2340 +@2 525 1441 2340 525 1441 2340 +I2 312 2213 2775 312 2213 2775 +@5 525 1441 2340 525 1441 2340 +U 445 902 2620 445 902 2620 +@L 485 891 2780 450 792 2980 +a 841 1409 2550 841 1409 2550 +a2 658 1408 2460 658 1408 2460 +aa 841 1409 2550 841 1409 2550 +E 584 1820 2560 584 1820 2560 +I 312 2213 2775 312 2213 2775 +i 280 2280 2820 200 2398 2820 +0 630 920 2627 630 920 2627 +V 477 968 2620 477 968 2620 +A: 915 1243 2620 895 1244 2460 +A@ 915 1243 2620 895 1244 2460 +3: 448 1520 2420 463 1520 2400 +O: 512 860 2648 512 860 2648 +O@ 454 812 2559 432 824 2520 +o@ 465 836 2660 530 1001 2620 +O 454 812 2559 432 824 2520 +u: 525 1441 2340 340 990 2360 +aU 660 1562 2360 340 990 2360 +oU 616 1220 2380 390 957 2140 +aI 584 940 2820 352 1920 2480 +eI 649 1485 2430 355 2222 2720 +OI 469 864 2440 310 2040 2440 +e@ 480 1408 2320 545 1419 2320 +U@ 430 960 2340 590 1287 2260 +aI@ 860 1133 2820 640 1518 2400 +aU@ 945 1485 2620 705 1342 2300 +e: 464 1980 2520 464 1980 2520 +o: 454 812 2559 432 824 2520 +eU 460 1929 2512 327 947 2367 +uI 321 965 2377 328 2160 2720 +IR 544 1340 2460 616 1190 2450 +VR 648 1180 2595 640 1140 2460 +A~ 640 1120 2640 640 1120 2640 +E~ 672 1660 2624 672 1660 2624 +O~ 512 880 2624 512 880 2620 +W~ 694 1360 2624 694 1360 2624 +y: 280 1720 2340 280 1720 2340 +Y: 448 1520 2420 463 1520 2400 +W 525 1320 2200 525 1320 2200 +u- 392 1700 2240 392 1700 2240 diff --git a/phsource/vowelcharts/en_wm.png b/phsource/vowelcharts/en_wm.png new file mode 100644 index 00000000..62190ec8 Binary files /dev/null and b/phsource/vowelcharts/en_wm.png differ diff --git a/phsource/vowelcharts/eo b/phsource/vowelcharts/eo new file mode 100644 index 00000000..bea95a08 --- /dev/null +++ b/phsource/vowelcharts/eo @@ -0,0 +1,13 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +a 896 1440 2720 880 1440 2700 +e 464 1980 2520 464 1980 2520 +i 280 2280 2820 200 2398 2820 +o 552 860 2660 552 860 2660 +u 320 860 2360 320 860 2360 +aU 847 1383 2510 360 800 2360 +eU 460 1929 2512 327 947 2367 +aI 912 1320 2740 360 2200 2820 +eI 547 1855 2536 320 2300 2740 +OI 545 780 2780 310 2002 2300 +uI 321 965 2377 328 2160 2720 diff --git a/phsource/vowelcharts/eo.png b/phsource/vowelcharts/eo.png new file mode 100644 index 00000000..9fe8d0db Binary files /dev/null and b/phsource/vowelcharts/eo.png differ diff --git a/phsource/vowelcharts/es b/phsource/vowelcharts/es new file mode 100644 index 00000000..a983ca6a --- /dev/null +++ b/phsource/vowelcharts/es @@ -0,0 +1,19 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +a 896 1440 2720 880 1440 2700 +a/ 760 1420 2600 736 1380 2540 +e 464 1980 2520 464 1980 2520 +E 584 1820 2560 584 1820 2560 +i 280 2280 2820 200 2398 2820 +i2 312 2300 2820 312 2300 2820 +o 552 860 2660 552 860 2660 +O 670 946 2620 630 902 2700 +U 388 940 2420 394 980 2360 +u 320 740 2400 320 740 2400 +aU 847 1383 2510 360 800 2360 +eU 460 1929 2512 327 947 2367 +iU 280 2280 2820 328 957 2140 +aI 912 1320 2740 360 2200 2820 +eI 464 1980 2520 328 2280 2720 +oI 469 864 2440 310 2040 2440 +uI 321 965 2377 328 2160 2720 diff --git a/phsource/vowelcharts/es.png b/phsource/vowelcharts/es.png new file mode 100644 index 00000000..31a88e56 Binary files /dev/null and b/phsource/vowelcharts/es.png differ diff --git a/phsource/vowelcharts/fi b/phsource/vowelcharts/fi new file mode 100644 index 00000000..3f8b4190 --- /dev/null +++ b/phsource/vowelcharts/fi @@ -0,0 +1,32 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +i 312 2300 2820 312 2300 2820 +I 360 2120 2680 360 2120 2660 +e 504 1900 2544 496 1920 2552 +& 744 1560 2500 736 1580 2500 +a 688 1064 2806 672 1100 2806 +a2 657 1100 2703 657 1120 2703 +o 512 860 2648 512 860 2648 +Y 448 1520 2420 463 1520 2400 +u 320 740 2400 320 740 2400 +u1 344 800 2360 344 800 2360 +U 368 800 2660 368 800 2660 +y 280 1720 2340 280 1720 2340 +ai 664 1040 2800 312 2240 2940 +&i 744 1540 2500 355 2222 2720 +oi 545 780 2780 310 2002 2300 +ei 547 1855 2536 320 2300 2740 +Yi 448 1520 2420 355 2222 2720 +ui 321 965 2377 328 2160 2720 +yi 280 1720 2340 355 2222 2720 +au 688 1060 2580 368 900 2540 +ou 516 860 2648 312 860 2360 +eu 460 1929 2512 327 947 2367 +iu 296 2180 2820 320 920 2360 +&y 744 1520 2500 296 1720 2340 +ey 547 1855 2536 280 1720 2340 +Yy 448 1520 2420 280 1720 2340 +iy 280 2280 2820 280 1720 2340 +uo 344 896 2375 494 864 2468 +ie 280 2280 2820 735 1562 2520 +yY 280 1720 2340 448 1520 2420 diff --git a/phsource/vowelcharts/fi.png b/phsource/vowelcharts/fi.png new file mode 100644 index 00000000..afbb5a3f Binary files /dev/null and b/phsource/vowelcharts/fi.png differ diff --git a/phsource/vowelcharts/fr b/phsource/vowelcharts/fr new file mode 100644 index 00000000..95764e22 --- /dev/null +++ b/phsource/vowelcharts/fr @@ -0,0 +1,22 @@ +@ 500 1412 2320 500 1412 2340 +@- 525 1441 2340 525 1441 2340 +a 925 1342 2700 925 1342 2700 +e 464 1980 2520 464 1980 2520 +E 647 1778 2530 647 1778 2530 +i 280 2280 2820 200 2398 2820 +o 454 812 2559 432 824 2520 +O 670 946 2620 630 902 2700 +u 320 860 2360 320 860 2360 +y 272 1820 2280 272 1800 2260 +Y 448 1520 2420 463 1520 2400 +W 525 1320 2200 525 1320 2200 +w^i 280 1832 2436 200 2398 2820 +A~ 640 1120 2640 640 1120 2640 +E~ 694 1360 2624 694 1360 2624 +O~ 512 880 2624 512 880 2620 +W~ 694 1360 2624 694 1360 2624 +I 280 2280 2820 200 2398 2820 +U 320 860 2360 320 860 2360 +y" 272 1820 2280 272 1800 2260 +E: 464 1980 2520 464 1980 2520 +A 925 1342 2700 925 1342 2700 diff --git a/phsource/vowelcharts/fr.png b/phsource/vowelcharts/fr.png new file mode 100644 index 00000000..633d3806 Binary files /dev/null and b/phsource/vowelcharts/fr.png differ diff --git a/phsource/vowelcharts/fr_ca b/phsource/vowelcharts/fr_ca new file mode 100644 index 00000000..9e79f268 --- /dev/null +++ b/phsource/vowelcharts/fr_ca @@ -0,0 +1,22 @@ +@ 500 1412 2320 500 1412 2340 +@- 525 1441 2340 525 1441 2340 +a 925 1342 2700 925 1342 2700 +e 464 1980 2520 464 1980 2520 +E 584 1820 2560 584 1820 2560 +i 280 2280 2820 200 2398 2820 +o 454 812 2559 432 824 2520 +O 670 946 2620 630 902 2700 +u 320 740 2400 320 740 2400 +y 272 1820 2280 272 1800 2260 +Y 448 1520 2420 463 1520 2400 +W 525 1320 2200 525 1320 2200 +w^i 280 1832 2436 200 2398 2820 +A~ 640 1120 2640 640 1120 2640 +E~ 672 1660 2624 672 1660 2624 +O~ 512 880 2624 512 880 2620 +W~ 694 1360 2624 694 1360 2624 +I 384 2030 2610 384 2030 2610 +U 368 880 2440 368 900 2440 +y" 353 1860 2438 353 1860 2438 +E: 863 1474 2664 545 1864 2518 +A 688 1064 2806 672 1100 2806 diff --git a/phsource/vowelcharts/fr_ca.png b/phsource/vowelcharts/fr_ca.png new file mode 100644 index 00000000..fe7cfbf6 Binary files /dev/null and b/phsource/vowelcharts/fr_ca.png differ diff --git a/phsource/vowelcharts/hi b/phsource/vowelcharts/hi new file mode 100644 index 00000000..d1f6307a --- /dev/null +++ b/phsource/vowelcharts/hi @@ -0,0 +1,30 @@ +@ 544 1220 2460 544 1220 2460 +@- 525 1441 2340 525 1441 2340 +r- 648 1200 2300 640 1200 2260 +V 686 1280 2595 686 1280 2595 +@2 584 1440 2460 600 1440 2460 +@3 528 1500 2380 528 1500 2380 +@4 525 1441 2340 525 1441 2340 +i: 304 2440 3020 304 2440 3020 +i 304 2440 3020 304 2440 3020 +I 360 2120 2680 360 2120 2660 +e: 416 2140 2660 416 2140 2660 +e 416 2140 2660 416 2140 2660 +E: 656 1740 2500 504 1900 2620 +E 584 1820 2560 584 1820 2560 +E~ 670 1719 2556 710 1672 2671 +&: 744 1560 2500 736 1580 2500 +a: 712 1160 2780 696 1160 2780 +a 658 1408 2460 658 1408 2460 +o: 424 800 2580 408 780 2600 +o 454 812 2559 432 824 2520 +O: 584 940 2580 584 940 2580 +o~ 448 840 2598 448 840 2598 +O~ 540 896 2632 512 900 2620 +O 670 946 2620 630 902 2700 +U 368 880 2440 368 900 2440 +u: 320 740 2400 320 740 2400 +u2: 320 860 2360 320 860 2360 +l- 352 1240 3020 352 1200 3020 +aI 744 1540 2500 355 2222 2720 +aU 724 1130 2760 472 780 2500 diff --git a/phsource/vowelcharts/hi.png b/phsource/vowelcharts/hi.png new file mode 100644 index 00000000..3c231f87 Binary files /dev/null and b/phsource/vowelcharts/hi.png differ diff --git a/phsource/vowelcharts/hr b/phsource/vowelcharts/hr new file mode 100644 index 00000000..e7cc0c64 --- /dev/null +++ b/phsource/vowelcharts/hr @@ -0,0 +1,30 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +r- 648 1200 2300 640 1200 2260 +a 925 1320 2700 896 1340 2660 +E 584 1820 2560 584 1820 2560 +i 272 2247 3100 288 2247 3100 +O 584 940 2580 584 940 2580 +u 320 740 2400 320 740 2400 +y 452 1709 2460 452 1709 2460 +E~ 670 1719 2556 710 1672 2671 +O~ 540 896 2632 512 900 2620 +i: 272 2247 3100 288 2247 3100 +& 728 1300 2595 736 1300 2595 +e 464 1980 2520 464 1980 2520 +e: 584 1820 2560 584 1820 2560 +a: 925 1320 2700 896 1340 2660 +o 512 860 2648 512 860 2648 +o: 512 860 2648 512 860 2648 +u: 320 740 2400 320 740 2400 +aU 847 1383 2510 360 800 2360 +eU 460 1929 2512 327 947 2367 +oU 496 900 2520 360 800 2140 +eI 608 1800 2529 408 1960 2520 +r: 648 1200 2300 640 1200 2260 +l- 352 1240 3020 352 1200 3020 +l: 352 1240 3020 352 1200 3020 +@2 512 1620 2560 512 1620 2560 +aI 912 1320 2740 360 2200 2820 +I 360 2120 2680 360 2120 2660 +U 368 880 2440 368 900 2440 diff --git a/phsource/vowelcharts/hr.png b/phsource/vowelcharts/hr.png new file mode 100644 index 00000000..b18f1d91 Binary files /dev/null and b/phsource/vowelcharts/hr.png differ diff --git a/phsource/vowelcharts/hu b/phsource/vowelcharts/hu new file mode 100644 index 00000000..45b88dfb --- /dev/null +++ b/phsource/vowelcharts/hu @@ -0,0 +1,17 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +i 312 2300 2820 312 2300 2820 +i: 280 2280 2820 200 2398 2820 +E 645 1705 2520 645 1705 2520 +e 464 1980 2520 464 1980 2520 +e: 416 2140 2660 416 2140 2660 +A 656 1000 2620 630 960 2700 +a: 925 1320 2700 896 1340 2660 +o 488 900 2520 488 900 2520 +o: 424 800 2580 408 780 2600 +u 368 880 2440 368 900 2440 +u: 320 740 2400 320 740 2400 +y 305 1692 2340 305 1692 2340 +y: 280 1720 2340 280 1720 2340 +Y 480 1560 2420 516 1520 2340 +Y: 448 1520 2420 463 1520 2400 diff --git a/phsource/vowelcharts/hu.png b/phsource/vowelcharts/hu.png new file mode 100644 index 00000000..906633df Binary files /dev/null and b/phsource/vowelcharts/hu.png differ diff --git a/phsource/vowelcharts/it b/phsource/vowelcharts/it new file mode 100644 index 00000000..82e38719 --- /dev/null +++ b/phsource/vowelcharts/it @@ -0,0 +1,19 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +a 896 1440 2720 880 1440 2700 +a/ 760 1420 2600 736 1380 2540 +e 464 1980 2520 464 1980 2520 +E 720 1760 2420 672 1562 2520 +i 280 2280 2820 200 2398 2820 +i2 312 2300 2820 312 2300 2820 +o 454 812 2559 432 824 2520 +O 670 946 2620 630 902 2700 +U 388 940 2420 394 980 2360 +u 320 740 2400 320 740 2400 +aU 847 1383 2510 360 800 2360 +eU 460 1929 2512 327 947 2367 +iU 280 2280 2820 328 957 2140 +aI 912 1320 2740 360 2200 2820 +eI 464 1980 2520 328 2280 2720 +oI 469 864 2440 310 2040 2440 +uI 321 965 2377 328 2160 2720 diff --git a/phsource/vowelcharts/it.png b/phsource/vowelcharts/it.png new file mode 100644 index 00000000..4c43d77b Binary files /dev/null and b/phsource/vowelcharts/it.png differ diff --git a/phsource/vowelcharts/nl b/phsource/vowelcharts/nl new file mode 100644 index 00000000..dca61d2b --- /dev/null +++ b/phsource/vowelcharts/nl @@ -0,0 +1,20 @@ +@ 496 1500 2420 496 1500 2420 +@- 525 1441 2340 525 1441 2340 +i 280 2247 3100 280 2220 3040 +I 384 2030 2610 384 2030 2610 +y 280 1720 2340 280 1720 2340 +8 448 1520 2420 463 1520 2400 +u 320 740 2400 320 740 2400 +E 504 1900 2544 496 1920 2552 +E2 645 1705 2520 645 1705 2520 +O 480 800 2700 480 800 2700 +a: 925 1320 2700 896 1340 2660 +A 744 1120 2680 744 1120 2680 +e: 464 1980 2520 328 2280 2720 +Y: 480 1540 2340 400 1620 2120 +o: 560 1020 2460 390 780 2140 +EI 672 1800 2440 400 2120 2660 +Wy 744 1520 2500 296 1720 2340 +VU 724 1130 2760 472 780 2500 +eU 460 1929 2512 327 947 2367 +yU 280 1720 2340 394 980 2360 diff --git a/phsource/vowelcharts/nl.png b/phsource/vowelcharts/nl.png new file mode 100644 index 00000000..55b9ee57 Binary files /dev/null and b/phsource/vowelcharts/nl.png differ diff --git a/phsource/vowelcharts/no b/phsource/vowelcharts/no new file mode 100644 index 00000000..fec5a430 --- /dev/null +++ b/phsource/vowelcharts/no @@ -0,0 +1,28 @@ +@ 456 1460 2391 456 1460 2391 +@- 525 1441 2340 525 1441 2340 +@2 584 1440 2460 600 1440 2460 +I 360 2120 2680 360 2120 2660 +i: 280 2280 2820 200 2398 2820 +y 353 1860 2438 353 1860 2438 +y: 278 2030 2490 278 2030 2490 +W 504 1340 2220 504 1340 2220 +Y: 392 1460 2180 408 1359 2201 +E 584 1820 2560 584 1820 2560 +E: 720 1760 2420 672 1562 2520 +e: 416 2140 2660 416 2140 2660 +a 760 1260 2500 760 1320 2500 +a: 760 1260 2500 760 1320 2500 +A 688 1064 2806 672 1100 2806 +A: 688 1064 2806 672 1100 2806 +O 552 860 2660 552 860 2660 +o: 424 800 2580 408 780 2600 +U 368 880 2440 368 900 2440 +u: 320 740 2400 320 740 2400 +u- 323 1520 2140 323 1520 2160 +u-: 272 1520 2100 280 1560 2120 +AI 624 980 2620 328 2127 2940 +aI 776 1340 2540 355 2222 2720 +OI 545 780 2780 310 2002 2300 +u-I 280 1720 2340 355 2222 2720 +Yy 496 1420 2180 267 2160 2772 +aU 744 1420 2500 320 1300 2338 diff --git a/phsource/vowelcharts/no.png b/phsource/vowelcharts/no.png new file mode 100644 index 00000000..ff1c0b7d Binary files /dev/null and b/phsource/vowelcharts/no.png differ diff --git a/phsource/vowelcharts/pl b/phsource/vowelcharts/pl new file mode 100644 index 00000000..b34a8de3 --- /dev/null +++ b/phsource/vowelcharts/pl @@ -0,0 +1,10 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +a 925 1320 2700 896 1340 2660 +E 647 1778 2530 647 1778 2530 +i 280 2280 2820 200 2398 2820 +O 584 940 2580 584 940 2580 +u 320 740 2400 320 740 2400 +y 452 1709 2460 452 1709 2460 +E~ 670 1719 2556 710 1672 2671 +O~ 540 896 2632 512 900 2620 diff --git a/phsource/vowelcharts/pl.png b/phsource/vowelcharts/pl.png new file mode 100644 index 00000000..92a013e4 Binary files /dev/null and b/phsource/vowelcharts/pl.png differ diff --git a/phsource/vowelcharts/pt b/phsource/vowelcharts/pt new file mode 100644 index 00000000..8dc28a17 --- /dev/null +++ b/phsource/vowelcharts/pt @@ -0,0 +1,34 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +a 896 1440 2720 880 1440 2700 +a/ 760 1420 2600 736 1380 2540 +e 464 1980 2520 464 1980 2520 +E 735 1760 2420 675 1738 2420 +i 280 2280 2820 200 2398 2820 +i2 312 2300 2820 312 2300 2820 +o 454 812 2559 432 824 2520 +O 670 946 2620 630 902 2700 +U 388 940 2420 394 980 2360 +u 320 740 2400 320 740 2400 +aU 847 1383 2510 360 800 2360 +eU 460 1929 2512 327 947 2367 +iU 280 2280 2820 328 957 2140 +aI 912 1320 2740 360 2200 2820 +eI 464 1980 2520 328 2280 2720 +oI 469 864 2440 310 2040 2440 +uI 321 965 2377 328 2160 2720 +e~ 456 2000 2520 456 2000 2520 +i~ 296 2280 2820 240 2398 2820 +o~ 448 840 2598 448 840 2598 +u~ 328 900 2360 328 900 2360 +&~ 760 1420 2600 738 1360 2540 +&U~ 773 1420 2600 392 520 2580 +oI~ 456 840 2598 312 2040 2780 +& 760 1420 2600 736 1380 2540 +&/ 760 1420 2600 736 1380 2540 +A 744 1120 2680 744 1120 2680 +y 280 2280 2820 200 2398 2820 +i/ 280 2280 2820 200 2398 2820 +EI 755 1683 2460 355 2222 2720 +OI 670 946 2620 310 2002 2300 +EU 645 1705 2520 390 957 2140 diff --git a/phsource/vowelcharts/pt.png b/phsource/vowelcharts/pt.png new file mode 100644 index 00000000..30705ee1 Binary files /dev/null and b/phsource/vowelcharts/pt.png differ diff --git a/phsource/vowelcharts/pt_pt b/phsource/vowelcharts/pt_pt new file mode 100644 index 00000000..dce28118 --- /dev/null +++ b/phsource/vowelcharts/pt_pt @@ -0,0 +1,34 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +a 896 1440 2720 880 1440 2700 +a/ 760 1420 2600 736 1380 2540 +e 464 1980 2520 464 1980 2520 +E 584 1820 2560 584 1820 2560 +i 280 2280 2820 200 2398 2820 +i2 312 2300 2820 312 2300 2820 +o 454 812 2559 432 824 2520 +O 630 920 2627 630 920 2627 +U 328 940 2380 328 920 2380 +u 328 940 2380 328 920 2380 +aU 847 1383 2510 360 800 2360 +eU 460 1929 2512 327 947 2367 +iU 280 2280 2820 328 957 2140 +aI 912 1320 2740 360 2200 2820 +eI 464 1980 2520 328 2280 2720 +oI 469 864 2440 310 2040 2440 +uI 321 965 2377 328 2160 2720 +e~ 456 2000 2520 456 2000 2520 +i~ 296 2280 2820 240 2398 2820 +o~ 448 840 2598 448 840 2598 +u~ 328 900 2360 328 900 2360 +&~ 670 1719 2556 710 1672 2671 +&U~ 773 1420 2600 392 520 2580 +oI~ 456 840 2598 312 2040 2780 +& 658 1408 2460 658 1408 2460 +&/ 658 1408 2460 658 1408 2460 +A 744 1120 2680 744 1120 2680 +y 376 1515 2440 376 1515 2440 +i/ 376 1515 2440 376 1515 2440 +EI 755 1683 2460 355 2222 2720 +OI 670 946 2620 310 2002 2300 +EU 547 1840 2536 376 980 2360 diff --git a/phsource/vowelcharts/pt_pt.png b/phsource/vowelcharts/pt_pt.png new file mode 100644 index 00000000..98a732fe Binary files /dev/null and b/phsource/vowelcharts/pt_pt.png differ diff --git a/phsource/vowelcharts/qaa b/phsource/vowelcharts/qaa new file mode 100644 index 00000000..87e94be5 --- /dev/null +++ b/phsource/vowelcharts/qaa @@ -0,0 +1,45 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +i: 296 2220 2820 200 2398 2820 +i@ 375 2156 2720 515 1595 2460 +@2 525 1441 2340 525 1441 2340 +I2 440 1837 2520 440 1837 2520 +@5 525 1441 2340 525 1441 2340 +U 445 902 2620 445 902 2620 +@L 485 891 2780 450 792 2980 +a 925 1342 2700 925 1342 2700 +a2 658 1408 2460 658 1408 2460 +aa 925 1342 2700 925 1342 2700 +E 645 1705 2520 645 1705 2520 +I 440 1837 2520 440 1837 2520 +i 440 1837 2520 440 1837 2520 +0 670 946 2620 630 902 2700 +V 605 1232 2620 605 1276 2620 +A: 775 1067 2800 795 1122 2580 +A@ 775 1067 2800 795 1122 2580 +3: 480 1408 2320 545 1419 2320 +O: 465 836 2660 530 1001 2620 +O@ 465 836 2660 530 1001 2620 +O 465 836 2660 530 1001 2620 +u: 360 1562 2260 290 1023 2220 +aU 830 1364 2440 488 900 2240 +oU 630 1353 2340 390 957 2140 +aI 860 1133 2820 440 1969 2500 +eI 755 1683 2460 355 2222 2720 +OI 545 780 2780 310 2002 2300 +e@ 720 1760 2420 672 1562 2520 +U@ 430 960 2340 590 1287 2260 +aI@ 860 1133 2820 640 1518 2400 +aU@ 945 1485 2620 705 1342 2300 +e: 464 1980 2520 464 1980 2520 +o: 454 812 2559 432 824 2520 +eU 460 1929 2512 327 947 2367 +uI 321 965 2377 328 2160 2720 +A~ 592 1000 2640 592 1000 2640 +E~ 672 1660 2624 672 1660 2624 +O~ 512 880 2624 512 880 2620 +W~ 694 1360 2624 694 1360 2624 +y: 280 1720 2340 280 1720 2340 +Y: 448 1520 2420 463 1520 2400 +W 525 1320 2200 525 1320 2200 +u- 352 1674 2372 336 1674 2372 diff --git a/phsource/vowelcharts/qaa.png b/phsource/vowelcharts/qaa.png new file mode 100644 index 00000000..dba5cf28 Binary files /dev/null and b/phsource/vowelcharts/qaa.png differ diff --git a/phsource/vowelcharts/ro b/phsource/vowelcharts/ro new file mode 100644 index 00000000..aaa1cb6b --- /dev/null +++ b/phsource/vowelcharts/ro @@ -0,0 +1,33 @@ +@ 584 1440 2460 600 1440 2460 +@- 525 1441 2340 525 1441 2340 +a 896 1440 2720 880 1440 2700 +a/ 760 1420 2600 736 1380 2540 +e 504 1900 2544 496 1920 2552 +E 720 1760 2420 672 1562 2520 +i 280 2280 2820 200 2398 2820 +i2 312 2300 2820 312 2300 2820 +o 488 900 2520 488 900 2520 +O 670 946 2620 630 902 2700 +U 388 940 2420 394 980 2360 +u 344 800 2360 344 800 2360 +aU 847 1383 2510 360 800 2360 +eU 460 1929 2512 327 947 2367 +iU 280 2280 2820 328 957 2140 +aI 912 1320 2740 360 2200 2820 +eI 464 1980 2520 328 2280 2720 +oI 469 864 2440 310 2040 2440 +uI 321 965 2377 328 2160 2720 +I^ 384 2080 2620 384 2080 2620 +i/ 280 2280 2820 200 2398 2820 +y 376 1515 2440 376 1515 2440 +Y 448 1520 2420 463 1520 2400 +@I 649 1485 2430 355 2222 2720 +@U 584 1400 2460 348 800 2294 +oU 496 900 2520 360 800 2140 +iI 280 2280 2820 200 2398 2820 +yI 336 1780 2540 200 2398 2820 +yU 360 1420 2260 290 1023 2220 +ea 672 1740 2559 896 1440 2700 +eo 555 1521 2547 520 880 2590 +e[u 452 1710 2506 344 800 2360 +Oa 668 1092 2668 896 1440 2700 diff --git a/phsource/vowelcharts/ro.png b/phsource/vowelcharts/ro.png new file mode 100644 index 00000000..606ea808 Binary files /dev/null and b/phsource/vowelcharts/ro.png differ diff --git a/phsource/vowelcharts/ru b/phsource/vowelcharts/ru new file mode 100644 index 00000000..dc740a10 --- /dev/null +++ b/phsource/vowelcharts/ru @@ -0,0 +1,26 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +i 280 2280 2820 200 2398 2820 +I# 408 1940 2540 408 1960 2540 +y 340 1680 2320 340 1680 2320 +I 360 2120 2680 360 2120 2660 +I2 360 2120 2680 360 2120 2660 +I3 360 2120 2680 360 2120 2660 +E 589 1791 2529 589 1791 2529 +E# 440 1791 2529 424 1791 2529 +E2 589 1791 2529 589 1791 2529 +E3 589 1791 2529 589 1791 2529 +A 925 1320 2700 896 1340 2660 +o 454 812 2559 432 824 2520 +O 605 1232 2620 605 1276 2620 +u 320 900 2360 320 900 2360 +u# 352 1674 2372 336 1674 2372 +u" 360 1562 2260 290 1023 2220 +8 525 1441 2340 525 1441 2340 +V 659 1278 2583 659 1278 2583 +e 376 1980 2680 544 1800 2440 +ju 280 2222 2500 400 1848 2260 +ja 485 1672 2340 795 1122 2580 +V# 659 1278 2583 659 1278 2583 +Y 452 1709 2460 452 1709 2460 +a 925 1320 2700 896 1340 2660 diff --git a/phsource/vowelcharts/ru.png b/phsource/vowelcharts/ru.png new file mode 100644 index 00000000..a0a8deef Binary files /dev/null and b/phsource/vowelcharts/ru.png differ diff --git a/phsource/vowelcharts/sk b/phsource/vowelcharts/sk new file mode 100644 index 00000000..3d3d1f2a --- /dev/null +++ b/phsource/vowelcharts/sk @@ -0,0 +1,26 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +r- 648 1200 2300 640 1200 2260 +a 925 1320 2700 896 1340 2660 +E 647 1778 2530 647 1778 2530 +i 360 2120 2680 360 2120 2660 +O 584 940 2580 584 940 2580 +u 344 800 2360 344 800 2360 +y 452 1709 2460 452 1709 2460 +E~ 670 1719 2556 710 1672 2671 +O~ 540 896 2632 512 900 2620 +i: 272 2247 3100 288 2247 3100 +& 680 1660 2520 680 1660 2520 +e 504 1900 2544 496 1920 2552 +e: 584 1820 2560 584 1820 2560 +a: 925 1320 2700 896 1340 2660 +o 512 860 2648 512 860 2648 +o: 512 860 2648 512 860 2648 +u: 320 740 2400 320 740 2400 +aU 847 1383 2510 360 800 2360 +eU 460 1929 2512 327 947 2367 +oU 496 900 2520 360 800 2140 +eI 608 1800 2529 408 1960 2520 +r: 648 1200 2300 640 1200 2260 +l- 352 1240 3020 352 1200 3020 +l: 352 1240 3020 352 1200 3020 diff --git a/phsource/vowelcharts/sk.png b/phsource/vowelcharts/sk.png new file mode 100644 index 00000000..0e24f9a5 Binary files /dev/null and b/phsource/vowelcharts/sk.png differ diff --git a/phsource/vowelcharts/sv b/phsource/vowelcharts/sv new file mode 100644 index 00000000..470b9254 --- /dev/null +++ b/phsource/vowelcharts/sv @@ -0,0 +1,23 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +i: 280 2247 3100 280 2220 3040 +I 360 2120 2680 360 2120 2660 +e: 416 2140 2660 416 2140 2660 +E 647 1778 2530 647 1778 2530 +E: 720 1760 2420 672 1562 2520 +E3 680 1660 2520 680 1660 2520 +E- 592 1580 2460 592 1580 2460 +y: 280 1980 2340 280 1980 2340 +y 384 1920 2480 384 1920 2440 +u- 360 1540 2220 360 1560 2280 +Y: 480 1560 2420 516 1520 2340 +W 587 1500 2300 587 1500 2300 +8 496 1040 2560 496 1040 2560 +a 834 1220 2690 834 1220 2690 +a2 728 1300 2595 736 1300 2595 +& 744 1560 2500 736 1580 2500 +A: 664 1000 2731 664 1020 2731 +O 552 860 2660 552 860 2660 +o: 454 812 2559 432 824 2520 +U 368 800 2660 368 800 2660 +u: 320 740 2400 320 740 2400 diff --git a/phsource/vowelcharts/sv.png b/phsource/vowelcharts/sv.png new file mode 100644 index 00000000..05500ab4 Binary files /dev/null and b/phsource/vowelcharts/sv.png differ diff --git a/phsource/vowelcharts/sw b/phsource/vowelcharts/sw new file mode 100644 index 00000000..361e319b --- /dev/null +++ b/phsource/vowelcharts/sw @@ -0,0 +1,11 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +i 280 2280 2820 200 2398 2820 +e 504 1900 2544 496 1920 2552 +a/ 728 1300 2595 736 1300 2595 +a 834 1220 2690 834 1220 2690 +o 630 920 2627 630 920 2627 +u 360 860 2360 360 860 2360 +m- 370 1120 2320 370 1040 2300 +n- 380 1804 2540 380 1804 2540 +N- 525 2552 2940 525 2552 2940 diff --git a/phsource/vowelcharts/sw.png b/phsource/vowelcharts/sw.png new file mode 100644 index 00000000..8acb1b74 Binary files /dev/null and b/phsource/vowelcharts/sw.png differ diff --git a/phsource/vowelcharts/vi b/phsource/vowelcharts/vi new file mode 100644 index 00000000..399521ec --- /dev/null +++ b/phsource/vowelcharts/vi @@ -0,0 +1,32 @@ +@ 658 1408 2460 658 1408 2460 +@- 525 1441 2340 525 1441 2340 +a 841 1409 2550 841 1409 2550 +a: 896 1440 2720 880 1440 2700 +E 735 1760 2420 675 1738 2420 +e 464 1980 2520 464 1980 2520 +i 296 2220 2820 200 2398 2820 +O 664 1000 2731 664 1020 2731 +o 512 860 2648 512 860 2648 +u 392 740 2760 392 720 2760 +y 448 1520 2420 463 1520 2400 +@: 686 1280 2595 686 1280 2595 +aI 672 1460 2430 400 2000 2700 +a:I 912 1320 2740 360 2200 2820 +@I 680 1360 2460 355 2222 2720 +@:I 605 1232 2620 400 2222 2720 +eI 464 1980 2520 328 2280 2720 +EI 755 1683 2460 355 2222 2720 +OI 670 946 2620 310 2002 2300 +oI 469 864 2440 310 2040 2440 +uI 321 965 2377 328 2160 2720 +yI 344 1500 2180 328 2160 2720 +aU 776 1240 2540 408 700 2240 +a:U 830 1364 2440 488 900 2240 +eU 460 1929 2512 327 947 2367 +EU 645 1705 2520 390 957 2140 +iU 280 2280 2820 328 957 2140 +@U 630 1353 2340 390 957 2140 +@:U 630 1353 2340 390 957 2140 +i@ 400 2180 2720 640 1500 2460 +y@ 400 1380 2140 584 1320 2342 +u@ 430 960 2340 590 1287 2260 diff --git a/phsource/vowelcharts/vi.png b/phsource/vowelcharts/vi.png new file mode 100644 index 00000000..81b272f0 Binary files /dev/null and b/phsource/vowelcharts/vi.png differ diff --git a/phsource/vowelcharts/zh_yue b/phsource/vowelcharts/zh_yue new file mode 100644 index 00000000..5d6bcb78 --- /dev/null +++ b/phsource/vowelcharts/zh_yue @@ -0,0 +1,24 @@ +@ 525 1441 2340 525 1441 2340 +@- 525 1441 2340 525 1441 2340 +aa 688 1064 2806 672 1100 2806 +aai 768 1140 2820 440 1969 2500 +aau 724 1130 2760 472 780 2500 +aan 688 1064 2806 328 720 2880 +a 658 1408 2460 658 1408 2460 +ai 649 1485 2430 355 2222 2720 +au 745 1480 2400 456 920 2240 +e 720 1760 2420 672 1562 2520 +ei 464 1980 2520 328 2280 2720 +eu 645 1705 2520 390 957 2140 +i 280 2280 2820 200 2398 2820 +iu 280 2280 2820 328 957 2140 +o 552 860 2660 552 860 2660 +oi 545 780 2780 310 2002 2300 +ou 516 860 2648 312 860 2360 +ong 568 900 2860 328 720 2960 +u 320 740 2400 320 740 2400 +ui 321 965 2377 328 2160 2720 +oe 448 1520 2420 463 1520 2400 +eo 488 1160 2540 488 1160 2540 +eoi 496 1220 2340 296 2020 2400 +yu 280 1720 2340 280 1720 2340 diff --git a/phsource/vowelcharts/zh_yue.png b/phsource/vowelcharts/zh_yue.png new file mode 100644 index 00000000..e07af31a Binary files /dev/null and b/phsource/vowelcharts/zh_yue.png differ diff --git a/phsource/vowelr/V3_r b/phsource/vowelr/V3_r new file mode 100644 index 00000000..13452a14 Binary files /dev/null and b/phsource/vowelr/V3_r differ diff --git a/phsource/vowelr/V_r b/phsource/vowelr/V_r new file mode 100644 index 00000000..3f6e23ad Binary files /dev/null and b/phsource/vowelr/V_r differ diff --git a/phsource/vowelr/aa_r b/phsource/vowelr/aa_r new file mode 100644 index 00000000..bf41c8eb Binary files /dev/null and b/phsource/vowelr/aa_r differ diff --git a/phsource/vowelr/e_r b/phsource/vowelr/e_r new file mode 100644 index 00000000..0fb18002 Binary files /dev/null and b/phsource/vowelr/e_r differ diff --git a/phsource/vowelr/o_r b/phsource/vowelr/o_r new file mode 100644 index 00000000..e741649c Binary files /dev/null and b/phsource/vowelr/o_r differ diff --git a/phsource/vowelr/oo_r b/phsource/vowelr/oo_r new file mode 100644 index 00000000..2e737c30 Binary files /dev/null and b/phsource/vowelr/oo_r differ diff --git a/phsource/vowelr/r-voc b/phsource/vowelr/r-voc new file mode 100644 index 00000000..4c441f58 Binary files /dev/null and b/phsource/vowelr/r-voc differ diff --git a/phsource/vowelr/vowelchart.png b/phsource/vowelr/vowelchart.png new file mode 100644 index 00000000..ae91e2ff Binary files /dev/null and b/phsource/vowelr/vowelchart.png differ diff --git a/phsource/vwl_af/@ b/phsource/vwl_af/@ new file mode 100644 index 00000000..2f5f49cc Binary files /dev/null and b/phsource/vwl_af/@ differ diff --git a/phsource/vwl_af/I b/phsource/vwl_af/I new file mode 100644 index 00000000..fceba2c6 Binary files /dev/null and b/phsource/vwl_af/I differ diff --git a/phsource/vwl_af/r@ b/phsource/vwl_af/r@ new file mode 100644 index 00000000..5658a022 Binary files /dev/null and b/phsource/vwl_af/r@ differ diff --git a/phsource/vwl_af/rx.wav b/phsource/vwl_af/rx.wav new file mode 100644 index 00000000..bbee12c7 Binary files /dev/null and b/phsource/vwl_af/rx.wav differ diff --git a/phsource/vwl_cy/I%% b/phsource/vwl_cy/I%% new file mode 100644 index 00000000..1e88bf63 Binary files /dev/null and b/phsource/vwl_cy/I%% differ diff --git a/phsource/vwl_de/3 b/phsource/vwl_de/3 new file mode 100644 index 00000000..e208873f Binary files /dev/null and b/phsource/vwl_de/3 differ diff --git a/phsource/vwl_de/r_I b/phsource/vwl_de/r_I new file mode 100644 index 00000000..c8e26723 Binary files /dev/null and b/phsource/vwl_de/r_I differ diff --git a/phsource/vwl_de/r_O b/phsource/vwl_de/r_O new file mode 100644 index 00000000..fa71c619 Binary files /dev/null and b/phsource/vwl_de/r_O differ diff --git a/phsource/vwl_de/r_U b/phsource/vwl_de/r_U new file mode 100644 index 00000000..1415c8b5 Binary files /dev/null and b/phsource/vwl_de/r_U differ diff --git a/phsource/vwl_de/r_a b/phsource/vwl_de/r_a new file mode 100644 index 00000000..76969d2e Binary files /dev/null and b/phsource/vwl_de/r_a differ diff --git a/phsource/vwl_de/r_aa b/phsource/vwl_de/r_aa new file mode 100644 index 00000000..9c7bce1d Binary files /dev/null and b/phsource/vwl_de/r_aa differ diff --git a/phsource/vwl_de/r_e b/phsource/vwl_de/r_e new file mode 100644 index 00000000..2ae085fc Binary files /dev/null and b/phsource/vwl_de/r_e differ diff --git a/phsource/vwl_de/r_ee b/phsource/vwl_de/r_ee new file mode 100644 index 00000000..6fe30845 Binary files /dev/null and b/phsource/vwl_de/r_ee differ diff --git a/phsource/vwl_de/r_y b/phsource/vwl_de/r_y new file mode 100644 index 00000000..7e1b3e04 Binary files /dev/null and b/phsource/vwl_de/r_y differ diff --git a/phsource/vwl_en/@L b/phsource/vwl_en/@L new file mode 100644 index 00000000..c2d5c232 Binary files /dev/null and b/phsource/vwl_en/@L differ diff --git a/phsource/vwl_en/@L_2 b/phsource/vwl_en/@L_2 new file mode 100644 index 00000000..1da217c4 Binary files /dev/null and b/phsource/vwl_en/@L_2 differ diff --git a/phsource/vwl_en/aI@ b/phsource/vwl_en/aI@ new file mode 100644 index 00000000..b694f569 Binary files /dev/null and b/phsource/vwl_en/aI@ differ diff --git a/phsource/vwl_en/aI@_2 b/phsource/vwl_en/aI@_2 new file mode 100644 index 00000000..ad77d7b5 Binary files /dev/null and b/phsource/vwl_en/aI@_2 differ diff --git a/phsource/vwl_en/aU@ b/phsource/vwl_en/aU@ new file mode 100644 index 00000000..75be9aef Binary files /dev/null and b/phsource/vwl_en/aU@ differ diff --git a/phsource/vwl_en/i b/phsource/vwl_en/i new file mode 100644 index 00000000..dc62ceb1 Binary files /dev/null and b/phsource/vwl_en/i differ diff --git a/phsource/vwl_en/u b/phsource/vwl_en/u new file mode 100644 index 00000000..95aefa97 Binary files /dev/null and b/phsource/vwl_en/u differ diff --git a/phsource/vwl_en/u_L b/phsource/vwl_en/u_L new file mode 100644 index 00000000..f94f3c52 Binary files /dev/null and b/phsource/vwl_en/u_L differ diff --git a/phsource/vwl_en_n/&i_2L b/phsource/vwl_en_n/&i_2L new file mode 100644 index 00000000..3eaa412c Binary files /dev/null and b/phsource/vwl_en_n/&i_2L differ diff --git a/phsource/vwl_en_n/&i_2_L b/phsource/vwl_en_n/&i_2_L new file mode 100644 index 00000000..c06652b3 Binary files /dev/null and b/phsource/vwl_en_n/&i_2_L differ diff --git a/phsource/vwl_en_n/O@ b/phsource/vwl_en_n/O@ new file mode 100644 index 00000000..f0140ba8 Binary files /dev/null and b/phsource/vwl_en_n/O@ differ diff --git a/phsource/vwl_en_n/u_ b/phsource/vwl_en_n/u_ new file mode 100644 index 00000000..a975130e Binary files /dev/null and b/phsource/vwl_en_n/u_ differ diff --git a/phsource/vwl_en_rp/@ b/phsource/vwl_en_rp/@ new file mode 100644 index 00000000..0543349f Binary files /dev/null and b/phsource/vwl_en_rp/@ differ diff --git a/phsource/vwl_en_rp/aU@ b/phsource/vwl_en_rp/aU@ new file mode 100644 index 00000000..309f413a Binary files /dev/null and b/phsource/vwl_en_rp/aU@ differ diff --git a/phsource/vwl_en_rp/aa b/phsource/vwl_en_rp/aa new file mode 100644 index 00000000..b18f17f4 Binary files /dev/null and b/phsource/vwl_en_rp/aa differ diff --git a/phsource/vwl_en_rp/e@ b/phsource/vwl_en_rp/e@ new file mode 100644 index 00000000..e48d8c55 Binary files /dev/null and b/phsource/vwl_en_rp/e@ differ diff --git a/phsource/vwl_en_rp/i b/phsource/vwl_en_rp/i new file mode 100644 index 00000000..13965e7f Binary files /dev/null and b/phsource/vwl_en_rp/i differ diff --git a/phsource/vwl_en_rp/i@ b/phsource/vwl_en_rp/i@ new file mode 100644 index 00000000..e77f2213 Binary files /dev/null and b/phsource/vwl_en_rp/i@ differ diff --git a/phsource/vwl_en_rp/oo b/phsource/vwl_en_rp/oo new file mode 100644 index 00000000..570b6b6a Binary files /dev/null and b/phsource/vwl_en_rp/oo differ diff --git a/phsource/vwl_en_us/3_us b/phsource/vwl_en_us/3_us new file mode 100644 index 00000000..00397062 Binary files /dev/null and b/phsource/vwl_en_us/3_us differ diff --git a/phsource/vwl_en_us/@r_us b/phsource/vwl_en_us/@r_us new file mode 100644 index 00000000..bac4c0b4 Binary files /dev/null and b/phsource/vwl_en_us/@r_us differ diff --git a/phsource/vwl_en_us/V b/phsource/vwl_en_us/V new file mode 100644 index 00000000..5f52e505 Binary files /dev/null and b/phsource/vwl_en_us/V differ diff --git a/phsource/vwl_en_us/a b/phsource/vwl_en_us/a new file mode 100644 index 00000000..b903e0a9 Binary files /dev/null and b/phsource/vwl_en_us/a differ diff --git a/phsource/vwl_en_us/ar2 b/phsource/vwl_en_us/ar2 new file mode 100644 index 00000000..7bcb287e Binary files /dev/null and b/phsource/vwl_en_us/ar2 differ diff --git a/phsource/vwl_en_us/ee b/phsource/vwl_en_us/ee new file mode 100644 index 00000000..d4624bc2 Binary files /dev/null and b/phsource/vwl_en_us/ee differ diff --git a/phsource/vwl_en_us/er b/phsource/vwl_en_us/er new file mode 100644 index 00000000..1a494f8f Binary files /dev/null and b/phsource/vwl_en_us/er differ diff --git a/phsource/vwl_en_us/er2 b/phsource/vwl_en_us/er2 new file mode 100644 index 00000000..96a51339 Binary files /dev/null and b/phsource/vwl_en_us/er2 differ diff --git a/phsource/vwl_en_us/i_final3 b/phsource/vwl_en_us/i_final3 new file mode 100644 index 00000000..1c6c4b52 Binary files /dev/null and b/phsource/vwl_en_us/i_final3 differ diff --git a/phsource/vwl_en_us/ii b/phsource/vwl_en_us/ii new file mode 100644 index 00000000..2f84047e Binary files /dev/null and b/phsource/vwl_en_us/ii differ diff --git a/phsource/vwl_en_us/ir b/phsource/vwl_en_us/ir new file mode 100644 index 00000000..6dc08a66 Binary files /dev/null and b/phsource/vwl_en_us/ir differ diff --git a/phsource/vwl_en_us/or b/phsource/vwl_en_us/or new file mode 100644 index 00000000..ad9d4617 Binary files /dev/null and b/phsource/vwl_en_us/or differ diff --git a/phsource/vwl_en_us/ur b/phsource/vwl_en_us/ur new file mode 100644 index 00000000..00fd737c Binary files /dev/null and b/phsource/vwl_en_us/ur differ diff --git a/phsource/vwl_en_wm/aa b/phsource/vwl_en_wm/aa new file mode 100644 index 00000000..f27d4467 Binary files /dev/null and b/phsource/vwl_en_wm/aa differ diff --git a/phsource/vwl_en_wm/i b/phsource/vwl_en_wm/i new file mode 100644 index 00000000..f95d8429 Binary files /dev/null and b/phsource/vwl_en_wm/i differ diff --git a/phsource/vwl_en_wm/ii b/phsource/vwl_en_wm/ii new file mode 100644 index 00000000..0306f70e Binary files /dev/null and b/phsource/vwl_en_wm/ii differ diff --git a/phsource/vwl_en_wm/u b/phsource/vwl_en_wm/u new file mode 100644 index 00000000..ef4cc423 Binary files /dev/null and b/phsource/vwl_en_wm/u differ diff --git a/phsource/vwl_fi/y b/phsource/vwl_fi/y new file mode 100644 index 00000000..3b9c2fdf Binary files /dev/null and b/phsource/vwl_fi/y differ diff --git a/phsource/vwl_fi/y_3 b/phsource/vwl_fi/y_3 new file mode 100644 index 00000000..c0c075cb Binary files /dev/null and b/phsource/vwl_fi/y_3 differ diff --git a/phsource/vwl_fr/@R b/phsource/vwl_fr/@R new file mode 100644 index 00000000..faee245d Binary files /dev/null and b/phsource/vwl_fr/@R differ diff --git a/phsource/vwl_fr/@R2 b/phsource/vwl_fr/@R2 new file mode 100644 index 00000000..3f354338 Binary files /dev/null and b/phsource/vwl_fr/@R2 differ diff --git a/phsource/vwl_hi/A b/phsource/vwl_hi/A new file mode 100644 index 00000000..212858d4 Binary files /dev/null and b/phsource/vwl_hi/A differ diff --git a/phsource/vwl_hi/I b/phsource/vwl_hi/I new file mode 100644 index 00000000..b6c3b25f Binary files /dev/null and b/phsource/vwl_hi/I differ diff --git a/phsource/vwl_hi/l-voc b/phsource/vwl_hi/l-voc new file mode 100644 index 00000000..5f120614 Binary files /dev/null and b/phsource/vwl_hi/l-voc differ diff --git a/phsource/vwl_hi/r-voc b/phsource/vwl_hi/r-voc new file mode 100644 index 00000000..3301654d Binary files /dev/null and b/phsource/vwl_hi/r-voc differ diff --git a/phsource/vwl_no/& b/phsource/vwl_no/& new file mode 100644 index 00000000..7a579b01 Binary files /dev/null and b/phsource/vwl_no/& differ diff --git a/phsource/vwl_no/@ b/phsource/vwl_no/@ new file mode 100644 index 00000000..cd54206a Binary files /dev/null and b/phsource/vwl_no/@ differ diff --git a/phsource/vwl_no/@2 b/phsource/vwl_no/@2 new file mode 100644 index 00000000..92f4d6c8 Binary files /dev/null and b/phsource/vwl_no/@2 differ diff --git a/phsource/vwl_no/@_close b/phsource/vwl_no/@_close new file mode 100644 index 00000000..cd54206a Binary files /dev/null and b/phsource/vwl_no/@_close differ diff --git a/phsource/vwl_no/aU b/phsource/vwl_no/aU new file mode 100644 index 00000000..dbab0a85 Binary files /dev/null and b/phsource/vwl_no/aU differ diff --git a/phsource/vwl_no/au- b/phsource/vwl_no/au- new file mode 100644 index 00000000..2816e67e Binary files /dev/null and b/phsource/vwl_no/au- differ diff --git a/phsource/vwl_no/e b/phsource/vwl_no/e new file mode 100644 index 00000000..2b1a4774 Binary files /dev/null and b/phsource/vwl_no/e differ diff --git a/phsource/vwl_no/ee b/phsource/vwl_no/ee new file mode 100644 index 00000000..269c79b2 Binary files /dev/null and b/phsource/vwl_no/ee differ diff --git a/phsource/vwl_no/i b/phsource/vwl_no/i new file mode 100644 index 00000000..14f7746d Binary files /dev/null and b/phsource/vwl_no/i differ diff --git a/phsource/vwl_no/ii b/phsource/vwl_no/ii new file mode 100644 index 00000000..e4975373 Binary files /dev/null and b/phsource/vwl_no/ii differ diff --git a/phsource/vwl_no/o b/phsource/vwl_no/o new file mode 100644 index 00000000..c6f496ab Binary files /dev/null and b/phsource/vwl_no/o differ diff --git a/phsource/vwl_no/oo b/phsource/vwl_no/oo new file mode 100644 index 00000000..bc40f66e Binary files /dev/null and b/phsource/vwl_no/oo differ diff --git a/phsource/vwl_no/u# b/phsource/vwl_no/u# new file mode 100644 index 00000000..6bdd87d1 Binary files /dev/null and b/phsource/vwl_no/u# differ diff --git a/phsource/vwl_no/u#2 b/phsource/vwl_no/u#2 new file mode 100644 index 00000000..ba43d4ff Binary files /dev/null and b/phsource/vwl_no/u#2 differ diff --git a/phsource/vwl_no/y b/phsource/vwl_no/y new file mode 100644 index 00000000..6cc041b5 Binary files /dev/null and b/phsource/vwl_no/y differ diff --git a/phsource/vwl_no/y# b/phsource/vwl_no/y# new file mode 100644 index 00000000..630db468 Binary files /dev/null and b/phsource/vwl_no/y# differ diff --git a/phsource/vwl_no/y#y b/phsource/vwl_no/y#y new file mode 100644 index 00000000..b38efcc9 Binary files /dev/null and b/phsource/vwl_no/y#y differ diff --git a/phsource/vwl_no/yy b/phsource/vwl_no/yy new file mode 100644 index 00000000..e6e7bae3 Binary files /dev/null and b/phsource/vwl_no/yy differ diff --git a/phsource/vwl_ro/ii- b/phsource/vwl_ro/ii- new file mode 100644 index 00000000..5b68b6c5 Binary files /dev/null and b/phsource/vwl_ro/ii- differ diff --git a/phsource/vwl_ro/li b/phsource/vwl_ro/li new file mode 100644 index 00000000..65142511 Binary files /dev/null and b/phsource/vwl_ro/li differ diff --git a/phsource/vwl_ro/mi b/phsource/vwl_ro/mi new file mode 100644 index 00000000..641978de Binary files /dev/null and b/phsource/vwl_ro/mi differ diff --git a/phsource/vwl_ro/ni b/phsource/vwl_ro/ni new file mode 100644 index 00000000..eed4955f Binary files /dev/null and b/phsource/vwl_ro/ni differ diff --git a/phsource/vwl_ro/ri b/phsource/vwl_ro/ri new file mode 100644 index 00000000..85d3ecc2 Binary files /dev/null and b/phsource/vwl_ro/ri differ diff --git a/phsource/vwl_ru/8 b/phsource/vwl_ru/8 new file mode 100644 index 00000000..9978716c Binary files /dev/null and b/phsource/vwl_ru/8 differ diff --git a/phsource/vwl_ru/E# b/phsource/vwl_ru/E# new file mode 100644 index 00000000..70ae5a66 Binary files /dev/null and b/phsource/vwl_ru/E# differ diff --git a/phsource/vwl_ru/E@ b/phsource/vwl_ru/E@ new file mode 100644 index 00000000..6f521973 Binary files /dev/null and b/phsource/vwl_ru/E@ differ diff --git a/phsource/vwl_ru/a b/phsource/vwl_ru/a new file mode 100644 index 00000000..0dd99893 Binary files /dev/null and b/phsource/vwl_ru/a differ diff --git a/phsource/vwl_ru/aa b/phsource/vwl_ru/aa new file mode 100644 index 00000000..f865a79c Binary files /dev/null and b/phsource/vwl_ru/aa differ diff --git a/phsource/vwl_ru/e b/phsource/vwl_ru/e new file mode 100644 index 00000000..ed057b1c Binary files /dev/null and b/phsource/vwl_ru/e differ diff --git a/phsource/vwl_ru/ee b/phsource/vwl_ru/ee new file mode 100644 index 00000000..67431c7e Binary files /dev/null and b/phsource/vwl_ru/ee differ diff --git a/phsource/vwl_ru/i b/phsource/vwl_ru/i new file mode 100644 index 00000000..99f34caf Binary files /dev/null and b/phsource/vwl_ru/i differ diff --git a/phsource/vwl_ru/i# b/phsource/vwl_ru/i# new file mode 100644 index 00000000..7a5fb179 Binary files /dev/null and b/phsource/vwl_ru/i# differ diff --git a/phsource/vwl_ru/ii b/phsource/vwl_ru/ii new file mode 100644 index 00000000..d4672dc9 Binary files /dev/null and b/phsource/vwl_ru/ii differ diff --git a/phsource/vwl_ru/ii# b/phsource/vwl_ru/ii# new file mode 100644 index 00000000..febab5c8 Binary files /dev/null and b/phsource/vwl_ru/ii# differ diff --git a/phsource/vwl_ru/ja b/phsource/vwl_ru/ja new file mode 100644 index 00000000..6c4a9a2e Binary files /dev/null and b/phsource/vwl_ru/ja differ diff --git a/phsource/vwl_ru/ju b/phsource/vwl_ru/ju new file mode 100644 index 00000000..f31a7319 Binary files /dev/null and b/phsource/vwl_ru/ju differ diff --git a/phsource/vwl_ru/o b/phsource/vwl_ru/o new file mode 100644 index 00000000..53714cc1 Binary files /dev/null and b/phsource/vwl_ru/o differ diff --git a/phsource/vwl_ru/oo b/phsource/vwl_ru/oo new file mode 100644 index 00000000..09b59719 Binary files /dev/null and b/phsource/vwl_ru/oo differ diff --git a/phsource/vwl_ru/u b/phsource/vwl_ru/u new file mode 100644 index 00000000..8c692ec0 Binary files /dev/null and b/phsource/vwl_ru/u differ diff --git a/phsource/vwl_ru/u# b/phsource/vwl_ru/u# new file mode 100644 index 00000000..1049a314 Binary files /dev/null and b/phsource/vwl_ru/u# differ diff --git a/phsource/vwl_ru/u#u b/phsource/vwl_ru/u#u new file mode 100644 index 00000000..db1a84b3 Binary files /dev/null and b/phsource/vwl_ru/u#u differ diff --git a/phsource/vwl_sv/r.wav b/phsource/vwl_sv/r.wav new file mode 100755 index 00000000..c5c50188 Binary files /dev/null and b/phsource/vwl_sv/r.wav differ diff --git a/phsource/vwl_sv/r_sv b/phsource/vwl_sv/r_sv new file mode 100755 index 00000000..0e2b5660 Binary files /dev/null and b/phsource/vwl_sv/r_sv differ diff --git a/phsource/vwl_sv/r_sv2 b/phsource/vwl_sv/r_sv2 new file mode 100755 index 00000000..254ed4d1 Binary files /dev/null and b/phsource/vwl_sv/r_sv2 differ diff --git a/phsource/vwl_sv/r_sv3 b/phsource/vwl_sv/r_sv3 new file mode 100644 index 00000000..8a05f5f1 Binary files /dev/null and b/phsource/vwl_sv/r_sv3 differ diff --git a/phsource/vwl_zh/aang b/phsource/vwl_zh/aang new file mode 100755 index 00000000..c7130894 Binary files /dev/null and b/phsource/vwl_zh/aang differ diff --git a/phsource/vwl_zh/ong b/phsource/vwl_zh/ong new file mode 100644 index 00000000..cb6b3816 Binary files /dev/null and b/phsource/vwl_zh/ong differ diff --git a/phsource/w/_w b/phsource/w/_w new file mode 100644 index 00000000..1e7438aa Binary files /dev/null and b/phsource/w/_w differ diff --git a/phsource/w/w b/phsource/w/w new file mode 100644 index 00000000..622e0ce3 Binary files /dev/null and b/phsource/w/w differ diff --git a/phsource/w/w2 b/phsource/w/w2 new file mode 100644 index 00000000..797e7d0a Binary files /dev/null and b/phsource/w/w2 differ diff --git a/phsource/w/w@ b/phsource/w/w@ new file mode 100644 index 00000000..4bc3f08c Binary files /dev/null and b/phsource/w/w@ differ diff --git a/phsource/w/w_ b/phsource/w/w_ new file mode 100644 index 00000000..e7f60826 Binary files /dev/null and b/phsource/w/w_ differ diff --git a/phsource/w/wa b/phsource/w/wa new file mode 100644 index 00000000..4c07b8c2 Binary files /dev/null and b/phsource/w/wa differ diff --git a/phsource/w/we b/phsource/w/we new file mode 100644 index 00000000..3d758b91 Binary files /dev/null and b/phsource/w/we differ diff --git a/phsource/w/wi b/phsource/w/wi new file mode 100644 index 00000000..a192d82e Binary files /dev/null and b/phsource/w/wi differ diff --git a/phsource/w/wi2 b/phsource/w/wi2 new file mode 100644 index 00000000..e2519a88 Binary files /dev/null and b/phsource/w/wi2 differ diff --git a/phsource/w/wo b/phsource/w/wo new file mode 100644 index 00000000..6add06ef Binary files /dev/null and b/phsource/w/wo differ diff --git a/phsource/w/wu b/phsource/w/wu new file mode 100644 index 00000000..42ddee2c Binary files /dev/null and b/phsource/w/wu differ diff --git a/phsource/w/xw b/phsource/w/xw new file mode 100644 index 00000000..a1acbadc Binary files /dev/null and b/phsource/w/xw differ diff --git a/phsource/x/b.wav b/phsource/x/b.wav new file mode 100644 index 00000000..b2ffb3e5 Binary files /dev/null and b/phsource/x/b.wav differ diff --git a/phsource/x/b_.wav b/phsource/x/b_.wav new file mode 100644 index 00000000..525bc508 Binary files /dev/null and b/phsource/x/b_.wav differ diff --git a/phsource/x/d.wav b/phsource/x/d.wav new file mode 100644 index 00000000..d8dbbf36 Binary files /dev/null and b/phsource/x/d.wav differ diff --git a/phsource/x/d_.wav b/phsource/x/d_.wav new file mode 100644 index 00000000..10ed048d Binary files /dev/null and b/phsource/x/d_.wav differ diff --git a/phsource/x/d_dnt.wav b/phsource/x/d_dnt.wav new file mode 100644 index 00000000..00a21fc8 Binary files /dev/null and b/phsource/x/d_dnt.wav differ diff --git a/phsource/x/d_pzd.wav b/phsource/x/d_pzd.wav new file mode 100644 index 00000000..26c5ca2f Binary files /dev/null and b/phsource/x/d_pzd.wav differ diff --git a/phsource/x/dz_pzd.wav b/phsource/x/dz_pzd.wav new file mode 100644 index 00000000..41b90310 Binary files /dev/null and b/phsource/x/dz_pzd.wav differ diff --git a/phsource/x/dz_pzd2.wav b/phsource/x/dz_pzd2.wav new file mode 100644 index 00000000..68f0f0bf Binary files /dev/null and b/phsource/x/dz_pzd2.wav differ diff --git a/phsource/x/dz_pzd_.wav b/phsource/x/dz_pzd_.wav new file mode 100644 index 00000000..7df43ca3 Binary files /dev/null and b/phsource/x/dz_pzd_.wav differ diff --git a/phsource/x/dzh.wav b/phsource/x/dzh.wav new file mode 100644 index 00000000..32bde42d Binary files /dev/null and b/phsource/x/dzh.wav differ diff --git a/phsource/x/dzh_.wav b/phsource/x/dzh_.wav new file mode 100644 index 00000000..22b1308d Binary files /dev/null and b/phsource/x/dzh_.wav differ diff --git a/phsource/x/g.wav b/phsource/x/g.wav new file mode 100644 index 00000000..225deffc Binary files /dev/null and b/phsource/x/g.wav differ diff --git a/phsource/x/g2.wav b/phsource/x/g2.wav new file mode 100644 index 00000000..318c1f19 Binary files /dev/null and b/phsource/x/g2.wav differ diff --git a/phsource/x/g2_.wav b/phsource/x/g2_.wav new file mode 100644 index 00000000..886c9890 Binary files /dev/null and b/phsource/x/g2_.wav differ diff --git a/phsource/x/g_.wav b/phsource/x/g_.wav new file mode 100644 index 00000000..c0761724 Binary files /dev/null and b/phsource/x/g_.wav differ diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 00000000..a125453a --- /dev/null +++ b/src/Makefile @@ -0,0 +1,96 @@ +BINDIR=/usr/bin +INCDIR=/usr/include/espeak +LIBDIR=/usr/lib +DATADIR=/usr/share/espeak-data + +RELEASE = 1.24 +BIN_NAME = speak +BIN2_NAME = espeak +LIB_NAME = libespeak.so +STATIC_LIB_NAME = libespeak.a +LIB_VERSION = 1 +LIBTAG = $(LIB_VERSION).$(RELEASE) + +INSTALL = /usr/bin/install +LN_SF = /bin/ln -sf +MKDIR = mkdir -p + +speak_SOURCES = speak.cpp compiledict.cpp dictionary.cpp intonation.cpp \ + readclause.cpp setlengths.cpp numbers.cpp synth_mbrola.cpp \ + synthdata.cpp synthesize.cpp translate.cpp tr_english.cpp \ + tr_languages.cpp voices.cpp wavegen.cpp phonemelist.cpp + +libespeak_SOURCES = speak_lib.cpp compiledict.cpp dictionary.cpp intonation.cpp \ + readclause.cpp setlengths.cpp numbers.cpp synth_mbrola.cpp \ + synthdata.cpp synthesize.cpp translate.cpp tr_english.cpp \ + tr_languages.cpp voices.cpp wavegen.cpp phonemelist.cpp \ + espeak_command.cpp event.cpp fifo.cpp wave.cpp debug.cpp + + +SRCS1=$(speak_SOURCES) +OBJS1=$(patsubst %.cpp,%.o,$(SRCS1)) +LIBS1=-lstdc++ -lportaudio -lpthread + +SRCS2=$(libespeak_SOURCES) +OBJS2=$(patsubst %.cpp,x_%.o,$(SRCS2)) +LIBS2=-lstdc++ -lportaudio -lpthread + +SRCS3 = espeak.cpp +OBJS3=$(patsubst %.cpp,%.o,$(SRCS3)) +LIBS3=-lstdc++ ./libespeak.so + +CXXFLAGS=-O2 + + +all: $(BIN_NAME) $(LIB_NAME) $(STATIC_LIB_NAME) $(BIN2_NAME) + mv $(LIB_NAME) $(LIB_NAME).$(LIBTAG) + +.cpp.o: + $(CXX) $(CXXFLAGS) -D PATH_ESPEAK_DATA=\"$(DATADIR)\" -Wall -pedantic -I. -c -fno-exceptions $< + +$(BIN_NAME): $(OBJS1) + $(CXX) -o $@ $(OBJS1) $(LIBS1) + +$(BIN2_NAME): $(OBJS3) $(LIB_NAME) + $(CXX) -o $@ $(OBJS3) $(LIBS3) + + + +x_%.o: %.cpp + $(CXX) $(CXXFLAGS) -Wall -fpic -fvisibility=hidden -pedantic \ + -I. -D LIBRARY -c -fno-exceptions $< -o x_$*.o + +$(LIB_NAME): $(OBJS2) + $(CXX) -shared -Wl,-soname,$(LIB_NAME).$(LIB_VERSION) -o $@ $(OBJS2) $(LIBS2) + +$(STATIC_LIB_NAME): $(OBJS2) + $(AR) cqs $(STATIC_LIB_NAME) $(OBJS2) + +clean: + rm -f *.o *.a *~ + +distclean: clean + rm -f $(BIN_NAME) + rm -f $(BIN2_NAME) + rm -f $(LIB_NAME)* + +install: all + # Create directories + rm -rf $(DESTDIR)$(DATADIR) + $(MKDIR) $(DESTDIR)$(BINDIR) + $(MKDIR) $(DESTDIR)$(LIBDIR) + $(MKDIR) $(DESTDIR)$(INCDIR) + $(MKDIR) $(DESTDIR)$(DATADIR) + # Install espeak executable + $(INSTALL) -m 755 $(BIN2_NAME) $(DESTDIR)$(BINDIR) + # Install shared library + $(INSTALL) -m 755 $(LIB_NAME).$(LIBTAG) $(DESTDIR)$(LIBDIR) + # Install static library + $(INSTALL) -m 755 $(STATIC_LIB_NAME) $(DESTDIR)$(LIBDIR) + $(LN_SF) $(LIB_NAME).$(LIBTAG) $(DESTDIR)$(LIBDIR)/$(LIB_NAME).$(LIB_VERSION) + $(LN_SF) $(LIB_NAME).$(LIB_VERSION) $(DESTDIR)$(LIBDIR)/$(LIB_NAME) + # Install development headers + $(INSTALL) -pm 644 speak_lib.h $(DESTDIR)$(INCDIR) + # Install data files + cp -prf ../espeak-data/* $(DESTDIR)$(DATADIR) + diff --git a/src/StdAfx.h b/src/StdAfx.h new file mode 100644 index 00000000..c9a526fd --- /dev/null +++ b/src/StdAfx.h @@ -0,0 +1,3 @@ +// This is a dummy file. +// A file of this name is needed on Windows + diff --git a/src/compiledata.cpp b/src/compiledata.cpp new file mode 100755 index 00000000..02e85a68 --- /dev/null +++ b/src/compiledata.cpp @@ -0,0 +1,2138 @@ +/*************************************************************************** + * Copyright (C) 2005, 2006 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + + +#include +#include +#include +#include + +#include "wx/wx.h" +#include "wx/wfstream.h" +#include "wx/dir.h" +#include "wx/filename.h" + +#include "speak_lib.h" +#include "main.h" +#include "speech.h" +#include "voice.h" +#include "spect.h" +#include "options.h" +#include "phoneme.h" +#include "synthesize.h" + + +#define tNUMBER 1 +#define tSTRING 2 +#define tPHONEMEMNEM 3 +#define tKEYWORD 4 +#define tSIGNEDNUMBER 5 + +#define tPHONEMESTART 1 +#define tEND 2 +#define tSPECT 3 +#define tWAVE 4 +#define tSTARTTYPE 5 +#define tENDTYPE 6 +#define tBEFORE 7 +#define tAFTER 8 +#define tTONESPEC 9 +#define tLENGTHMOD 11 +#define tLENGTH 12 +#define tLONGLENGTH 13 +#define tOLDNAME 14 +#define tREDUCETO 15 +#define tFIXEDCODE 16 +#define tBEFOREVOWEL 17 +#define tBEFOREVOWELPAUSE 18 +#define tBEFORENOTVOWEL 19 +#define tLINKOUT 20 +#define tSWITCHVOICING 21 +#define tVOWELIN 22 +#define tVOWELOUT 23 +#define tAPPENDPH 24 + +#define tPHONEMENUMBER 29 +#define tPHONEMETABLE 30 +#define tINCLUDE 31 + +extern void Write4Bytes(FILE *f, int value); +extern void MakeVowelLists(void); +extern int CompileDictionary(const char *dsource, const char *dict_name, FILE *log, char *fname); +extern char voice_name[]; + +static int markers_used[8]; + +#define N_USED_BY 12 +typedef struct { + void *link; + int value; + short n_uses; + short n_used_by; + unsigned char used_by[N_USED_BY]; + char string[1]; +} REF_HASH_TAB; + + +class Compile +{//========== +public: + Compile(); + void CPhonemeTab(const char *path); + +private: + int CPhoneme(); + void StartPhonemeTable(const char *name); + void EndPhonemeTable(); + void CPhonemeFiles(char *path_source); + int NextItem(int type); + void UngetItem(); + void Error(const char *msg); + void Error(const char *msg, const char *msg2); + void Summary(FILE *f); + void SummarySpect(FILE *f,unsigned int value); + void SummarySpectList(FILE *f,int ref,const char *label); + const char *PhonemeMnem(int phcode); + void WritePhonemeTable(); + void Report(); + + int LookupPhoneme(const char *string, int declare); + void ReservePhCode(const char *string, int value); + const char *GetKeyMnem(int value); + int LoadSpect(const char *path, int control); + int LoadWavefile(FILE *f, const char *fname); + int LoadEnvelope(FILE *f, const char *fname); + int LoadDataFile(const char *path, int control); + int AddSpect(int phcode, int *list, int control); + void AddSpectList(int *list, int control); + void AddEnvelope(int *list); + void VowelTransition(int which, unsigned int *trans); + + + FILE *f_in; + FILE *f_phdata; + FILE *f_phcontents; + FILE *f_errors; + FILE *f_phindex; + FILE *f_phtab; + int f_in_displ; + int f_in_linenum; + + PHONEME_TAB *ph; + + int linenum; + int item_type; + char current_fname[80]; + char item_string[256]; + char phoneme_tab_name[N_PHONEME_TAB_NAME]; + unsigned int vowel_in[2]; + unsigned int vowel_out[2]; + + int n_phcodes_list[N_PHONEME_TABS]; + PHONEME_TAB_LIST phoneme_tab_list2[N_PHONEME_TABS]; + PHONEME_TAB *phoneme_tab2; + int n_phoneme_tabs; + + + int n_phcodes; + + int count_references; + int duplicate_references; + int count_frames; + int error_count; + + REF_HASH_TAB *ref_hash_tab[256]; + + typedef struct { + FILE *file; + int linenum; + char fname[80]; + } STACK; + + #define N_STACK 12 + int stack_ix; + STACK stack[N_STACK]; + +}; + +char path_source[80]; + +Compile *compile; + +typedef struct { + const char *mnem; + int data; +} keywtab_t; + +static keywtab_t keywords[] = { + {"vowel", 0x1000000+phVOWEL}, + {"liquid", 0x1000000+phLIQUID}, + {"pause", 0x1000000+phPAUSE}, + {"stress", 0x1000000+phSTRESS}, + {"virtual", 0x1000000+phVIRTUAL}, + + {"fricative", 0x1000000+phFRICATIVE}, + {"vstop", 0x1000000+phVSTOP}, + {"vfricative",0x1000000+phVFRICATIVE}, + + // type of consonant + {"stop", 0x1000000+phSTOP}, + {"frc", 0x1000000+phFRICATIVE}, + {"nasal", 0x1000000+phNASAL}, + {"flp", 0x1000000+phVSTOP}, + {"afr", 0x1000000+phSTOP}, // treat as stop + {"apr", 0x1000000+phFRICATIVE}, // [h] voiceless approximant + + + // keywords + {"phonemenumber", 29}, + {"phonemetable", 30}, + {"include", 31}, + + {"phoneme", 1}, + {"endphoneme", 2}, + {"formants", 3}, + {"wave", 4}, + {"starttype",5}, + {"endtype", 6}, + {"before", 7}, + {"after", 8}, + {"tone", 9}, + {"lengthmod",11}, + {"length", 12}, + {"longlength", 13}, + {"reduceto", 15}, + {"beforevowel", 17}, + {"beforevowelpause", 18}, + {"beforenotvowel",19}, + {"linkout",20}, + {"switchvoicing",21}, + {"vowelin",22}, + {"vowelout",23}, + {"appendph",24}, + + // flags + {"wavef", 0x2000000+phWAVE}, + {"unstressed", 0x2000000+phUNSTRESSED}, + {"fortis", 0x2000000+phFORTIS}, + {"sibilant", 0x2000000+phSIBILANT}, + {"nolink", 0x2000000+phNOLINK}, + {"trill", 0x2000000+phTRILL}, + {"vowel2", 0x2000000+phVOWEL2}, + {"palatal", 0x2000000+phPALATAL}, + {"long", 0x2000000+phLONG}, + + // voiced / unvoiced + {"vcd", 0x2000000+phVOICED}, + {"vls", 0x2000000+phFORTIS}, + + // place of articulation + {"blb", 0x2010000}, + {"lbd", 0x2020000}, + {"dnt", 0x2030000}, + {"alv", 0x2040000}, + {"rfx", 0x2050000}, + {"pla", 0x2060000}, + {"pal", 0x2070000}, + {"vel", 0x2080000}, + {"lbv", 0x2090000}, + {"uvl", 0x20a0000}, + {"phr", 0x20b0000}, + {"glt", 0x20c0000}, + + // vowel transition attributes + {"len=", 0x3000001}, + {"rms=", 0x3000002}, + {"f1=", 0x3000003}, + {"f2=", 0x3000004}, + {"f3=", 0x3000005}, + {"brk", 0x3000006}, + {"rate", 0x3000007}, + {"glstop", 0x3000008}, + {"lenadd", 0x3000009}, + {"f4", 0x300000a}, + {"paus", 0x300000b}, + {"colr=",0x300000c}, + {"", -1} +}; + + +extern void strncpy0(char *to,const char *from, int size); + + + +static unsigned int StringToWord(const char *string) +{//================================================= +// Pack 4 characters into a word + int ix; + unsigned char c; + unsigned int word; + + word = 0; + for(ix=0; ix<4; ix++) + { + if(string[ix]==0) break; + c = string[ix]; + word |= (c << (ix*8)); + } + return(word); +} + + +int Read4Bytes(FILE *f) +{//==================== +// Read 4 bytes (least significant first) into a word + int ix; + unsigned char c; + int acc=0; + + for(ix=0; ix<4; ix++) + { + c = fgetc(f) & 0xff; + acc += (c << (ix*8)); + } + return(acc); +} + + +static FILE *fopen_log(FILE *f_log, const char *fname,const char *access) +{//================================================== +// performs fopen, but produces error message to f_log if it fails + FILE *f; + + if((f = fopen(fname,access)) == NULL) + { + if(f_log != NULL) + fprintf(f_log,"Can't access (%s) file '%s'\n",access,fname); + } + return(f); +} + + +int Hash8(const char *string) +//=========================== +/* Generate a hash code from the specified string */ +{ + int c; + int chars=0; + int hash=0; + + while((c = *string++) != 0) + { + c = tolower(c) - 'a'; + hash = hash * 8 + c; + hash = (hash & 0x1ff) ^ (hash >> 8); /* exclusive or */ + chars++; + } + + return((hash+chars) & 0xff); +} // end of Hash8 + + + + + +Compile::Compile() +{//=============== + + linenum = 0; +} + + +void Compile::Error(const char *msg) +{//================================= + fprintf(f_errors,"%3d: %s\n",linenum,msg); + error_count++; +} + +void Compile::Error(const char *msg, const char *msg2) +{//================================= + fprintf(f_errors,"%3d: %s: '%s'\n",linenum,msg,msg2); + error_count++; +} + + + +const char *Compile::PhonemeMnem(int phcode) +{//========================================== + if((phcode >= 0) && (phcode < N_PHONEME_TAB)) + return(WordToString(phoneme_tab2[phcode].mnemonic)); + else + return("???"); +} + + +const char *Compile::GetKeyMnem(int value) +{//======================================= + keywtab_t *p; + + p = keywords; + + while(p->data != -1) + { + if(p->data == value) + return(p->mnem); + p++; + } + return("???"); +} + + +void Compile::ReservePhCode(const char *string, int value) +{//======================================================= +// Use a fixed number for this phoneme. Must be used before any +// phonemes are declared + unsigned int word; + + word = StringToWord(string); + + phoneme_tab2[value].mnemonic = word; + phoneme_tab2[value].code = value; + if(n_phcodes <= value) + n_phcodes = value+1; +} + + +int Compile::LookupPhoneme(const char *string, int control) +{//======================================================== +// control = 0 explicit declaration +// control = 1 declare phoneme if not found +// control = 2 start looking after control & stress phonemes + + int ix; + int start; + int use; + unsigned int word; + + if(strcmp(string,"NULL")==0) + return(1); + + ix = strlen(string); + if((ix==0) || (ix> 4)) + { + Error("Bad phoneme",string); + } + word = StringToWord(string); + + // don't use phoneme number 0, reserved for string terminator + start = 1; + + if(control==2) + start = 8; // don't look for control and stress phonemes (allows these characters to be + // used for other purposes) + + use = 0; + for(ix=start; ix= N_PHONEME_TAB-1) + return(-1); // phoneme table is full + use = n_phcodes++; + } + + // add this phoneme to the phoneme table + phoneme_tab2[use].mnemonic = word; + phoneme_tab2[use].type = phINVALID; + phoneme_tab2[use].spect = linenum; // for error report if the phoneme remains undeclared + return(use); +} // end of Compile::LookupPhoneme + + + +int Compile::NextItem(int type) +{//============================ + int acc; + unsigned char c=0; + unsigned char c2; + int ix; + int sign; + int keyword; + keywtab_t *p; + + f_in_displ = ftell(f_in); + f_in_linenum = linenum; + + while(!feof(f_in)) + { + c = fgetc(f_in); + if(c=='/') + { + if((c2 = fgetc(f_in))=='/') + { + // comment, ignore to end of line + while(!feof(f_in) && ((c=fgetc(f_in)) != '\n')); + } + else + { + ungetc(c2,f_in); + } + } + if(c == '\n') linenum++; + if(!isspace(c)) + { + break; + } + } + if(feof(f_in)) + return(tEND); + + if((type == tNUMBER) || (type == tSIGNEDNUMBER)) + { + acc = 0; + sign = 1; + if((c == '-') && (type == tSIGNEDNUMBER)) + { + sign = -1; + c = fgetc(f_in); + } + if(!isdigit(c)) + Error("Expected number"); + while(isdigit(c)) + { + acc *= 10; + acc += (c - '0'); + c = fgetc(f_in); + } + ungetc(c,f_in); + return(acc * sign); + } + + ix = 0; + while(!feof(f_in) && !isspace(c)) + { + item_string[ix++] = c; + c = fgetc(f_in); + if(item_string[ix-1] == '=') + break; + } + ungetc(c,f_in); + item_string[ix] = 0; + + if(feof(f_in)) return(-1); + + keyword = -1; + + if(type == tSTRING) + { + return(0); + } + if(type == tKEYWORD) + { + p = keywords; + while(p->data != -1) + { + if(strcmp(item_string,p->mnem)==0) + { + item_type = p->data >> 24; + return(p->data & 0xffffff); + } + p++; + } + item_type = -1; + return(-1); // keyword not found + } + if(type == tPHONEMEMNEM) + { + return(LookupPhoneme(item_string,2)); + } + return(-1); +} // end of Compile::NextItem + + +void Compile::UngetItem() +{//====================== + fseek(f_in,f_in_displ,SEEK_SET); + linenum = f_in_linenum; +} // end of Compile::UngetItem + + + +int Compile::LoadSpect(const char *path, int control) +{//================================================= + SpectSeq *spectseq; + int peak; + int displ; + int frame; + int ix; + int x; + int rms; + float total; + float pkheight; + SpectFrame *fr; + wxString path_sep = _T("/"); + + SPECT_SEQ seq_out; + + // create SpectSeq and import data + spectseq = new SpectSeq; + if(spectseq == NULL) + { + Error("Failed to create SpectSeq"); + return(0); + } + + wxString filename = path_phsource + path_sep + wxString(path,wxConvLocal); + wxFileInputStream stream(filename); + + if(stream.Ok() == FALSE) + { + Error("Failed to open",path); + return(0); + } + spectseq->Load(stream); + + displ = ftell(f_phdata); + + seq_out.n_frames=0; + seq_out.flags=0; + seq_out.length=0; + + total = 0; + for(frame=0; frame < spectseq->numframes; frame++) + { + +#ifdef deleted +for(ix=0; ix<8; ix++) +{ + // find which files have certain markers set + if(spectseq->frames[frame]->markers & (1<frames[frame]->keyframe) + { + seq_out.n_frames++; + if(frame > 0) + total += spectseq->frames[frame-1]->length; + } + } + seq_out.length = int(total); + + if((control & 1) && (spectseq->numframes > 2)) + { + // set a marker flag for the second frame of a vowel + spectseq->frames[1]->markers |= FRFLAG_VOWEL_CENTRE; + } + + ix = 0; + for(frame=0; frame < spectseq->numframes; frame++) + { + fr = spectseq->frames[frame]; + + if(fr->keyframe) + { + x = int(fr->length + 0.5); // round to nearest mS + if(x > 255) x = 255; + seq_out.frame[ix].length = x; + + seq_out.frame[ix].frflags = fr->markers; + rms = int(fr->GetRms(spectseq->amplitude)); + if(rms > 255) rms = 255; + seq_out.frame[ix].rms = rms; + + if(ix == (seq_out.n_frames-1)) + seq_out.frame[ix].length = 0; // give last frame zero length + + // write: peak data + count_frames++; + for(peak=0; peakpeaks[peak].pkfreq; + pkheight = spectseq->amplitude * fr->amp_adjust * fr->peaks[peak].pkheight; + pkheight = pkheight/640000; + if(pkheight > 255) pkheight = 255; + seq_out.frame[ix].fheight[peak] = int(pkheight); + + if(peak < 6) + { + x = fr->peaks[peak].pkwidth/4; + if(x > 255) x = 255; + seq_out.frame[ix].fwidth[peak] = x; + + x = fr->peaks[peak].pkright/4; + if(x > 255) x = 255; + seq_out.frame[ix].fright[peak] = x; + } + } + +#ifdef LOG_DETAIL +fprintf(f_errors,"Frame %d %3dmS rms=%3d flags=%2d pk=%4d %4d %4d",ix,seq_out.frame[ix].length, + seq_out.frame[ix].rms,seq_out.frame[ix].flags, + seq_out.frame[ix].peaks[1].pkfreq,seq_out.frame[ix].peaks[2].pkfreq,seq_out.frame[ix].peaks[3].pkfreq); + + if(fr->markers != 0) + { + fprintf(f_errors," [%x]",fr->markers); + } + fputc('\n',f_errors); +#endif + + ix++; + } + } + + ix = (char *)(&seq_out.frame[seq_out.n_frames]) - (char *)(&seq_out); + ix = (ix+3) & 0xfffc; // round up to multiple of 4 bytes + + fwrite(&seq_out,ix,1,f_phdata); + + delete spectseq; + return(displ); +} // end of Compile::LoadSpect + + + +int Compile::LoadWavefile(FILE *f, const char *fname) +{//================================================== + int displ; + unsigned char c1; + unsigned char c3; + int c2; + int sample; + int sample2; + float x; + int max = 0; + int length; + int sr1, sr2; + int resample_wav = 0; + char fname_temp[100]; + int scale_factor=0; + char command[200]; + + fseek(f,24,SEEK_SET); + sr1 = Read4Bytes(f); + sr2 = Read4Bytes(f); + fseek(f,40,SEEK_SET); + + if((sr1 != samplerate) || (sr2 != sr1*2)) + { +#ifdef PLATFORM_WINDOWS + if(sr1 != samplerate) + { + fprintf(f_errors,"Wrong samplerate %d, wants %d\n",sr1,samplerate); + Error("Wrong samplerate: ",fname); + } + if(sr2 != sr1*2) + { + Error("Not mono: ",fname); + } +#else + sprintf(fname_temp,"%s.wav",tmpnam(NULL)); + sprintf(command,"sox \"%s%s.wav\" -r %d -c 1 -w %s polyphase\n",path_source,fname,samplerate,fname_temp); + if(system(command) < 0) + { + Error("Failed to resample: ",command); + return(0); + } + + f = fopen(fname_temp,"rb"); + if(f == NULL) + { + Error("Can't read temp file: ",fname_temp); + return(0); + } + resample_wav = 1; + fseek(f,40,SEEK_SET); // skip past the WAV header, up to before "data length" +#endif + } + + displ = ftell(f_phdata); + + // data contains: 4 bytes of length (n_samples * 2), followed by 2-byte samples (lsb byte first) + length = Read4Bytes(f); + + while(!feof(f)) + { + c1 = fgetc(f); + c3 = fgetc(f); + if(feof(f)) break; + + c2 = c3 << 24; + c2 = c2 >> 16; // sign extend + + sample = (c1 & 0xff) + c2;; + + if(sample > max) + max = sample; + else + if(sample < -max) + max = -sample; + + } + if(max > 1) + { + scale_factor = (max / 127) + 1; + } + else + scale_factor = 0; + +//fprintf(f_errors," sample len=%d max=%4x shift=%d\n",length,max,scale_factor); + +#define MIN_FACTOR 6 + if(scale_factor > MIN_FACTOR) + { + length = length/2 + (scale_factor << 16); + } + + Write4Bytes(f_phdata,length); +// fwrite(&length,4,1,f_phdata); + fseek(f,44,SEEK_SET); + + while(!feof(f)) + { + c1 = fgetc(f); + c3 = fgetc(f); + c2 = c3 << 24; + c2 = c2 >> 16; // sign extend + + sample = (c1 & 0xff) + c2; + + if(feof(f)) break; + + if(scale_factor <= MIN_FACTOR) + { + fputc(sample & 0xff,f_phdata); + fputc(sample >> 8,f_phdata); + } + else + { + x = (float(sample) / scale_factor) + 0.5; + sample2= int(x); + if(sample2 > 127) + sample2 = 127; + if(sample2 < -128) + sample2 = -128; + fputc(sample2,f_phdata); + } + } + + length = ftell(f_phdata); + while((length & 3) != 0) + { + // pad to a multiple of 4 bytes + fputc(0,f_phdata); + length++; + } + + if(resample_wav != 0) + { + fclose(f); + remove(fname_temp); + } + return(displ | 0x800000); // set bit 23 to indicate a wave file rather than a spectrum +} // end of Compile::LoadWavefile + + + +int Compile::LoadEnvelope(FILE *f, const char *fname) +{//================================================== + int displ; + char buf[128]; + + displ = ftell(f_phdata); + + fseek(f,12,SEEK_SET); + fread(buf,1,128,f); + fwrite(buf,1,128,f_phdata); + + return(displ); +} + + +int Compile::LoadDataFile(const char *path, int control) +{//==================================================== + // load spectrum sequence or sample data from a file. + // return index into spect or sample data area. bit 23=1 if a sample + + FILE *f; + int id; + int ix; + int hash; + int type_code=' '; + REF_HASH_TAB *p, *p2; + char buf[256]; + + count_references++; + + hash = Hash8(path); + p = ref_hash_tab[hash]; + while(p != NULL) + { + if(strcmp(path,p->string)==0) + { + int found = 0; + + duplicate_references++; + p->n_uses++; + + // add the current phoneme table to a list of users of this data file, if not already listed + for(ix=0; (ix < p->n_used_by) && (ix < N_USED_BY); ix++) + { + if(p->used_by[ix] == n_phoneme_tabs) + { + found = 1; + break; + } + } + if(found == 0) + { + if(ix < N_USED_BY) + { + p->used_by[ix] = n_phoneme_tabs; + } + p->n_used_by++; + } + + return(p->value); // already loaded this data + } + p = (REF_HASH_TAB *)p->link; + } + + sprintf(buf,"%s%s",path_source,path); + + if(strcmp(path,"NULL")==0) + return(0); + if(strcmp(path,"DFT")==0) + return(1); + + if((f = fopen(buf,"rb")) == NULL) + { + sprintf(buf,"%s%s.wav",path_source,path); + if((f = fopen(buf,"rb")) == NULL) + { + Error("Can't read file",path); + return(0); + } + } + + id = Read4Bytes(f); +// fread(&id,1,4,f); + rewind(f); + + if(id == 0x43455053) + { + ix = LoadSpect(path, control); + type_code = 'S'; + } + else + if(id == 0x46464952) + { + ix = LoadWavefile(f,path); + type_code = 'W'; + } + else + if(id == 0x43544950) + { + ix = LoadEnvelope(f,path); + type_code = 'E'; + } + else + { + Error("File not SPEC or RIFF",path); + ix = -1; + } + fclose(f); + + if(ix > 0) + { +// fprintf(f_phcontents,"%c %-15s %4d 0x%.5x %s\n",type_code,current_fname,linenum,ix & 0x7fffff,path); + fprintf(f_phcontents,"%c 0x%.5x %s\n",type_code,ix & 0x7fffff,path); + } + + // add this item to the hash table + p = ref_hash_tab[hash]; + p2 = (REF_HASH_TAB *)malloc(sizeof(REF_HASH_TAB)+strlen(path)+1); + p2->value = ix; + p2->n_uses = 1; + p2->n_used_by = 1; + strcpy(p2->string,path); + p2->used_by[0] = n_phoneme_tabs; + p2->link = (char *)p; + ref_hash_tab[hash] = p2; + + return(ix); +} // end of Compile::LoadDataFile + + + +void Compile::AddEnvelope(int *list) +{//================================ + NextItem(tSTRING); + *list++ = LoadDataFile(item_string,0); + list[0] = 0; +} + + +int Compile::AddSpect(int phcode, int *list, int control) +{//===================================================== + int sign; + int sign2; + int all_digits; + char *p; + char *p2; + int spect; + int value; + int count = 0; + int v_in = vowel_in[0]; + int v_out = vowel_out[0]; + + sign = 0; + all_digits=0; + p = p2 = item_string; + for(;;) + { + if((*p == 0) || (*p == '+') || (((*p == '-') || (*p == '%')) && isdigit(p[1]))) + { + sign2 = *p; + *p = 0; + + if(all_digits) + { + value = atoi(p2); + if(sign == '+') + *list++ = 1 + (value<<8); + else + if(sign == '-') + *list++ = 2 + (value<<8); + else + { + value = (value * 32)/100; // convert from % to 1/32s + *list++ = 3 + (value<<8); + } + count++; + } + else + { + spect = LoadDataFile(p2, control); + if(spect != -1) + { + *list++ = phcode + (spect<<8); + count++; + + + // vowel formant transitions specified ? + if(v_in != 0) + { + *list++ = 0x4 + (vowel_in[0] << 8); + *list++ = vowel_in[1]; + v_in = 0; + count+=2; + } + if(v_out != 0) + { + *list++ = 0x5 + (vowel_out[0] << 8); + *list++ = vowel_out[1]; + v_out = 0; + count+=2; + } + + } + phcode = 0; + } + + if((sign = sign2)==0) break; + p2 = p+1; + all_digits=1; + } + else + { + if(!isdigit(*p)) + all_digits=0; + } + p++; + } + *list = 0; + return(count); +} // end of AddSpect + + + +void Compile::AddSpectList(int *list, int control) +{//============================================== + int phcode; + int key; + + while(*list != 0) list++; // find end of the list + + for(;;) + { + key = NextItem(tKEYWORD); + UngetItem(); + if(key != -1) + break; + + phcode = NextItem(tPHONEMEMNEM); + + if(phcode == -1) + Error("Undeclared phoneme",item_string); + + if(NextItem(tSTRING) == -1) + break; + + list += AddSpect(phcode, list, control); + } + + *list++ = 0; +} // end of Compile::AddSpectList + + + +static int Range(int value, int divide, int min, int max) +{//====================================================== + if(value < 0) + value -= divide/2; + else + value += divide/2; + value = value / divide; + + if(value > max) + value = max; + if(value < min) + value = min; + return(value - min); +} + + +void Compile::VowelTransition(int which, unsigned int *trans) +{//========================================================== +// Compile a vowel transition + int key; + int len=0; + int rms=0; + int f1=0; + int f2=0; + int f2_min=0; + int f2_max=0; + int f3_adj=0; + int f3_amp=0; + int flags=0; + int vcolour=0; + int x; + + if(which==1) + { + len = 50 / 2; // defaults for transition into vowel + rms = 25 / 2; + } + else + if(which==2) + { + len = 36 / 2; // defaults for transition out of vowel + rms = 16 / 2; + } + + for(;;) + { + key = NextItem(tKEYWORD); + if(item_type != 3) + { + UngetItem(); + break; + } + + switch(key & 0xf) + { + case 1: + len = Range(NextItem(tNUMBER), 2, 0, 63) & 0x3f; + flags |= 1; + break; + case 2: + rms = Range(NextItem(tNUMBER), 2, 0, 63) & 0x3f; + flags |= 1; + break; + case 3: + f1 = NextItem(tNUMBER); + break; + case 4: + f2 = Range(NextItem(tNUMBER), 50, 0, 63) & 0x3f; + f2_min = Range(NextItem(tSIGNEDNUMBER), 50, -15, 15) & 0x1f; + f2_max = Range(NextItem(tSIGNEDNUMBER), 50, -15, 15) & 0x1f; + if(f2_min > f2_max) + { + x = f2_min; + f2_min = f2_max; + f2_max = x; + } + break; + case 5: + f3_adj = Range(NextItem(tSIGNEDNUMBER), 50, -15, 15) & 0x1f; + f3_amp = Range(NextItem(tNUMBER), 8, 0, 15) & 0x1f; + break; + case 6: + flags |= 2; // break + break; + case 7: + flags |= 4; // rate + break; + case 8: + flags |= 8; // glstop + break; + case 9: + flags |= 16; // lenadd + break; + case 10: + flags |= 32; // f4 + break; + case 11: + flags |= 64; // paus + break; + case 12: + vcolour = NextItem(tNUMBER); + break; + } + } + trans[0] = len + (rms << 6) + (flags << 12) + 0x80000000; + trans[1] = f2 + (f2_min << 6) + (f2_max << 11) + (f3_adj << 16) + (f3_amp << 21) + (f1 << 26) + (vcolour << 29); +} // end of VowelTransition + + + +int Compile::CPhoneme() +{//==================== + int phcode; + int phindex; + int value; + int item; + int finish=0; + int *intp; + int before_tab[N_PHONEME_TAB]; + int after_tab[N_PHONEME_TAB]; + int default_spect[N_PHONEME_TAB]; + + NextItem(tSTRING); + phindex = LookupPhoneme(item_string,1); // declare phoneme if not already there + if(phindex == -1) return(0); + + ph = &phoneme_tab2[phindex]; + memset(ph,0,sizeof(PHONEME_TAB)); + ph->mnemonic = StringToWord(item_string); + ph->type = 0xff; // undefined + ph->code = phindex; + before_tab[0] = 0; + after_tab[0] = 0; + default_spect[0] = 0; + vowel_in[0] = 0; + vowel_in[1] = 0; + vowel_out[0] = 0; + vowel_out[1] = 0; + + while(!finish) + { + item = NextItem(tKEYWORD); + + if(item_type==2) + ph->phflags |= item & 0xffffff; + else + if(item_type==1) + { + if(ph->type != 0xff) + { + Error("Phoneme type already set",item_string); + } + ph->type = item & 0xff; + } + else + switch(item) + { + case tLENGTHMOD: + ph->length_mod = NextItem(tNUMBER); + break; + + case tLENGTH: + ph->std_length = NextItem(tNUMBER); + break; + + case tWAVE: + ph->phflags |= phWAVE; // drop through to tSPECT + case tSPECT: + if(NextItem(tSTRING) == -1) + Error("Syntax error",item_string); + else + { + if(ph->type == phVOWEL) + AddSpect(phonPAUSE,default_spect,1); + else + AddSpect(phonPAUSE,default_spect,0); + } + break; + + case tSTARTTYPE: + phcode = NextItem(tPHONEMEMNEM); + if(phcode == -1) + phcode = LookupPhoneme(item_string,1); + ph->start_type = phcode; + break; + + case tENDTYPE: + phcode = NextItem(tPHONEMEMNEM); + if(phcode == -1) + phcode = LookupPhoneme(item_string,1); + ph->end_type = phcode; + break; + + case tTONESPEC: + ph->start_type = NextItem(tNUMBER); // tone's min pitch (range 0-50) + ph->end_type = NextItem(tNUMBER); // tone's max pitch (range 0-50) + if(ph->start_type > ph->end_type) + { + // ensure pitch1 < pitch2 + value = ph->start_type; + ph->start_type = ph->end_type; + ph->end_type = value; + } + AddEnvelope(default_spect); // envelope for pitch change, rise or fall or fall/rise, etc + AddEnvelope(after_tab); // envelope for amplitude change + break; + + case tREDUCETO: + phcode = NextItem(tPHONEMEMNEM); + if(phcode == -1) + phcode = LookupPhoneme(item_string,1); + ph->reduce_to = phcode; + value = NextItem(tNUMBER); + ph->phflags = (ph->phflags & 0xfffffff) + (value << 28); + break; + + case tBEFORENOTVOWEL: + ph->phflags |= phBEFORENOTVOWEL; // and drop through to tBEFOREVOWEL + case tBEFOREVOWELPAUSE: + ph->phflags |= phBEFOREVOWELPAUSE; + case tBEFOREVOWEL: + if((phcode = NextItem(tPHONEMEMNEM)) == -1) + phcode = LookupPhoneme(item_string,1); + ph->alternative_ph = phcode; + break; + + case tSWITCHVOICING: + ph->phflags |= phSWITCHVOICING; + if((phcode = NextItem(tPHONEMEMNEM)) == -1) + phcode = LookupPhoneme(item_string,1); + ph->alternative_ph = phcode; + break; + + case tAPPENDPH: + ph->phflags |= phAPPENDPH; // drop through to tLINKOUT + case tLINKOUT: + phcode = NextItem(tPHONEMEMNEM); + if(phcode == -1) + phcode = LookupPhoneme(item_string,1); + ph->link_out = phcode; + break; + + case tBEFORE: + AddSpectList(before_tab,0); + break; + + case tAFTER: + AddSpectList(after_tab,0); + break; + + case tEND: + finish = 1; + break; + + case tVOWELIN: + VowelTransition(1,vowel_in); + break; + + case tVOWELOUT: + VowelTransition(2,vowel_out); + break; + + default: + Error("Syntax error",item_string); + break; + } + } + // write out indices + if(before_tab[0] != 0) + { + ph->before = ftell(f_phindex) / 4; + intp = before_tab; + for(;;) + { + fwrite(intp,4,1,f_phindex); + if(*intp++ == 0) break; + } + } + if(after_tab[0] != 0) + { + ph->after = ftell(f_phindex) / 4; + intp = after_tab; + for(;;) + { + fwrite(intp,4,1,f_phindex); + if(*intp++ == 0) break; + } + } + if(default_spect[0] != 0) + { + ph->spect = ftell(f_phindex) / 4; + intp = default_spect; + for(;;) + { + fwrite(intp,4,1,f_phindex); + if(*intp++ == 0) break; + } + } + + if(ph->phflags & phVOICED) + { + if(ph->type == phSTOP) + ph->type = phVSTOP; + else + if(ph->type == phFRICATIVE) + ph->type = phVFRICATIVE; + } + + ph->std_length |= 0x8000; // 'locally declared' indicator + + return(phindex); +} // end of Compile::CPhoneme + + + +void Compile::WritePhonemeTable() +{//============================== + int ix; + int j; + int n; + int value; + int count; + PHONEME_TAB *p; + + value = n_phoneme_tabs; + fputc(value,f_phtab); + fputc(0,f_phtab); + fputc(0,f_phtab); + fputc(0,f_phtab); + + for(ix=0; ix= N_PHONEME_TABS-1) + { + Error("Too many phonemetables"); + return; + } + p = (PHONEME_TAB *)calloc(sizeof(PHONEME_TAB),N_PHONEME_TAB); + + if(p == NULL) + { + Error("Out of memory"); + return; + } + + if(gui_flag) + progress->Update(n_phoneme_tabs); + + phoneme_tab_list2[n_phoneme_tabs].phoneme_tab_ptr = phoneme_tab2 = p; + memset(phoneme_tab_list2[n_phoneme_tabs].name, 0, N_PHONEME_TAB_NAME); + strncpy0(phoneme_tab_list2[n_phoneme_tabs].name, name, N_PHONEME_TAB_NAME); + n_phcodes = 1; + phoneme_tab_list2[n_phoneme_tabs].includes = 0; + + if(n_phoneme_tabs > 0) + { + NextItem(tSTRING); // name of base phoneme table + for(ix=0; ix points_x[ix+4]) + ix++; + + y = (int)polint(&points_x[ix],&points_y[ix],4,x); + if(y < 0) y = 0; + if(y > 255) y = 255; + env[x] = y; + } +} + +static float env1_x[]={0,0x30,0x40,ENV_LEN}; +static float env1_y[]={0,200,255,255}; +static float env2_x[]={0,0x28,0x48,0x60,ENV_LEN}; +static float env2_y[]={255,0xe0,0xc0,0x60,0}; +static float env3_x[]={0,0x18,0x30,ENV_LEN}; +static float env3_y[]={0,0x28,0x50,255}; +static float env4_x[]={0,0x20,0x40,0x60,ENV_LEN}; +static float env4_y[]={255,0x70,0,0x70,255}; +static float env5_x[]={0,0x20,0x40,0x58,0x70,ENV_LEN}; +static float env5_y[]={0,0x28,0x50,0xa0,0xf0,255}; +static float env6_x[]={0,0x20,0x38,0x60,ENV_LEN}; +static float env6_y[]={255,0xe8,0xd0,0x68,0}; + +static float env7_x[]={0,0x20,0x40,0x60,ENV_LEN}; // 214 +static float env7_y[]={85,42,0,128,255}; +static float env8_x[]={0,0x20,0x40,0x60,ENV_LEN}; // 211 +static float env8_y[]={255,130,20,10,0}; +static float env9_x[]={0,0x20,0x40,0x60,ENV_LEN}; // 51 fall +static float env9_y[]={255,210,140,70,0}; + +static float enva3_x[]={0,44,64,84,ENV_LEN}; // amp env for broken tone +static float enva3_y[]={255,255,160,255,255}; +static float enva6_x[]={0,44,64,80,ENV_LEN}; // amp env for drop tone +static float enva6_y[]={255,255,255,250,50}; + + +unsigned char env_test[ENV_LEN]; + +void MakeEnvFile(char *fname, float *x, float *y, int source) +{//========================================================== + static char hdr[12] = {'P','I','T','C','H','E','N','V',80,0,120,0}; + FILE *f; + int ix; + + MakeEnvelope(env_test,x,y); + f = fopen(fname,"wb"); + + if(source) + { + for(ix=0; ix<128; ix++) + { + fprintf(f,"0x%.2x,",env_test[ix]); + if((ix & 7) == 7) + fprintf(f,"\n"); + } + } + else + { + fwrite(hdr,12,1,f); + fwrite(env_test,128,1,f); + } + fclose(f); + +} + + +void make_envs() +{//============= + MakeEnvFile("p_level",env1_x,env1_y,0); + MakeEnvFile("p_rise",env5_x,env5_y,0); + MakeEnvFile("p_fall",env9_x,env9_y,0); + MakeEnvFile("p_214",env7_x,env7_y,0); + MakeEnvFile("p_211",env8_x,env8_y,0); + + + MakeEnvFile("vi_2",env2_x,env2_y,0); + MakeEnvFile("vi_5",env3_x,env3_y,0); + MakeEnvFile("p_fallrise",env4_x,env4_y,0); + MakeEnvFile("vi_6",env6_x,env6_y,0); + + + MakeEnvFile("vi_5amp",enva3_x,enva3_y,0); + MakeEnvFile("vi_6amp",enva6_x,enva6_y,0); + +} +#endif + +static int ref_sorter(char **a, char **b) +{//====================================== + + REF_HASH_TAB *p1 = (REF_HASH_TAB *)(*a); + REF_HASH_TAB *p2 = (REF_HASH_TAB *)(*b); + + return(strcoll(p1->string,p2->string)); +} /* end of strcmp2 */ + + + +void Compile::Report(void) +{//======================= + int ix; + int hash; + int n; + REF_HASH_TAB *p; + REF_HASH_TAB **list; + FILE *f_report; + char fname[80]; + + // make a list of all the references and sort it + list = (REF_HASH_TAB **)malloc(count_references * sizeof(REF_HASH_TAB *)); + if(list == NULL) + return; + + sprintf(fname,"%scompile_report",path_source); + f_report = fopen(fname,"w"); + if(f_report == NULL) + { + free(list); + return; + } + + fprintf(f_report,"%d phoneme tables\n",n_phoneme_tabs); + fprintf(f_report," new total\n"); + for(ix=0; ixlink); + } + } + n = ix; + qsort((void *)list,n,sizeof(REF_HASH_TAB *),(int (*)(const void *,const void *))ref_sorter); + + for(ix=0; ixn_uses, list[ix]->string); + for(j = strlen(list[ix]->string); j < 14; j++) + { + fputc(' ',f_report); // pad filename with spaces + } + for(j=0; (j < list[ix]->n_used_by) && (jused_by[j]; + fprintf(f_report," %s",phoneme_tab_list2[ph_tab_num-1].name); + } + if(j < list[ix]->n_used_by) + { + fprintf(f_report," ++"); + } + fputc('\n',f_report); + } + free(list); + fclose(f_report); +} + + +wxString CompileAllDictionaries() +{//============================== + wxString filename; + wxFileName fname; + wxString dictstr; + wxString report = _T(""); + int err; + int errors = 0; + int dict_count = 0; + FILE *log; + char dictname[80]; + char fname_log[80]; + char save_voice_name[80]; + + if(!wxDirExists(path_dictsource)) + { + if(gui_flag) + { + wxString dirname = wxDirSelector(_T("Directory of dictionary files"),path_phsource); + if(!dirname.IsEmpty()) + { + path_dictsource = dirname; + strncpy0(path_dsource,path_dictsource.mb_str(wxConvLocal),sizeof(path_dsource)-1); + strcat(path_dsource,"/"); + } + } + else + { + fprintf(stderr,"Can't find dictionary files: %s\n",path_dsource); + } + } + + wxDir dir(path_dictsource); + if(!dir.IsOpened()) + { + return(_T(" No dictionaries")); + } + + strcpy(save_voice_name,voice_name); + + sprintf(fname_log,"%s%s",path_dsource,"dict_log"); + log = fopen(fname_log,"w"); + + bool cont = dir.GetFirst(&filename, _T("*_rules"), wxDIR_FILES); + while ( cont ) + { + fname = wxFileName(filename); + dictstr = fname.GetName().BeforeLast('_'); + strcpy(dictname,dictstr.mb_str(wxConvLocal)); + dict_count++; + + LoadVoice(dictname,0); + + if((err = CompileDictionary(path_dsource, dictname,log,NULL)) > 0) + { + report = report + dictstr + wxString::Format(_T(" %d, "),err); + errors += err; + } + + cont = dir.GetNext(&filename); + } + if(log != NULL) + fclose(log); + + LoadVoice(save_voice_name,1); + + if(errors == 0) + return(wxString::Format(_T(" Compiled %d dictionaries"),dict_count)); + else + { + return(_T(" Dictionary errors: ") + report); + } + +} // end of CompileAllDictionaries + + + +void Compile::CPhonemeTab(const char *source) +{//======================================== + char fname[130]; + wxString report; + wxString report_dict; + +#ifdef MAKE_ENVELOPES +make_envs(); +#endif + + error_count = 0; +memset(markers_used,0,sizeof(markers_used)); + + f_errors = stderr; + + strncpy0(current_fname,source,sizeof(current_fname)); + sprintf(fname,"%s%s",path_source,source); + f_in = fopen_log(f_errors,fname,"rb"); + if(f_in == NULL) + { + if(gui_flag) + { + wxString dir = wxDirSelector(_T("Directory for 'phonemes' file"),path_phsource); + if(!dir.IsEmpty()) + { + path_phsource = dir; + strncpy0(path_source,path_phsource.mb_str(wxConvLocal),sizeof(path_source)-1); + strcat(path_source,"/"); + } + } + + sprintf(fname,"%s%s",path_source,source); + f_in = fopen_log(f_errors,fname,"rb"); + if(f_in == NULL) + { + wxLogError(_T("Can't read master phonemes file:\n") + wxString(fname,wxConvLocal)); + return; + } + } + + progress_max = 0; + while(fgets(fname,sizeof(fname),f_in) != NULL) + { + // count the number of phoneme tables declared in the master phonemes file + if(memcmp(fname,"phonemetable",12)==0) + progress_max++; + } + rewind(f_in); + + sprintf(fname,"%s%s",path_source,"error_log"); + if((f_errors = fopen_log(f_errors,fname,"w")) == NULL) + f_errors = stderr; + + sprintf(fname,"%s/%s",path_home,"phondata_manifest"); + if((f_phcontents = fopen_log(f_phcontents,fname,"w")) == NULL) + f_phcontents = stderr; + + fprintf (f_phcontents, +"# This file lists the type of data that has been compiled into the\n" +"# phondata file\n" +"#\n" +"# The first character of a line indicates the type of data:\n" +"# S - A SPECT_SEQ structure\n" +"# W - A wavefile segment\n" +"# E - An envelope\n" +"#\n" +"# Address is the displacement within phondata of this item\n" +"#\n" +"# Address Data file\n" +"# ------- ---------\n"); + + + sprintf(fname,"%s/%s",path_home,"phondata"); + f_phdata = fopen_log(f_errors,fname,"wb"); + + sprintf(fname,"%s/%s",path_home,"phonindex"); + f_phindex = fopen_log(f_errors,fname,"wb"); + + sprintf(fname,"%s/%s",path_home,"phontab"); + f_phtab = fopen_log(f_errors,fname,"wb"); + + if(f_phdata==NULL || f_phindex==NULL || f_phtab==NULL) + { + return; + } + + if(gui_flag) + { + progress = new wxProgressDialog(_T("Phonemes"),_T(""),progress_max); + } + else + { + fprintf(stderr,"Compiling phoneme data: %s\n",path_source); + } + + // write a word so that further data doesn't start at displ=0 + fwrite(&version_phdata,4,1,f_phdata); + fwrite(&version_phdata,4,1,f_phindex); + + memset(ref_hash_tab,0,sizeof(ref_hash_tab)); + + n_phoneme_tabs = 0; + stack_ix = 0; + StartPhonemeTable("base"); + CPhonemeFiles(path_source); + + EndPhonemeTable(); + WritePhonemeTable(); + +fprintf(f_errors,"Refs %d, Reused %d\n",count_references,duplicate_references); + fclose(f_in); + fclose(f_phdata); + fclose(f_errors); + fclose(f_phindex); + fclose(f_phtab); + fclose(f_phcontents); + + LoadPhData(); + LoadVoice(voice_name,0); + Report(); + + + report_dict = CompileAllDictionaries(); + + if(gui_flag) + { + delete progress; + } + + report.Printf(_T("Compiled phonemes: %d errors."),error_count); + if(error_count > 0) + { + report += _T(" See file: 'error_log'."); + wxLogError(report); + } + wxLogStatus(report + report_dict); + + if(gui_flag == 0) + { + strcpy(fname,(report+report_dict).mb_str(wxConvLocal)); + fprintf(stderr,"%s\n",fname); + + } +} // end of Compile::CPhonemeTab + + + +void CompileMbrola() +{//================= + char *p; + FILE *f_in; + FILE *f_out; + int percent; + int n; + int count = 0; + int control; + char phoneme[40]; + char phoneme2[40]; + char name1[40]; + char name2[40]; + char mbrola_voice[40]; + char buf[150]; + int mbrola_ctrl = 20; // volume in 1/16 ths + MBROLA_TAB data[N_PHONEME_TAB]; + + wxString filepath = wxFileSelector(_T("Read Mbrola phonemes file"),path_phsource+_T("/mbrola"),_T(""),_T(""),_T("*"),wxOPEN); + strcpy(buf,filepath.mb_str(wxConvLocal)); + if((f_in = fopen(buf,"r")) == NULL) + { + wxLogError(_T("Can't read: ")+filepath); + return; + } + + while(fgets(buf,sizeof(phoneme),f_in) != NULL) + { + buf[sizeof(phoneme)-1] = 0; + + if((p = strstr(buf,"//")) != NULL) + *p = 0; // truncate line at comment + + if(memcmp(buf,"volume",6)==0) + { + mbrola_ctrl = atoi(&buf[6]); + continue; + } + + n = sscanf(buf,"%d %s %s %d %s %s",&control,phoneme,phoneme2,&percent,name1,name2); + if(n >= 5) + { + data[count].name = StringToWord(phoneme); + if(strcmp(phoneme2,"NULL")==0) + data[count].next_phoneme = 0; + else + if(strcmp(phoneme2,"VWL")==0) + data[count].next_phoneme = 2; + else + data[count].next_phoneme = StringToWord(phoneme2); + data[count].mbr_name = 0; + data[count].mbr_name2 = 0; + data[count].percent = percent; + data[count].control = control; + if(strcmp(name1,"NULL")!=0) + data[count].mbr_name = StringToWord(name1); + if(n == 6) + data[count].mbr_name2 = StringToWord(name2); + + count++; + } + } + fclose(f_in); + + wxFileName filename = wxFileName(filepath); + strcpy(mbrola_voice,filename.GetName().mb_str(wxConvLocal)); + sprintf(buf,"%s/mbrola_ph/%s_phtrans",path_home,mbrola_voice); + if((f_out = fopen(buf,"w")) == NULL) + { + wxLogError(_T("Can't write to: ")+wxString(buf,wxConvLocal)); + return; + } + + data[count].name = 0; // list terminator + fwrite(&mbrola_ctrl,4,1,f_out); + fwrite(data,sizeof(MBROLA_TAB),count+1,f_out); + fclose(f_out); + wxLogStatus(_T("Mbrola translation file: %d phonemes"),count); +} // end of CompileMbrola + + + +void CompileInit(void) +{ + compile = new Compile; + compile->CPhonemeTab("phonemes"); + delete compile; +} diff --git a/src/compiledict.cpp b/src/compiledict.cpp new file mode 100755 index 00000000..4a31642c --- /dev/null +++ b/src/compiledict.cpp @@ -0,0 +1,1287 @@ +/*************************************************************************** + * Copyright (C) 2005,2006 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "StdAfx.h" + +#include +#include +#include +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "translate.h" + +#define OPT_PH_COMMON // sort rules by phoneme string, common phoneme string output only once +//#define OPT_FORMAT // format the text and write formatted copy to Log file +//#define OUTPUT_FORMAT + +int HashDictionary(const char *string); + +static FILE *f_log = NULL; +extern char *dir_dictionary; + +int linenum; +static int error_count; +static int transpose_offset; // transpose character range for LookupDictList() +static int transpose_min; +static int transpose_max; + +int hash_counts[N_HASH_DICT]; +char *hash_chains[N_HASH_DICT]; + +MNEM_TAB mnem_flags[] = { + // these in the first group put a value in bits0-3 of dictionary_flags + {"$1", 0x41}, // stress on 1st syllable + {"$2", 0x42}, // stress on 2nd syllable + {"$3", 0x43}, + {"$4", 0x44}, + {"$5", 0x45}, + {"$6", 0x46}, + {"$7", 0x47}, + {"$u", 0x48}, // reduce to unstressed + {"$u1", 0x49}, + {"$u2", 0x4a}, + {"$u3", 0x4b}, + {"$u+", 0x4c}, // reduce to unstressed, but stress at end of clause + {"$u1+", 0x4d}, + {"$u2+", 0x4e}, + {"$u3+", 0x4f}, + + + // these set the corresponding numbered bit if dictionary_flags + {"$pause", 8}, /* ensure pause before this word */ + {"$only", 9}, /* only match on this word without suffix */ + {"$onlys", 10}, /* only match with none, or with 's' suffix */ + {"$strend", 11}, /* full stress if at end of clause */ + {"$strend2", 12}, /* full stress if at end of clause, or only followed by unstressed */ + {"$unstressend",13}, /* reduce stress at end of clause */ + {"$atend", 14}, /* use this pronunciation if at end of clause */ + + {"$capital", 15}, /* use this pronunciation if initial letter is upper case */ + {"$dot", 16}, /* ignore '.' after this word (abbreviation) */ + {"$abbrev", 17}, /* use this pronuciation rather than split into letters */ + {"$stem", 18}, // must have a suffix + +// language specific + {"$double", 19}, // IT double the initial consonant of next word + {"$alt", 20}, // use alternative pronunciation + {"$alt2", 21}, + + {"$verbf", 22}, /* verb follows */ + {"$verbsf", 23}, /* verb follows, allow -s suffix */ + {"$nounf", 24}, /* noun follows */ + {"$verb", 25}, /* use this pronunciation when its a verb */ + {"$past", 26}, /* use this pronunciation when its past tense */ + {"$pastf", 27}, /* past tense follows */ + {"$verbextend",28}, /* extend influence of 'verb follows' */ + + {"$brk", 30}, /* a shorter $pause */ + // doesn't set dictionary_flags + {"$?", 100}, // conditional rule, followed by byte giving the condition number + {NULL, -1} +}; + + +typedef struct { + char name[6]; + unsigned int start; + unsigned int length; +} RGROUP; + + +int isspace2(unsigned int c) +{//========================= +// can't use isspace() because on Windows, isspace(0xe1) gives TRUE ! + int c2; + + if(((c2 = (c & 0xff)) == 0) || (c > ' ')) + return(0); + return(1); +} + + +static FILE *fopen_log(const char *fname,const char *access) +{//================================================== +// performs fopen, but produces error message to f_log if it fails + FILE *f; + + if((f = fopen(fname,access)) == NULL) + { + if(f_log != NULL) + fprintf(f_log,"Can't access (%s) file '%s'\n",access,fname); + } + return(f); +} + + +#ifdef OPT_FORMAT +static const char *lookup_mnem(MNEM_TAB *table, int value) +//======================================================== +/* Lookup a mnemonic string in a table, return its name */ +{ + while(table->mnem != NULL) + { + if(table->value==value) + return(table->mnem); + table++; + } + return("??"); /* not found */ +} /* end of mnem */ +#endif + + + + +int compile_line(char *linebuf, char *dict_line, int *hash) +{//======================================================== +// Compile a line in the language_list file + unsigned char c; + char *p; + char *word; + char *phonetic; + int ix; + int step; + int n_flag_codes = 0; + int length; + int multiple_words = 0; + char *multiple_string = NULL; + char *multiple_string_end = NULL; + + int len_word; + int len_phonetic; + + char *mnemptr; + char *comment; + unsigned char flag_codes[100]; + char encoded_ph[200]; + unsigned char bad_phoneme[4]; + + + p = linebuf; + comment = NULL; + phonetic = word = ""; + + step = 0; + + c = 0; + while(c != '\n') + { + c = *p; + + if((c == '?') && (step==0)) + { + p++; + ix = 0; + if(isdigit(*p)) + { + ix += (*p-'0'); + p++; + } + if(isdigit(*p)) + { + ix = ix*10 + (*p-'0'); + p++; + } + flag_codes[n_flag_codes++] = ix+100; + c = *p; + } + + if((c == '$') && (step != 1)) + { + /* read keyword parameter */ + mnemptr = p; + while(!isspace2(c = *p)) p++; + *p = 0; + + ix = LookupMnem(mnem_flags,mnemptr); + if(ix > 0) + flag_codes[n_flag_codes++] = ix; + else + { + fprintf(f_log,"%5d: Unknown keyword: %s\n",linenum,mnemptr); + error_count++; + } + } + + if((c == '/') && (p[1] == '/') && (multiple_words==0)) + { + c = '\n'; /* "//" treat comment as end of line */ + comment = p; + } + + switch(step) + { + case 0: + if(c == '(') + { + multiple_words = 1; + word = p+1; + step = 1; + } + else + if(!isspace2(c)) + { + word = p; + step = 1; + } + break; + + case 1: + if(isspace2(c)) + { + p[0] = 0; /* terminate english word */ + + if(multiple_words) + { + multiple_string = multiple_string_end = p+1; + step = 2; + } + else + { + step = 3; + } + } + else + if((c == ')') && multiple_words) + { + p[0] = 0; + step = 3; + multiple_words = 0; + } + break; + + case 2: + if(isspace2(c)) + { + multiple_words++; + } + else + if(c == ')') + { + p[0] = ' '; // terminate extra string + multiple_string_end = p+1; + step = 3; + } + break; + + case 3: + if(!isspace2(c)) + { + phonetic = p; + step = 4; + } + break; + + case 4: + if(isspace2(c)) + { + p[0] = 0; /* terminate phonetic */ + step = 5; + } + break; + + case 5: + break; + } + p++; + } + + if(word[0] == 0) + { +#ifdef OPT_FORMAT + if(comment != NULL) + fprintf(f_log,"%s",comment); + else + fputc('\n',f_log); +#endif + return(0); /* blank line */ + } + EncodePhonemes(phonetic,encoded_ph,bad_phoneme); + if(strchr(encoded_ph,phonSWITCH) != 0) + { + flag_codes[n_flag_codes++] = BITNUM_FLAG_ONLY_S; + } + + for(ix=0; ix<255; ix++) + { + c = encoded_ph[ix]; + if(c == 0) break; + + if(c == 255) + { + /* unrecognised phoneme, report error */ + fprintf(f_log,"%5d: Bad phoneme [%c] (0x%x) in: %s %s\n",linenum,bad_phoneme[0],bad_phoneme[0],word,phonetic); + error_count++; + } + } + + if((word[0] & 0x80)==0) // 7 bit ascii only + { + // 1st letter - need to consider utf8 here + word[0] = tolower(word[0]); + } + + len_word = strlen(word); + + if(transpose_offset > 0) + { + len_word = TransposeAlphabet(word, transpose_offset, transpose_min, transpose_max); + } + + *hash = HashDictionary(word); + len_phonetic = strlen(encoded_ph); + + dict_line[1] = len_word; // bit 6 indicates whether the word has been compressed + len_word &= 0x3f; + + memcpy(&dict_line[2],word,len_word); + + if(len_phonetic == 0) + { + // no phonemes specified. set bit 7 + dict_line[1] |= 0x80; + length = len_word + 2; + } + else + { + length = len_word + len_phonetic + 3; + strcpy(&dict_line[(len_word)+2],encoded_ph); + } + + for(ix=0; ix 0) && (multiple_words <= 4)) + { + dict_line[length++] = 40 + multiple_words; + ix = multiple_string_end - multiple_string; + memcpy(&dict_line[length],multiple_string,ix); + length += ix; + } + dict_line[0] = length; + +#ifdef OPT_FORMAT + spaces = 16; + for(ix=0; ix= 100) + { + fprintf(f_log,"?%d ",flag_codes[ix]-100); + spaces -= 3; + } + } + + fprintf(f_log,"%s",word); + spaces -= strlen(word); + DecodePhonemes(encoded_ph,decoded_ph); + while(spaces-- > 0) fputc(' ',f_log); + spaces += (14 - strlen(decoded_ph)); + + fprintf(f_log," %s",decoded_ph); + while(spaces-- > 0) fputc(' ',f_log); + for(ix=0; ix 0) + rule_phonemes[len++] = ' '; + output = &rule_phonemes[len]; + } + sxflags = 0x808000; // to ensure non-zero bytes + + for(p=string,ix=0;;) + { + literal = 0; + c = *p++; + if(c == '\\') + { + c = *p++; // treat next character literally + if((c >= '0') && (c <= '2') && (p[0] >= '0') && (p[0] <= '7') && (p[1] >= '0') && (p[1] <= '7')) + { + // character code given by 3 digit octal value; + c = (c-'0')*64 + (p[0]-'0')*8 + (p[1]-'0'); + p += 2; + } + literal = 1; + } + + if((state==1) || (state==3)) + { + // replace special characters (note: 'E' is reserved for a replaced silent 'e') + if(literal == 0) + { + static const char lettergp_letters[9] = {LETTERGP_A,LETTERGP_B,LETTERGP_C,0,0,LETTERGP_F,LETTERGP_G,LETTERGP_H,LETTERGP_Y}; + switch(c) + { + case '_': + c = RULE_SPACE; + break; + + case 'Y': + c = 'I'; // drop through to next case + case 'A': // vowel + case 'B': + case 'C': + case 'H': + case 'F': + case 'G': + if(state == 1) + { + // pre-rule, put the number before the RULE_LETTERGP; + output[ix++] = lettergp_letters[c-'A'] + 'A'; + c = RULE_LETTERGP; + } + else + { + output[ix++] = RULE_LETTERGP; + c = lettergp_letters[c-'A'] + 'A'; + } + break; + case 'D': + c = RULE_DIGIT; + break; + case 'K': + c = RULE_NOTVOWEL; + break; + case 'N': + c = RULE_NO_SUFFIX; + break; + case 'V': + c = RULE_IFVERB; + break; + case 'Z': + c = RULE_NONALPHA; + break; + case '+': + c = RULE_INC_SCORE; + break; + case '@': + c = RULE_SYLLABLE; + break; + case '&': + c = RULE_STRESSED; + break; + case '%': + c = RULE_DOUBLE; + break; + case '#': + c = RULE_DEL_FWD; + break; + case 'T': + c = RULE_ALT1; + break; + case 'L': + // expect two digits + c = *p++ - '0'; + value = *p++ - '0'; + c = c * 10 + value; + if((value < 0) || (value > 9) || (c <= 0) || (c >= N_LETTER_TYPES)) + { + c = 0; + fprintf(f_log,"%5d: Expected 2 digits after 'L'",linenum); + error_count++; + } + c += 'A'; + if(state == 1) + { + // pre-rule, put the group number before the RULE_LETTERGP command + output[ix++] = c; + c = RULE_LETTERGP; + } + else + { + output[ix++] = RULE_LETTERGP; + } + break; + + case 'P': + sxflags |= SUFX_P; // Prefix, now drop through to Suffix + case '$': // obsolete, replaced by S + case 'S': + output[ix++] = RULE_ENDING; + value = 0x80; + while(!isspace2(c = *p++) && (c != 0)) + { + switch(c) + { + case 'e': + sxflags |= SUFX_E; + break; + case 'i': + sxflags |= SUFX_I; + break; + case 'p': // obsolete, replaced by 'P' above + sxflags |= SUFX_P; + break; + case 'v': + sxflags |= SUFX_V; + break; + case 'd': + sxflags |= SUFX_D; + break; + case 'f': + sxflags |= SUFX_F; + break; + case 'q': + sxflags |= SUFX_Q; + break; + case 't': + sxflags |= SUFX_T; + break; + default: + if(isdigit(c)) + value = (c - '0') + 0x80; + break; + } + } + p--; + output[ix++] = sxflags >> 16; + output[ix++] = sxflags >> 8; + c = value; + break; + } + } + } + output[ix++] = c; + if(c == 0) break; + } + + state = next_state[state]; +} // end of copy_rule_string + + + +char *compile_rule(char *input) +{//============================ + int ix; + unsigned char c; + int wc; + char *p; + char *prule; + int len; + int len_name; + int state=2; + int finish=0; + int pre_bracket=0; + char buf[80]; + char output[150]; + unsigned char bad_phoneme[4]; + + buf[0]=0; + rule_cond[0]=0; + rule_pre[0]=0; + rule_post[0]=0; + rule_match[0]=0; + rule_phonemes[0]=0; + + p = buf; + + for(ix=0; finish==0; ix++) + { + c = input[ix]; + if((c=='/') && (input[ix+1]=='/')) + c = input[ix] = '\n'; // treat command as end of line + + switch(c = input[ix]) + { + case ')': // end of prefix section + *p = 0; + state = 1; + pre_bracket = 1; + copy_rule_string(buf,state); + p = buf; + break; + + case '(': // start of suffix section + *p = 0; + state = 2; + copy_rule_string(buf,state); + state = 3; + p = buf; + break; + + case '\n': // end of line + case '\r': + case 0: // end of line + *p = 0; + copy_rule_string(buf,state); + finish=1; + break; + + case '\t': // end of section section + case ' ': + *p = 0; + copy_rule_string(buf,state); + p = buf; + break; + + case '?': + if(state==2) + state=0; + else + *p++ = c; + break; + + default: + *p++ = c; + break; + } + } + + if(strcmp(rule_match,"$group")==0) + strcpy(rule_match,group_name); + + if(rule_match[0]==0) + return(NULL); + + EncodePhonemes(rule_phonemes,buf,bad_phoneme); + for(ix=0;; ix++) + { + if((c = buf[ix])==0) break; + if(c==255) + { + fprintf(f_log,"%5d: Bad phoneme [%c] in %s",linenum,bad_phoneme[0],input); + error_count++; + break; + } + } + strcpy(output,buf); + len = strlen(buf)+1; + + len_name = strlen(group_name); + if((len_name > 0) && (memcmp(rule_match,group_name,len_name) != 0)) + { + utf8_in(&wc,rule_match,0); + if((group_name[0] == '9') && IsDigit(wc)) + { + // numeric group, rule_match starts with a digit, so OK + } + else + { + fprintf(f_log,"%5d: Wrong initial letters '%s' for group '%s'\n",linenum,rule_match,group_name); + error_count++; + } + } + strcpy(&output[len],rule_match); + len += strlen(rule_match); + if(rule_cond[0] != 0) + { + ix = -1; + ix = atoi(rule_cond); + if((ix > 0) && (ix < 255)) + { + output[len++] = RULE_CONDITION; + output[len++] = ix; + } + else + { + fprintf(f_log,"%5d: bad condition number ?%d\n",linenum,ix); + error_count++; + } + } + if(rule_pre[0] != 0) + { + output[len++] = RULE_PRE; + // output PRE string in reverse order + for(ix = strlen(rule_pre)-1; ix>=0; ix--) + output[len++] = rule_pre[ix]; + } + + if(rule_post[0] != 0) + { + sprintf(&output[len],"%c%s",RULE_POST,rule_post); + len += (strlen(rule_post)+1); + } + output[len++]=0; + prule = (char *)malloc(len); + memcpy(prule,output,len); + return(prule); +} // end of compile_rule + + +static int __cdecl string_sorter(char **a, char **b) +{//================================================= + char *pa, *pb; + int ix; + + if((ix = strcmp(pa = *a,pb = *b)) != 0) + return(ix); + pa += (strlen(pa)+1); + pb += (strlen(pb)+1); + return(strcmp(pa,pb)); +} /* end of strcmp2 */ + +static int __cdecl rgroup_sorter(RGROUP *a, RGROUP *b) +{//=================================================== + int ix; + ix = strcmp(a->name,b->name); + if(ix != 0) return(ix); + return(a->start-b->start); +} + + +#ifdef OUTPUT_FORMAT +void print_rule_group(FILE *f_out, int n_rules, char **rules, char *name) +{//====================================================================== + int rule; + int ix; + unsigned char c; + int len1; + int len2; + int spaces; + char *p; + char *pout; + int condition; + char buf[80]; + char suffix[12]; + + static unsigned char symbols[] = {'@','&','%','+','#','$','D','Z','A','B','C','F'}; + + fprintf(f_out,"\n$group %s\n",name); + + for(rule=0; rule 0) + { + sprintf(buf,"?%d ",condition); + spaces -= strlen(buf); + fprintf(f_out,"%s",buf); + } + + if(rule_pre[0] != 0) + { + p = buf; + for(ix=strlen(rule_pre)-1;ix>=0;ix--) + *p++ = rule_pre[ix]; + sprintf(p,") "); + spaces -= strlen(buf); + for(ix=0; ix 0) + { + strcpy(rgroup[n_rgroups].name,group_name); + rgroup[n_rgroups].start = ftell(f_temp); + output_rule_group(f_temp,n_rules,rules,group_name); + rgroup[n_rgroups].length = ftell(f_temp) - rgroup[n_rgroups].start; + n_rgroups++; + + count += n_rules; + } + n_rules = 0; + + if(buf == NULL) break; // end of file + + p = (unsigned char *)&buf[6]; + while((p[0]==' ') || (p[0]=='\t')) p++; // Note: Windows isspace(0xe1) gives TRUE ! + ix = 0; + while((*p > ' ') && (ix<12)) + group_name[ix++] = *p++; + group_name[ix]=0; + + if(sscanf(group_name,"0x%x",&char_code)==1) + { + // group character is given as a character code (max 16 bits) + p = (unsigned char *)group_name; + + if(char_code > 0x100) + { + *p++ = (char_code >> 8); + } + *p++ = char_code; + *p = 0; + } + + if(strlen(group_name) > 2) + { + if(utf8_in(&c,group_name,0) < 2) + { + fprintf(f_log,"%5d: Group name longer than 2 bytes (UTF8)",linenum); + error_count++; + } + + group_name[2] = 0; + } + + continue; + } + + prule = compile_rule(buf); + if((prule != NULL) && (n_rules < N_RULES)) + { + rules[n_rules++] = prule; + } + } + fclose(f_temp); + + qsort((void *)rgroup,n_rgroups,sizeof(rgroup[0]),(int (__cdecl *)(const void *,const void *))rgroup_sorter); + + if((f_temp = fopen(fname_temp,"rb"))==NULL) + return(2); + + prev_rgroup_name = "\n"; + + for(gp = 0; gp < n_rgroups; gp++) + { + fseek(f_temp,rgroup[gp].start,SEEK_SET); + + if((different = strcmp(rgroup[gp].name, prev_rgroup_name)) != 0) + { + // not the same as the previous group + if(gp > 0) + fputc(RULE_GROUP_END,f_out); + fputc(RULE_GROUP_START,f_out); + fprintf(f_out, prev_rgroup_name = rgroup[gp].name); + fputc(0,f_out); + } + + for(ix=rgroup[gp].length; ix>0; ix--) + { + c = fgetc(f_temp); + fputc(c,f_out); + } + + if(different) + { + } + } + fputc(RULE_GROUP_END,f_out); + fputc(0,f_out); + + fclose(f_temp); + remove(fname_temp); + + fprintf(f_log,"\t%d rules, %d groups\n\n",count,n_rgroups); + return(0); +} // end of compile_dictrules + + + + +int CompileDictionary(const char *dsource, const char *dict_name, FILE *log, char *fname) +{//====================================================================================== +// fname: space to write the filename in case of error + + FILE *f_in; + FILE *f_out; + int offset_rules=0; + int value; + char fname_buf[130]; + char fname_temp[130]; + char path[80]; + + error_count = 0; + + if(dsource == NULL) + dsource = ""; + if(fname == NULL) + fname = fname_buf; + + f_log = log; +//f_log = fopen("log2.txt","w"); + if(f_log == NULL) + f_log = stderr; + + sprintf(path,"%s%s_",dsource,dict_name); + + sprintf(fname,"%s%c%s_dict",path_home,PATHSEP,dict_name); + if((f_out = fopen_log(fname,"wb+")) == NULL) + { + return(-1); + } + sprintf(fname_temp,"%s%ctemp",path_home,PATHSEP); + + transpose_offset = 0; + + if(strcmp(dict_name,"ru") == 0) + { + // transpose cyrillic alphabet from unicode to iso8859-5 +// transpose_offset = 0x430-0xd0; + transpose_offset = 0x42f; // range 0x01 to 0x22 + transpose_min = 0x430; + transpose_max = 0x451; + } + + value = N_HASH_DICT; + fwrite(&value,4,1,f_out); + fwrite(&offset_rules,4,1,f_out); + + compile_dictlist_start(); + + fprintf(f_log,"Using phonemetable: '%s'\n",PhonemeTabName()); + compile_dictlist_file(path,"roots"); + compile_dictlist_file(path,"listx"); + compile_dictlist_file(path,"list"); + compile_dictlist_file(path,"extra"); + + compile_dictlist_end(f_out); + offset_rules = ftell(f_out); + + sprintf(fname,"%srules",path); + fprintf(f_log,"Compiling: '%s'\n",fname); + f_in = fopen_log(fname,"r"); + if(f_in == NULL) + { + return(-1); + } + + compile_dictrules(f_in,f_out,fname_temp); + fclose(f_in); + + fseek(f_out,4,SEEK_SET); + fwrite(&offset_rules,4,1,f_out); + fclose(f_out); + + translator->LoadDictionary(dict_name,0); + + return(error_count); +} // end of compile_dictionary + diff --git a/src/debug.cpp b/src/debug.cpp new file mode 100644 index 00000000..76d72350 --- /dev/null +++ b/src/debug.cpp @@ -0,0 +1,74 @@ +#include +#include +#include "speech.h" +#include "debug.h" + +#ifdef DEBUG_ENABLED +#include +#include + +static FILE* fd_log=NULL; +static const char* FILENAME="/tmp/espeak.log"; + +void debug_init() +{ + fd_log = fopen(FILENAME,"a"); + setvbuf(fd_log, NULL, _IONBF, 0); +} + +void debug_enter(const char* text) +{ + struct timeval tv; + + gettimeofday(&tv, NULL); + + // fd_log = fopen(FILENAME,"a"); + if (!fd_log) + { + debug_init(); + } + + if (fd_log) + { + fprintf(fd_log, "%03d.%03dms > ENTER %s\n",(int)(tv.tv_sec%1000), (int)(tv.tv_usec/1000), text); + // fclose(fd_log); + } +} + + +void debug_show(const char *format, ...) +{ + va_list args; + va_start(args, format); + // fd_log = fopen(FILENAME,"a"); + if (!fd_log) + { + debug_init(); + } + if (fd_log) + { + vfprintf(fd_log, format, args); + // fclose(fd_log); + } + va_end(args); +} + +void debug_time(const char* text) +{ + struct timeval tv; + + gettimeofday(&tv, NULL); + + // fd_log = fopen(FILENAME,"a"); + if (!fd_log) + { + debug_init(); + } + if (fd_log) + { + fprintf(fd_log, "%03d.%03dms > %s\n",(int)(tv.tv_sec%1000), (int)(tv.tv_usec/1000), text); + // fclose(fd_log); + } +} + +#endif diff --git a/src/debug.h b/src/debug.h new file mode 100644 index 00000000..c3fb9c92 --- /dev/null +++ b/src/debug.h @@ -0,0 +1,26 @@ +#ifndef DEBUG_H +#define DEBUG_H + +//#define DEBUG_ENABLED + +#ifdef DEBUG_ENABLED +#define ENTER(text) debug_enter(text) +#define SHOW(format,...) debug_show(format,__VA_ARGS__); +#define SHOW_TIME(text) debug_time(text); +extern void debug_enter(const char* text); +extern void debug_show(const char* format,...); +extern void debug_time(const char* text); + +#else + +#ifdef PLATFORM_WINDOWS +#define SHOW(format) // VC6 doesn't allow "..." +#else +#define SHOW(format,...) +#endif +#define SHOW_TIME(text) +#define ENTER(text) +#endif + + +#endif diff --git a/src/dictionary.cpp b/src/dictionary.cpp new file mode 100755 index 00000000..4263d3ce --- /dev/null +++ b/src/dictionary.cpp @@ -0,0 +1,2805 @@ +/*************************************************************************** + * Copyright (C) 2005,2006 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "StdAfx.h" + +#define LOG_TRANSLATE + +#include +#include +#include +#include + +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "translate.h" + + + +char dictionary_name[40]; + +extern MNEM_TAB mnem_flags[]; + +// accented characters which indicate (in some languages) the start of a separate syllable +//static const unsigned short diereses_list[7] = {L'ä',L'ë',L'ï',L'ö',L'ü',L'ÿ',0}; +static const unsigned short diereses_list[7] = {0xe4,0xeb,0xef,0xf6,0xfc,0xff,0}; + +// convert characters to an approximate 7 bit ascii equivalent +// used for checking for vowels +static unsigned char remove_accent[] = { +'a','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i', // 0c0 +'d','n','o','o','o','o','o', 0, 'o','u','u','u','u','y','t','s', // 0d0 +'a','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i', // 0e0 +'d','n','o','o','o','o','o', 0 ,'o','u','u','u','u','y','t','y', // 0f0 + +'a','a','a','a','a','a','c','c','c','c','c','c','c','c','d','d', // 100 +'d','d','e','e','e','e','e','e','e','e','e','e','g','g','g','g', // 110 +'g','g','g','g','h','h','h','h','i','i','i','i','i','i','i','i', // 120 +'i','i','i','i','j','j','k','k','k','l','l','l','l','l','l','l', // 130 +'l','l','l','n','n','n','n','n','n','n','n','n','o','o','o','o', // 140 +'o','o','o','o','r','r','r','r','r','r','s','s','s','s','s','s', // 150 +'s','s','t','t','t','t','t','t','u','u','u','u','u','u','u','u', // 160 +'u','u','u','u','w','w','y','y','y','z','z','z','z','z','z','s', // 170 +'b','b','b','b', 0, 0, 'o','c','c','d','d','d','d','d','e','e', // 180 +'e','f','f','g','g','h','i','i','k','k','l','l','m','n','n','o', // 190 +'o','o','o','o','p','p','y', 0, 0, 's','s','t','t','t','t','u', // 1a0 +'u','u','v','y','y','z','z','z','z','z','z','z', 0, 0, 0, 'w', // 1b0 +'t','t','t','k','d','d','d','l','l','l','n','n','n','a','a','i', // 1c0 +'i','o','o','u','u','u','u','u','u','u','u','u','u','e','a','a', // 1d0 +'a','a','a','a','g','g','g','g','k','k','o','o','o','o','z','z', // 1e0 +'j','d','d','d','g','g','w','w','n','n','a','a','a','a','o','o', // 1f0 + +'a','a','a','a','e','e','e','e','i','i','i','i','o','o','o','o', // 200 +'r','r','r','r','u','u','u','u','s','s','t','t','y','y','h','h', // 210 +'n','d','o','o','z','z','a','a','e','e','o','o','o','o','o','o', // 220 +'o','o','y','y','l','n','t','j','d','q','a','c','c','l','t','s', // 230 +'z', 0 }; + + + + +void strncpy0(char *to,const char *from, int size) +{//=============================================== + // strcpy with limit, ensures a zero terminator + strncpy(to,from,size); + to[size-1] = 0; +} + + + +int LookupMnem(MNEM_TAB *table, char *string) +{//========================================== + while(table->mnem != NULL) + { + if(strcmp(string,table->mnem)==0) + return(table->value); + table++; + } + return(table->value); +} + +const char *LookupMnem(MNEM_TAB *table, int value) +{//=============================================== + while(table->mnem != NULL) + { + if(table->value == value) + return(table->mnem); + table++; + } + return(""); +} + + + +//============================================================================================= +// Read pronunciation rules and pronunciation lookup dictionary +// +//============================================================================================= + + + +int Translator::LoadDictionary(const char *name, int no_error) +{//=========================================================== + int hash; + char *p; + int *pw; + int length; + FILE *f; + unsigned int size; + char fname[130]; + + strcpy(dictionary_name,name); // currently loaded dictionary name + + // Load a pronunciation data file into memory + // bytes 0-3: offset to rules data + // bytes 4-7: number of hash table entries + sprintf(fname,"%s%c%s_dict",path_home,PATHSEP,name); + size = GetFileLength(fname); + + f = fopen(fname,"rb"); + if((f == NULL) || (size == 0)) + { + if(no_error == 0) + { + fprintf(stderr,"Can't read dictionary file: '%s'\n",fname); + } + return(1); + } + + if(data_dictlist != NULL) + Free(data_dictlist); + + data_dictlist = Alloc(size); + fread(data_dictlist,size,1,f); + fclose(f); + + + pw = (int *)data_dictlist; + length = pw[1]; + if(size <= (N_HASH_DICT + sizeof(int)*2)) + { + fprintf(stderr,"Empty dictionary: '%s\n",fname); + return(2); + } + if((pw[0] != N_HASH_DICT) || (length <= 0) || (length > 0x8000000)) + { + fprintf(stderr,"Bad data: '%s'\n",fname); + return(2); + } + data_dictrules = &data_dictlist[length]; + + // set up indices into data_dictrules + InitGroups(); + if(groups1[0] == NULL) + { + fprintf(stderr,"Error in %s_rules, no default rule group\n",name); + } + + // set up hash table for data_dictlist + p = &data_dictlist[8]; + + for(hash=0; hash> 8); /* exclusive or */ + chars++; + } + + return((hash+chars) & 0x3ff); // a 10 bit hash code +} // end of HashDictionary + + + +//============================================================================================= +// Translate between internal representation of phonemes and a mnemonic form for display +// +//============================================================================================= + + + +char *EncodePhonemes(char *p, char *outptr, unsigned char *bad_phoneme) +/*********************************************************************/ +/* Translate a phoneme string from ascii mnemonics to internal phoneme numbers, + from 'p' up to next blank . + Returns advanced 'p' + outptr contains encoded phonemes, unrecognised phonemes are encoded as 255 + bad_phoneme must point to char array of length 2 of more +*/ +{ + int ix; + unsigned char c; + int count; /* num. of matching characters */ + int max; /* highest num. of matching found so far */ + int max_ph; /* corresponding phoneme with highest matching */ + int consumed; + unsigned int mnemonic_word; + + bad_phoneme[0] = 0; + + // skip initial blanks + while(isspace(*p)) + { + p++; + } + + while(((c = *p) != 0) && !isspace(c)) + { + consumed = 0; + + switch(c) + { + case '|': + // used to separate phoneme mnemonics if needed, to prevent characters being treated + // as a multi-letter mnemonic + + if((c = p[1]) == '|') + { + // treat double || as a word-break symbol, drop through + // to the default case with c = '|' + } + else + { + p++; + break; + } + + default: + // lookup the phoneme mnemonic, find the phoneme with the highest number of + // matching characters + max= -1; + max_ph= 0; + + for(ix=1; ixtype == phINVALID) + continue; // this phoneme is not defined for this language + + count = 0; + mnemonic_word = phoneme_tab[ix]->mnemonic; + + while(((c = p[count]) > ' ') && (count < 4) && + (c == ((mnemonic_word >> (count*8)) & 0xff))) + count++; + + if((count > max) && + ((count == 4) || (((mnemonic_word >> (count*8)) & 0xff)==0))) + { + max = count; + max_ph = phoneme_tab[ix]->code; + } + } + + if(max_ph == 0) + { + max_ph = 255; /* not recognised */ + bad_phoneme[0] = *p; + bad_phoneme[1] = 0; + } + + if(max <= 0) + max = 1; + p += (consumed + max); + *outptr++ = (char)(max_ph); + + if(max_ph == phonSWITCH) + { + // Switch Language: this phoneme is followed by a text string + char *p_lang = outptr; + while(!isspace(c = *p++) && (c != 0)) + *outptr++ = tolower(c); + *outptr = 0; + if(strcmp(p_lang,"en")==0) + { + *p_lang = 0; // don't need "en", it's assumed by default + } + return(p); + } + break; + } + } + /* terminate the encoded string */ + *outptr = 0; + return(p); +} // end of EncodePhonemes + + + +void DecodePhonemes(const char *inptr, char *outptr) +//================================================== +// Translate from internal phoneme codes into phoneme mnemonics +{ + unsigned char phcode; + unsigned char c; + unsigned int mnem; + PHONEME_TAB *ph; + static const char *stress_chars = "==,,'* "; + + while((phcode = *inptr++) > 0) + { + if(phcode == 255) + continue; /* indicates unrecognised phoneme */ + if((ph = phoneme_tab[phcode]) == NULL) + continue; + + if((ph->type == phSTRESS) && (ph->std_length <= 4) && (ph->spect == 0)) + { + if(ph->std_length > 1) + *outptr++ = stress_chars[ph->std_length]; + } + else + { + mnem = ph->mnemonic; + + while((c = (mnem & 0xff)) != 0) + { + *outptr++ = c; + mnem = mnem >> 8; + } + } + } + *outptr = 0; /* string terminator */ +} // end of DecodePhonemes + + + +void Translator::WriteMnemonic(int *ix, int mnem) +{//============================================== + unsigned char c; + + while((c = mnem & 0xff) != 0) + { + if((c == '/') && (option_phoneme_variants==0)) + break; // discard phoneme variant indicator + phon_out[(*ix)++]= c; + // phon_out[phon_out_ix++]= ipa1[c]; + mnem = mnem >> 8; + } +} + + +void Translator::GetTranslatedPhonemeString(char *phon_out, int n_phon_out) +{//======================================================================== +/* Can be called after a clause has been translated into phonemes, in order + to display the clause in phoneme mnemonic form. +*/ + + int ix; + int phon_out_ix=0; + int stress; + PHONEME_LIST *plist; + + static const char *stress_chars = "==,,'*"; + + if(phon_out != NULL) + { + for(ix=1; ix<(n_phoneme_list-2) && (phon_out_ix < (n_phon_out - 6)); ix++) + { + plist = &phoneme_list[ix]; + if(plist->newword) + phon_out[phon_out_ix++] = ' '; + + if(plist->synthflags & SFLAG_SYLLABLE) + { + if((stress = plist->tone) > 1) + { + if(stress > 5) stress = 5; + phon_out[phon_out_ix++] = stress_chars[stress]; + } + } + WriteMnemonic(&phon_out_ix,plist->ph->mnemonic); + + if(plist->synthflags & SFLAG_LENGTHEN) + { + WriteMnemonic(&phon_out_ix,phoneme_tab[phonLENGTHEN]->mnemonic); + } + if((plist->synthflags & SFLAG_SYLLABLE) && (plist->type != phVOWEL)) + { + // syllablic consonant + WriteMnemonic(&phon_out_ix,phoneme_tab[phonSYLLABIC]->mnemonic); + } + if(plist->tone_ph > 0) + { + WriteMnemonic(&phon_out_ix,phoneme_tab[plist->tone_ph]->mnemonic); + } + } + + if(phon_out_ix >= n_phon_out) + phon_out_ix = n_phon_out - 1; + phon_out[phon_out_ix] = 0; + } +} // end of Translator::GetTranslatedPhonemeString + + + +//============================================================================================= +// Is a word Unpronouncable - and so should be spoken as individual letters +// +//============================================================================================= + + +#ifdef deleted +// this is the initials_bitmap for english +static unsigned char initials_bitmap[86] = { + 0x00, 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x88, // 0 + 0x20, 0x24, 0x20, 0x80, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x28, 0x08, 0x00, 0x88, 0x22, 0x04, 0x00, // 16 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x88, 0x22, 0x04, 0x00, 0x02, 0x00, 0x00, // 32 + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x28, 0x8a, 0x03, 0x00, 0x00, 0x40, 0x00, // 48 + 0x02, 0x00, 0x41, 0xca, 0x9b, 0x06, 0x20, 0x80, + 0x91, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, // 64 + 0x08, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x22, 0x00, 0x01, 0x00, }; +#endif + + +int Translator::Unpronouncable(char *word) +{//======================================= +/* Determines whether a word in 'unpronouncable', i.e. whether it should + be spoken as individual letters. + + This function may be language specific. This is a generic version. +*/ + + int c; + int c1=0; + int vowel_posn=9; + int index; + int count; + int apostrophe=0; + + if(langopts.param[LOPT_UNPRONOUNCABLE] == 1) + return(0); + + if((*word == ' ') || (*word == 0)) + return(0); + + index = 0; + count = 0; + for(;;) + { + index += utf8_in(&c,&word[index],0); + if((c==0) || (c==' ')) + break; + + if(count==0) + c1 = c; + count++; + + if(IsVowel(c)) + { + vowel_posn = count; // position of the first vowel + break; + } + + if(c == '\'') + apostrophe = 1; + else + if(!iswalpha(c)) + return(0); // letter (not vowel) outside a-z range or apostrophe, abort test + } + + if((vowel_posn < 9) && (langopts.param[LOPT_UNPRONOUNCABLE] == 2)) + return(0); // option means allow any word with a vowel + + if(c1 == langopts.param[LOPT_UNPRONOUNCABLE]) + vowel_posn--; // disregard this as the initial letter when counting + + if(vowel_posn > (langopts.max_initial_consonants+1)) + return(1); // no vowel, or no vowel in first four letters + +return(0); + +} /* end of Unpronounceable */ + + + +int Translator::IsLetter(int letter, int group) +{//============================================ + if(letter_groups[group] != NULL) + { + if(wcschr(letter_groups[group],letter)) + return(1); + return(0); + } + + if(group > 7) + return(0); + + + if(letter_bits_offset > 0) + { + letter -= letter_bits_offset; + } + else + { + if((letter >= 0xc0) && (letter <= 0x241)) + return(letter_bits[remove_accent[letter-0xc0]] & (1L << group)); + } + + if((letter >= 0) && (letter < 0x80)) + return(letter_bits[letter] & (1L << group)); + + return(0); +} + + +int Translator::IsVowel(int letter) +{//================================ + return(IsLetter(letter,0)); +} + +void SetLetterVowel(Translator *tr, int c) +{//======================================= + tr->letter_bits[c] = 0x81; // group 0 only +} + +void SetLetterBits(Translator *tr, int group, const char *string) +{//============================================================== + int bits; + unsigned char c; + + bits = (1L << group); + while((c = *string++) != 0) + tr->letter_bits[c] |= bits; +} + +void SetLetterBitsRange(Translator *tr, int group, int first, int last) +{//==================================================================== + int bits; + int ix; + + bits = (1L << group); + for(ix=first; ix<=last; ix++) + { + tr->letter_bits[ix] |= bits; + } +} + + + +//============================================================================================= +// Determine the stress pattern of a word +// +//============================================================================================= + + + +int GetVowelStress(unsigned char *phonemes, unsigned char *vowel_stress, int &vowel_count, int &stressed_syllable) +{//=============================================================================================================== + + unsigned char phcode; + PHONEME_TAB *ph; + unsigned char *ph_out = phonemes; + int count = 1; + int max_stress = 0; + int ix; + int j; + int stress = 0; + int primary_posn = 0; + + vowel_stress[0] = 0; + while((phcode = *phonemes++) != 0) + { + if((ph = phoneme_tab[phcode]) == NULL) + continue; + + if((ph->type == phSTRESS) && (ph->spect == 0)) + { + /* stress marker, use this for the following vowel */ + + if(phcode == phonSTRESS_PREV) + { + /* primary stress on preceeding vowel */ + j = count - 1; + while((j > 0) && (stressed_syllable == 0) && (vowel_stress[j] < 4)) + { + if(vowel_stress[j] != 1) + { + // don't promote a phoneme which must be unstressed + vowel_stress[j] = 4; + + if(max_stress < 4) + { + max_stress = 4; + primary_posn = j; + } + + /* reduce any preceding primary stress markers */ + for(ix=1; ixstd_length < 4) || (stressed_syllable == 0)) + { + stress = ph->std_length; + + if(stress > max_stress) + max_stress = stress; + } + } + continue; + } + + if((ph->type == phVOWEL) && (ph->code != phonSCHWA_SHORT)) + { + vowel_stress[count] = (char)stress; + if((stress >= 4) && (stress >= max_stress)) + { + primary_posn = count; + max_stress = stress; + } + + if((stress == 0) && (ph->phflags & phUNSTRESSED)) + vowel_stress[count] = 1; /* weak vowel, must be unstressed */ + + count++; + stress = 0; + } + else + if(phcode == phonSYLLABIC) + { + // previous consonant phoneme is syllablic + vowel_stress[count] = (char)stress; + if(stress == 0) + vowel_stress[count++] = 1; // syllabic consonant, usually unstressed + } + + *ph_out++ = phcode; + } + vowel_stress[count] = 0; + *ph_out = 0; + + /* has the position of the primary stress been specified by $1, $2, etc? */ + if(stressed_syllable > 0) + { + if(stressed_syllable >= count) + stressed_syllable = count-1; // the final syllable + + vowel_stress[stressed_syllable] = 4; + max_stress = 4; + primary_posn = stressed_syllable; + } + + if(max_stress == 5) + { + // priority stress, replaces any other primary stress marker + for(ix=1; ix= 4) + { + // promote to primary stress + for(ix=1; ix new_stress) + vowel_stress[ix] = new_stress; + } + } + + // write out phonemes + ix = 1; + p = phonetic; + while(*p != 0) + { + if((phoneme_tab[*p]->type == phVOWEL) && (*p != phonSCHWA_SHORT)) + { + if(vowel_stress[ix] != 0) + *word++ = stress_phonemes[vowel_stress[ix]]; + + ix++; + } + *word++ = *p++; + } + *word = 0; +} // end of ChangeWordStress + + + +void Translator::SetWordStress(char *output, unsigned int dictionary_flags, int tonic, int prev_stress) +{//=================================================================================================== +/* Guess stress pattern of word. This is language specific + + 'dictionary_flags' has bits 0-3 position of stressed vowel (if > 0) + or unstressed (if == 7) or syllables 1 and 2 (if == 6) + bits 8... dictionary flags + + If 'tonic' is set (>= 0), replace highest stress by this value. + + Parameter used for input and output +*/ + + unsigned char phcode; + unsigned char *p; + PHONEME_TAB *ph; + int stress; + int max_stress; + int vowel_count; // num of vowels + 1 + int ix; + int v; + int v_stress; + int reduce_level; + int stressed_syllable; // position of stressed syllable + int max_stress_posn; + int unstressed_word = 0; + char *max_output; + int final_ph; + int mnem; + int post_tonic; + + unsigned char vowel_stress[N_WORD_PHONEMES/2]; + char syllable_type[N_WORD_PHONEMES/2]; + unsigned char phonetic[N_WORD_PHONEMES]; + + static char consonant_types[16] = {0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0}; + + + /* stress numbers STRESS_BASE + + 0 diminished, unstressed within a word + 1 unstressed, weak + 2 + 3 secondary stress + 4 main stress */ + + /* copy input string into internal buffer */ + for(ix=0; ix= n_phoneme_tab) + phonetic[ix] = phonSCHWA; + if(phonetic[ix] == 0) + break; + } + final_ph = phonetic[ix-1]; + + max_output = output + (N_WORD_PHONEMES-3); /* check for overrun */ + + // any stress position marked in the xx_list dictionary ? + stressed_syllable = dictionary_flags & 0x7; + if(dictionary_flags & 0x8) + { + // this indicates a word without a primary stress + stressed_syllable = dictionary_flags & 0x3; + unstressed_word = 1; + } + + max_stress = GetVowelStress(phonetic,vowel_stress,vowel_count,stressed_syllable); + + // heavy or light syllables + ix = 1; + for(p = phonetic; *p != 0; p++) + { + if((phoneme_tab[p[0]]->type == phVOWEL) && (p[0] != phonSCHWA_SHORT)) + { + int weight = 0; + int lengthened = 0; + + if(phoneme_tab[p[1]]->code == phonLENGTHEN) + lengthened = 1; + + if(lengthened || (phoneme_tab[p[0]]->phflags & phLONG)) + { + // long vowel, increase syllable weight + weight++; + } + + if(lengthened) p++; // advance over phonLENGTHEN + + if(consonant_types[phoneme_tab[p[1]]->type] && ((phoneme_tab[p[2]]->type != phVOWEL) || (phoneme_tab[p[1]]->phflags & phLONG))) + { + // followed by two consonants, a long consonant, or consonant and end-of-word + weight++; + } + syllable_type[ix] = weight; + ix++; + } + } + + switch(langopts.stress_rule) + { + case 2: + // a language with stress on penultimate vowel + + if(stressed_syllable == 0) + { + /* no explicit stress - stress the penultimate vowel */ + max_stress = 4; + + if(vowel_count > 2) + { + stressed_syllable = vowel_count - 2; + + if(langopts.stress_flags & 0x300) + { + // LANG=Spanish, stress on last vowel if the word ends in a consonant other than 'n' or 's' + if(phoneme_tab[final_ph]->type != phVOWEL) + { + if(langopts.stress_flags & 0x100) + { + stressed_syllable = vowel_count - 1; + } + else + { + mnem = phoneme_tab[final_ph]->mnemonic; + if((mnem != 'n') && (mnem != 's')) + { + stressed_syllable = vowel_count - 1; + } + } + } + } + + if(vowel_stress[stressed_syllable] == 1) + { + // but this vowel is explicitly marked as unstressed + if(stressed_syllable > 1) + stressed_syllable--; + else + stressed_syllable++; + } + } + else + { + stressed_syllable = 1; + if(langopts.stress_flags & 0x1) + max_stress = 3; // don't give full stress to monosyllables + } + + // only set the stress if it's not already marked explicitly + if(vowel_stress[stressed_syllable] == 0) + { + // don't stress if next and prev syllables are stressed + if((vowel_stress[stressed_syllable-1] < 4) || (vowel_stress[stressed_syllable+1] < 4)) + vowel_stress[stressed_syllable] = max_stress; + } + } + break; + + case 3: + // stress on last vowel + if(stressed_syllable == 0) + { + /* no explicit stress - stress the final vowel */ + stressed_syllable = vowel_count - 1; + if(max_stress == 0) + { + vowel_stress[stressed_syllable] = 4; + } + max_stress = 4; + } + break; + + case 5: + // LANG=Russian + if(stressed_syllable == 0) + { + /* no explicit stress - guess the stress from the number of syllables */ + static char guess_ru[16] = {0,0,1,1,2,3,3,4,5,6,7,7,8,9,10,11}; + static char guess_ru_v[16] = {0,0,1,1,2,2,3,3,4,5,6,7,7,8,9,10}; // for final phoneme is a vowel + static char guess_ru_t[16] = {0,0,1,2,3,3,3,4,5,6,7,7,7,8,9,10}; // for final phoneme is an unvoiced stop + + stressed_syllable = vowel_count - 3; + if(vowel_count < 16) + { + if(phoneme_tab[final_ph]->type == phVOWEL) + stressed_syllable = guess_ru_v[vowel_count]; + else + if(phoneme_tab[final_ph]->type == phSTOP) + stressed_syllable = guess_ru_t[vowel_count]; + else + stressed_syllable = guess_ru[vowel_count]; + } + vowel_stress[stressed_syllable] = 4; + max_stress = 4; + } + break; + + case 6: // LANG=hi stress on the last heaviest syllable + if(stressed_syllable == 0) + { + int wt; + int max_weight = -1; + int min_weight = 10; + int prev_stressed; + + for(ix = 1; ix < vowel_count; ix++) + { + if(vowel_stress[ix] == 0) + { + if((wt = syllable_type[ix]) < min_weight) + min_weight = wt; + if(wt >= max_weight) + { + max_weight = wt; + prev_stressed = stressed_syllable; + stressed_syllable = ix; + } + } + } + if(max_weight > min_weight) + { + // different weights, don't stress the final syllable + if((stressed_syllable == vowel_count-1) && (syllable_type[vowel_count-2] > 0)) + { + stressed_syllable = vowel_count-2; + } + } + vowel_stress[stressed_syllable] = 4; + max_stress = 4; + } + break; + + case 9: // mark all as stressed + for(ix=1; ix= 4)) + { + // 2-syllable word, put a secondary stress on the initial syllable + vowel_stress[1] = 3; + } + } + + for(v=1; v 1) && (langopts.stress_flags & 0x40) && (syllable_type[v]==0) && (syllable_type[v+1]>0)) + { + // don't put secondary stress on a light syllable which is followed by a heavy syllable + continue; + } + +// should start with secondary stress on the first syllable, or should it count back from +// the primary stress and put secondary stress on alternate syllables? + vowel_stress[v] = (char)stress; + stress = 3; /* use secondary stress for remaining syllables */ + } + } + } + + if((unstressed_word) && (tonic < 0)) + { + if(vowel_count <= 2) + tonic = langopts.unstressed_wd1; /* monosyllable - unstressed */ + else + tonic = langopts.unstressed_wd2; /* more than one syllable, used secondary stress as the main stress */ + } + + if(tonic >= 0) + { + /* find position of highest stress, and replace it by 'tonic' */ + max_stress = 0; + max_stress_posn = 0; + for(v=1; v= max_stress) + { + max_stress = vowel_stress[v]; + max_stress_posn = v; + } + } + + /* don't disturb an explicitly set stress by 'unstress-at-end' flag */ + if((tonic > max_stress) || (max_stress <= 4)) + vowel_stress[max_stress_posn] = (char)tonic; + max_stress = tonic; + } + + + /* produce output phoneme string */ + p = phonetic; + v = 1; + + if((ph = phoneme_tab[*p]) != NULL) + { + int gap = langopts.word_gap & 0xf00; + + if(ph->type == phSTRESS) + ph = phoneme_tab[p[1]]; + + if(((gap) && (vowel_stress[1] >= 4) && (prev_stress >= 4)) || (langopts.word_gap & 0x8)) + { + /* two primary stresses together, insert a short pause */ + if(gap == 0x0300) + *output++ = phonPAUSE; + else + if((gap == 0x0200) && (ph->type == phVOWEL)) + *output++ = phonGLOTTALSTOP; + else + *output++ = phonPAUSE_SHORT; + } + else + if((langopts.vowel_pause & 0x30) && (ph->type == phVOWEL)) + { + // word starts with a vowel + + if((langopts.vowel_pause & 0x20) && (vowel_stress[1] >= 4)) + { + *output++ = phonPAUSE_NOLINK; // not to be replaced by link + } + else + { + *output++ = phonPAUSE_VSHORT; // break, but no pause + } + } + } + + p = phonetic; + post_tonic = 0; + while(((phcode = *p++) != 0) && (output < max_output)) + { + if((ph = phoneme_tab[phcode]) == NULL) + continue; + +// if(ph->type == phSTRESS) +// continue; + + if(ph->type == phPAUSE) + { + prev_last_stress = 0; + } + else + if(((ph->type == phVOWEL) && (ph->code != phonSCHWA_SHORT)) || (*p == phonSYLLABIC)) + { + // a vowel, or a consonant followed by a syllabic consonant marker + + v_stress = vowel_stress[v]; + prev_last_stress = v_stress; + + if(vowel_stress[v-1] >= max_stress) + post_tonic = 1; + + if(v_stress <= 1) + { + if((v > 1) && (max_stress >= 4) && (langopts.stress_flags & 4) && (v == (vowel_count-1))) + { + // option: mark unstressed final syllable as diminished + v_stress = 1; + } + else + if((langopts.stress_flags & 2) || (v == 1) || (v == (vowel_count-1))) + { + // first or last syllable, or option 'don't set diminished stress' + v_stress = 0; + } + else + if((v == (vowel_count-2)) && (vowel_stress[vowel_count-1] <= 1)) + { + // penultimate syllable, followed by an unstressed final syllable + v_stress = 0; + } + else + { + // unstressed syllable within a word + v_stress = 1; /* change from 0 (unstressed) to 1 (diminished stress) */ + } + } + + if(v_stress > 0) + *output++ = stress_phonemes[v_stress]; // mark stress of all vowels except 0 (unstressed) + + while((ph->reduce_to != 0) && !(dictionary_flags & FLAG_FOUND)) + { + // this vowel can be reduced to another if the stress is below a specified value + int reduce = 0; + + switch(reduce_level = (ph->phflags >> 28) & 7) + { + case 0: + /* reduce unstressed-diminished to schwa */ + if((vowel_stress[v+1] <= 1) && (v >= (vowel_count-2))) + { + /* not if followed by another, terminating, unstessed syllable */ + break; + } // drop through to next case + case 1: + if(v_stress == 1) // diminished stress only + reduce = 1; + break; + + default: + if(v_stress < reduce_level) + reduce = 1; + break; + } + + if(max_stress == 1) max_stress = 0; + if(unstressed_word && langopts.param[LOPT_KEEP_UNSTR_VOWEL] && (v_stress >= max_stress)) + { + reduce = 0; + } + + if(reduce) + { + phcode = ph->reduce_to; + ph = phoneme_tab[phcode]; +#ifdef deleted + if(*p == phonLENGTHEN) + { + /* delete length indicator after vowel now that it has been reduced */ + p++; + } +#endif + } + else + break; + } + + if(langopts.param[LOPT_IT_LENGTHEN] && (*p == phonLENGTHEN)) + { + // remove lengthen indicator from non-stressed syllables + if(v_stress < 4) + p++; + else + if((langopts.param[LOPT_IT_LENGTHEN]==2) && (v != (vowel_count - 2))) + p++; // LANG=Italian, remove lengthen indicator from non-penultimate syllables + } + + if(vowel_stress[v] > max_stress) + { + max_stress = vowel_stress[v]; + } + v++; + } + + if(phcode != 1) + *output++ = phcode; + } + *output++ = 0; + +} /* end of SetWordStress */ + + + + +//============================================================================================= +// Look up a word in the pronunciation rules +// +//============================================================================================= + + +#ifdef LOG_TRANSLATE +char *Translator::DecodeRule(const char *group, char *rule) +{//================================================== +/* Convert compiled match template to ascii */ + + unsigned char rb; + unsigned char c; + char *p; + int ix; + int match_type; + int finished=0; + int value; + int condition_num=0; + char buf[60]; + char buf_pre[60]; + char suffix[12]; + static char output[60]; + + static char symbols[] = {' ',' ',' ',' ',' ',' ',' ',' ',' ', + '@','&','%','+','#','S','D','Z','A','B','C','H','F','G','Y','N','K','V','L','T'}; + + + match_type = 0; + buf_pre[0] = 0; + strcpy(buf,group); + p = &buf[strlen(buf)]; + while(!finished) + { + rb = *rule++; + + if(rb <= 5) + { + switch(rb) + { + case 0: + case RULE_PHONEMES: + finished=1; + break; + case RULE_PRE: + match_type = RULE_PRE; + *p = 0; + p = buf_pre; + break; + case RULE_POST: + match_type = RULE_POST; + *p = 0; + strcat(buf," ("); + p = &buf[strlen(buf)]; + break; + case RULE_PH_COMMON: + break; + case RULE_CONDITION: + /* conditional rule, next byte gives condition number */ + condition_num = *rule++; + break; + } + continue; + } + + if(rb == RULE_ENDING) + { + if(rule[0] & (SUFX_P>>8)) + sprintf(suffix,"P%d",rule[1] & 0x7f); + else + sprintf(suffix,"$%d(%x)",rule[1] & 0x7f,rule[0] & 0x7f); + rule += 2; + strcpy(p,suffix); + p += strlen(suffix); + c = ' '; + } + else + if(rb == RULE_LETTERGP) + { + value = *rule++ - 'A'; + if(value >= 8) + { + p[0] = 'L'; + p[1] = (value / 10) + '0'; + c = (value % 10) + '0'; + + if(match_type == RULE_PRE) + { + p[0] = c; + c = 'L'; + } + p+=2; + } + else + { + c = symbols[value + RULE_LETTER_GROUPS]; + } + } + else + if(rb <= RULE_LAST_RULE) + c = symbols[rb]; + else + if(rb == RULE_SPACE) + c = '_'; + else + c = rb; + *p++ = c; + } + *p = 0; + + p = output; + if(condition_num > 0) + { + sprintf(output,"?%d ",condition_num); + p = &output[strlen(output)]; + } + if((ix = strlen(buf_pre)) > 0) + { + while(--ix >= 0) + *p++ = buf_pre[ix]; + *p++ = ')'; + *p++ = ' '; + } + *p = 0; + strcat(p,buf); + ix = strlen(output); + while(ix < 8) + output[ix++]=' '; + output[ix]=0; + return(output); +} /* end of decode_match */ +#endif + + + +void Translator::AppendPhonemes(char *string, int size, const char *ph) +{//==================================================================== +/* Add new phoneme string "ph" to "string" + Keeps count of the number of vowel phonemes in the word, and whether these + can be stressed syllables. These values can be used in translation rules +*/ + const char *p; + unsigned char c; + int unstress_mark; + int length; + + length = strlen(ph) + strlen(string); + if(length >= size) + { + return; + } + + /* any stressable vowel ? */ + unstress_mark = 0; + p = ph; + while((c = *p++) != 0) + { + if(c >= n_phoneme_tab) continue; + + if(phoneme_tab[c]->type == phSTRESS) + { + if(phoneme_tab[c]->std_length < 4) + unstress_mark = 1; + } + else + { + if(phoneme_tab[c]->type == phVOWEL) + { + if(((phoneme_tab[c]->phflags & phUNSTRESSED) == 0) && + (unstress_mark == 0)) + { + word_stressed_count++; + } + unstress_mark = 0; + word_vowel_count++; + } + } + } + + if(string != NULL) + strcat(string,ph); +} /* end of AppendPhonemes */ + + + +void Translator::MatchRule(char *word[], const char *group, char *rule, MatchRecord *match_out, int word_flags, int dict_flags) +{//============================================================================================================================ +/* Checks a specified word against dictionary rules. + Returns with phoneme code string, or NULL if no match found. + + word (indirect) points to current character group within the input word + This is advanced by this procedure as characters are consumed + + group: the initial characters used to choose the rules group + + rule: address of dictionary rule data for this character group + + match_out: returns best points score + + word_flags: indicates whether this is a retranslation after a suffix has been removed +*/ + + unsigned char rb; // current instuction from rule + unsigned char letter; // current letter from input word, single byte + int letter_w; // current letter, wide character + int letter_xbytes; // number of extra bytes of multibyte character (num bytes - 1) + unsigned char last_letter; + + char *pre_ptr; + char *post_ptr; /* pointer to first character after group */ + + char *rule_start; /* start of current match template */ + char *p; + + int match_type; /* left, right, or consume */ + int failed; + int consumed; /* number of letters consumed from input */ + int count; /* count through rules in the group */ + int syllable_count; + int vowel; + int letter_group; + int distance_right; + int distance_left; + + MatchRecord match; + static MatchRecord best; + + int total_consumed; /* letters consumed for best match */ + int group_length; + + unsigned char condition_num; + char *common_phonemes; /* common to a group of entries */ + + + + if(rule == NULL) + { + match_out->points = 0; + return; + } + + + total_consumed = 0; + count = 0; + common_phonemes = NULL; + match_type = 0; + + best.points = 0; + best.phonemes = ""; + best.end_type = 0; + best.del_fwd = NULL; + + group_length = strlen(group); + + /* search through dictionary rules */ + while(rule[0] != RULE_GROUP_END) + { + match_type=0; + consumed = 0; + letter = 0; + distance_right= -6; /* used to reduce points for matches further away the current letter */ + distance_left= -2; + count++; + + match.points = 1; + match.end_type = 0; + match.del_fwd = NULL; + + pre_ptr = *word; + post_ptr = *word + group_length; + + /* work through next rule until end, or until no-match proved */ + rule_start = rule; + failed = 0; + while(!failed) + { + rb = *rule++; + + if(rb <= 5) + { + switch(rb) + { + case 0: // no phoneme string for this rule, use previous common rule + if(common_phonemes != NULL) + { + match.phonemes = common_phonemes; + while(((rb = *match.phonemes++) != 0) && (rb != RULE_PHONEMES)); + } + else + { + match.phonemes = ""; + } + rule--; // so we are still pointing at the 0 + failed=2; // matched OK + break; + case RULE_PRE: + match_type = RULE_PRE; + break; + case RULE_POST: + match_type = RULE_POST; + break; + case RULE_PHONEMES: + match.phonemes = rule; + failed=2; // matched OK + break; + case RULE_PH_COMMON: + common_phonemes = rule; + break; + case RULE_CONDITION: + /* conditional rule, next byte gives condition number */ + condition_num = *rule++; + if((dict_condition & (1L << condition_num))==0) + failed = 1; + else + match.points++; // add one point for a matched conditional rule + break; + } + continue; + } + + switch(match_type) + { + case 0: + /* match and consume this letter */ + last_letter = letter; + letter = *post_ptr++; + + if((letter == rb) || ((letter==(unsigned char)REPLACED_E) && (rb=='e'))) + { + match.points += 21; + consumed++; + } + else + failed = 1; + break; + + + case RULE_POST: + /* continue moving fowards */ + distance_right += 6; + if(distance_right > 18) + distance_right = 19; + last_letter = letter; + letter_xbytes = utf8_in(&letter_w,post_ptr,0)-1; + letter = *post_ptr++; + + switch(rb) + { + case RULE_LETTERGP: + letter_group = *rule++ - 'A'; + if(IsLetter(letter_w,letter_group)) + { + match.points += (20-distance_right); + post_ptr += letter_xbytes; + } + else + failed = 1; + break; + + case RULE_NOTVOWEL: + if(!IsLetter(letter_w,0)) + { + match.points += (20-distance_right); + post_ptr += letter_xbytes; + } + else + failed = 1; + break; + + case RULE_DIGIT: + if(IsDigit(letter_w)) + { + match.points += (21-distance_right); + post_ptr += letter_xbytes; + } + else + failed = 1; + break; + + case RULE_NONALPHA: + if(!iswalpha(letter_w)) + { + match.points += (21-distance_right); + post_ptr += letter_xbytes; + } + else + failed = 1; + break; + + case RULE_DOUBLE: + if(letter == last_letter) + match.points += (21-distance_right); + else + failed = 1; + break; + + case RULE_ALT1: + if(dict_flags & FLAG_ALT_TRANS) + match.points++; + else + failed = 1; + break; + + case '-': + if((letter == ' ') && (word_flags & FLAG_HYPHEN_AFTER)) + { + match.points += (22-distance_right); // one point more than match against space + } + else + failed = 1; + break; + + case RULE_SYLLABLE: + { + /* more than specified number of vowel letters to the right */ + char *p = post_ptr + letter_xbytes; + + syllable_count = 1; + while(*rule == RULE_SYLLABLE) + { + rule++; + syllable_count+=1; /* number of syllables to match */ + } + vowel = 0; + while(letter_w != RULE_SPACE) + { + if((vowel==0) && IsLetter(letter_w,LETTERGP_VOWEL2)) + { + // this is counting vowels which are separated by non-vowels + syllable_count--; + } + vowel = IsLetter(letter_w,LETTERGP_VOWEL2); + p += utf8_in(&letter_w,p,0); + } + if(syllable_count <= 0) + match.points+= (19-distance_right); + else + failed = 1; + } + break; + + case RULE_INC_SCORE: + match.points += 20; // force an increase in points + break; + + case RULE_DEL_FWD: + // find the next 'e' in the word and replace by '' + for(p = *word + group_length; *p != ' '; p++) + { + if(*p == 'e') + { + match.del_fwd = p; + break; + } + } + break; + + case RULE_ENDING: + // next 3 bytes are a (non-zero) ending type. 2 bytes of flags + suffix length + match.end_type = (rule[0] << 16) + ((rule[1] & 0x7f) << 8) + (rule[2] & 0x7f); + rule += 3; + break; + + case RULE_NO_SUFFIX: + if(word_flags & FLAG_SUFFIX_REMOVED) + failed = 1; // a suffix has been removed + break; + + default: + if(letter == rb) + { + if(letter == RULE_SPACE) + match.points += (21-distance_right); + else + match.points += (21-distance_right); + } + else + failed = 1; + break; + } + break; + + + case RULE_PRE: + /* match backwards from start of current group */ + distance_left += 2; + if(distance_left > 18) + distance_left = 19; + + last_letter = *pre_ptr; + pre_ptr--; + letter_xbytes = utf8_in(&letter_w,pre_ptr,1)-1; + letter = *pre_ptr; + + switch(rb) + { + case RULE_LETTERGP: + letter_group = *rule++ - 'A'; + if(IsLetter(letter_w,letter_group)) + { + match.points += (20-distance_left); + pre_ptr -= letter_xbytes; + } + else + failed = 1; + break; + + case RULE_NOTVOWEL: + if(!IsLetter(letter_w,0)) + { + match.points += (20-distance_left); + pre_ptr -= letter_xbytes; + } + else + failed = 1; + break; + + case RULE_DOUBLE: + if(letter == last_letter) + match.points += (21-distance_left); + else + failed = 1; + break; + + case RULE_DIGIT: + if(IsDigit(letter_w)) + { + match.points += (21-distance_left); + pre_ptr -= letter_xbytes; + } + else + failed = 1; + break; + + case RULE_NONALPHA: + if(!iswalpha(letter_w)) + { + match.points += (21-distance_right); + pre_ptr -= letter_xbytes; + } + else + failed = 1; + break; + + case RULE_SYLLABLE: + /* more than specified number of vowels to the left */ + syllable_count = 1; + while(*rule == RULE_SYLLABLE) + { + rule++; + syllable_count++; /* number of syllables to match */ + } + if(syllable_count <= word_vowel_count) + match.points+= (19-distance_left); + else + failed = 1; + break; + + case RULE_STRESSED: + if(word_stressed_count > 0) + match.points += 19; + else + failed = 1; + break; + + case RULE_IFVERB: + if(expect_verb) + match.points += 1; + else + failed = 1; + break; + + case '.': + // dot in pre- section, match on any dot before this point in the word + for(p=pre_ptr; *p != ' '; p--) + { + if(*p == '.') + { + match.points +=50; + break; + } + } + if(*p == ' ') + failed = 1; + break; + + case '-': + if((letter == '-') || ((letter == ' ') && (word_flags & FLAG_HYPHEN))) + { + match.points += (22-distance_right); // one point more than match against space + } + else + failed = 1; + break; + + default: + if(letter == rb) + { + if(letter == RULE_SPACE) + match.points += 3; + else + match.points += (21-distance_left); + } + else + failed = 1; + break; + } + break; + } + } + + if(failed == 2) + { + /* matched OK, is this better than the last best match ? */ + if(match.points >= best.points) + { + memcpy(&best,&match,sizeof(match)); + total_consumed = consumed; + } + +#ifdef LOG_TRANSLATE + if((option_phonemes == 2) && (match.points > 0)) + { + // show each rule that matches, and it's points score + int pts; + char decoded_phonemes[80]; + + // 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 %s [%s]\n",pts,DecodeRule(group,rule_start),decoded_phonemes); + } +#endif + + } + + /* skip phoneme string to reach start of next template */ + while(*rule++ != 0); + } + +#ifdef LOG_TRANSLATE + if(option_phonemes == 2) + { + if(group_length <= 1) + fprintf(f_trans,"\n"); + } +#endif + + /* advance input data pointer */ + total_consumed += group_length; + if(total_consumed == 0) + total_consumed = 1; /* always advance over 1st letter */ + + *word += total_consumed; + + if(best.points == 0) + best.phonemes = ""; + memcpy(match_out,&best,sizeof(MatchRecord)); +} /* end of MatchRule */ + + + + +int Translator::TranslateRules(char *p, char *phonemes, int ph_size, char *end_phonemes, int word_flags, int dict_flags) +{//===================================================================================================================== +/* Translate a word bounded by space characters + Append the result to 'phonemes' and any standard prefix/suffix in 'end_phonemes' */ + + unsigned char c, c2; + unsigned int c12; + int wc=0; + int wc_prev; + int wc_bytes; + char *p2; /* copy of p for use in double letter chain match */ + int found; + int g; /* group chain number */ + int g1; /* first group for this letter */ + int n; + int letter; + int digit_count=0; + char *p_start; + MatchRecord match1; + MatchRecord match2; + char ph_buf[40]; + static const char str_pause[2] = {phonPAUSE_NOLINK,0}; + + char group_name[4]; + + if(data_dictrules == NULL) + return(0); + +#ifdef LOG_TRANSLATE + if(option_phonemes == 2) + { + char wordbuf[120]; + int ix; + + for(ix=0; ((c = p[ix]) != ' ') && (c != 0); ix++) + { + wordbuf[ix] = c; + } + wordbuf[ix] = 0; + fprintf(f_trans,"Translate '%s'\n",wordbuf); + } +#endif + + p_start = p; + word_vowel_count = 0; + word_stressed_count = 0; + + if(end_phonemes != NULL) + end_phonemes[0] = 0; + + while(((c = *p) != ' ') && (c != 0)) + { + wc_prev = wc; + wc_bytes = utf8_in(&wc,p,0); + + n = groups2_count[c]; + if(IsDigit(wc) && ((langopts.tone_numbers == 0) || !IsAlpha(wc_prev))) + { + // lookup the number in *_list not *_rules + char string[8]; + char buf[40]; + string[0] = '_'; + memcpy(&string[1],p,wc_bytes); + string[1+wc_bytes] = 0; + Lookup(string,buf); + if(++digit_count >= 2) + { + strcat(buf,str_pause); + digit_count=0; + } + AppendPhonemes(phonemes,ph_size,buf); + p += wc_bytes; + continue; + +// MatchRule(&p, "", groups1[(unsigned char)'9'],&match1,word_flags); +// if(match1.points == 0) +// p++; // not found, move on past this digit + } + else + { + digit_count = 0; + found = 0; + + if(n > 0) + { + /* there are some 2 byte chains for this initial letter */ + c2 = p[1]; + c12 = c + (c2 << 8); /* 2 characters */ + + g1 = groups2_start[c]; + for(g=g1; g < (g1+n); g++) + { + if(groups2_name[g] == c12) + { + found = 1; + + group_name[0] = c; + group_name[1] = c2; + group_name[2] = 0; + p2 = p; + MatchRule(&p2, group_name, groups2[g], &match2, word_flags, dict_flags); + if(match2.points > 0) + match2.points += 35; /* to acount for 2 letters matching */ + + /* now see whether single letter chain gives a better match ? */ + group_name[1] = 0; + MatchRule(&p, group_name, groups1[c], &match1, word_flags, dict_flags); + + if(match2.points >= match1.points) + { + // use match from the 2-letter group + memcpy(&match1,&match2,sizeof(MatchRecord)); + p = p2; + } + } + } + } + + if(!found) + { + /* alphabetic, single letter chain */ + group_name[0] = c; + group_name[1] = 0; + + if(groups1[c] != NULL) + MatchRule(&p, group_name, groups1[c], &match1, word_flags, dict_flags); + else + { + // no group for this letter, use default group + MatchRule(&p, "", groups1[0], &match1, word_flags, dict_flags); + + if(match1.points == 0) + { + // no match, try removing the accent and re-translating the word + n = utf8_in(&letter,p-1,0)-1; + if((letter >= 0xc0) && (letter <= 0x241)) + { + // within range of the remove_accent table + p2 = p-1; + p[-1] = remove_accent[letter-0xc0]; + while((p[0] = p[n]) != ' ') p++; + while(n-- > 0) *p++ = ' '; // replacement character must be no longer than original + + if(langopts.param[LOPT_DIERESES] && (lookupwchar(diereses_list,letter) > 0)) + { + // vowel with dieresis, replace and continue from this point + p = p2; + continue; + } + + phonemes[0] = 0; // delete any phonemes which have been produced so far + p = p_start; + word_vowel_count = 0; + word_stressed_count = 0; + continue; // start again at the beginning of the word + } + else + if((letter >= 0x3200) && (letter < 0xa700)) + { + // ideograms + // outside the range of the accent table, speak the unknown symbol sound + Lookup("_??",ph_buf); + match1.phonemes = ph_buf; + match1.points = 1; + p += (wc_bytes-1); + } + } + } + } + } + + if(match1.phonemes == NULL) + match1.phonemes = ""; + + if(match1.points > 0) + { + if((match1.phonemes[0] == phonSWITCH) && ((word_flags & FLAG_DONT_SWITCH_TRANSLATOR)==0)) + { + // an instruction to switch language, return immediately so we can re-translate + strcpy(phonemes,match1.phonemes); + return(0); + } + + if((match1.end_type != 0) && (end_phonemes != NULL)) + { + /* a standard ending has been found, re-translate the word without it */ + strcpy(end_phonemes,match1.phonemes); + return(match1.end_type); + } + if(match1.del_fwd != NULL) + *match1.del_fwd = REPLACED_E; + AppendPhonemes(phonemes,ph_size,match1.phonemes); + } + } + + // any language specific changes ? + ApplySpecialAttribute(phonemes,dict_flags); + return(0); +} /* end of TranslateRules */ + + + +void Translator::ApplySpecialAttribute(char *phonemes, int dict_flags) +{//=================================================================== +// Amend the translated phonemes according to an attribute which is specific for the language. + int len; + int ix; + char *p_end; + int phoneme_1; + + if((dict_flags & (FLAG_ALT_TRANS | FLAG_ALT2_TRANS)) == 0) + return; + + len = strlen(phonemes); + p_end = &phonemes[len-1]; + + switch(translator_name) + { + case L('d','e'): + if(p_end[0] == LookupPh("i:")) + { + // words ends in ['i:], change to [=I@] + p_end[-1] = phonSTRESS_PREV; + p_end[0] = LookupPh("I"); + p_end[1] = phonSCHWA; + p_end[2] = 0; + } + break; + + case L('p','t'): + phoneme_1 = LookupPh("o"); + for(ix=0; ix<(len-1); ix++) + { + if(phonemes[ix] == phoneme_1) + { + phonemes[ix] = LookupPh("O"); + break; + } + } + break; + + case L('r','o'): + if(p_end[0] == LookupPh("j")) + { + // word end in [j], change to ['i] + p_end[0] = phonSTRESS_P; + p_end[1] = LookupPh("i"); + p_end[2] = 0; + } + break; + } +} // end of ApplySpecialAttribute + + + +//============================================================================================= +// Look up a word in the pronunciation dictionary list +// - exceptions which override the usual pronunciation rules, or which give a word +// special properties, such as pronounce as unstressed +//============================================================================================= + +// common letter pairs, encode these as a single byte +static const short pairs_ru[] = { +0x010c, // ла 21052 0x23 +0x010e, // на 18400 +0x0113, // та 14254 +0x0301, // ав 31083 +0x030f, // ов 13420 +0x060e, // не 21798 +0x0611, // ре 19458 +0x0903, // ви 16226 +0x0b01, // ак 14456 +0x0b0f, // ок 17836 +0x0c01, // ал 13324 +0x0c09, // ил 16877 +0x0e01, // ан 15359 +0x0e06, // ен 13543 0x30 +0x0e09, // ин 17168 +0x0e0e, // нн 15973 +0x0e0f, // он 22373 +0x0e1c, // ын 15052 +0x0f03, // во 24947 +0x0f11, // ро 13552 +0x0f12, // со 16368 +0x100f, // оп 19054 +0x1011, // рп 17067 +0x1101, // ар 23967 +0x1106, // ер 18795 +0x1109, // ир 13797 +0x110f, // ор 21737 +0x1213, // тс 25076 +0x1220, // яс 14310 +0x7fff}; +//0x040f ог 12976 +//0x1306 ет 12826 +//0x0f0d мо 12688 + + +int TransposeAlphabet(char *text, int offset, int min, int max) +{//============================================================ +// transpose cyrillic alphabet (for example) into ascii (single byte) character codes +// return: number of bytes, bit 6: 1=used compression + int c; + int c2; + int ix; + char *p = text; + char *p2 = text; + int all_alpha=1; + int bits; + int acc; + + do { + p += utf8_in(&c,p,0); + if((c >= min) && (c <= max)) + { + *p2++ = c - offset; + } + else + if(c != 0) + { + p2 += utf8_out(c,p2); + all_alpha=0; + } + } while (c != 0); + *p2 = 0; + + if(all_alpha) + { + // compress to 6 bits per character + acc=0; + bits=0; + + p = text; + p2 = text; + while((c = *p++) != 0) + { + c2 = c + (*p << 8); + for(ix=0; c2 >= pairs_ru[ix]; ix++) + { + if(c2 == pairs_ru[ix]) + { + // found an encoding for a 2-character pair + c = ix + 0x23; // 2-character codes start at 0x23 + p++; + break; + } + } + acc = (acc << 6) + (c & 0x3f); + bits += 6; + + if(bits >= 8) + { + bits -= 8; + *p2++ = (acc >> bits); + } + } + if(bits > 0) + { + *p2++ = (acc << (8-bits)); + } + *p2 = 0; + return((p2 - text) | 0x40); // bit 6 indicates compressed characters + } + return(p2 - text); +} // end of TransposeAlphabet + + + +char *print_dflags(int flags) +{//========================== + static char buf[20]; + + sprintf(buf,"%s 0x%x",LookupMnem(mnem_flags,(flags & 0xf)+0x40), flags); + return(buf); +} + + + +int Translator::LookupDict2(char *word, char *word2, char *phonetic, unsigned int *flags, int end_flags) +//====================================================================================================== +/* Find an entry in the word_dict file for a specified word. + Returns 1 if an entry is found + + word zero terminated word to match + word2 pointer to next word(s) in the input text (terminated by space) + + flags: returns dictionary flags which are associated with a matched word + + end_flags: indicates whether this is a retranslation after removing a suffix +*/ +{ + char *p; + char *next; + int hash; + int phoneme_len; + int wlen; + unsigned char flag; + unsigned int dictionary_flags; + int condition_failed=0; + int n_chars; + int no_phonemes; + char *word_end; + char *word1; + char word_buf[N_WORD_BYTES]; + + word1 = word; + if(transpose_offset > 0) + { + strcpy(word_buf,word); + wlen = TransposeAlphabet(word_buf, transpose_offset, transpose_min, transpose_max); + word = word_buf; + } + else + { + wlen = strlen(word); + } + + hash = HashDictionary(word); + p = dict_hashtab[hash]; + + if(p == NULL) + { + if(flags != NULL) + *flags = 0; + return(0); + } + + while(*p != 0) + { + next = p + p[0]; + + if(((p[1] & 0x7f) != wlen) || (memcmp(word,&p[2],wlen & 0x3f) != 0)) + { + // bit 6 of wlen indicates whether the word has been compressed; so we need to match on this also. + p = next; + continue; + } + + /* found matching entry. Decode the phonetic string */ + word_end = word2; + + dictionary_flags = 0; + no_phonemes = p[1] & 0x80; + + p += ((p[1] & 0x3f) + 2); + + if(no_phonemes) + { + phonetic[0] = 0; + phoneme_len = 0; + } + else + { + strcpy(phonetic,p); + phoneme_len = strlen(p); + p += (phoneme_len + 1); + } + + while(p < next) + { + // examine the flags which follow the phoneme string + + flag = *p++; + if(flag >= 100) + { + // conditional rule + if((dict_condition & (1 << (flag-100))) == 0) + condition_failed = 1; + } + else + if(flag > 64) + { + // stressed syllable information, put in bits 0-3 + dictionary_flags = (dictionary_flags & ~0xf) | (flag & 0xf); + if((flag & 0xc) == 0xc) + dictionary_flags |= FLAG_STRESS_END; + } + else + if(flag > 40) + { + // flags 41,42,or 43 match more than one word + // This comes after the other flags + n_chars = next - p; + if(memcmp(word2,p,n_chars)==0) + { + dictionary_flags |= ((flag-40) << 5); // set (bits 5-7) to 1,2,or 3 + p = next; + word_end = word2 + n_chars; + } + else + { + p = next; + condition_failed = 1; + break; + } + } + else + { + dictionary_flags |= (1L << flag); + } + } + + if(condition_failed) + { + condition_failed=0; + continue; + } + + if((end_flags & FLAG_SUFX)==0) + { + // no suffix has been removed + if(dictionary_flags & FLAG_STEM) + continue; // this word must have a suffix + } + + if((end_flags & SUFX_P) && (dictionary_flags & (FLAG_ONLY | FLAG_ONLY_S))) + continue; // $only or $onlys, don't match if a prefix has been removed + + if(end_flags & FLAG_SUFX) + { + // a suffix was removed from the word + if(dictionary_flags & FLAG_ONLY) + continue; // no match if any suffix + + if((dictionary_flags & FLAG_ONLY_S) && ((end_flags & FLAG_SUFX_S)==0)) + { + // only a 's' suffix allowed, but the suffix wasn't 's' + continue; + } + } + + if(dictionary_flags & FLAG_CAPITAL) + { + if(!(word_flags & FLAG_FIRST_UPPER)) + { + continue; + } + } + + if((dictionary_flags & FLAG_ATEND) && (word_end < clause_end)) + { + // only use this pronunciation if it's the last word of the clause + continue; + } + + if(dictionary_flags & FLAG_VERB) + { + // this is a verb-form pronunciation + + if(expect_verb || (expect_verb_s && (end_flags & FLAG_SUFX_S))) + { + // OK, we are expecting a verb + } + else + { + /* don't use the 'verb' pronunciation unless we are + expecting a verb */ + continue; + } + } + if(dictionary_flags & FLAG_PAST) + { + if(!expect_past) + { + /* don't use the 'past' pronunciation unless we are + expecting past tense */ + continue; + } + } + + if(flags != NULL) + *flags = dictionary_flags; + + if(phoneme_len == 0) + { + if(option_phonemes == 2) + { + fprintf(f_trans,"Flags: %s %s\n",word1,print_dflags(*flags)); + } + return(0); // no phoneme translation found here, only flags. So use rules + } + + if(flags != NULL) + *flags |= FLAG_FOUND; // this flag indicates word was found in dictionary + + if(option_phonemes == 2) + { + unsigned int flags1 = 0; + char ph_decoded[N_WORD_PHONEMES]; + DecodePhonemes(phonetic,ph_decoded); + if(flags != NULL) + flags1 = *flags; + fprintf(f_trans,"Found: %s [%s] %s\n",word1,ph_decoded,print_dflags(flags1)); + } + return(1); + + } + return(0); +} // end of LookupDict2 + + + +int Translator::LookupDictList(char *word1, char *ph_out, unsigned int *flags, int end_flags) +//=========================================================================================== +/* Lookup a specified word in the word dictionary. + Returns phonetic data in 'phonetic' and bits in 'flags' + + end_flags: indicates if a suffix has been removed +*/ +{ + int length; + int found; + char *word2; + unsigned char c; + char word[N_WORD_BYTES]; + + length = 0; + word2 = word1; + while((word2[1]==' ') && (word2[2]=='.')) + { + // look for an abbreviation of the form a.b.c + // try removing the spaces between the dots and looking for a match + word[length++] = word2[0]; + word[length++] = '.'; + word2 += 4; + } + if(length > 0) + { + // found an abbreviation containing dots + word[length] = word2[0]; + word[length+1] = 0; + found = LookupDict2(word,word2,ph_out,flags,end_flags); + if(found) + { + *flags = *flags & ~(7 << 5) | (length << 5); + return(1); + } + } + + for(length=0; lengthi and e-dropping + that were done when the suffix was added to the original word. +*/ + + int i; + char *word_end; + int len_ending; + int end_flags; + const char *p; + int len; + static char ending[12]; + + // these lists are language specific, but are only relevent if the 'e' suffix flag is used + static const char *add_e_exceptions[] = { + "ion", NULL }; + + static const char *add_e_additions[] = { + "c", "rs", "ir", "ur", "ath", "ns", "lu", NULL }; + + for(word_end = word; *word_end != ' '; word_end++) + { + /* replace discarded 'e's */ + if(*word_end == REPLACED_E) + *word_end = 'e'; + } + i = word_end - word; + memcpy(word_copy,word,i); + word_copy[i] = 0; + + // look for multibyte characters to increase the number of bytes to remove + for(len_ending = i = (end_type & 0xf); i>0 ;i--) // num.of characters of the suffix + { + word_end--; + while((*word_end & 0xc0) == 0x80) + { + word_end--; // for multibyte characters + len_ending++; + } + } + + // remove bytes from the end of the word and replace them by spaces + for(i=0; i +#include +#include +#include +#include +#include "sys/stat.h" + +#include "speak_lib.h" + +// This version of the command-line speak program uses the +// libespeak.so.1 library + + + +static const char *help_text = +"\nspeak [options] [\"\"]\n\n" +"-f Text file to speak\n" +"--stdin Read text input from stdin instead of a file\n\n" +"If neither -f nor --stdin, are spoken, or if none then text is\n" +"spoken from stdin, each line separately.\n\n" +"-a \n" +"\t Amplitude, 0 to 200, default is 100\n" +"-l \n" +"\t Line length. If not zero (which is the default), consider\n" +"\t lines less than this length as end-of-clause\n" +"-p \n" +"\t Pitch adjustment, 0 to 99, default is 50\n" +"-s \n" +"\t Speed in words per minute, 80 to 370, default is 170\n" +"-v \n" +"\t Use voice file of this name from espeak-data/voices\n" +"-w \n" +"\t Write output to this WAV file, rather than speaking it directly\n" +"-b\t Input text is 8-bit encoding\n" +"-m\t Interpret SSML markup, and ignore other < > tags\n" +"-q\t Quiet, don't produce any speech (may be useful with -x)\n" +"-x\t Write phoneme mnemonics to stdout\n" +"-X\t Write phonemes mnemonics and translation trace to stdout\n" +"-z\t No final sentence pause at the end of the text\n" +"--stdout Write speech output to stdout\n" +"--compile=\n" +"\t Compile the pronunciation rules and dictionary in the current\n" +"\t directory. = is optional and specifies which language\n" +"--punct=\"\"\n" +"\t Speak the names of punctuation characters during speaking. If\n" +"\t = is omitted, all punctuation is spoken.\n" +"--voices=\n" +"\t List the available voices for the specified language.\n" +"\t If is omitted, then list all voices.\n" +"-k \n" +"\t Indicate capital letters with: 1=sound, 2=the word \"capitals\",\n" +"\t higher values = a pitch increase (try -k20).\n"; + + + +int samplerate; +FILE *f_wavfile = NULL; +char wavefile[160]; + + +int GetFileLength(const char *filename) +{//==================================== + struct stat statbuf; + + if(stat(filename,&statbuf) != 0) + return(0); + + if((statbuf.st_mode & S_IFMT) == S_IFDIR) + return(-2); // a directory + + return(statbuf.st_size); +} // end of GetFileLength + + +void strncpy0(char *dest, const char *source, int size) +{//==================================================== + if(source!=NULL) + { + strncpy(dest,source,size); + dest[size-1] = 0; + } +} + + +void DisplayVoices(FILE *f_out, char *language) +{//============================================ + int ix; + char *p; + int len; + int count; + int scores = 0; + const espeak_VOICE *v; + char *lang_name; + char age_buf[12]; + const espeak_VOICE **voices; + espeak_VOICE voice_select; + + static char genders[4] = {' ','M','F',' '}; + + if((language != NULL) && (language[0] != 0)) + { + // display only voices for the specified language, in order of priority + voice_select.languages = language; + voice_select.age = 0; + voice_select.gender = 0; + voice_select.name = NULL; + voices = espeak_ListVoices(&voice_select); + scores = 1; + } + else + { + voices = espeak_ListVoices(NULL); + } + + fprintf(f_out,"Pty Language Age/Gender VoiceName File Other Langs\n"); + + for(ix=0; (v = voices[ix]) != NULL; ix++) + { + count = 0; + p = v->languages; + while(*p != 0) + { + len = strlen(p+1); + lang_name = p+1; + + if(v->age == 0) + strcpy(age_buf," "); + else + sprintf(age_buf,"%3d",v->age); + + if(count==0) + { + fprintf(f_out,"%2d %-12s%s%c %-17s %-11s ", + p[0],lang_name,age_buf,genders[v->gender],v->name,v->identifier); + } + else + { + fprintf(f_out,"(%s %d)",lang_name,p[0]); + } + count++; + p += len+2; + } +// if(scores) +// fprintf(f_out,"%3d ",v->score); + fputc('\n',f_out); + } +} // end of DisplayVoices + + + + +static void Write4Bytes(FILE *f, int value) +{//================================= +// Write 4 bytes to a file, least significant first + int ix; + + for(ix=0; ix<4; ix++) + { + fputc(value & 0xff,f); + value = value >> 8; + } +} + + + +int OpenWavFile(const char *path, int rate) +//========================================= +{ + static unsigned char wave_hdr[44] = { + 'R','I','F','F',0,0,0,0,'W','A','V','E','f','m','t',' ', + 0x10,0,0,0,1,0,1,0, 0,0,0,0, 0,0,0,0, + 2,0,0x10,0,'d','a','t','a', 0,0,0,0 }; + + if(path == NULL) + return(2); + + if(path[0] == 0) + return(0); + + if(path == "stdout") + f_wavfile = stdout; + else + f_wavfile = fopen(path,"wb"); + + if(f_wavfile != NULL) + { + fwrite(wave_hdr,1,24,f_wavfile); + Write4Bytes(f_wavfile,rate); + Write4Bytes(f_wavfile,rate * 2); + fwrite(&wave_hdr[32],1,8,f_wavfile); + return(0); + } + return(1); +} // end of OpenWavFile + + + +static void CloseWavFile(int rate) +//================================ +{ + unsigned int pos; + + if((f_wavfile==NULL) || (wavefile == "stdout")) + return; + + fflush(f_wavfile); + pos = ftell(f_wavfile); + + fseek(f_wavfile,4,SEEK_SET); + Write4Bytes(f_wavfile,pos - 8); + + fseek(f_wavfile,40,SEEK_SET); + Write4Bytes(f_wavfile,pos - 44); + + fclose(f_wavfile); + f_wavfile = NULL; + +} // end of CloseWavFile + + + +static int SynthCallback(short *wav, int numsamples, espeak_EVENT *events) +{//======================================================================== + + if(f_wavfile == NULL) return(0); // -q quiet mode + + if(wav == NULL) + { + CloseWavFile(samplerate); + return(0); + } + + if(numsamples > 0) + { + fwrite(wav,numsamples*2,1,f_wavfile); + } + return(0); +} + + + +int main (int argc, char **argv) +//============================== +{ + static struct option long_options[] = + { + /* These options set a flag. */ +// {"verbose", no_argument, &verbose_flag, 1}, +// {"brief", no_argument, &verbose_flag, 0}, + + /* These options don't set a flag. + We distinguish them by their indices. */ + {"help", no_argument, 0, 'h'}, + {"stdin", no_argument, 0, 0x100}, + {"stdout", no_argument, 0, 0x101}, + {"compile", optional_argument, 0, 0x102}, + {"punct", optional_argument, 0, 0x103}, + {"voices", optional_argument, 0, 0x104}, + {0, 0, 0, 0} + }; + + static const char* err_load = "Failed to read "; + + + FILE *f_text=NULL; + char *p_text=NULL; + + int option_index = 0; + int c; + int ix; + int quiet = 0; + int flag_stdin = 0; + int flag_compile = 0; + int filesize = 0; + int synth_flags = espeakCHARS_AUTO | espeakPHONEMES | espeakENDPAUSE; + + int volume = -1; + int speed = -1; + int pitch = -1; + int option_capitals = -1; + int option_punctuation = -1; + int option_phonemes = -1; + int option_linelength = 0; + int option_waveout = 0; + + char filename[120]; + char voicename[40]; + char voice_mbrola[20]; + char dictname[40]; +#define N_PUNCTLIST 100 + wchar_t option_punctlist[N_PUNCTLIST]; + + voicename[0] = 0; + voice_mbrola[0] = 0; + dictname[0] = 0; + wavefile[0] = 0; + filename[0] = 0; + option_punctlist[0] = 0; + + while(true) + { + c = getopt_long (argc, argv, "a:bf:hk:l:mp:qs:v:w:xXz", + long_options, &option_index); + + /* Detect the end of the options. */ + if (c == -1) + break; + + switch (c) + { + case 'b': + synth_flags |= espeakCHARS_8BIT; + break; + + case 'h': + printf("\n"); + printf("eSpeak text-to-speech: %s\n%s",espeak_Info(NULL),help_text); + exit(0); + break; + + case 'k': + option_capitals = atoi(optarg); + break; + + case 'x': + option_phonemes = 1; + break; + + case 'X': + option_phonemes = 2; + break; + + case 'm': + synth_flags |= espeakSSML; + break; + + case 'p': + pitch = atoi(optarg); + break; + + case 'q': + quiet = 1; + break; + + case 'f': + strncpy0(filename,optarg,sizeof(filename)); + break; + + case 'l': + option_linelength = atoi(optarg); + break; + + case 'a': + volume = atoi(optarg); + break; + + case 's': + speed = atoi(optarg); + break; + + case 'v': + strncpy0(voicename,optarg,sizeof(voicename)); + break; + + case 'w': + option_waveout = 1; + strncpy0(wavefile,optarg,sizeof(filename)); + break; + + case 'z': // remove pause from the end of a sentence + synth_flags &= ~espeakENDPAUSE; + break; + + case 0x100: // --stdin + flag_stdin = 1; + break; + + case 0x101: // --stdout + option_waveout = 1; + strcpy(wavefile,"stdout"); + break; + + case 0x102: // --compile + strncpy0(voicename,optarg,sizeof(voicename)); + flag_compile = 1; + quiet = 1; + break; + + case 0x103: // --punct + option_punctuation = 1; + if(optarg != NULL) + { + ix = 0; + while((ix < N_PUNCTLIST) && ((option_punctlist[ix] = optarg[ix]) != 0)) ix++; + option_punctlist[N_PUNCTLIST-1] = 0; + option_punctuation = 2; + } + break; + + case 0x104: // --voices + espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS,0,NULL); + DisplayVoices(stdout,optarg); + exit(0); + + default: + exit(0); + } + } + + + if(option_waveout || quiet) + { + // writing to a file (or no output), we can use synchronous mode + samplerate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS,0,NULL); + + espeak_SetSynthCallback(SynthCallback); + if(option_waveout) + { + if(OpenWavFile(wavefile,samplerate) != 0) + exit(4); + } + } + else + { + // play the sound output + samplerate = espeak_Initialize(AUDIO_OUTPUT_PLAYBACK,0,NULL); + } + + + if(voicename[0] == 0) + strcpy(voicename,"default"); + + if(espeak_SetVoiceByName(voicename) != EE_OK) + { + fprintf(stderr,"%svoice '%s'\n",err_load,voicename); + exit(2); + } + + if(flag_compile) + { + // This must be done after the voice is set + espeak_CompileDictionary("",stderr); + exit(0); + } + + // set any non-default values of parameters. This must be done after espeak_Initialize() + if(speed > 0) + espeak_SetParameter(espeakRATE,speed,0); + if(volume >= 0) + espeak_SetParameter(espeakVOLUME,volume,0); + if(pitch >= 0) + espeak_SetParameter(espeakPITCH,pitch,0); + if(option_capitals >= 0) + espeak_SetParameter(espeakCAPITALS,option_capitals,0); + if(option_punctuation >= 0) + espeak_SetParameter(espeakPUNCTUATION,option_punctuation,0); + if(option_linelength > 0) + espeak_SetParameter(espeakLINELENGTH,option_linelength,0); + if(option_punctuation == 2) + espeak_SetPunctuationList(option_punctlist); + if(option_phonemes >= 0) + espeak_SetPhonemeTrace(option_phonemes,stderr); + + if(filename[0]==0) + { + if((optind < argc) && (flag_stdin == 0)) + { + // there's a non-option parameter, and no -f or --stdin + // use it as text + p_text = argv[optind]; + } + else + { + f_text = stdin; + if(flag_stdin == 0) + { + flag_stdin = 2; + } + } + } + else + { + filesize = GetFileLength(filename); + f_text = fopen(filename,"r"); + } + + if((f_text == NULL) && (p_text == NULL)) + { + fprintf(stderr,"%sfile '%s'\n",err_load,filename); + exit(1); + } + + + if(p_text != NULL) + { + int size; + size = strlen(p_text); + espeak_Synth(p_text,size+1,0,POS_CHARACTER,0,synth_flags,NULL,NULL); + } + else + if(flag_stdin) + { + int max = 1000; + p_text = (char *)malloc(max); + + if(flag_stdin == 2) + { + // line by line input on stdin + while(fgets(p_text,max,stdin) != NULL) + { + p_text[max-1] = 0; + espeak_Synth(p_text,max,0,POS_CHARACTER,0,synth_flags,NULL,NULL); + + } + } + else + { + // bulk input on stdin + ix = 0; + while(!feof(stdin)) + { + p_text[ix++] = fgetc(stdin); + if(ix >= (max-1)) + { + max += 1000; + p_text = (char *)realloc(p_text,max); + } + } + if(ix > 0) + { + p_text[ix-1] = 0; + espeak_Synth(p_text,ix+1,0,POS_CHARACTER,0,synth_flags,NULL,NULL); + } + } + } + else + if(f_text != NULL) + { + if((p_text = (char *)malloc(filesize+1)) == NULL) + { + fprintf(stderr,"Failed to allocate memory %d bytes",filesize); + exit(3); + } + + fread(p_text,1,filesize,f_text); + p_text[filesize]=0; + espeak_Synth(p_text,filesize+1,0,POS_CHARACTER,0,synth_flags,NULL,NULL); + fclose(f_text); + } + + espeak_Synchronize(); + return(0); +} diff --git a/src/espeak_command.cpp b/src/espeak_command.cpp new file mode 100644 index 00000000..1ce43f17 --- /dev/null +++ b/src/espeak_command.cpp @@ -0,0 +1,703 @@ +/*************************************************************************** + * Copyright (C) 2007, Gilles Casse * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "speech.h" + +#ifdef USE_ASYNC +// This source file is only used for asynchronious modes + +#include "espeak_command.h" +#include +#include +#include +#include + +#include "debug.h" + + +static unsigned int my_current_text_id=0; + + +//type = ET_TEXT; + a_command->state = CS_UNDEFINED; + data = &(a_command->u.my_text); + data->unique_identifier = ++my_current_text_id; + data->text = a_text; + data->size = size; + data->position = position; + data->position_type = position_type; + data->end_position = end_position; + data->flags = flags; + data->user_data = user_data; + a_error=0; + + SHOW("ET_TEXT malloc text=%x, command=%x (uid=%d)\n", a_text, a_command, data->unique_identifier); + + text_error: + if (a_error) + { + if (a_text) + { + free (a_text); + } + if (a_command) + { + free (a_command); + } + a_command = NULL; + } + + SHOW("command=0x%x\n", a_command); + + return a_command; +} + +//> + + +t_espeak_command* create_espeak_terminated_msg(unsigned int unique_identifier, void* user_data) +{ + ENTER("create_espeak_terminated_msg"); + int a_error=1; + t_espeak_terminated_msg* data = NULL; + t_espeak_command* a_command = (t_espeak_command*)malloc(sizeof(t_espeak_command)); + + if (!a_command) + { + goto msg_error; + } + + a_command->type = ET_TERMINATED_MSG; + a_command->state = CS_UNDEFINED; + data = &(a_command->u.my_terminated_msg); + data->unique_identifier = unique_identifier; + data->user_data = user_data; + a_error=0; + + SHOW("ET_TERMINATED_MSG command=%x (uid=%d, user_data=0x%x)\n", a_command, unique_identifier, (int)user_data); + + msg_error: + if (a_error) + { + if (a_command) + { + free (a_command); + } + a_command = NULL; + } + + SHOW("command=0x%x\n", a_command); + + return a_command; + +} + + + + +//type = ET_MARK; + a_command->state = CS_UNDEFINED; + data = &(a_command->u.my_mark); + data->unique_identifier = ++my_current_text_id; + data->text = a_text; + data->size = size; + data->index_mark = a_index_mark; + data->end_position = end_position; + data->flags = flags; + data->user_data = user_data; + a_error=0; + + mark_error: + if (a_error) + { + if (a_text) + { + free (a_text); + } + if (a_command) + { + free (a_command); + } + a_command = NULL; + if (a_index_mark) + { + free (a_index_mark); + } + } + + SHOW("ET_MARK malloc text=%x, command=%x (uid=%d)\n", a_text, a_command, data->unique_identifier); + + return a_command; +} +//> +//< create_espeak_key, create_espeak_char + +t_espeak_command* create_espeak_key(const char *key_name) +{ + ENTER("create_espeak_key"); + int a_error=1; + t_espeak_command* a_command = (t_espeak_command*)malloc(sizeof(t_espeak_command)); + + if (!key_name || !a_command) + { + goto key_error; + } + + a_command->type = ET_KEY; + a_command->state = CS_UNDEFINED; + a_command->u.my_key = strdup( key_name); + a_error=0; + + key_error: + if (a_error) + { + if (a_command) + { + free (a_command); + } + a_command = NULL; + } + + SHOW("command=0x%x\n", a_command); + + return a_command; +} + +t_espeak_command* create_espeak_char(wchar_t character) +{ + ENTER("create_espeak_char"); + int a_error=1; + t_espeak_command* a_command = (t_espeak_command*)malloc(sizeof(t_espeak_command)); + if (!a_command) + { + goto char_error; + } + + a_command->type = ET_CHAR; + a_command->state = CS_UNDEFINED; + a_command->u.my_char = character; + a_error=0; + + char_error: + if (a_error) + { + if (a_command) + { + free (a_command); + } + a_command = NULL; + } + + SHOW("command=0x%x\n", a_command); + + return a_command; +} + +//> +//< create_espeak_parameter + +t_espeak_command* create_espeak_parameter(espeak_PARAMETER parameter, int value, int relative) +{ + ENTER("create_espeak_parameter"); + int a_error=1; + t_espeak_parameter* data = NULL; + t_espeak_command* a_command = (t_espeak_command*)malloc(sizeof(t_espeak_command)); + if (!a_command) + { + goto param_error; + } + + a_command->type = ET_PARAMETER; + a_command->state = CS_UNDEFINED; + data = &(a_command->u.my_param); + data->parameter = parameter; + data->value = value; + data->relative = relative; + a_error=0; + + param_error: + if (a_error) + { + if (a_command) + { + free (a_command); + } + a_command = NULL; + } + + SHOW("command=0x%x\n", a_command); + + return a_command; +} + +//> +//< create_espeak_punctuation_list + +t_espeak_command* create_espeak_punctuation_list(const wchar_t *punctlist) +{ + ENTER("create_espeak_punctuation_list"); + int a_error=1; + // wchar_t *a_list = NULL; + t_espeak_command* a_command = (t_espeak_command*)malloc(sizeof(t_espeak_command)); + + if (!punctlist || !a_command) + { + goto list_error; + } + + a_command->type = ET_PUNCTUATION_LIST; + a_command->state = CS_UNDEFINED; + + { + size_t len = (wcslen(punctlist) + 1)*sizeof(wchar_t); + wchar_t* a_list = (wchar_t*)malloc(len); + memcpy(a_list, punctlist, len); + a_command->u.my_punctuation_list = a_list; + } + + a_error=0; + + list_error: + if (a_error) + { + if (a_command) + { + free (a_command); + } + a_command = NULL; + } + + SHOW("command=0x%x\n", a_command); + + return a_command; +} + +//> +//< create_espeak_voice_name, create_espeak_voice_spec + +t_espeak_command* create_espeak_voice_name(const char *name) +{ + ENTER("create_espeak_voice_name"); + + int a_error=1; + t_espeak_command* a_command = (t_espeak_command*)malloc(sizeof(t_espeak_command)); + + if (!name || !a_command) + { + goto name_error; + } + + a_command->type = ET_VOICE_NAME; + a_command->state = CS_UNDEFINED; + a_command->u.my_voice_name = strdup( name); + a_error=0; + + name_error: + if (a_error) + { + if (a_command) + { + free (a_command); + } + a_command = NULL; + } + + SHOW("command=0x%x\n", a_command); + + return a_command; +} + +t_espeak_command* create_espeak_voice_spec(espeak_VOICE *voice) +{ + ENTER("create_espeak_voice_spec"); + int a_error=1; + t_espeak_command* a_command = (t_espeak_command*)malloc(sizeof(t_espeak_command)); + + if (!voice || !a_command) + { + goto spec_error; + } + + a_command->type = ET_VOICE_SPEC; + a_command->state = CS_UNDEFINED; + { + espeak_VOICE* data = &(a_command->u.my_voice_spec); + memcpy(data, voice, sizeof(espeak_VOICE)); + + if (voice->name) + { + data->name = strdup(voice->name); + } + + if (voice->languages) + { + data->languages = strdup(voice->languages); + } + + if (voice->identifier) + { + data->identifier = strdup(voice->identifier); + } + + a_error=0; + } + + spec_error: + if (a_error) + { + if (a_command) + { + free (a_command); + } + a_command = NULL; + } + + SHOW("command=0x%x\n", a_command); + + return a_command; +} + +//> +//< delete_espeak_command +int delete_espeak_command( t_espeak_command* the_command) +{ + ENTER("delete_espeak_command"); + int a_status = 0; + if (the_command) + { + switch(the_command->type) + { + case ET_TEXT: + if (the_command->u.my_text.text) + { + SHOW("delete_espeak_command > ET_TEXT free text=%x, command=%x, uid=%d\n", the_command->u.my_text.text, the_command, the_command->u.my_text.unique_identifier); + free(the_command->u.my_text.text); + } + break; + + case ET_MARK: + if (the_command->u.my_mark.text) + { + free(the_command->u.my_mark.text); + } + if (the_command->u.my_mark.index_mark) + { + free((void*)(the_command->u.my_mark.index_mark)); + } + break; + + case ET_TERMINATED_MSG: + { + // if the terminated msg is pending, + // it must be processed here for informing the calling program + // that its message is finished. + // This can be important for cleaning the related user data. + t_espeak_terminated_msg* data = &(the_command->u.my_terminated_msg); + if (the_command->state == CS_PENDING) + { + the_command->state = CS_PROCESSED; + SHOW("delete_espeak_command > ET_TERMINATED_MSG callback (command=0x%x, uid=%d) \n", the_command, data->unique_identifier); + sync_espeak_terminated_msg( data->unique_identifier, data->user_data); + } + } + break; + + case ET_KEY: + if (the_command->u.my_key) + { + free((void*)(the_command->u.my_key)); + } + break; + + case ET_CHAR: + case ET_PARAMETER: + // No allocation + break; + + case ET_PUNCTUATION_LIST: + if (the_command->u.my_punctuation_list) + { + free((void*)(the_command->u.my_punctuation_list)); + } + break; + + case ET_VOICE_NAME: + if (the_command->u.my_voice_name) + { + free((void*)(the_command->u.my_voice_name)); + } + break; + + case ET_VOICE_SPEC: + { + espeak_VOICE* data = &(the_command->u.my_voice_spec); + + if (data->name) + { + free(data->name); + } + + if (data->languages) + { + free(data->languages); + } + + if (data->identifier) + { + free(data->identifier); + } + } + break; + + default: + assert(0); + } + SHOW("delete_espeak_command > free command=0x%x\n", the_command); + free(the_command); + a_status = 1; + } + return a_status; +} +//> +//< process_espeak_command +void process_espeak_command( t_espeak_command* the_command) +{ + ENTER("process_espeak_command"); + + SHOW("command=0x%x\n", the_command); + + if (the_command == NULL) + { + return; + } + + the_command->state = CS_PROCESSED; + + switch(the_command->type) + { + case ET_TEXT: + { + t_espeak_text* data = &(the_command->u.my_text); + sync_espeak_Synth( data->unique_identifier, data->text, data->size, + data->position, data->position_type, + data->end_position, data->flags, data->user_data); + } + break; + + case ET_MARK: + { + t_espeak_mark* data = &(the_command->u.my_mark); + sync_espeak_Synth_Mark( data->unique_identifier, data->text, data->size, + data->index_mark, data->end_position, data->flags, + data->user_data); + } + break; + + case ET_TERMINATED_MSG: + { + t_espeak_terminated_msg* data = &(the_command->u.my_terminated_msg); + sync_espeak_terminated_msg( data->unique_identifier, data->user_data); + } + break; + + case ET_KEY: + { + const char* data = the_command->u.my_key; + sync_espeak_Key(data); + } + break; + + case ET_CHAR: + { + const wchar_t data = the_command->u.my_char; + sync_espeak_Char( data); + } + break; + + case ET_PARAMETER: + { + t_espeak_parameter* data = &(the_command->u.my_param); + SetParameter( data->parameter, data->value, data->relative); + } + break; + + case ET_PUNCTUATION_LIST: + { + const wchar_t* data = the_command->u.my_punctuation_list; + sync_espeak_SetPunctuationList( data); + } + break; + + case ET_VOICE_NAME: + { + const char* data = the_command->u.my_voice_name; + SetVoiceByName( data); + } + break; + + case ET_VOICE_SPEC: + { + espeak_VOICE* data = &(the_command->u.my_voice_spec); + SetVoiceByProperties(data); + } + break; + + default: + assert(0); + break; + } +} + +//> + +//< process_espeak_command +void display_espeak_command( t_espeak_command* the_command) +{ + ENTER("display_espeak_command"); +#ifdef DEBUG_ENABLED + if (the_command == NULL) + { + SHOW("display_espeak_command > command=%s\n","NULL"); + return; + } + + SHOW("display_espeak_command > state=%d\n",the_command->state); + + switch(the_command->type) + { + case ET_TEXT: + { + t_espeak_text* data = &(the_command->u.my_text); + SHOW("display_espeak_command > (0x%x) uid=%d, TEXT=%s, user_data=0x%x\n", the_command, data->unique_identifier, (char*)data->text, (int)(data->user_data)); + } + break; + + case ET_MARK: + { + t_espeak_mark* data = &(the_command->u.my_mark); + SHOW("display_espeak_command > (0x%x) uid=%d, MARK=%s, user_data=0x%x\n", the_command, data->unique_identifier, (char*)data->text, (int)(data->user_data)); + } + break; + + case ET_KEY: + { + const char* data = the_command->u.my_key; + SHOW("display_espeak_command > (0x%x) KEY=%c\n", the_command, data); + } + break; + + case ET_TERMINATED_MSG: + { + t_espeak_terminated_msg* data = &(the_command->u.my_terminated_msg); + + SHOW("display_espeak_command > (0x%x) TERMINATED_MSG uid=%d, user_data=0x%x, state=%d\n", + the_command, data->unique_identifier, data->user_data, + the_command->state); + } + break; + + case ET_CHAR: + { + const wchar_t data = the_command->u.my_char; + SHOW("display_espeak_command > (0x%x) CHAR=%c\n", the_command, (char)data); + } + break; + + case ET_PARAMETER: + { + t_espeak_parameter* data = &(the_command->u.my_param); + SHOW("display_espeak_command > (0x%x) PARAMETER=%d, value=%d, relative=%d\n", + the_command, data->parameter, data->value, data->relative); + } + break; + + case ET_PUNCTUATION_LIST: + { + const wchar_t* data = the_command->u.my_punctuation_list; + sync_espeak_SetPunctuationList( data); + SHOW("display_espeak_command > (0x%x) PUNCTLIST=%s\n", the_command, (char*)data); + } + break; + + case ET_VOICE_NAME: + { + const char* data = the_command->u.my_voice_name; + SHOW("display_espeak_command > (0x%x) VOICE_NAME=%s\n", the_command, data); + } + break; + + case ET_VOICE_SPEC: + { + SHOW("display_espeak_command > (0x%x) VOICE_SPEC", the_command); + } + break; + + default: + assert(0); + break; + } +#endif +} + +#endif +//> diff --git a/src/espeak_command.h b/src/espeak_command.h new file mode 100644 index 00000000..c3bf35d1 --- /dev/null +++ b/src/espeak_command.h @@ -0,0 +1,129 @@ +#ifndef ESPEAK_COMMAND_H +#define ESPEAK_COMMAND_H + +#ifndef PLATFORM_WINDOWS +#include +#endif +#include "speak_lib.h" + +enum t_espeak_type + { + ET_TEXT, + ET_MARK, + ET_KEY, + ET_CHAR, + ET_PARAMETER, + ET_PUNCTUATION_LIST, + ET_VOICE_NAME, + ET_VOICE_SPEC, + ET_TERMINATED_MSG + }; + +typedef struct +{ + unsigned int unique_identifier; + void* text; + size_t size; + unsigned int position; + espeak_POSITION_TYPE position_type; + unsigned int end_position; + unsigned int flags; + void* user_data; +} t_espeak_text; + +typedef struct +{ + unsigned int unique_identifier; + void* text; + size_t size; + const char* index_mark; + unsigned int end_position; + unsigned int flags; + void* user_data; +} t_espeak_mark; + +typedef struct +{ + unsigned int unique_identifier; + void* user_data; +} t_espeak_terminated_msg; + +typedef struct +{ + espeak_PARAMETER parameter; + int value; + int relative; +} t_espeak_parameter; + +enum t_command_state +{ + CS_UNDEFINED, // The command has just been created + CS_PENDING, // stored in the fifo + CS_PROCESSED // processed +}; + +typedef struct +{ + enum t_espeak_type type; + t_command_state state; + + union command + { + t_espeak_text my_text; + t_espeak_mark my_mark; + const char* my_key; + wchar_t my_char; + t_espeak_parameter my_param; + const wchar_t* my_punctuation_list; + const char *my_voice_name; + espeak_VOICE my_voice_spec; + t_espeak_terminated_msg my_terminated_msg; + } u; +} t_espeak_command; + + +t_espeak_command* create_espeak_text(const void *text, size_t size, unsigned int position, espeak_POSITION_TYPE position_type, unsigned int end_position, unsigned int flags, void* user_data); + +t_espeak_command* create_espeak_mark(const void *text, size_t size, const char *index_mark, unsigned int end_position, unsigned int flags, void* user_data); + +t_espeak_command* create_espeak_terminated_msg(unsigned int unique_identifier, void* user_data); + +t_espeak_command* create_espeak_key(const char *key_name); + +t_espeak_command* create_espeak_char(wchar_t character); + +t_espeak_command* create_espeak_parameter(espeak_PARAMETER parameter, int value, int relative); + +t_espeak_command* create_espeak_punctuation_list(const wchar_t *punctlist); + +t_espeak_command* create_espeak_voice_name(const char *name); + +t_espeak_command* create_espeak_voice_spec(espeak_VOICE *voice_spec); + +void process_espeak_command( t_espeak_command* the_command); + +int delete_espeak_command( t_espeak_command* the_command); + +void display_espeak_command(t_espeak_command* the_command); + + +espeak_ERROR sync_espeak_Synth(unsigned int unique_identifier, const void *text, size_t size, + unsigned int position, espeak_POSITION_TYPE position_type, + unsigned int end_position, unsigned int flags, void* user_data); +espeak_ERROR sync_espeak_Synth_Mark(unsigned int unique_identifier, const void *text, size_t size, + const char *index_mark, unsigned int end_position, + unsigned int flags, void* user_data); +void sync_espeak_Key(const char *key); +void sync_espeak_Char(wchar_t character); +void sync_espeak_SetPunctuationList(const wchar_t *punctlist); +void sync_espeak_SetParameter(espeak_PARAMETER parameter, int value, int relative); +int sync_espeak_SetVoiceByName(const char *name); +int sync_espeak_SetVoiceByProperties(espeak_VOICE *voice_selector); +espeak_ERROR SetVoiceByName(const char *name); +espeak_ERROR SetVoiceByProperties(espeak_VOICE *voice_selector); +void SetParameter(int parameter, int value, int relative); + +int sync_espeak_terminated_msg(unsigned int unique_identifier, void* user_data); + +//> +#endif diff --git a/src/espeakedit.cpp b/src/espeakedit.cpp new file mode 100755 index 00000000..befdad30 --- /dev/null +++ b/src/espeakedit.cpp @@ -0,0 +1,707 @@ +/*************************************************************************** + * Copyright (C) 2005, 2006 by Jonathan Duddington * + * jsd@clara.co.uk * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "wx/wx.h" + + +#include "wx/wfstream.h" +#include "wx/notebook.h" +#include "wx/image.h" +#include "wx/filename.h" +#include "wx/numdlg.h" +#include "wx/mdi.h" +#include "wx/laywin.h" +#include "wx/sashwin.h" +#include + +#include "speak_lib.h" +#include "main.h" +#include "speech.h" +#include "voice.h" +#include "options.h" +#include "phoneme.h" +#include "synthesize.h" +#include "spect.h" +#include "translate.h" +#include "prosodydisplay.h" + + +static char *about_string = "espeakedit: %s\nAuthor: Jonathan Duddington (c) 2006"; + + +const char *path_data = "/home/jsd1/speechdata/phsource"; + +extern void TestTest(int control); +extern void CompareLexicon(int); +extern void ConvertToUtf8(); + +extern void init_z(); +extern void CompileInit(void); +extern void CompileMbrola(); +extern void InitSpectrumDisplay(); +extern void InitProsodyDisplay(); +extern void InitWaveDisplay(); + +extern void VowelChart(int control, char *fname); +extern void MakeVowelLists(void); +extern void MakeWordFreqList(); + +extern const char *dict_name; +extern char voice_name[]; + +MyFrame *myframe = NULL; +SpectDisplay *currentcanvas = NULL; + +ChildFrProsody *prosodyframe = NULL; +ProsodyDisplay *prosodycanvas = NULL; +wxNotebook *notebook = NULL; +wxProgressDialog *progress; +int progress_max; +int gui_flag = 0; + +wxList my_children; + +wxFont FONT_SMALL(8,wxSWISS,wxNORMAL,wxNORMAL); +wxFont FONT_MEDIUM(9,wxSWISS,wxNORMAL,wxNORMAL); +wxFont FONT_NORMAL(10,wxSWISS,wxNORMAL,wxNORMAL); + +IMPLEMENT_APP(MyApp) + +wxString AppName = _T("espeakedit"); + + + + + +int MyApp::OnExit() +{//================ + ConfigSave(1); + return(0); +} + + +static const char *help_text = +"\n\nespeakedit\n" +"\tRun with GUI\n" +"espeakedit --compile\n" +"\tCompile phoneme data in espeak-data/phsource\n" +"\tand dictionary data in espeak-data/dictsource\n"; + + +// Initialise this in OnInit, not statically +bool MyApp::OnInit(void) +{//===================== + +int j; +wxChar *p; +char param[80]; + + +if(argc > 1) +{ +extern void VoiceReset(int control); + + p = argv[1]; + j = 0; + while((param[j] = p[j]) != 0) j++; + + if((strcmp(param,"--help")==0) || (strcmp(param,"-h")==0)) + { + printf(about_string,espeak_Info(NULL)); + printf(help_text); + exit(0); + } + + ConfigInit(); + VoiceReset(0); + WavegenSetVoice(voice); + WavegenInitSound(); + + if(strcmp(param,"--compile")==0) + { + CompileInit(); + exit(0); + } + if(strcmp(param,"--lex=ru")==0) + { + if(LoadPhData() != 1) + { + fprintf(stderr,"Failed to load phoneme data\n"); + exit(1); + } + CompareLexicon(MENU_LEXICON_RU); + exit(0); + } +} + + gui_flag = 1; + // It seems that the wctype functions don't work until the locale has been set + // to something other than the default "C". Then, not only Latin1 but also the + // other characters give the correct results with iswalpha() etc. + if(setlocale(LC_CTYPE,"en_US.UTF-8") == NULL) + setlocale(LC_CTYPE,""); + + + // Create the main frame window + myframe = new MyFrame(NULL, -1, AppName, wxPoint(0, 0), wxSize(1024, 768), + wxDEFAULT_FRAME_STYLE | + wxNO_FULL_REPAINT_ON_RESIZE | + wxHSCROLL | wxVSCROLL); + + + // Make a menubar + myframe->SetMenuBar(MakeMenu(0)); + + myframe->CreateStatusBar(); + + myframe->Show(TRUE); + + SetTopWindow(myframe); + wxInitAllImageHandlers(); +// wxImage::AddHandler(wxPNGHandler); + return TRUE; +} + +BEGIN_EVENT_TABLE(MyFrame, wxMDIParentFrame) + EVT_CHAR(MyFrame::OnKey) + EVT_MENU(MENU_ABOUT, MyFrame::OnAbout) + EVT_MENU(MENU_SPECTRUM, MyFrame::OnNewWindow) + EVT_MENU(MENU_SPECTRUM2, MyFrame::OnNewWindow) + EVT_MENU(MENU_PROSODY, MyFrame::OnProsody) + EVT_MENU(MENU_PARAMS, MyFrame::OnOptions) + EVT_MENU(MENU_PATH1, MyFrame::OnOptions) + EVT_MENU(MENU_PATH2, MyFrame::OnOptions) + EVT_MENU(MENU_PATH3, MyFrame::OnOptions) + EVT_MENU(MENU_COMPILE_PH, MyFrame::OnTools) + EVT_MENU(MENU_COMPILE_DICT, MyFrame::OnTools) + EVT_MENU(MENU_COMPILE_MBROLA, MyFrame::OnTools) + EVT_MENU(MENU_CLOSE_ALL, MyFrame::OnQuit) + EVT_MENU(MENU_QUIT, MyFrame::OnQuit) + EVT_MENU(MENU_SPEAK_TRANSLATE, MyFrame::OnSpeak) + EVT_MENU(MENU_SPEAK_RULES, MyFrame::OnSpeak) + EVT_MENU(MENU_SPEAK_TEXT, MyFrame::OnSpeak) + EVT_MENU(MENU_SPEAK_FILE, MyFrame::OnSpeak) + EVT_MENU(MENU_SPEAK_STOP, MyFrame::OnSpeak) + EVT_MENU(MENU_SPEAK_PAUSE, MyFrame::OnSpeak) + EVT_MENU(MENU_SPEAK_VOICE, MyFrame::OnSpeak) + EVT_MENU(MENU_LOAD_WAV, MyFrame::OnTools) + EVT_MENU(MENU_VOWELCHART1, MyFrame::OnTools) + EVT_MENU(MENU_VOWELCHART2, MyFrame::OnTools) + EVT_MENU(MENU_VOWELCHART3, MyFrame::OnTools) + EVT_MENU(MENU_LEXICON_RU, MyFrame::OnTools) + EVT_MENU(MENU_TO_UTF8, MyFrame::OnTools) + EVT_MENU(MENU_COUNT_WORDS, MyFrame::OnTools) + EVT_MENU(MENU_TEST, MyFrame::OnTools) + EVT_MENU(MENU_TEST2, MyFrame::OnTools) + + EVT_TIMER(1, MyFrame::OnTimer) + EVT_SIZE(MyFrame::OnSize) + EVT_SASH_DRAGGED_RANGE(ID_WINDOW_TOP, ID_WINDOW_BOTTOM, MyFrame::OnSashDrag) +END_EVENT_TABLE() + + +MyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, + const long style): + wxMDIParentFrame(parent, id, title, pos, size, style) +{//=================================================================================================================== +// Main Frame constructor + + int error_flag = 0; + int result; + + // Create some dummy layout windows +wxSashLayoutWindow *win; + + // Another window to the left of the client window + win = new wxSashLayoutWindow(this, ID_WINDOW_LEFT2, + wxDefaultPosition, wxSize(200, 30), + wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN); + win->SetDefaultSize(wxSize(208, 1000)); + win->SetOrientation(wxLAYOUT_VERTICAL); + win->SetAlignment(wxLAYOUT_LEFT); +// win->SetBackgroundColour(wxColour(0, 255, 255)); + win->SetSashVisible(wxSASH_RIGHT, TRUE); + + m_leftWindow2 = win; + + notebook = new wxNotebook(m_leftWindow2,-1); +// notebook->AddPage(voicedlg,_T("Voice"),FALSE); + formantdlg = new FormantDlg(notebook); + notebook->AddPage(formantdlg,_T(" Spect"),FALSE); + voicedlg = new VoiceDlg(notebook); + + transldlg = new TranslDlg(notebook); + notebook->AddPage(transldlg,_T("Text"),TRUE); + + + ConfigInit(); + WavegenInitSound(); + + if((result = LoadPhData()) != 1) + { + if(result == -1) + wxLogError(_T("Failed to load phoneme data,\nneeds espeak-data/phontab,phondata,phonindex")); + else + wxLogError(_T("Wrong version of espeak-data: 0x%x (expects 0x%x)"),result,version_phdata); + + error_flag = 1; + } + + f_trans = stdout; + option_ssml = 1; + + +// if(LoadVoice(voice_name,0) == NULL) + if(SetVoiceByName(voice_name) != EE_OK) + { + if(error_flag==0) + wxLogError(_T("Failed to load voice data")); + strcpy(dictionary_name,"en"); + } + else + { + SetVoiceTitle(voice_name); + } + WavegenSetVoice(voice); + + SetParameter(espeakRATE,option_speed,0); + + SetSpeed(3); + SynthesizeInit(); + + InitSpectrumDisplay(); + InitProsodyDisplay(); +// InitWaveDisplay(); + espeak_ListVoices(NULL); + + m_timer.SetOwner(this,1); + + m_timer.Start(500); /* 0.5 timer */ + +} // end of MyFrame::MyFrame + + +void MyFrame::SetVoiceTitle(char *voice_name) +{//========================================== + SetTitle(AppName + _T(" - ") + wxString(voice_name,wxConvLocal) + _T(" voice")); +} + + + +void MyFrame::OnKey(wxKeyEvent& event) +{ + int key; + + key = event.GetKeyCode(); + + if((currentcanvas != NULL) && (currentcanvas != FindFocus())) + { + if((key == WXK_F1) || (key == WXK_F2)) + { + currentcanvas->OnKey(event); + currentcanvas->SetFocus(); + return; + } + } + + event.Skip(); +} + +void MyFrame::OnTimer(wxTimerEvent &event) +//**************************************** +{ + SynthOnTimer(); +} + + +void MyFrame::OnQuit(wxCommandEvent& event) +{ + switch(event.GetId()) + { + case MENU_QUIT: + Close(TRUE); + break; + case MENU_CLOSE_ALL: + break; + } +} + +//#define xcharset +#ifdef xcharset +#include "iconv.h" +void CharsetToUnicode(const char *charset) +{//======================================= +// write a 8bit charset to unicode translation table to file +// charset: eg. "ISO-8859-1" + iconv_t cd; + unsigned char inbuf[4]; + size_t n_inbuf; + unsigned char outbuf[12]; + size_t n_outbuf; + int n; + int ix; + int x, y; + FILE *f; + char *p_inbuf; + char *p_outbuf; + + f = fopen("/home/jsd1/tmp1/unicode1","a"); + + cd = iconv_open("WCHAR_T",charset); + if (cd == (iconv_t) -1) + { + fprintf(stderr,"Error - iconv_open\n"); + return; + } + + fprintf(f,"towlower_tab\n "); + for(ix=0x80; ix<=0x241; ix++) + { + y = 0; + if(iswalpha(ix)) + { + x = towlower(ix); + if(x == ix) + y = 0xff; + else + y = x - ix; + } + if((y == 0xff) || (y < 0)) + fprintf(f,"0xff,"); // ignore the 5 obscure cases where uc > lc + else + { + fprintf(f,"%4d,",y); + } + if((ix&15)==15) + fprintf(f," // %x\n ",ix & ~15); + } + + fprintf(f,"\n%s\n ",charset); + for(ix=0x80; ix<0x100; ix++) + { + inbuf[0] = ix; + inbuf[1] = 0; + inbuf[2] = 0; + outbuf[0] = 0; + outbuf[1] = 0; + n_inbuf = 2; + n_outbuf = sizeof(outbuf); + p_inbuf = (char *)inbuf; + p_outbuf = (char *)outbuf; + + n = iconv(cd, &p_inbuf, &n_inbuf, &p_outbuf, &n_outbuf); + + fprintf(f,"0x%.2x%.2x, ",outbuf[1],outbuf[0]); + if((ix&7)==7) + fprintf(f,"// %.2x\n ",ix & ~7); + } + fclose(f); + + iconv_close(cd); +} +#endif + + +void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) +{//=================================================== +//CharsetToUnicode("ISO-8859-3"); +//CharsetToUnicode("ISCII"); + char buf[120]; + + sprintf(buf,about_string,espeak_Info(NULL)); + (void)wxMessageBox(wxString(buf,wxConvLocal), _T("About eSpeak Editor")); +} + +void MyFrame::OnOptions(wxCommandEvent& event) +{ + wxString string; + int value; + + switch(event.GetId()) + { + case MENU_PARAMS: + value = wxGetNumberFromUser(_T(""),_T(""),_T("Speed"),option_speed,80,320); + if(value > 0) + { + option_speed = value; + SetParameter(espeakRATE,option_speed,0); + SetSpeed(3); + } + break; + + case MENU_PATH1: + string = wxDirSelector(_T("Phoneme source directory"),path_phsource); + if(!string.IsEmpty()) + { + path_phsource = string; + } + break; + + case MENU_PATH2: + string = wxDirSelector(_T("Dictionary source directory"),path_dictsource); + if(!string.IsEmpty()) + { + path_dictsource = string; + } + break; + + case MENU_PATH3: + string = wxFileSelector(_T("Sound output file"),wxFileName(path_speech).GetPath(), + _T(""),_T("WAV"),_T("*"),wxSAVE); + if(!string.IsEmpty()) + { + path_speech = string; + } + break; + } + + ConfigSetPaths(); +} + + +void MyFrame::OnTools(wxCommandEvent& event) +{//========================================= + int err; + FILE *log; + char fname_log[80]; + char err_fname[130]; + + switch(event.GetId()) + { + case MENU_TEST: + TestTest(0); + break; + + case MENU_TEST2: + TestTest(2); + break; + + case MENU_TO_UTF8: + ConvertToUtf8(); + break; + + case MENU_COUNT_WORDS: + MakeWordFreqList(); + break; + + case MENU_LEXICON_RU: + CompareLexicon(event.GetId()); // Compare a lexicon with _rules translation + break; + + case MENU_COMPILE_PH: + CompileInit(); + break; + + case MENU_COMPILE_MBROLA: + CompileMbrola(); + break; + + case MENU_COMPILE_DICT: + sprintf(fname_log,"%s%s",path_dsource,"dict_log"); + log = fopen(fname_log,"w"); + + if((err = CompileDictionary(path_dsource,dictionary_name,log,err_fname)) < 0) + { + wxLogError(_T("Can't access file:\n")+wxString(err_fname,wxConvLocal)); + + wxString dir = wxDirSelector(_T("Directory containing dictionary files"),path_dictsource); + if(!dir.IsEmpty()) + { + path_dictsource = dir; + strncpy0(path_dsource,path_dictsource.mb_str(wxConvLocal),sizeof(path_dsource)-1); + strcat(path_dsource,"/"); + } + break; + } + wxLogStatus(_T("Compiled '")+wxString(dictionary_name,wxConvLocal)+_T("', %d errors"),err); + + if(log != NULL) + fclose(log); + break; + + case MENU_VOWELCHART1: + MakeVowelLists(); + break; + + case MENU_VOWELCHART2: + VowelChart(2,NULL); + break; + + case MENU_VOWELCHART3: + VowelChart(3,NULL); + break; + + case MENU_LOAD_WAV: +// LoadWavFile(); + break; + } +} + +extern wxMenu *speak_menu; + +void MyFrame::OnSpeak(wxCommandEvent& event) +{//========================================= + switch(event.GetId()) + { + case MENU_SPEAK_TRANSLATE: + case MENU_SPEAK_RULES: + case MENU_SPEAK_TEXT: + transldlg->OnCommand(event); + break; + + case MENU_SPEAK_FILE: + transldlg->SpeakFile(); + break; + + case MENU_SPEAK_STOP: + SpeakNextClause(NULL,NULL,2); + break; + + case MENU_SPEAK_PAUSE: + 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: + transldlg->ReadVoice(); + if(voicedlg != NULL) + voicedlg->WriteParams(); + SetVoiceTitle(voice_name); + break; + } +} + + +void MyFrame::OnSashDrag(wxSashEvent& event) +{ + if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE) + return; + + switch (event.GetId()) + { + case ID_WINDOW_TOP: + { + m_topWindow->SetDefaultSize(wxSize(1000, event.GetDragRect().height)); + break; + } + case ID_WINDOW_LEFT1: + { + m_leftWindow1->SetDefaultSize(wxSize(event.GetDragRect().width, 1000)); + break; + } + case ID_WINDOW_LEFT2: + { + m_leftWindow2->SetDefaultSize(wxSize(event.GetDragRect().width, 1000)); + break; + } + case ID_WINDOW_BOTTOM: + { + m_bottomWindow->SetDefaultSize(wxSize(1000, event.GetDragRect().height)); + break; + } + } + wxLayoutAlgorithm layout; + layout.LayoutMDIFrame(this); + + // Leaves bits of itself behind sometimes + GetClientWindow()->Refresh(); +} + + + +void MyFrame::OnSize(wxSizeEvent& WXUNUSED(event)) +{ + wxLayoutAlgorithm layout; + layout.LayoutMDIFrame(this); +} + +// Note that SASHTEST_NEW_WINDOW and SASHTEST_ABOUT commands get passed +// to the parent window for processing, so no need to +// duplicate event handlers here. + +BEGIN_EVENT_TABLE(MyChild, wxMDIChildFrame) + EVT_MENU(SPECTSEQ_CLOSE, MyChild::OnQuit) + EVT_MENU(SPECTSEQ_SAVE, MyChild::OnSave) + EVT_MENU(SPECTSEQ_SAVEAS, MyChild::OnSaveAs) + EVT_MENU(SPECTSEQ_SAVESELECT, MyChild::OnSaveSelect) + EVT_MENU(SPECTSEQ_SAVEPITCH, MyChild::OnSavePitchenv) + + EVT_ACTIVATE(MyChild::OnActivate) +END_EVENT_TABLE() + +MyChild::MyChild(wxMDIParentFrame *parent, const wxString& title, const wxPoint& pos, const wxSize& size, +const long style): + wxMDIChildFrame(parent, -1, title, pos, size, style) +{ + canvas = NULL; + my_children.Append(this); +} + +MyChild::~MyChild(void) +{ + wxWindow *w; + canvas = NULL; +#ifndef PLATFORM_WINDOWS + // bug in wxMDIChildFrame, we need to explicitly remove the ChildFrame from the ClientWindow + w = myframe->GetClientWindow(); + w->RemoveChild(this); +#endif + my_children.DeleteObject(this); +} + +//extern void CloseCanvas(); + +void MyChild::OnQuit(wxCommandEvent& WXUNUSED(event)) +{ + Destroy(); + +} + +void MyChild::OnSave(wxCommandEvent& WXUNUSED(event)) +{ + canvas->Save(canvas->savepath); +} + +void MyChild::OnSaveAs(wxCommandEvent& WXUNUSED(event)) +{ + canvas->Save(); +} + +void MyChild::OnSaveSelect(wxCommandEvent& WXUNUSED(event)) +{ + canvas->Save(_T(""),1); +} + +void MyChild::OnSavePitchenv(wxCommandEvent& WXUNUSED(event)) +{ + canvas->SavePitchenv(canvas->spectseq->pitchenv); +} + +void MyChild::OnActivate(wxActivateEvent& event) +{ + if(canvas) + canvas->OnActivate(event.GetActive()); + + +} + diff --git a/src/espeakedit.h b/src/espeakedit.h new file mode 100755 index 00000000..59dfbf1e --- /dev/null +++ b/src/espeakedit.h @@ -0,0 +1,55 @@ +/*************************************************************************** + * Copyright (C) 2004 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef _VOICEEDIT_H_ +#define _VOICEEDIT_H_ + +/** + * @short Application Main Window + * @author Jonathan Duddington + * @version 0.1 + */ + +class +voiceeditapp : public wxApp +{ + public: + virtual bool OnInit(); +}; + +class +voiceeditFrame : public wxFrame +{ + public: + voiceeditFrame( const wxString& title, const wxPoint& pos, const wxSize& pos ); + void OnQuit( wxCommandEvent& event ); + void OnAbout( wxCommandEvent& event ); + + private: + DECLARE_EVENT_TABLE() +}; + +enum +{ + Menu_File_Quit = 100, + Menu_File_About +}; + +#endif // _VOICEEDIT_H_ diff --git a/src/event.cpp b/src/event.cpp new file mode 100644 index 00000000..53948ec6 --- /dev/null +++ b/src/event.cpp @@ -0,0 +1,716 @@ +/*************************************************************************** + * Copyright (C) 2007, Gilles Casse * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "speech.h" + +#ifdef USE_ASYNC +// This source file is only used for asynchronious modes + + +// +#include +#include +#include +#include +#include +#include +#include + +#include "speak_lib.h" +#include "event.h" +#include "wave.h" +#include "debug.h" +//> +// +// my_callback=0x%x\n", my_callback); + + my_event_is_running=0; + + // security + pthread_mutex_init( &my_mutex, (const pthread_mutexattr_t *)NULL); + init(); + + assert(-1 != sem_init(&my_sem_start_is_required, 0, 0)); + assert(-1 != sem_init(&my_sem_stop_is_required, 0, 0)); + assert(-1 != sem_init(&my_sem_stop_is_acknowledged, 0, 0)); + + pthread_attr_t a_attrib; + if (pthread_attr_init (& a_attrib) + || pthread_attr_setdetachstate(&a_attrib, PTHREAD_CREATE_JOINABLE) + || pthread_create( &my_thread, + & a_attrib, + polling_thread, + (void*)NULL)) + { + assert(0); + } + + pthread_attr_destroy(&a_attrib); +} +//> +// event=%s\n","NULL"); + } + else + { + static const char* label[] = { + "LIST_TERMINATED", + "WORD", + "SENTENCE", + "MARK", + "PLAY", + "END", + "MSG_TERMINATED" + }; + + SHOW("event_display > event=0x%x\n",event); + SHOW("event_display > type=%s\n",label[event->type]); + SHOW("event_display > uid=%d\n",event->unique_identifier); + SHOW("event_display > text_position=%d\n",event->text_position); + SHOW("event_display > length=%d\n",event->length); + SHOW("event_display > audio_position=%d\n",event->audio_position); + SHOW("event_display > sample=%d\n",event->sample); + SHOW("event_display > user_data=0x%x\n",event->user_data); + } +#endif +} +//> +//type) + { + case espeakEVENT_MARK: + case espeakEVENT_PLAY: + if (event->id.name) + { + a_event->id.name = strdup(event->id.name); + } + break; + + default: + break; + } + } + + event_display(a_event); + + return a_event; +} + +//> +//type = espeakEVENT_SENTENCE +// * 0, 1 or several calls: event->type = espeakEVENT_WORD +// * Last call: event->type = espeakEVENT_MSG_TERMINATED +// + +static void event_notify(espeak_EVENT* event) +{ + ENTER("event_notify"); + + static unsigned int a_old_uid = 0; + + if (event && my_callback) + { + event_display(event); + + switch(event->type) + { + case espeakEVENT_SENTENCE: + my_callback(NULL, 0, event); + a_old_uid = event->unique_identifier; + break; + + case espeakEVENT_WORD: + case espeakEVENT_MSG_TERMINATED: + { + if (a_old_uid != event->unique_identifier) + { + espeak_EVENT_TYPE a_new_type = event->type; + event->type = espeakEVENT_SENTENCE; + my_callback(NULL, 0, event); + event->type = a_new_type; + usleep(50000); + } + my_callback(NULL, 0, event); + a_old_uid = event->unique_identifier; + } + break; + + default: + case espeakEVENT_LIST_TERMINATED: + case espeakEVENT_MARK: + case espeakEVENT_PLAY: + case espeakEVENT_END: + break; + } + } +} +//> +//type) + { + case espeakEVENT_MSG_TERMINATED: + event_notify(event); + break; + + case espeakEVENT_MARK: + case espeakEVENT_PLAY: + if(event->id.name) + { + free((void*)(event->id.name)); + } + + break; + + default: + break; + } + + free(event); + return 1; +} + +//> +// locked\n"); + espeak_EVENT* a_event = event_copy(event); + a_error = push(a_event); + if (a_error != EE_OK) + { + event_delete(a_event); + } + SHOW_TIME("event_declare > unlocking\n"); + a_status = pthread_mutex_unlock(&my_mutex); + } + + // TBD: remove the comment + // reminder: code in comment. + // This wait can lead to an underrun + // +// if (!a_status && !my_event_is_running && (a_error == EE_OK)) +// { +// // quit when command is actually started +// // (for possible forthcoming 'end of command' checks) + SHOW_TIME("event_declare > post my_sem_start_is_required\n"); + sem_post(&my_sem_start_is_required); +// int val=1; +// while (val) +// { +// usleep(50000); // TBD: event? +// sem_getvalue(&my_sem_start_is_required, &val); +// } +// } + + if (a_status != 0) + { + a_error = EE_INTERNAL_ERROR; + } + + return a_error; +} + +//> +// locked\n"); + if (a_status != 0) + { + return EE_INTERNAL_ERROR; + } + + if (my_event_is_running) + { + SHOW_TIME("event_stop > post my_sem_stop_is_required\n"); + sem_post(&my_sem_stop_is_required); + a_event_is_running = 1; + } + else + { + init(); // clear pending events + } + SHOW_TIME("event_stop > unlocking\n"); + a_status = pthread_mutex_unlock(&my_mutex); + if (a_status != 0) + { + return EE_INTERNAL_ERROR; + } + + if (a_event_is_running) + { + SHOW_TIME("event_stop > wait for my_sem_stop_is_acknowledged\n"); + while ((sem_wait(&my_sem_stop_is_acknowledged) == -1) && errno == EINTR) + { + continue; // Restart when interrupted by handler + } + SHOW_TIME("event_stop > get my_sem_stop_is_acknowledged\n"); + } + + SHOW_TIME("LEAVE event_stop\n"); + + return EE_OK; +} + +//> +// sleep_until_timeout_or_stop_request > start sem_timedwait from %d.%09lu to %d.%09lu \n", + to.tv_sec, to.tv_nsec, + ts.tv_sec, ts.tv_nsec); + + while ((err = sem_timedwait(&my_sem_stop_is_required, &ts)) == -1 + && errno == EINTR) + { + continue; // Restart when interrupted by handler + } + + assert (gettimeofday(&tv, NULL) != -1); + SHOW("polling_thread > sleep_until_timeout_or_stop_request > stop sem_timedwait %d.%09lu \n", + tv.tv_sec, tv.tv_usec*1000); + + if (err == 0) + { + SHOW("polling_thread > sleep_until_timeout_or_stop_request > %s\n","stop required!"); + a_stop_is_required=1; // stop required + } + return a_stop_is_required; +} + +//> +// +// locking\n"); + int a_status = pthread_mutex_lock(&my_mutex); + SHOW_TIME("polling_thread > locked (my_event_is_running = 0)\n"); + my_event_is_running = 0; + pthread_mutex_unlock(&my_mutex); + SHOW_TIME("polling_thread > unlocked\n"); + + SHOW_TIME("polling_thread > wait for my_sem_start_is_required\n"); + + while ((sem_wait(&my_sem_start_is_required) == -1) && errno == EINTR) + { + continue; // Restart when interrupted by handler + } + + SHOW_TIME("polling_thread > get my_sem_start_is_required\n"); + + a_status = pthread_mutex_lock(&my_mutex); + SHOW_TIME("polling_thread > locked (my_event_is_running = 1)\n"); + my_event_is_running = 1; + pthread_mutex_unlock(&my_mutex); + SHOW_TIME("polling_thread > unlocked\n"); + + a_stop_is_required=0; + a_status = sem_getvalue(&my_sem_stop_is_required, &a_stop_is_required); + if ((a_status==0) && a_stop_is_required) + { + SHOW("polling_thread > stop required (%d)\n", __LINE__); + while(0 == sem_trywait(&my_sem_stop_is_required)) + { + }; + } + else + { + a_stop_is_required=0; + } + + // In this loop, my_event_is_running = 1 + while (head && !a_stop_is_required) + { + SHOW_TIME("polling_thread > check head\n"); + while(0 == sem_trywait(&my_sem_start_is_required)) + { + }; + + espeak_EVENT* event = (espeak_EVENT*)(head->data); + assert(event); + + uint32_t time_in_ms = 0; + + int err = get_remaining_time((uint32_t)event->sample, + &time_in_ms, + &a_stop_is_required); + if (a_stop_is_required) + { + break; + } + else if (err != 0) + { + // No available time: the event is deleted. + SHOW("polling_thread > %s\n","audio device down"); + a_status = pthread_mutex_lock(&my_mutex); + SHOW_TIME("polling_thread > locked\n"); + event_delete( (espeak_EVENT*)pop()); + a_status = pthread_mutex_unlock(&my_mutex); + SHOW_TIME("polling_thread > unlocked\n"); + } + else if (time_in_ms==0) + { // the event is already reached. + if (my_callback) + { + event_notify(event); + // the user_data (and the type) are cleaned to be sure + // that MSG_TERMINATED is called twice (at delete time too). + event->type=espeakEVENT_LIST_TERMINATED; + event->user_data=NULL; + } + a_status = pthread_mutex_lock(&my_mutex); + SHOW_TIME("polling_thread > locked\n"); + event_delete( (espeak_EVENT*)pop()); + a_status = pthread_mutex_unlock(&my_mutex); + SHOW_TIME("polling_thread > unlocked\n"); + + a_stop_is_required=0; + a_status = sem_getvalue(&my_sem_stop_is_required, &a_stop_is_required); + if ((a_status==0) && a_stop_is_required) + { + SHOW("polling_thread > stop required (%d)\n", __LINE__); + while(0 == sem_trywait(&my_sem_stop_is_required)) + { + }; + } + else + { + a_stop_is_required=0; + } + } + else + { // The event will be notified soon: sleep until timeout or stop request + a_stop_is_required = sleep_until_timeout_or_stop_request(time_in_ms); + } + } + + a_status = pthread_mutex_lock(&my_mutex); + SHOW_TIME("polling_thread > locked\n"); + + SHOW_TIME("polling_thread > my_event_is_running = 0\n"); + my_event_is_running = 0; + + if(!a_stop_is_required) + { + a_status = sem_getvalue(&my_sem_stop_is_required, &a_stop_is_required); + if ((a_status==0) && a_stop_is_required) + { + SHOW("polling_thread > stop required (%d)\n", __LINE__); + while(0 == sem_trywait(&my_sem_stop_is_required)) + { + }; + } + else + { + a_stop_is_required=0; + } + } + + a_status = pthread_mutex_unlock(&my_mutex); + SHOW_TIME("polling_thread > unlocked\n"); + + if (a_stop_is_required) + { + SHOW("polling_thread > %s\n","stop required!"); + // no mutex required since the stop command is synchronous + // and waiting for my_sem_stop_is_acknowledged + init(); + + // acknowledge the stop request + SHOW_TIME("polling_thread > post my_sem_stop_is_acknowledged\n"); + a_status = sem_post(&my_sem_stop_is_acknowledged); + } + + } + + return NULL; +} + +//> +// push"); + + assert((!head && !tail) || (head && tail)); + + if (the_data == NULL) + { + SHOW("event > push > event=0x%x\n", NULL); + return EE_INTERNAL_ERROR; + } + + if (node_counter >= MAX_NODE_COUNTER) + { + SHOW("event > push > %s\n", "EE_BUFFER_FULL"); + return EE_BUFFER_FULL; + } + + node *n = (node *)malloc(sizeof(node)); + if (n == NULL) + { + return EE_INTERNAL_ERROR; + } + + if (head == NULL) + { + head = n; + tail = n; + } + else + { + tail->next = n; + tail = n; + } + + tail->next = NULL; + tail->data = the_data; + + node_counter++; + SHOW("event > push > counter=%d (uid=%d)\n",node_counter,((espeak_EVENT*)the_data)->unique_identifier); + + return EE_OK; +} + +static void* pop() +{ + ENTER("event > pop"); + void* the_data = NULL; + + assert((!head && !tail) || (head && tail)); + + if (head != NULL) + { + node* n = head; + the_data = n->data; + head = n->next; + free(n); + node_counter--; + SHOW("event > pop > event=0x%x (counter=%d, uid=%d)\n",the_data, node_counter,((espeak_EVENT*)the_data)->unique_identifier); + } + + if(head == NULL) + { + tail = NULL; + } + + return the_data; +} + + +static void init() +{ + ENTER("event > init"); + + while (event_delete( (espeak_EVENT*)pop() )) + {} + + node_counter = 0; +} + +//> +// + diff --git a/src/event.h b/src/event.h new file mode 100644 index 00000000..f2ed74b0 --- /dev/null +++ b/src/event.h @@ -0,0 +1,50 @@ +#ifndef EVENT_H +#define EVENT_H + +/* +Manage events (sentence, word, mark, end,...), is responsible of calling the external +callback as soon as the relevant audio sample is played. + + +The audio stream is composed of samples from synthetised messages or audio icons. +Each event is associated to a sample. + +Scenario: + +- event_declare is called for each expected event. + +- A timeout is started for the first pending event. + +- When the timeout happens, the synth_callback is called. + +Note: the timeout is checked against the real progress of the audio stream, which depends on pauses or underruns. If the real progress is lower than the expected one, a new timeout starts. + +*/ + +#include "speak_lib.h" + +// Initialize the event component. +// First function to be called. +// the callback will be called when the event actually occurs. +// The callback is detailled in speak_lib.h . +void event_init(t_espeak_callback* cb); + +// Clear any pending event. +// +// Return: EE_OK: operation achieved +// EE_INTERNAL_ERROR. +espeak_ERROR event_clear_all (); + +// Declare a future event +// +// Return: EE_OK: operation achieved +// EE_BUFFER_FULL: the event can not be buffered; +// you may try after a while to call the function again. +// EE_INTERNAL_ERROR. +espeak_ERROR event_declare (espeak_EVENT* event); + +// Terminate the event component. +// Last function to be called. +void event_terminate(); + +#endif diff --git a/src/extras.cpp b/src/extras.cpp new file mode 100644 index 00000000..e935f897 --- /dev/null +++ b/src/extras.cpp @@ -0,0 +1,894 @@ +/*************************************************************************** + * Copyright (C) 2006 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "wx/wx.h" +#include +#include "wx/filename.h" +#include "wx/sound.h" + +#include "sys/stat.h" + +#include "speak_lib.h" +#include "main.h" +#include "speech.h" +#include "voice.h" +#include "spect.h" +#include "phoneme.h" +#include "synthesize.h" +#include "translate.h" +#include "options.h" + + +//****************************************************************************************************** + + + +FILE *f_wavtest = NULL; +FILE *f_events = NULL; + +int OpenWaveFile3(const char *path, int rate) +/******************************************/ +{ + int *p; + + static unsigned char wave_hdr[44] = { + 'R','I','F','F',0,0,0,0,'W','A','V','E','f','m','t',' ', + 0x10,0,0,0,1,0,1,0, 9,0x3d,0,0,0x12,0x7a,0,0, + 2,0,0x10,0,'d','a','t','a', 0,0,0,0 }; + + + if(path == NULL) + return(2); + + // set the sample rate in the header + p = (int *)(&wave_hdr[24]); + p[0] = rate; + p[1] = rate * 2; + + f_wavtest = fopen(path,"wb"); + + if(f_wavtest != NULL) + { + fwrite(wave_hdr,1,sizeof(wave_hdr),f_wavtest); + return(0); + } + return(1); +} // end of OpenWaveFile + + + + +void CloseWaveFile3(int rate) +/******************/ +{ + unsigned int pos; + static int value; + + + fflush(f_wavtest); + pos = ftell(f_wavtest); + + value = pos - 8; + fseek(f_wavtest,4,SEEK_SET); + fwrite(&value,4,1,f_wavtest); + + value = rate; + fseek(f_wavtest,24,SEEK_SET); + fwrite(&value,4,1,f_wavtest); + + value = rate*2; + fseek(f_wavtest,28,SEEK_SET); + fwrite(&value,4,1,f_wavtest); + + value = pos - 44; + fseek(f_wavtest,40,SEEK_SET); + fwrite(&value,4,1,f_wavtest); + + fclose(f_wavtest); + f_wavtest = NULL; + +} // end of CloseWaveFile2 + + +int TestUriCallback(int type, const char *uri, const char *base) +{//============================================================= + + if(strcmp(uri,"hello")==0) + return(1); + return(0); +} + + + +int TestSynthCallback(short *wav, int numsamples, espeak_EVENT *events) +{//==================================================================== + int type; + +if(f_wavtest == NULL) return(0); + + if(wav == NULL) + { +fprintf(f_events,"Finished\n"); + CloseWaveFile3(samplerate); + fclose(f_events); + return(0); + } + + fwrite(wav,numsamples*2,1,f_wavtest); + + while((type = events->type) != 0) + { + fprintf(f_events,"%4d %4d (%2d): %d ",events->audio_position,events->text_position,events->length,type); + if((type==3) || (type==4)) + fprintf(f_events,"'%s'\n",events->id.name); + else + fprintf(f_events,"%d\n",events->id.number); + + events++; + } + return(0); +} + +//****************************************************************************************************** + + +#ifdef deleted +static int RuLex_sorter(char **a, char **b) +{//======================================= + char *pa, *pb; + int xa, xb; + int ix; + + pa = *a; + pb = *b; + + xa = strlen(pa)-1; + xb = strlen(pb)-1; + + while((xa >= 0) && (xb >= 0)) + { + if((ix = (pa[xa] - pb[xb])) != 0) + return(ix); + + xa--; + xb--; + } + return(pa - pb); +} /* end of strcmp2 */ +#endif + + +static const unsigned short KOI8_R[0x60] = { + 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, // a0 + 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, // a8 + 0x255f, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565, // b0 + 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x00a9, // b8 + 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, // c0 + 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, // c8 + 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, // d0 + 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, // d8 + 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, // e0 + 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, // e8 + 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, // f0 + 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, // f8 +}; + + +#define N_CHARS 34 +int *p_unicode; +int unicode[80]; + + +void Lexicon_Ru() +{//============== + // compare stress markings in Russian RuLex file with lookup in ru_rules + int ix; + char *p; + int c; + FILE *f_in; + FILE *f_out; + FILE *f_log; + FILE *f_roots; + PHONEME_TAB *ph; + int vcount; + int ru_stress; + int max_stress; + int max_stress_posn; + int n_words=0; + int n_wrong=0; + int wlength; + int input_length; + + int sfx; + char *suffix; + int wlen; + int len; + int check_root; + WORD_TAB winfo; + + char word[80]; + char word2[80]; + int counts[20][20][10]; + + char phonemes[N_WORD_PHONEMES]; + char buf[100]; + + // KOI8-R codes for Russian vowels + static char vowels[] = {0xa3,0xc0,0xc1,0xc5,0xc9,0xcf,0xd1,0xd5,0xd9,0xdc,0}; + + typedef struct { + char *suffix; + int syllables; + } SUFFIX; + + static SUFFIX suffixes[] = { +{NULL,0}, + {"ичу",2}, + {"ского",2}, + {"ская",2}, + {"ски",1}, + {"ские",2}, + {"ский",1}, + {"ским",1}, + {"ское",2}, + {"ской",1}, + {"ском",1}, + {"скую",2}, + + {"а",1}, + {"е",1}, + {"и",1}, + + {NULL,0}}; + + + memset(counts,0,sizeof(counts)); + + if(gui_flag) + { + wxString fname = wxFileSelector(_T("Read lexicon.dict"),path_dictsource, + _T(""),_T(""),_T("*"),wxOPEN); + if(fname.IsEmpty()) + return; + strcpy(buf,fname.mb_str(wxConvLocal)); + } + else + { + strcpy(buf,"lexicon.dict"); + } + + if((f_in = fopen(buf,"r")) == NULL) + { + if(gui_flag) + wxLogError(_T("Can't read file: ") + wxString(buf,wxConvLocal)); + else + fprintf(stderr,"Can't read file: %s\n",buf); + return; + } + input_length = GetFileLength(buf); + + sprintf(buf,"%s%c%s",path_dsource,PATHSEP,"ru_listx_1"); + if((f_out = fopen(buf,"w")) == NULL) + { + wxLogError(_T("Can't write to: ")+wxString(buf,wxConvLocal)); + fclose(f_in); + return; + } + + sprintf(buf,"%s%c%s",path_dsource,PATHSEP,"ru_log"); + f_log = fopen(buf,"w"); + sprintf(buf,"%s%c%s",path_dsource,PATHSEP,"ru_roots_1"); + f_roots = fopen(buf,"w"); + + LoadVoice("ru",0); + + + if(gui_flag) + progress = new wxProgressDialog(_T("Lexicon"),_T(""),input_length); + else + fprintf(stderr,"Processing lexicon.dict\n"); + + for(;;) + { + if(((n_words & 0x3ff) == 0) && gui_flag) + { + progress->Update(ftell(f_in)); + } + + if(fgets(buf,sizeof(buf),f_in) == NULL) + break; + + if(isspace2(buf[0])) + continue; + + // convert word from KOI8-R to UTF8 + p = buf; + ix = 0; + wlength = 0; +p_unicode = unicode; + while(!isspace2(c = (*p++ & 0xff))) + { + if(c >= 0xa0) + { + c = KOI8_R[c-0xa0]; +*p_unicode++ = c; + } + + + wlength++; + ix += utf8_out(c,&word[ix]); + } + word[ix] = 0; +*p_unicode=0; + + sprintf(word2," %s ",word); + + // find the marked stress position + vcount = 0; + ru_stress = 0; + while(*p == ' ') p++; + + while((c = (*p++ & 0xff)) != '\n') + { + if(c == '+') + { + ru_stress = vcount; + break; + } + if(strchr(vowels,c) != NULL) + { + vcount++; + } + } + + // translate + memset(&winfo,0,sizeof(winfo)); + translator->TranslateWord(&word2[1],0,&winfo); + DecodePhonemes(translator->word_phonemes,phonemes); + + // find the stress position in the translation + max_stress = 0; + max_stress_posn = -1; + vcount = 0; + check_root = 0; + + ph = phoneme_tab[phonPAUSE]; + for(p=translator->word_phonemes; *p != 0; p++) + { + ph = phoneme_tab[(unsigned int)*p]; + if(ph == NULL) + continue; + + if(ph->type == phVOWEL) + vcount++; + if(ph->type == phSTRESS) + { + if(ph->std_length > max_stress) + { + max_stress = ph->std_length; + max_stress_posn = vcount+1; + } + } + } + + n_words++; + if(ru_stress > vcount) + { + if(f_log != NULL) + { + fprintf(f_log,"%s\t $%d\t // %s\n",word,ru_stress,phonemes); + } + } + else + { + counts[vcount][ru_stress][ph->type]++; + + if((vcount > 1) && (ru_stress != max_stress_posn)) + { + n_wrong++; + if((ru_stress==0) || (ru_stress > 7)) + fprintf(f_out,"// "); // we only have $1 to $7 to indicate stress position + else + check_root = 1; + +#define X_COMPACT + + fprintf(f_out,"%s",word); +#ifdef X_COMPACT + if(wlength < 8) fputc('\t',f_out); + if(wlength < 16) fputc('\t',f_out); + fprintf(f_out," $%d\n",ru_stress); +#else + while(wlength++ < 20) + fputc(' ',f_out); + fprintf(f_out," $%d //%d %s\n",ru_stress,max_stress_posn,phonemes); +#endif +//CharStats(); + } + } + + if(check_root) + { + // does this word match any suffixes ? + wlen = strlen(word); + for(sfx=0;(suffix = suffixes[sfx].suffix) != NULL; sfx++) + { + len = strlen(suffix); + if(len >= (wlen-2)) + continue; + + if(ru_stress > (vcount - suffixes[sfx].syllables)) + continue; + + if(strcmp(suffix,&word[wlen-len])==0) + { + strcpy(word2,word); + word2[wlen-len] = 0; +// fprintf(f_roots,"%s\t $%d\t\\ %s\n",word2,ru_stress,suffix); + fprintf(f_roots,"%s\t $%d\n",word2,ru_stress); + } + } + } + } + + fclose(f_in); + fclose(f_out); + fclose(f_roots); + + sprintf(buf,"Lexicon: Total %d OK %d wrong %d",n_words,n_words-n_wrong,n_wrong); + if(gui_flag) + { + delete progress; + wxLogStatus(wxString(buf,wxConvLocal)); + } + else + { + fprintf(stderr,"%s\n",buf); + } + + if(f_log != NULL) + { + +#ifdef deleted + // list tables of frequency of stress position for words of different syllable lengths + int j,k; + for(ix=0; ix<12; ix++) + { + fprintf(f_log,"%2d syl: ",ix); + for(k=0; k<10; k++) + { + fprintf(f_log," %2d :",k); + for(j=0; j<10; j++) + { + fprintf(f_log,"%6d ",counts[ix][j][k]); + } + fprintf(f_log,"\n"); + } + fprintf(f_log,"\n\n"); + } +#endif + fclose(f_log); + } + +} // end of Lexicon_Ru + + + +void CompareLexicon(int id) +{//======================== + switch(id) + { + case MENU_LEXICON_RU: + Lexicon_Ru(); + break; + } +} // end of CompareLexicon + + +//****************************************************************************************************** +extern int HashDictionary(const char *string); +static int n_words; + +struct wcount { + struct wcount *link; + int count; + char *word; +}; + + + +static int wfreq_sorter(wcount **p1, wcount **p2) +{//============================================== + int x; + wcount *a, *b; + a = *p1; + b = *p2; + if((x = b->count - a->count) != 0) + return(x); + return(strcmp(a->word,b->word)); +} + + +static void wfreq_add(const char *word, wcount **hashtab) +{//====================================================== + wcount *p; + wcount **p2; + int len; + int hash; + + hash = HashDictionary(word); + p2 = &hashtab[hash]; + p = *p2; + + while(p != NULL) + { + if(strcmp(p->word,word)==0) + { + p->count++; + return; + } + p2 = &p->link; + p = *p2; + } + + // word not found, add it to the list + len = strlen(word) + 1; + if((p = (wcount *)malloc(sizeof(wcount)+len)) == NULL) + return; + + p->count = 1; + p->link = NULL; + p->word = (char *)p + sizeof(wcount); + strcpy(p->word,word); + *p2 = p; + n_words++; +} + + +void CountWordFreq(wxString path, wcount **hashtab) +{//================================================ + // Count the occurances of words in this file + FILE *f_in; + unsigned char c; + int wc; + unsigned int ix, j, k; + int n_chars; + char buf[80]; + char wbuf[80]; + + if((f_in = fopen(path.mb_str(wxConvLocal),"rb")) == NULL) + return; + + while(!feof(f_in)) + { + while((c = fgetc(f_in)) < 'A') + { + // skip leading spaces, numbers, etc + if(feof(f_in)) break; + } + + // read utf8 bytes until a space, number or punctuation + ix = 0; + while(!feof(f_in) && (c >= 'A') && (ix < sizeof(buf)-1)) + { + buf[ix++] = c; + c = fgetc(f_in); + } + buf[ix++] = 0; + buf[ix] = 0; + + // the buf may contain non-alphabetic characters + j = 0; + n_chars = 0; + for(k=0; k 2) + { + wfreq_add(wbuf,hashtab); + } + j = 0; + n_chars = 0; + } + } + } + fclose(f_in); + +} // end of CountWordFreq + + +void MakeWordFreqList() +{//==================== +// Read text files from a specified directory and make a list of the most frequently occuring words. + struct wcount *whashtab[N_HASH_DICT]; + wcount **w_list; + int ix; + int j; + int hash; + wcount *p; + FILE *f_out; + char buf[200]; + char buf2[200]; + + wxString dir = wxDirSelector(_T("Directory of text files"),path_speaktext); + if(dir.IsEmpty()) return; + + memset(whashtab,0,sizeof(whashtab)); + + wxString path = wxFindFirstFile(dir+_T("/*"),wxFILE); + + while (!path.empty()) + { + if(path.AfterLast(PATHSEP) != _T("!wordcounts")) + { + CountWordFreq(path,whashtab); + path = wxFindNextFile(); + } + } + + // put all the words into a list and then sort it + w_list = (wcount **)malloc(sizeof(wcount *) * n_words); + + ix = 0; + for(hash=0; hash < N_HASH_DICT; hash++) + { + p = whashtab[hash]; + while((p != NULL) && (ix < n_words)) + { + w_list[ix++] = p; + p = p->link; + } + } + + qsort((void *)w_list,ix,sizeof(wcount *),(int(*)(const void *,const void *))wfreq_sorter); + + // write out the sorted list + strcpy(buf,dir.mb_str(wxConvLocal)); + sprintf(buf2,"%s/!wordcounts",buf); + if((f_out = fopen(buf2,"w")) == NULL) + return; + + for(j=0; jcount,p->word); + free(p); + } + fclose(f_out); + +} // end of Make WorkFreqList + + + +//****************************************************************************************************** + +void ConvertToUtf8() +{//================= +// Convert a file from 8bit to UTF8, according to the current voice + unsigned int c; + int ix; + FILE *f_in; + FILE *f_out; + char buf[80]; + + wxString fname = wxFileSelector(_T("Convert file to UTF8"),wxString(path_home,wxConvLocal), + _T(""),_T(""),_T("*"),wxOPEN); + if(fname.IsEmpty()) + return; + strcpy(buf,fname.mb_str(wxConvLocal)); + f_in = fopen(buf,"r"); + if(f_in == NULL) + { + wxLogError(_T("Can't read file: ")+fname); + return; + } + + strcat(buf,"_1"); + f_out = fopen(buf,"w"); + if(f_out == NULL) + { + wxLogError(_T("Can't create file: ")+wxString(buf,wxConvLocal)); + fclose(f_in); + return; + } + + while(!feof(f_in)) + { + c = fgetc(f_in); + if(c >= 0xa0) + c = translator->charset_a0[c-0xa0]; + + ix = utf8_out(c,buf); + fwrite(buf,ix,1,f_out); + } + fclose(f_in); + fclose(f_out); + + +} // end of ConvertToItf8 + + + +//#define calcspeedtab +#ifdef calcspeedtab +// used to set up the presets in the speed_lookup table +// interpolate between a set of measured wpm values +void SetSpeedTab(void) +{//=================== +#define N_WPM 19 + + // Interpolation table to translate from words-per-minute to internal speed + // words-per-minute values (measured) + static float wpm1[N_WPM] = + {0, 82, 96, 108, 124, 134, 147, 162, 174, 189, 224, 259, 273, 289, 307, 326, 346, 361, 370 }; + // corresponding internal speed values + static float wpm2[N_WPM] = + {0,253,200, 170, 140, 125, 110, 95, 85, 75, 55, 40, 35, 30, 25, 20, 15, 10, 5 }; + + unsigned char speed_lookup[290]; + unsigned int ix; + float x; + int speed_wpm; + FILE *f; + + // convert from word-per-minute to internal speed code + for(speed_wpm=80; speed_wpm<370; speed_wpm++) + { + for(ix=2; ixeSpeak.", + " normally would, " +}; + + +#ifdef deleted +void Test2() +{ +// + char buf[120]; + FILE *f; + FILE *f_out; + unsigned char *p; + + f = fopen("/home/jsd1/tmp1/list","r"); + if(f == NULL) return; + f_out = fopen("/home/jsd1/tmp1/list_out","w"); + if(f_out == NULL) return; + + while(!feof(f)) + { + if(fgets(buf,sizeof(buf),f) == NULL) + break; + + p = (unsigned char *)buf; + while(*p > ' ') p++; + *p = 0; + fprintf(f_out,"%s . . .\n",buf); + } + fclose(f); + fclose(f_out); +} + +void Test3() +{ + espeak_VOICE voicespec; + espeak_VOICE *newvoice; +int x; + + espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS,100,NULL); + memset(&voicespec,0,sizeof(voicespec)); + voicespec.languages = "de"; + espeak_SetVoiceByProperties(&voicespec); + newvoice = espeak_GetCurrentVoice(); + x = 1; +} +#endif + + +void TestTest(int control) +{//======================= + FILE *f; + unsigned int c; + unsigned int ix=0; + char textbuf[2000]; + espeak_VOICE voice; + +//FindPhonemesUsed(); +//return; + + +return; + +if(control==2) +{ + return; +} + memset(&voice,0,sizeof(voice)); + + f = fopen("/home/jsd1/speechdata/text/test","r"); + if(f==NULL) + return; + + + while(!feof(f) && (ix < sizeof(textbuf)-2)) + { + c = fgetc(f); + if(!feof(f)) + textbuf[ix++] = c; + } + textbuf[ix] = 0; + fclose(f); + + OpenWaveFile3("/home/jsd1/speechdata/text/test.wav",samplerate); + f_events = fopen("/home/jsd1/speechdata/text/events","w"); + + espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS,100,NULL); + espeak_SetSynthCallback(TestSynthCallback); +// espeak_SetUriCallback(TestUriCallback); + + voice.languages = "fr"; + voice.gender = 0; + voice.age = 0; + voice.variant = 0; + espeak_SetVoiceByName("en"); +// espeak_SetVoiceByProperties(&voice); + espeak_SetParameter(espeakRANGE,0,0); + espeak_Synth(textbuf,ix+1,0,POS_CHARACTER,0,espeakCHARS_8BIT+espeakSSML,NULL,NULL); + +// for(voice.variant = 1; voice.variant < 9; voice.variant++) +// { +// espeak_SetVoiceByProperties(&voice); +// espeak_Synth(textbuf,ix+1,0,POS_CHARACTER,0,espeakCHARS_8BIT+espeakSSML,NULL,NULL); +// } +} + + diff --git a/src/fifo.cpp b/src/fifo.cpp new file mode 100644 index 00000000..3a594970 --- /dev/null +++ b/src/fifo.cpp @@ -0,0 +1,593 @@ +/*************************************************************************** + * Copyright (C) 2007, Gilles Casse * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "speech.h" + +#ifdef USE_ASYNC +// This source file is only used for asynchronious modes + + +// +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fifo.h" +#include "wave.h" +#include "debug.h" + + +//> +// +// wait for my_sem_stop_is_acknowledged\n"); + while ((sem_wait(&my_sem_stop_is_acknowledged) == -1) && errno == EINTR) + { + continue; // Restart when interrupted by handler + } + SHOW_TIME("fifo > get my_sem_stop_is_acknowledged\n"); +} +//> +// locked\n"); + a_error = push(the_command); + SHOW_TIME("fifo_add_command > unlocking\n"); + a_status = pthread_mutex_unlock(&my_mutex); + } + + if (!a_status && !my_command_is_running && (a_error == EE_OK)) + { + // quit when command is actually started + // (for possible forthcoming 'end of command' checks) + SHOW_TIME("fifo_add_command > post my_sem_start_is_required\n"); + sem_post(&my_sem_start_is_required); + int val=1; + while (val) + { + usleep(50000); // TBD: event? + sem_getvalue(&my_sem_start_is_required, &val); + } + } + + if (a_status != 0) + { + a_error = EE_INTERNAL_ERROR; + } + + SHOW_TIME("LEAVE fifo_add_command"); + return a_error; +} + +//> +// locked\n"); + + if (node_counter+1 >= MAX_NODE_COUNTER) + { + SHOW("push > %s\n", "EE_BUFFER_FULL"); + a_error = EE_BUFFER_FULL; + } + else + { + push(command1); + push(command2); + } + SHOW_TIME("fifo_add_command > unlocking\n"); + a_status = pthread_mutex_unlock(&my_mutex); + } + + if (!a_status && !my_command_is_running && (a_error == EE_OK)) + { + // quit when one command is actually started + // (for possible forthcoming 'end of command' checks) + SHOW_TIME("fifo_add_command > post my_sem_start_is_required\n"); + sem_post(&my_sem_start_is_required); + int val=1; + while (val) + { + usleep(50000); // TBD: event? + sem_getvalue(&my_sem_start_is_required, &val); + } + } + + if (a_status != 0) + { + a_error = EE_INTERNAL_ERROR; + } + + SHOW_TIME("LEAVE fifo_add_commands"); + return a_error; +} + +//> +// locked\n"); + if (a_status != 0) + { + return EE_INTERNAL_ERROR; + } + + if (my_command_is_running) + { + a_command_is_running = 1; + my_stop_is_required = 1; + SHOW_TIME("fifo_stop > my_stop_is_required = 1\n"); + } + SHOW_TIME("fifo_stop > unlocking\n"); + a_status = pthread_mutex_unlock(&my_mutex); + if (a_status != 0) + { + return EE_INTERNAL_ERROR; + } + + if (a_command_is_running) + { + SHOW_TIME("fifo_stop > wait for my_sem_stop_is_acknowledged\n"); + while ((sem_wait(&my_sem_stop_is_acknowledged) == -1) && errno == EINTR) + { + continue; // Restart when interrupted by handler + } + SHOW_TIME("fifo_stop > get my_sem_stop_is_acknowledged\n"); + } + + SHOW_TIME("fifo_stop > my_stop_is_required = 0\n"); + my_stop_is_required = 0; + SHOW_TIME("LEAVE fifo_stop\n"); + + return EE_OK; +} + +//> + +// aResult = %d\n",my_command_is_running); + return my_command_is_running; +} + +// int pause () +// { +// ENTER("pause"); +// // TBD +// // if (espeakPause (espeakHandle, 1)) +// return true; +// } + +// int resume () +// { +// ENTER("resume"); +// // TBD +// // if (espeakPause (espeakHandle, 0)) +// return true; +// } +//> + + +// sleep_until_start_request_or_inactivity > ENTER"); + int a_start_is_required=0; + + // Wait for the start request (my_sem_start_is_required). + // Besides this, if the audio stream is still busy, + // check from time to time its end. + // The end of the stream is confirmed by several checks + // for filtering underflow. + // + int i=0; + while((i<= MAX_INACTIVITY_CHECK) && !a_start_is_required) + { + if (wave_is_busy( NULL) ) + { + i = 0; + } + else + { + i++; + } + + int err=0; + struct timespec ts, to; + struct timeval tv; + + clock_gettime2( &ts); + to.tv_sec = ts.tv_sec; + to.tv_nsec = ts.tv_nsec; + + add_time_in_ms( &ts, INACTIVITY_TIMEOUT); + + SHOW("fifo > sleep_until_start_request_or_inactivity > start sem_timedwait (start_is_required) from %d.%09lu to %d.%09lu \n", + to.tv_sec, to.tv_nsec, + ts.tv_sec, ts.tv_nsec); + + while ((err = sem_timedwait(&my_sem_start_is_required, &ts)) == -1 + && errno == EINTR) + { + continue; + } + + assert (gettimeofday(&tv, NULL) != -1); + SHOW("fifo > sleep_until_start_request_or_inactivity > stop sem_timedwait (start_is_required, err=%d) %d.%09lu \n", err, + tv.tv_sec, tv.tv_usec*1000); + + if (err==0) + { + a_start_is_required = 1; + } + } + SHOW_TIME("fifo > sleep_until_start_request_or_inactivity > LEAVE"); + return a_start_is_required; +} + +//> +// close_stream > ENTER\n"); + + // Warning: a wave_close can be already required by + // an external command (espeak_Cancel + fifo_stop), if so: + // my_stop_is_required = 1; + + int a_status = pthread_mutex_lock(&my_mutex); + assert (!a_status); + int a_stop_is_required = my_stop_is_required; + if (!a_stop_is_required) + { + my_command_is_running = 1; + } + a_status = pthread_mutex_unlock(&my_mutex); + + if (!a_stop_is_required) + { + wave_close(NULL); + + int a_status = pthread_mutex_lock(&my_mutex); + assert (!a_status); + my_command_is_running = 0; + + a_stop_is_required = my_stop_is_required; + a_status = pthread_mutex_unlock(&my_mutex); + + if (a_stop_is_required) + { + // acknowledge the stop request + SHOW_TIME("fifo > close_stream > post my_sem_stop_is_acknowledged\n"); + int a_status = sem_post(&my_sem_stop_is_acknowledged); + assert( a_status != -1); + } + } + + SHOW_TIME("fifo > close_stream > LEAVE\n"); +} + +//> +// post my_sem_stop_is_acknowledged\n"); + + // announce that thread is started + sem_post(&my_sem_stop_is_acknowledged); + + int look_for_inactivity=0; + + while(1) + { + SHOW_TIME("say_thread > wait for my_sem_start_is_required\n"); + + int a_start_is_required = 0; + if (look_for_inactivity) + { + a_start_is_required = sleep_until_start_request_or_inactivity(); + if (!a_start_is_required) + { + close_stream(); + } + } + look_for_inactivity = 1; + + if (!a_start_is_required) + { + while ((sem_wait(&my_sem_start_is_required) == -1) && errno == EINTR) + { + continue; // Restart when interrupted by handler + } + } + SHOW_TIME("say_thread > get my_sem_start_is_required\n"); + + SHOW_TIME("say_thread > my_command_is_running = 1\n"); + my_command_is_running = 1; + + while( my_command_is_running) + { + SHOW_TIME("say_thread > locking\n"); + int a_status = pthread_mutex_lock(&my_mutex); + assert (!a_status); + t_espeak_command* a_command = (t_espeak_command*)pop(); + + if (a_command == NULL) + { + SHOW_TIME("say_thread > text empty (talking=0) \n"); + a_status = pthread_mutex_unlock(&my_mutex); + SHOW_TIME("say_thread > unlocked\n"); + SHOW_TIME("say_thread > my_command_is_running = 0\n"); + my_command_is_running = 0; + } + else + { + display_espeak_command(a_command); + // purge start semaphore + SHOW_TIME("say_thread > purge my_sem_start_is_required\n"); + while(0 == sem_trywait(&my_sem_start_is_required)) + { + }; + + if (my_stop_is_required) + { + SHOW_TIME("say_thread > my_command_is_running = 0\n"); + my_command_is_running = 0; + } + SHOW_TIME("say_thread > unlocking\n"); + a_status = pthread_mutex_unlock(&my_mutex); + + if (my_command_is_running) + { + process_espeak_command(a_command); + } + delete_espeak_command(a_command); + } + } + + if (my_stop_is_required) + { + // no mutex required since the stop command is synchronous + // and waiting for my_sem_stop_is_acknowledged + init(); + + // purge start semaphore + SHOW_TIME("say_thread > purge my_sem_start_is_required\n"); + while(0==sem_trywait(&my_sem_start_is_required)) + { + }; + + // acknowledge the stop request + SHOW_TIME("say_thread > post my_sem_stop_is_acknowledged\n"); + int a_status = sem_post(&my_sem_stop_is_acknowledged); + assert( a_status != -1); + } + // and wait for the next start + SHOW_TIME("say_thread > wait for my_sem_start_is_required\n"); + } + + return NULL; +} + +int fifo_is_command_enabled() +{ + SHOW("ENTER fifo_is_command_enabled=%d\n",(int)(0 == my_stop_is_required)); + return (0 == my_stop_is_required); +} + +//> +// push"); + + assert((!head && !tail) || (head && tail)); + + if (the_command == NULL) + { + SHOW("push > command=0x%x\n", NULL); + return EE_INTERNAL_ERROR; + } + + if (node_counter >= MAX_NODE_COUNTER) + { + SHOW("push > %s\n", "EE_BUFFER_FULL"); + return EE_BUFFER_FULL; + } + + node *n = (node *)malloc(sizeof(node)); + if (n == NULL) + { + return EE_INTERNAL_ERROR; + } + + if (head == NULL) + { + head = n; + tail = n; + } + else + { + tail->next = n; + tail = n; + } + + tail->next = NULL; + tail->data = the_command; + + node_counter++; + SHOW("push > counter=%d\n",node_counter); + + the_command->state = CS_PENDING; + display_espeak_command(the_command); + + return EE_OK; +} + +static t_espeak_command* pop() +{ + ENTER("fifo > pop"); + t_espeak_command* the_command = NULL; + + assert((!head && !tail) || (head && tail)); + + if (head != NULL) + { + node* n = head; + the_command = n->data; + head = n->next; + free(n); + node_counter--; + SHOW("pop > command=0x%x (counter=%d)\n",the_command, node_counter); + } + + if(head == NULL) + { + tail = NULL; + } + + display_espeak_command(the_command); + + return the_command; +} + + +static void init() +{ + ENTER("fifo > init"); + while (delete_espeak_command( pop() )) + {} + node_counter = 0; +} + +//> +// + diff --git a/src/fifo.h b/src/fifo.h new file mode 100644 index 00000000..b3699ff9 --- /dev/null +++ b/src/fifo.h @@ -0,0 +1,58 @@ +#ifndef FIFO_H +#define FIFO_H + +// Helps to add espeak commands in a first-in first-out queue +// and run them asynchronously. + +#include "espeak_command.h" +#include "speak_lib.h" + +// Initialize the fifo component. +// First function to be called. +void fifo_init(); + +// Add an espeak command. +// +// Note: this function fails if too many commands are already buffered. +// In such a case, the calling function could wait and then add again its command. +// +// Return: EE_OK: operation achieved +// EE_BUFFER_FULL: the command can not be buffered; +// you may try after a while to call the function again. +// EE_INTERNAL_ERROR. +espeak_ERROR fifo_add_command (t_espeak_command* c); + +// Add two espeak commands in a single transaction. +// +// Note: this function fails if too many commands are already buffered. +// In such a case, the calling function could wait and then add again these commands. +// +// Return: EE_OK: operation achieved +// EE_BUFFER_FULL: at least one command can not be buffered; +// you may try after a while to call the function again. +// EE_INTERNAL_ERROR. +espeak_ERROR fifo_add_commands (t_espeak_command* c1, t_espeak_command* c2); + +// The current running command must be stopped and the awaiting commands are cleared. +// Return: EE_OK: operation achieved +// EE_INTERNAL_ERROR. +espeak_ERROR fifo_stop (); + +// Is there a running command? +// Returns 1 if yes; 0 otherwise. +int fifo_is_busy (); + +// Terminate the fifo component. +// Last function to be called. +void fifo_terminate(); + +// Indicates if the running command is still enabled. +// +// Note: this function is mainly called by the SynthCallback (speak_lib.cpp) +// It indicates if the actual wave sample can still be played. It is helpful for +// stopping speech as soon as a cancel command is applied. +// +// Returns 1 if yes, or 0 otherwise. +int fifo_is_command_enabled(); + +#endif diff --git a/src/formantdlg.cpp b/src/formantdlg.cpp new file mode 100755 index 00000000..6c87c595 --- /dev/null +++ b/src/formantdlg.cpp @@ -0,0 +1,370 @@ +/*************************************************************************** + * Copyright (C) 2005, 2006 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wx.h" +#include "wx/mdi.h" + + +#include "main.h" +#include "speech.h" +#include "voice.h" +#include "spect.h" + +#include "wx/textctrl.h" +#include "wx/checkbox.h" + +FormantDlg *formantdlg=NULL; +ByteGraph *pitchgraph=NULL; + + + +BEGIN_EVENT_TABLE(FormantDlg, wxPanel) + EVT_BUTTON(T_ZOOMOUT,FormantDlg::OnCommand) + EVT_BUTTON(T_ZOOMIN,FormantDlg::OnCommand) + EVT_SPINCTRL(T_AMPLITUDE,FormantDlg::OnSpin) + EVT_SPINCTRL(T_TIMESEQ,FormantDlg::OnSpin) + EVT_SPINCTRL(T_AMPFRAME,FormantDlg::OnSpin) + EVT_SPINCTRL(T_TIMEFRAME,FormantDlg::OnSpin) +END_EVENT_TABLE() + + +void FormantDlg::OnCommand(wxCommandEvent& event) +{//============================================= + int id; + + switch(id = event.GetId()) + { + case T_ZOOMIN: + case T_ZOOMOUT: + currentcanvas->OnZoom(id); + break; + + case T_AMPLITUDE: + currentcanvas->RefreshDialogValues(0); + break; + + case T_TIMEFRAME: + case T_AMPFRAME: + currentcanvas->RefreshDialogValues(1); + break; + } + currentcanvas->SetFocus(); +} + +void FormantDlg::OnSpin(wxSpinEvent& event) +{//============================================= + int id; + + switch(id = event.GetId()) + { + case T_AMPLITUDE: + case T_TIMESEQ: + case T_TIMEFRAME: + currentcanvas->RefreshDialogValues(0); + break; + + case T_AMPFRAME: + currentcanvas->RefreshDialogValues(1); + break; + } + currentcanvas->SetFocus(); +} + +FormantDlg::FormantDlg(wxWindow *parent) : wxPanel(parent,-1,wxDefaultPosition,wxSize(400,1000)) +{//========================================================================== + int ix; + int y; + int xplace; + int id; + wxString string; + + y = 24; + xplace = 28; + id = 201; + new wxStaticText(this,-1,_T("Formants"),wxPoint(4,5)); + + for(ix=0; ix5) t_pkwidth[ix]->Hide(); + } + + t_ampframe = new wxSpinCtrl(this,T_AMPFRAME,_T(""), + wxPoint(6,244),wxSize(52,24),wxTE_CENTRE,0,500); + t_lab[3] = new wxStaticText(this,-1,_T("% amp - Frame"),wxPoint(61,248)); + t_timeframe = new wxSpinCtrl(this,T_TIMEFRAME,_T(""), + wxPoint(6,272),wxSize(52,24),wxTE_CENTRE,0,500); + t_orig_frame = new wxStaticText(this,-1,_T("mS"),wxPoint(61,276)); + + t_zoomout = new wxButton(this,T_ZOOMOUT,_T("Zoom-"),wxPoint(16,310)); + t_zoomin = new wxButton(this,T_ZOOMIN,_T("Zoom+"),wxPoint(106,310)); + + +// usepitchenv = new wxCheckBox(this,T_USEPITCHENV,_T("???"),wxPoint(20,320)); + + t_amplitude = new wxSpinCtrl(this,T_AMPLITUDE,_T(""), + wxPoint(6,370),wxSize(52,24),wxTE_CENTRE,0,500); + t_lab[2] = new wxStaticText(this,-1,_T("% amp - Sequence"),wxPoint(61,374)); +// t_timeseq = new wxSpinCtrl(this,T_TIMESEQ,_T(""), +// wxPoint(6,400),wxSize(52,24),wxTE_CENTRE,0,500); + t_orig_seq = new wxStaticText(this,-1,_T("mS"),wxPoint(61,404)); + + t_pitch = new wxStaticText(this,-1,_T(""),wxPoint(4,440),wxSize(192,24)); + + pitchgraph = new ByteGraph(this,wxPoint(0,460),wxSize(200,140)); + pitchgraph->SetData(128,env_fall); + pitchgraph->ShowSpectrum(1); + pitchgraph->Show(); +} + + + +void FormantDlg::ShowFrame(SpectSeq *spectseq, int frame, int pk, int field) +{//============================================================== + int ix; + SpectFrame *sf; + wxString value; + int original_mS; + + if(spectseq->frames == NULL) + return; + sf = spectseq->frames[frame]; + + if(field == 0xff) + { + // indicate the selected peak +// t_select_peak[pk]->SetValue(TRUE); + } + + for(ix=0; ixSetLabel(value); + } + + if(field & 1) + { + value.Printf(_T("%4d"),sf->peaks[ix].pkfreq); + t_pkfreq[ix]->SetValue(value); + } + if(field & 2) + { + value.Printf(_T("%3d"),sf->peaks[ix].pkheight >> 6); + t_pkheight[ix]->SetValue(value); + } + if(field & 4) + { + value.Printf(_T("%3d"),sf->peaks[ix].pkwidth); + t_pkwidth[ix]->SetValue(value); +#ifdef WIDTH2 + value.Printf(_T("%3d"),sf->peaks[ix].pkright); + t_pkright[ix]->SetValue(value); +#endif + } + } + + // find the time until the next keyframe + SetSpinCtrl(t_timeframe,int(spectseq->GetFrameLength(frame,1,&original_mS)+0.5)); // round to nearest integer + value.Printf(_T("%d mS"),original_mS); + t_orig_frame->SetLabel(value); + value.Printf(_T("%3d"),sf->amp_adjust); + t_ampframe->SetValue(value); +} // end of FormantDlg::ShowFrame + + +BEGIN_EVENT_TABLE(ByteGraph,wxScrolledWindow) + EVT_LEFT_DOWN(ByteGraph::OnMouse) +END_EVENT_TABLE() + +static wxBrush BRUSH_FORMANT(wxColour(255,100,50),wxSOLID); +static wxPen PEN_KEYFRAME(wxColour(255,220,100),2,wxSOLID); +static wxPen PEN_KEYFORMANT(wxColour(0,0,0),2,wxSOLID); + + +ByteGraph::ByteGraph(wxWindow *parent, const wxPoint& pos, const wxSize &size): + wxScrolledWindow(parent,-1,pos,size,wxSUNKEN_BORDER) +{//============================================================ + npoints = 0; + show_spectrum = 0; +} // end of ByteGraph::ByteGraph + + +void ByteGraph::SetData(int nx, unsigned char *data) +{//================================================= + npoints = nx; + graph = data; + Refresh(); +} // end of ByteGraph::SetData + + +void ByteGraph::ShowSpectrum(int yes) +{//================================== + show_spectrum = yes; +} + + +void ByteGraph::DrawSpectrum(wxDC& dc) +{//=================================== + SpectSeq *seq; + SpectFrame *sf; + int ix; + int x, y; + int pk; + double length; + int numframes; + int width, height; + double xscale, yscale; + + spectrum_scale = 0; + if(currentcanvas==NULL) return; + if((seq = currentcanvas->spectseq) == NULL) return; + numframes = seq->numframes; + + if(numframes == 0) return; + + GetClientSize(&width,&height); + + if(((length = seq->frames[numframes-1]->time)==0) && (numframes>1)) + length = seq->frames[numframes-2]->time; + + length = length - seq->frames[0]->time; + + yscale = height/3000.0; + spectrum_scale = xscale = width/length; + + dc.SetBrush(BRUSH_FORMANT); + dc.SetPen(*wxTRANSPARENT_PEN); + for(ix=0; ixframes[ix]; + x = int(sf->time*xscale); + + if(sf->keyframe) + { + dc.SetPen(PEN_KEYFRAME); + dc.DrawLine(x,0,x,height); + } + + dc.SetPen(*wxTRANSPARENT_PEN); + dc.DrawCircle(x,int(height-(sf->formants[1].freq-200)*yscale),3); + dc.DrawCircle(x,int(height-(sf->formants[2].freq-200)*yscale),3); + dc.DrawCircle(x,int(height-(sf->formants[3].freq-200)*yscale),3); + + if(sf->keyframe) + { + dc.SetPen(PEN_KEYFORMANT); + for(pk=1; pk<6; pk++) + { + y = height-int((sf->peaks[pk].pkfreq-200)*yscale); + dc.DrawLine(x-3,y,x+3,y); + } + } + } +} + + +void ByteGraph::OnDraw(wxDC &dc) +{//============================ + int x, y, x2, y2, ix; + int width, height; + double xscale, yscale; + + if(show_spectrum) DrawSpectrum(dc); + + if(npoints==0) return; + + GetClientSize(&width,&height); + + xscale = double(width) / npoints; + yscale = double(height) / 256.0; + + if(npoints > 8) + { + // draw pitch profile + dc.SetPen(*wxMEDIUM_GREY_PEN); + x = 0; + y = height - int(graph[0]*yscale); + for(ix=1; ixspectseq) == NULL) return; + + wxClientDC dc(this); + PrepareDC(dc); + + wxPoint pt(event.GetLogicalPosition(dc)); + t0 = t2 = seq->frames[0]->time; + time = (double(pt.x) / spectrum_scale) + t0; + + for(ix=1; ixnumframes; ix++) + { + t1=t2; + t2 = seq->frames[ix]->time; + if(time <= t1 + (t2-t1)/2) + { + currentcanvas->SelectFrame(ix-1); + break; + } + } +} // end of ByteGraph::OnMouse + diff --git a/src/intonation.cpp b/src/intonation.cpp new file mode 100755 index 00000000..d9b8d511 --- /dev/null +++ b/src/intonation.cpp @@ -0,0 +1,1021 @@ +/*************************************************************************** + * Copyright (C) 2005, 2006 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "StdAfx.h" + +#include +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "voice.h" +#include "phoneme.h" +#include "synthesize.h" +#include "translate.h" + + +/* Note this module is mostly old code that needs to be rewritten to + provide a more flexible intonation system. +*/ + +static int tone_pitch_env; /* used to return pitch envelope */ +static int pitch_base = 128; +static int pitch_range = 128; + + +static int vowel_ix; +static int vowel_ix_top; +static int *vowel_tab; + + +/* Pitch data for tone types */ +/*****************************/ + + +#define PITCHfall 0 +#define PITCHrise 1 +#define PITCHfrise 2 // and 3 must be for the varient preceded by 'r' +#define PITCHfrise2 4 // and 5 must be the 'r' variant +#define PITCHdrop 6 +#define PITCHdrop2 8 +//#define PITCHsemi_r 10 +//#define PITCH1fall 11 +//#define PITCH1fall2 12 + +/* 0 fall */ +unsigned char env_fall[128] = { + 0xff, 0xfd, 0xfa, 0xf8, 0xf6, 0xf4, 0xf2, 0xf0, 0xee, 0xec, 0xea, 0xe8, 0xe6, 0xe4, 0xe2, 0xe0, + 0xde, 0xdc, 0xda, 0xd8, 0xd6, 0xd4, 0xd2, 0xd0, 0xce, 0xcc, 0xca, 0xc8, 0xc6, 0xc4, 0xc2, 0xc0, + 0xbe, 0xbc, 0xba, 0xb8, 0xb6, 0xb4, 0xb2, 0xb0, 0xae, 0xac, 0xaa, 0xa8, 0xa6, 0xa4, 0xa2, 0xa0, + 0x9e, 0x9c, 0x9a, 0x98, 0x96, 0x94, 0x92, 0x90, 0x8e, 0x8c, 0x8a, 0x88, 0x86, 0x84, 0x82, 0x80, + 0x7e, 0x7c, 0x7a, 0x78, 0x76, 0x74, 0x72, 0x70, 0x6e, 0x6c, 0x6a, 0x68, 0x66, 0x64, 0x62, 0x60, + 0x5e, 0x5c, 0x5a, 0x58, 0x56, 0x54, 0x52, 0x50, 0x4e, 0x4c, 0x4a, 0x48, 0x46, 0x44, 0x42, 0x40, + 0x3e, 0x3c, 0x3a, 0x38, 0x36, 0x34, 0x32, 0x30, 0x2e, 0x2c, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20, + 0x1e, 0x1c, 0x1a, 0x18, 0x16, 0x14, 0x12, 0x10, 0x0e, 0x0c, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x00 }; + +/* 1 rise */ +unsigned char env_rise[128] = { + 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, + 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, + 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, + 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, + 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, + 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, + 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, + 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfd, 0xff }; + +unsigned char env_frise[128] = { + 0xff, 0xf4, 0xea, 0xe0, 0xd6, 0xcc, 0xc3, 0xba, 0xb1, 0xa8, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x78, + 0x71, 0x6a, 0x63, 0x5c, 0x56, 0x50, 0x4a, 0x44, 0x3f, 0x39, 0x34, 0x2f, 0x2b, 0x26, 0x22, 0x1e, + 0x1a, 0x17, 0x13, 0x10, 0x0d, 0x0b, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x13, 0x15, 0x17, + 0x1a, 0x1d, 0x1f, 0x22, 0x25, 0x28, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x39, 0x3b, 0x3d, 0x40, + 0x42, 0x45, 0x47, 0x4a, 0x4c, 0x4f, 0x51, 0x54, 0x57, 0x5a, 0x5d, 0x5f, 0x62, 0x65, 0x68, 0x6b, + 0x6e, 0x71, 0x74, 0x78, 0x7b, 0x7e, 0x81, 0x85, 0x88, 0x8b, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa0, + 0xa4, 0xa8, 0xac, 0xaf, 0xb3, 0xb7, 0xbb, 0xbf, 0xc3, 0xc7, 0xcb, 0xcf, 0xd3, 0xd7, 0xdb, 0xe0 }; + +static unsigned char env_r_frise[128] = { + 0xcf, 0xcc, 0xc9, 0xc6, 0xc3, 0xc0, 0xbd, 0xb9, 0xb4, 0xb0, 0xab, 0xa7, 0xa2, 0x9c, 0x97, 0x92, + 0x8c, 0x86, 0x81, 0x7b, 0x75, 0x6f, 0x69, 0x63, 0x5d, 0x57, 0x50, 0x4a, 0x44, 0x3e, 0x38, 0x33, + 0x2d, 0x27, 0x22, 0x1c, 0x17, 0x12, 0x0d, 0x08, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x0a, 0x0c, 0x0d, 0x0f, 0x12, 0x14, 0x16, + 0x19, 0x1b, 0x1e, 0x21, 0x24, 0x27, 0x2a, 0x2d, 0x30, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3f, 0x41, + 0x43, 0x46, 0x48, 0x4b, 0x4d, 0x50, 0x52, 0x55, 0x58, 0x5a, 0x5d, 0x60, 0x63, 0x66, 0x69, 0x6c, + 0x6f, 0x72, 0x75, 0x78, 0x7b, 0x7e, 0x81, 0x85, 0x88, 0x8b, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa0, + 0xa4, 0xa8, 0xac, 0xaf, 0xb3, 0xb7, 0xbb, 0xbf, 0xc3, 0xc7, 0xcb, 0xcf, 0xd3, 0xd7, 0xdb, 0xe0 }; + +static unsigned char env_frise2[128] = { + 0xff, 0xf9, 0xf4, 0xee, 0xe9, 0xe4, 0xdf, 0xda, 0xd5, 0xd0, 0xcb, 0xc6, 0xc1, 0xbd, 0xb8, 0xb3, + 0xaf, 0xaa, 0xa6, 0xa1, 0x9d, 0x99, 0x95, 0x90, 0x8c, 0x88, 0x84, 0x80, 0x7d, 0x79, 0x75, 0x71, + 0x6e, 0x6a, 0x67, 0x63, 0x60, 0x5d, 0x59, 0x56, 0x53, 0x50, 0x4d, 0x4a, 0x47, 0x44, 0x41, 0x3e, + 0x3c, 0x39, 0x37, 0x34, 0x32, 0x2f, 0x2d, 0x2b, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1e, 0x1c, 0x1a, + 0x19, 0x17, 0x15, 0x14, 0x12, 0x11, 0x0f, 0x0e, 0x0d, 0x0c, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, + 0x05, 0x04, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x04, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x12, 0x13, 0x15, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20 }; + +static unsigned char env_r_frise2[128] = { + 0xd0, 0xce, 0xcd, 0xcc, 0xca, 0xc8, 0xc7, 0xc5, 0xc3, 0xc1, 0xc0, 0xbd, 0xbb, 0xb8, 0xb5, 0xb3, + 0xb0, 0xad, 0xaa, 0xa7, 0xa3, 0xa0, 0x9d, 0x99, 0x96, 0x92, 0x8f, 0x8b, 0x87, 0x84, 0x80, 0x7c, + 0x78, 0x74, 0x70, 0x6d, 0x69, 0x65, 0x61, 0x5d, 0x59, 0x55, 0x51, 0x4d, 0x4a, 0x46, 0x42, 0x3e, + 0x3b, 0x37, 0x34, 0x31, 0x2f, 0x2d, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1e, 0x1c, 0x1a, 0x19, + 0x17, 0x15, 0x14, 0x12, 0x11, 0x0f, 0x0e, 0x0d, 0x0c, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x05, + 0x04, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x04, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x12, 0x13, 0x15, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20 }; + + +/* +unsigned char env_drop[128] = { + 0xff, 0xf9, 0xf4, 0xee, 0xe9, 0xe4, 0xdf, 0xda, 0xd5, 0xd0, 0xcb, 0xc6, 0xc1, 0xbc, 0xb8, 0xb3, + 0xaf, 0xaa, 0xa6, 0xa2, 0x9d, 0x99, 0x95, 0x91, 0x8d, 0x89, 0x85, 0x81, 0x7d, 0x79, 0x76, 0x72, + 0x6f, 0x6b, 0x68, 0x64, 0x61, 0x5e, 0x5b, 0x58, 0x55, 0x52, 0x4f, 0x4c, 0x49, 0x46, 0x44, 0x41, + 0x3e, 0x3c, 0x39, 0x37, 0x35, 0x33, 0x30, 0x2e, 0x2c, 0x2a, 0x28, 0x27, 0x25, 0x23, 0x21, 0x20, + 0x1e, 0x1d, 0x1b, 0x1a, 0x19, 0x18, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x10, 0x0f, 0x0e, + 0x0e, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x14, + 0x15, 0x16, 0x17, 0x19, 0x1a, 0x1b, 0x1d, 0x1e, 0x20, 0x21, 0x23, 0x24, 0x26, 0x28, 0x2a, 0x2c }; + + +unsigned char env_r_drop[128] = { + 0xcf, 0xce, 0xcd, 0xcc, 0xcb, 0xca, 0xc8, 0xc6, 0xc5, 0xc3, 0xc1, 0xbe, 0xbc, 0xb9, 0xb7, 0xb4, + 0xb1, 0xae, 0xab, 0xa8, 0xa5, 0xa2, 0x9e, 0x9b, 0x97, 0x94, 0x90, 0x8c, 0x89, 0x85, 0x81, 0x7d, + 0x79, 0x75, 0x71, 0x6d, 0x69, 0x65, 0x61, 0x5d, 0x59, 0x55, 0x51, 0x4e, 0x4a, 0x46, 0x42, 0x3e, + 0x3b, 0x38, 0x36, 0x34, 0x32, 0x30, 0x2e, 0x2c, 0x2b, 0x29, 0x27, 0x25, 0x24, 0x22, 0x21, 0x1f, + 0x1e, 0x1c, 0x1b, 0x1a, 0x19, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x11, 0x10, 0x0f, 0x0e, + 0x0e, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x11, 0x12, 0x13, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x23, 0x24, 0x26, 0x28 }; + + +unsigned char env_drop2[128] = { + 0xff, 0xfc, 0xf9, 0xf6, 0xf3, 0xf0, 0xed, 0xea, 0xe7, 0xe5, 0xe2, 0xdf, 0xdc, 0xda, 0xd7, 0xd5, + 0xd2, 0xcf, 0xcd, 0xca, 0xc8, 0xc5, 0xc3, 0xc0, 0xbe, 0xbc, 0xb9, 0xb7, 0xb4, 0xb2, 0xb0, 0xae, + 0xab, 0xa9, 0xa7, 0xa5, 0xa3, 0xa1, 0x9f, 0x9d, 0x9b, 0x99, 0x97, 0x95, 0x93, 0x91, 0x8f, 0x8d, + 0x8b, 0x89, 0x88, 0x86, 0x84, 0x83, 0x81, 0x7f, 0x7e, 0x7c, 0x7a, 0x79, 0x77, 0x76, 0x74, 0x73, + 0x71, 0x70, 0x6f, 0x6d, 0x6c, 0x6a, 0x69, 0x68, 0x67, 0x65, 0x64, 0x63, 0x62, 0x61, 0x60, 0x5f, + 0x5e, 0x5d, 0x5c, 0x5b, 0x5a, 0x59, 0x58, 0x57, 0x56, 0x55, 0x54, 0x54, 0x53, 0x52, 0x51, 0x51, + 0x50, 0x4f, 0x4f, 0x4e, 0x4e, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b, 0x4a, 0x4a, 0x4a, 0x49, 0x49, + 0x49, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x48 }; + +unsigned char env_r_drop2[128] = { + 0xcf, 0xce, 0xcd, 0xcd, 0xcc, 0xcb, 0xcb, 0xca, 0xc9, 0xc8, 0xc7, 0xc6, 0xc5, 0xc4, 0xc3, 0xc2, + 0xc1, 0xc0, 0xbf, 0xbd, 0xbc, 0xbb, 0xba, 0xb8, 0xb7, 0xb6, 0xb4, 0xb3, 0xb2, 0xb0, 0xaf, 0xad, + 0xac, 0xaa, 0xa9, 0xa7, 0xa6, 0xa4, 0xa3, 0xa1, 0x9f, 0x9e, 0x9c, 0x9a, 0x99, 0x97, 0x96, 0x94, + 0x92, 0x91, 0x8f, 0x8d, 0x8c, 0x8a, 0x88, 0x87, 0x85, 0x83, 0x82, 0x80, 0x7e, 0x7d, 0x7b, 0x7a, + 0x78, 0x76, 0x75, 0x73, 0x72, 0x70, 0x6f, 0x6d, 0x6c, 0x6b, 0x6a, 0x69, 0x68, 0x68, 0x67, 0x66, + 0x65, 0x64, 0x63, 0x62, 0x61, 0x60, 0x5f, 0x5f, 0x5e, 0x5d, 0x5c, 0x5b, 0x5b, 0x5a, 0x59, 0x58, + 0x58, 0x57, 0x56, 0x56, 0x55, 0x54, 0x54, 0x53, 0x52, 0x52, 0x51, 0x51, 0x50, 0x4f, 0x4f, 0x4e, + 0x4e, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b, 0x4b, 0x4a, 0x4a, 0x49, 0x49, 0x49, 0x48, 0x48, 0x48 }; + + +// 10 semi_r +unsigned char env_semi_r[128] = { + 0x00, 0x01, 0x02, 0x04, 0x05, 0x07, 0x08, 0x09, 0x0b, 0x0c, 0x0e, 0x0f, 0x11, 0x12, 0x14, 0x15, + 0x17, 0x18, 0x1a, 0x1b, 0x1d, 0x1f, 0x20, 0x22, 0x23, 0x25, 0x27, 0x28, 0x2a, 0x2c, 0x2d, 0x2f, + 0x31, 0x33, 0x35, 0x37, 0x39, 0x3b, 0x3d, 0x3f, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, + 0x52, 0x54, 0x57, 0x59, 0x5b, 0x5d, 0x5f, 0x61, 0x63, 0x65, 0x67, 0x69, 0x6c, 0x6e, 0x70, 0x72, + 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, 0x80, 0x82, 0x84, 0x86, 0x87, 0x89, 0x8b, 0x8d, 0x8f, 0x90, + 0x92, 0x94, 0x96, 0x97, 0x99, 0x9b, 0x9c, 0x9e, 0x9f, 0xa1, 0xa2, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xad, 0xae, 0xaf, 0xb0, 0xb0, 0xb1, 0xb2, 0xb2, 0xb3, 0xb3, + 0xb4, 0xb4, 0xb4, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb6, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb8 }; + + +// 11 drop3 +unsigned char env_drop3[128] = { + 0xff, 0xf8, 0xf2, 0xec, 0xe7, 0xe1, 0xdb, 0xd5, 0xd0, 0xca, 0xc5, 0xc0, 0xbb, 0xb5, 0xb1, 0xac, + 0xa7, 0xa3, 0x9e, 0x9b, 0x97, 0x93, 0x90, 0x8c, 0x89, 0x86, 0x83, 0x80, 0x7d, 0x7b, 0x78, 0x76, + 0x73, 0x71, 0x6f, 0x6d, 0x6b, 0x68, 0x66, 0x64, 0x62, 0x5f, 0x5d, 0x5b, 0x59, 0x57, 0x56, 0x54, + 0x52, 0x50, 0x4e, 0x4d, 0x4b, 0x49, 0x48, 0x46, 0x44, 0x43, 0x41, 0x40, 0x3e, 0x3d, 0x3b, 0x3a, + 0x39, 0x37, 0x35, 0x34, 0x32, 0x31, 0x2f, 0x2d, 0x2c, 0x2a, 0x29, 0x28, 0x26, 0x25, 0x23, 0x22, + 0x21, 0x1f, 0x1e, 0x1d, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, + 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x0a, 0x09, 0x08, 0x08, 0x07, 0x06, 0x06, 0x05, 0x05, 0x04, + 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +// 12 r_drop3 +unsigned char env_r_drop3[128] = { + 0xcf, 0xce, 0xcd, 0xcc, 0xcb, 0xca, 0xc8, 0xc7, 0xc5, 0xc4, 0xc2, 0xc0, 0xbe, 0xbc, 0xba, 0xb8, + 0xb5, 0xb3, 0xb1, 0xae, 0xac, 0xa9, 0xa6, 0xa4, 0xa1, 0x9e, 0x9b, 0x98, 0x95, 0x92, 0x8f, 0x8c, + 0x89, 0x86, 0x83, 0x80, 0x7d, 0x7a, 0x76, 0x73, 0x70, 0x6d, 0x6a, 0x67, 0x63, 0x60, 0x5d, 0x5a, + 0x57, 0x54, 0x51, 0x4e, 0x4b, 0x48, 0x45, 0x43, 0x40, 0x3d, 0x3b, 0x39, 0x37, 0x36, 0x34, 0x33, + 0x32, 0x30, 0x2f, 0x2d, 0x2c, 0x2b, 0x2a, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20, + 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, + 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0c, 0x0b, 0x0b, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x07, 0x06, + 0x06, 0x05, 0x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00 }; +*/ + + // long vowel fall +static unsigned char env_long_fall[128] = { + 254,249,250,251,252,253,254,254, 255,255,255,255,254,254,253,252, + 251,250,249,247,244,242,238,234, 230,225,221,217,213,209,206,203, + 199,195,191,187,183,179,175,172, 168,165,162,159,156,153,150,148, + 145,143,140,138,136,134,132,130, 128,126,123,120,117,114,111,107, + 104,100,96,91, 86,82,77,73, 70,66,63,60, 58,55,53,51, + 49,47,46,45, 43,42,40,38, 36,34,31,28, 26,24,22,20, + 18,16,14,12, 11,10,9,8, 8,8,8,8, 9,8,8,8, + 8,8,7,7, 6,6,6,5, 4,4,3,3, 2,1,1,0 }; + + + + + + +unsigned char *envelope_data[16] = { + env_fall, env_rise, env_frise, env_r_frise, + env_frise2, env_r_frise2, + + env_long_fall, env_long_fall, env_fall, env_fall, + env_fall, env_fall, env_fall, env_fall, + env_fall, env_fall + }; + + +/* all pitches given in Hz above pitch_base */ + +// pitch change during the main part of the clause +static int drops_0[8] = {0x400,0x400,0x700,0x700,0x700,0xa00,0x0e00,0x0e00}; +static int drops_1[8] = {0x400,0x400,0x600,0x600,0xc00,0xc00,0x0e00,0x0e00}; +static int drops_2[8] = {0x400,0x400,0x600,0x600,-0x800,0xc00,0x0e00,0x0e00}; + +typedef struct { + unsigned char pitch_env0; /* pitch envelope, tonic syllable at end */ + unsigned char tonic_max0; + unsigned char tonic_min0; + + unsigned char pitch_env1; /* followed by unstressed */ + unsigned char tonic_max1; + unsigned char tonic_min1; + + unsigned char pre_start; + unsigned char pre_end; + + unsigned char body_start; + unsigned char body_end; + + int *body_drops; + unsigned char body_max_steps; + unsigned char body_lower_u; + + unsigned char tail_start; + unsigned char tail_end; + unsigned char tail_shape; +} TONE_TABLE; + +#define N_TONE_TABLE 15 + +static TONE_TABLE tone_table[N_TONE_TABLE] = { + {PITCHfall, 30, 5, PITCHfall, 30, 7, // statement + 20, 25, 34, 22, drops_0, 3, 3, 12, 8, 0}, + + {PITCHfrise, 38,10, PITCHfrise2, 36,10, // comma, or question + 20, 25, 34, 20, drops_0, 3, 3, 15, 25, 0}, + + {PITCHdrop, 40, 2, PITCHdrop, 42,25, // exclamation + 20, 25, 34, 22, drops_0, 3, 3, 12, 8, 0}, + + + + {PITCHfall, 30, 5, PITCHfall, 30, 7, // statement + 20, 25, 34, 22, drops_1, 3, 3, 12, 8, 0}, + + {PITCHfrise, 38,10, PITCHfrise2, 36,10, // comma, or question + 20, 25, 34, 20, drops_1, 3, 3, 15, 25, 0}, + + {PITCHfall, 30, 5, PITCHfall, 30, 7, // exclamation + 20, 25, 34, 22, drops_1, 3, 3, 12, 8, 0}, + + + + {PITCHfall, 30, 5, PITCHfall, 30, 7, // statement + 20, 25, 34, 22, drops_2, 3, 3, 12, 8, 0}, + + {PITCHfrise, 38,10, PITCHfrise2, 36,10, // comma, or question + 20, 25, 34, 20, drops_2, 3, 3, 15, 25, 0}, + + {PITCHfall, 30, 5, PITCHfall, 30, 7, // exclamation + 20, 25, 34, 22, drops_2, 3, 3, 12, 8, 0}, + + + +// alternatives + {PITCHfall, 36, 6, PITCHfall, 36, 8, + 30, 20, 18, 34, drops_0, 3, 3, 12, 8, 0}, + + {PITCHfrise, 38, 8, PITCHfrise2, 36, 8, + 30, 20, 18, 34, drops_0, 3, 3, 20, 32, 0}, + + {PITCHfall, 36, 6, PITCHfall, 36, 8, + 30, 20, 18, 34, drops_0, 3, 3, 12, 8, 0}, + +}; + + + + +/* indexed by stress */ +static int min_drop[] = {0x300,0x300,0x300,0x300,0x300,0x500,0xc00,0xc00}; + + + + +#define SECONDARY 3 +#define PRIMARY 4 +#define PRIMARY_MARKED 6 +#define BODY_RESET 7 +#define FIRST_TONE 8 /* first of the tone types */ + + +static int number_pre; +static int number_body; +static int number_tail; +static int last_primary; +static int tone_type; +static int tone_posn; +static int annotation; +static int no_tonic; + + +static void count_pitch_vowels() +/******************************/ +{ + int ix; + int stress; + int stage=0; /* 0=pre, 1=body, 2=tail */ + int max_stress = 0; + int max_stress_posn = 0; + int tone_type_marker = 0; + int marked_stress_count = 0; + + number_pre=0; /* number of vowels before 1st primary stress */ + number_body=0; + number_tail=0; /* number between tonic syllable and next primary */ + + for(ix=vowel_ix; ix= max_stress) + { + max_stress = stress; + max_stress_posn = ix; + } + if(stress >= PRIMARY) + { + if(stress > PRIMARY) + { + marked_stress_count++; + } + + last_primary = ix; + } + + switch(stage) + { + case 0: + if(stress < PRIMARY) + number_pre++; + else + { + stage = 1; + ix = ix-1; + } + break; + + case 1: + if(stress >= FIRST_TONE) + { + tone_type_marker = stress; + tone_posn = ix; + stage = 2; + } + break; + + case 2: + if(stress < PRIMARY) + number_tail++; + else + stage = 3; + break; + } + } + + if(no_tonic) + { + tone_posn = vowel_ix_top; + } + else + if((tone_type_marker >= FIRST_TONE) && (tone_type_marker < (N_TONE_TABLE + FIRST_TONE))) + { + tone_type = tone_type_marker - FIRST_TONE; + } + else + { + /* no tonic syllable found, use highest stress */ + vowel_tab[max_stress_posn] = FIRST_TONE; + number_tail = vowel_ix_top - max_stress_posn - 1; + tone_posn = max_stress_posn; + } + + if(marked_stress_count > 1) + annotation = 1; + else + annotation = 0; +} /* end of count_pitch_vowels */ + + + + +static int count_increments(int ix, int end_ix, int min_stress) +/*************************************************************/ +/* Count number of primary stresses up to tonic syllable or body_reset */ +{ + int count = 0; + int stress; + + while(ix < end_ix) + { + stress = vowel_tab[ix++] & 0x3f; + if(stress >= BODY_RESET) + break; + else + if(stress >= min_stress) + count++; + } + return(count); +} /* end of count_increments */ + + + +static void set_pitch(int ix, int base, int drop) +/***********************************************/ +/* Set the pitch of a vowel in vowel_tab. Base & drop are Hz * 256 */ +{ + int pitch1, pitch2; + int flags = 0; + int pitch_range2; + int pitch_base2; + +/* fprintf(f_log,"base=%3d,drop=%3d ",base>>8,drop>>8); */ + + /* adjust for experimentally optimal value for default of 128 */ + pitch_range2 = pitch_range + 20; + pitch_base2 = pitch_base - (128-72); + + if(base < 0) base = 0; + + pitch2 = ((base * pitch_range2 ) >> 15) + pitch_base2; + + if(drop >= 0) + { + pitch1 = pitch2 + ((drop * pitch_range2) >> 15); + } + else + { + pitch1 = pitch2 - ((drop * pitch_range2) >> 15); + flags = 0x80; + } + +if(pitch1 > 511) pitch1 = 511; +if(pitch2 > 511) pitch2 = 511; +/* fprintf(f_log," %d p1=%3d p2=%3d %x\n",vowel_tab[ix] & 0x3f,pitch1,pitch2,flags); */ + vowel_tab[ix] = (vowel_tab[ix] & 0x3f) + flags + + (pitch1 << 8) + (pitch2 << 17); + +} /* end of set_pitch */ + + + +static int calc_pitch_segment(int ix, int end_ix, TONE_TABLE *t, int min_stress) +/******************************************************************************/ +/* Calculate pitches until next RESET or tonic syllable, or end. + Increment pitch if stress is >= min_stress. + Used for tonic segment */ +{ + int stress; + int pitch=0; + int increment=0; + int n_primary=0; + int initial; + int overflow=0; + int *drops; + + static char overflow_tab[5] = {0, 5, 3, 1, 0}; + + drops = t->body_drops; + + initial = 1; + while(ix < end_ix) + { + stress = vowel_tab[ix] & 0x3f; + + if(stress == BODY_RESET) + initial = 1; + + if(initial || (stress >= min_stress)) + { + if(initial) + { + initial = 0; + overflow = 0; + n_primary = count_increments(ix,end_ix,min_stress); + + if(n_primary > t->body_max_steps) + n_primary = t->body_max_steps; + + if(n_primary > 1) + { + increment = (t->body_end - t->body_start) << 8; + increment = increment / (n_primary -1); + } + else + increment = 0; + + pitch = t->body_start << 8; + } + else + { + if(n_primary > 0) + pitch += increment; + else + { + pitch = (t->body_end << 8) - (increment * overflow_tab[overflow++])/4; + if(overflow > 4) overflow = 0; + } + } + n_primary--; + } + + if(((annotation==0) && (stress >= PRIMARY)) || (stress >= PRIMARY_MARKED)) + { + vowel_tab[ix] = PRIMARY_MARKED; + set_pitch(ix,pitch,drops[stress]); + } + else + if(stress >= SECONDARY) + { + /* use secondary stress for unmarked word stress, if no annotation */ + set_pitch(ix,pitch,drops[stress]); + } + else + { + /* unstressed, drop pitch if preceded by PRIMARY */ + if((vowel_tab[ix-1] & 0x3f) >= SECONDARY) + set_pitch(ix,pitch - (t->body_lower_u << 8), drops[stress]); + else + set_pitch(ix,pitch,drops[stress]); + } + + ix++; + } + return(ix); +} /* end of calc_pitch_segment */ + + + +static int calc_pitch_segment2(int ix, int end_ix, int start_p, int end_p, int min_stress) +/****************************************************************************************/ +/* Linear pitch rise/fall, change pitch at min_stress or stronger + Used for pre-head and tail */ +{ + int stress; + int pitch; + int increment; + int n_increments; + int drop; + + if(ix >= end_ix) + return(ix); + + n_increments = count_increments(ix,end_ix,min_stress); + increment = (end_p - start_p) << 8; + + if(n_increments > 1) + { + increment = increment / n_increments; + } + + + pitch = start_p << 8; + while(ix < end_ix) + { + stress = vowel_tab[ix] & 0x3f; + + if(increment > 0) + { + set_pitch(ix,pitch,-increment); + pitch += increment; + } + else + { + drop = -increment; + if(drop < min_drop[stress]) + drop = min_drop[stress]; + + pitch += increment; + set_pitch(ix,pitch,drop); + } + + ix++; + } + return(ix); +} /* end of calc_pitch_segment2 */ + + + + + + +static int calc_pitches(int *syllable_tab, int num, int sentence_tone) +/********************************************************************/ +/* Calculate pitch values for the vowels in this tone group */ +{ + int ix; + TONE_TABLE *t; + int drop; + + t = &tone_table[tone_type]; + ix = vowel_ix; + + /* vowels before the first primary stress */ + /******************************************/ + + if(number_pre > 0) + { + ix = calc_pitch_segment2(ix,ix+number_pre,t->pre_start,t->pre_end, 0); + } + + /* body of tonic segment */ + /*************************/ + + if(annotation) + ix = calc_pitch_segment(ix,tone_posn, t, PRIMARY_MARKED); + else + ix = calc_pitch_segment(ix,tone_posn, t, PRIMARY); + + if(no_tonic) + return(0); + + /* tonic syllable */ + /******************/ + + if(number_tail == 0) + { + tone_pitch_env = t->pitch_env0; + drop = t->tonic_max0 - t->tonic_min0; + set_pitch(ix++,t->tonic_min0 << 8,drop << 8); + } + else + { + tone_pitch_env = t->pitch_env1; + drop = t->tonic_max1 - t->tonic_min1; + set_pitch(ix++,t->tonic_min1 << 8,drop << 8); + } + + + /* tail, after the tonic syllable */ + /**********************************/ + + calc_pitch_segment2(ix,vowel_ix_top,t->tail_start,t->tail_end,0); + + return(tone_pitch_env); +} /* end of calc_pitches */ + + + + + +static int calc_pitch_segmentX(int ix, int end_ix, TONE_TABLE *t, int min_stress) +/******************************************************************************/ +/* Calculate pitches until next RESET or tonic syllable, or end. + Increment pitch if stress is >= min_stress. + Used for tonic segment */ +// EXPERIMENTAL VERSION +{ + int stress; + int pitch=0; + int n_primary; + int initial; + int *drops; + + int prev_stress=0; + int n_unstressed; + int j; + + drops = t->body_drops; // pitch fall or raise for each stress value + + n_primary = count_increments(ix,end_ix,min_stress)-1; // number if primary stress in the clause -1 + + initial = 1; + while(ix < end_ix) // for each syllable + { + for(j=ix; j SECONDARY) + break; + } + n_unstressed = (j - ix - 1); + + stress = vowel_tab[ix] & 0x3f; // stress value of this syllable + + pitch = 0x1000; // set a base pitch + pitch += ((n_primary % 3) * 0x0500); // some variety. add an offset that changes after each primary stress + + if(stress >= PRIMARY) + { + vowel_tab[ix] = PRIMARY_MARKED; + set_pitch(ix,pitch+0x100, -0x0900); + n_primary--; + } +// else +// if(stress >= SECONDARY) +// { +// set_pitch(ix,pitch,drops[stress]); +// } + else + { + if(ix > 0) + prev_stress = vowel_tab[ix-1] & 0x3f; // stress level of previous syllable + + if(prev_stress >= PRIMARY) + { + // an unstressed syllable which follows a primary stress syllable + set_pitch(ix,pitch+0x0200, 0x0800); + } + else + { +stress = 0; // treat secondary stress the same as unstressed ?? + + set_pitch(ix,pitch + n_unstressed*0x300, drops[stress]); + } + n_unstressed--; + } + ix++; + } + return(ix); +} /* end of calc_pitch_segmentX */ + + + +static int calc_pitchesX(int *syllable_tab, int num, int sentence_tone) +/********************************************************************/ +/* Calculate pitch values for the vowels in this tone group */ +// EXPERMENTAL VERSION of calc_pitches() +{ + int ix; + TONE_TABLE *t; + int drop; + + t = &tone_table[tone_type]; + ix = vowel_ix; + + + /* body of tonic segment */ + /*************************/ + + if(annotation) + ix = calc_pitch_segmentX(ix,tone_posn, t, PRIMARY_MARKED); + else + ix = calc_pitch_segmentX(ix,tone_posn, t, PRIMARY); + + if(no_tonic) + return(0); + + /* tonic syllable */ + /******************/ + + if(number_tail == 0) + { + tone_pitch_env = t->pitch_env0; + drop = t->tonic_max0 - t->tonic_min0; + set_pitch(ix++,t->tonic_min0 << 8,drop << 8); + } + else + { + tone_pitch_env = t->pitch_env1; + drop = t->tonic_max1 - t->tonic_min1; + set_pitch(ix++,t->tonic_min1 << 8,drop << 8); + } + + + /* tail, after the tonic syllable */ + /**********************************/ + + calc_pitch_segment2(ix,vowel_ix_top,t->tail_start,t->tail_end,0); + + return(tone_pitch_env); +} /* end of calc_pitchesX */ + + + +void Translator::CalcPitches_Tone(int clause_tone) +{//=============================================== +// clause_tone: 0=. 1=, 2=?, 3=! 4=none + PHONEME_LIST *p; + int ix; + int count_stressed=0; + int count_stressed2=0; + int final_stressed=0; + + int tone_ph; + + int pitch_adjust = 13; // pitch gradient through the clause - inital value + int pitch_decrement = 3; // decrease by this for each stressed syllable + int pitch_low = 0; // until it drops to this + int pitch_high = 10; // then reset to this + + p = &phoneme_list[0]; + + // count number of stressed syllables + p = &phoneme_list[0]; + for(ix=0; ixtype == phVOWEL) && (p->tone >= 4)) + { + final_stressed = ix; + count_stressed++; + } + } + + // language specific, changes to tones + if(translator_name == L('v','i')) + { + // LANG=vi + p = &phoneme_list[final_stressed]; + p->tone = 7; + if(p->tone_ph == 0) + p->tone_ph = LookupPh("7"); // change tone 1 to falling tone at end of clause + } + + + p = &phoneme_list[0]; + for(ix=0; ixtype == phVOWEL) + { + tone_ph = p->tone_ph; + + if(p->tone >= 2) + { + // a stressed syllable + if(p->tone >= 4) + { + + count_stressed2++; + if(count_stressed2 == count_stressed) + { + // the last stressed syllable + pitch_adjust = pitch_low; + } + else + { + pitch_adjust -= pitch_decrement; + if(pitch_adjust <= pitch_low) + pitch_adjust = pitch_high; + } + } + + if(tone_ph ==0) + { + tone_ph = phonDEFAULTTONE; // no tone specified, use default tone 1 + p->tone_ph = tone_ph; + } + p->pitch1 = pitch_adjust + phoneme_tab[tone_ph]->start_type; + p->pitch2 = pitch_adjust + phoneme_tab[tone_ph]->end_type; + } + else + { + // what to do for unstressed syllables ? + p->pitch1 = 10; // temporary + p->pitch2 = 14; + } + } + } + + +} // end of Translator::CalcPitches_Tone + + + +void Translator::CalcPitches(int clause_tone) +{//========================================== +// clause_tone: 0=. 1=, 2=?, 3=! 4=none + PHONEME_LIST *p; + int ix; + int x; + int st_ix; + int tonic_ix=0; + int tonic_env; + int max_stress=0; + int option; + int st_ix_changed = -1; + int syllable_tab[N_PHONEME_LIST]; + + if(langopts.intonation == 1) + { + CalcPitches_Tone(clause_tone); + return; + } + + st_ix=0; + p = &phoneme_list[0]; + + for(ix=0; ixsynthflags & SFLAG_SYLLABLE) + { + syllable_tab[st_ix] = p->tone; + + if(option_tone2 == 1) + { + // reduce number of full-stress words + if((p->tone == 4) && ((st_ix % 2) != 1)) + { + syllable_tab[st_ix] = 3; + st_ix_changed = st_ix; + } + } + if(option_tone2 == 2) + { + // reduce all full-stress words, except last + if(p->tone == 4) + { + syllable_tab[st_ix] = 3; + st_ix_changed = st_ix; + } + } + + st_ix++; + if(p->tone >= max_stress) + { + max_stress = p->tone; + tonic_ix = ix; + } + } + } + + if(st_ix_changed >= 0) + syllable_tab[st_ix_changed] = 4; + + if(st_ix == 0) + return; // no vowels, nothing to do + + + option = option_tone1 & 0xf; + if(option > 4) + option = 0; + + tone_type = punct_to_tone[option][clause_tone]; /* unless changed by count_pitch_vowels */ + + if(clause_tone == 4) + no_tonic = 1; /* incomplete clause, used for abbreviations such as Mr. Dr. Mrs. */ + else + no_tonic = 0; + + /* transfer vowel data from ph_list to syllable_tab */ + vowel_tab = syllable_tab; + vowel_ix_top = st_ix; + + count_pitch_vowels(); + + if((option_tone1 & 0xf0)== 0x10) + tonic_env = calc_pitchesX(syllable_tab,st_ix,clause_tone); + else + tonic_env = calc_pitches(syllable_tab,st_ix,clause_tone); + + // unpack pitch data + st_ix=0; + p = &phoneme_list[0]; + for(ix=0; ixtone = syllable_tab[st_ix] & 0x3f; + + if(p->synthflags & SFLAG_SYLLABLE) + { + x = ((syllable_tab[st_ix] >> 8) & 0x1ff) - 72; + if(x < 0) x = 0; + p->pitch1 = x; + + x = ((syllable_tab[st_ix] >> 17) & 0x1ff) - 72; + if(x < 0) x = 0; + p->pitch2 = x; + + p->env = PITCHfall; + if(syllable_tab[st_ix] & 0x80) + { +// if(p->pitch1 > p->pitch2) +// p->env = PITCHfall; +// else + p->env = PITCHrise; + } + + if(p->pitch1 > p->pitch2) + { + // swap so that pitch2 is the higher + x = p->pitch1; + p->pitch1 = p->pitch2; + p->pitch2 = x; + } + if(ix==tonic_ix) p->env = tonic_env; + st_ix++; + } + } +} // end of Translator::CalcPitches + + diff --git a/src/main.h b/src/main.h new file mode 100755 index 00000000..ae772a1a --- /dev/null +++ b/src/main.h @@ -0,0 +1,179 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: sashtest.h +// Purpose: Layout window/sash sample +// Author: Julian Smart +// Modified by: +// Created: 04/01/98 +// RCS-ID: $Id: sashtest.h,v 1.4 2002/03/17 14:15:55 VZ Exp $ +// Copyright: (c) Julian Smart +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +#include "wx/toolbar.h" +#include "wx/laywin.h" +#include "wx/progdlg.h" + +typedef unsigned short USHORT; +typedef unsigned char UCHAR; + + + +extern wxMenuBar *MakeMenu(int type); + +extern wxString path_phsource; +extern wxString path_speaktext; +extern wxString path_speech; +extern wxProgressDialog *progress; +extern int progress_max; +extern int gui_flag; + +extern char *WavFileName(); + +class SpectDisplay; + + +// Define a new application +class MyApp: public wxApp +{ + public: + bool OnInit(void); + int OnExit(void); +}; + +// Define a new frame +class MyFrame: public wxMDIParentFrame +{ + public: + + MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, const long style); + + void OnSize(wxSizeEvent& event); + void OnAbout(wxCommandEvent& event); + void OnQuit(wxCommandEvent& event); + void OnOptions(wxCommandEvent& event); + void OnSpeak(wxCommandEvent& event); + void OnTools(wxCommandEvent& event); + void OnSashDrag(wxSashEvent& event); + void OnKey(wxKeyEvent& event); + void OnTimer(wxTimerEvent& event); + void LoadWavFile(void); + + void OnNewWindow(wxCommandEvent& event); + void OnProsody(wxCommandEvent& event); + + +protected: + wxSashLayoutWindow* m_topWindow; + wxSashLayoutWindow* m_leftWindow1; + wxSashLayoutWindow* m_leftWindow2; + wxSashLayoutWindow* m_bottomWindow; + void SetVoiceTitle(char *voice_name); + wxTimer m_timer; + +DECLARE_EVENT_TABLE() +}; + +class MyChild: public wxMDIChildFrame +{ + public: + SpectDisplay *canvas; + MyChild(wxMDIParentFrame *parent, const wxString& title, const wxPoint& pos, const wxSize& size, const long style); + ~MyChild(void); + void OnActivate(wxActivateEvent& event); + + void OnQuit(wxCommandEvent& event); + void OnSave(wxCommandEvent& event); + void OnSaveAs(wxCommandEvent& event); + void OnSaveSelect(wxCommandEvent& event); + void OnSavePitchenv(wxCommandEvent& event); + void OnVoiceDlg(wxCommandEvent& event); + +DECLARE_EVENT_TABLE() +}; + + + +class TranslDlg : public wxPanel +{//============================= +public: + TranslDlg(wxWindow *parent); + + void OnKey(wxKeyEvent& event); + void SpeakFile(void); + void ReadVoice(void); + void OnCommand(wxCommandEvent& event); + +private: + wxButton *t_translate; + wxButton *t_process; + wxTextCtrl* t_source; + wxTextCtrl* t_phonetic; + + + DECLARE_EVENT_TABLE() +}; + +extern MyFrame *myframe; +extern TranslDlg *transldlg; +extern wchar_t ipa1[256]; + + + +extern wxFont FONT_SMALL; +extern wxFont FONT_MEDIUM; +extern wxFont FONT_NORMAL; + +enum { + MENU_QUIT = 1, + MENU_SPECTRUM, + MENU_SPECTRUM2, + MENU_CLOSE_ALL, + MENU_ABOUT, + + MENU_OPTIONS, + MENU_PARAMS, + MENU_PATHS, + MENU_PATH1, + MENU_PATH2, + MENU_PATH3, + + MENU_PROSODY, + MENU_COMPILE_PH, + MENU_COMPILE_DICT, + MENU_COMPILE_MBROLA, + + MENU_SPEAK_TRANSLATE, + MENU_SPEAK_RULES, + MENU_SPEAK_TEXT, + MENU_SPEAK_FILE, + MENU_SPEAK_PAUSE, + MENU_SPEAK_STOP, + MENU_SPEAK_VOICE, + MENU_LOAD_WAV, + + MENU_VOWELCHART, + MENU_VOWELCHART1, + MENU_VOWELCHART2, + MENU_VOWELCHART3, + MENU_LEXICON, + MENU_LEXICON_RU, + MENU_TO_UTF8, + MENU_COUNT_WORDS, + MENU_TEST, + MENU_TEST2, + + SPECTSEQ_CLOSE, + SPECTSEQ_SAVE, + SPECTSEQ_SAVEAS, + SPECTSEQ_SAVESELECT, + SPECTSEQ_SAVEPITCH, + SPECTSEQ_VOICEDLG +}; + +#define ID_WINDOW_TOP 100 +#define ID_WINDOW_LEFT1 101 +#define ID_WINDOW_LEFT2 102 +#define ID_WINDOW_BOTTOM 103 + + + diff --git a/src/mbrolib.h b/src/mbrolib.h new file mode 100644 index 00000000..26a4eb92 --- /dev/null +++ b/src/mbrolib.h @@ -0,0 +1,205 @@ +#ifndef MBROLIB_H +#define MBROLIB_H + +/* + * mbrolib: mbrola wrapper. + * + * Copyright (C) 2007 Gilles Casse + * + * This 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. + * + * This 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 this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/* < types */ + +/** Parameters */ + +typedef struct { + int ignore_error; /* 1=Ignore any fatal error or unknown diphone */ + char comment_char; /* Comment character */ + float volume_ratio; /* Volume ratio */ + float frequency_ratio; /* Applied to pitch points */ + float time_ratio; /* Applied to phone durations */ +} mbrolib_parameter; + + +/** Returned errors */ + +typedef enum { + MBROLIB_OK=0, + MBROLIB_DATABASE_NOT_INSTALLED, + MBROLIB_INVAL, + MBROLIB_OUT_OF_MEMORY, + MBROLIB_OUT_OF_RANGE, + MBROLIB_READ_ERROR, + MBROLIB_WRITE_ERROR +} MBROLIB_ERROR; + + + +/** Gender */ + +typedef enum { + MBROLIB_FEMALE, + MBROLIB_MALE +} MBROLIB_GENDER; + + + +/** Voice descriptor */ + +typedef struct { + char *name; /* name (for example: "en1") */ + char *filename; /* database pathname (for example: "/usr/share/mbrola/voices/en1) */ + int rate; /* database sample rate */ + MBROLIB_GENDER gender; + const char *language; /* Language and optional dialect qualifier in ascii (e.g. en, fr_ca). */ +} mbrolib_voice; + +/* > */ + + +/** Initialization, returns a new handle. + First function. + + @param the_sample_rate: output rate in Hz (for example 22050). If 0, keep the original database rate. + + @return handle (or NULL if error). +*/ +void* mbrolib_init( int sample_rate); +typedef void* (t_mbrolib_init)(int); + + +/** Returns the list of the installed mbrola databases. + The databases are searched according to the MBROLA_PATH environment variable if set, + or under a default path otherwise (see MBROLA_PATH in mbrolib.c). + + An array of voices is returned. The last item is set to NULL. + The caller must not free the returned items or the array. + + @param the_handle previously given by mbrolib_init. + + @return An array of voices. +*/ +const mbrolib_voice ** mbrolib_list_voices( void* the_handle); +typedef const mbrolib_voice ** (t_mbrolib_list_voices)(void*); + + + +/** Set voice + + @param the_handle. + + @param the_database (for example, "en1"). + + @return error code (MBROLIB_OK, MBROLIB_DATABASE_NOT_INSTALLED, MBROLIB_INVAL). + +*/ +MBROLIB_ERROR mbrolib_set_voice( void* the_handle, const char* the_name); +typedef MBROLIB_ERROR (t_mbrolib_set_voice)( void*, const char*); + + + +/** Get the current database parameters. + The caller supplies a pointer to an already allocated structure. + + @param the_handle previously given by mbrolib_init. + + @param the_parameters: pointer to the structure. + + @return error code (MBROLIB_OK, MBROLIB_INVAL). +*/ +MBROLIB_ERROR mbrolib_get_parameter(void* the_handle, mbrolib_parameter* the_parameter); +typedef MBROLIB_ERROR (t_mbrolib_get_parameter)(void*, mbrolib_parameter*); + + + +/** Set the database parameters using the supplied data. + + @param the_handle previously given by mbrolib_init. + + @param the_parameters: pointer to the wished parameters. + + @return error code (MBROLIB_OK, MBROLIB_INVAL). +*/ +MBROLIB_ERROR mbrolib_set_parameter(void* the_handle, const mbrolib_parameter* the_parameter); +typedef MBROLIB_ERROR (t_mbrolib_set_parameter)(void*, const mbrolib_parameter*); + + + +/** Write the mbrola phonemes in the internal buffer. + + @param the_handle. + + @param the_mbrola_phonemes. + + @param the_size in bytes. + + @return error code (MBROLIB_OK, MBROLIB_INVAL, MBROLIB_WRITE_ERROR, MBROLIB_READ_ERROR). +*/ +MBROLIB_ERROR mbrolib_write(void* the_handle, const char* the_mbrola_phonemes, size_t the_size); +typedef MBROLIB_ERROR (t_mbrolib_write)(void*, const char*, size_t); + + + +/** Read n bytes of the output samples. + + @param the_handle. + + @param the_samples (raw audio data, 16bits, mono). + + @param the_size max number of int16 to read. + + @param the_size number of int16 read. + + @return error code (MBROLIB_OK, MBROLIB_INVAL, MBROLIB_READ_ERROR). + +*/ +MBROLIB_ERROR mbrolib_read(void* the_handle, short* the_samples, int the_max_size, int* the_read_size); +typedef MBROLIB_ERROR (t_mbrolib_read)(void*, short*, int, int*); + + + +/** Flush + + @param the_handle. + +*/ +void mbrolib_flush(void* the_handle); +typedef void (t_mbrolib_flush)(void*); + + + +/** Release the handle + + @param the_handle. + + @return error code (MBROLIB_OK, MBROLIB_INVAL). + +*/ +MBROLIB_ERROR mbrolib_terminate(void* the_handle); +typedef MBROLIB_ERROR (t_mbrolib_terminate)(void*); + + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/menus.cpp b/src/menus.cpp new file mode 100755 index 00000000..02f189c7 --- /dev/null +++ b/src/menus.cpp @@ -0,0 +1,137 @@ +/*************************************************************************** + * Copyright (C) 2005, 2006 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + + +#include "wx/wx.h" + +#include "main.h" + + +wxMenu *speak_menu; + +wxMenuBar *MakeMenu(int type) +{//========================== + + wxMenu *file_menu; + wxMenu *help_menu; + wxMenu *option_menu = NULL; + wxMenu *paths_menu; + wxMenu *data_menu = NULL; + wxMenu *tools_menu; + wxMenu *voice_menu; + wxMenu *vowelchart_menu; + wxMenu *lexicon_menu; + + // FILE MENU + file_menu = new wxMenu; + file_menu->Append(MENU_SPECTRUM, _T("&Open")); + file_menu->Append(MENU_SPECTRUM2, _T("O&pen2")); +// file_menu->Append(MENU_PROSODY, _T("&Prosody window")); + if(type==0) + { + } + else + if(type==1) + { + file_menu->Append(SPECTSEQ_SAVE, _T("&Save")); + file_menu->Append(SPECTSEQ_SAVEAS, _T("Save &As")); + file_menu->Append(SPECTSEQ_SAVESELECT, _T("Save Selection")); +// file_menu->Append(SPECTSEQ_SAVEPITCH, _T("Save Pitch &Envelope")); + file_menu->Append(SPECTSEQ_CLOSE, _T("&Close")); +// file_menu->Append(MENU_CLOSE_ALL, _T("Close &All")); + } + else + if(type==2) + { + file_menu->Append(SPECTSEQ_SAVE, _T("&Save")); + file_menu->Append(SPECTSEQ_SAVEAS, _T("Save &As")); +// file_menu->Append(SPECTSEQ_SAVEPITCH, _T("Save Pitch &Envelope")); + file_menu->Append(SPECTSEQ_CLOSE, _T("&Close")); +// file_menu->Append(MENU_CLOSE_ALL, _T("Close &All")); + } + file_menu->Append(MENU_QUIT, _T("&Quit")); + + // SPEAK_MENU + speak_menu = new wxMenu; + speak_menu->Append(MENU_SPEAK_TRANSLATE, _T("&Translate")); + speak_menu->Append(MENU_SPEAK_RULES, _T("Show &Rules")); + speak_menu->Append(MENU_SPEAK_TEXT, _T("&Speak")); + speak_menu->AppendSeparator(); + speak_menu->Append(MENU_SPEAK_FILE, _T("Speak &file")); + speak_menu->Append(MENU_SPEAK_PAUSE, _T("&Pause")); + speak_menu->Append(MENU_SPEAK_STOP, _T("St&op")); + + // VOICE MENU + voice_menu = new wxMenu; + voice_menu->Append(MENU_SPEAK_VOICE, _T("Select &Voice")); + + // DATA MENU + data_menu = new wxMenu; + data_menu->Append(MENU_COMPILE_PH, _T("Compile &phoneme data")); + data_menu->Append(MENU_COMPILE_DICT, _T("Compile &dictionary")); + data_menu->Append(MENU_COMPILE_MBROLA, _T("Compile &mbrola phonemes list")); + + // OPTIONS MENU + paths_menu = new wxMenu; + paths_menu->Append(MENU_PATH1, _T("Phoneme data source")); + paths_menu->Append(MENU_PATH2, _T("Dictionary data source")); + paths_menu->Append(MENU_PATH3, _T("Synthesized sound WAV file")); + + option_menu = new wxMenu; + option_menu->Append(MENU_PATHS, _T("Set &paths"), paths_menu); + option_menu->Append(MENU_PARAMS, _T("Speed")); + + // TOOLS + vowelchart_menu = new wxMenu; + vowelchart_menu->Append(MENU_VOWELCHART1, _T("From compiled phoneme data")); + vowelchart_menu->Append(MENU_VOWELCHART2, _T("From list of formants")); + vowelchart_menu->Append(MENU_VOWELCHART3, _T("From directory of vowel files")); + + lexicon_menu = new wxMenu; + lexicon_menu->Append(MENU_LEXICON_RU, _T("Russian (lexicon.dict)")); + + tools_menu = new wxMenu; + tools_menu->Append(MENU_VOWELCHART, _T("Make &Vowels Chart"), vowelchart_menu); +// tools_menu->Append(MENU_LOAD_WAV, _T("Analyse WAV file")); + tools_menu->Append(MENU_LEXICON, _T("Compare &Lexicon"), lexicon_menu); + tools_menu->Append(MENU_TO_UTF8, _T("Convert file to &UTF8")); + tools_menu->Append(MENU_COUNT_WORDS, _T("Count word &frequencies")); + tools_menu->Append(MENU_TEST , _T("Test (temporary)")); +// tools_menu->Append(MENU_TEST2 , _T("Test2")); + + // HELP MENU + help_menu = new wxMenu; + help_menu->Append(MENU_ABOUT, _T("&About")); + + + wxMenuBar *menu_bar = new wxMenuBar; + + menu_bar->Append(file_menu, _T("&File")); + menu_bar->Append(speak_menu, _T("&Speak")); + menu_bar->Append(voice_menu, _T("&Voice")); + menu_bar->Append(option_menu, _T("&Options")); + menu_bar->Append(tools_menu, _T("&Tools")); + menu_bar->Append(data_menu, _T("&Data")); + menu_bar->Append(help_menu, _T("&Help")); + + return(menu_bar); + } // end of MakeMenu + + diff --git a/src/numbers.cpp b/src/numbers.cpp new file mode 100644 index 00000000..121b968c --- /dev/null +++ b/src/numbers.cpp @@ -0,0 +1,728 @@ +/*************************************************************************** + * Copyright (C) 2006 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "StdAfx.h" + + +#include +#include +#include +#include + +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "translate.h" + + + + +int Translator::TranslateLetter(char *word, char *phonemes, int control) +{//===================================================================== +// get pronunciation for an isolated letter +// return number of bytes used by the letter +// control 2=say-as glyphs, 3-say-as chars + int n_bytes; + int letter; + int len; + unsigned char *p; + char ph_stress[2]; + char capital[20]; + char ph_buf[30]; + char ph_buf2[50]; + static char single_letter[8] = {0}; + + ph_buf[0] = 0; + capital[0] = 0; + + n_bytes = utf8_in(&letter,word,0); + + if(control > 2) + { + // include CAPITAL information + if(iswupper(letter)) + { + Lookup("_cap",capital); + } + } + letter = towlower(letter); + + len = utf8_out(letter,&single_letter[2]); + single_letter[2+len] = ' '; + memcpy(&single_letter[3+len],&word[n_bytes],3); // include the next letter, after a space, in case it affects the translation rules + + single_letter[1] = '_'; + if(Lookup(&single_letter[1],ph_buf) == 0) + { + single_letter[1] = ' '; + if(Lookup(&single_letter[2],ph_buf) == 0) + { + TranslateRules(&single_letter[2], ph_buf, sizeof(ph_buf), NULL,0,0); + } + } + + if(ph_buf[0] == phonSWITCH) + { + strcpy(phonemes,ph_buf); + return(0); + } + if(ph_buf[0] == 0) + { + // character name not found + if(iswalpha(letter)) + Lookup("_?A",ph_buf); + + if((ph_buf[0]==0) && !iswspace(letter)) + Lookup("_??",ph_buf); + } + + // at a stress marker at the start of the letter name, unless one is already marked + ph_stress[0] = phonSTRESS_P; + ph_stress[1] = 0; + + for(p=(unsigned char *)ph_buf; *p != 0; p++) + { + if(phoneme_tab[*p]->type == phSTRESS) + ph_stress[0] = 0; // stress is already marked + } + + len = strlen(phonemes); + sprintf(ph_buf2,"%c%s%s%s",0xff,capital,ph_stress,ph_buf); // the 0xff marker will be removed or replaced in SetSpellingStress() + if((len + strlen(ph_buf2)) < N_WORD_PHONEMES) + { + strcpy(&phonemes[len],ph_buf2); + } + return(n_bytes); +} // end of TranslateLetter + + + +void Translator::SetSpellingStress(char *phonemes, int control) +{//============================================================ +// Individual letter names, reduce the stress of some. + int ix; + unsigned int c; + int n_stress=0; + int count; + unsigned char buf[N_WORD_PHONEMES]; + + for(ix=0; (c = phonemes[ix]) != 0; ix++) + { + if(c == phonSTRESS_P) + { + n_stress++; + } + buf[ix] = c; + } + buf[ix] = 0; + + count = 0; + for(ix=0; (c = buf[ix]) != 0; ix++) + { + if(c == phonSTRESS_P) + { + count++; + + if(langopts.spelling_stress == 1) + { + // stress on initial letter when spelling + if(count > 1) + c = phonSTRESS_3; + } + else + { + if((count != n_stress) && (control < 4)) + { + if(((count % 3) != 0) || (count == n_stress-1)) + c = phonSTRESS_3; // reduce to secondary stress + } + } + } + else + if(c == 0xff) + { + if(control < 2) + continue; // don't insert pauses + + if(control == 4) + c = phonPAUSE; // pause after each character + if(((count % 3) == 0) || (control == 4)) + c = phonPAUSE_NOLINK; // pause following a primary stress + else + continue; // remove marker + } + *phonemes++ = c; + } + if(control >= 2) + *phonemes++ = phonPAUSE_NOLINK; + *phonemes = 0; +} // end of SetSpellingStress + + + + + + +int Translator::LookupNum2(int value, int control, char *ph_out) +{//============================================================= +// Lookup a 2 digit number +// control bit 0: use special form of '1' +// control bit 2: use feminine form of '2' + + int found; + int ix; + int units; + int used_and=0; + int next_phtype; + char string[12]; // for looking up entries in de_list + char ph_tens[50]; + char ph_digits[50]; + char ph_and[12]; + + if((value == 1) && (control & 1)) + { + if(Lookup("_1a",ph_out) != 0) + return(0); + } + // is there a special pronunciation for this 2-digit number + found = 0; + if(control & 4) + { + sprintf(string,"_%df",value); + found = Lookup(string,ph_digits); + } + if(found == 0) + { + sprintf(string,"_%d",value); + found = Lookup(string,ph_digits); + } + + // no, speak as tens+units + if((control & 2) && (value < 10)) + { + // speak leading zero + Lookup("_0",ph_tens); + } + else + { + if(found) + { + strcpy(ph_out,ph_digits); + return(0); + } + + if((value % 10) == 0) + { + sprintf(string,"_%d0",value / 10); + found = Lookup(string,ph_tens); + } + if(!found) + { + sprintf(string,"_%dX",value / 10); + Lookup(string,ph_tens); + } + + if((value % 10) == 0) + { + strcpy(ph_out,ph_tens); + return(0); + } + + found = 0; + units = (value % 10); + if(control & 4) + { + // is there a variant form of this number? + sprintf(string,"_%df",units); + found = Lookup(string,ph_digits); + } + if(found == 0) + { + sprintf(string,"_%d",units); + Lookup(string,ph_digits); + } + } + + if(langopts.numbers & 0x30) + { + Lookup("_0and",ph_and); + if(langopts.numbers & 0x10) + sprintf(ph_out,"%s%s%s",ph_digits,ph_and,ph_tens); + else + sprintf(ph_out,"%s%s%s",ph_tens,ph_and,ph_digits); + used_and = 1; + } + else + { + if(langopts.numbers & 0x200) + { + // remove vowel from the end of tens if units starts with a vowel (LANG=Italian) + ix = strlen(ph_tens)-1; + if((next_phtype = phoneme_tab[(unsigned int)(ph_digits[0])]->type) == phSTRESS) + next_phtype = phoneme_tab[(unsigned int)(ph_digits[1])]->type; + + if((phoneme_tab[(unsigned int)(ph_tens[ix])]->type == phVOWEL) && (next_phtype == phVOWEL)) + ph_tens[ix] = 0; + } + sprintf(ph_out,"%s%s",ph_tens,ph_digits); + } + + if(langopts.numbers & 0x100) + { + // only one primary stress + found = 0; + for(ix=strlen(ph_out)-1; ix>=0; ix--) + { + if(ph_out[ix] == phonSTRESS_P) + { + if(found) + ph_out[ix] = phonSTRESS_3; + else + found = 1; + } + } + } + return(used_and); +} // end of LookupNum2 + + +int Translator::LookupNum3(int value, char *ph_out, int suppress_null, int thousandplex, int prev_thousands) +{//========================================================================================================= +// Translate a 3 digit number + int found; + int hundreds; + int x; + char string[12]; // for looking up entries in **_list + char buf1[100]; + char buf2[100]; + char ph_100[20]; + char ph_10T[20]; + char ph_digits[50]; + char ph_thousands[50]; + char ph_hundred_and[12]; + + hundreds = value / 100; + buf1[0] = 0; + + if(hundreds > 0) + { + ph_thousands[0] = 0; + + Lookup("_0C",ph_100); + + if((hundreds >= 10) && ((langopts.numbers & 0x0800) || (hundreds != 19))) + { + ph_digits[0] = 0; + + if(LookupThousands(hundreds / 10, thousandplex+1, ph_10T) == 0) + { + x = 0; + if(langopts.numbers2 & (1 << (thousandplex+1))) + x = 4; + LookupNum2(hundreds/10, x, ph_digits); + } + + sprintf(ph_thousands,"%s%s%c",ph_digits,ph_10T,phonPAUSE_NOLINK); + hundreds %= 10; + if(hundreds == 0) + ph_100[0] = 0; + suppress_null = 1; + } + + ph_digits[0] = 0; + if(hundreds > 0) + { + suppress_null = 1; + + found = 0; + if((value % 1000) == 100) + { + // is there a special pronunciation for exactly 100 ? + found = Lookup("_1C0",ph_digits); + } + if(!found) + { + sprintf(string,"_%dC",hundreds); + found = Lookup(string,ph_digits); // is there a specific pronunciation for n-hundred ? + } + + if(found) + { + ph_100[0] = 0; + } + else + { + if((hundreds > 1) || ((langopts.numbers & 0x400) == 0)) + { + LookupNum2(hundreds,0,ph_digits); + } + } + } + + sprintf(buf1,"%s%s%s",ph_thousands,ph_digits,ph_100); + } + + ph_hundred_and[0] = 0; + if((langopts.numbers & 0x40) && ((value % 100) != 0)) + { + if((value > 100) || (prev_thousands && (thousandplex==0))) + { + Lookup("_0and",ph_hundred_and); + } + } + + + buf2[0] = 0; + value = value % 100; + + if(value == 0) + { + if(suppress_null == 0) + Lookup("_0",buf2); + } + else + { + x = 0; + if(thousandplex==0) + x = 1; // allow "eins" for 1 rather than "ein" + else + { + if(langopts.numbers2 & (1 << thousandplex)) + x = 4; // use variant (feminine) for before thousands and millions + } + + if(LookupNum2(value,x,buf2) != 0) + { + if(langopts.numbers & 0x80) + ph_hundred_and[0] = 0; // don't put 'and' after 'hundred' if there's 'and' between tens and units + } + } + + sprintf(ph_out,"%s%s%s",buf1,ph_hundred_and,buf2); + + return(0); +} // end of LookupNum3 + + + +static char *M_Variant(int value) +{//============================== + // returns M, or perhaps MA for some cases + + // for Polish language - two forms of plural! + if ((translator->langopts.numbers & 0x80000) && + ((value % 10)>=2) && + ((value % 10)<=4) && + ((value % 100)>20 || (value % 100)<10)) + { + return("MA"); + } + return("M"); +} + + +int Translator::LookupThousands(int value, int thousandplex, char *ph_out) +{//======================================================================= + int found; + char string[12]; + char ph_of[12]; + char ph_thousands[40]; + + ph_of[0] = 0; + + // first look fora match with the exact value of thousands + sprintf(string,"_%dM%d",value,thousandplex); + + if((found = Lookup(string,ph_thousands)) == 0) + { + if((value % 100) >= 20) + { + Lookup("_0of",ph_of); + } + + sprintf(string,"_0%s%d",M_Variant(value),thousandplex); + + if(Lookup(string,ph_thousands) == 0) + { + // repeat "thousand" if higher order names are not available + sprintf(string,"_%dM1",value); + if((found = Lookup(string,ph_thousands)) == 0) + Lookup("_0M1",ph_thousands); + } + } + sprintf(ph_out,"%s%s",ph_of,ph_thousands); + return(found); +} + + +int Translator::TranslateNumber_1(char *word, char *ph_out, unsigned int *flags, int wflags) +{//========================================================================================= +// Number translation with various options +// the "word" may be up to 4 digits +// "words" of 3 digits may be preceded by another number "word" for thousands or millions + + int n_digits; + int value; + int ix; + unsigned char c; + int suppress_null = 0; + int decimal_point = 0; + int thousandplex = 0; + int thousands_inc = 0; + int prev_thousands = 0; + int this_value; + static int prev_value; + int decimal_count; + char string[12]; // for looking up entries in de_list + char buf1[100]; + char ph_append[50]; + char ph_buf[200]; + char ph_buf2[50]; + + static const char str_pause[2] = {phonPAUSE_NOLINK,0}; + + for(ix=0; isdigit(word[ix]); ix++) ; + n_digits = ix; + value = this_value = atoi(word); + + ph_append[0] = 0; + ph_buf2[0] = 0; + + // is there a previous thousands part (as a previous "word") ? + if((n_digits == 3) && (word[-2] == langopts.thousands_sep) && isdigit(word[-3])) + { + prev_thousands = 1; + } + else + if((langopts.thousands_sep == ' ') || (langopts.numbers & 0x1000)) + { + // thousands groups can be separated by spaces + if((n_digits == 3) && isdigit(word[-2])) + { + prev_thousands = 1; + } + } + + if((word[0] == '0') && (prev_thousands == 0) && (word[1] != langopts.decimal_sep)) + { + return(0); // number string with leading zero, speak as individual digits + } + + if((langopts.numbers & 0x1000) && (word[n_digits] == ' ')) + thousands_inc = 1; + else + if(word[n_digits] == langopts.thousands_sep) + thousands_inc = 2; + + if(thousands_inc > 0) + { + // if the following "words" are three-digit groups, count them and add + // a "thousand"/"million" suffix to this one + + ix = n_digits + thousands_inc; + while(isdigit(word[ix]) && isdigit(word[ix+1]) && isdigit(word[ix+2])) + { + thousandplex++; + if(word[ix+3] == langopts.thousands_sep) + ix += (3 + thousands_inc); + else + break; + } + } + + if((value == 0) && prev_thousands) + { + suppress_null = 1; + } + + if(word[n_digits] == langopts.decimal_sep) + { + // this "word" ends with a decimal point + Lookup("_dpt",ph_append); + decimal_point = 1; + } + else + if(suppress_null == 0) + { + if(thousands_inc > 0) + { + if((thousandplex > 0) && (value < 1000)) + { + if(langopts.numbers & 0x40000) + { + if((thousandplex == 1) && (value >= 100)) + { + // special word for 100,000's + char ph_buf3[20]; + sprintf(string,"_%dL",value / 100); + if(Lookup(string,ph_buf2) == 0) + { + LookupNum2(value/100,0,ph_buf2); + Lookup("_0L",ph_buf3); + strcat(ph_buf2,ph_buf3); + } + value %= 100; + if(value == 0) + suppress_null = 1; + } + } + if((suppress_null == 0) && (LookupThousands(value,thousandplex,ph_append))) + { + // found an exact match for N thousand + value = 0; + suppress_null = 1; + } + } + } + } + else + if((thousandplex > 1) && prev_thousands && (prev_value > 0)) + { + sprintf(string,"_0%s%d",M_Variant(value),thousandplex+1); + if(Lookup(string,buf1)==0) + { + // speak this thousandplex if there was no word for the previous thousandplex + sprintf(string,"_0M%d",thousandplex); + Lookup(string,ph_append); + } + } + + if((ph_append[0] == 0) && (word[n_digits] == '.') && (thousandplex == 0)) + { + Lookup("_.",ph_append); + } + + LookupNum3(value, ph_buf, suppress_null, thousandplex, prev_thousands); + sprintf(ph_out,"%s%s%s",ph_buf2,ph_buf,ph_append); + + + while(decimal_point) + { + n_digits++; + + decimal_count = 0; + while(isdigit(word[n_digits+decimal_count])) + decimal_count++; + + if(decimal_count > 1) + { + switch(langopts.numbers & 0x6000) + { + case 0x4000: + if(decimal_count < 4) + { + // Polish decimal fraction + if ((word[n_digits] != '0')) + { + LookupNum3(atoi(&word[n_digits]),buf1,0,0,0); + strcat(ph_out,buf1); + n_digits += decimal_count; + } + else + if ((word[n_digits+1] != '0')) + { + Lookup("_0",buf1); + strcat(ph_out,buf1); + LookupNum3(atoi(&word[n_digits]),buf1,0,0,0); + strcat(ph_out,buf1); + n_digits += decimal_count; + } + } + break; + + case 0x2000: + // Italian decimal fractions + if((decimal_count < 4) || ((decimal_count==4) && (word[n_digits] != '0'))) + { + LookupNum3(atoi(&word[n_digits]),buf1,0,0,0); + strcat(ph_out,buf1); + if(word[n_digits]=='0') + { + // decimal part has leading zeros, so add a "hundredths" or "thousandths" suffix + sprintf(string,"_0Z%d",decimal_count); + Lookup(string,buf1); + strcat(ph_out,buf1); + } + n_digits += decimal_count; + } + break; + + case 0x6000: + // Romanian decimal fractions + if((decimal_count <= 4) && (word[n_digits] != '0')) + { + LookupNum3(atoi(&word[n_digits]),buf1,0,0,0); + strcat(ph_out,buf1); + n_digits += decimal_count; + } + break; + } + } + + while(isdigit(c = word[n_digits]) && (strlen(ph_out) < (N_WORD_PHONEMES - 10))) + { + value = word[n_digits++] - '0'; + LookupNum2(value, 1, buf1); + strcat(ph_out,buf1); + } + + // something after the decimal part ? + if(Lookup("_dpt2",buf1)) + strcat(ph_out,buf1); + + if(c == langopts.decimal_sep) + { + Lookup("_dpt",buf1); + strcat(ph_out,buf1); + } + else + { + decimal_point = 0; + } + } + if(ph_out[0] != 0) + { + int next_char; + utf8_in(&next_char,&word[n_digits+1],0); + if(!iswalpha(next_char)) + strcat(ph_out,str_pause); // don't add pause for 100s, 6th, etc. + } + + *flags = FLAG_FOUND; + prev_value = this_value; + return(1); +} // end of TranslateNumber_1 + + + +int Translator::TranslateNumber(char *word1, char *ph_out, unsigned int *flags, int wflags) +{//======================================================================================= + if(option_sayas == SAYAS_DIGITS1) + return(0); // speak digits individually + + if((langopts.numbers & 0x3) == 1) + return(TranslateNumber_1(word1,ph_out,flags,wflags)); + + return(0); +} // end of TranslateNumber + diff --git a/src/options.cpp b/src/options.cpp new file mode 100755 index 00000000..1de43274 --- /dev/null +++ b/src/options.cpp @@ -0,0 +1,197 @@ +/*************************************************************************** + * Copyright (C) 2005,2006 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "wx/wx.h" +#include "wx/fileconf.h" +#include "sys/stat.h" +#include "speech.h" + +#ifdef PLATFORM_WINDOWS +#include "wx/msw/registry.h" +#endif + +#include "main.h" + +#include "options.h" + +extern void WavegenInit(int samplerate, int wavemult_fact); +extern void strncpy0(char *to,const char *from, int size); +extern int GetNumeric(wxTextCtrl *t); +extern void SetNumeric(wxTextCtrl *t, int value); +extern int samplerate; +extern char path_home[120]; // .speak directory in user's HOME +extern char voice_name[40]; + +wxString basedir; +wxString path_spectload; +wxString path_spectload2; +wxString path_pitches; +wxString path_wave; +wxString path_speech; +wxString path_voices; +wxString path_phsource; +wxString path_dictsource; +wxString path_speaktext; +int option_speed=160; + +char path_dsource[80]; + +BEGIN_EVENT_TABLE(Options, wxDialog) + EVT_BUTTON(wxID_SAVE,Options::OnCommand) + EVT_BUTTON(wxID_CLOSE,Options::OnCommand) +END_EVENT_TABLE() + + +Options::Options(wxWindow *parent) : wxDialog(parent,-1,_T("Options"),wxDefaultPosition,wxDefaultSize) +{//=================================================================================================== + + m_lab[0] = new wxStaticText(this,-1,_T("Sample rate"),wxPoint(72,84)); + m_samplerate = new wxTextCtrl(this,-1,_T(""),wxPoint(8,80),wxSize(60,24)); + SetNumeric(m_samplerate,samplerate); + + m_save = new wxButton(this,wxID_SAVE,_T("Save"),wxPoint(8,120)); + m_close = new wxButton(this,wxID_CLOSE,_T("Cancel"),wxPoint(98,120)); + Show(); +} + + +Options::~Options() +{//================ + int ix; + + for(ix=0; ix < 1; ix++) + delete m_lab[ix]; + + delete m_samplerate; + delete m_save; + delete m_close; +} + +void Options::OnCommand(wxCommandEvent& event) +{//=========================================== + int id; + int value; + + switch(id = event.GetId()) + { + case wxID_SAVE: + value = GetNumeric(m_samplerate); + if(value > 0) WavegenInit(value,0); + + Destroy(); + break; + + case wxID_CLOSE: + Destroy(); + break; + } +} + + + +void ConfigSetPaths() +{//================== + // set paths from wxStrings + strncpy0(path_source,path_phsource.mb_str(wxConvLocal),sizeof(path_source)-1); + strcat(path_source,"/"); + + strncpy0(path_dsource,path_dictsource.mb_str(wxConvLocal),sizeof(path_source)-1); + strcat(path_dsource,"/"); +} + + +void ConfigInit() +{//============== + long value; + wxString string; + const char *path_base; + +#ifdef PLATFORM_WINDOWS + char buf[200]; + wxRegKey *pRegKey = new wxRegKey(_T("HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Speech\\Voices\\Tokens\\eSpeak")); + + if(pRegKey->Exists() ) + { + wxString RegVal; + pRegKey->QueryValue(_T("Path"),RegVal); + strcpy(buf,RegVal.mb_str(wxConvLocal)); + path_base = buf; + } + else + { + path_base = "C:\\Program Files\\eSpeak"; + } + sprintf(path_home,"%s\\espeak-data",path_base); +#else + snprintf(path_home,sizeof(path_home),"%s/espeak-data",getenv("HOME")); + path_base = path_home; +#endif + mkdir(path_home,S_IRWXU); // create if it doesn't already exist + + wxFileConfig *pConfig = new wxFileConfig(_T("espeakedit")); + wxFileConfig::Set(pConfig); + + pConfig->Read(_T("/samplerate"),&value,22050); +#ifdef PLATFORM_WINDOWS + value = 22050; +#endif + WavegenInit(value,0); + + pConfig->Read(_T("/basedir"),&basedir,wxString(path_base,wxConvLocal)); + pConfig->Read(_T("/spectload"),&path_spectload,basedir+_T("/phsource")); + pConfig->Read(_T("/spectload2"),&path_spectload2,basedir+_T("/phsource")); + pConfig->Read(_T("/pitchpath"),&path_pitches,basedir+_T("/pitch")); + pConfig->Read(_T("/wavepath"),&path_wave,wxEmptyString); + pConfig->Read(_T("/speechpath"),&path_speech,wxEmptyString); + pConfig->Read(_T("/voicepath"),&path_voices,basedir+_T("/voices")); + pConfig->Read(_T("/voicename"),&string,wxEmptyString); + strcpy(voice_name,string.mb_str(wxConvLocal)); + pConfig->Read(_T("/phsource"),&path_phsource,basedir+_T("/phsource")); + pConfig->Read(_T("/dictsource"),&path_dictsource,basedir+_T("/dictsource")); + pConfig->Read(_T("/speaktext"),&path_speaktext,wxEmptyString); + option_speed = pConfig->Read(_T("/speed"),160); + ConfigSetPaths(); +} // end of ConfigInit + + + +void ConfigSave(int exit) +{//====================== + wxFileConfig *pConfig = (wxFileConfig *)(wxConfigBase::Get()); + +#ifndef PLATFORM_WINDOWS + pConfig->Write(_T("/samplerate"),samplerate); +#endif + pConfig->Write(_T("/basedir"),basedir); + pConfig->Write(_T("/spectload"),path_spectload); + pConfig->Write(_T("/spectload2"),path_spectload2); + pConfig->Write(_T("/pitchpath"),path_pitches); + pConfig->Write(_T("/wavepath"),path_wave); + pConfig->Write(_T("/speechpath"),path_speech); + pConfig->Write(_T("/voicepath"),path_voices); + pConfig->Write(_T("/voicename"),wxString(voice_name,wxConvLocal)); + pConfig->Write(_T("/phsource"),path_phsource); + pConfig->Write(_T("/dictsource"),path_dictsource); + pConfig->Write(_T("/speaktext"),path_speaktext); + pConfig->Write(_T("/speed"),option_speed); + + if(exit) + delete wxFileConfig::Set((wxFileConfig *)NULL); +} diff --git a/src/options.h b/src/options.h new file mode 100755 index 00000000..2d862e74 --- /dev/null +++ b/src/options.h @@ -0,0 +1,62 @@ +/*************************************************************************** + options.h - description + ------------------- + begin : Sat Mar 13 2004 + copyright : (C) 2004 by Jonathan Duddington + email : jsd@jsd.clara.co.uk + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef OPTIONS_H +#define OPTIONS_H + +#include "wx/dialog.h" +#include "wx/spinctrl.h" + +/** + *@author Jonathan Duddington + */ + +extern void ConfigInit(); +extern void ConfigSave(int end); +extern void ConfigSetPaths(); + +extern wxString path_spectload; +extern wxString path_spectload2; +extern wxString path_pitches; +extern wxString path_voices; +extern wxString path_phsource; +extern wxString path_dictsource; + +extern char path_source[80]; +extern char path_dsource[80]; + +extern int option_speed; + +// not currently used +class Options : public wxDialog { +public: + Options(wxWindow *parent); + ~Options(); + +private: + void OnCommand(wxCommandEvent& event); + + wxButton *m_save; + wxButton *m_close; + wxStaticText *m_lab[10]; + + wxTextCtrl *m_samplerate; + + DECLARE_EVENT_TABLE() +}; + +#endif diff --git a/src/phoneme.h b/src/phoneme.h new file mode 100755 index 00000000..470a2560 --- /dev/null +++ b/src/phoneme.h @@ -0,0 +1,147 @@ +/*************************************************************************** + * Copyright (C) 2005,2006 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + + +// phoneme types +#define phPAUSE 0 +#define phSTRESS 1 +#define phVOWEL 2 +#define phLIQUID 3 +#define phSTOP 4 +#define phVSTOP 5 +#define phFRICATIVE 6 +#define phVFRICATIVE 7 +#define phNASAL 8 +#define phVIRTUAL 9 +#define phINVALID 15 + + +// phoneme properties +// bits 16-19 give place of articulation (not currently used) +#define phWAVE 0x01 +#define phUNSTRESSED 0x02 +#define phFORTIS 0x08 +#define phVOICED 0x10 +#define phSIBILANT 0x20 +#define phNOLINK 0x40 +#define phTRILL 0x80 +#define phVOWEL2 0x100 // liquid that is considered a vowel +#define phPALATAL 0x200 +#define phLONG 0x1000 +#define phAPPENDPH 0x2000 // always insert another phoneme (link_out) after this one + +#define phALTERNATIVE 0x0c00 // bits 10,11 specifying use of alternative_ph +#define phBEFOREVOWEL 0x0000 +#define phBEFOREVOWELPAUSE 0x0400 +#define phBEFORENOTVOWEL 0x0c00 +#define phSWITCHVOICING 0x0800 + +// fixed phoneme code numbers, these can be used from the program code +#define phonCONTROL 1 +#define phonSTRESS_U 2 +#define phonSTRESS_D 3 +#define phonSTRESS_2 4 +#define phonSTRESS_3 5 +#define phonSTRESS_P 6 +#define phonSTRESS_TONIC 7 +#define phonSTRESS_PREV 8 +#define phonPAUSE 9 +#define phonPAUSE_SHORT 10 +#define phonPAUSE_NOLINK 11 +#define phonLENGTHEN 12 +#define phonSCHWA 13 +#define phonSCHWA_SHORT 14 +#define phonEND_WORD 15 +#define phonSONORANT 16 +#define phonDEFAULTTONE 17 +#define phonCAPITAL 18 +#define phonGLOTTALSTOP 19 +#define phonSYLLABIC 20 +#define phonSWITCH 21 +#define phonX1 22 // a language specific action +#define phonPAUSE_VSHORT 23 + + +// place of articulation +#define phPLACE 0xf0000 +#define phPLACE_pla 0x60000 + +#define N_PHONEME_TABS 50 // number of phoneme tables +#define N_PHONEME_TAB 256 // max phonemes in a phoneme table +#define N_PHONEME_TAB_NAME 32 // must be multiple of 4 + +// main table of phonemes, index by phoneme number (1-254) +typedef struct { + unsigned int mnemonic; // 1st char is in the l.s.byte + unsigned int phflags; // bits 28-30 reduce_to level, bits 16-19 place of articulation + // bits 10-11 alternative ph control + + unsigned short std_length; // for vowels, in mS; for phSTRESS, the stress/tone type + unsigned short spect; + unsigned short before; + unsigned short after; + + unsigned char code; // the phoneme number + unsigned char type; // phVOWEL, phPAUSE, phSTOP etc + unsigned char start_type; + unsigned char end_type; + + unsigned char length_mod; // a length_mod group number, used to access length_mod_tab + unsigned char reduce_to; // change to this phoneme if unstressed + unsigned char alternative_ph; // change to this phoneme if a vowel follows/doesn't follow + unsigned char link_out; // insert linking phoneme if a vowel follows + +} PHONEME_TAB; + + +// Several phoneme tables may be loaded into memory. phoneme_tab points to +// one for the current voice +extern int n_phoneme_tab; +extern PHONEME_TAB *phoneme_tab[N_PHONEME_TAB]; +extern unsigned char phoneme_tab_flags[N_PHONEME_TAB]; // bit 0: not inherited + +typedef struct { + char name[N_PHONEME_TAB_NAME]; + PHONEME_TAB *phoneme_tab_ptr; + int n_phonemes; + int includes; // also include the phonemes from this other phoneme table +} PHONEME_TAB_LIST; + + + +// table of phonemes to be replaced with different phonemes, for the current voice +#define N_REPLACE_PHONEMES 60 +typedef struct { + unsigned char old_ph; + unsigned char new_ph; + char type; // 0=always replace, 1=only at end of word +} REPLACE_PHONEMES; + +extern int n_replace_phonemes; +extern REPLACE_PHONEMES replace_phonemes[N_REPLACE_PHONEMES]; + + + +char *EncodePhonemes(char *p, char *outptr, unsigned char *bad_phoneme); +void DecodePhonemes(const char *inptr, char *outptr); +const char *PhonemeTabName(void); +int LookupPh(const char *string); +extern const char *WordToString(unsigned int word); + diff --git a/src/phonemelist.cpp b/src/phonemelist.cpp new file mode 100755 index 00000000..53e04937 --- /dev/null +++ b/src/phonemelist.cpp @@ -0,0 +1,575 @@ +/*************************************************************************** + * Copyright (C) 2007 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "StdAfx.h" + +#include +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "translate.h" + + + + +int Translator::ChangePhonemes(PHONEME_LIST2 *phlist, int n_ph, int index, PHONEME_TAB *ph, CHANGEPH *ch) +{//====================================================================================================== +// Called for each phoneme in the phoneme list, to allow a language to make changes +// flags: bit 0=1 last phoneme in a word +// bit 1=1 this is the highest stressed vowel in the current word +// bit 2=1 after the highest stressed vowel in the current word +// bit 3=1 the phonemes were specified explicitly, or found from an entry in the xx_list dictionary +// ph The current phoneme + return(0); +} + + +int Translator::SubstitutePhonemes(PHONEME_LIST2 *plist_out) +{//========================================================= +// Copy the phonemes list and perform any substitutions that are required for the +// current voice + int ix; + int k; + int replace_flags; + int n_plist_out = 0; + int word_end; + int max_stress = -1; + int switched_language = 0; + int max_stress_posn=0; + int n_syllables = 0; + int syllable = 0; + int syllable_stressed = 0; + PHONEME_LIST2 *plist2; + PHONEME_LIST2 *pl; + PHONEME_TAB *next=NULL; + + for(ix=0; (ix < n_ph_list2) && (n_plist_out < N_PHONEME_LIST); ix++) + { + plist2 = &ph_list2[ix]; + + if(plist2->phcode == phonSWITCH) + switched_language ^= 1; + + // don't do any substitution if the language has been temporarily changed + if(switched_language == 0) + { + if(ix < (n_ph_list2 -1)) + next = phoneme_tab[ph_list2[ix+1].phcode]; + + word_end = 0; + if((plist2+1)->sourceix || ((next != 0) && (next->type == phPAUSE))) + word_end = 1; // this phoneme is the end of a word + + if(langopts.phoneme_change != 0) + { + // this language does changes to phonemes after translation + + if(plist2->sourceix) + { + // start of a word, find the stressed vowel + syllable = 0; + syllable_stressed = 0; + n_syllables = 0; + + max_stress = -1; + max_stress_posn = ix; + for(k=ix; k < n_ph_list2; k++) + { + if(((pl = &ph_list2[k])->sourceix != 0) && (k > ix)) + break; + + pl->stress &= 0xf; + + if(phoneme_tab[pl->phcode]->type == phVOWEL) + { + n_syllables++; + + if(pl->stress > max_stress) + { + syllable_stressed = n_syllables; + max_stress = pl->stress; + max_stress_posn = k; + } + } + } + } + + if(phoneme_tab[plist2->phcode]->type == phVOWEL) + { + syllable++; + } + + // make any language specific changes + int flags; + CHANGEPH ch; + flags = 0; + if(ix == max_stress_posn) + flags |= 2; + if(ix > max_stress_posn) + flags |= 4; + if(ph_list2[ix].synthflags & SFLAG_DICTIONARY) + flags |= 8; + ch.flags = flags | word_end; + + ch.stress = plist2->stress; + ch.stress_highest = max_stress; + ch.n_vowels = n_syllables; + ch.vowel_this = syllable; + ch.vowel_stressed = syllable_stressed; + + ChangePhonemes(ph_list2, n_ph_list2, ix, phoneme_tab[ph_list2[ix].phcode], &ch); + } + + // check whether a Voice has specified that we should replace this phoneme + for(k=0; kphcode == replace_phonemes[k].old_ph) + { + replace_flags = replace_phonemes[k].type; + + if((replace_flags & 1) && (word_end == 0)) + continue; // this replacement only occurs at the end of a word + + if((replace_flags & 2) && ((plist2->stress & 0x7) > 3)) + continue; // this replacement doesn't occur in stressed syllables + + // substitute the replacement phoneme + plist2->phcode = replace_phonemes[k].new_ph; + break; + } + } + + if(plist2->phcode == 0) + { + continue; // phoneme has been replaced by NULL, so don't copy it + } + } + + // copy phoneme into the output list + memcpy(&plist_out[n_plist_out++],plist2,sizeof(PHONEME_LIST2)); + } + return(n_plist_out); +} // end of SubstitutePhonemes + + + +void Translator::MakePhonemeList(int post_pause, int start_sentence) +{//============================================================================================ + + int ix=0; + int j; + int insert_ph = 0; + int insert_synthflags = 0; + PHONEME_LIST *phlist; + PHONEME_TAB *ph; + PHONEME_TAB *prev, *next, *next2; + int unstress_count = 0; + int word_has_stress = 0; + int switched_language = 0; + int max_stress; + int voicing; + int regression; + int end_sourceix; + int alternative; + PHONEME_LIST2 ph_list3[N_PHONEME_LIST]; + + static PHONEME_LIST2 ph_list2_null = {0,0,0,0,0}; + PHONEME_LIST2 *plist2 = &ph_list2_null; + + phlist = phoneme_list; + end_sourceix = ph_list2[n_ph_list2-1].sourceix; + + // is the last word of the clause unstressed ? + max_stress = 0; + for(j=n_ph_list2-3; j>=0; j--) + { + // start with the last phoneme (before the terminating pauses) and move forwards + if((ph_list2[j].stress & 0x7f) > max_stress) + max_stress = ph_list2[j].stress & 0x7f; + if(ph_list2[j].sourceix != 0) + break; + } + if(max_stress < 4) + { + // the last word is unstressed, look for a previous word that can be stressed + while(--j >= 0) + { + if(ph_list2[j].stress & 0x80) // dictionary flags indicated that this stress can be promoted + { + ph_list2[j].stress = 4; // promote to stressed + break; + } + if((ph_list2[j].stress & 0x7f) >= 4) + { + // found a stressed syllable, so stop looking + break; + } + } + } + + if((regression = langopts.param[LOPT_REGRESSIVE_VOICING]) != 0) + { + // set consonant clusters to all voiced or all unvoiced + // Regressive + int type; + voicing = 0; + + for(j=n_ph_list2-1; j>=0; j--) + { + ph = phoneme_tab[ph_list2[j].phcode]; + if(ph == NULL) + continue; + + if(ph->code == phonSWITCH) + switched_language ^= 1; + if(switched_language) + continue; + + type = ph->type; + + if(regression & 0x2) + { + // LANG=Russian, [v] amd [v;] don't cause regression + if((ph->mnemonic == 'v') || (ph->mnemonic == ((';'<<8)+'v'))) + type = phLIQUID; + } + + if((type==phSTOP) || type==(phFRICATIVE)) + { + if(voicing==0) + { + voicing = 1; + } + else + if((voicing==2) && ((ph->phflags & phALTERNATIVE)==phSWITCHVOICING)) + { + ph_list2[j].phcode = ph->alternative_ph; // change to voiced equivalent + } + } + else + if((type==phVSTOP) || type==(phVFRICATIVE)) + { + if(voicing==0) + { + voicing = 2; + } + else + if((voicing==1) && ((ph->phflags & phALTERNATIVE)==phSWITCHVOICING)) + { + ph_list2[j].phcode = ph->alternative_ph; // change to unvoiced equivalent + } + } + else + { + if(regression & 0x8) + { + // LANG=Polish, propagate through liquids and nasals + if((type == phPAUSE) || (type == phVOWEL)) + voicing = 0; + } + else + { + voicing = 0; + } + } + if((regression & 0x4) && (ph_list2[j].sourceix)) + { + // stop propagation at a word boundary + voicing = 0; + } + } + } + + n_ph_list2 = SubstitutePhonemes(ph_list3) - 2; + + // transfer all the phonemes of the clause into phoneme_list + ph = phoneme_tab[phonPAUSE]; + switched_language = 0; + + for(j=0; insert_ph || ((jphcode]; // this phoneme, i.e. after the insert + plist2 = &ph_list2_null; + ph = phoneme_tab[insert_ph]; + plist2->synthflags = insert_synthflags; + insert_ph = 0; + insert_synthflags = 0; + } + else + { + // otherwise get the next phoneme from the list + ph = phoneme_tab[plist2->phcode]; + + if(plist2->phcode == phonSWITCH) + { + // change phoneme table + SelectPhonemeTable(plist2->tone_number); + switched_language ^= SFLAG_SWITCHED_LANG; + } + next = phoneme_tab[(plist2+1)->phcode]; // the phoneme after this one + } + + if(plist2->sourceix) + word_has_stress = 0; // start of a word + + if(ph == NULL) continue; + + if(ph->type == phVOWEL) + { + // check for consecutive unstressed syllables + if(plist2->stress == 0) + { + // an unstressed vowel + unstress_count++; + if((unstress_count > 1) && ((unstress_count & 1)==0)) + { + // in a sequence of unstressed syllables, reduce alternate syllables to 'diminished' + // stress. But not for the last phoneme of a stressed word + if((langopts.stress_flags & 0x2) || (word_has_stress && ((plist2+1)->sourceix!=0))) + { + // An unstressed final vowel of a stressed word + unstress_count=1; // try again for next syllable + } + else + { + plist2->stress = 1; // change stress to 'diminished' + } + } + } + else + { + unstress_count = 0; + if(plist2->stress > 3) + word_has_stress = 1; // word has a primary or a secondary stress + } + } + + if(ph->alternative_ph > 0) + { + alternative = 0; + + switch(ph->phflags & phALTERNATIVE) + { + // This phoneme changes if vowel follows, or doesn't follow, depending on its phNOTFOLLOWS flag + case phBEFORENOTVOWEL: + if(next->type != phVOWEL) + alternative = ph->alternative_ph; + break; + + case phBEFOREVOWELPAUSE: + if((next->type == phVOWEL) || (next->type == phPAUSE)) + alternative = ph->alternative_ph; + break; + + case phBEFOREVOWEL: + if(next->type == phVOWEL) + alternative = ph->alternative_ph; + break; + } + + if(alternative == 1) + continue; // NULL phoneme, discard + + if(alternative > 1) + { + ph = phoneme_tab[alternative]; + if(ph->type == phVOWEL) + plist2->synthflags |= SFLAG_SYLLABLE; + else + plist2->synthflags &= ~SFLAG_SYLLABLE; + } + } + +#ifdef deleted +// experimenting with [t] glottaling +if((ph->mnemonic == 't') && ((prev->type == phVOWEL) || (prev->mnemonic == 'n'))) +{ + if(((plist2+1)->sourceix != 0) || ((plist2-1)->stress == 4) && (next->type == phVOWEL)) + { + ph = phoneme_tab[phonGLOTTALSTOP]; + } +} +#endif + + if((plist2+1)->synthflags & SFLAG_LENGTHEN) + { + static char types_double[] = {phFRICATIVE,phVFRICATIVE,phNASAL,phLIQUID,0}; + if(strchr(types_double,next->type)) + { + // lengthen this consonant by doubling it + insert_ph = next->code; + (plist2+1)->synthflags ^= SFLAG_LENGTHEN; + } + } + + if((plist2+1)->sourceix != 0) + { + int x; + + if(langopts.word_gap & 1) + { + insert_ph = phonPAUSE_VSHORT; + } + if(langopts.vowel_pause && (ph->type != phPAUSE) && (next->type == phVOWEL)) + { + if(langopts.vowel_pause & 0x04) + { + // break before a word which starts with a vowel + insert_ph = phonPAUSE_VSHORT; + } + + if((ph->type == phVOWEL) && ((x = langopts.vowel_pause & 0x03) != 0)) + { + // adjacent vowels over a word boundary + if(x == 2) + insert_ph = phonPAUSE_SHORT; + else + insert_ph = phonPAUSE_VSHORT; + } + + if(((plist2+1)->stress >= 4) && (langopts.vowel_pause & 0x08)) + { + // pause before a words which starts with a stressed vowel + insert_ph = phonPAUSE_SHORT; + } + } + } + + next2 = phoneme_tab[(plist2+2)->phcode]; + +#ifdef deleted + if((ph->type != phVOWEL) && (ph->type != phPAUSE) //&& ((ph->phflags & phVOICED)==0) + && (next->type == phLIQUID) && (next->mnemonic != ';') && (next2->type != phVOWEL)) + { + // semi-vowel surrounded by consonants. precede by a short schwa + insert_ph = phonSCHWA_SHORT; + insert_synthflags = SFLAG_SYLLABLE; + } + + if((ph->type == phLIQUID) && (prev->type != phVOWEL) && (next->type != phVOWEL)) + { + // semi-vowel surrounded by consonants. precede by a short schwa + insert_ph = phonSCHWA_SHORT; + insert_synthflags = SFLAG_SYLLABLE; + } +#endif + + if((insert_ph == 0) && (ph->link_out != 0) && (((plist2+1)->synthflags & SFLAG_EMBEDDED)==0)) + { + if(ph->phflags & phAPPENDPH) + { + // always append the specified phoneme, unless it already is the next phoneme + if((ph->link_out != (plist2+1)->phcode) && (next->type == phVOWEL)) +// if(ph->link_out != (plist2+1)->phcode) + { + insert_ph = ph->link_out; + } + } + else + if(((langopts.word_gap & 2)==0) || ((plist2+1)->sourceix == 0)) + { + // This phoneme can be linked to a following vowel by inserting a linking phoneme + if(next->type == phVOWEL) + insert_ph = ph->link_out; + else + if(next->code == phonPAUSE_SHORT) + { + // Pause followed by Vowel, replace the Short Pause with the linking phoneme, + if(next2->type == phVOWEL) + (plist2+1)->phcode = ph->link_out; // replace pause by linking phoneme + } + } + } + + if(ph->phflags & phVOICED) + { + // check that a voiced consonant is preceded or followed by a vowel or liquid + // and if not, add a short schwa + + // not yet implemented + } + + phlist[ix].ph = ph; + phlist[ix].type = ph->type; + phlist[ix].env = PITCHfall; // default, can be changed in the "intonation" module + phlist[ix].synthflags = plist2->synthflags | switched_language; + phlist[ix].tone = plist2->stress & 0xf; + phlist[ix].tone_ph = plist2->tone_number; + phlist[ix].sourceix = 0; + + if(plist2->sourceix != 0) + { + phlist[ix].sourceix = plist2->sourceix; + phlist[ix].newword = 1; // this phoneme is the start of a word + + if(start_sentence) + { + phlist[ix].newword = 5; // start of sentence + start of word + start_sentence = 0; + } + } + else + { + phlist[ix].newword = 0; + } + + phlist[ix].length = ph->std_length; + + if(ph->type==phVOWEL || ph->type==phLIQUID || ph->type==phNASAL || ph->type==phVSTOP || ph->type==phVFRICATIVE) + { + phlist[ix].length = 128; // length_mod + phlist[ix].env = PITCHfall; + } + + phlist[ix].prepause = 0; + phlist[ix].amp = 20; // default, will be changed later + phlist[ix].pitch1 = 0x400; + phlist[ix].pitch2 = 0x400; + ix++; + } + phlist[ix].newword = 2; // end of clause + + phlist[ix].type = phPAUSE; // terminate with 2 Pause phonemes + phlist[ix].length = post_pause; // length of the pause, depends on the punctuation + phlist[ix].sourceix = end_sourceix; + phlist[ix].synthflags = 0; + + phlist[ix++].ph = phoneme_tab[phonPAUSE]; + phlist[ix].type = phPAUSE; + phlist[ix].length = 0; + phlist[ix].sourceix=0; + phlist[ix].synthflags = 0; + phlist[ix++].ph = phoneme_tab[phonPAUSE_VSHORT]; + + n_phoneme_list = ix; +} // end of MakePhonemeList + + diff --git a/src/portaudio.h b/src/portaudio.h new file mode 100755 index 00000000..2ab8e02a --- /dev/null +++ b/src/portaudio.h @@ -0,0 +1,466 @@ +// NOTE: Copy this file to portaudio.h in order to compile with V18 portaudio + + +#ifndef PORT_AUDIO_H +#define PORT_AUDIO_H + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* + * $Id: portaudio.h,v 1.5 2002/03/26 18:04:22 philburk Exp $ + * PortAudio Portable Real-Time Audio Library + * PortAudio API Header File + * Latest version available at: http://www.audiomulch.com/portaudio/ + * + * Copyright (c) 1999-2000 Ross Bencina and Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +typedef int PaError; +typedef enum { + paNoError = 0, + + paHostError = -10000, + paInvalidChannelCount, + paInvalidSampleRate, + paInvalidDeviceId, + paInvalidFlag, + paSampleFormatNotSupported, + paBadIODeviceCombination, + paInsufficientMemory, + paBufferTooBig, + paBufferTooSmall, + paNullCallback, + paBadStreamPtr, + paTimedOut, + paInternalError, + paDeviceUnavailable +} PaErrorNum; + +/* + Pa_Initialize() is the library initialisation function - call this before + using the library. + +*/ + +PaError Pa_Initialize( void ); + +/* + Pa_Terminate() is the library termination function - call this after + using the library. + +*/ + +PaError Pa_Terminate( void ); + +/* + Pa_GetHostError() returns a host specific error code. + This can be called after receiving a PortAudio error code of paHostError. + +*/ + +long Pa_GetHostError( void ); + +/* + Pa_GetErrorText() translates the supplied PortAudio error number + into a human readable message. + +*/ + +const char *Pa_GetErrorText( PaError errnum ); + +/* + Sample formats + + These are formats used to pass sound data between the callback and the + stream. Each device has a "native" format which may be used when optimum + efficiency or control over conversion is required. + + Formats marked "always available" are supported (emulated) by all + PortAudio implementations. + + The floating point representation (paFloat32) uses +1.0 and -1.0 as the + maximum and minimum respectively. + + paUInt8 is an unsigned 8 bit format where 128 is considered "ground" + +*/ + +typedef unsigned long PaSampleFormat; +#define paFloat32 ((PaSampleFormat) (1<<0)) /*always available*/ +#define paInt16 ((PaSampleFormat) (1<<1)) /*always available*/ +#define paInt32 ((PaSampleFormat) (1<<2)) /*always available*/ +#define paInt24 ((PaSampleFormat) (1<<3)) +#define paPackedInt24 ((PaSampleFormat) (1<<4)) +#define paInt8 ((PaSampleFormat) (1<<5)) +#define paUInt8 ((PaSampleFormat) (1<<6)) +#define paCustomFormat ((PaSampleFormat) (1<<16)) + +/* + Device enumeration mechanism. + + Device ids range from 0 to Pa_CountDevices()-1. + + Devices may support input, output or both. + +*/ + +typedef int PaDeviceID; +#define paNoDevice -1 + +int Pa_CountDevices( void ); + +typedef struct +{ + int structVersion; + const char *name; + int maxInputChannels; + int maxOutputChannels; + /* Number of discrete rates, or -1 if range supported. */ + int numSampleRates; + /* Array of supported sample rates, or {min,max} if range supported. */ + const double *sampleRates; + PaSampleFormat nativeSampleFormats; +} +PaDeviceInfo; + +/* + Pa_GetDefaultInputDeviceID(), Pa_GetDefaultOutputDeviceID() return the + default device ids for input and output respectively, or paNoDevice if + no device is available. + The result can be passed to Pa_OpenStream(). + + On the PC, the user can specify a default device by + setting an environment variable. For example, to use device #1. + + set PA_RECOMMENDED_OUTPUT_DEVICE=1 + + The user should first determine the available device ids by using + the supplied application "pa_devs". + +*/ + +PaDeviceID Pa_GetDefaultInputDeviceID( void ); +PaDeviceID Pa_GetDefaultOutputDeviceID( void ); + + + +/* + Pa_GetDeviceInfo() returns a pointer to an immutable PaDeviceInfo structure + for the device specified. + If the device parameter is out of range the function returns NULL. + + PortAudio manages the memory referenced by the returned pointer, the client + must not manipulate or free the memory. The pointer is only guaranteed to be + valid between calls to Pa_Initialize() and Pa_Terminate(). + +*/ + +const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceID device ); + +/* + PaTimestamp is used to represent a continuous sample clock with arbitrary + start time that can be used for syncronization. The type is used for the + outTime argument to the PortAudioCallback and as the result of Pa_StreamTime() + +*/ + +typedef double PaTimestamp; + +/* + PortAudioCallback is implemented by PortAudio clients. + + inputBuffer and outputBuffer are arrays of interleaved samples, + the format, packing and number of channels used by the buffers are + determined by parameters to Pa_OpenStream() (see below). + + framesPerBuffer is the number of sample frames to be processed by the callback. + + outTime is the time in samples when the buffer(s) processed by + this callback will begin being played at the audio output. + See also Pa_StreamTime() + + userData is the value of a user supplied pointer passed to Pa_OpenStream() + intended for storing synthesis data etc. + + return value: + The callback can return a non-zero value to stop the stream. This may be + useful in applications such as soundfile players where a specific duration + of output is required. However, it is not necessary to utilise this mechanism + as StopStream() will also terminate the stream. A callback returning a + non-zero value must fill the entire outputBuffer. + + NOTE: None of the other stream functions may be called from within the + callback function except for Pa_GetCPULoad(). + +*/ + +typedef int (PortAudioCallback)( + void *inputBuffer, void *outputBuffer, + unsigned long framesPerBuffer, + PaTimestamp outTime, void *userData ); + + +/* + Stream flags + + These flags may be supplied (ored together) in the streamFlags argument to + the Pa_OpenStream() function. + +*/ + +#define paNoFlag (0) +#define paClipOff (1<<0) /* disable default clipping of out of range samples */ +#define paDitherOff (1<<1) /* disable default dithering */ +#define paPlatformSpecificFlags (0x00010000) +typedef unsigned long PaStreamFlags; + +/* + A single PortAudioStream provides multiple channels of real-time + input and output audio streaming to a client application. + Pointers to PortAudioStream objects are passed between PortAudio functions. +*/ + +typedef void PortAudioStream; +#define PaStream PortAudioStream + +/* + Pa_OpenStream() opens a stream for either input, output or both. + + stream is the address of a PortAudioStream pointer which will receive + a pointer to the newly opened stream. + + inputDevice is the id of the device used for input (see PaDeviceID above.) + inputDevice may be paNoDevice to indicate that an input device is not required. + + numInputChannels is the number of channels of sound to be delivered to the + callback. It can range from 1 to the value of maxInputChannels in the + PaDeviceInfo record for the device specified by the inputDevice parameter. + If inputDevice is paNoDevice numInputChannels is ignored. + + inputSampleFormat is the sample format of inputBuffer provided to the callback + function. inputSampleFormat may be any of the formats described by the + PaSampleFormat enumeration (see above). PortAudio guarantees support for + the device's native formats (nativeSampleFormats in the device info record) + and additionally 16 and 32 bit integer and 32 bit floating point formats. + Support for other formats is implementation defined. + + inputDriverInfo is a pointer to an optional driver specific data structure + containing additional information for device setup or stream processing. + inputDriverInfo is never required for correct operation. If not used + inputDriverInfo should be NULL. + + outputDevice is the id of the device used for output (see PaDeviceID above.) + outputDevice may be paNoDevice to indicate that an output device is not required. + + numOutputChannels is the number of channels of sound to be supplied by the + callback. See the definition of numInputChannels above for more details. + + outputSampleFormat is the sample format of the outputBuffer filled by the + callback function. See the definition of inputSampleFormat above for more + details. + + outputDriverInfo is a pointer to an optional driver specific data structure + containing additional information for device setup or stream processing. + outputDriverInfo is never required for correct operation. If not used + outputDriverInfo should be NULL. + + sampleRate is the desired sampleRate. For full-duplex streams it is the + sample rate for both input and output + + framesPerBuffer is the length in sample frames of all internal sample buffers + used for communication with platform specific audio routines. Wherever + possible this corresponds to the framesPerBuffer parameter passed to the + callback function. + + numberOfBuffers is the number of buffers used for multibuffered communication + with the platform specific audio routines. If you pass zero, then an optimum + value will be chosen for you internally. This parameter is provided only + as a guide - and does not imply that an implementation must use multibuffered + i/o when reliable double buffering is available (such as SndPlayDoubleBuffer() + on the Macintosh.) + + streamFlags may contain a combination of flags ORed together. + These flags modify the behaviour of the streaming process. Some flags may only + be relevant to certain buffer formats. + + callback is a pointer to a client supplied function that is responsible + for processing and filling input and output buffers (see above for details.) + + userData is a client supplied pointer which is passed to the callback + function. It could for example, contain a pointer to instance data necessary + for processing the audio buffers. + + return value: + Upon success Pa_OpenStream() returns PaNoError and places a pointer to a + valid PortAudioStream in the stream argument. The stream is inactive (stopped). + If a call to Pa_OpenStream() fails a non-zero error code is returned (see + PaError above) and the value of stream is invalid. + +*/ + +PaError Pa_OpenStream( PortAudioStream** stream, + PaDeviceID inputDevice, + int numInputChannels, + PaSampleFormat inputSampleFormat, + void *inputDriverInfo, + PaDeviceID outputDevice, + int numOutputChannels, + PaSampleFormat outputSampleFormat, + void *outputDriverInfo, + double sampleRate, + unsigned long framesPerBuffer, + unsigned long numberOfBuffers, + PaStreamFlags streamFlags, + PortAudioCallback *callback, + void *userData ); + + +/* + Pa_OpenDefaultStream() is a simplified version of Pa_OpenStream() that opens + the default input and/or output devices. Most parameters have identical meaning + to their Pa_OpenStream() counterparts, with the following exceptions: + + If either numInputChannels or numOutputChannels is 0 the respective device + is not opened. This has the same effect as passing paNoDevice in the device + arguments to Pa_OpenStream(). + + sampleFormat applies to both the input and output buffers. + +*/ + +PaError Pa_OpenDefaultStream( PortAudioStream** stream, + int numInputChannels, + int numOutputChannels, + PaSampleFormat sampleFormat, + double sampleRate, + unsigned long framesPerBuffer, + unsigned long numberOfBuffers, + PortAudioCallback *callback, + void *userData ); + +/* + Pa_CloseStream() closes an audio stream, flushing any pending buffers. + +*/ + +PaError Pa_CloseStream( PortAudioStream* ); + +/* + Pa_StartStream() and Pa_StopStream() begin and terminate audio processing. + Pa_StopStream() waits until all pending audio buffers have been played. + Pa_AbortStream() stops playing immediately without waiting for pending + buffers to complete. + +*/ + +PaError Pa_StartStream( PortAudioStream *stream ); + +PaError Pa_StopStream( PortAudioStream *stream ); + +PaError Pa_AbortStream( PortAudioStream *stream ); + +/* + Pa_StreamActive() returns one (1) when the stream is active (ie playing + or recording audio), zero (0) when not playing, or a negative error number + if the stream is invalid. + The stream is active between calls to Pa_StartStream() and Pa_StopStream(), + but may also become inactive if the callback returns a non-zero value. + In the latter case, the stream is considered inactive after the last + buffer has finished playing. + +*/ + +PaError Pa_StreamActive( PortAudioStream *stream ); + +/* + Pa_StreamTime() returns the current output time in samples for the stream. + This time may be used as a time reference (for example synchronizing audio to + MIDI). + +*/ + +PaTimestamp Pa_StreamTime( PortAudioStream *stream ); + +/* + Pa_GetCPULoad() returns the CPU Load for the stream. + The "CPU Load" is a fraction of total CPU time consumed by the stream's + audio processing routines including, but not limited to the client supplied + callback. + A value of 0.5 would imply that PortAudio and the sound generating + callback was consuming roughly 50% of the available CPU time. + This function may be called from the callback function or the application. + +*/ + +double Pa_GetCPULoad( PortAudioStream* stream ); + +/* + Pa_GetMinNumBuffers() returns the minimum number of buffers required by + the current host based on minimum latency. + On the PC, for the DirectSound implementation, latency can be optionally set + by user by setting an environment variable. + For example, to set latency to 200 msec, put: + + set PA_MIN_LATENCY_MSEC=200 + + in the AUTOEXEC.BAT file and reboot. + If the environment variable is not set, then the latency will be determined + based on the OS. Windows NT has higher latency than Win95. + +*/ + +int Pa_GetMinNumBuffers( int framesPerBuffer, double sampleRate ); + +/* + Pa_Sleep() puts the caller to sleep for at least 'msec' milliseconds. + You may sleep longer than the requested time so don't rely on this for + accurate musical timing. + + Pa_Sleep() is provided as a convenience for authors of portable code (such as + the tests and examples in the PortAudio distribution.) + +*/ + +void Pa_Sleep( long msec ); + +/* + Pa_GetSampleSize() returns the size in bytes of a single sample in the + supplied PaSampleFormat, or paSampleFormatNotSupported if the format is + no supported. + +*/ + +PaError Pa_GetSampleSize( PaSampleFormat format ); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PORT_AUDIO_H */ diff --git a/src/portaudio18.h b/src/portaudio18.h new file mode 100755 index 00000000..2ab8e02a --- /dev/null +++ b/src/portaudio18.h @@ -0,0 +1,466 @@ +// NOTE: Copy this file to portaudio.h in order to compile with V18 portaudio + + +#ifndef PORT_AUDIO_H +#define PORT_AUDIO_H + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* + * $Id: portaudio.h,v 1.5 2002/03/26 18:04:22 philburk Exp $ + * PortAudio Portable Real-Time Audio Library + * PortAudio API Header File + * Latest version available at: http://www.audiomulch.com/portaudio/ + * + * Copyright (c) 1999-2000 Ross Bencina and Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +typedef int PaError; +typedef enum { + paNoError = 0, + + paHostError = -10000, + paInvalidChannelCount, + paInvalidSampleRate, + paInvalidDeviceId, + paInvalidFlag, + paSampleFormatNotSupported, + paBadIODeviceCombination, + paInsufficientMemory, + paBufferTooBig, + paBufferTooSmall, + paNullCallback, + paBadStreamPtr, + paTimedOut, + paInternalError, + paDeviceUnavailable +} PaErrorNum; + +/* + Pa_Initialize() is the library initialisation function - call this before + using the library. + +*/ + +PaError Pa_Initialize( void ); + +/* + Pa_Terminate() is the library termination function - call this after + using the library. + +*/ + +PaError Pa_Terminate( void ); + +/* + Pa_GetHostError() returns a host specific error code. + This can be called after receiving a PortAudio error code of paHostError. + +*/ + +long Pa_GetHostError( void ); + +/* + Pa_GetErrorText() translates the supplied PortAudio error number + into a human readable message. + +*/ + +const char *Pa_GetErrorText( PaError errnum ); + +/* + Sample formats + + These are formats used to pass sound data between the callback and the + stream. Each device has a "native" format which may be used when optimum + efficiency or control over conversion is required. + + Formats marked "always available" are supported (emulated) by all + PortAudio implementations. + + The floating point representation (paFloat32) uses +1.0 and -1.0 as the + maximum and minimum respectively. + + paUInt8 is an unsigned 8 bit format where 128 is considered "ground" + +*/ + +typedef unsigned long PaSampleFormat; +#define paFloat32 ((PaSampleFormat) (1<<0)) /*always available*/ +#define paInt16 ((PaSampleFormat) (1<<1)) /*always available*/ +#define paInt32 ((PaSampleFormat) (1<<2)) /*always available*/ +#define paInt24 ((PaSampleFormat) (1<<3)) +#define paPackedInt24 ((PaSampleFormat) (1<<4)) +#define paInt8 ((PaSampleFormat) (1<<5)) +#define paUInt8 ((PaSampleFormat) (1<<6)) +#define paCustomFormat ((PaSampleFormat) (1<<16)) + +/* + Device enumeration mechanism. + + Device ids range from 0 to Pa_CountDevices()-1. + + Devices may support input, output or both. + +*/ + +typedef int PaDeviceID; +#define paNoDevice -1 + +int Pa_CountDevices( void ); + +typedef struct +{ + int structVersion; + const char *name; + int maxInputChannels; + int maxOutputChannels; + /* Number of discrete rates, or -1 if range supported. */ + int numSampleRates; + /* Array of supported sample rates, or {min,max} if range supported. */ + const double *sampleRates; + PaSampleFormat nativeSampleFormats; +} +PaDeviceInfo; + +/* + Pa_GetDefaultInputDeviceID(), Pa_GetDefaultOutputDeviceID() return the + default device ids for input and output respectively, or paNoDevice if + no device is available. + The result can be passed to Pa_OpenStream(). + + On the PC, the user can specify a default device by + setting an environment variable. For example, to use device #1. + + set PA_RECOMMENDED_OUTPUT_DEVICE=1 + + The user should first determine the available device ids by using + the supplied application "pa_devs". + +*/ + +PaDeviceID Pa_GetDefaultInputDeviceID( void ); +PaDeviceID Pa_GetDefaultOutputDeviceID( void ); + + + +/* + Pa_GetDeviceInfo() returns a pointer to an immutable PaDeviceInfo structure + for the device specified. + If the device parameter is out of range the function returns NULL. + + PortAudio manages the memory referenced by the returned pointer, the client + must not manipulate or free the memory. The pointer is only guaranteed to be + valid between calls to Pa_Initialize() and Pa_Terminate(). + +*/ + +const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceID device ); + +/* + PaTimestamp is used to represent a continuous sample clock with arbitrary + start time that can be used for syncronization. The type is used for the + outTime argument to the PortAudioCallback and as the result of Pa_StreamTime() + +*/ + +typedef double PaTimestamp; + +/* + PortAudioCallback is implemented by PortAudio clients. + + inputBuffer and outputBuffer are arrays of interleaved samples, + the format, packing and number of channels used by the buffers are + determined by parameters to Pa_OpenStream() (see below). + + framesPerBuffer is the number of sample frames to be processed by the callback. + + outTime is the time in samples when the buffer(s) processed by + this callback will begin being played at the audio output. + See also Pa_StreamTime() + + userData is the value of a user supplied pointer passed to Pa_OpenStream() + intended for storing synthesis data etc. + + return value: + The callback can return a non-zero value to stop the stream. This may be + useful in applications such as soundfile players where a specific duration + of output is required. However, it is not necessary to utilise this mechanism + as StopStream() will also terminate the stream. A callback returning a + non-zero value must fill the entire outputBuffer. + + NOTE: None of the other stream functions may be called from within the + callback function except for Pa_GetCPULoad(). + +*/ + +typedef int (PortAudioCallback)( + void *inputBuffer, void *outputBuffer, + unsigned long framesPerBuffer, + PaTimestamp outTime, void *userData ); + + +/* + Stream flags + + These flags may be supplied (ored together) in the streamFlags argument to + the Pa_OpenStream() function. + +*/ + +#define paNoFlag (0) +#define paClipOff (1<<0) /* disable default clipping of out of range samples */ +#define paDitherOff (1<<1) /* disable default dithering */ +#define paPlatformSpecificFlags (0x00010000) +typedef unsigned long PaStreamFlags; + +/* + A single PortAudioStream provides multiple channels of real-time + input and output audio streaming to a client application. + Pointers to PortAudioStream objects are passed between PortAudio functions. +*/ + +typedef void PortAudioStream; +#define PaStream PortAudioStream + +/* + Pa_OpenStream() opens a stream for either input, output or both. + + stream is the address of a PortAudioStream pointer which will receive + a pointer to the newly opened stream. + + inputDevice is the id of the device used for input (see PaDeviceID above.) + inputDevice may be paNoDevice to indicate that an input device is not required. + + numInputChannels is the number of channels of sound to be delivered to the + callback. It can range from 1 to the value of maxInputChannels in the + PaDeviceInfo record for the device specified by the inputDevice parameter. + If inputDevice is paNoDevice numInputChannels is ignored. + + inputSampleFormat is the sample format of inputBuffer provided to the callback + function. inputSampleFormat may be any of the formats described by the + PaSampleFormat enumeration (see above). PortAudio guarantees support for + the device's native formats (nativeSampleFormats in the device info record) + and additionally 16 and 32 bit integer and 32 bit floating point formats. + Support for other formats is implementation defined. + + inputDriverInfo is a pointer to an optional driver specific data structure + containing additional information for device setup or stream processing. + inputDriverInfo is never required for correct operation. If not used + inputDriverInfo should be NULL. + + outputDevice is the id of the device used for output (see PaDeviceID above.) + outputDevice may be paNoDevice to indicate that an output device is not required. + + numOutputChannels is the number of channels of sound to be supplied by the + callback. See the definition of numInputChannels above for more details. + + outputSampleFormat is the sample format of the outputBuffer filled by the + callback function. See the definition of inputSampleFormat above for more + details. + + outputDriverInfo is a pointer to an optional driver specific data structure + containing additional information for device setup or stream processing. + outputDriverInfo is never required for correct operation. If not used + outputDriverInfo should be NULL. + + sampleRate is the desired sampleRate. For full-duplex streams it is the + sample rate for both input and output + + framesPerBuffer is the length in sample frames of all internal sample buffers + used for communication with platform specific audio routines. Wherever + possible this corresponds to the framesPerBuffer parameter passed to the + callback function. + + numberOfBuffers is the number of buffers used for multibuffered communication + with the platform specific audio routines. If you pass zero, then an optimum + value will be chosen for you internally. This parameter is provided only + as a guide - and does not imply that an implementation must use multibuffered + i/o when reliable double buffering is available (such as SndPlayDoubleBuffer() + on the Macintosh.) + + streamFlags may contain a combination of flags ORed together. + These flags modify the behaviour of the streaming process. Some flags may only + be relevant to certain buffer formats. + + callback is a pointer to a client supplied function that is responsible + for processing and filling input and output buffers (see above for details.) + + userData is a client supplied pointer which is passed to the callback + function. It could for example, contain a pointer to instance data necessary + for processing the audio buffers. + + return value: + Upon success Pa_OpenStream() returns PaNoError and places a pointer to a + valid PortAudioStream in the stream argument. The stream is inactive (stopped). + If a call to Pa_OpenStream() fails a non-zero error code is returned (see + PaError above) and the value of stream is invalid. + +*/ + +PaError Pa_OpenStream( PortAudioStream** stream, + PaDeviceID inputDevice, + int numInputChannels, + PaSampleFormat inputSampleFormat, + void *inputDriverInfo, + PaDeviceID outputDevice, + int numOutputChannels, + PaSampleFormat outputSampleFormat, + void *outputDriverInfo, + double sampleRate, + unsigned long framesPerBuffer, + unsigned long numberOfBuffers, + PaStreamFlags streamFlags, + PortAudioCallback *callback, + void *userData ); + + +/* + Pa_OpenDefaultStream() is a simplified version of Pa_OpenStream() that opens + the default input and/or output devices. Most parameters have identical meaning + to their Pa_OpenStream() counterparts, with the following exceptions: + + If either numInputChannels or numOutputChannels is 0 the respective device + is not opened. This has the same effect as passing paNoDevice in the device + arguments to Pa_OpenStream(). + + sampleFormat applies to both the input and output buffers. + +*/ + +PaError Pa_OpenDefaultStream( PortAudioStream** stream, + int numInputChannels, + int numOutputChannels, + PaSampleFormat sampleFormat, + double sampleRate, + unsigned long framesPerBuffer, + unsigned long numberOfBuffers, + PortAudioCallback *callback, + void *userData ); + +/* + Pa_CloseStream() closes an audio stream, flushing any pending buffers. + +*/ + +PaError Pa_CloseStream( PortAudioStream* ); + +/* + Pa_StartStream() and Pa_StopStream() begin and terminate audio processing. + Pa_StopStream() waits until all pending audio buffers have been played. + Pa_AbortStream() stops playing immediately without waiting for pending + buffers to complete. + +*/ + +PaError Pa_StartStream( PortAudioStream *stream ); + +PaError Pa_StopStream( PortAudioStream *stream ); + +PaError Pa_AbortStream( PortAudioStream *stream ); + +/* + Pa_StreamActive() returns one (1) when the stream is active (ie playing + or recording audio), zero (0) when not playing, or a negative error number + if the stream is invalid. + The stream is active between calls to Pa_StartStream() and Pa_StopStream(), + but may also become inactive if the callback returns a non-zero value. + In the latter case, the stream is considered inactive after the last + buffer has finished playing. + +*/ + +PaError Pa_StreamActive( PortAudioStream *stream ); + +/* + Pa_StreamTime() returns the current output time in samples for the stream. + This time may be used as a time reference (for example synchronizing audio to + MIDI). + +*/ + +PaTimestamp Pa_StreamTime( PortAudioStream *stream ); + +/* + Pa_GetCPULoad() returns the CPU Load for the stream. + The "CPU Load" is a fraction of total CPU time consumed by the stream's + audio processing routines including, but not limited to the client supplied + callback. + A value of 0.5 would imply that PortAudio and the sound generating + callback was consuming roughly 50% of the available CPU time. + This function may be called from the callback function or the application. + +*/ + +double Pa_GetCPULoad( PortAudioStream* stream ); + +/* + Pa_GetMinNumBuffers() returns the minimum number of buffers required by + the current host based on minimum latency. + On the PC, for the DirectSound implementation, latency can be optionally set + by user by setting an environment variable. + For example, to set latency to 200 msec, put: + + set PA_MIN_LATENCY_MSEC=200 + + in the AUTOEXEC.BAT file and reboot. + If the environment variable is not set, then the latency will be determined + based on the OS. Windows NT has higher latency than Win95. + +*/ + +int Pa_GetMinNumBuffers( int framesPerBuffer, double sampleRate ); + +/* + Pa_Sleep() puts the caller to sleep for at least 'msec' milliseconds. + You may sleep longer than the requested time so don't rely on this for + accurate musical timing. + + Pa_Sleep() is provided as a convenience for authors of portable code (such as + the tests and examples in the PortAudio distribution.) + +*/ + +void Pa_Sleep( long msec ); + +/* + Pa_GetSampleSize() returns the size in bytes of a single sample in the + supplied PaSampleFormat, or paSampleFormatNotSupported if the format is + no supported. + +*/ + +PaError Pa_GetSampleSize( PaSampleFormat format ); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PORT_AUDIO_H */ diff --git a/src/portaudio19.h b/src/portaudio19.h new file mode 100644 index 00000000..5c060b71 --- /dev/null +++ b/src/portaudio19.h @@ -0,0 +1,1127 @@ +// NOTE: Copy this file to portaudio.h in order to compile with V19 portaudio + +#ifndef PORTAUDIO_H +#define PORTAUDIO_H +/* + * $Id: portaudio.h 1061 2006-06-19 22:46:41Z lschwardt $ + * PortAudio Portable Real-Time Audio Library + * PortAudio API Header File + * Latest version available at: http://www.portaudio.com/ + * + * Copyright (c) 1999-2002 Ross Bencina and Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * Any person wishing to distribute modifications to the Software is + * requested to send the modifications to the original developer so that + * they can be incorporated into the canonical version. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/** @file + @brief The PortAudio API. +*/ + + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + + +/** Retrieve the release number of the currently running PortAudio build, + eg 1900. +*/ +int Pa_GetVersion( void ); + + +/** Retrieve a textual description of the current PortAudio build, + eg "PortAudio V19-devel 13 October 2002". +*/ +const char* Pa_GetVersionText( void ); + + +/** Error codes returned by PortAudio functions. + Note that with the exception of paNoError, all PaErrorCodes are negative. +*/ + +typedef int PaError; +typedef enum PaErrorCode +{ + paNoError = 0, + + paNotInitialized = -10000, + paUnanticipatedHostError, + paInvalidChannelCount, + paInvalidSampleRate, + paInvalidDevice, + paInvalidFlag, + paSampleFormatNotSupported, + paBadIODeviceCombination, + paInsufficientMemory, + paBufferTooBig, + paBufferTooSmall, + paNullCallback, + paBadStreamPtr, + paTimedOut, + paInternalError, + paDeviceUnavailable, + paIncompatibleHostApiSpecificStreamInfo, + paStreamIsStopped, + paStreamIsNotStopped, + paInputOverflowed, + paOutputUnderflowed, + paHostApiNotFound, + paInvalidHostApi, + paCanNotReadFromACallbackStream, /**< @todo review error code name */ + paCanNotWriteToACallbackStream, /**< @todo review error code name */ + paCanNotReadFromAnOutputOnlyStream, /**< @todo review error code name */ + paCanNotWriteToAnInputOnlyStream, /**< @todo review error code name */ + paIncompatibleStreamHostApi, + paBadBufferPtr +} PaErrorCode; + + +/** Translate the supplied PortAudio error code into a human readable + message. +*/ +const char *Pa_GetErrorText( PaError errorCode ); + + +/** Library initialization function - call this before using PortAudio. + This function initialises internal data structures and prepares underlying + host APIs for use. This function MUST be called before using any other + PortAudio API functions. + + If Pa_Initialize() is called multiple times, each successful + call must be matched with a corresponding call to Pa_Terminate(). + Pairs of calls to Pa_Initialize()/Pa_Terminate() may overlap, and are not + required to be fully nested. + + Note that if Pa_Initialize() returns an error code, Pa_Terminate() should + NOT be called. + + @return paNoError if successful, otherwise an error code indicating the cause + of failure. + + @see Pa_Terminate +*/ +PaError Pa_Initialize( void ); + + +/** Library termination function - call this when finished using PortAudio. + This function deallocates all resources allocated by PortAudio since it was + initializied by a call to Pa_Initialize(). In cases where Pa_Initialise() has + been called multiple times, each call must be matched with a corresponding call + to Pa_Terminate(). The final matching call to Pa_Terminate() will automatically + close any PortAudio streams that are still open. + + Pa_Terminate() MUST be called before exiting a program which uses PortAudio. + Failure to do so may result in serious resource leaks, such as audio devices + not being available until the next reboot. + + @return paNoError if successful, otherwise an error code indicating the cause + of failure. + + @see Pa_Initialize +*/ +PaError Pa_Terminate( void ); + + + +/** The type used to refer to audio devices. Values of this type usually + range from 0 to (Pa_DeviceCount-1), and may also take on the PaNoDevice + and paUseHostApiSpecificDeviceSpecification values. + + @see Pa_DeviceCount, paNoDevice, paUseHostApiSpecificDeviceSpecification +*/ +typedef int PaDeviceIndex; + + +/** A special PaDeviceIndex value indicating that no device is available, + or should be used. + + @see PaDeviceIndex +*/ +#define paNoDevice ((PaDeviceIndex)-1) + + +/** A special PaDeviceIndex value indicating that the device(s) to be used + are specified in the host api specific stream info structure. + + @see PaDeviceIndex +*/ +#define paUseHostApiSpecificDeviceSpecification ((PaDeviceIndex)-2) + + +/* Host API enumeration mechanism */ + +/** The type used to enumerate to host APIs at runtime. Values of this type + range from 0 to (Pa_GetHostApiCount()-1). + + @see Pa_GetHostApiCount +*/ +typedef int PaHostApiIndex; + + +/** Retrieve the number of available host APIs. Even if a host API is + available it may have no devices available. + + @return A non-negative value indicating the number of available host APIs + or, a PaErrorCode (which are always negative) if PortAudio is not initialized + or an error is encountered. + + @see PaHostApiIndex +*/ +PaHostApiIndex Pa_GetHostApiCount( void ); + + +/** Retrieve the index of the default host API. The default host API will be + the lowest common denominator host API on the current platform and is + unlikely to provide the best performance. + + @return A non-negative value ranging from 0 to (Pa_GetHostApiCount()-1) + indicating the default host API index or, a PaErrorCode (which are always + negative) if PortAudio is not initialized or an error is encountered. +*/ +PaHostApiIndex Pa_GetDefaultHostApi( void ); + + +/** Unchanging unique identifiers for each supported host API. This type + is used in the PaHostApiInfo structure. The values are guaranteed to be + unique and to never change, thus allowing code to be written that + conditionally uses host API specific extensions. + + New type ids will be allocated when support for a host API reaches + "public alpha" status, prior to that developers should use the + paInDevelopment type id. + + @see PaHostApiInfo +*/ +typedef enum PaHostApiTypeId +{ + paInDevelopment=0, /* use while developing support for a new host API */ + paDirectSound=1, + paMME=2, + paASIO=3, + paSoundManager=4, + paCoreAudio=5, + paOSS=7, + paALSA=8, + paAL=9, + paBeOS=10, + paWDMKS=11, + paJACK=12, + paWASAPI=13, + paAudioScienceHPI=14 +} PaHostApiTypeId; + + +/** A structure containing information about a particular host API. */ + +typedef struct PaHostApiInfo +{ + /** this is struct version 1 */ + int structVersion; + /** The well known unique identifier of this host API @see PaHostApiTypeId */ + PaHostApiTypeId type; + /** A textual description of the host API for display on user interfaces. */ + const char *name; + + /** The number of devices belonging to this host API. This field may be + used in conjunction with Pa_HostApiDeviceIndexToDeviceIndex() to enumerate + all devices for this host API. + @see Pa_HostApiDeviceIndexToDeviceIndex + */ + int deviceCount; + + /** The default input device for this host API. The value will be a + device index ranging from 0 to (Pa_GetDeviceCount()-1), or paNoDevice + if no default input device is available. + */ + PaDeviceIndex defaultInputDevice; + + /** The default output device for this host API. The value will be a + device index ranging from 0 to (Pa_GetDeviceCount()-1), or paNoDevice + if no default output device is available. + */ + PaDeviceIndex defaultOutputDevice; + +} PaHostApiInfo; + + +/** Retrieve a pointer to a structure containing information about a specific + host Api. + + @param hostApi A valid host API index ranging from 0 to (Pa_GetHostApiCount()-1) + + @return A pointer to an immutable PaHostApiInfo structure describing + a specific host API. If the hostApi parameter is out of range or an error + is encountered, the function returns NULL. + + The returned structure is owned by the PortAudio implementation and must not + be manipulated or freed. The pointer is only guaranteed to be valid between + calls to Pa_Initialize() and Pa_Terminate(). +*/ +const PaHostApiInfo * Pa_GetHostApiInfo( PaHostApiIndex hostApi ); + + +/** Convert a static host API unique identifier, into a runtime + host API index. + + @param type A unique host API identifier belonging to the PaHostApiTypeId + enumeration. + + @return A valid PaHostApiIndex ranging from 0 to (Pa_GetHostApiCount()-1) or, + a PaErrorCode (which are always negative) if PortAudio is not initialized + or an error is encountered. + + The paHostApiNotFound error code indicates that the host API specified by the + type parameter is not available. + + @see PaHostApiTypeId +*/ +PaHostApiIndex Pa_HostApiTypeIdToHostApiIndex( PaHostApiTypeId type ); + + +/** Convert a host-API-specific device index to standard PortAudio device index. + This function may be used in conjunction with the deviceCount field of + PaHostApiInfo to enumerate all devices for the specified host API. + + @param hostApi A valid host API index ranging from 0 to (Pa_GetHostApiCount()-1) + + @param hostApiDeviceIndex A valid per-host device index in the range + 0 to (Pa_GetHostApiInfo(hostApi)->deviceCount-1) + + @return A non-negative PaDeviceIndex ranging from 0 to (Pa_GetDeviceCount()-1) + or, a PaErrorCode (which are always negative) if PortAudio is not initialized + or an error is encountered. + + A paInvalidHostApi error code indicates that the host API index specified by + the hostApi parameter is out of range. + + A paInvalidDevice error code indicates that the hostApiDeviceIndex parameter + is out of range. + + @see PaHostApiInfo +*/ +PaDeviceIndex Pa_HostApiDeviceIndexToDeviceIndex( PaHostApiIndex hostApi, + int hostApiDeviceIndex ); + + + +/** Structure used to return information about a host error condition. +*/ +typedef struct PaHostErrorInfo{ + PaHostApiTypeId hostApiType; /**< the host API which returned the error code */ + long errorCode; /**< the error code returned */ + const char *errorText; /**< a textual description of the error if available, otherwise a zero-length string */ +}PaHostErrorInfo; + + +/** Return information about the last host error encountered. The error + information returned by Pa_GetLastHostErrorInfo() will never be modified + asyncronously by errors occurring in other PortAudio owned threads + (such as the thread that manages the stream callback.) + + This function is provided as a last resort, primarily to enhance debugging + by providing clients with access to all available error information. + + @return A pointer to an immutable structure constaining information about + the host error. The values in this structure will only be valid if a + PortAudio function has previously returned the paUnanticipatedHostError + error code. +*/ +const PaHostErrorInfo* Pa_GetLastHostErrorInfo( void ); + + + +/* Device enumeration and capabilities */ + +/** Retrieve the number of available devices. The number of available devices + may be zero. + + @return A non-negative value indicating the number of available devices or, + a PaErrorCode (which are always negative) if PortAudio is not initialized + or an error is encountered. +*/ +PaDeviceIndex Pa_GetDeviceCount( void ); + + +/** Retrieve the index of the default input device. The result can be + used in the inputDevice parameter to Pa_OpenStream(). + + @return The default input device index for the default host API, or paNoDevice + if no default input device is available or an error was encountered. +*/ +PaDeviceIndex Pa_GetDefaultInputDevice( void ); + + +/** Retrieve the index of the default output device. The result can be + used in the outputDevice parameter to Pa_OpenStream(). + + @return The default output device index for the defualt host API, or paNoDevice + if no default output device is available or an error was encountered. + + @note + On the PC, the user can specify a default device by + setting an environment variable. For example, to use device #1. +
+ set PA_RECOMMENDED_OUTPUT_DEVICE=1
+
+ The user should first determine the available device ids by using + the supplied application "pa_devs". +*/ +PaDeviceIndex Pa_GetDefaultOutputDevice( void ); + + +/** The type used to represent monotonic time in seconds that can be used + for syncronisation. The type is used for the outTime argument to the + PaStreamCallback and as the result of Pa_GetStreamTime(). + + @see PaStreamCallback, Pa_GetStreamTime +*/ +typedef double PaTime; + + +/** A type used to specify one or more sample formats. Each value indicates + a possible format for sound data passed to and from the stream callback, + Pa_ReadStream and Pa_WriteStream. + + The standard formats paFloat32, paInt16, paInt32, paInt24, paInt8 + and aUInt8 are usually implemented by all implementations. + + The floating point representation (paFloat32) uses +1.0 and -1.0 as the + maximum and minimum respectively. + + paUInt8 is an unsigned 8 bit format where 128 is considered "ground" + + The paNonInterleaved flag indicates that a multichannel buffer is passed + as a set of non-interleaved pointers. + + @see Pa_OpenStream, Pa_OpenDefaultStream, PaDeviceInfo + @see paFloat32, paInt16, paInt32, paInt24, paInt8 + @see paUInt8, paCustomFormat, paNonInterleaved +*/ +typedef unsigned long PaSampleFormat; + + +#define paFloat32 ((PaSampleFormat) 0x00000001) /**< @see PaSampleFormat */ +#define paInt32 ((PaSampleFormat) 0x00000002) /**< @see PaSampleFormat */ +#define paInt24 ((PaSampleFormat) 0x00000004) /**< Packed 24 bit format. @see PaSampleFormat */ +#define paInt16 ((PaSampleFormat) 0x00000008) /**< @see PaSampleFormat */ +#define paInt8 ((PaSampleFormat) 0x00000010) /**< @see PaSampleFormat */ +#define paUInt8 ((PaSampleFormat) 0x00000020) /**< @see PaSampleFormat */ +#define paCustomFormat ((PaSampleFormat) 0x00010000)/**< @see PaSampleFormat */ + +#define paNonInterleaved ((PaSampleFormat) 0x80000000) + +/** A structure providing information and capabilities of PortAudio devices. + Devices may support input, output or both input and output. +*/ +typedef struct PaDeviceInfo +{ + int structVersion; /* this is struct version 2 */ + const char *name; + PaHostApiIndex hostApi; /* note this is a host API index, not a type id*/ + + int maxInputChannels; + int maxOutputChannels; + + /* Default latency values for interactive performance. */ + PaTime defaultLowInputLatency; + PaTime defaultLowOutputLatency; + /* Default latency values for robust non-interactive applications (eg. playing sound files). */ + PaTime defaultHighInputLatency; + PaTime defaultHighOutputLatency; + + double defaultSampleRate; +} PaDeviceInfo; + + +/** Retrieve a pointer to a PaDeviceInfo structure containing information + about the specified device. + @return A pointer to an immutable PaDeviceInfo structure. If the device + parameter is out of range the function returns NULL. + + @param device A valid device index in the range 0 to (Pa_GetDeviceCount()-1) + + @note PortAudio manages the memory referenced by the returned pointer, + the client must not manipulate or free the memory. The pointer is only + guaranteed to be valid between calls to Pa_Initialize() and Pa_Terminate(). + + @see PaDeviceInfo, PaDeviceIndex +*/ +const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceIndex device ); + + +/** Parameters for one direction (input or output) of a stream. +*/ +typedef struct PaStreamParameters +{ + /** A valid device index in the range 0 to (Pa_GetDeviceCount()-1) + specifying the device to be used or the special constant + paUseHostApiSpecificDeviceSpecification which indicates that the actual + device(s) to use are specified in hostApiSpecificStreamInfo. + This field must not be set to paNoDevice. + */ + PaDeviceIndex device; + + /** The number of channels of sound to be delivered to the + stream callback or accessed by Pa_ReadStream() or Pa_WriteStream(). + It can range from 1 to the value of maxInputChannels in the + PaDeviceInfo record for the device specified by the device parameter. + */ + int channelCount; + + /** The sample format of the buffer provided to the stream callback, + a_ReadStream() or Pa_WriteStream(). It may be any of the formats described + by the PaSampleFormat enumeration. + */ + PaSampleFormat sampleFormat; + + /** The desired latency in seconds. Where practical, implementations should + configure their latency based on these parameters, otherwise they may + choose the closest viable latency instead. Unless the suggested latency + is greater than the absolute upper limit for the device implementations + should round the suggestedLatency up to the next practial value - ie to + provide an equal or higher latency than suggestedLatency wherever possibe. + Actual latency values for an open stream may be retrieved using the + inputLatency and outputLatency fields of the PaStreamInfo structure + returned by Pa_GetStreamInfo(). + @see default*Latency in PaDeviceInfo, *Latency in PaStreamInfo + */ + PaTime suggestedLatency; + + /** An optional pointer to a host api specific data structure + containing additional information for device setup and/or stream processing. + hostApiSpecificStreamInfo is never required for correct operation, + if not used it should be set to NULL. + */ + void *hostApiSpecificStreamInfo; + +} PaStreamParameters; + + +/** Return code for Pa_IsFormatSupported indicating success. */ +#define paFormatIsSupported (0) + +/** Determine whether it would be possible to open a stream with the specified + parameters. + + @param inputParameters A structure that describes the input parameters used to + open a stream. The suggestedLatency field is ignored. See PaStreamParameters + for a description of these parameters. inputParameters must be NULL for + output-only streams. + + @param outputParameters A structure that describes the output parameters used + to open a stream. The suggestedLatency field is ignored. See PaStreamParameters + for a description of these parameters. outputParameters must be NULL for + input-only streams. + + @param sampleRate The required sampleRate. For full-duplex streams it is the + sample rate for both input and output + + @return Returns 0 if the format is supported, and an error code indicating why + the format is not supported otherwise. The constant paFormatIsSupported is + provided to compare with the return value for success. + + @see paFormatIsSupported, PaStreamParameters +*/ +PaError Pa_IsFormatSupported( const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate ); + + + +/* Streaming types and functions */ + + +/** + A single PaStream can provide multiple channels of real-time + streaming audio input and output to a client application. A stream + provides access to audio hardware represented by one or more + PaDevices. Depending on the underlying Host API, it may be possible + to open multiple streams using the same device, however this behavior + is implementation defined. Portable applications should assume that + a PaDevice may be simultaneously used by at most one PaStream. + + Pointers to PaStream objects are passed between PortAudio functions that + operate on streams. + + @see Pa_OpenStream, Pa_OpenDefaultStream, Pa_OpenDefaultStream, Pa_CloseStream, + Pa_StartStream, Pa_StopStream, Pa_AbortStream, Pa_IsStreamActive, + Pa_GetStreamTime, Pa_GetStreamCpuLoad + +*/ +typedef void PaStream; + + +/** Can be passed as the framesPerBuffer parameter to Pa_OpenStream() + or Pa_OpenDefaultStream() to indicate that the stream callback will + accept buffers of any size. +*/ +#define paFramesPerBufferUnspecified (0) + + +/** Flags used to control the behavior of a stream. They are passed as + parameters to Pa_OpenStream or Pa_OpenDefaultStream. Multiple flags may be + ORed together. + + @see Pa_OpenStream, Pa_OpenDefaultStream + @see paNoFlag, paClipOff, paDitherOff, paNeverDropInput, + paPrimeOutputBuffersUsingStreamCallback, paPlatformSpecificFlags +*/ +typedef unsigned long PaStreamFlags; + +/** @see PaStreamFlags */ +#define paNoFlag ((PaStreamFlags) 0) + +/** Disable default clipping of out of range samples. + @see PaStreamFlags +*/ +#define paClipOff ((PaStreamFlags) 0x00000001) + +/** Disable default dithering. + @see PaStreamFlags +*/ +#define paDitherOff ((PaStreamFlags) 0x00000002) + +/** Flag requests that where possible a full duplex stream will not discard + overflowed input samples without calling the stream callback. This flag is + only valid for full duplex callback streams and only when used in combination + with the paFramesPerBufferUnspecified (0) framesPerBuffer parameter. Using + this flag incorrectly results in a paInvalidFlag error being returned from + Pa_OpenStream and Pa_OpenDefaultStream. + + @see PaStreamFlags, paFramesPerBufferUnspecified +*/ +#define paNeverDropInput ((PaStreamFlags) 0x00000004) + +/** Call the stream callback to fill initial output buffers, rather than the + default behavior of priming the buffers with zeros (silence). This flag has + no effect for input-only and blocking read/write streams. + + @see PaStreamFlags +*/ +#define paPrimeOutputBuffersUsingStreamCallback ((PaStreamFlags) 0x00000008) + +/** A mask specifying the platform specific bits. + @see PaStreamFlags +*/ +#define paPlatformSpecificFlags ((PaStreamFlags)0xFFFF0000) + +/** + Timing information for the buffers passed to the stream callback. +*/ +typedef struct PaStreamCallbackTimeInfo{ + PaTime inputBufferAdcTime; + PaTime currentTime; + PaTime outputBufferDacTime; +} PaStreamCallbackTimeInfo; + + +/** + Flag bit constants for the statusFlags to PaStreamCallback. + + @see paInputUnderflow, paInputOverflow, paOutputUnderflow, paOutputOverflow, + paPrimingOutput +*/ +typedef unsigned long PaStreamCallbackFlags; + +/** In a stream opened with paFramesPerBufferUnspecified, indicates that + input data is all silence (zeros) because no real data is available. In a + stream opened without paFramesPerBufferUnspecified, it indicates that one or + more zero samples have been inserted into the input buffer to compensate + for an input underflow. + @see PaStreamCallbackFlags +*/ +#define paInputUnderflow ((PaStreamCallbackFlags) 0x00000001) + +/** In a stream opened with paFramesPerBufferUnspecified, indicates that data + prior to the first sample of the input buffer was discarded due to an + overflow, possibly because the stream callback is using too much CPU time. + Otherwise indicates that data prior to one or more samples in the + input buffer was discarded. + @see PaStreamCallbackFlags +*/ +#define paInputOverflow ((PaStreamCallbackFlags) 0x00000002) + +/** Indicates that output data (or a gap) was inserted, possibly because the + stream callback is using too much CPU time. + @see PaStreamCallbackFlags +*/ +#define paOutputUnderflow ((PaStreamCallbackFlags) 0x00000004) + +/** Indicates that output data will be discarded because no room is available. + @see PaStreamCallbackFlags +*/ +#define paOutputOverflow ((PaStreamCallbackFlags) 0x00000008) + +/** Some of all of the output data will be used to prime the stream, input + data may be zero. + @see PaStreamCallbackFlags +*/ +#define paPrimingOutput ((PaStreamCallbackFlags) 0x00000010) + +/** + Allowable return values for the PaStreamCallback. + @see PaStreamCallback +*/ +typedef enum PaStreamCallbackResult +{ + paContinue=0, + paComplete=1, + paAbort=2 +} PaStreamCallbackResult; + + +/** + Functions of type PaStreamCallback are implemented by PortAudio clients. + They consume, process or generate audio in response to requests from an + active PortAudio stream. + + @param input and @param output are arrays of interleaved samples, + the format, packing and number of channels used by the buffers are + determined by parameters to Pa_OpenStream(). + + @param frameCount The number of sample frames to be processed by + the stream callback. + + @param timeInfo The time in seconds when the first sample of the input + buffer was received at the audio input, the time in seconds when the first + sample of the output buffer will begin being played at the audio output, and + the time in seconds when the stream callback was called. + See also Pa_GetStreamTime() + + @param statusFlags Flags indicating whether input and/or output buffers + have been inserted or will be dropped to overcome underflow or overflow + conditions. + + @param userData The value of a user supplied pointer passed to + Pa_OpenStream() intended for storing synthesis data etc. + + @return + The stream callback should return one of the values in the + PaStreamCallbackResult enumeration. To ensure that the callback continues + to be called, it should return paContinue (0). Either paComplete or paAbort + can be returned to finish stream processing, after either of these values is + returned the callback will not be called again. If paAbort is returned the + stream will finish as soon as possible. If paComplete is returned, the stream + will continue until all buffers generated by the callback have been played. + This may be useful in applications such as soundfile players where a specific + duration of output is required. However, it is not necessary to utilise this + mechanism as Pa_StopStream(), Pa_AbortStream() or Pa_CloseStream() can also + be used to stop the stream. The callback must always fill the entire output + buffer irrespective of its return value. + + @see Pa_OpenStream, Pa_OpenDefaultStream + + @note With the exception of Pa_GetStreamCpuLoad() it is not permissable to call + PortAudio API functions from within the stream callback. +*/ +typedef int PaStreamCallback( + const void *input, void *output, + unsigned long frameCount, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, + void *userData ); + + +/** Opens a stream for either input, output or both. + + @param stream The address of a PaStream pointer which will receive + a pointer to the newly opened stream. + + @param inputParameters A structure that describes the input parameters used by + the opened stream. See PaStreamParameters for a description of these parameters. + inputParameters must be NULL for output-only streams. + + @param outputParameters A structure that describes the output parameters used by + the opened stream. See PaStreamParameters for a description of these parameters. + outputParameters must be NULL for input-only streams. + + @param sampleRate The desired sampleRate. For full-duplex streams it is the + sample rate for both input and output + + @param framesPerBuffer The number of frames passed to the stream callback + function, or the preferred block granularity for a blocking read/write stream. + The special value paFramesPerBufferUnspecified (0) may be used to request that + the stream callback will recieve an optimal (and possibly varying) number of + frames based on host requirements and the requested latency settings. + Note: With some host APIs, the use of non-zero framesPerBuffer for a callback + stream may introduce an additional layer of buffering which could introduce + additional latency. PortAudio guarantees that the additional latency + will be kept to the theoretical minimum however, it is strongly recommended + that a non-zero framesPerBuffer value only be used when your algorithm + requires a fixed number of frames per stream callback. + + @param streamFlags Flags which modify the behaviour of the streaming process. + This parameter may contain a combination of flags ORed together. Some flags may + only be relevant to certain buffer formats. + + @param streamCallback A pointer to a client supplied function that is responsible + for processing and filling input and output buffers. If this parameter is NULL + the stream will be opened in 'blocking read/write' mode. In blocking mode, + the client can receive sample data using Pa_ReadStream and write sample data + using Pa_WriteStream, the number of samples that may be read or written + without blocking is returned by Pa_GetStreamReadAvailable and + Pa_GetStreamWriteAvailable respectively. + + @param userData A client supplied pointer which is passed to the stream callback + function. It could for example, contain a pointer to instance data necessary + for processing the audio buffers. This parameter is ignored if streamCallback + is NULL. + + @return + Upon success Pa_OpenStream() returns paNoError and places a pointer to a + valid PaStream in the stream argument. The stream is inactive (stopped). + If a call to Pa_OpenStream() fails, a non-zero error code is returned (see + PaError for possible error codes) and the value of stream is invalid. + + @see PaStreamParameters, PaStreamCallback, Pa_ReadStream, Pa_WriteStream, + Pa_GetStreamReadAvailable, Pa_GetStreamWriteAvailable +*/ +PaError Pa_OpenStream( PaStream** stream, + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamFlags streamFlags, + PaStreamCallback *streamCallback, + void *userData ); + + +/** A simplified version of Pa_OpenStream() that opens the default input + and/or output devices. + + @param stream The address of a PaStream pointer which will receive + a pointer to the newly opened stream. + + @param numInputChannels The number of channels of sound that will be supplied + to the stream callback or returned by Pa_ReadStream. It can range from 1 to + the value of maxInputChannels in the PaDeviceInfo record for the default input + device. If 0 the stream is opened as an output-only stream. + + @param numOutputChannels The number of channels of sound to be delivered to the + stream callback or passed to Pa_WriteStream. It can range from 1 to the value + of maxOutputChannels in the PaDeviceInfo record for the default output dvice. + If 0 the stream is opened as an output-only stream. + + @param sampleFormat The sample format of both the input and output buffers + provided to the callback or passed to and from Pa_ReadStream and Pa_WriteStream. + sampleFormat may be any of the formats described by the PaSampleFormat + enumeration. + + @param sampleRate Same as Pa_OpenStream parameter of the same name. + @param framesPerBuffer Same as Pa_OpenStream parameter of the same name. + @param streamCallback Same as Pa_OpenStream parameter of the same name. + @param userData Same as Pa_OpenStream parameter of the same name. + + @return As for Pa_OpenStream + + @see Pa_OpenStream, PaStreamCallback +*/ +PaError Pa_OpenDefaultStream( PaStream** stream, + int numInputChannels, + int numOutputChannels, + PaSampleFormat sampleFormat, + double sampleRate, + unsigned long framesPerBuffer, + PaStreamCallback *streamCallback, + void *userData ); + + +/** Closes an audio stream. If the audio stream is active it + discards any pending buffers as if Pa_AbortStream() had been called. +*/ +PaError Pa_CloseStream( PaStream *stream ); + + +/** Functions of type PaStreamFinishedCallback are implemented by PortAudio + clients. They can be registered with a stream using the Pa_SetStreamFinishedCallback + function. Once registered they are called when the stream becomes inactive + (ie once a call to Pa_StopStream() will not block). + A stream will become inactive after the stream callback returns non-zero, + or when Pa_StopStream or Pa_AbortStream is called. For a stream providing audio + output, if the stream callback returns paComplete, or Pa_StopStream is called, + the stream finished callback will not be called until all generated sample data + has been played. + + @param userData The userData parameter supplied to Pa_OpenStream() + + @see Pa_SetStreamFinishedCallback +*/ +typedef void PaStreamFinishedCallback( void *userData ); + + +/** Register a stream finished callback function which will be called when the + stream becomes inactive. See the description of PaStreamFinishedCallback for + further details about when the callback will be called. + + @param stream a pointer to a PaStream that is in the stopped state - if the + stream is not stopped, the stream's finished callback will remain unchanged + and an error code will be returned. + + @param streamFinishedCallback a pointer to a function with the same signature + as PaStreamFinishedCallback, that will be called when the stream becomes + inactive. Passing NULL for this parameter will un-register a previously + registered stream finished callback function. + + @return on success returns paNoError, otherwise an error code indicating the cause + of the error. + + @see PaStreamFinishedCallback +*/ +PaError Pa_SetStreamFinishedCallback( PaStream *stream, PaStreamFinishedCallback* streamFinishedCallback ); + + +/** Commences audio processing. +*/ +PaError Pa_StartStream( PaStream *stream ); + + +/** Terminates audio processing. It waits until all pending + audio buffers have been played before it returns. +*/ +PaError Pa_StopStream( PaStream *stream ); + + +/** Terminates audio processing immediately without waiting for pending + buffers to complete. +*/ +PaError Pa_AbortStream( PaStream *stream ); + + +/** Determine whether the stream is stopped. + A stream is considered to be stopped prior to a successful call to + Pa_StartStream and after a successful call to Pa_StopStream or Pa_AbortStream. + If a stream callback returns a value other than paContinue the stream is NOT + considered to be stopped. + + @return Returns one (1) when the stream is stopped, zero (0) when + the stream is running or, a PaErrorCode (which are always negative) if + PortAudio is not initialized or an error is encountered. + + @see Pa_StopStream, Pa_AbortStream, Pa_IsStreamActive +*/ +PaError Pa_IsStreamStopped( PaStream *stream ); + + +/** Determine whether the stream is active. + A stream is active after a successful call to Pa_StartStream(), until it + becomes inactive either as a result of a call to Pa_StopStream() or + Pa_AbortStream(), or as a result of a return value other than paContinue from + the stream callback. In the latter case, the stream is considered inactive + after the last buffer has finished playing. + + @return Returns one (1) when the stream is active (ie playing or recording + audio), zero (0) when not playing or, a PaErrorCode (which are always negative) + if PortAudio is not initialized or an error is encountered. + + @see Pa_StopStream, Pa_AbortStream, Pa_IsStreamStopped +*/ +PaError Pa_IsStreamActive( PaStream *stream ); + + + +/** A structure containing unchanging information about an open stream. + @see Pa_GetStreamInfo +*/ + +typedef struct PaStreamInfo +{ + /** this is struct version 1 */ + int structVersion; + + /** The input latency of the stream in seconds. This value provides the most + accurate estimate of input latency available to the implementation. It may + differ significantly from the suggestedLatency value passed to Pa_OpenStream(). + The value of this field will be zero (0.) for output-only streams. + @see PaTime + */ + PaTime inputLatency; + + /** The output latency of the stream in seconds. This value provides the most + accurate estimate of output latency available to the implementation. It may + differ significantly from the suggestedLatency value passed to Pa_OpenStream(). + The value of this field will be zero (0.) for input-only streams. + @see PaTime + */ + PaTime outputLatency; + + /** The sample rate of the stream in Hertz (samples per second). In cases + where the hardware sample rate is inaccurate and PortAudio is aware of it, + the value of this field may be different from the sampleRate parameter + passed to Pa_OpenStream(). If information about the actual hardware sample + rate is not available, this field will have the same value as the sampleRate + parameter passed to Pa_OpenStream(). + */ + double sampleRate; + +} PaStreamInfo; + + +/** Retrieve a pointer to a PaStreamInfo structure containing information + about the specified stream. + @return A pointer to an immutable PaStreamInfo structure. If the stream + parameter invalid, or an error is encountered, the function returns NULL. + + @param stream A pointer to an open stream previously created with Pa_OpenStream. + + @note PortAudio manages the memory referenced by the returned pointer, + the client must not manipulate or free the memory. The pointer is only + guaranteed to be valid until the specified stream is closed. + + @see PaStreamInfo +*/ +const PaStreamInfo* Pa_GetStreamInfo( PaStream *stream ); + + +/** Determine the current time for the stream according to the same clock used + to generate buffer timestamps. This time may be used for syncronising other + events to the audio stream, for example synchronizing audio to MIDI. + + @return The stream's current time in seconds, or 0 if an error occurred. + + @see PaTime, PaStreamCallback +*/ +PaTime Pa_GetStreamTime( PaStream *stream ); + + +/** Retrieve CPU usage information for the specified stream. + The "CPU Load" is a fraction of total CPU time consumed by a callback stream's + audio processing routines including, but not limited to the client supplied + stream callback. This function does not work with blocking read/write streams. + + This function may be called from the stream callback function or the + application. + + @return + A floating point value, typically between 0.0 and 1.0, where 1.0 indicates + that the stream callback is consuming the maximum number of CPU cycles possible + to maintain real-time operation. A value of 0.5 would imply that PortAudio and + the stream callback was consuming roughly 50% of the available CPU time. The + return value may exceed 1.0. A value of 0.0 will always be returned for a + blocking read/write stream, or if an error occurrs. +*/ +double Pa_GetStreamCpuLoad( PaStream* stream ); + + +/** Read samples from an input stream. The function doesn't return until + the entire buffer has been filled - this may involve waiting for the operating + system to supply the data. + + @param stream A pointer to an open stream previously created with Pa_OpenStream. + + @param buffer A pointer to a buffer of sample frames. The buffer contains + samples in the format specified by the inputParameters->sampleFormat field + used to open the stream, and the number of channels specified by + inputParameters->numChannels. If non-interleaved samples were requested, + buffer is a pointer to the first element of an array of non-interleaved + buffer pointers, one for each channel. + + @param frames The number of frames to be read into buffer. This parameter + is not constrained to a specific range, however high performance applications + will want to match this parameter to the framesPerBuffer parameter used + when opening the stream. + + @return On success PaNoError will be returned, or PaInputOverflowed if input + data was discarded by PortAudio after the previous call and before this call. +*/ +PaError Pa_ReadStream( PaStream* stream, + void *buffer, + unsigned long frames ); + + +/** Write samples to an output stream. This function doesn't return until the + entire buffer has been consumed - this may involve waiting for the operating + system to consume the data. + + @param stream A pointer to an open stream previously created with Pa_OpenStream. + + @param buffer A pointer to a buffer of sample frames. The buffer contains + samples in the format specified by the outputParameters->sampleFormat field + used to open the stream, and the number of channels specified by + outputParameters->numChannels. If non-interleaved samples were requested, + buffer is a pointer to the first element of an array of non-interleaved + buffer pointers, one for each channel. + + @param frames The number of frames to be written from buffer. This parameter + is not constrained to a specific range, however high performance applications + will want to match this parameter to the framesPerBuffer parameter used + when opening the stream. + + @return On success PaNoError will be returned, or paOutputUnderflowed if + additional output data was inserted after the previous call and before this + call. +*/ +PaError Pa_WriteStream( PaStream* stream, + const void *buffer, + unsigned long frames ); + + +/** Retrieve the number of frames that can be read from the stream without + waiting. + + @return Returns a non-negative value representing the maximum number of frames + that can be read from the stream without blocking or busy waiting or, a + PaErrorCode (which are always negative) if PortAudio is not initialized or an + error is encountered. +*/ +signed long Pa_GetStreamReadAvailable( PaStream* stream ); + + +/** Retrieve the number of frames that can be written to the stream without + waiting. + + @return Returns a non-negative value representing the maximum number of frames + that can be written to the stream without blocking or busy waiting or, a + PaErrorCode (which are always negative) if PortAudio is not initialized or an + error is encountered. +*/ +signed long Pa_GetStreamWriteAvailable( PaStream* stream ); + + +/* Miscellaneous utilities */ + + +/** Retrieve the size of a given sample format in bytes. + + @return The size in bytes of a single sample in the specified format, + or paSampleFormatNotSupported if the format is not supported. +*/ +PaError Pa_GetSampleSize( PaSampleFormat format ); + + +/** Put the caller to sleep for at least 'msec' milliseconds. This function is + provided only as a convenience for authors of portable code (such as the tests + and examples in the PortAudio distribution.) + + The function may sleep longer than requested so don't rely on this for accurate + musical timing. +*/ +void Pa_Sleep( long msec ); + + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* PORTAUDIO_H */ diff --git a/src/prosodydisplay.cpp b/src/prosodydisplay.cpp new file mode 100755 index 00000000..d7542829 --- /dev/null +++ b/src/prosodydisplay.cpp @@ -0,0 +1,607 @@ +/*************************************************************************** + * Copyright (C) 2005, 2006 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + + +#include "wx/wx.h" +#include "wx/numdlg.h" + +#include "speak_lib.h" +#include "main.h" +#include "speech.h" +#include "phoneme.h" +#include "synthesize.h" +#include "prosodydisplay.h" + +extern MyFrame *myframe; +extern ChildFrProsody *prosodyframe; +extern ProsodyDisplay *prosodycanvas; + +wxMenu *menu_prosody; + + +BEGIN_EVENT_TABLE(ProsodyDisplay, wxScrolledWindow) + EVT_LEFT_DOWN(ProsodyDisplay::OnMouse) + EVT_RIGHT_DOWN(ProsodyDisplay::OnMouse) + EVT_CHAR(ProsodyDisplay::OnKey) + EVT_MENU(-1, ProsodyDisplay::OnMenu) +END_EVENT_TABLE() + + +static wxPen PEN_PITCHENV(wxColour(0,0,255),1,wxSOLID); +static wxPen PEN_SAMPLED(wxColour(0,200,200),2,wxSOLID); +static wxPen PEN_PHSELECTED(wxColour(255,0,0),2,wxSOLID); + +ProsodyDisplay::ProsodyDisplay(wxWindow *parent, const wxPoint& pos, const wxSize& size) + : wxScrolledWindow(parent, -1, pos, size, + wxSUNKEN_BORDER | wxNO_FULL_REPAINT_ON_RESIZE) +{//===================================================================== + + linewidth = size.GetWidth(); + scalex = 0.5; + scaley = double(LINESEP*6)/80.0; + selected_ph = -1; +// SetBackgroundColour(* wxWHITE); + + LayoutData(phoneme_list,n_phoneme_list); +} // end of ProsodyDisplay::ProsodyDisplay + + +ProsodyDisplay::~ProsodyDisplay() +{//========================== + prosodycanvas = NULL; +} + + +void InitProsodyDisplay() +{//====================== + wxMenu *menu_envelopes; + + menu_envelopes = new wxMenu; + // entries match those in envelope_data[] in intonation.cpp + menu_envelopes->Append(0x100,_T("Fall")); + menu_envelopes->Append(0x101,_T("Rise")); + menu_envelopes->Append(0x102,_T("Fall-rise")); + menu_envelopes->Append(0x103,_T("Fall-rise (R)")); + menu_envelopes->Append(0x104,_T("Fall-2")); + menu_envelopes->Append(0x105,_T("Fall-3")); + + menu_prosody = new wxMenu; + menu_prosody->Append(1,_T("Pitch envelope"),menu_envelopes); + menu_prosody->Append(2,_T("Amplitude")); + menu_prosody->Append(3,_T("Length")); + menu_prosody->Append(4,_T("Play F2")); +} + + +void ProsodyDisplay::RefreshLine(int line) +{//===================================== + int x,y; + + CalcScrolledPosition(0,line*FRAMEHEIGHT,&x,&y); + RefreshRect(wxRect(0,y,linewidth,FRAMEHEIGHT)); +} + + +int ProsodyDisplay::GetWidth(PHONEME_LIST *p) +{//======================================== + int w; + + if(p->ph == NULL) + return(0); + + w = p->ph->std_length; + if(w == 0) w = 60; + + if(p->length != 0) + w = (w * p->length) / 256; + + return(int((w + p->prepause)* scalex) + 1); +} + + +void ProsodyDisplay::SelectPh(int index) +{//===================================== + // A phoneme has been selected + PHONEME_LIST *p; + char buf[120]; + + if(index < 0) return; + + p = &phlist[index]; + if(p == NULL) return; + + sprintf(buf,"Stress %d Amp %2d LenMod %2d Pitch %3d %3d [env=%d] Flags %.2x ", + p->tone,p->amp,p->length,p->pitch1,p->pitch2,p->env,p->ph->phflags); + wxLogStatus(wxString(buf,wxConvLocal)); +} + + +void ProsodyDisplay::ChangePh(int pitch1, int pitch2) +{//================================================ + PHONEME_LIST *p; + int sign1; + int sign2; + + if(selected_ph < 0) + return; + + p = &phlist[selected_ph]; + sign1 = p->pitch1 - p->pitch2; + p->pitch1 += pitch1; + p->pitch2 += (pitch1 + pitch2); + sign2 = p->pitch1 - p->pitch2; + + if((sign1 != 0) && ((sign1 * sign2) <= 0)) + { + // change of sign, change rise to fall + if(p->env == 1) + p->env = 0; + else + if(p->env == 0) + p->env = 1; + } +} + + +void ProsodyDisplay::OnMenu(wxCommandEvent& event) +{//=============================================== + int id; + int value; + PHONEME_LIST *p; + + id = event.GetId(); + p = &phlist[selected_ph]; + + if((id & 0xf00) == 0x100) + { + // selected a pitch envelope + p->env = id - 0x100; + } + + switch(id) + { + case 2: + value = wxGetNumberFromUser(_T(""),_T("Amplitude"),_T(""),p->amp,0,40); + if(value >= 0) + p->amp = value; + break; + case 3: + value = wxGetNumberFromUser(_T(""),_T("Length"),_T(""),p->length,1,500); + if(value >= 0) + p->length = value; + break; + case 4: + MakeWave2(phlist,numph); + break; + } + SelectPh(selected_ph); + Refresh(); +} + + +void ProsodyDisplay::OnMouse(wxMouseEvent& event) +{//============================================ + int line; + int ix; + int xpos=0; + + + wxClientDC dc(this); + PrepareDC(dc); + wxPoint pt(event.GetLogicalPosition(dc)); + + if(selected_ph >= 0) + { + // find line for previously selected phoneme + for(line=0; line selected_ph) break; + RefreshLine(line); + selected_ph = -1; + } + + line = pt.y / FRAMEHEIGHT; + + // find which phoneme is selected on this line + for(ix=linetab[line]; (ix pt.x) + { + selected_ph = ix; + SelectPh(selected_ph); + break; + } + } + + RefreshLine(line); + + if(event.RightDown()) + { + PopupMenu(menu_prosody); + } + +} // end of ProsodyDisplay::OnMouse + + +void ProsodyDisplay::OnKey(wxKeyEvent& event) +{//======================================== + PHONEME_LIST *p; + int display=1; + + if(selected_ph < 0) + selected_ph = 0; + + p = &phlist[selected_ph]; + + switch(event.GetKeyCode()) + { + case WXK_F2: + // make and play from this clause + MakeWave2(phlist,numph); + break; + + case WXK_LEFT: + if(selected_ph > 1) + selected_ph--; + break; + + case WXK_RIGHT: + if(selected_ph < (numph-2)) + selected_ph++; + break; + + case WXK_UP: + if(event.ControlDown()) + ChangePh(-1,2); + else + ChangePh(1,0); + display = 1; + break; + + case WXK_DOWN: + if(event.ControlDown()) + ChangePh(1,-2); + else + ChangePh(-1,0); + break; + + case ',': + case '<': + if(p->length > 0) + p->length--; + break; + + case '.': + case '>': + p->length++; + break; + + default: + event.Skip(); + break; + } + + if(display) + { + Refresh(); + SelectPh(selected_ph); + } +} // end of ProsodyDisplay::OnKey + + +void ProsodyDisplay::DrawEnv(wxDC& dc, int x1, int y1, int width, PHONEME_LIST *ph) +{//============================================================================== + int pitchr; + int pitch; + int p1; + int ix; + int x,y; + int y2=0; + unsigned char *env; + + if(width <= 0) return; + + if((pitchr = ph->pitch2 - ph->pitch1) < 0) + { + pitchr = -pitchr; + p1 = ph->pitch2; + } + else + { + p1 = ph->pitch1; + } + + + dc.SetPen(PEN_PITCHENV); + + env = envelope_data[ph->env]; + if((ph->type == phVOWEL) && (ph->tone_ph != 0)) + { + // the envelope is given by a Tone phoneme acting on this vowel + env = LookupEnvelope(phoneme_tab[ph->tone_ph]->spect); + } + + for(ix=0; ix<=width; ix+=4) + { + x = int((ix * 127.9)/width); + pitch = ph->pitch1 + (pitchr * env[x])/256; + y = y1-int(pitch * scaley); + if(ix > 0) + dc.DrawLine(x1+ix-4,y2,x1+ix,y); + y2 = y; + } +} // end of DrawEnv + + + +static void GetPhonemeName(PHONEME_TAB *ph, wxString& string) +{//========================================================== + string = wxString(WordToString(ph->mnemonic),wxConvLocal); +} + + +void ProsodyDisplay::DrawPitchline(wxDC& dc, int line, int x1, int x2) +{//================================================================= + int ix; + int endix; + int y; + int offy; + int xpos; + int width; // total width, including pre-pause + int width2; // width without pre-pause + int width_env; + int textwidth, textheight; + wxString string; + PHONEME_LIST *p; + + if(linetab[line] >= numph) return; + + offy = (line+1) * FRAMEHEIGHT - 1; + + y = LINEBASE+LINESEP; + dc.SetPen(*wxLIGHT_GREY_PEN); + for(ix=0; ix<5; ix++) + { + dc.DrawLine(0,offy-y,linewidth,offy-y); + y += LINESEP; + } + + endix = linetab[line+1]; + + xpos = 0; + for(ix=linetab[line]; ix numph-2) break; + if(xpos > x2) break; // past the redraw region + + p = &phlist[ix]; + + width = GetWidth(p); + width2 = width - int(p->prepause * scalex) - 1; + + if(xpos+width < x1) + { + xpos += width; + continue; // before the redraw region + } + + // is this phoneme selected ? + if(ix == selected_ph) + { + dc.SetPen(PEN_PHSELECTED); + dc.DrawLine(xpos,offy-LINEBASE,xpos+width,offy-LINEBASE); + } + + // draw separator bar + if(p->newword) + dc.SetPen(*wxBLACK_PEN); // word boundary + else + dc.SetPen(*wxLIGHT_GREY_PEN); + + dc.DrawLine(xpos,offy-LINEBASE,xpos,offy-LINEBASE-LINESEP*6); + + // draw pitch envelope + if(((p->ph->phflags & phWAVE) == 0) && (p->ph->type != phPAUSE)) + { + if(!(p->synthflags & SFLAG_SEQCONTINUE)) + { + width_env = width2; + if(phlist[ix+1].synthflags & SFLAG_SEQCONTINUE) + width_env += GetWidth(&phlist[ix+1]); + DrawEnv(dc,xpos+1+(width-width2),offy-LINEBASE,width_env,p); + } + } + else + if(p->type != phPAUSE) + { + // sampled sound, draw a flat line + dc.SetPen(PEN_SAMPLED); + dc.DrawLine(xpos+1+(width-width2),offy-LINEBASE-LINESEP, + xpos+1+width,offy-LINEBASE-LINESEP); + } + + // show phoneme name from the PHONEME_TAB + GetPhonemeName(p->ph,string); + dc.GetTextExtent(string,&textwidth,&textheight); + dc.DrawText(string,xpos+(width-textwidth/2)/2, offy-LINEBASE); + + xpos += width; + } + + // draw the separator bar at the end of the line + if(ix==endix && ix= linewidth) + { + linetab[num_lines++] = ix; + xpos = 0; + } + xpos += w; + } + linetab[num_lines]=numph-2; + + SetScrollbars(SCROLLUNITS,SCROLLUNITS,linewidth/SCROLLUNITS, + (num_lines*FRAMEHEIGHT)/SCROLLUNITS+1); + + Refresh(); +} // end of ProsodyDisplay::LayoutData + + + +void MyFrame::OnProsody(wxCommandEvent& WXUNUSED(event)) +{//===================================================== + + // Open the Prosody display window + // Make another frame, containing a canvas + + if(prosodyframe != NULL) + { + // The Prosody window is already open + prosodyframe->Activate(); + return; + } + + prosodyframe = new ChildFrProsody(myframe, _T(""), + wxPoint(10, 200), wxSize(1000, 300), + wxDEFAULT_FRAME_STYLE | + wxNO_FULL_REPAINT_ON_RESIZE); + + prosodyframe->SetTitle(_T("Prosody")); + + // Give it a status line + prosodyframe->CreateStatusBar(); + + int width, height; + wxMDIClientWindow *clientwin = this->GetClientWindow(); + clientwin->GetClientSize(&width, &height); + +#ifdef deleted + wxPanel *panel = new wxPanel(prosodyframe,-1,wxPoint(0,0), wxSize(width,50)); + ProsodyDisplay *canvas = new ProsodyDisplay(prosodyframe, wxPoint(0, 50), wxSize(width-2, height-50)); +#else + ProsodyDisplay *canvas = new ProsodyDisplay(prosodyframe, wxPoint(0, 50), wxSize(width-10, height)); +#endif + + prosodycanvas = canvas; + + // Associate the menu bar with the frame + prosodyframe->SetMenuBar(MakeMenu(2)); + prosodyframe->prosodycanvas = canvas; + prosodyframe->Show(TRUE); + +} + +BEGIN_EVENT_TABLE(ChildFrProsody, wxMDIChildFrame) + EVT_MENU(SPECTSEQ_CLOSE, ChildFrProsody::OnQuit) + +// EVT_ACTIVATE(ChildFrProsody::OnActivate) +END_EVENT_TABLE() + +extern wxList my_children; + +ChildFrProsody::ChildFrProsody(wxMDIParentFrame *parent, const wxString& title, const wxPoint& pos, const wxSize& size, +const long style): + wxMDIChildFrame(parent, -1, title, pos, size, style) +{ + my_children.Append(this); +} + +ChildFrProsody::~ChildFrProsody(void) +{ + wxWindow *w; + my_children.DeleteObject(this); + prosodycanvas = NULL; + prosodyframe = NULL; + +#ifndef PLATFORM_WINDOWS + // bug in wxMDIChildFrame, we need to explicitly remove the ChildFrame from the ClientWindow + w = myframe->GetClientWindow(); + w->RemoveChild(this); +#endif +} + +void ChildFrProsody::OnQuit(wxCommandEvent& WXUNUSED(event)) +{ + Close(TRUE); +} + + diff --git a/src/prosodydisplay.h b/src/prosodydisplay.h new file mode 100755 index 00000000..0351954f --- /dev/null +++ b/src/prosodydisplay.h @@ -0,0 +1,64 @@ + + + +#define FRAMEHEIGHT 120 +#define LINEBASE 20 +#define LINESEP 16 + +#define SCROLLUNITS 20 + + + + +class ProsodyDisplay: public wxScrolledWindow +{//======================================== + public: + ProsodyDisplay(wxWindow *parent, const wxPoint& pos, const wxSize& size); + ~ProsodyDisplay(); + + virtual void OnDraw(wxDC& dc); + void OnMouse(wxMouseEvent& event); + void OnKey(wxKeyEvent& event); + void OnMenu(wxCommandEvent& event); + + void Save(const wxString &path=_T("")); + void LayoutData(PHONEME_LIST *phlist, int n_ph); + + private: + void Redraw(wxDC& dc, int x1, int y1, int x2, int y2); + void DrawEnv(wxDC& dc, int x1, int y1, int width, PHONEME_LIST *ph); + void DrawPitchline(wxDC& dc, int line, int x1, int x2); + void RefreshLine(int line); + int GetWidth(PHONEME_LIST *p); + void ChangePh(int pitch1, int pitch2); + void SelectPh(int index); + + int linewidth; // height for drawing pitch + double scalex; // scale length values + double scaley; // scale pitch values + int selected_ph; + + int numph; + PHONEME_LIST *phlist; + int num_lines; + short linetab[N_PHONEME_LIST/2]; + + DECLARE_EVENT_TABLE() +}; // end class ProsodyDisplay + + +class ChildFrProsody: public wxMDIChildFrame +{ + public: + ProsodyDisplay *prosodycanvas; + ChildFrProsody(wxMDIParentFrame *parent, const wxString& title, const wxPoint& pos, const wxSize& size, const long style); + ~ChildFrProsody(void); + void OnActivate(wxActivateEvent& event); + + void OnQuit(wxCommandEvent& event); + void OnSave(wxCommandEvent& event); + void OnSaveAs(wxCommandEvent& event); + +DECLARE_EVENT_TABLE() +}; + diff --git a/src/readclause.cpp b/src/readclause.cpp new file mode 100644 index 00000000..c0375e62 --- /dev/null +++ b/src/readclause.cpp @@ -0,0 +1,1856 @@ +/*************************************************************************** + * Copyright (C) 2005 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "StdAfx.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "voice.h" +#include "phoneme.h" +#include "synthesize.h" +#include "translate.h" + +#define N_XML_BUF 256 + +espeak_VOICE *SelectVoice(espeak_VOICE *voice_select, int *variant); + +char *xmlbase = NULL; // base URL from + +int namedata_ix=0; +int n_namedata = 0; +char *namedata = NULL; + + +FILE *f_input = NULL; +int ungot_char2 = 0; +char *p_textinput; +wchar_t *p_wchar_input; +int ungot_char; +int end_of_input; + +int ignore_text=0; // set during ... to ignore text which has been replaced by an alias +int clear_skipping_text = 0; // next clause should clear the skipping_text flag +int count_characters = 0; +int sayas_mode; + +static const char *punct_stop = ".:!?"; // pitch fall if followed by space +static const char *punct_close = ")]}>;'\""; // always pitch fall unless followed by alnum + +// alter tone for announce punctuation or capitals +static const char *tone_punct_on = "\001+50R\001+15T"; // add reverberation, reduce low frequencies +static const char *tone_punct_off = "\001R\001T"; + +// punctuations symbols that can end a clause +static const unsigned short punct_chars[] = {',','.','?','!',':',';', + 0x2013, // en-dash + 0x2014, // em-dash + 0x2026, // elipsis + + 0x037e, // Greek question mark (looks like semicolon) + 0x0387, // Greek semicolon, ano teleia + 0x0964, // Devanagari Danda (fullstop) + 0x3001, // ideograph comma + 0x3002, // ideograph period + + 0xff01, // fullwidth exclamation + 0xff0c, // fullwidth comma + 0xff0e, // fullwidth period + 0xff1a, // fullwidth colon + 0xff1b, // fullwidth semicolon + 0xff1f, // fullwidth question mark + + 0}; + + +// indexed by (entry num. in punct_chars) + 1 +// bits 0-7 pause x 10mS, bits 8-10 intonation type, bit 11 don't need following space or bracket +static const unsigned short punct_attributes [] = { 0, + CLAUSE_COMMA, CLAUSE_PERIOD, CLAUSE_QUESTION, CLAUSE_EXCLAMATION, CLAUSE_COLON, CLAUSE_SEMICOLON, + CLAUSE_SEMICOLON, // en-dash + CLAUSE_SEMICOLON, // em-dash + CLAUSE_SEMICOLON, // elipsis + + CLAUSE_QUESTION, // Greek question mark + CLAUSE_SEMICOLON, // Greek semicolon + CLAUSE_PERIOD+0x800, // Devanagari Danda (fullstop) + CLAUSE_COMMA+0x800, // ideograph comma + CLAUSE_PERIOD+0x800, // ideograph period + + CLAUSE_EXCLAMATION+0x800, // fullwidth + CLAUSE_COMMA+0x800, + CLAUSE_PERIOD+0x800, + CLAUSE_COLON+0x800, + CLAUSE_SEMICOLON+0x800, + CLAUSE_QUESTION+0x800, + + CLAUSE_SEMICOLON, // spare + 0 }; + + +// stack for language and voice properties +// frame 0 is for the defaults, before any ssml tags. +typedef struct { + int tag_type; + int voice_variant; + int voice_gender; + int voice_age; + char voice_name[40]; + char language[20]; +} SSML_STACK; + +#define N_SSML_STACK 20 +int n_ssml_stack; +SSML_STACK *ssml_sp; +SSML_STACK ssml_stack[N_SSML_STACK]; + +char current_voice_id[40] = {0}; +int current_voice_variant = 0; + + +#define N_PARAM_STACK 20 +int n_param_stack; +PARAM_STACK param_stack[N_PARAM_STACK]; + +int speech_parameters[N_SPEECH_PARAM]; // current values, from param_stack + +const int param_defaults[N_SPEECH_PARAM] = { + 0, // silence (internal use) + 165, // rate wpm + 100, // volume + 50, // pitch + 50, // range + 0, // punctuation + 0, // capital letters + 0, // emphasis + 0, // line length + 0, // voice type +}; + + +#ifdef PLATFORM_RISCOS +float wcstod(const wchar_t *str, wchar_t **tailptr) +{ + int ix; + char buf[80]; + while(isspace(*str)) str++; + for(ix=0; ix<80; ix++) + { + buf[ix] = str[ix]; + if(isspace(buf[ix])) + break; + } + *tailptr = (wchar_t *)&str[ix]; + return(atof(buf)); +} +#endif + + +static void GetC_unget(int c) +{//========================== +// This is only called with UTF8 input, not wchar input + if(f_input != NULL) + ungetc(c,f_input); + else + { + p_textinput--; + *p_textinput = c; + end_of_input = 0; + } +} + +int Eof(void) +{//========== + if(ungot_char != 0) + return(0); + + if(f_input != 0) + return(feof(f_input)); + + return(end_of_input); +} + + +static int GetC_get(void) +{//====================== + int c; + + if(f_input != NULL) + { + c = fgetc(f_input); + if(feof(f_input)) c = ' '; + return(c & 0xff); + } + + if(option_multibyte == espeakCHARS_WCHAR) + { + if(*p_wchar_input == 0) + { + end_of_input = 1; + return(0); + } + + if(!end_of_input) + return(*p_wchar_input++); + } + else + { + if(*p_textinput == 0) + { + end_of_input = 1; + return(0); + } + + if(!end_of_input) + return(*p_textinput++ & 0xff); + } + return(0); +} + + +static int GetC(void) +{//================== +// Returns a unicode wide character +// Performs UTF8 checking and conversion + + int c; + int c1; + int c2; + int n_bytes; + unsigned char m; + static const unsigned char mask[4] = {0xff,0x1f,0x0f,0x07}; + static const unsigned char mask2[4] = {0,0x80,0x20,0x30}; + + if((c1 = ungot_char) != 0) + { + ungot_char = 0; + return(c1); + } + + c1 = GetC_get(); + if(option_multibyte == espeakCHARS_WCHAR) + { + count_characters++; + return(c1); // wchar_t text + } + + if((option_multibyte < 2) && (c1 & 0x80)) + { + // multi-byte utf8 encoding, convert to unicode + n_bytes = 0; + + if(((c1 & 0xe0) == 0xc0) && ((c1 & 0x1e) != 0)) + n_bytes = 1; + else + if((c1 & 0xf0) == 0xe0) + n_bytes = 2; + else + if(((c1 & 0xf8) == 0xf0) && ((c1 & 0x0f) <= 4)) + n_bytes = 3; + + if(n_bytes > 0) + { + c = c1 & mask[n_bytes]; + m = mask2[n_bytes]; + while(n_bytes > 0) + { + c2 = GetC_get(); + if(c2 == 0) + { + if(option_multibyte==espeakCHARS_AUTO) + option_multibyte=espeakCHARS_8BIT; // change "auto" option to "no" + GetC_unget(' '); + break; + } + + if(((c2 & 0xc0) != 0x80) && ((c2 & m) != 0)) + { + GetC_unget(c2); + break; + } + m = 0x80; + c = (c << 6) + (c2 & 0x3f); + n_bytes--; + } + if(n_bytes == 0) + { + count_characters++; + return(c); + } + } + // top-bit-set character is not utf8, drop through to 8bit charset case + if((option_multibyte==espeakCHARS_AUTO) && !Eof()) + option_multibyte=espeakCHARS_8BIT; // change "auto" option to "no" + } + + // 8 bit character set, convert to unicode if + count_characters++; + if(c1 >= 0xa0) + return(translator->charset_a0[c1-0xa0]); + return(c1); +} // end of GetC + + +static void UngetC(int c) +{//====================== + ungot_char = c; + + if((f_input != NULL) && feof(f_input)) + { +// ungetc(' ',f_input); + } +} + + + +const char *Translator::LookupSpecial(char *string) +{//================================================ + unsigned int flags; + char phonemes[55]; + char phonemes2[55]; + static char buf[60]; + + if(LookupDictList(string,phonemes,&flags,0)) + { + SetWordStress(phonemes,flags,-1,0); + DecodePhonemes(phonemes,phonemes2); + sprintf(buf,"[[%s]] ",phonemes2); + option_phoneme_input = 1; + return(buf); + } + return(NULL); +} + + +const char *Translator::LookupCharName(int c) +{//========================================== +// Find the phoneme string (in ascii) to speak the name of character c + + int ix; + const char *p; + static char buf[24]; + + buf[0] = '_'; + ix = utf8_out(c,&buf[1]); + buf[1+ix]=0; + + if((p = LookupSpecial(buf)) == NULL) + { + p = LookupSpecial(&buf[1]); + } + if(p != NULL) + return(p); + + if((p = LookupSpecial("_??")) == NULL) + { + p = "symbol"; + } + strcpy(buf,p); +// sprintf(buf,"%s%d ",p,c); + return(buf); +} + + +static int LoadSoundFile(const char *fname, int index) +{//=================================================== + FILE *f; + char *p; + int *ip; + int length; + char fname_temp[100]; + char fname2[200]; + char command[150]; + + if(fname == NULL) + fname = soundicon_tab[index].filename; + + if((fname==NULL) || (GetFileLength(fname) <= 0)) + return(1); + if(fname[0] != '/') + { + // a relative path, look in espeak-data/soundicons + sprintf(fname2,"%s%csoundicons%c%s",path_home,PATHSEP,PATHSEP,fname); + fname = fname2; + } + sprintf(fname_temp,"%s.wav",tmpnam(NULL)); + sprintf(command,"sox \"%s\" -r %d -w %s polyphase\n",fname,samplerate,fname_temp); + if(system(command) < 0) + { + fprintf(stderr,"Failed to resample: %s\n",command); + return(2); + } + + length = GetFileLength(fname_temp); + f = fopen(fname_temp,"rb"); + if(f == NULL) + { + fprintf(stderr,"Can't read temp file: %s",fname_temp); + return(3); + } + + fseek(f,0,SEEK_SET); + p = Alloc(length); + fread(p,length,1,f); + fclose(f); + remove(fname_temp); + + ip = (int *)(&p[40]); + soundicon_tab[index].length = (*ip) / 2; // length in samples + soundicon_tab[index].data = p+44; // skip WAV header + return(0); +} // end of LoadSoundFile + + + +static int LookupSoundicon(int c) +{//============================== +// Find the sound icon number for a punctuation chatacter + int ix; + + for(ix=0; ix= 0) + { + // add an embedded command to play the soundicon + sprintf(&buf[bufix],"\001%dI ",soundicon); + UngetC(c2); + found = 1; + } + else + if((punctname = LookupCharName(c1)) != NULL) + { + found = 1; + if(bufix==0) + { + punct_count=1; + while(c2 == c1) + { + punct_count++; + c2 = GetC(); + } + UngetC(c2); + + p = &buf[bufix]; + if(punct_count==1) + sprintf(p,"%s %s %s",tone_punct_on,punctname,tone_punct_off); + else + if(punct_count < 4) + { + sprintf(p,"\001+10S%s",tone_punct_on); + while(punct_count-- > 0) + sprintf(buf,"%s %s",buf,punctname); + sprintf(p,"%s %s\001S",buf,tone_punct_off); + } + else + { + sprintf(p,"%s %s %d %s %s [[______]]", + tone_punct_on,punctname,punct_count,punctname,tone_punct_off); + option_phoneme_input = 1; + } + } + else + { + // end the clause now and pick up the punctuation next time + UngetC(c2); + ungot_char2 = c1; + buf[bufix] = ' '; + buf[bufix+1] = 0; + } + } + + if(found == 0) + return(-1); + + if(c1 == '-') + return(CLAUSE_NONE); // no pause + if((strchr_w(punct_close,c1) != NULL) && !iswalnum(c2)) + return(CLAUSE_COLON); + if(iswspace(c2) && strchr_w(punct_stop,c1)!=NULL) + return(punct_attributes[lookupwchar(punct_chars,c1)]); + + return(CLAUSE_COMMA); +} // end of AnnouncePunctuation + +#define SSML_SPEAK 1 +#define SSML_VOICE 2 +#define SSML_PROSODY 3 +#define SSML_SAYAS 4 +#define SSML_MARK 5 +#define SSML_SENTENCE 6 +#define SSML_PARAGRAPH 7 +#define SSML_PHONEME 8 +#define SSML_SUB 9 +#define SSML_STYLE 10 +#define SSML_AUDIO 11 +#define SSML_EMPHASIS 12 +#define SSML_BREAK 13 +#define HTML_BREAK 15 +#define SSML_CLOSE 0x10 // for a closing tag, OR this with the tag type + +// these tags have no effect if they are self-closing, eg. +static char ignore_if_self_closing[] = {0,1,1,1,1,0,0,0,0,1,1,0,1,0}; + + +MNEM_TAB ssmltags[] = { + {"speak", SSML_SPEAK}, + {"voice", SSML_VOICE}, + {"prosody", SSML_PROSODY}, + {"say-as", SSML_SAYAS}, + {"mark", SSML_MARK}, + {"s", SSML_SENTENCE}, + {"p", SSML_PARAGRAPH}, + {"phoneme", SSML_PHONEME}, + {"sub", SSML_SUB}, + {"tts:style", SSML_STYLE}, + {"audio", SSML_AUDIO}, + {"emphasis", SSML_EMPHASIS}, + {"break", SSML_BREAK}, + + {"br", HTML_BREAK}, + {"li", HTML_BREAK}, + {"img", HTML_BREAK}, + {"td", HTML_BREAK}, + {"h1", SSML_PARAGRAPH}, + {"h2", SSML_PARAGRAPH}, + {"h3", SSML_PARAGRAPH}, + {"h4", SSML_PARAGRAPH}, + {"hr", SSML_PARAGRAPH}, + {NULL,0}}; + + + + +static char *VoiceFromStack(int *voice_variant) +{//============================================ +// Use the voice properties from the SSML stack to choose a voice, and switch +// to that voice if it's not the current voice + int ix; + SSML_STACK *sp; + espeak_VOICE *v; + espeak_VOICE voice_select; + int variant; + char voice_name[40]; + char language[40]; + + strcpy(voice_name,ssml_stack[0].voice_name); + strcpy(language,ssml_stack[0].language); + voice_select.age = ssml_stack[0].voice_age; + voice_select.gender = ssml_stack[0].voice_gender; + voice_select.variant = ssml_stack[0].voice_variant; + voice_select.name = voice_name; + voice_select.languages = language; + voice_select.identifier = NULL; + + for(ix=0; ixvoice_name[0] != 0) + strcpy(voice_name, sp->voice_name); + if(sp->language[0] != 0) + strcpy(language, sp->language); + if(sp->voice_gender != 0) + voice_select.gender = sp->voice_gender; + if(sp->voice_age != 0) + voice_select.age = sp->voice_age; + if(sp->voice_variant != 0) + voice_select.variant = sp->voice_variant; + } + + v = SelectVoice(&voice_select,&variant); + *voice_variant = variant; + if((v == NULL) || (v->identifier == NULL)) + return("default"); + return(v->identifier); +} // end of VoiceFromStack + + + +static void ProcessParamStack(char *outbuf, int &outix) +{//==================================================== +// Set the speech parameters from the parameter stack + int param; + int ix; + int value; + char buf[20]; + int new_parameters[N_SPEECH_PARAM]; + static char cmd_letter[N_SPEECH_PARAM] = {0, 'S','A','P','R', 0, 0, 'F'}; // embedded command letters + + + for(param=0; param= 0) + new_parameters[param] = param_stack[ix].parameter[param]; + } + } + + for(param=0; paramtype = tag_type; + for(ix=0; ixparameter[ix] = -1; + } + return(sp); +} // end of PushParamStack + + +static void PopParamStack(int tag_type, char *outbuf, int &outix) +{//============================================================== + // unwind the stack up to and including the previous tag of this type + int ix; + int top = 0; + + if(tag_type >= SSML_CLOSE) + tag_type -= SSML_CLOSE; + + for(ix=0; ix 0) + { + n_param_stack = top; + } + ProcessParamStack(outbuf, outix); +} // end of PopParamStack + + + +static wchar_t *GetSsmlAttribute(wchar_t *pw, const char *name) +{//============================================================ +// Gets the value string for an attribute. +// Returns NULL if the attribute is not present + int ix; + static wchar_t empty[1] = {0}; + + while(*pw != 0) + { + if(iswspace(pw[-1])) + { + ix = 0; + while(*pw == name[ix]) + { + pw++; + ix++; + } + if(name[ix]==0) + { + // found the attribute, now get the value + while(iswspace(*pw)) pw++; + if(*pw == '=') pw++; + while(iswspace(*pw)) pw++; + if(*pw == '"') + return(pw+1); + else + return(empty); + } + } + pw++; + } + return(NULL); +} // end of GetSsmlAttribute + + +static int attrcmp(const wchar_t *string1, const char *string2) +{//============================================================ + int ix; + + if(string1 == NULL) + return(1); + + for(ix=0; (string1[ix] == string2[ix]) && (string1[ix] != 0); ix++) + { + } + if((string1[ix]=='"') && (string2[ix]==0)) + return(0); + return(1); +} + + +static int attrlookup(const wchar_t *string1, const MNEM_TAB *mtab) +{//================================================================ + int ix; + + for(ix=0; mtab[ix].mnem != NULL; ix++) + { + if(attrcmp(string1,mtab[ix].mnem) == 0) + return(mtab[ix].value); + } + return(mtab[ix].value); +} + + +static int attrnumber(const wchar_t *pw, int default_value, int type) +{//================================================================== + int value = 0; + + if((pw == NULL) || !isdigit(*pw)) + return(default_value); + + while(isdigit(*pw)) + { + value = value*10 + *pw++ - '0'; + } + if((type==1) && (towlower(*pw)=='s')) + { + // time: seconds rather than ms + value *= 1000; + } + return(value); +} // end of attrnumber + + + +static int attrcopy_utf8(char *buf, const wchar_t *pw, int len) +{//============================================================ +// Convert attribute string into utf8, write to buf, and return its utf8 length + unsigned int c; + int ix = 0; + int n; + int prev_c = 0; + + if(pw != NULL) + { + while((ix < (len-4)) && ((c = *pw++) != 0)) + { + if((c=='"') && (prev_c != '\\')) + break; // " indicates end of attribute, unless preceded by backstroke + n = utf8_out(c,&buf[ix]); + ix += n; + prev_c = c; + } + } + buf[ix] = 0; + return(ix); +} // end of attrcopy_utf8 + + + +static int attr_prosody_value(int param_type, const wchar_t *pw, int *value_out) +{//============================================================================= + int sign = 0; + wchar_t *tail; + float value; + + while(iswspace(*pw)) pw++; + if(*pw == '+') + { + pw++; + sign = 1; + } + if(*pw == '-') + { + pw++; + sign = -1; + } + value = wcstod(pw,&tail); + if(tail == pw) + { + // failed to find a number, return 100% + *value_out = 100; + return(2); + } + + if(*tail == '%') + { + if(sign != 0) + value = 100 + (sign * value); + *value_out = (int)value; + return(2); // percentage + } + + if((tail[0]=='s') && (tail[1]=='t')) + { + // convert from semitones to a frequency percentage + *value_out = (int)(pow(double(2.0),double((value*sign)/12) * 100)); + return(2); // percentage + } + + if(param_type == espeakRATE) + { + *value_out = (int)(value * 100); + return(2); // percentage + } + + *value_out = (int)value; + return(sign); // -1, 0, or 1 +} // end of attr_prosody_value + + +int AddNameData(const char *name, int wide) +{//======================================== +// Add the name to the namedata and return its position + int ix; + int len; + void *vp; + + if(wide) + { + len = (wcslen((const wchar_t *)name)+1)*sizeof(wchar_t); + n_namedata = (n_namedata + sizeof(wchar_t) - 1) % sizeof(wchar_t); // round to wchar_t boundary + } + else + { + len = strlen(name)+1; + } + + if(namedata_ix+len >= n_namedata) + { + // allocate more space for marker names + if((vp = realloc(namedata, namedata_ix+len + 300)) == NULL) + return(-1); // failed to allocate, original data is unchanged but ignore this new name + + namedata = (char *)vp; + n_namedata = namedata_ix+len + 300; + } + memcpy(&namedata[ix = namedata_ix],name,len); + namedata_ix += len; + return(ix); +} // end of AddNameData + + +static int GetVoiceAttributes(wchar_t *pw, int tag_type) +{//===================================================== +// Determines whether voice attribute are specified in this tag, and if so, whether this means +// a voice change. +// If it's a closing tag, delete the top frame of the stack and determine whether this implies +// a voice change. +// Returns CLAUSE_BIT_VOICE if there is a voice change + + wchar_t *lang; + wchar_t *gender; + wchar_t *name; + wchar_t *age; + wchar_t *variant; + char *new_voice_id; + int voice_variant; + + static const MNEM_TAB mnem_gender[] = { + {"male", 1}, + {"female", 2}, + {"neutral", 3}, + {NULL, 0}}; + + if(tag_type & SSML_CLOSE) + { + // delete a stack frame + if(n_ssml_stack > 1) + { + n_ssml_stack--; + } + ssml_sp = &ssml_stack[n_ssml_stack]; + } + else + { + // add a stack frame if any voice details are specified + lang = GetSsmlAttribute(pw,"xml:lang"); + + if(tag_type != SSML_VOICE) + { + // only expect an xml:lang attribute + name = NULL; + variant = NULL; + age = NULL; + gender = NULL; + } + else + { + name = GetSsmlAttribute(pw,"name"); + variant = GetSsmlAttribute(pw,"variant"); + age = GetSsmlAttribute(pw,"age"); + gender = GetSsmlAttribute(pw,"gender"); + } + + if((tag_type != SSML_VOICE) && (lang==NULL)) + return(0); // or

without language spec, nothing to do + + ssml_sp = &ssml_stack[n_ssml_stack++]; + + attrcopy_utf8(ssml_sp->language,lang,sizeof(ssml_sp->language)); + attrcopy_utf8(ssml_sp->voice_name,name,sizeof(ssml_sp->voice_name)); + ssml_sp->voice_variant = attrnumber(variant,1,0)-1; + ssml_sp->voice_age = attrnumber(age,0,0); + ssml_sp->voice_gender = attrlookup(gender,mnem_gender); + ssml_sp->tag_type = tag_type; + } + + new_voice_id = VoiceFromStack(&voice_variant); + if((strcmp(new_voice_id,current_voice_id) != 0) || (current_voice_variant != voice_variant)) + { + // add an embedded command to change the voice + strcpy(current_voice_id,new_voice_id); + current_voice_variant = voice_variant; + return(CLAUSE_BIT_VOICE); // change of voice + } + + return(0); +} // end of GetVoiceAttributes + + +static void SetProsodyParameter(int param_type, wchar_t *attr1, PARAM_STACK *sp) +{//============================================================================= + int value; + int sign; + + static const MNEM_TAB mnem_volume[] = { + {"default",100}, + {"silent",0}, + {"x-soft",30}, + {"soft",65}, + {"medium",100}, + {"loud",150}, + {"x-loud",230}, + {NULL, -1}}; + + static const MNEM_TAB mnem_rate[] = { + {"default",100}, + {"x-slow",60}, + {"slow",80}, + {"medium",100}, + {"fast",120}, + {"x-fast",150}, + {NULL, -1}}; + + static const MNEM_TAB mnem_pitch[] = { + {"default",100}, + {"x-low",70}, + {"low",85}, + {"medium",100}, + {"high",110}, + {"x-high",120}, + {NULL, -1}}; + + static const MNEM_TAB mnem_range[] = { + {"default",100}, + {"x-low",20}, + {"low",50}, + {"medium",100}, + {"high",125}, + {"x-high",150}, + {NULL, -1}}; + + static const MNEM_TAB *mnem_tabs[5] = { + NULL, mnem_rate, mnem_volume, mnem_pitch, mnem_range }; + + + if((value = attrlookup(attr1,mnem_tabs[param_type])) >= 0) + { + // mnemonic specifies a value as a percentage of the base pitch/range/rate/volume + sp->parameter[param_type] = (param_stack[0].parameter[param_type] * value)/100; + } + else + { + sign = attr_prosody_value(param_type,attr1,&value); + + if(sign == 0) + sp->parameter[param_type] = value; // absolute value in Hz + else + if(sign == 2) + { + // change specified as percentage or in semitones + sp->parameter[param_type] = (speech_parameters[param_type] * value)/100; + } + else + { + // change specified as plus or minus Hz + sp->parameter[param_type] = speech_parameters[param_type] + (value*sign); + } + } +} // end of SetProsodyParemeter + + + +static int ProcessSsmlTag(wchar_t *xml_buf, char *outbuf, int &outix, int n_outbuf, int self_closing) +{//================================================================================================== +// xml_buf is the tag and attributes with a zero terminator in place of the original '>' +// returns a clause terminator value. + + unsigned int ix; + int index; + int c; + int tag_type; + int value; + int value2; + int value3; + int voice_change_flag; + wchar_t *px; + wchar_t *attr1; + wchar_t *attr2; + wchar_t *attr3; + int terminator; + char *uri; + int param_type; + char tag_name[40]; + char buf[80]; + PARAM_STACK *sp; + + static const MNEM_TAB mnem_punct[] = { + {"none", 1}, + {"all", 2}, + {"some", 3}, + {NULL, -1}}; + + static const MNEM_TAB mnem_capitals[] = { + {"no", 0}, + {"spelling", 2}, + {"icon", 1}, + {"pitch", 20}, // this is the amount by which to raise the pitch + {NULL, -1}}; + + static const MNEM_TAB mnem_interpret_as[] = { + {"characters",SAYAS_CHARS}, + {"tts:char",SAYAS_SINGLE_CHARS}, + {"tts:key",SAYAS_KEY}, + {"tts:digits",SAYAS_DIGITS}, + {"telephone",SAYAS_DIGITS1}, + {NULL, -1}}; + + static const MNEM_TAB mnem_sayas_format[] = { + {"glyphs",1}, + {NULL, -1}}; + + static const MNEM_TAB mnem_break[] = { + {"none",0}, + {"x-weak",1}, + {"weak",2}, + {"medium",3}, + {"strong",4}, + {"x-strong",5}, + {NULL,-1}}; + + static const MNEM_TAB mnem_emphasis[] = { + {"none",1}, + {"reduced",2}, + {"moderate",3}, + {"strong",4}, + {NULL,-1}}; + + static const char *prosody_attr[5] = { + NULL, "rate", "volume", "pitch", "range" }; + + for(ix=0; ix<(sizeof(tag_name)-1); ix++) + { + if(((c = xml_buf[ix]) == 0) || iswspace(c)) + break; + tag_name[ix] = tolower((char)c); + } + tag_name[ix] = 0; + + px = &xml_buf[ix]; // the tag's attributes + + if(tag_name[0] == '/') + { + tag_type = LookupMnem(ssmltags,&tag_name[1]) + SSML_CLOSE; // closing tag + } + else + { + tag_type = LookupMnem(ssmltags,tag_name); + + if(self_closing && ignore_if_self_closing[tag_type]) + return(0); + } + + voice_change_flag = 0; + terminator = CLAUSE_NONE; + + switch(tag_type) + { + case SSML_STYLE: + sp = PushParamStack(tag_type); + attr1 = GetSsmlAttribute(px,"field"); + attr2 = GetSsmlAttribute(px,"mode"); + + + if(attrcmp(attr1,"punctuation")==0) + { + value = attrlookup(attr2,mnem_punct); + sp->parameter[espeakPUNCTUATION] = value; + } + else + if(attrcmp(attr1,"capital_letters")==0) + { + value = attrlookup(attr2,mnem_capitals); + sp->parameter[espeakCAPITALS] = value; + } + ProcessParamStack(outbuf, outix); + break; + + case SSML_PROSODY: + sp = PushParamStack(tag_type); + + // look for attributes: rate, volume, pitch, range + for(param_type=espeakRATE; param_type <= espeakRANGE; param_type++) + { + if((attr1 = GetSsmlAttribute(px,prosody_attr[param_type])) != NULL) + { + SetProsodyParameter(param_type, attr1, sp); + } + } + + ProcessParamStack(outbuf, outix); + break; + + case SSML_EMPHASIS: + sp = PushParamStack(tag_type); + value = 3; // default is "moderate" + if((attr1 = GetSsmlAttribute(px,"level")) != NULL) + { + value = attrlookup(attr1,mnem_emphasis); + } + sp->parameter[espeakEMPHASIS] = value; + ProcessParamStack(outbuf, outix); + break; + + case SSML_STYLE + SSML_CLOSE: + case SSML_PROSODY + SSML_CLOSE: + case SSML_EMPHASIS + SSML_CLOSE: + PopParamStack(tag_type, outbuf, outix); + break; + + case SSML_SAYAS: + attr1 = GetSsmlAttribute(px,"interpret-as"); + attr2 = GetSsmlAttribute(px,"format"); + attr3 = GetSsmlAttribute(px,"detail"); + value = attrlookup(attr1,mnem_interpret_as); + value2 = attrlookup(attr2,mnem_sayas_format); + if(value2 == 1) + value = SAYAS_GLYPHS; + + value3 = attrnumber(attr3,0,0); + + if(value == SAYAS_DIGITS) + { + if(value3 <= 1) + value = SAYAS_DIGITS1; + else + value = SAYAS_DIGITS + value3; + } + + sprintf(buf,"%c%dY",CTRL_EMBEDDED,value); + strcpy(&outbuf[outix],buf); + outix += strlen(buf); + + sayas_mode = value; // punctuation doesn't end clause during SAY-AS + break; + + case SSML_SAYAS + SSML_CLOSE: + outbuf[outix++] = CTRL_EMBEDDED; + outbuf[outix++] = 'Y'; + sayas_mode = 0; + break; + + case SSML_SUB: + if((attr1 = GetSsmlAttribute(px,"alias")) != NULL) + { + // use the alias rather than the text + ignore_text = 1; + outix += attrcopy_utf8(&outbuf[outix],attr1,n_outbuf-outix); + } + break; + + case SSML_SUB + SSML_CLOSE: + ignore_text = 0; + break; + + case SSML_MARK: + if((attr1 = GetSsmlAttribute(px,"name")) != NULL) + { + // add name to circular buffer of marker names + attrcopy_utf8(buf,attr1,sizeof(buf)); + + if(strcmp(skip_marker,buf)==0) + { + // This is the marker we are waiting for before starting to speak + clear_skipping_text = 1; + skip_marker[0] = 0; + return(CLAUSE_NONE); + } + + if((index = AddNameData(buf,0)) >= 0) + { + sprintf(buf,"%c%dM",CTRL_EMBEDDED,index); + strcpy(&outbuf[outix],buf); + outix += strlen(buf); + } + } + break; + + case SSML_AUDIO: + if(uri_callback == NULL) + break; + sp = PushParamStack(tag_type); + + if((attr1 = GetSsmlAttribute(px,"src")) != NULL) + { + attrcopy_utf8(buf,attr1,sizeof(buf)); + if((index = AddNameData(buf,0)) >= 0) + { + uri = &namedata[index]; + if(uri_callback(1,uri,xmlbase) == 0) + { + sprintf(buf,"%c%dU",CTRL_EMBEDDED,index); + strcpy(&outbuf[outix],buf); + outix += strlen(buf); + sp->parameter[espeakSILENCE] = 1; + } + } + } + ProcessParamStack(outbuf, outix); + + if(self_closing) + PopParamStack(tag_type, outbuf, outix); + return(CLAUSE_NONE); + + case SSML_AUDIO + SSML_CLOSE: + if(uri_callback == NULL) + break; + return(CLAUSE_NONE); + + case SSML_BREAK: + value = 50; + terminator = CLAUSE_NONE; + + if((attr1 = GetSsmlAttribute(px,"strength")) != NULL) + { + static int break_value[6] = {0,7,14,21,40,80}; // *10mS + value = attrlookup(attr1,mnem_break); + if(value < 3) + { + // adjust prepause on the following word + sprintf(&outbuf[outix],"%c%dB",CTRL_EMBEDDED,value); + outix += 3; + terminator = 0; + } +// if(value > 3) +// terminator = CLAUSE_COMMA & 0xff00; + value = break_value[value]; + } + if((attr2 = GetSsmlAttribute(px,"time")) != NULL) + { + value2 = attrnumber(px,0,1) / 10; + if(terminator == 0) + terminator = CLAUSE_NONE; + } + if(terminator) + return(terminator + value); + break; + + case SSML_SPEAK: + if((attr1 = GetSsmlAttribute(px,"xml:base")) != NULL) + { + attrcopy_utf8(buf,attr1,sizeof(buf)); + if((index = AddNameData(buf,0)) >= 0) + { + xmlbase = &namedata[index]; + } + } + if(GetVoiceAttributes(px, tag_type) == 0) + return(0); // no voice change + return(CLAUSE_VOICE); + + case SSML_VOICE: + if(GetVoiceAttributes(px, tag_type) == 0) + return(0); // no voice change + return(CLAUSE_VOICE); + + case SSML_SPEAK + SSML_CLOSE: + terminator = CLAUSE_PARAGRAPH; + case SSML_VOICE + SSML_CLOSE: + // unwind stack until the previous or tag + while((n_ssml_stack > 1) && (ssml_stack[n_ssml_stack-1].tag_type != (tag_type - SSML_CLOSE))) + { + n_ssml_stack--; + } + + return(terminator + GetVoiceAttributes(px, tag_type)); + + case HTML_BREAK: + case HTML_BREAK + SSML_CLOSE: + return(CLAUSE_COLON); + + case SSML_SENTENCE: + if(ssml_sp->tag_type == SSML_SENTENCE) + { + // new sentence implies end-of-sentence + voice_change_flag = GetVoiceAttributes(px, SSML_SENTENCE+SSML_CLOSE); + } + voice_change_flag |= GetVoiceAttributes(px, tag_type); + return(CLAUSE_PARAGRAPH + voice_change_flag); + + + case SSML_PARAGRAPH: + if((ssml_sp->tag_type == SSML_SENTENCE) || (ssml_sp->tag_type == SSML_PARAGRAPH)) + { + // new paragraph implies end-of-sentence or end-of-paragraph + voice_change_flag = GetVoiceAttributes(px, SSML_SENTENCE+SSML_CLOSE); + } + voice_change_flag |= GetVoiceAttributes(px, tag_type); + return(CLAUSE_PARAGRAPH + voice_change_flag); + + + case SSML_SENTENCE + SSML_CLOSE: + if(ssml_sp->tag_type == SSML_SENTENCE) + { + // end of a sentence which specified a language + voice_change_flag = GetVoiceAttributes(px, tag_type); + } + return(CLAUSE_PERIOD + voice_change_flag); + + + case SSML_PARAGRAPH + SSML_CLOSE: + if((ssml_sp->tag_type == SSML_SENTENCE) || (ssml_sp->tag_type == SSML_PARAGRAPH)) + { + // End of a paragraph which specified a language. + // (End-of-paragraph also implies end-of-sentence) + return(GetVoiceAttributes(px, tag_type) + CLAUSE_PARAGRAPH); + } + return(CLAUSE_PARAGRAPH); + } + return(0); +} // end of ProcessSsmlTag + + +MNEM_TAB xml_char_mnemonics[] = { + {"gt",'>'}, + {"lt",'<'}, + {"amp", '&'}, + {"quot", '"'}, + {"nbsp", ' '}, + {NULL,-1}}; + + +int Translator::ReadClause(FILE *f_in, char *buf, unsigned short *charix, int n_buf) +{//================================================================================= +/* Find the end of the current clause. + Write the clause into buf + + returns: clause type (bits 0-7: pause x10mS, bits 8-11 intonation type) + + Also checks for blank line (paragraph) as end-of-clause indicator. + + Does not end clause for: + punctuation immediately followed by alphanumeric eg. 1.23 !Speak :path + repeated punctuation, eg. ... !!! +*/ + int c1=' '; // current character + int c2; // next character + int cprev=' '; // previous character + int parag; + int ix = 0; + int j; + int nl_count; + int linelength = 0; + int phoneme_mode = 0; + int n_xml_buf; + int terminator; + int punct; + int any_alnum = 0; + int self_closing; + const char *p; + char buf2[40]; + wchar_t xml_buf[N_XML_BUF+1]; + + + if(clear_skipping_text) + { + skipping_text = 0; + clear_skipping_text = 0; + } + + clause_upper_count = 0; + clause_lower_count = 0; + end_of_input = 0; + +f_input = f_in; // for GetC etc + + if(ungot_char2 != 0) + { + c2 = ungot_char2; + ungot_char2 = 0; + } + else + { + c2 = GetC(); + } + + while(!Eof()) + { + if(!iswalnum(c1)) + { + if((end_character_position > 0) && (count_characters > end_character_position)) + { + end_of_input = 1; + return(CLAUSE_EOF); + } + + if((skip_characters > 0) && (count_characters > skip_characters)) + { + // reached the specified start position + // don't break a word + clear_skipping_text = 1; + skip_characters = 0; + UngetC(c2); + return(CLAUSE_NONE); + } + } + + cprev = c1; + c1 = c2; + c2 = GetC(); + + if(Eof()) + { + c2 = ' '; + } + + if((option_ssml) && (phoneme_mode==0)) + { + if((c1 == '&') && ((c2=='#') || isalpha(c2))) + { + n_xml_buf = 0; + c1 = c2; + while(!Eof() && (iswalnum(c1) || (c1=='#')) && (n_xml_buf < 12)) + { + buf2[n_xml_buf++] = c1; + c1 = GetC(); + } + buf2[n_xml_buf] = 0; + c2 = GetC(); + + if(buf2[0] == '#') + { + // character code number + c1 = '#'; // in case there isn't a number + if(buf2[1] == 'x') + sscanf(&buf2[2],"%x",(unsigned int *)(&c1)); + else + sscanf(&buf2[1],"%d",&c1); + } + else + { + if((j = LookupMnem(xml_char_mnemonics,buf2)) != -1) + { + c1 = j; + } + } + } + else + if(c1 == '<') + { + // SSML Tag + n_xml_buf = 0; + c1 = c2; + while(!Eof() && (c1 != '>') && (n_xml_buf < N_XML_BUF)) + { + xml_buf[n_xml_buf++] = c1; + c1 = GetC(); + } + xml_buf[n_xml_buf] = 0; + c2 = ' '; + + buf[ix++] = ' '; + + self_closing = 0; + if(xml_buf[n_xml_buf-1] == '/') + { + // a self-closing tag + self_closing = 1; + } + + terminator = ProcessSsmlTag(xml_buf,buf,ix,n_buf,self_closing); + + if(terminator != 0) + { + buf[ix] = ' '; + buf[ix++] = 0; + + if(terminator & CLAUSE_BIT_VOICE) + { + // a change in voice, write the new voice name to the end of the buf + buf[ix++] = current_voice_variant; + p = current_voice_id; + while((*p != 0) && (ix < (n_buf-1))) + { + buf[ix++] = *p++; + } + buf[ix++] = 0; + } + return(terminator); + } + continue; + } + } + + if(ignore_text) + continue; + + if((c2=='\n') && (option_linelength == -1)) + { + // single-line mode, return immediately on NL + if((punct = lookupwchar(punct_chars,c1)) == 0) + { + charix[ix] = count_characters - clause_start_char; + ix += utf8_out(c1,&buf[ix]); + terminator = CLAUSE_PERIOD; // line doesn't end in punctuation, assume period + } + else + { + terminator = punct_attributes[punct]; + } + buf[ix] = ' '; + buf[ix+1] = 0; + return(terminator); + } + + if((c1 == CTRL_EMBEDDED) || (c1 == ctrl_embedded)) + { + // an embedded command. If it's a voice change, end the clause + if(c2 == 'V') + { + buf[ix++] = 0; // end the clause at this point + while(!iswspace(c1 = GetC()) && !Eof() && (ix < (n_buf-1))) + buf[ix++] = c1; // add voice name to end of buffer, after the text + buf[ix++] = 0; + return(CLAUSE_VOICE); + } + else + if(c2 == 'B') + { + // set the punctuation option from an embedded command + // B0 B1 B + strcpy(&buf[ix]," "); + ix += 3; + + if((c2 = GetC()) == '0') + option_punctuation = 0; + else + { + option_punctuation = 1; + option_punctlist[0] = 0; + if(c2 != '1') + { + // a list of punctuation characters to be spoken, terminated by space + j = 0; + while(!iswspace(c2) && !Eof()) + { + option_punctlist[j++] = c2; + c2 = GetC(); + buf[ix++] = ' '; + } + option_punctlist[j] = 0; // terminate punctuation list + option_punctuation = 2; + } + } + c2 = GetC(); + continue; + } + } + + linelength++; + + if(iswalnum(c1)) + any_alnum = 1; + + if(iswupper(c1)) + { + clause_upper_count++; + if((option_capitals == 2) && !iswupper(cprev)) + { + p = LookupSpecial("_cap"); + if(p != NULL) + { + sprintf(buf2,"%s%s%s",tone_punct_on,p,tone_punct_off); + j = strlen(buf2); + if((ix + j) < n_buf) + { + strcpy(&buf[ix],buf2); + ix += j; + } + } + } + } + else + if(iswalpha(c1)) + clause_lower_count++; + + if(option_phoneme_input) + { + if((c1 == '[') && (c2 == '[')) + phoneme_mode = 1; // input is phoneme mnemonics, so don't look for punctuation + else + if((c1 == ']') && (c2 == ']')) + phoneme_mode = 0; + } + + if(c1 == '\n') + { + parag = 0; + + // count consecutive newlines, ignoring other spaces + while(!Eof() && iswspace(c2)) + { + if(c2 == '\n') + parag++; + c2 = GetC(); + } + if(parag > 0) + { + // 2nd newline, assume paragraph + UngetC(c2); + + buf[ix] = ' '; + buf[ix+1] = 0; + if(parag > 3) + parag = 3; +if(option_ssml) parag=1; + return((CLAUSE_PARAGRAPH-30) + 30*parag); // several blank lines, longer pause + } + + if(linelength <= option_linelength) + { + // treat lines shorter than a specified length as end-of-clause + UngetC(c2); + buf[ix] = ' '; + buf[ix+1] = 0; + return(CLAUSE_COLON); + } + + linelength = 0; + } + + if(option_punctuation && (phoneme_mode==0) && iswpunct(c1)) + { + // option is set to explicitly speak punctuation characters + // if a list of allowed punctuation has been set up, check whether the character is in it + if((option_punctuation == 1) || (wcschr(option_punctlist,c1) != NULL)) + { + if((terminator = AnnouncePunctuation(c1, c2, buf, ix)) >= 0) + return(terminator); + } + } + + if((phoneme_mode==0) && (sayas_mode==0) && ((punct = lookupwchar(punct_chars,c1)) != 0)) + { + if((iswspace(c2) || (punct_attributes[punct] & 0x800) || IsBracket(c2) || (c2=='?') || (c2=='-') || Eof())) + { + // note: (c2='?') is for when a smart-quote has been replaced by '?' + buf[ix] = ' '; + buf[ix+1] = 0; + + if((c1 == '.') && (cprev == '.')) + { + c1 = 0x2026; + punct = 9; // elipsis + } + + nl_count = 0; + while(!Eof() && iswspace(c2)) + { + if(c2 == '\n') + nl_count++; + c2 = GetC(); // skip past space(s) + } + UngetC(c2); + + if((nl_count==0) && (c1 == '.')) + { + if(iswdigit(cprev) && (langopts.numbers & 0x10000)) + { + // dot after a number indicates an ordinal number + c2 = ' '; + continue; + } + if(iswlower(c2)) + { + c2 = ' '; + continue; // next word has no capital letter, this dot is probably from an abbreviation + } + if(any_alnum==0) + { + c2 = ' '; // no letters or digits yet, so probably not a sentence terminator + continue; + } + } + + if(nl_count > 1) + return(CLAUSE_PARAGRAPH); + return(punct_attributes[punct]); // only recognise punctuation if followed by a blank or bracket/quote + } + } + + if(speech_parameters[espeakSILENCE]==1) + continue; + + if(!iswspace(c1) && !IsBracket(c1)) + { + charix[ix] = count_characters - clause_start_char; + } + ix += utf8_out(c1,&buf[ix]); // buf[ix++] = c1; + + if(!iswalnum(c1) && (ix > (n_buf-20))) + { + // clause too long, getting near end of buffer, so break here + buf[ix] = ' '; + buf[ix+1] = 0; + UngetC(c2); + return(CLAUSE_NONE); + } + if(ix >= (n_buf-2)) + { + // reached end of buffer, must break now + buf[n_buf-2] = ' '; + buf[n_buf-1] = 0; + UngetC(c2); + return(CLAUSE_NONE); + } + } + buf[ix] = ' '; + buf[ix+1] = 0; + return(CLAUSE_EOF); // end of file +} // end of ReadClause + + +void InitNamedata(void) +{//==================== + namedata_ix = 0; + if(namedata != NULL) + { + free(namedata); + namedata = NULL; + n_namedata = 0; + } +} + + +void InitText2(void) +{//================= + int param; + espeak_VOICE *pvoice; + + n_ssml_stack =1; + n_param_stack = 1; + + for(param=0; paramtag_type = 0; + ssml_sp->voice_variant = 0; + ssml_sp->voice_gender = 0; + ssml_sp->voice_age = 0; + strncpy0(ssml_sp->voice_name,pvoice->name,sizeof(ssml_sp->voice_name)); + strncpy0(ssml_sp->language,&pvoice->languages[1],sizeof(ssml_sp->language)); + current_voice_id[0] = 0; + + n_param_stack = 1; + ignore_text = 0; + clear_skipping_text = 0; + count_characters = -1; + sayas_mode = 0; + + xmlbase = NULL; +} + diff --git a/src/setlengths.cpp b/src/setlengths.cpp new file mode 100755 index 00000000..18ded8e3 --- /dev/null +++ b/src/setlengths.cpp @@ -0,0 +1,583 @@ +/*************************************************************************** + * Copyright (C) 2005,2006 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "StdAfx.h" + +#include +#include +#include + +#include "speak_lib.h" +#include "speech.h" +#include "voice.h" +#include "phoneme.h" +#include "synthesize.h" +#include "translate.h" + +extern int GetAmplitude(void); + + +// convert from words-per-minute to internal speed factor +static unsigned char speed_lookup[290] = { + 250, 246, 243, 239, 236, // 80 + 233, 229, 226, 223, 220, // 85 + 217, 214, 211, 208, 205, // 90 + 202, 197, 194, 192, 190, // 95 + 187, 185, 183, 180, 178, // 100 + 176, 174, 172, 170, 168, // 105 + 166, 164, 161, 159, 158, // 110 + 156, 154, 152, 150, 148, // 115 + 146, 145, 143, 141, 137, // 120 + 136, 135, 133, 132, 131, // 125 + 129, 128, 127, 126, 125, // 130 + 124, 122, 121, 120, 119, // 135 + 117, 116, 115, 114, 113, // 140 + 112, 111, 110, 108, 107, // 145 + 106, 105, 104, 103, 102, // 150 + 101, 100, 99, 98, 97, // 155 + 96, 95, 93, 92, 92, // 160 + 91, 90, 89, 89, 88, // 165 + 87, 87, 86, 85, 85, // 170 + 84, 83, 83, 82, 81, // 175 + 80, 80, 79, 78, 78, // 180 + 77, 76, 76, 75, 73, // 185 + 72, 72, 71, 71, 70, // 190 + 70, 69, 69, 68, 67, // 195 + 67, 66, 66, 65, 65, // 200 + 64, 64, 63, 63, 62, // 205 + 62, 61, 60, 60, 59, // 210 + 59, 58, 58, 57, 57, // 215 + 56, 56, 55, 55, 55, // 220 + 54, 54, 53, 53, 52, // 225 + 52, 51, 51, 50, 50, // 230 + 49, 49, 49, 48, 48, // 235 + 47, 47, 46, 46, 46, // 240 + 45, 45, 44, 44, 43, // 245 + 43, 43, 42, 42, 41, // 250 + 41, 41, 40, 40, 39, // 255 + 39, 39, 38, 38, 38, // 260 + 37, 37, 37, 36, 36, // 265 + 35, 35, 35, 34, 34, // 270 + 34, 33, 33, 33, 32, // 275 + 32, 32, 32, 31, 31, // 280 + 31, 30, 30, 30, 29, // 285 + 29, 29, 29, 28, 28, // 290 + 28, 28, 27, 27, 27, // 295 + 26, 26, 26, 26, 25, // 300 + 25, 25, 22, 22, 22, // 305 + 22, 22, 22, 22, 22, // 310 + 21, 21, 21, 21, 21, // 315 + 21, 20, 20, 20, 20, // 320 + 20, 15, 15, 15, 15, // 325 + 15, 15, 15, 15, 16, // 330 + 16, 16, 16, 15, 15, // 335 + 15, 15, 15, 15, 15, // 340 + 15, 17, 17, 16, 16, // 345 + 15, 15, 14, 14, 13, // 350 + 13, 12, 12, 11, 11, // 355 + 10, 10, 9, 8, 8, // 360 + 7, 7, 6, 6, 5, // 365 +}; + +static int speed1 = 130; +static int speed2 = 121; +static int speed3 = 118; + + + +void SetSpeed(int control) +{//======================= + int x; + int s1; + int wpm; + + wpm = embedded_value[EMBED_S]; + if(wpm > 369) wpm = 369; + if(wpm < 80) wpm = 80; + + x = speed_lookup[wpm-80]; + + if(control & 1) + { + // set speed factors for different syllable positions within a word + // these are used in CalcLengths() + speed1 = (x * voice->speedf1)/256; + speed2 = (x * voice->speedf2)/256; + speed3 = (x * voice->speedf3)/256; + } + + if(control & 2) + { + // these are used in synthesis file + s1 = (x * voice->speedf1)/256; + speed_factor1 = (256 * s1)/115; // full speed adjustment, used for pause length +if(speed_factor1 < 16) + speed_factor1 = 16; + if(wpm >= 170) +// speed_factor2 = 100 + (166*s1)/128; // reduced speed adjustment, used for playing recorded sounds + speed_factor2 = 110 + (151*s1)/128; // reduced speed adjustment, used for playing recorded sounds + else + speed_factor2 = 128 + (128*s1)/130; // = 215 at 170 wpm + } + +} // end of SetSpeed + + +#ifdef deleted +void SetAmplitude(int amp) +{//======================= + static unsigned char amplitude_factor[] = {0,5,6,7,9,11,14,17,21,26, 32, 38,44,50,56,63,70,77,84,91,100 }; + + if((amp >= 0) && (amp <= 20)) + { + option_amplitude = (amplitude_factor[amp] * 480)/256; + } +} +#endif + + + +void SetParameter(int parameter, int value, int relative) +{//====================================================== +// parameter: reset-all, amp, pitch, speed, linelength, expression, capitals, number grouping +// relative 0=absolute 1=relative + + int new_value = value; + int default_value; + + if(relative) + { + if(parameter < 5) + { + default_value = param_defaults[parameter]; + new_value = default_value + (default_value * value)/100; + } + } + param_stack[0].parameter[parameter] = new_value; + + switch(parameter) + { + case espeakRATE: + embedded_value[EMBED_S] = new_value; + embedded_value[EMBED_S2] = new_value; + SetSpeed(3); + break; + + case espeakVOLUME: + embedded_value[EMBED_A] = new_value; + GetAmplitude(); + break; + + case espeakPITCH: + if(new_value > 99) new_value = 99; + embedded_value[EMBED_P] = new_value; + break; + + case espeakRANGE: + if(new_value > 99) new_value = 99; + embedded_value[EMBED_R] = new_value; + break; + + case espeakPUNCTUATION: + break; + + case espeakCAPITALS: + break; + + case espeakLINELENGTH: + option_linelength = new_value; + break; + + default: + break; + } +} // end of SetParameter + + + +static void DoEmbedded2(int &embix) +{//================================ + // There were embedded commands in the text at this point + + unsigned int word; + + do { + word = embedded_list[embix++]; + + if((word & 0x1f) == EMBED_S) + { + // speed + SetEmbedded(word & 0x7f, word >> 8); // adjusts embedded_value[EMBED_S] + SetSpeed(1); + } + } while((word & 0x80) == 0); +} + + +void Translator::CalcLengths() +{//=========================== + int ix; + int ix2; + PHONEME_LIST *prev; + PHONEME_LIST *next; + PHONEME_LIST *next2; + PHONEME_LIST *next3; + PHONEME_LIST *p; + PHONEME_LIST *p2; + + int stress; + int type; + static int more_syllables=0; + int pre_sonorant=0; + int pre_voiced=0; + int last_pitch = 0; + int pitch_start; + int length_mod; + int len; + int env2; + int end_of_clause; + int embedded_ix = 0; + int min_drop; + unsigned char *pitch_env=NULL; + + for(ix=1; ixtone & 0xf; + + next = &phoneme_list[ix+1]; + + if(p->synthflags & SFLAG_EMBEDDED) + { + DoEmbedded2(embedded_ix); + } + + type = p->type; + if(p->synthflags & SFLAG_SYLLABLE) + type = phVOWEL; + + switch(type) + { + case phPAUSE: + last_pitch = 0; + break; + + case phSTOP: + last_pitch = 0; + if(prev->type == phFRICATIVE) + p->prepause = 20; + else + if((more_syllables > 0) || (stress < 4)) + p->prepause = 40; + else + p->prepause = 60; + + if((langopts.word_gap & 0x10) && (p->newword)) + p->prepause = 60; + + if(p->synthflags & SFLAG_LENGTHEN) + p->prepause += langopts.long_stop; + break; + + case phVFRICATIVE: + if(next->type==phVOWEL) + { + pre_voiced = 1; + } + case phFRICATIVE: + if(p->newword) + p->prepause = 15; + + if(next->type==phPAUSE && prev->type==phNASAL && !(p->ph->phflags&phFORTIS)) + p->prepause = 25; + + if((p->ph->phflags & phSIBILANT) && next->type==phSTOP && !next->newword) + { + if(prev->type == phVOWEL) + p->length = 200; // ?? should do this if it's from a prefix + else + p->length = 150; + } + else + p->length = 256; + + if((langopts.word_gap & 0x10) && (p->newword)) + p->prepause = 30; + + break; + + case phVSTOP: + if(prev->type==phVFRICATIVE || prev->type==phFRICATIVE || (prev->ph->phflags & phSIBILANT) || (prev->type == phLIQUID)) + p->prepause = 30; + + if(next->type==phVOWEL || next->type==phLIQUID) + { + if((next->type==phVOWEL) || !next->newword) + pre_voiced = 1; + + p->prepause = 40; + + if((prev->type == phPAUSE) || (prev->type == phVOWEL)) // || (prev->ph->mnemonic == ('/'*256+'r'))) + p->prepause = 0; + else + if(p->newword==0) + { + if(prev->type==phLIQUID) + p->prepause = 20; + if(prev->type==phNASAL) + p->prepause = 12; + + if(prev->type==phSTOP && !(prev->ph->phflags & phFORTIS)) + p->prepause = 0; + } + } + if((langopts.word_gap & 0x10) && (p->newword) && (p->prepause < 20)) + p->prepause = 20; + + break; + + case phLIQUID: + case phNASAL: + p->amp = stress_amps[1]; // unless changed later + p->length = 256; // TEMPORARY + min_drop = 0; + + if(p->newword) + { + if(prev->type==phLIQUID) + p->prepause = 25; + if(prev->type==phVOWEL) + p->prepause = 12; + } + + if(next->type==phVOWEL) + { + pre_sonorant = 1; + } + else + if((prev->type==phVOWEL) || (prev->type == phLIQUID)) + { + p->length = prev->length; + p->pitch2 = last_pitch; + if(p->pitch2 < 7) + p->pitch2 = 7; + p->pitch1 = p->pitch2 - 8; + p->env = PITCHfall; + pre_voiced = 0; + + if(p->type == phLIQUID) + { + p->length = speed1; +p->pitch1 = p->pitch2 - 20; // post vocalic [r/] + } + + if(next->type == phVSTOP) + { + p->length = (p->length * 160)/100; + } + if(next->type == phVFRICATIVE) + { + p->length = (p->length * 120)/100; + } + } + else + { + p->pitch2 = last_pitch; + for(ix2=ix; ix2pitch2 = phoneme_list[ix2].pitch2; + break; + } + } + p->pitch1 = p->pitch2-8; + p->env = PITCHfall; + pre_voiced = 0; + } + break; + + case phVOWEL: + min_drop = 0; + next2 = &phoneme_list[ix+2]; + next3 = &phoneme_list[ix+3]; + + if(stress > 7) stress = 7; + + if(pre_sonorant) + p->amp = stress_amps[stress]-1; + else + p->amp = stress_amps[stress]; + + if(ix >= (n_phoneme_list-3)) + { + // last phoneme of a clause, limit its amplitude + if(p->amp > langopts.param[LOPT_MAXAMP_EOC]) + p->amp = langopts.param[LOPT_MAXAMP_EOC]; + } + + // is the last syllable of a word ? + more_syllables=0; + end_of_clause = 0; + for(p2 = p+1; p2->newword== 0; p2++) + { + if(p2->type == phVOWEL) + more_syllables++; + } + if((p2->newword & 2) && (more_syllables==0)) + { + end_of_clause = 2; + } + + // calc length modifier + if(more_syllables==0) + { + len = langopts.length_mods0[next2->ph->length_mod *10+ next->ph->length_mod]; + + if((next->newword) && (langopts.word_gap & 0x4)) + { + // consider as a pause + first phoneme of the next word + length_mod = (len + langopts.length_mods0[next->ph->length_mod *10+ 1])/2; + } + else + length_mod = len; + } + else + { + length_mod = langopts.length_mods[next2->ph->length_mod *10+ next->ph->length_mod]; + + if((next->type == phNASAL) && (next2->type == phSTOP || next2->type == phVSTOP) && (next3->ph->phflags & phFORTIS)) + length_mod -= 15; + } + + if(more_syllables==0) + length_mod *= speed1; + else + if(more_syllables==1) + length_mod *= speed2; + else + length_mod *= speed3; + + length_mod = length_mod / 128; +// if(length_mod < 24) +// length_mod = 24; // restrict how much lengths can be reduced + if(length_mod < 9) + length_mod = 9; // restrict how much lengths can be reduced + + if(stress >= 7) + { + // tonic syllable, include a constant component so it doesn't decrease directly with speed + length_mod += 22; + } + + length_mod = (length_mod * stress_lengths[stress])/128; + + if(end_of_clause == 2) + { + // this is the last syllable in the clause, lengthen it - more for short vowels + length_mod = length_mod * (256 + (280 - p->ph->std_length)/3)/256; + } + +if(p->type != phVOWEL) +{ + length_mod = 256; // syllabic consonant + min_drop = 8; +} + p->length = length_mod; + + // pre-vocalic part + // set last-pitch + env2 = p->env; + if(env2 > 1) env2++; // version for use with preceding semi-vowel + + if(p->tone_ph != 0) + { + pitch_env = LookupEnvelope(phoneme_tab[p->tone_ph]->spect); + } + else + { + pitch_env = envelope_data[env2]; + } + + pitch_start = p->pitch1 + ((p->pitch2-p->pitch1)*pitch_env[0])/256; + + if(pre_sonorant || pre_voiced) + { + // set pitch for pre-vocalic part + if(pitch_start - last_pitch > 9) + last_pitch = pitch_start - 9; + prev->pitch1 = last_pitch; + prev->pitch2 = pitch_start; + if(last_pitch < pitch_start) + { + prev->env = PITCHrise; + p->env = env2; + } + else + { + prev->env = PITCHfall; + } + + prev->length = length_mod; + + prev->amp = p->amp; + if((prev->type != phLIQUID) && (prev->amp > 18)) + prev->amp = 18; + } + + // vowel & post-vocalic part + next->synthflags &= ~SFLAG_SEQCONTINUE; + if(next->type == phNASAL && next2->type != phVOWEL) + next->synthflags |= SFLAG_SEQCONTINUE; + + if(next->type == phLIQUID) + { + next->synthflags |= SFLAG_SEQCONTINUE; + + if(next2->type == phVOWEL) + { + next->synthflags &= ~SFLAG_SEQCONTINUE; + } + + if(next2->type != phVOWEL) + { + if(next->ph->mnemonic == ('/'*256+'r')) + { + next->synthflags &= ~SFLAG_SEQCONTINUE; +// min_drop = 15; + } + } + } + + if((min_drop > 0) && ((p->pitch2 - p->pitch1) < min_drop)) + { + p->pitch1 = p->pitch2 - min_drop; + if(p->pitch1 < 0) + p->pitch1 = 0; + } + + last_pitch = p->pitch1 + ((p->pitch2-p->pitch1)*envelope_data[p->env][127])/256; + pre_sonorant = 0; + pre_voiced = 0; + break; + } + } +} // end of CalcLengths + diff --git a/src/sintab.h b/src/sintab.h new file mode 100755 index 00000000..08fc18f3 --- /dev/null +++ b/src/sintab.h @@ -0,0 +1,258 @@ +short int sin_tab[2048] = { + 0, -25, -50, -75, -100, -125, -150, -175, + -201, -226, -251, -276, -301, -326, -351, -376, + -401, -427, -452, -477, -502, -527, -552, -577, + -602, -627, -652, -677, -702, -727, -752, -777, + -802, -827, -852, -877, -902, -927, -952, -977, + -1002, -1027, -1052, -1077, -1102, -1127, -1152, -1177, + -1201, -1226, -1251, -1276, -1301, -1326, -1350, -1375, + -1400, -1425, -1449, -1474, -1499, -1523, -1548, -1573, + -1597, -1622, -1647, -1671, -1696, -1721, -1745, -1770, + -1794, -1819, -1843, -1868, -1892, -1917, -1941, -1965, + -1990, -2014, -2038, -2063, -2087, -2111, -2136, -2160, + -2184, -2208, -2233, -2257, -2281, -2305, -2329, -2353, + -2377, -2401, -2425, -2449, -2473, -2497, -2521, -2545, + -2569, -2593, -2617, -2640, -2664, -2688, -2712, -2735, + -2759, -2783, -2806, -2830, -2853, -2877, -2900, -2924, + -2947, -2971, -2994, -3018, -3041, -3064, -3088, -3111, + -3134, -3157, -3180, -3204, -3227, -3250, -3273, -3296, + -3319, -3342, -3365, -3388, -3410, -3433, -3456, -3479, + -3502, -3524, -3547, -3570, -3592, -3615, -3637, -3660, + -3682, -3705, -3727, -3749, -3772, -3794, -3816, -3839, + -3861, -3883, -3905, -3927, -3949, -3971, -3993, -4015, + -4037, -4059, -4080, -4102, -4124, -4146, -4167, -4189, + -4211, -4232, -4254, -4275, -4296, -4318, -4339, -4360, + -4382, -4403, -4424, -4445, -4466, -4487, -4508, -4529, + -4550, -4571, -4592, -4613, -4633, -4654, -4675, -4695, + -4716, -4736, -4757, -4777, -4798, -4818, -4838, -4859, + -4879, -4899, -4919, -4939, -4959, -4979, -4999, -5019, + -5039, -5059, -5078, -5098, -5118, -5137, -5157, -5176, + -5196, -5215, -5235, -5254, -5273, -5292, -5311, -5331, + -5350, -5369, -5388, -5406, -5425, -5444, -5463, -5482, + -5500, -5519, -5537, -5556, -5574, -5593, -5611, -5629, + -5648, -5666, -5684, -5702, -5720, -5738, -5756, -5774, + -5791, -5809, -5827, -5844, -5862, -5880, -5897, -5914, + -5932, -5949, -5966, -5984, -6001, -6018, -6035, -6052, + -6069, -6085, -6102, -6119, -6136, -6152, -6169, -6185, + -6202, -6218, -6235, -6251, -6267, -6283, -6299, -6315, + -6331, -6347, -6363, -6379, -6395, -6410, -6426, -6441, + -6457, -6472, -6488, -6503, -6518, -6533, -6549, -6564, + -6579, -6594, -6608, -6623, -6638, -6653, -6667, -6682, + -6696, -6711, -6725, -6739, -6754, -6768, -6782, -6796, + -6810, -6824, -6838, -6852, -6865, -6879, -6893, -6906, + -6920, -6933, -6946, -6960, -6973, -6986, -6999, -7012, + -7025, -7038, -7051, -7064, -7076, -7089, -7101, -7114, + -7126, -7139, -7151, -7163, -7175, -7187, -7199, -7211, + -7223, -7235, -7247, -7259, -7270, -7282, -7293, -7305, + -7316, -7327, -7338, -7349, -7361, -7372, -7382, -7393, + -7404, -7415, -7425, -7436, -7446, -7457, -7467, -7478, + -7488, -7498, -7508, -7518, -7528, -7538, -7548, -7557, + -7567, -7577, -7586, -7596, -7605, -7614, -7623, -7633, + -7642, -7651, -7660, -7668, -7677, -7686, -7695, -7703, + -7712, -7720, -7728, -7737, -7745, -7753, -7761, -7769, + -7777, -7785, -7793, -7800, -7808, -7816, -7823, -7830, + -7838, -7845, -7852, -7859, -7866, -7873, -7880, -7887, + -7894, -7900, -7907, -7914, -7920, -7926, -7933, -7939, + -7945, -7951, -7957, -7963, -7969, -7975, -7980, -7986, + -7991, -7997, -8002, -8008, -8013, -8018, -8023, -8028, + -8033, -8038, -8043, -8047, -8052, -8057, -8061, -8066, + -8070, -8074, -8078, -8082, -8086, -8090, -8094, -8098, + -8102, -8105, -8109, -8113, -8116, -8119, -8123, -8126, + -8129, -8132, -8135, -8138, -8141, -8143, -8146, -8149, + -8151, -8153, -8156, -8158, -8160, -8162, -8164, -8166, + -8168, -8170, -8172, -8174, -8175, -8177, -8178, -8179, + -8181, -8182, -8183, -8184, -8185, -8186, -8187, -8187, + -8188, -8189, -8189, -8190, -8190, -8190, -8190, -8190, + -8191, -8190, -8190, -8190, -8190, -8190, -8189, -8189, + -8188, -8187, -8187, -8186, -8185, -8184, -8183, -8182, + -8181, -8179, -8178, -8177, -8175, -8174, -8172, -8170, + -8168, -8166, -8164, -8162, -8160, -8158, -8156, -8153, + -8151, -8149, -8146, -8143, -8141, -8138, -8135, -8132, + -8129, -8126, -8123, -8119, -8116, -8113, -8109, -8105, + -8102, -8098, -8094, -8090, -8086, -8082, -8078, -8074, + -8070, -8066, -8061, -8057, -8052, -8047, -8043, -8038, + -8033, -8028, -8023, -8018, -8013, -8008, -8002, -7997, + -7991, -7986, -7980, -7975, -7969, -7963, -7957, -7951, + -7945, -7939, -7933, -7926, -7920, -7914, -7907, -7900, + -7894, -7887, -7880, -7873, -7866, -7859, -7852, -7845, + -7838, -7830, -7823, -7816, -7808, -7800, -7793, -7785, + -7777, -7769, -7761, -7753, -7745, -7737, -7728, -7720, + -7712, -7703, -7695, -7686, -7677, -7668, -7660, -7651, + -7642, -7633, -7623, -7614, -7605, -7596, -7586, -7577, + -7567, -7557, -7548, -7538, -7528, -7518, -7508, -7498, + -7488, -7478, -7467, -7457, -7446, -7436, -7425, -7415, + -7404, -7393, -7382, -7372, -7361, -7349, -7338, -7327, + -7316, -7305, -7293, -7282, -7270, -7259, -7247, -7235, + -7223, -7211, -7199, -7187, -7175, -7163, -7151, -7139, + -7126, -7114, -7101, -7089, -7076, -7064, -7051, -7038, + -7025, -7012, -6999, -6986, -6973, -6960, -6946, -6933, + -6920, -6906, -6893, -6879, -6865, -6852, -6838, -6824, + -6810, -6796, -6782, -6768, -6754, -6739, -6725, -6711, + -6696, -6682, -6667, -6653, -6638, -6623, -6608, -6594, + -6579, -6564, -6549, -6533, -6518, -6503, -6488, -6472, + -6457, -6441, -6426, -6410, -6395, -6379, -6363, -6347, + -6331, -6315, -6299, -6283, -6267, -6251, -6235, -6218, + -6202, -6185, -6169, -6152, -6136, -6119, -6102, -6085, + -6069, -6052, -6035, -6018, -6001, -5984, -5966, -5949, + -5932, -5914, -5897, -5880, -5862, -5844, -5827, -5809, + -5791, -5774, -5756, -5738, -5720, -5702, -5684, -5666, + -5648, -5629, -5611, -5593, -5574, -5556, -5537, -5519, + -5500, -5482, -5463, -5444, -5425, -5406, -5388, -5369, + -5350, -5331, -5311, -5292, -5273, -5254, -5235, -5215, + -5196, -5176, -5157, -5137, -5118, -5098, -5078, -5059, + -5039, -5019, -4999, -4979, -4959, -4939, -4919, -4899, + -4879, -4859, -4838, -4818, -4798, -4777, -4757, -4736, + -4716, -4695, -4675, -4654, -4633, -4613, -4592, -4571, + -4550, -4529, -4508, -4487, -4466, -4445, -4424, -4403, + -4382, -4360, -4339, -4318, -4296, -4275, -4254, -4232, + -4211, -4189, -4167, -4146, -4124, -4102, -4080, -4059, + -4037, -4015, -3993, -3971, -3949, -3927, -3905, -3883, + -3861, -3839, -3816, -3794, -3772, -3749, -3727, -3705, + -3682, -3660, -3637, -3615, -3592, -3570, -3547, -3524, + -3502, -3479, -3456, -3433, -3410, -3388, -3365, -3342, + -3319, -3296, -3273, -3250, -3227, -3204, -3180, -3157, + -3134, -3111, -3088, -3064, -3041, -3018, -2994, -2971, + -2947, -2924, -2900, -2877, -2853, -2830, -2806, -2783, + -2759, -2735, -2712, -2688, -2664, -2640, -2617, -2593, + -2569, -2545, -2521, -2497, -2473, -2449, -2425, -2401, + -2377, -2353, -2329, -2305, -2281, -2257, -2233, -2208, + -2184, -2160, -2136, -2111, -2087, -2063, -2038, -2014, + -1990, -1965, -1941, -1917, -1892, -1868, -1843, -1819, + -1794, -1770, -1745, -1721, -1696, -1671, -1647, -1622, + -1597, -1573, -1548, -1523, -1499, -1474, -1449, -1425, + -1400, -1375, -1350, -1326, -1301, -1276, -1251, -1226, + -1201, -1177, -1152, -1127, -1102, -1077, -1052, -1027, + -1002, -977, -952, -927, -902, -877, -852, -827, + -802, -777, -752, -727, -702, -677, -652, -627, + -602, -577, -552, -527, -502, -477, -452, -427, + -401, -376, -351, -326, -301, -276, -251, -226, + -201, -175, -150, -125, -100, -75, -50, -25, + 0, 25, 50, 75, 100, 125, 150, 175, + 201, 226, 251, 276, 301, 326, 351, 376, + 401, 427, 452, 477, 502, 527, 552, 577, + 602, 627, 652, 677, 702, 727, 752, 777, + 802, 827, 852, 877, 902, 927, 952, 977, + 1002, 1027, 1052, 1077, 1102, 1127, 1152, 1177, + 1201, 1226, 1251, 1276, 1301, 1326, 1350, 1375, + 1400, 1425, 1449, 1474, 1499, 1523, 1548, 1573, + 1597, 1622, 1647, 1671, 1696, 1721, 1745, 1770, + 1794, 1819, 1843, 1868, 1892, 1917, 1941, 1965, + 1990, 2014, 2038, 2063, 2087, 2111, 2136, 2160, + 2184, 2208, 2233, 2257, 2281, 2305, 2329, 2353, + 2377, 2401, 2425, 2449, 2473, 2497, 2521, 2545, + 2569, 2593, 2617, 2640, 2664, 2688, 2712, 2735, + 2759, 2783, 2806, 2830, 2853, 2877, 2900, 2924, + 2947, 2971, 2994, 3018, 3041, 3064, 3088, 3111, + 3134, 3157, 3180, 3204, 3227, 3250, 3273, 3296, + 3319, 3342, 3365, 3388, 3410, 3433, 3456, 3479, + 3502, 3524, 3547, 3570, 3592, 3615, 3637, 3660, + 3682, 3705, 3727, 3749, 3772, 3794, 3816, 3839, + 3861, 3883, 3905, 3927, 3949, 3971, 3993, 4015, + 4037, 4059, 4080, 4102, 4124, 4146, 4167, 4189, + 4211, 4232, 4254, 4275, 4296, 4318, 4339, 4360, + 4382, 4403, 4424, 4445, 4466, 4487, 4508, 4529, + 4550, 4571, 4592, 4613, 4633, 4654, 4675, 4695, + 4716, 4736, 4757, 4777, 4798, 4818, 4838, 4859, + 4879, 4899, 4919, 4939, 4959, 4979, 4999, 5019, + 5039, 5059, 5078, 5098, 5118, 5137, 5157, 5176, + 5196, 5215, 5235, 5254, 5273, 5292, 5311, 5331, + 5350, 5369, 5388, 5406, 5425, 5444, 5463, 5482, + 5500, 5519, 5537, 5556, 5574, 5593, 5611, 5629, + 5648, 5666, 5684, 5702, 5720, 5738, 5756, 5774, + 5791, 5809, 5827, 5844, 5862, 5880, 5897, 5914, + 5932, 5949, 5966, 5984, 6001, 6018, 6035, 6052, + 6069, 6085, 6102, 6119, 6136, 6152, 6169, 6185, + 6202, 6218, 6235, 6251, 6267, 6283, 6299, 6315, + 6331, 6347, 6363, 6379, 6395, 6410, 6426, 6441, + 6457, 6472, 6488, 6503, 6518, 6533, 6549, 6564, + 6579, 6594, 6608, 6623, 6638, 6653, 6667, 6682, + 6696, 6711, 6725, 6739, 6754, 6768, 6782, 6796, + 6810, 6824, 6838, 6852, 6865, 6879, 6893, 6906, + 6920, 6933, 6946, 6960, 6973, 6986, 6999, 7012, + 7025, 7038, 7051, 7064, 7076, 7089, 7101, 7114, + 7126, 7139, 7151, 7163, 7175, 7187, 7199, 7211, + 7223, 7235, 7247, 7259, 7270, 7282, 7293, 7305, + 7316, 7327, 7338, 7349, 7361, 7372, 7382, 7393, + 7404, 7415, 7425, 7436, 7446, 7457, 7467, 7478, + 7488, 7498, 7508, 7518, 7528, 7538, 7548, 7557, + 7567, 7577, 7586, 7596, 7605, 7614, 7623, 7633, + 7642, 7651, 7660, 7668, 7677, 7686, 7695, 7703, + 7712, 7720, 7728, 7737, 7745, 7753, 7761, 7769, + 7777, 7785, 7793, 7800, 7808, 7816, 7823, 7830, + 7838, 7845, 7852, 7859, 7866, 7873, 7880, 7887, + 7894, 7900, 7907, 7914, 7920, 7926, 7933, 7939, + 7945, 7951, 7957, 7963, 7969, 7975, 7980, 7986, + 7991, 7997, 8002, 8008, 8013, 8018, 8023, 8028, + 8033, 8038, 8043, 8047, 8052, 8057, 8061, 8066, + 8070, 8074, 8078, 8082, 8086, 8090, 8094, 8098, + 8102, 8105, 8109, 8113, 8116, 8119, 8123, 8126, + 8129, 8132, 8135, 8138, 8141, 8143, 8146, 8149, + 8151, 8153, 8156, 8158, 8160, 8162, 8164, 8166, + 8168, 8170, 8172, 8174, 8175, 8177, 8178, 8179, + 8181, 8182, 8183, 8184, 8185, 8186, 8187, 8187, + 8188, 8189, 8189, 8190, 8190, 8190, 8190, 8190, + 8191, 8190, 8190, 8190, 8190, 8190, 8189, 8189, + 8188, 8187, 8187, 8186, 8185, 8184, 8183, 8182, + 8181, 8179, 8178, 8177, 8175, 8174, 8172, 8170, + 8168, 8166, 8164, 8162, 8160, 8158, 8156, 8153, + 8151, 8149, 8146, 8143, 8141, 8138, 8135, 8132, + 8129, 8126, 8123, 8119, 8116, 8113, 8109, 8105, + 8102, 8098, 8094, 8090, 8086, 8082, 8078, 8074, + 8070, 8066, 8061, 8057, 8052, 8047, 8043, 8038, + 8033, 8028, 8023, 8018, 8013, 8008, 8002, 7997, + 7991, 7986, 7980, 7975, 7969, 7963, 7957, 7951, + 7945, 7939, 7933, 7926, 7920, 7914, 7907, 7900, + 7894, 7887, 7880, 7873, 7866, 7859, 7852, 7845, + 7838, 7830, 7823, 7816, 7808, 7800, 7793, 7785, + 7777, 7769, 7761, 7753, 7745, 7737, 7728, 7720, + 7712, 7703, 7695, 7686, 7677, 7668, 7660, 7651, + 7642, 7633, 7623, 7614, 7605, 7596, 7586, 7577, + 7567, 7557, 7548, 7538, 7528, 7518, 7508, 7498, + 7488, 7478, 7467, 7457, 7446, 7436, 7425, 7415, + 7404, 7393, 7382, 7372, 7361, 7349, 7338, 7327, + 7316, 7305, 7293, 7282, 7270, 7259, 7247, 7235, + 7223, 7211, 7199, 7187, 7175, 7163, 7151, 7139, + 7126, 7114, 7101, 7089, 7076, 7064, 7051, 7038, + 7025, 7012, 6999, 6986, 6973, 6960, 6946, 6933, + 6920, 6906, 6893, 6879, 6865, 6852, 6838, 6824, + 6810, 6796, 6782, 6768, 6754, 6739, 6725, 6711, + 6696, 6682, 6667, 6653, 6638, 6623, 6608, 6594, + 6579, 6564, 6549, 6533, 6518, 6503, 6488, 6472, + 6457, 6441, 6426, 6410, 6395, 6379, 6363, 6347, + 6331, 6315, 6299, 6283, 6267, 6251, 6235, 6218, + 6202, 6185, 6169, 6152, 6136, 6119, 6102, 6085, + 6069, 6052, 6035, 6018, 6001, 5984, 5966, 5949, + 5932, 5914, 5897, 5880, 5862, 5844, 5827, 5809, + 5791, 5774, 5756, 5738, 5720, 5702, 5684, 5666, + 5648, 5629, 5611, 5593, 5574, 5556, 5537, 5519, + 5500, 5482, 5463, 5444, 5425, 5406, 5388, 5369, + 5350, 5331, 5311, 5292, 5273, 5254, 5235, 5215, + 5196, 5176, 5157, 5137, 5118, 5098, 5078, 5059, + 5039, 5019, 4999, 4979, 4959, 4939, 4919, 4899, + 4879, 4859, 4838, 4818, 4798, 4777, 4757, 4736, + 4716, 4695, 4675, 4654, 4633, 4613, 4592, 4571, + 4550, 4529, 4508, 4487, 4466, 4445, 4424, 4403, + 4382, 4360, 4339, 4318, 4296, 4275, 4254, 4232, + 4211, 4189, 4167, 4146, 4124, 4102, 4080, 4059, + 4037, 4015, 3993, 3971, 3949, 3927, 3905, 3883, + 3861, 3839, 3816, 3794, 3772, 3749, 3727, 3705, + 3682, 3660, 3637, 3615, 3592, 3570, 3547, 3524, + 3502, 3479, 3456, 3433, 3410, 3388, 3365, 3342, + 3319, 3296, 3273, 3250, 3227, 3204, 3180, 3157, + 3134, 3111, 3088, 3064, 3041, 3018, 2994, 2971, + 2947, 2924, 2900, 2877, 2853, 2830, 2806, 2783, + 2759, 2735, 2712, 2688, 2664, 2640, 2617, 2593, + 2569, 2545, 2521, 2497, 2473, 2449, 2425, 2401, + 2377, 2353, 2329, 2305, 2281, 2257, 2233, 2208, + 2184, 2160, 2136, 2111, 2087, 2063, 2038, 2014, + 1990, 1965, 1941, 1917, 1892, 1868, 1843, 1819, + 1794, 1770, 1745, 1721, 1696, 1671, 1647, 1622, + 1597, 1573, 1548, 1523, 1499, 1474, 1449, 1425, + 1400, 1375, 1350, 1326, 1301, 1276, 1251, 1226, + 1201, 1177, 1152, 1127, 1102, 1077, 1052, 1027, + 1002, 977, 952, 927, 902, 877, 852, 827, + 802, 777, 752, 727, 702, 677, 652, 627, + 602, 577, 552, 527, 502, 477, 452, 427, + 401, 376, 351, 326, 301, 276, 251, 226, + 201, 175, 150, 125, 100, 75, 50, 25, + }; diff --git a/src/speak.cpp b/src/speak.cpp new file mode 100755 index 00000000..342f1a13 --- /dev/null +++ b/src/speak.cpp @@ -0,0 +1,663 @@ +/*************************************************************************** + * Copyright (C) 2005,2006 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "StdAfx.h" + +#include "speech.h" + +#include +#include +#include +#ifdef PLATFORM_WINDOWS +#include +#include +#else +#include +#endif +#ifndef NEED_GETOPT +#include +#endif +#include +#include +#include +#include "sys/stat.h" + +#include "speak_lib.h" +#include "voice.h" +#include "phoneme.h" +#include "synthesize.h" +#include "translate.h" + + + +char path_home[120]; +char wavefile[120]; +int (* uri_callback)(int, const char *, const char *) = NULL; + + +static const char *help_text = +"\nspeak [options] [\"\"]\n\n" +"-f Text file to speak\n" +"--stdin Read text input from stdin instead of a file\n\n" +"If neither -f nor --stdin, are spoken, or if none then text is\n" +"spoken from stdin, each line separately.\n\n" +"-a \n" +"\t Amplitude, 0 to 200, default is 100\n" +"-l \n" +"\t Line length. If not zero (which is the default), consider\n" +"\t lines less than this length as end-of-clause\n" +"-p \n" +"\t Pitch adjustment, 0 to 99, default is 50\n" +"-s \n" +"\t Speed in words per minute 80 to 370, default is 170\n" +"-v \n" +"\t Use voice file of this name from espeak-data/voices\n" +"-w \n" +"\t Write output to this WAV file, rather than speaking it directly\n" +"-b\t Input text is 8-bit encoding\n" +"-m\t Interpret SSML markup, and ignore other < > tags\n" +"-q\t Quiet, don't produce any speech (may be useful with -x)\n" +"-x\t Write phoneme mnemonics to stdout\n" +"-X\t Write phonemes mnemonics and translation trace to stdout\n" +"--stdout Write speech output to stdout\n" +"--compile=\n" +"\t Compile the pronunciation rules and dictionary in the current\n" +"\t directory. = is optional and specifies which language\n" +"--punct=\"\"\n" +"\t Speak the names of punctuation characters during speaking. If\n" +"\t = is omitted, all punctuation is spoken.\n" +"--voices=\n" +"\t List the available voices for the specified language.\n" +"\t If is omitted, then list all voices.\n"; + + +#ifdef deleted +"-k \n" +"\t Indicate capital letters with: 1=sound, 2=the word \"capitals\",\n" +"\t higher values = a pitch increase (try -k20).\n"; +#endif + + +void DisplayVoices(FILE *f_out, char *language); + +voice_t voice_data; +USHORT voice_pcnt[N_PEAKS+1][3]; +voice_t *voice; + + + +int GetFileLength(const char *filename) +{//==================================== + struct stat statbuf; + + if(stat(filename,&statbuf) != 0) + return(0); + + if((statbuf.st_mode & S_IFMT) == S_IFDIR) +// if(S_ISDIR(statbuf.st_mode)) + return(-2); // a directory + + return(statbuf.st_size); +} // end of GetFileLength + + +char *Alloc(int size) +{//================== + char *p; + if((p = (char *)malloc(size)) == NULL) + fprintf(stderr,"Can't allocate memory\n"); + return(p); +} + +void Free(void *ptr) +{//================= + if(ptr != NULL) + free(ptr); +} + + +void DisplayVoices(FILE *f_out, char *language) +{//============================================ + int ix; + char *p; + int len; + int count; + int scores = 0; + const espeak_VOICE *v; + char *lang_name; + char age_buf[12]; + const espeak_VOICE **voices; + espeak_VOICE voice_select; + + static char genders[4] = {' ','M','F',' '}; + + if((language != NULL) && (language[0] != 0)) + { + // display only voices for the specified language, in order of priority + voice_select.languages = language; + voice_select.age = 0; + voice_select.gender = 0; + voice_select.name = NULL; + voices = espeak_ListVoices(&voice_select); + scores = 1; + } + else + { + voices = espeak_ListVoices(NULL); + } + + fprintf(f_out,"Pty Language Age/Gender VoiceName File Other Langs\n"); + + for(ix=0; (v = voices[ix]) != NULL; ix++) + { + count = 0; + p = v->languages; + while(*p != 0) + { + len = strlen(p+1); + lang_name = p+1; + + if(v->age == 0) + strcpy(age_buf," "); + else + sprintf(age_buf,"%3d",v->age); + + if(count==0) + { + fprintf(f_out,"%2d %-12s%s%c %-17s %-11s ", + p[0],lang_name,age_buf,genders[v->gender],v->name,v->identifier); + } + else + { + fprintf(f_out,"(%s %d)",lang_name,p[0]); + } + count++; + p += len+2; + } +// if(scores) +// fprintf(f_out,"%3d ",v->score); + fputc('\n',f_out); + } +} // end of DisplayVoices + + + + +static void PitchAdjust(int pitch_adjustment) +{//========================================== + int ix, factor; + extern unsigned char pitch_adjust_tab[100]; + + voice->pitch_base = (voice->pitch_base * pitch_adjust_tab[pitch_adjustment])/128; + + // adjust formants to give better results for a different voice pitch + factor = 256 + (25 * (pitch_adjustment - 50))/50; + for(ix=0; ix<=5; ix++) + { + voice->freq[ix] = (voice->freq2[ix] * factor)/256; + } +} // end of PitchAdjustment + + +void MarkerEvent(int type, unsigned int char_position, int value, unsigned char *out_ptr) +{//====================================================================================== +// Do nothing in the command-line version. +} // end of MarkerEvent + + + +static void init_path(void) +{//======================== +#ifdef PLATFORM_WINDOWS + HKEY RegKey; + unsigned long size; + unsigned long var_type; + unsigned char buf[100]; + + buf[0] = 0; + RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Speech\\Voices\\Tokens\\eSpeak", 0, KEY_READ, &RegKey); + size = sizeof(buf); + var_type = REG_SZ; + RegQueryValueEx(RegKey, "path", 0, &var_type, buf, &size); + + sprintf(path_home,"%s\\espeak-data",buf); +#else + snprintf(path_home,sizeof(path_home),"%s/espeak-data",getenv("HOME")); + if(access(path_home,R_OK) != 0) + { + strcpy(path_home,PATH_ESPEAK_DATA); + } +#endif +} + + +static int initialise(void) +{//======================== + int param; + int result; + + // It seems that the wctype functions don't work until the locale has been set + // to something other than the default "C". Then, not only Latin1 but also the + // other characters give the correct results with iswalpha() etc. +#ifdef PLATFORM_RISCOS + setlocale(LC_CTYPE,"ISO8859-1"); +#else + if(setlocale(LC_CTYPE,"en_US.UTF-8") == NULL) + setlocale(LC_CTYPE,""); +#endif + + + WavegenInit(22050,0); // 22050 + if((result = LoadPhData()) != 1) + { + if(result == -1) + fprintf(stderr,"Failed to load espeak-data\n"); + else + fprintf(stderr,"Wrong version of espeak-data 0x%x (expects 0x%x)\n",result,version_phdata); + } +#ifndef PLATFORM_WINDOWS + LoadConfig(); // causes problem on Windows, don't know why +#endif + SynthesizeInit(); + + for(param=0; param 99) pitch_adjustment = 99; + break; + + case 'q': + quiet = 1; + break; + + case 'f': + strncpy0(filename,optarg2,sizeof(filename)); + break; + + case 'l': + value = 0; + value = atoi(optarg2); + option_linelength = value; + break; + + case 'a': + amp = atoi(optarg2); + break; + + case 's': + speed = atoi(optarg2); + break; + + case 'v': + strncpy0(voicename,optarg2,sizeof(voicename)); + break; + + case 'w': + option_waveout = 1; + strncpy0(wavefile,optarg2,sizeof(wavefile)); + break; + + case 0x100: // --stdin + flag_stdin = 1; + break; + + case 0x101: // --stdout + option_waveout = 1; + strcpy(wavefile,"stdout"); + break; + + case 0x102: // --compile + if(optarg2 != NULL) + strncpy0(voicename,optarg2,sizeof(voicename)); + flag_compile = 1; + break; + + case 0x103: // --punct + option_punctuation = 1; + if(optarg2 != NULL) + { + ix = 0; + while((ix < N_PUNCTLIST) && ((option_punctlist[ix] = optarg2[ix]) != 0)) ix++; + option_punctlist[N_PUNCTLIST-1] = 0; + option_punctuation = 2; + } + break; + + case 0x104: // --voices + DisplayVoices(stdout,optarg2); + exit(0); + + default: + exit(0); + } + } + + initialise(); + + if(voicename[0] == 0) + strcpy(voicename,"default"); + + if(SetVoiceByName(voicename) != EE_OK) + { + fprintf(stderr,"%svoice '%s'\n",err_load,voicename); + exit(2); + } + + + if(flag_compile) + { +#ifdef PLATFORM_WINDOWS + CompileDictionary("C:\\Program Files\\eSpeak\\dictsource\\",dictionary_name,NULL,NULL); +#else + CompileDictionary(NULL,dictionary_name,NULL,NULL); +#endif + exit(0); + } + + SetParameter(espeakRATE,speed,0); + SetParameter(espeakVOLUME,amp,0); + SetParameter(espeakCAPITALS,option_capitals,0); + SetParameter(espeakPUNCTUATION,option_punctuation,0); + + if(pitch_adjustment != 50) + { + PitchAdjust(pitch_adjustment); + } + WavegenSetVoice(voice); + + if(filename[0]==0) + { + if((optind < argc) && (flag_stdin == 0)) + { + // there's a non-option parameter, and no -f or --stdin + // use it as text + p_text = argv[optind]; + } + else + { + f_text = stdin; + if(flag_stdin == 0) + option_linelength = -1; // single input lines on stdin + } + } + else + { + f_text = fopen(filename,"r"); + } + + if((f_text == NULL) && (p_text == NULL)) + { + fprintf(stderr,"%sfile '%s'\n",err_load,filename); + exit(1); + } + + if(option_waveout || quiet) + { + if(quiet) + { + // no sound output + OpenWaveFile(NULL,samplerate); + option_waveout = 1; + } + else + { + // write sound output to a WAV file + if(OpenWaveFile(wavefile,samplerate) != 0) + { + fprintf(stderr,"Can't write to output file '%s'\n'",wavefile); + exit(3); + } + } + + InitText(0); + SpeakNextClause(f_text,p_text,0); + + for(;;) + { + if(WavegenFile() != 0) + { + break; // finished, wavegen command queue is empty + } + + if(Generate(phoneme_list,&n_phoneme_list,1)==0) + SpeakNextClause(NULL,NULL,1); + } + + CloseWaveFile(samplerate); + } + else + { + // Silence on ^C or SIGINT +// signal(SIGINT,StopSpeak); + + // output sound using portaudio + WavegenInitSound(); + + InitText(0); + SpeakNextClause(f_text,p_text,0); + + if(option_quiet) + { + while(SpeakNextClause(NULL,NULL,1) != 0); + return(0); + } + +#ifdef USE_PORTAUDIO + speaking = 1; + while(speaking) + { + // NOTE: if nanosleep() isn't recognised on your system, try replacing + // this by sleep(1); +#ifdef PLATFORM_WINDOWS + Sleep(300); // 0.3s +#else +#ifdef USE_NANOSLEEP + struct timespec period; + struct timespec remaining; + period.tv_sec = 0; + period.tv_nsec = 300000000; // 0.3 sec + nanosleep(&period,&remaining); +#else + sleep(1); +#endif +#endif + if(SynthOnTimer() != 0) + speaking = 0; + } +#else + fprintf(stderr,"-w option must be used because the program was built without a sound interface\n"); +#endif // USE_PORTAUDIO + } + return(0); +} diff --git a/src/speak_lib.cpp b/src/speak_lib.cpp new file mode 100644 index 00000000..173c822a --- /dev/null +++ b/src/speak_lib.cpp @@ -0,0 +1,1066 @@ +/*************************************************************************** + * Copyright (C) 2005,2006 by Jonathan Duddington * + * jonsd@users.sourceforge.net * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; 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 "ctype.h" +#include "string.h" +#include "stdlib.h" +#include "wchar.h" +#include "locale.h" +#include +#include + +#include "speech.h" + +#include "sys/stat.h" +#ifndef PLATFORM_WINDOWS +#include +#endif + +#include "speak_lib.h" +#include "voice.h" +#include "phoneme.h" +#include "synthesize.h" +#include "translate.h" +#include "debug.h" + +#include "fifo.h" +#include "event.h" +#include "wave.h" + +unsigned char *outbuf=NULL; +extern espeak_VOICE *voice_selected; + +espeak_EVENT *event_list=NULL; +int event_list_ix=0; +int n_event_list; +long count_samples; +void* my_audio=NULL; + +static unsigned int my_unique_identifier=0; +static void* my_user_data=NULL; +static espeak_AUDIO_OUTPUT my_mode=AUDIO_OUTPUT_SYNCHRONOUS; +static int synchronous_mode = 1; +t_espeak_callback* synth_callback = NULL; +int (* uri_callback)(int, const char *, const char *) = NULL; + +char path_home[120]; + +voice_t voicedata; +voice_t *voice = &voicedata; + + +#ifdef USE_ASYNC + +static int dispatch_audio(short* outbuf, int length, espeak_EVENT* event) +{//====================================================================== + ENTER("dispatch_audio"); + + int a_wave_can_be_played = fifo_is_command_enabled(); + + SHOW("*** dispatch_audio > uid=%d, [write=%p (%d bytes)], sample=%d, a_wave_can_be_played = %d\n", + (event) ? event->unique_identifier : 0, wave_test_get_write_buffer(), 2*length, + (event) ? event->sample : 0, + a_wave_can_be_played); + + + switch(my_mode) + { + case AUDIO_OUTPUT_PLAYBACK: + { + if (outbuf && length && a_wave_can_be_played) + { + wave_write (my_audio, (char*)outbuf, 2*length); + } + + while(a_wave_can_be_played) { + // TBD: some event are filtered here but some insight might be given + // TBD: in synthesise.cpp for avoiding to create WORDs with size=0. + // TBD: For example sentence "or ALT)." returns three words + // "or", "ALT" and "". + // TBD: the last one has its size=0. + if (event && (event->type == espeakEVENT_WORD) && (event->length==0)) + { + break; + } + espeak_ERROR a_error = event_declare(event); + if (a_error != EE_BUFFER_FULL) + { + break; + } + SHOW_TIME("dispatch_audio > EE_BUFFER_FULL\n"); + usleep(10000); + a_wave_can_be_played = fifo_is_command_enabled(); + } + } + break; + + case AUDIO_OUTPUT_RETRIEVAL: + if (synth_callback) + { + synth_callback(outbuf, length, event); + } + break; + + case AUDIO_OUTPUT_SYNCHRONOUS: + case AUDIO_OUTPUT_SYNCH_PLAYBACK: + break; + } + + if (!a_wave_can_be_played) + { + SHOW_TIME("dispatch_audio > synth must be stopped!\n"); + } + + SHOW_TIME("LEAVE dispatch_audio\n"); + + return (a_wave_can_be_played==0); // 1 = stop synthesis +} + + + +static int create_events(short* outbuf, int length, espeak_EVENT* event, uint32_t the_write_pos) +{//===================================================================== + int finished; + int i=0; + + // The audio data are written to the output device. + // The list of events in event_list (index: event_list_ix) is read: + // Each event is declared to the "event" object which stores them internally. + // The event object is responsible of calling the external callback + // as soon as the relevant audio sample is played. + + do + { // for each event + espeak_EVENT* event; + if (event_list_ix == 0) + { + event = NULL; + } + else + { + event = event_list + i; + + SHOW("Synthesize: event->sample(%d) + %d = %d\n", event->sample, the_write_pos, event->sample + the_write_pos); + event->sample += the_write_pos; + } + SHOW("*** Synthesize: i=%d (event_list_ix=%d), length=%d\n",i,event_list_ix,length); + finished = dispatch_audio((short *)outbuf, length, event); + length = 0; // the wave data are played once. + i++; + } while((i < event_list_ix) && !finished); + return finished; +} + + +int sync_espeak_terminated_msg( uint unique_identifier, void* user_data) +{//===================================================================== + ENTER("sync_espeak_terminated_msg"); + + int finished=0; + + memset(event_list, 0, 2*sizeof(espeak_EVENT)); + + event_list[0].type = espeakEVENT_MSG_TERMINATED; + event_list[0].unique_identifier = unique_identifier; + event_list[0].user_data = user_data; + event_list[1].type = espeakEVENT_LIST_TERMINATED; + + if (my_mode==AUDIO_OUTPUT_PLAYBACK) + { + while(1) + { + espeak_ERROR a_error = event_declare(event_list); + if (a_error != EE_BUFFER_FULL) + { + break; + } + SHOW_TIME("sync_espeak_terminated_msg > EE_BUFFER_FULL\n"); + usleep(10000); + } + } + else + { + if (synth_callback) + { + finished=synth_callback(NULL,0,event_list); + } + } + return finished; +} + +#endif + + +static void select_output(espeak_AUDIO_OUTPUT output_type) +{//======================================================= + my_mode = output_type; + my_audio = NULL; + synchronous_mode = 1; + option_waveout = 1; // inhibit portaudio callback from wavegen.cpp + + switch(my_mode) + { + case AUDIO_OUTPUT_PLAYBACK: + synchronous_mode = 0; +#ifdef USE_ASYNC + wave_init(); + wave_set_callback_is_output_enabled( fifo_is_command_enabled); + my_audio = wave_open("alsa"); + event_init(synth_callback); +#endif + break; + + case AUDIO_OUTPUT_RETRIEVAL: + synchronous_mode = 0; + break; + + case AUDIO_OUTPUT_SYNCHRONOUS: + break; + + case AUDIO_OUTPUT_SYNCH_PLAYBACK: + option_waveout = 0; + WavegenInitSound(); + break; + } +} // end of select_output + + + + +int GetFileLength(const char *filename) +{//==================================== + struct stat statbuf; + + if(stat(filename,&statbuf) != 0) + return(0); + + if((statbuf.st_mode & S_IFMT) == S_IFDIR) + // if(S_ISDIR(statbuf.st_mode)) + return(-2); // a directory + + return(statbuf.st_size); +} // end of GetFileLength + + +char *Alloc(int size) +{//================== + char *p; + if((p = (char *)malloc(size)) == NULL) + fprintf(stderr,"Can't allocate memory\n"); + return(p); +} + +void Free(void *ptr) +{//================= + if(ptr != NULL) + free(ptr); +} + + + +static void init_path(const char *path) +{//==================================== +#ifdef PLATFORM_WINDOWS + if(path != NULL) + { + sprintf(path_home,"%s/espeak-data",path); + return; + } + + strcpy(path_home,"c:\\Program Files\\espeak\\espeak-data"); + +#else + if(path != NULL) + { + snprintf(path_home,sizeof(path_home),"%s/espeak-data",path); + return; + } + + snprintf(path_home,sizeof(path_home),"%s/espeak-data",getenv("HOME")); + if(access(path_home,R_OK) != 0) + { + strcpy(path_home,PATH_ESPEAK_DATA); + } +#endif +} + +static int initialise(void) +{//======================== + int param; + int result; + +#ifndef __WIN32__ + LoadConfig(); // causes problem on Windows, don't know why +#endif + WavegenInit(22050,0); // 22050 + if((result = LoadPhData()) != 1) + { + if(result == -1) + fprintf(stderr,"Failed to load espeak-data\n"); + else + fprintf(stderr,"Wrong version of espeak-data 0x%x (expects 0x%x)\n",result,version_phdata); + } + + voice_selected = NULL; + SynthesizeInit(); + InitNamedata(); + + for(param=0; param uid=%d, flags=%d, >>>text=%s<<<\n", unique_identifier, flags, text); + } +#endif + + if((outbuf==NULL) || (event_list==NULL)) + return(EE_INTERNAL_ERROR); // espeak_Initialize() has not been called + + option_multibyte = flags & 7; + option_ssml = flags & espeakSSML; + option_phoneme_input = flags & espeakPHONEMES; + option_endpause = flags & espeakENDPAUSE; + + count_samples = 0; + +#ifdef USE_ASYNC + if(my_mode == AUDIO_OUTPUT_PLAYBACK) + { + a_write_pos = wave_get_write_position(my_audio); + } +#endif + + if(translator == NULL) + { + SetVoiceByName("default"); + } + + SpeakNextClause(NULL,text,0); + + if(my_mode == AUDIO_OUTPUT_SYNCH_PLAYBACK) + { + for(;;) + { +#ifdef PLATFORM_WINDOWS + Sleep(300); // 0.3s +#else +#ifdef USE_NANOSLEEP + struct timespec period; + struct timespec remaining; + period.tv_sec = 0; + period.tv_nsec = 300000000; // 0.3 sec + nanosleep(&period,&remaining); +#else + sleep(1); +#endif +#endif + if(SynthOnTimer() != 0) + break; + } + return(EE_OK); + } + + for(;;) + { + SHOW("Synthesize > %s\n","for (next)"); + out_ptr = outbuf; + out_end = &outbuf[outbuf_size]; + event_list_ix = 0; + WavegenFill(0); + + length = (out_ptr - outbuf)/2; + count_samples += length; + event_list[event_list_ix].type = espeakEVENT_LIST_TERMINATED; // indicates end of event list + + count_buffers++; + if (my_mode==AUDIO_OUTPUT_PLAYBACK) + { +#ifdef USE_ASYNC + finished = create_events((short *)outbuf, length, event_list, a_write_pos); + length = 0; // the wave data are played once. +#endif + } + else + { + finished = synth_callback((short *)outbuf, length, event_list); + } + if(finished) + { + SpeakNextClause(NULL,0,2); // stop + break; + } + + if(Generate(phoneme_list,&n_phoneme_list,1)==0) + { + if(WcmdqUsed() == 0) + { + // don't process the next clause until the previous clause has finished generating speech. + // This ensures that