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