| @@ -17,6 +17,7 @@ | |||
| // ?8 Use full vowel, not schwa in some word endings | |||
| // $alt use strong ending | |||
| // $alt2 use weak ending | |||
| // letter names, as they are spoken as a single character in text | |||
| @@ -297,6 +298,7 @@ _17 s'Ev@nti:n | |||
| _18 'eIti:n | |||
| _19 n'aInti:n | |||
| _2X tw'Enti | |||
| ?3 _2X tw'Eni | |||
| _3X T'3:ti | |||
| ?5 _3X T'IRti | |||
| _4X f'o@ti | |||
| @@ -306,6 +308,7 @@ _7X s'Ev@nti | |||
| ?7 _7X s'@v@nti | |||
| _8X 'eIti | |||
| _9X n'aInti | |||
| _0C h'Vndr@d | |||
| _0M1 T'aUz@nd | |||
| _0M2 m'Ili@n | |||
| @@ -628,6 +631,7 @@ askance a#skaans | |||
| askew a#skju: | |||
| ass as | |||
| assess a#sEs | |||
| asus eIs@s | |||
| atlas atl@s | |||
| atop a#t0p | |||
| attache at'aSeI $only | |||
| @@ -702,6 +706,7 @@ bizarre bIz'A@ | |||
| bizzare bIz'A@ | |||
| blancmange bl@m0nZ | |||
| blase blA:zeI | |||
| bleh blEh | |||
| blockade $2 | |||
| blouse blaUz | |||
| bluest blu:@st | |||
| @@ -776,10 +781,13 @@ capitol kapIt@L | |||
| caprice ka#pr'i:s | |||
| caramel kar@mEl | |||
| caravan kar@van | |||
| carburetor kA@b@r'Et3 | |||
| ?3 carburetor kA@b@reIt3 | |||
| career k@r'i@3 | |||
| caress k@rEs | |||
| carpel kA@p@l | |||
| cascade $2 | |||
| cashier kaS'i@3 | |||
| cashmere kaSm'i@3 | |||
| catastrophe ka#tastr@f%i | |||
| catarrh k@tA@ | |||
| @@ -808,6 +816,8 @@ chapel tSap@L | |||
| charade Sa#rA:d | |||
| charismatic karIsm'atIk | |||
| charit tSarIt // charitable | |||
| charlatan SA@l@t@n | |||
| chassis SaSi | |||
| chateau SatoU | |||
| chemise SEm'i:z | |||
| chevrolet SEvr@leI | |||
| @@ -929,6 +939,7 @@ corollary $2 | |||
| corporal kO@pr@L | |||
| corporate kO@p@r@t | |||
| corps kO@ $only | |||
| corral k@r'al | |||
| cosmos k0zm0s | |||
| countered kaUnt3d | |||
| coupon ku:p0n | |||
| @@ -1076,6 +1087,7 @@ educe I2dju:s | |||
| edwardian Edw'O@di@n | |||
| efile i:faIl | |||
| egg Eg // egging | |||
| egregious Igr'i:dZ@s | |||
| eh eI | |||
| eid i:d | |||
| el ,El $only | |||
| @@ -1087,6 +1099,7 @@ elicit I2lIsI2t | |||
| élite Il'i:t | |||
| embed Emb'Ed | |||
| ember Emb3 | |||
| emphasis Emf@sIs | |||
| empire $1 | |||
| emu i:mju: | |||
| enroute 0nr'u:t | |||
| @@ -1163,6 +1176,7 @@ familiar f@mIli@3 | |||
| famine famIn | |||
| farewell $2 | |||
| fasten faas@n | |||
| fatigue fa#ti:g | |||
| fathom faD@m | |||
| (faux pas) f'oU||p'A: | |||
| favorite feIv@-rI2t // sp. | |||
| @@ -1207,6 +1221,7 @@ foretell fo@t'El | |||
| forever $2 | |||
| forewarn $2 | |||
| formid fO@m'Id // formidable | |||
| formica fO@m'aIk@ | |||
| fortunate fO@tS@n@t | |||
| fortune fO@tSu:n | |||
| foyer fOIeI | |||
| @@ -1253,6 +1268,7 @@ gilead g'IlIad | |||
| gimme gImi | |||
| giraffe dZI2raaf | |||
| goin ,goUI2n $only // for goin' | |||
| gonna g,@n@ | |||
| goodbye $2 | |||
| goodday $2 | |||
| goodnight $2 | |||
| @@ -1337,8 +1353,6 @@ huzza h@z'A: | |||
| huzzah h@z'A: | |||
| hyperbola haIp'3:b@l@ | |||
| hyperbole haIp'3:b@li | |||
| hypothesis haIp'0T@sIs | |||
| hypotheses haIp'0T@si:z | |||
| hypotenuse haIp'0t@nju:s | |||
| hypoxia haIp'0ksi@ | |||
| @@ -1347,6 +1361,7 @@ icon aIk0n | |||
| iconbar aIk0nbA@ | |||
| idly aIdlI | |||
| ignoramus Igno@r'eIm@s | |||
| illiterate $alt2 | |||
| imagine I2madZI2n | |||
| impedance Imp'i:d@ns | |||
| imperative Imp'Er@tIv | |||
| @@ -1450,7 +1465,7 @@ laity leI@ti | |||
| landowner l'and,oUn3 | |||
| las ,las $only | |||
| ?3 las ,lA:s $only | |||
| lasagne l@zanj@ | |||
| lasagna l@zanj@ | |||
| laser leIz3 | |||
| lasso las'u: | |||
| latte lateI | |||
| @@ -1484,6 +1499,7 @@ lingerie l0nZ@ri | |||
| linen lInI2n | |||
| liqueur lI2kjU@ | |||
| liter li:t3 | |||
| literate $alt2 | |||
| literature lItrI2tS3 | |||
| live laIv $onlys | |||
| live lIv $verb | |||
| @@ -1546,6 +1562,8 @@ meant mEnt | |||
| meadow mEdoU | |||
| mediaeval mEdI'i:v@L | |||
| medicine mEds@n | |||
| melee mEleI | |||
| ?3 melee meIleI | |||
| melon mEl@n | |||
| menus mEnju:z | |||
| memo mEmoU | |||
| @@ -1624,6 +1642,7 @@ myrtle m3:t@L | |||
| naif naI'i:f | |||
| naïve naI'i:v | |||
| naivete naI'i:v@teI | |||
| naked neIkI#d | |||
| nasa nasa# | |||
| nascent neIs@nt | |||
| @@ -1749,6 +1768,7 @@ paltry pO:ltrI | |||
| panacea pana#s'i:@ | |||
| panache $2 | |||
| pancreas pankri@s | |||
| papaya pa#paI;@ | |||
| parabola p@rab@l@ | |||
| paralysis p@ral@sIs | |||
| parameter p@ramI2t3 | |||
| @@ -1907,6 +1927,7 @@ rabid reIbId | |||
| radar reIdA@ | |||
| radish radIS | |||
| ragged ragI#d | |||
| raiment reIm@nt | |||
| rainforest r'eInf,0rI2st | |||
| rajah rA:dZA: | |||
| rapier reIpi@3 | |||
| @@ -2141,6 +2162,7 @@ society s@saI@ti | |||
| sofa soUf@ | |||
| soiree swA:reI | |||
| sojourn soUdZ3:n | |||
| solder s0ld3 | |||
| soldier soUldZ3 | |||
| solemn s0l@m | |||
| solicit s@lIsI2t // solicited,ing | |||
| @@ -2155,7 +2177,7 @@ soundbite saUndbaIt | |||
| souvenir su:v@n'i@3 | |||
| sorbet sO@beI | |||
| soyabean sOI@bi:n | |||
| spaghetti spag'Eti | |||
| spaghetti spa#gEti | |||
| spasm spas@m | |||
| specific sp@sIfIk | |||
| specimen spEsI2m@n | |||
| @@ -2209,8 +2231,6 @@ suspect sVspEkt $onlys | |||
| suspect $verb | |||
| symbol sImb@L | |||
| sync sINk | |||
| synthesis sInT@sIs $only | |||
| synthesise sInT@saIz | |||
| tableau tabloU | |||
| tablet tabl@t | |||
| @@ -2559,12 +2579,13 @@ Chile tSIli | |||
| Cincinnati sInsIn'ati | |||
| Cologne k@loUn | |||
| Columbus $2 | |||
| Congo $1 | |||
| Congo k0NgoU | |||
| Connecticut k@nEtI2k@t | |||
| Copenhagen koUp@nh'eIg@n | |||
| Cruz kru:z | |||
| Cyprus saIpr@s | |||
| Dahomey $2 | |||
| Dallas dal@s | |||
| Damascus da#mask@s | |||
| Dakota da#koUt@ | |||
| Danish deInIS | |||
| @@ -2909,6 +2930,7 @@ Loinnir lVni@ | |||
| Lois loUIs | |||
| Louis lu:i | |||
| Louise lu:w'i:z | |||
| Luigi lu:'i:dZi | |||
| Luis lu:Is | |||
| Lupe lu:peI | |||
| Madeline mad@lI2n | |||
| @@ -2926,7 +2948,7 @@ Matthew maTju: | |||
| Maurice m0rIs | |||
| Mavis meIvIs | |||
| Megan mEg@n | |||
| Melissa $2 | |||
| Melissa m@lIs@ | |||
| Michele mI2SEl | |||
| Michelle mI2SEl | |||
| Miguel mi:Q'El | |||
| @@ -2959,6 +2981,7 @@ Pamela pam@l@ | |||
| Pandora $2 | |||
| Patricia pa#trIS@ | |||
| Penelope p@nEl@pi | |||
| Persephone p3s'Ef@ni | |||
| Phoebe fi:bi: | |||
| Rachael reItS@L | |||
| Rachel reItS@L | |||
| @@ -2966,6 +2989,7 @@ Raul raU'u:l | |||
| Rees ri:s | |||
| Reese ri:s | |||
| Reggie rEdZi | |||
| Remus ri:m@s | |||
| Reynold rEn@Ld | |||
| Rhys ri:s | |||
| Rihanna rI'A:n@ | |||
| @@ -3023,11 +3047,13 @@ Dante danteI | |||
| Disney dIzni | |||
| Dolce d0ltSeI | |||
| Dvorak d@-vo@Zak | |||
| Folger foUldZ3 | |||
| Gibson gIbs@n | |||
| Guinness gInIs | |||
| Hades heIdi:z | |||
| Mackenna m@kEn@ | |||
| Mackenzie m@kEnzi | |||
| Medusa $2 | |||
| Montague m0nt@gju: | |||
| Niro ni@roU | |||
| Patel pa#tEl | |||
| @@ -3043,6 +3069,7 @@ Ubuntu u:b'u:ntu: | |||
| Wii wi:: | |||
| Yaesu jeIsu: | |||
| Yamaha jam@hA: | |||
| zeus zju:s | |||
| zhivago ZI2vA:goU | |||
| @@ -34,6 +34,7 @@ | |||
| .L02 i y | |||
| .L03 a i o u // vowel, not 'e' | |||
| .L05 c g k | |||
| .L06 s z | |||
| .L10 grap log met scop // scientific endings | |||
| @@ -724,6 +725,7 @@ | |||
| st) an (_ an | |||
| m) an (_ an | |||
| hum) an (_ @n | |||
| &) an (ty_ @n | |||
| &) an (t_ @n | |||
| ?8 &) an (t_ a#n | |||
| pl) an (t_ an | |||
| @@ -746,6 +748,7 @@ | |||
| @) aneous 'eIni@s | |||
| p) an (el an | |||
| &) an (ese @n | |||
| _) ane (s anI | |||
| an (gul 'an | |||
| &) ani (_ 'A:nI | |||
| an (ia 'eIn | |||
| @@ -848,6 +851,7 @@ | |||
| _) arr (@ a#r | |||
| _) arr (ant ar | |||
| _) arr (o ar | |||
| _) arro (g ar@ | |||
| ar (i_ 'A:r | |||
| ?3 @) ar (io_ 'ar | |||
| _b) ar (L02t ar | |||
| @@ -1039,6 +1043,7 @@ | |||
| .group at | |||
| _g) ator eIt3 | |||
| &) ate (_$w_alt2 @t | |||
| pal) ate (_ @t | |||
| consul) ate (_ @t | |||
| macul) ate (_ @t | |||
| @@ -1552,6 +1557,7 @@ | |||
| @@e) d (_S1 d // suffix | |||
| db (_ d,i:bi: | |||
| ddh d | |||
| dh (K d | |||
| dj dZ | |||
| dg (_ dZ | |||
| dg (C dZ | |||
| @@ -1603,7 +1609,7 @@ | |||
| de (law dE | |||
| de (leg dE | |||
| de (lica dE | |||
| de (ll dE | |||
| _) de (ll dE | |||
| de (lph dE | |||
| _) de (lt dE | |||
| delu (g dElju: | |||
| @@ -2233,6 +2239,7 @@ | |||
| j) eo (p E | |||
| _l) eo i@ | |||
| p) eo (pl i: | |||
| _) eor eI3 | |||
| @) eosis i:'oUsIs | |||
| &) eous (_ =i@s | |||
| th) eo (@ I2@ | |||
| @@ -2410,9 +2417,12 @@ | |||
| es (tate I2s | |||
| @) esc (enC 'Es | |||
| pr) es (ent Ez | |||
| magn) es (i 'i:z | |||
| es (iA i:z | |||
| es (ian_ 'i:z | |||
| es (ic 'i:z | |||
| th) eses (_ @si:z | |||
| th) esis (_ @sIs | |||
| th) es (iL06e_ @s | |||
| r) esis (_ 'i:sIs | |||
| es (ive 'i:s | |||
| esque 'Esk | |||
| @@ -2427,6 +2437,7 @@ | |||
| Cr) es (t Es | |||
| v) es (t+ Es | |||
| harv) es (t Is | |||
| esti (m EstI# | |||
| v) es (ty @s | |||
| .group et | |||
| @@ -2474,6 +2485,7 @@ | |||
| .group ev | |||
| _) ev I2v | |||
| _) eva (ne Ev@ | |||
| _) eve i:v | |||
| _) even i:v@n | |||
| _) eve (nt I2vE | |||
| @@ -2579,6 +2591,7 @@ | |||
| _) g (ilK g | |||
| g (ilC g | |||
| l) ging dZI2N | |||
| _) g (iz g | |||
| g (y dZ | |||
| exa) gg (er dZ | |||
| ght t | |||
| @@ -2656,6 +2669,7 @@ | |||
| _) hypo (@P4 h,aIpoU | |||
| _) hypo (cr hIp0 | |||
| hypo (de h,aIp@ | |||
| hypo (thes haIp'0 | |||
| hypo (thet h,aIp@ | |||
| .group i | |||
| @@ -2693,6 +2707,7 @@ | |||
| &) ial (_ =I2@l | |||
| i (ani_ I | |||
| _) i (b aI | |||
| i (ba_ 'i: | |||
| @) ibab aIb@b | |||
| l) i (bel aI | |||
| l) i (ber I | |||
| @@ -2818,6 +2833,7 @@ | |||
| ize (d_ aIz | |||
| i (zen I2 | |||
| iz (er_ aIz | |||
| i (zon_ 'aI | |||
| p) izz (a i:t|s | |||
| @@ -3075,6 +3091,7 @@ | |||
| _) in (fo_ In | |||
| _) infra (P5 ,Infr@ | |||
| _) infra (c %Infra | |||
| in (ga_ 'IN | |||
| in (got IN | |||
| _) in (gro IN | |||
| _) in (jur In | |||
| @@ -3209,8 +3226,9 @@ | |||
| .group io | |||
| io (_ =I2oU | |||
| ?7 io (_ =i:oU | |||
| &) io (_ =I2oU | |||
| ?7 &) io (_ =i:oU | |||
| io (_ i:oU | |||
| b) io aIoU | |||
| b) io (logy aI0 | |||
| card) io I2oU | |||
| @@ -3445,6 +3463,7 @@ | |||
| _) ki (lC@ kI2 | |||
| _) ki (ll@ kI | |||
| _) kilo (@ kIl@ | |||
| kinesis k@n'i:sI#s | |||
| kuan kwan | |||
| ku (ch ku: | |||
| kuwait ku:w'eIt | |||
| @@ -3653,6 +3672,8 @@ | |||
| ninth naInT | |||
| n (Co_ =n | |||
| _) non (@P3 n,0n | |||
| nonchala (n n0nS@l@ | |||
| ?3 nonchala (n n0nS@l'A: | |||
| _) nurse (B n3:s | |||
| .group ng | |||
| @@ -3786,7 +3807,7 @@ | |||
| oer oU@ | |||
| _) oe (s i: | |||
| &) oe (s_S2 z | |||
| oe (soph I2 | |||
| oesopha I2s0f@ | |||
| p) oe (t oUI | |||
| f) oe (tA i: | |||
| p) oe (ti oUE | |||
| @@ -3924,6 +3945,7 @@ | |||
| t) ol (er 0l | |||
| m) ol (ec @l | |||
| m) ol (ecule 0l | |||
| &) ol (enC @l | |||
| old oUld | |||
| w) olf Ulf | |||
| p) olice @li:s | |||
| @@ -4504,6 +4526,7 @@ | |||
| per (cei p3 | |||
| per (culi p3 | |||
| per (cus p3 | |||
| _) peregrin pEr@grIn | |||
| per (fec p3 | |||
| per (iph p@r | |||
| perme (a p3:mI | |||
| @@ -4641,6 +4664,7 @@ | |||
| qu (_ k | |||
| quay ki: | |||
| jac) qu k | |||
| mes) qui (t k'i: | |||
| li) quor k3 | |||
| quy kwI | |||
| @@ -4707,6 +4731,7 @@ | |||
| un) rede (C ,ri:dI2 | |||
| re (dem+ rI2 | |||
| _) re (dC rE | |||
| _) re (dolen rE | |||
| _) re (dr r%i: | |||
| _) re (eduP2 r%i: | |||
| _) re (emP2 r%i: | |||
| @@ -4805,6 +4830,7 @@ | |||
| sch (o sk | |||
| sch (C S | |||
| sch (_ S | |||
| _e) sch S | |||
| ?3 sch (ed sk | |||
| _) sch (il S | |||
| _) scar (A ske@ | |||
| @@ -5003,6 +5029,7 @@ | |||
| _) tian tjan | |||
| &) tial S@L | |||
| &) ti (ali SI | |||
| i) tia (liL06 S@ | |||
| &) tien S@n | |||
| &) tience S@ns | |||
| &) tion S=@n | |||
| @@ -5126,7 +5153,7 @@ | |||
| _l) u (a u: | |||
| r) u (aC+ u: | |||
| u (a_ =ju: | |||
| s) ua (d weI | |||
| s) ua (de weI | |||
| s) uag weIdZ | |||
| @g) ua (ge wI | |||
| u (al_ ju: | |||
| @@ -5265,6 +5292,7 @@ | |||
| fl) ui (d u:I | |||
| dr) ui (d u:I | |||
| c) uisine wIzi:n | |||
| c) uis wIz | |||
| rc) ui (t I | |||
| rc) ui (tous ''ju:I | |||
| g) ui (ta I2 | |||
| @@ -4801,7 +4801,63 @@ kipróbálni $unstressend | |||
| váltana $unstressend | |||
| találtam $unstressend | |||
| (sem biztosak) SEm_'||bistoSAk $unstressend | |||
| kaphatnak $unstressend | |||
| költ $unstressend | |||
| hivatalt $unstressend | |||
| támogatással $unstressend | |||
| ugyanis $unstressend | |||
| bizonyítják $unstressend | |||
| ösztönzése $unstressend | |||
| elvégezze $unstressend | |||
| intézet $unstressend | |||
| takarítani $unstressend | |||
| bízza $unstressend | |||
| bízna $unstressend | |||
| filmekkel $unstressend | |||
| lejátszóhoz $unstressend | |||
| filmeket $unstressend | |||
| vesződni $unstressend | |||
| (legkényelmesebb az) lEgke:n^ElmESEb:_||Az $unstressend | |||
| sejtem $unstressend | |||
| vonalat $unstressend | |||
| ragaszkodni $unstressend | |||
| (mellett az) mEl:Et:_||Az $unstressend | |||
| (a felület) A'||fElylEt $unstressend | |||
| terveket $unstressend | |||
| tervek $unstressend | |||
| közben $unstressend | |||
| menetrendet $unstressend | |||
| (az indoklást) Az_'||indokla:St $unstressend | |||
| hóbort $unstressend | |||
| fogom $unstressend | |||
| (az adatokat) Az_'||AdAtokAt $unstressend | |||
| zajlik $unstressend | |||
| kütyüt $unstressend | |||
| tartok $unstressend | |||
| (törvényt is) tYR2ve:n^t_||iS $unstressend | |||
| ülésen $unstressend | |||
| jogszabály $unstressend | |||
| törvényjavaslatról $unstressend | |||
| rövid $unstressend | |||
| vonulhatnának $unstressend | |||
| (horderejű kérdésben) hoR2dER2Ejy:_||ke:R2de:SbEn $unstressend | |||
| törvényjavaslatához $unstressend | |||
| (miniszter volt) ministER2||volt $unstressend | |||
| szavazatot $unstressend | |||
| (rendelkezést is) REndElkEze:St_||iS $unstressend | |||
| (lehetővé tenné) lEhEtY:ve:_||tEn:e: $unstressend | |||
| (indítványnak van) indi:tva:n^nAk_||vAn $unstressend | |||
| (ellenére is biztosítaná) El:Ene:R2E_||iS_||bistoSi:tAna: $unstressend | |||
| emelni $unstressend | |||
| (csak ki) tSAk_||ki $unstressend | |||
| indítványokról $unstressend | |||
| (a módosítások) A'||mo:doSi:ta:Sok $unstressend | |||
| közölni $unstressend | |||
| tudjanak $unstressend | |||
| piacot $unstressend | |||
| rakott $unstressend | |||
| (ott van) ot:_||vAn $unstressend | |||
| // word pairs | |||
| @@ -2053,7 +2053,6 @@ _டெட்_) ப (ாடி b | |||
| _) ப (ாதித்த b | |||
| _) ப (ாதிப்படை b | |||
| _) ப (ாதிப்படைகி b | |||
| _) ப (ாதிப்படைய b | |||
| _) ப (ாதிப்படையுமெ b | |||
| _) ப (ாதிப்படைவ b | |||
| _) ப (ாதிப்பதா b | |||
| @@ -123,3 +123,17 @@ phoneme X | |||
| lengthmod 3 | |||
| WAV(ufric/x2, 60) | |||
| endphoneme | |||
| phoneme L | |||
| import_phoneme sq/ll | |||
| // import_phoneme base/l- | |||
| endphoneme | |||
| phoneme l | |||
| liquid | |||
| IF nextPhW(isFlag1) THEN | |||
| ELSE | |||
| ChangePhoneme(L) // Hard | |||
| ENDIF | |||
| CALL base/l | |||
| endphoneme | |||
| @@ -524,27 +524,33 @@ unsigned short ipa1[96] = { | |||
| }; | |||
| static void WritePhMnemonic(char **buf, PHONEME_TAB *ph, PHONEME_LIST *plist) | |||
| {//======================================================================================= | |||
| char *WritePhMnemonic(char *phon_out, PHONEME_TAB *ph, PHONEME_LIST *plist, int use_ipa) | |||
| {//===================================================================================== | |||
| int c; | |||
| int mnem; | |||
| int len; | |||
| int first; | |||
| int ix = 0; | |||
| char *phon_out; | |||
| char *p; | |||
| unsigned int ipa_control=0; // first byte of ipa string may control the phoneme name interpretation. 0x20 = ignore this phoneme | |||
| PHONEME_DATA phdata; | |||
| phon_out = *buf; | |||
| if(ph->code == phonEND_WORD) | |||
| { | |||
| // ignore | |||
| phon_out[0] = 0; | |||
| return; | |||
| return(phon_out); | |||
| } | |||
| if(ph->code == phonSWITCH) | |||
| { | |||
| // the tone_ph field contains a phoneme table number | |||
| p = phoneme_tab_list[plist->tone_ph].name; | |||
| sprintf(phon_out, "(%s)", p); | |||
| return(phon_out + strlen(phon_out)); | |||
| } | |||
| if(option_phonemes == 3) | |||
| if(use_ipa) | |||
| { | |||
| // has an ipa name been defined for this phoneme ? | |||
| phdata.ipa_string[0] = 0; | |||
| @@ -568,8 +574,9 @@ static void WritePhMnemonic(char **buf, PHONEME_TAB *ph, PHONEME_LIST *plist) | |||
| } | |||
| if(ipa_control >= 0x20) | |||
| { | |||
| *buf += ix; | |||
| return; // 0x20 = ignore phoneme | |||
| phon_out = &phon_out[ix]; | |||
| *phon_out = 0; | |||
| return(phon_out); // 0x20 = ignore phoneme | |||
| } | |||
| } | |||
| } | |||
| @@ -580,7 +587,7 @@ static void WritePhMnemonic(char **buf, PHONEME_TAB *ph, PHONEME_LIST *plist) | |||
| if((c == '/') && (option_phoneme_variants==0)) | |||
| break; // discard phoneme variant indicator | |||
| if(option_phonemes == 3) | |||
| if(use_ipa) | |||
| { | |||
| // convert from ascii to ipa | |||
| if(first && (c == '_')) | |||
| @@ -605,13 +612,15 @@ static void WritePhMnemonic(char **buf, PHONEME_TAB *ph, PHONEME_LIST *plist) | |||
| first = 0; | |||
| } | |||
| *buf += ix; | |||
| phon_out = &phon_out[ix]; | |||
| *phon_out = 0; | |||
| return(phon_out); | |||
| } // end of WritePhMnemonic | |||
| void GetTranslatedPhonemeString(char *phon_out, int n_phon_out) | |||
| {//============================================================ | |||
| void GetTranslatedPhonemeString(char *phon_out, int n_phon_out, int use_ipa) | |||
| {//========================================================================= | |||
| /* Can be called after a clause has been translated into phonemes, in order | |||
| to display the clause in phoneme mnemonic form. | |||
| */ | |||
| @@ -622,7 +631,6 @@ void GetTranslatedPhonemeString(char *phon_out, int n_phon_out) | |||
| int phon_out_ix=0; | |||
| int stress; | |||
| unsigned int c; | |||
| char *p; | |||
| char *buf; | |||
| char phon_buf[30]; | |||
| PHONEME_LIST *plist; | |||
| @@ -646,7 +654,7 @@ void GetTranslatedPhonemeString(char *phon_out, int n_phon_out) | |||
| c = 0; | |||
| if(stress > 5) stress = 5; | |||
| if(option_phonemes == 3) | |||
| if(use_ipa) | |||
| { | |||
| c = 0x2cc; // ipa, secondary stress | |||
| if(stress > 3) | |||
| @@ -664,30 +672,22 @@ void GetTranslatedPhonemeString(char *phon_out, int n_phon_out) | |||
| } | |||
| } | |||
| if(plist->ph->code == phonSWITCH) | |||
| { | |||
| // the tone_ph field contains a phoneme table number | |||
| p = phoneme_tab_list[plist->tone_ph].name; | |||
| buf = WritePhMnemonic(buf, plist->ph, plist, use_ipa); | |||
| sprintf(buf, "(%s)", p); | |||
| buf += (strlen(p) + 2); | |||
| } | |||
| else | |||
| if(plist->ph->code != phonSWITCH) | |||
| { | |||
| WritePhMnemonic(&buf, plist->ph, plist); | |||
| if(plist->synthflags & SFLAG_LENGTHEN) | |||
| { | |||
| WritePhMnemonic(&buf, phoneme_tab[phonLENGTHEN], NULL); | |||
| buf = WritePhMnemonic(buf, phoneme_tab[phonLENGTHEN], NULL, use_ipa); | |||
| } | |||
| if((plist->synthflags & SFLAG_SYLLABLE) && (plist->type != phVOWEL)) | |||
| { | |||
| // syllablic consonant | |||
| WritePhMnemonic(&buf, phoneme_tab[phonSYLLABIC], NULL); | |||
| buf = WritePhMnemonic(buf, phoneme_tab[phonSYLLABIC], NULL, use_ipa); | |||
| } | |||
| if(plist->tone_ph > 0) | |||
| { | |||
| WritePhMnemonic(&buf, phoneme_tab[plist->tone_ph], NULL); | |||
| buf = WritePhMnemonic(buf, phoneme_tab[plist->tone_ph], NULL, use_ipa); | |||
| } | |||
| } | |||
| @@ -134,7 +134,13 @@ int TestSynthCallback(short *wav, int numsamples, espeak_EVENT *events) | |||
| fprintf(f_events,"'%s'\n",events->id.name); | |||
| else | |||
| if(type==espeakEVENT_PHONEME) | |||
| fprintf(f_events,"[%s]\n",WordToString(events->id.number)); | |||
| { | |||
| char buf[10]; | |||
| // fprintf(f_events,"[%s]\n",WordToString(events->id.number)); //old version, only 4 characters bytes | |||
| memcpy(buf, events->id.string, 8); | |||
| buf[8] = 0; | |||
| fprintf(f_events,"[%s]\n", buf); | |||
| } | |||
| else | |||
| fprintf(f_events,"%d\n",events->id.number); | |||
| @@ -2309,7 +2315,7 @@ if(control==2) | |||
| fprintf(f_events,"Type Audio Text Length Id\n"); | |||
| fclose(f_events); | |||
| espeak_Initialize(AUDIO_OUTPUT_RETRIEVAL,1000,NULL,1); | |||
| espeak_Initialize(AUDIO_OUTPUT_RETRIEVAL, 1000, NULL, espeakINITIALIZE_PHONEME_IPA); | |||
| espeak_SetSynthCallback(TestSynthCallback); | |||
| espeak_SetUriCallback(TestUriCallback); | |||
| @@ -282,7 +282,7 @@ static void CloseWaveFile() | |||
| void MarkerEvent(int type, unsigned int char_position, int value, unsigned char *out_ptr) | |||
| void MarkerEvent(int type, unsigned int char_position, int value, int value2, unsigned char *out_ptr) | |||
| {//====================================================================================== | |||
| // Do nothing in the command-line version. | |||
| if(type == 2) | |||
| @@ -543,12 +543,13 @@ static const char* label[] = { | |||
| #endif | |||
| void MarkerEvent(int type, unsigned int char_position, int value, unsigned char *out_ptr) | |||
| {//====================================================================================== | |||
| // type: 1=word, 2=sentence, 3=named mark, 4=play audio, 5=end | |||
| void MarkerEvent(int type, unsigned int char_position, int value, int value2, unsigned char *out_ptr) | |||
| {//================================================================================================== | |||
| // type: 1=word, 2=sentence, 3=named mark, 4=play audio, 5=end, 7=phoneme | |||
| ENTER("MarkerEvent"); | |||
| espeak_EVENT *ep; | |||
| double time; | |||
| PHONEME_TAB *ph; | |||
| if((event_list == NULL) || (event_list_ix >= (n_event_list-2))) | |||
| return; | |||
| @@ -574,7 +575,17 @@ void MarkerEvent(int type, unsigned int char_position, int value, unsigned char | |||
| if((type == espeakEVENT_MARK) || (type == espeakEVENT_PLAY)) | |||
| ep->id.name = &namedata[value]; | |||
| else | |||
| if(type == espeakEVENT_PHONEME) | |||
| { | |||
| int *p; | |||
| p = (int *)(ep->id.string); | |||
| p[0] = value; | |||
| p[1] = value2; | |||
| } | |||
| else | |||
| { | |||
| ep->id.number = value; | |||
| } | |||
| } // end of MarkerEvent | |||
| @@ -769,7 +780,7 @@ ENTER("espeak_Initialize"); | |||
| option_phonemes = 0; | |||
| option_mbrola_phonemes = 0; | |||
| option_phoneme_events = (options & 1); | |||
| option_phoneme_events = (options & (espeakINITIALIZE_PHONEME_EVENTS | espeakINITIALIZE_PHONEME_IPA)); | |||
| VoiceReset(0); | |||
| // SetVoiceByName("default"); | |||
| @@ -34,7 +34,7 @@ | |||
| #define ESPEAK_API | |||
| #endif | |||
| #define ESPEAK_API_REVISION 6 | |||
| #define ESPEAK_API_REVISION 7 | |||
| /* | |||
| Revision 2 | |||
| Added parameter "options" to eSpeakInitialize() | |||
| @@ -50,6 +50,11 @@ Revision 5 | |||
| Revision 6 | |||
| Added macros: espeakRATE_MINIMUM, espeakRATE_MAXIMUM, espeakRATE_NORMAL | |||
| Revision 7 24.Dec.2011 | |||
| Changed espeak_EVENT structure to add id.string[] for phoneme mnemonics. | |||
| Added espeakINITIALIZE_PHONEME_IPA option for espeak_Initialize() to report phonemes as IPA names. | |||
| */ | |||
| /********************/ | |||
| /* Initialization */ | |||
| @@ -84,8 +89,9 @@ typedef struct { | |||
| int sample; // sample id (internal use) | |||
| void* user_data; // pointer supplied by the calling program | |||
| union { | |||
| int number; // used for WORD and SENTENCE events. For PHONEME events this is the phoneme mnemonic. | |||
| int number; // used for WORD and SENTENCE events. | |||
| const char *name; // used for MARK and PLAY events. UTF8 string | |||
| char string[8]; // used for phoneme names (UTF8). Terminated by a zero byte unless the name needs the full 8 bytes. | |||
| } id; | |||
| } espeak_EVENT; | |||
| /* | |||
| @@ -164,6 +170,7 @@ typedef enum { | |||
| } espeak_ERROR; | |||
| #define espeakINITIALIZE_PHONEME_EVENTS 0x0001 | |||
| #define espeakINITIALIZE_PHONEME_IPA 0x0002 | |||
| #define espeakINITIALIZE_DONT_EXIT 0x8000 | |||
| #ifdef __cplusplus | |||
| @@ -178,6 +185,7 @@ ESPEAK_API int espeak_Initialize(espeak_AUDIO_OUTPUT output, int buflength, cons | |||
| path: The directory which contains the espeak-data directory, or NULL for the default location. | |||
| options: bit 0: 1=allow espeakEVENT_PHONEME events. | |||
| bit 1: 1= espeakEVENT_PHONEME events give IPA phoneme names, not eSpeak phoneme names | |||
| bit 15: 1=don't exit if espeak_data is not found (used for --help) | |||
| Returns: sample rate in Hz, or -1 (EE_INTERNAL_ERROR). | |||
| @@ -488,7 +488,11 @@ int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbr | |||
| len = (80 * speed.wav_factor)/256; | |||
| if(ph->code != phonEND_WORD) | |||
| DoMarker(espeakEVENT_PHONEME, (p->sourceix & 0x7ff) + clause_start_char, 0, ph->mnemonic); | |||
| { | |||
| char phoneme_name[16]; | |||
| WritePhMnemonic(phoneme_name, p->ph, p, option_phoneme_events & espeakINITIALIZE_PHONEME_IPA); | |||
| DoPhonemeMarker(espeakEVENT_PHONEME, (p->sourceix & 0x7ff) + clause_start_char, 0, phoneme_name); | |||
| } | |||
| ptr += sprintf(ptr,"%s\t",WordToString(name)); | |||
| @@ -35,7 +35,7 @@ | |||
| #include "translate.h" | |||
| #include "wave.h" | |||
| const char *version_string = "1.46.10 21.Dec.11"; | |||
| const char *version_string = "1.46.11 24.Dec.11"; | |||
| const int version_phdata = 0x014600; | |||
| int option_device_number = -1; | |||
| @@ -675,7 +675,7 @@ static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist, | |||
| if(control & 0x100) | |||
| { | |||
| // change phonemes pass | |||
| // "change phonemes" pass | |||
| plist->ph = phoneme_tab[plist->phcode]; | |||
| } | |||
| ph = plist->ph; | |||
| @@ -1211,10 +1211,27 @@ void DoMarker(int type, int char_posn, int length, int value) | |||
| // Type 1=word, 2=sentence, 3=named marker, 4=play audio, 5=end | |||
| if(WcmdqFree() > 5) | |||
| { | |||
| wcmdq[wcmdq_tail][0] = WCMD_MARKER; | |||
| wcmdq[wcmdq_tail][1] = type; | |||
| wcmdq[wcmdq_tail][2] = (char_posn & 0xffffff) | (length << 24); | |||
| wcmdq[wcmdq_tail][3] = value; | |||
| wcmdq[wcmdq_tail][0] = WCMD_MARKER + (type << 8); | |||
| wcmdq[wcmdq_tail][1] = (char_posn & 0xffffff) | (length << 24); | |||
| wcmdq[wcmdq_tail][2] = value; | |||
| WcmdqInc(); | |||
| } | |||
| } // end of DoMarker | |||
| void DoPhonemeMarker(int type, int char_posn, int length, char *name) | |||
| {//================================================================== | |||
| // This could be used to return an index to the word currently being spoken | |||
| // Type 7=phoneme | |||
| int *p; | |||
| if(WcmdqFree() > 5) | |||
| { | |||
| wcmdq[wcmdq_tail][0] = WCMD_MARKER + (type << 8); | |||
| wcmdq[wcmdq_tail][1] = (char_posn & 0xffffff) | (length << 24); | |||
| p = (int *)name; | |||
| wcmdq[wcmdq_tail][2] = p[0]; // up to 8 bytes of UTF8 characters | |||
| wcmdq[wcmdq_tail][3] = p[1]; | |||
| WcmdqInc(); | |||
| } | |||
| } // end of DoMarker | |||
| @@ -1319,6 +1336,8 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| unsigned char *pitch_env=NULL; | |||
| unsigned char *amp_env; | |||
| PHONEME_TAB *ph; | |||
| int use_ipa=0; | |||
| char phoneme_name[16]; | |||
| static int sourceix=0; | |||
| PHONEME_DATA phdata; | |||
| @@ -1330,6 +1349,9 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| if(option_quiet) | |||
| return(0); | |||
| if(option_phoneme_events & espeakINITIALIZE_PHONEME_IPA) | |||
| use_ipa = 1; | |||
| if(mbrola_name[0] != 0) | |||
| return(MbrolaGenerate(phoneme_list,n_ph,resume)); | |||
| @@ -1405,7 +1427,8 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| if(option_phoneme_events && (p->type != phVOWEL) && (p->ph->code != phonEND_WORD)) | |||
| { | |||
| // Note, for vowels, do the phoneme event after the vowel-start | |||
| DoMarker(espeakEVENT_PHONEME, sourceix, 0, p->ph->mnemonic); | |||
| WritePhMnemonic(phoneme_name, p->ph, p, use_ipa); | |||
| DoPhonemeMarker(espeakEVENT_PHONEME, sourceix, 0, phoneme_name); | |||
| } | |||
| switch(p->type) | |||
| @@ -1712,7 +1735,8 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| if(option_phoneme_events) | |||
| { | |||
| DoMarker(espeakEVENT_PHONEME, sourceix, 0, p->ph->mnemonic); | |||
| WritePhMnemonic(phoneme_name, p->ph, p, use_ipa); | |||
| DoPhonemeMarker(espeakEVENT_PHONEME, sourceix, 0, phoneme_name); | |||
| } | |||
| fmtp.fmt_addr = phdata.sound_addr[pd_FMT]; | |||
| @@ -1896,7 +1920,11 @@ int SpeakNextClause(FILE *f_in, const void *text_in, int control) | |||
| if((option_phonemes > 0) || (phoneme_callback != NULL)) | |||
| { | |||
| GetTranslatedPhonemeString(translator->phon_out,sizeof(translator->phon_out)); | |||
| int use_ipa = 0; | |||
| if(option_phonemes == 3) | |||
| use_ipa = 1; | |||
| GetTranslatedPhonemeString(translator->phon_out, sizeof(translator->phon_out), use_ipa); | |||
| if(option_phonemes > 0) | |||
| { | |||
| fprintf(f_trans,"%s\n",translator->phon_out); | |||
| @@ -475,7 +475,7 @@ int WavegenInitSound(); | |||
| void WavegenInit(int rate, int wavemult_fact); | |||
| float polint(float xa[],float ya[],int n,float x); | |||
| int WavegenFill(int fill_zeros); | |||
| void MarkerEvent(int type, unsigned int char_position, int value, unsigned char *out_ptr); | |||
| void MarkerEvent(int type, unsigned int char_position, int value, int value2, unsigned char *out_ptr); | |||
| extern unsigned char *wavefile_data; | |||
| @@ -559,7 +559,7 @@ int MbrolaFill(int length, int resume, int amplitude); | |||
| void MbrolaReset(void); | |||
| void DoEmbedded(int *embix, int sourceix); | |||
| void DoMarker(int type, int char_posn, int length, int value); | |||
| //int DoSample(PHONEME_TAB *ph1, PHONEME_TAB *ph2, int which, int length_mod, int amp); | |||
| void DoPhonemeMarker(int type, int char_posn, int length, char *name); | |||
| int DoSample3(PHONEME_DATA *phdata, int length_mod, int amp); | |||
| int DoSpect2(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, PHONEME_LIST *plist, int modulation); | |||
| int PauseLength(int pause, int control); | |||
| @@ -639,7 +639,7 @@ int IsDigit(unsigned int c); | |||
| int IsAlpha(unsigned int c); | |||
| int isspace2(unsigned int c); | |||
| int towlower2(unsigned int c); | |||
| void GetTranslatedPhonemeString(char *phon_out, int n_phon_out); | |||
| void GetTranslatedPhonemeString(char *phon_out, int n_phon_out, int use_ipa); | |||
| Translator *SelectTranslator(const char *name); | |||
| int SetTranslator2(const char *name); | |||
| @@ -679,6 +679,7 @@ int ReadClause(Translator *tr, FILE *f_in, char *buf, short *charix, int *charix | |||
| void SetVoiceStack(espeak_VOICE *v, const char *variant_name); | |||
| void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_DATA *phdata); | |||
| void InterpretPhoneme2(int phcode, PHONEME_DATA *phdata); | |||
| char *WritePhMnemonic(char *phon_out, PHONEME_TAB *ph, PHONEME_LIST *plist, int use_ipa); | |||
| extern FILE *f_trans; // for logging | |||
| extern FILE *f_logespeak; | |||
| @@ -408,6 +408,7 @@ void TranslDlg::OnCommand(wxCommandEvent& event) | |||
| char phon_out[N_PH_LIST*2]; | |||
| int clause_tone; | |||
| int clause_count; | |||
| int use_ipa = 0; | |||
| FILE *f; | |||
| int fd_temp; | |||
| char fname_temp[100]; | |||
| @@ -459,6 +460,7 @@ void TranslDlg::OnCommand(wxCommandEvent& event) | |||
| t_phonetic->SetDefaultStyle(style_phonetic_large); | |||
| translate_text = 3; | |||
| use_ipa = 1; | |||
| break; | |||
| case T_PROCESS: | |||
| @@ -468,7 +470,7 @@ void TranslDlg::OnCommand(wxCommandEvent& event) | |||
| myframe->OnProsody(event); | |||
| } | |||
| prosodycanvas->LayoutData(ph_list,n_ph_list); | |||
| option_phoneme_events = 1; | |||
| option_phoneme_events = espeakINITIALIZE_PHONEME_EVENTS; | |||
| option_log_frames = 1; | |||
| MakeWave2(ph_list,n_ph_list); | |||
| option_log_frames = 0; | |||
| @@ -495,7 +497,7 @@ void TranslDlg::OnCommand(wxCommandEvent& event) | |||
| CalcPitches(translator,clause_tone); | |||
| CalcLengths(translator); | |||
| GetTranslatedPhonemeString(translator->phon_out,sizeof(translator->phon_out)); | |||
| GetTranslatedPhonemeString(translator->phon_out, sizeof(translator->phon_out), use_ipa); | |||
| if(clause_count++ > 0) | |||
| strcat(phon_out," ||"); | |||
| strcat(phon_out,translator->phon_out); | |||
| @@ -261,8 +261,11 @@ unsigned char pitch_adjust_tab[MAX_PITCH_VALUE+1] = { | |||
| #ifdef LOG_FRAMES | |||
| static void LogMarker(int type, int value) | |||
| {//======================================= | |||
| static void LogMarker(int type, int value, int value2) | |||
| {//=================================================== | |||
| char buf[20]; | |||
| int *p; | |||
| if(option_log_frames == 0) | |||
| return; | |||
| @@ -272,7 +275,13 @@ static void LogMarker(int type, int value) | |||
| if(f_log) | |||
| { | |||
| if(type == espeakEVENT_PHONEME) | |||
| fprintf(f_log,"Phoneme [%s]\n",WordToString(value)); | |||
| { | |||
| p = (int *)buf; | |||
| p[0] = value; | |||
| p[1] = value2; | |||
| buf[8] = 0; | |||
| fprintf(f_log,"Phoneme [%s]\n", buf); | |||
| } | |||
| else | |||
| fprintf(f_log,"\n"); | |||
| fclose(f_log); | |||
| @@ -1630,7 +1639,7 @@ void WavegenSetVoice(voice_t *v) | |||
| } | |||
| WavegenSetEcho(); | |||
| SetPitchFormants(); | |||
| MarkerEvent(espeakEVENT_SAMPLERATE,0,wvoice->samplerate,out_ptr); | |||
| MarkerEvent(espeakEVENT_SAMPLERATE, 0, wvoice->samplerate, 0, out_ptr); | |||
| // WVoiceChanged(wvoice); | |||
| } | |||
| @@ -1862,6 +1871,7 @@ int WavegenFill2(int fill_zeros) | |||
| long *q; | |||
| int length; | |||
| int result; | |||
| int marker_type; | |||
| static int resume=0; | |||
| static int echo_complete=0; | |||
| @@ -1889,7 +1899,7 @@ int WavegenFill2(int fill_zeros) | |||
| q = wcmdq[wcmdq_head]; | |||
| length = q[1]; | |||
| switch(q[0]) | |||
| switch(q[0] & 0xff) | |||
| { | |||
| case WCMD_PITCH: | |||
| SetPitch(length,(unsigned char *)q[2],q[3] >> 16,q[3] & 0xffff); | |||
| @@ -1946,13 +1956,14 @@ int WavegenFill2(int fill_zeros) | |||
| #endif | |||
| case WCMD_MARKER: | |||
| MarkerEvent(q[1],q[2],q[3],out_ptr); | |||
| marker_type = q[0] >> 8; | |||
| MarkerEvent(marker_type, q[1],q[2],q[3],out_ptr); | |||
| #ifdef LOG_FRAMES | |||
| LogMarker(q[1],q[3]); | |||
| LogMarker(marker_type, q[2], q[3]); | |||
| #endif | |||
| if(q[1] == 1) | |||
| if(marker_type == 1) // word marker | |||
| { | |||
| current_source_index = q[2] & 0xffffff; | |||
| current_source_index = q[1] & 0xffffff; | |||
| } | |||
| break; | |||