Don't read all the voice files on start, wait until they are needed. Added 'W' code to _rules files to mean: further letters follow while spelling a word. Lang=fr replace [r] with [R], shorten [R] slightly git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@4 d46cf337-b52f-0410-862d-fd96e6ae7743master
@@ -1190,9 +1190,11 @@ monotone m0n@toUn | |||
monsieur m@sj3: | |||
?5 monsieur m@sjVR | |||
mony mVnI2 // monies, monied | |||
moped moUpEd | |||
moraine m@reIn | |||
morale m@ral | |||
morass m0r'as | |||
morose m@r'oUs | |||
mosquito m0sk'i:toU | |||
motel moUt'El | |||
motif moUt'i:f | |||
@@ -1895,6 +1897,7 @@ zulu zu:lu: | |||
Altrincham O:ltrIN@m | |||
Anglesey aNg@LsI2 | |||
Argyle A@g'aIl | |||
Argyll A@g;aIl | |||
Bacup beIk@p | |||
Berwick bErIk | |||
Betws bEtUs |
@@ -1280,6 +1280,7 @@ | |||
ch (ord k | |||
an) ch (or k | |||
o) ch (_ k | |||
oo) ch (_ tS | |||
_ta) ch k | |||
ta) ch tS | |||
sta) ch S | |||
@@ -1605,6 +1606,7 @@ | |||
acB) e (_ I2 | |||
e (Cic_ E | |||
e (Cical 'E | |||
e (Cium i: | |||
t) ech (_ Ek | |||
m) e (chanic I | |||
@@) eble (_ @b@L | |||
@@ -1860,6 +1862,7 @@ | |||
eir e@ | |||
w) eir i@ | |||
l) ei (s E | |||
th) ei (sC i:I | |||
_s) eis (m aIz | |||
f) ei (t_ I | |||
ei (th aI | |||
@@ -3211,6 +3214,7 @@ | |||
_) mobile moUbaIl | |||
im) mobile moUbaIl | |||
mobile m@bi:l | |||
mono (ga m@n'0 | |||
mo (noto m@ | |||
_) mono m0noU | |||
mon (opol m@n | |||
@@ -3503,6 +3507,8 @@ | |||
_id) ol (a 0l | |||
petr) ol (_ @L | |||
s) ol (em 0l | |||
s) ol (ic @l | |||
s) ol (il @l | |||
t) ol (er 0l | |||
m) ol (ec @l | |||
m) ol (ecule 0l |
@@ -12,23 +12,23 @@ | |||
// "letter" name, then include the letter name here, with the letter | |||
// prefixed by a _ character. | |||
_à a:aksA~grav | |||
â a:aksA~sirkO~flEks | |||
ä a:trema | |||
_à a:aksA~gRav | |||
â a:aksA~siRkO~flEks | |||
ä a:tRema | |||
ç sesedij | |||
ë @:trema | |||
ë @:tRema | |||
é @:aksA~Egy | |||
è @:aksA~grav | |||
ê @:aksA~sirkO~flEks | |||
ï i:trema | |||
ë @:trema | |||
è @: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 | |||
ô o:aksA~siRkO~flEks | |||
ö o:tRema | |||
ù u:aksA~gRav | |||
û u:aksA~siRkO~flEks | |||
ü u:tRema | |||
_y i:gR'Ek | |||
@@ -41,57 +41,57 @@ _?? sE~b'OL | |||
! Eksklamassj'O~ | |||
_" gijm'E | |||
_# dj'Ez | |||
_$ dOl'ar | |||
_% purs'A~ | |||
_$ dOl'aR | |||
_% puRs'A~ | |||
_& e | |||
_' apOstr'Of | |||
_( 'uvr@-parA~t'Ez | |||
_) f'Erm parA~t'Ez | |||
_* astErisk: | |||
_' apOstR'Of | |||
_( 'uvR@-paRA~t'Ez | |||
_) f'ERm paRA~t'Ez | |||
_* astERisk: | |||
_+ plys | |||
_, virg'yl | |||
_- tir'E | |||
_, viRg'yl | |||
_- tiR'E | |||
_. pw'E~ | |||
_/ sl'aS | |||
_: d'Ypw'E~ | |||
_; pw'E~virg'yl | |||
_< E~ferj'Wr | |||
_; pw'E~viRg'yl | |||
_< E~feRj'WR | |||
_= eg'al | |||
_> syperj'Wr | |||
_> sypeRj'WR | |||
_? kEstj'O~ | |||
_@ at | |||
_[ uvr@-_kroS'E | |||
_[ uvR@-_kRoS'E | |||
_\ b'aksl'aS | |||
_] f'Erm_kroS'E | |||
_^ sirkOnfl'Eks | |||
_] f'ERm_kRoS'E | |||
_^ siRkOnfl'Eks | |||
__ sulin^'e | |||
_` aks'A~_gr'av | |||
_{ uvr_akOl'ad | |||
_| b'ar | |||
_} f'Erm_akOl'ad | |||
_` aks'A~_gR'av | |||
_{ uvR_akOl'ad | |||
_| b'aR | |||
_} f'ERm_akOl'ad | |||
_~ tild'e | |||
_¢ sEnt | |||
_¥ i;'En | |||
_£ l'ivr | |||
_° d@gr'e | |||
_£ l'ivR | |||
_° d@gR'e | |||
_± pl'yz_'u_mw'E~ | |||
_× myltip@-lj'e_p'ar | |||
_÷ diviz'e_p'ar | |||
_¼ W~_k'ar | |||
_× 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 | |||
_¾ tRw'a k'aR | |||
_© _^_k'0pIR,aIt_^_ | |||
_® R@ZistR'@d_m'aRk | |||
// numeric | |||
_0 zer'o | |||
_0 zeR'o | |||
_1 W~ | |||
_2 d'Y | |||
_3 trw'a | |||
_4 k'atr | |||
_3 tRw'a | |||
_4 k'atR | |||
_5 s'E~c | |||
_6 s'is | |||
six siz2 | |||
@@ -102,8 +102,8 @@ _10 d'is | |||
dix diz2 | |||
_11 O~z | |||
_12 d'uz | |||
_13 tr'Ez | |||
_14 kat'Orz | |||
_13 tR'Ez | |||
_14 kat'ORz | |||
_15 k'E~z | |||
_16 s'Ez | |||
_17 d'is:'Et | |||
@@ -112,17 +112,17 @@ _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 | |||
_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~ | |||
_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 | |||
@@ -130,31 +130,31 @@ _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 | |||
_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 | |||
_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 | |||
_0M3 milj'aR | |||
_0and e | |||
_dpt pw'E~ | |||
@@ -167,9 +167,9 @@ 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 | |||
ctrl kO~tR'ol | |||
dept depaRt@m'A~ | |||
etc etseteR'a | |||
hmm h@m | |||
ibm 'i:b'e:'Em | |||
ip 'i:p'e | |||
@@ -179,31 +179,30 @@ 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 | |||
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 | |||
url 'y:'ER:'El | |||
usb 'y:'Es:'be | |||
utf y:te:Ef | |||
xfce iksEfse@ | |||
xy 'iks:igr'Ek | |||
xy 'iks:igR'Ek | |||
ii d'Y $abbrev // roman numerals | |||
iii trw'a $abbrev | |||
iv k'atr $abbrev | |||
iii tRw'a $abbrev | |||
iv k'atR $abbrev | |||
dr dOkt'Wr $dot $capital | |||
dr dOkt'WR $dot $capital | |||
prof $dot | |||
// numbers | |||
// articles | |||
le $u $nounf | |||
@@ -348,8 +347,8 @@ tout $u | |||
// Letters which can be words | |||
//=========================== | |||
à a:aksA~grav $atend | |||
y i:gr'Ek $atend | |||
à a:aksA~gRav $atend | |||
y i:gR'Ek $atend | |||
@@ -357,15 +356,15 @@ y i:gr'Ek $atend | |||
scient si | |||
bénéficient benefisi $verb | |||
président prezidA~t2 | |||
président prezidt2 $verb | |||
président pRezidA~t2 | |||
président pRezidt2 $verb | |||
// MAIN WORD DICTIONARY | |||
//********************* | |||
monsieur m@sjY // monsieur | |||
montréal mO~real // Montréal | |||
monsieur m@sjY | |||
montréal mO~Real | |||
(il y a) ili;a $u | |||
(il y) ili $u | |||
(n'est ce pas) nEspa | |||
@@ -385,7 +384,7 @@ montréal mO~real // Montréal | |||
bus bys | |||
echo Eko | |||
fils fis | |||
mars mars | |||
mars maRs | |||
pays pEi | |||
sens sA~s | |||
c'est sEt2 $u | |||
@@ -403,45 +402,43 @@ open OpEn | |||
espeak ispik | |||
nvda $abbrev | |||
outlook autluk | |||
reader Rid'Wr | |||
potentiomètre pOtA~sjOmEtr | |||
reader Rid'WR | |||
potentiomètre pOtA~sjOmEtR | |||
processus pROsEsys | |||
// ut (t is said) | |||
août ut | |||
azimut azim'yt | |||
brut br'yt | |||
brut bR'yt | |||
but by $verb | |||
but byt | |||
connecticut kOnEktikyt | |||
helmut Elmut | |||
mazout mazut | |||
out aut | |||
rut ryt | |||
scorbut skOrbyt | |||
rut Ryt | |||
scorbut skORbyt | |||
scout skut | |||
scouts skut | |||
stout staut | |||
uppercut ypErkyt | |||
uppercut ypERkyt | |||
ut yt | |||
zut syt | |||
// et (t is said) | |||
//Downing_street | |||
//Dun_and_Bradstreet | |||
bridget bRidZEt | |||
exocet EgzOsEt | |||
fret fR'Et | |||
gadget gadZEt | |||
hamlet amlEt | |||
internet E~tErnEt | |||
internet E~tERnEt | |||
jacket ZakEt | |||
knesset knEsEt | |||
lazaret lazarEt | |||
margaret margarEt | |||
lazaret lazaREt | |||
margaret maRgaREt | |||
net nEt | |||
offset OfsEt | |||
pickpocket pikpOkEt | |||
@@ -453,38 +450,38 @@ soviet sOvjEt | |||
// ct (ct are not said) | |||
aspect aspE | |||
aspects aspE | |||
circonspect circO~spE | |||
irrespect irEspE | |||
prospect prOspE | |||
respect rEspE | |||
circonspect ciRcO~spE | |||
irrespect iREspE | |||
prospect pROspE | |||
respect REspE | |||
suspect syspE | |||
// st (t is not said) | |||
prévost prevo | |||
prévost pRevo | |||
// urt (t is said) | |||
kurt kurt | |||
yaourt jaurt | |||
yoghourt yogurt | |||
yogourt yogurt | |||
kurt kuRt | |||
yaourt jauRt | |||
yoghourt yoguRt | |||
yogourt yoguRt | |||
// ort (t said) | |||
short SOrt | |||
short SORt | |||
// art (t said) | |||
stewart stiwart | |||
steward stiwart | |||
stuttgart Stutgart | |||
hart art | |||
kart kart | |||
smart smart | |||
stewart stiwaRt | |||
steward stiwaRt | |||
stuttgart StutgaRt | |||
hart aRt | |||
kart kaRt | |||
smart smaRt | |||
// irt | |||
flirt fl@rt | |||
(sweat shirt) swEtS@rt | |||
tee-shirt tiS@rt | |||
flirt fl@Rt | |||
(sweat shirt) swEtS@Rt | |||
tee-shirt tiS@Rt | |||
parfum parfW~ | |||
parfum paRfW~ | |||
forum fOR@m | |||
// words from other languages | |||
@@ -520,9 +517,9 @@ 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 | |||
apportions apORtjO~z2 | |||
apprêtions apREtjO~z2 | |||
arrêtions aREtjO~z2 | |||
assistions asistjO~ | |||
bastions bastjO~z2 | |||
battions batjO~z2 | |||
@@ -538,39 +535,39 @@ digestions diZEstjO~z2 | |||
discutions diskytjO~z2 | |||
doutions dutjO~z2 | |||
débutions debytjO~z2 | |||
désertions dezErtjO~z2 | |||
désertions dezERtjO~z2 | |||
détentions detA~tjO~z2 | |||
escomptions EskO~tjO~z2 | |||
existions EgzistjO~z2 | |||
exploitions EksplwatjO~z2 | |||
exportions EkspOrtjO~z2 | |||
exportions EkspORtjO~z2 | |||
gestions ZEstjO~z2 | |||
habitions abitjO~z2 | |||
heurtions @rtjO~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 | |||
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 | |||
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 | |||
sortions sORtjO~z2 | |||
souhaitions suEtjO~z2 | |||
soumettions sumEtjO~z2 | |||
supportions sypOrtjO~z2 | |||
supportions sypORtjO~z2 | |||
tentions tA~tjO~z2 | |||
traitions tREtjO~z2 | |||
votions vOtjO~z2 $u |
@@ -248,8 +248,8 @@ | |||
_r) e (stru @ // restructurer | |||
-) est (_ Est // -est | |||
Cr) es (_C @ | |||
rC) es (_C @ // fortes dames | |||
@Cr) es (_C =@ | |||
rC) es (_C =@ // fortes dames | |||
') eu (_ y // eu | |||
eu (r_ W // peur | |||
@@ -278,8 +278,8 @@ | |||
_CC) e (_ @ | |||
_qu) e (_ @ // que | |||
Cr) e (_C @ // quatre pattes | |||
rC) e (_C @ | |||
@Cr) e (_C =@ // quatre pattes | |||
rC) e (_C =@ | |||
e (_ // montre | |||
@@ -34,23 +34,28 @@ _?? s'imbolu | |||
_. p'oNtu | |||
_! ,eskl&mas'&U~ | |||
_" 'asp&s | |||
_# k,ardZin'aU | |||
?1 _" 'asp&S | |||
?2 _" 'asp&s | |||
?1 _# k,ardin'al | |||
?2 _# k,ardZin'aU | |||
_$ s,if@-*'&U~ | |||
_% pors'eINtu | |||
_& 'e | |||
_' ap'Ost@-*,ofu | |||
?1 _' ap'Ost@-*,ofy | |||
?2 _' ap'Ost@-*,ofu | |||
_( ,ab@-*ipa*'eINtezi | |||
_) f,ES&pa*'eINtezi | |||
_* ,aste*'isku | |||
_+ m'aIs | |||
?1 _+ m'aIS | |||
?2 _+ m'aIs | |||
_, v'irgul& | |||
_- 'ifeIN | |||
_/ b'aQ& | |||
_: d,oIsp'oNtus | |||
_; p,oNtu_iv'irgul& | |||
_< men'Or | |||
_= igw'aU | |||
?1 _= igw'al | |||
?2 _= igw'aU | |||
_> maI'Or | |||
_? ,iNtex,ogas'&U~ | |||
_@ ax'ob& | |||
@@ -61,12 +66,15 @@ _^ s,irkuNfl'Eksu | |||
__ s,ublin^'adu | |||
_` g@-*'avi | |||
_{ ,ab@-*iS'avi | |||
_| b,ax&v,ertSik'aU | |||
?1 _| b,ax&v,ertSik'al | |||
?2 _| b,ax&v,ertSik'aU | |||
_} f,ES&S'avi | |||
_~ tS'iU | |||
?1 _~ t'il | |||
?2 _~ tS'iU | |||
_¡ ,eskl&mas,&U~,iNvertS'id& | |||
_¿ ,iNtex,ogas,&U~,iNvertS'id& | |||
_" 'ab@-*i;'asp&z d'upl&s | |||
?1 _" 'ab@-*i;'asp&S d'upl&S | |||
?2 _" 'ab@-*i;'asp&z d'upl&s | |||
// numeric | |||
@@ -155,10 +163,25 @@ _0Z3 mil'Ezim& // 1000ths | |||
// ABBREVIATIONS | |||
//************** | |||
(http ://) ag,atete'pe_ | |||
a.c ,as'e | |||
abadv $abbrev | |||
a.c 'as'e | |||
adsl $abbrev | |||
apedv $abbrev | |||
?1 apedv ,a,pe,,E,de've | |||
bios b'i,OS | |||
d.c d,es'e | |||
etc ,ets'Ete*& | |||
cpu $abbrev | |||
//?1 cpu ,se,pe'u | |||
?1 cpuc ,se,pe,u'se | |||
edp $abbrev | |||
?1 etc ,ets'Et:r& | |||
?2 etc ,ets'Ete*& | |||
?2 (http ://) ag,atete'pe_ | |||
nvda $abbrev | |||
unts $abbrev | |||
unts $abbrev | |||
?1 usb ,u,Esy'be | |||
?2 usb $abbrev | |||
// articles | |||
@@ -516,7 +539,7 @@ era 'Er& | |||
abacaxi abakaSi | |||
axé aSE | |||
elixir eliSir | |||
?1fixe fiSe | |||
?1 fixe fiSe | |||
lixo l'iSu | |||
roxo x'oSu | |||
@@ -524,9 +547,9 @@ roxo x'oSu | |||
?1 alt 'alt | |||
?1 bacalhau b,&k&lj'aU | |||
?1 caps k'aps | |||
?1 ctrl k'oNt:r'Ol | |||
ctrl k'oNt:r,Ol | |||
?1 delete dil'i:t | |||
?1 design diz'aIn //? In Brasilian Portuguese | |||
?1 design diz'aIn | |||
?1 down d'aUn | |||
?1 download d'aUnloUd | |||
?1 escape Sk'eIpy | |||
@@ -541,8 +564,7 @@ layout l'eI,aUt | |||
?1 mail meIl | |||
?2 mail m'eja | |||
?1 menu mEnU | |||
?1 num _^_EN | |||
?1 ok Ok'eI | |||
ok Ok'eI | |||
?1 pause p'au:z | |||
?1 page p'eIdZ | |||
?1 scroll _^_EN | |||
@@ -562,18 +584,20 @@ alan 'al@n | |||
?1 access 'aksEs | |||
debian d'Ebj&~N | |||
espeak isp'i:k | |||
speak spi:k | |||
espeakedit isp'i:k,Ed,it | |||
firefox f'ai@foks | |||
?1 hal hal | |||
?1 jaws dZ'au:z | |||
?1 linux l'inUks | |||
?1 linux l,in'uks | |||
?2 linux l'inuks | |||
openoffice 'opeIN|'Ofis | |||
?1 reader r'i:d&@ | |||
?1 reader _^_EN | |||
slackware sl'akwe@ | |||
speak spi:k | |||
suse z'u:ts@ | |||
ubuntu ub'untu | |||
unix j'u:niks | |||
?1 unix ,u:n'iks | |||
?2 unix j'u:niks | |||
?1 windows _^_EN | |||
@@ -625,3 +649,4 @@ ronchi r'OnCi: | |||
vogel f'o:g@l | |||
volkmann f'Olkman | |||
@@ -13,6 +13,7 @@ | |||
.group a | |||
_) a (_ a | |||
_) a (_W 'a // in an acronym | |||
a a | |||
&) a (_ =& // in final unstressed syllable | |||
&) a (s_ =& | |||
@@ -25,7 +26,7 @@ | |||
a (C_ & | |||
a (r_ 'a | |||
?1 p) a (d_ =E | |||
?1 p) a (d_ =E | |||
a (CC_ & | |||
?1 al (_ 'al // eg: Portugal, capital, etc. | |||
?2 al (K aU | |||
@@ -38,6 +39,7 @@ | |||
an (K &~N | |||
a (nhA &~ | |||
am (_ =&U~ | |||
?1 a (z_ 'a //eg: paz, rapaz, capaz, etc... | |||
ai aI | |||
ai (s aI | |||
@@ -133,7 +135,7 @@ | |||
?2 el (K EU | |||
?2 elh elj | |||
?1 e (rtA_ 'E // Eg: Alberto, aberta, etc... | |||
?1 e (rtA_ 'E // Eg: Alberto, aberta, etc... | |||
em (C eIm | |||
en (K eIN | |||
enh en^ | |||
@@ -152,24 +154,26 @@ | |||
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 | |||
?1 _) es (C@@ S // drop initial "e". | |||
?1 _) e (f i // efectuar, etc. | |||
?1 _n) e (nhu i // eg: nenhum, nenhuma, nenhuns, nenhumas. | |||
?1 C) e (cC ,E // eg: seleccionar, efectuar, etc... | |||
?1 C) ecç 'E's // eg: 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 (CCAC y // eg: deslocamento, etc... | |||
?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 // eg: Enterra | |||
?1 n) e (t ,E // eg: net | |||
?1 e (l_ ,E // eg: possível, manuel, etc... | |||
.group é | |||
@@ -197,8 +201,8 @@ | |||
.group f | |||
?1 _) f (_ Ef; // individual letter | |||
?1 _) f (__ Ef // individual letter at end-of-word | |||
?1 _) f (_W Ef; // within an acronym | |||
?1 _) f (_ Ef // individual letter or end-of-acronym | |||
_) f (_ 'Efe | |||
f f | |||
f (f | |||
@@ -206,6 +210,7 @@ | |||
.group g | |||
?1 _) g (_ ge | |||
?1 _) g (_W Ze // within an acronym | |||
_) g (_ Ze | |||
g g | |||
g (g | |||
@@ -216,7 +221,8 @@ | |||
.group h | |||
_) h (_ ag'a | |||
?1 _) h (_ &g'a | |||
?2 _) h (_ ag'a | |||
h // silent | |||
@@ -262,8 +268,8 @@ | |||
úC) i (A_ j | |||
úCC) i (A_ j | |||
?1 @) ing (_ _^_EN | |||
?1 @) ings (_ _^_EN | |||
?1 @) ing (_ _^_EN | |||
?1 @) ings (_ _^_EN | |||
.group í | |||
@@ -282,14 +288,14 @@ | |||
.group k | |||
?1 _) k (_ k'ap& | |||
?2 _) k (_ ka | |||
?2 _) k (_ ka | |||
k k | |||
k (k | |||
.group l | |||
?1 _) l (_ El; // individual letter | |||
?1 _) l (__ El // individual letter at end-of-word | |||
?1 _) l (_W El; // within an acronym | |||
?1 _) l (_ El | |||
_) l (_ 'Ele | |||
l l | |||
l (l | |||
@@ -299,16 +305,16 @@ | |||
.group m | |||
?1 _) m (_ Em; | |||
?1 _) m (__ Em | |||
?1 _) m (_W 'Em; | |||
?1 _) m (_ Em | |||
_) m (_ 'eme | |||
m m | |||
m (m | |||
.group n | |||
?1 _) n (_ En; | |||
?1 _) n (__ En | |||
?1 _) n (_W 'En | |||
?1 _) n (_ En | |||
_) n (_ 'ene | |||
n n | |||
n (n | |||
@@ -327,37 +333,33 @@ | |||
oi (s oI | |||
o (iCK o | |||
oo u | |||
?1 v) oo (_ ow | |||
?1 C) oo (_ ow // eg: voo, enjoo, etc... | |||
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 | |||
?1 om (_ 'om | |||
?2 om (_ oN | |||
o (ma_ o | |||
?1 om (C 'om | |||
?2 om (C om | |||
?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 | |||
?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. | |||
?1 _) o (C O // eg: olá, orla, opção, etc... | |||
?1 _C) o (CACACC u // Documento, documentação, etc. | |||
?1 C) o (CCAC u // formatar, formato. | |||
.group ô | |||
@@ -415,18 +417,18 @@ | |||
.group r | |||
?1 _) r (_ 'Err; // individual letter | |||
?1 _) r (__ 'Err // individual letter at end-of-word | |||
?1 _) r (_W 'Err; // within an acronym | |||
?1 _) r (_ 'Err | |||
_) 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 * | |||
?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 @-* | |||
?1 C) r (A :r | |||
?2 C) r (A @-* | |||
_) r x | |||
l) r x | |||
n) r x | |||
@@ -435,18 +437,18 @@ | |||
.group s | |||
?1 _) s (_ 'Ess|; [s]+[;] not [s;] phoneme | |||
?1 _) s (__ 'Ess | |||
_) s (_ 'Ese | |||
?1 _) s (_W 'Es|; within an acronym [s]+[;] not [s;] phoneme | |||
?1 _) s (_ 'Es | |||
?2 _) 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 | |||
?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 | |||
@@ -466,8 +468,8 @@ | |||
?2 t (i tS | |||
?2 t (í tS | |||
?2 t (e_ tS | |||
?1 th _^_EN | |||
?1 tion (_ _^_EN | |||
?1 th _^_EN | |||
?1 tion (_ _^_EN | |||
.group u | |||
@@ -507,14 +509,15 @@ | |||
.group w | |||
_) w (_ d'ablju | |||
?1 _) w (_ d'&bl,iu | |||
?2 _) w (_ d'ablju | |||
w w | |||
?1 w (_ _^_EN | |||
?1 w (_ _^_EN | |||
.group x | |||
?1 _) x (_ SiS | |||
?2 _) x (_ Sis | |||
?1 _) x (_ SiS | |||
?2 _) x (_ Sis | |||
x (A S | |||
A) x (A ks | |||
e) x (A z | |||
@@ -532,7 +535,8 @@ | |||
.group y | |||
_) y (_ 'ipsiloN | |||
?1 _) y (_ 'ipsil,ON | |||
?2 _) y (_ 'ipsiloN | |||
y i | |||
y (A j | |||
@@ -541,16 +545,17 @@ | |||
_) z (_ ze | |||
z z | |||
z (z | |||
?1 z (_ S | |||
?2 z (_ s | |||
z (_A z | |||
z (_G 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^& | |||
@@ -600,3 +605,4 @@ | |||
@@ -654,6 +654,9 @@ void copy_rule_string(char *string, int &state) | |||
case 'T': | |||
c = RULE_ALT1; | |||
break; | |||
case 'W': | |||
c = 0x31; | |||
break; | |||
case 'L': | |||
// expect two digits | |||
c = *p++ - '0'; |
@@ -45,6 +45,7 @@ int Translator::TranslateLetter(char *word, char *phonemes, int control) | |||
int n_bytes; | |||
int letter; | |||
int len; | |||
int next; | |||
unsigned char *p; | |||
char ph_stress[2]; | |||
char capital[20]; | |||
@@ -69,7 +70,11 @@ int Translator::TranslateLetter(char *word, char *phonemes, int control) | |||
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 | |||
next = 0x31; | |||
if(word[n_bytes] == ' ') | |||
next = ' '; | |||
single_letter[3+len] = next; // follow by space-space if the end of the word, or space-0x31 | |||
single_letter[1] = '_'; | |||
if(Lookup(&single_letter[1],ph_buf) == 0) |
@@ -594,8 +594,8 @@ static char *VoiceFromStack(int *voice_variant) | |||
{ | |||
sp = &ssml_stack[ix]; | |||
if(sp->voice_name[0] != 0) | |||
strcpy(voice_name, sp->voice_name); | |||
// if(sp->voice_name[0] != 0) | |||
strcpy(voice_name, sp->voice_name); // don't inherit name from previous levels ?? | |||
if(sp->language[0] != 0) | |||
strcpy(language, sp->language); | |||
if(sp->voice_gender != 0) |
@@ -35,7 +35,7 @@ | |||
#include "translate.h" | |||
#include "wave.h" | |||
const char *version_string = "1.24.02 04.May.07"; | |||
const char *version_string = "1.24.03 06.May.07"; | |||
const int version_phdata = 0x012201; | |||
int option_device_number = -1; |
@@ -46,7 +46,7 @@ | |||
#define FLAG_CAPITAL 0x8000 /* pronunciation if initial letter is upper case */ | |||
#define FLAG_DOT 0x10000 /* ignore '.' after word (abbreviation) */ | |||
#define FLAG_ABBREV 0x20000 /* use this pronunciation rather than split into letters */ | |||
#define FLAG_ABBREV 0x20000 // spell as letters, even with a vowel, OR use specified pronunciation rather than split into letters | |||
#define FLAG_STEM 0x40000 // must have a suffix | |||
#define FLAG_DOUBLING 0x80000 // doubles the following consonant |
@@ -61,6 +61,7 @@ static espeak_VOICE *voices_list[N_VOICES_LIST]; | |||
static int len_path_voices; | |||
espeak_VOICE *voice_selected = NULL; | |||
espeak_VOICE *first_voice = NULL; | |||
char voice_name[40]; | |||
@@ -209,6 +210,143 @@ void ReadTonePoints(char *string, int *tone_pts) | |||
} | |||
static espeak_VOICE *ReadVoiceFile(FILE *f_in, const char *fname, const char*leafname) | |||
{//=================================================================================== | |||
// Read a Voice file, allocate a VOICE_DATA and set data from the | |||
// file's language, gender, name lines | |||
char linebuf[120]; | |||
char vname[80]; | |||
char vgender[80]; | |||
char vlanguage[80]; | |||
char languages[300]; // allow space for several alternate language names and priorities | |||
unsigned int len; | |||
int langix = 0; | |||
int n_languages = 0; | |||
char *p; | |||
espeak_VOICE *voice_data; | |||
int priority; | |||
int age; | |||
int n_variants = 3; // default, number of variants of this voice before using another voice | |||
int gender; | |||
#ifdef PLATFORM_WINDOWS | |||
if(memcmp(leafname,"mb-",3) == 0) | |||
{ | |||
// check whether the mbrola speech data is present for this voice | |||
memcpy(vname,&leafname[3],3); | |||
vname[3] = 0; | |||
sprintf(linebuf,"%s/mbrola/%s",path_home,vname); | |||
if(GetFileLength(linebuf) <= 0) | |||
return(0); | |||
} | |||
#endif | |||
vname[0] = 0; | |||
vgender[0] = 0; | |||
age = 0; | |||
while(fgets(linebuf,sizeof(linebuf),f_in) != NULL) | |||
{ | |||
linebuf[strlen(linebuf)-1] = 0; | |||
if(memcmp(linebuf,"name",4)==0) | |||
{ | |||
p = &linebuf[4]; | |||
while(isspace(*p)) p++; | |||
strncpy0(vname,p,sizeof(vname)); | |||
} | |||
else | |||
if(memcmp(linebuf,"language",8)==0) | |||
{ | |||
priority = DEFAULT_LANGUAGE_PRIORITY; | |||
vlanguage[0] = 0; | |||
sscanf(&linebuf[8],"%s %d",vlanguage,&priority); | |||
len = strlen(vlanguage) + 2; | |||
// check for space in languages[] | |||
if(len < (sizeof(languages)-langix-1)) | |||
{ | |||
languages[langix] = priority; | |||
strcpy(&languages[langix+1],vlanguage); | |||
langix += len; | |||
n_languages++; | |||
} | |||
} | |||
else | |||
if(memcmp(linebuf,"gender",6)==0) | |||
{ | |||
sscanf(&linebuf[6],"%s %d",vgender,&age); | |||
} | |||
else | |||
if(memcmp(linebuf,"variants",8)==0) | |||
{ | |||
sscanf(&linebuf[8],"%d",&n_variants); | |||
} | |||
} | |||
languages[langix++] = 0; | |||
gender = LookupMnem(genders,vgender); | |||
if(n_languages == 0) | |||
{ | |||
#ifdef deleted | |||
// Read voice variant files | |||
// Don't use this, instead preset the variants_* arrays | |||
// no language is specified, this voice file only affects the voice characteristics | |||
if(memcmp(leafname,"!variant",8)==0) | |||
{ | |||
if(((variant = atoi(&leafname[8])) > 0) && (strlen(variants_either) < N_VOICE_VARIANTS)) | |||
{ | |||
char string[2]; | |||
string[0] = variant; | |||
string[1] = 0; | |||
strcat(variants_either,string); | |||
if(gender == 1) | |||
strcat(variants_male,string); | |||
if(gender == 2) | |||
strcat(variants_female,string); | |||
} | |||
} | |||
#endif | |||
return(NULL); // no language lines in the voice file | |||
} | |||
p = (char *)calloc(sizeof(espeak_VOICE) + langix + strlen(fname) + strlen(vname) + 3, 1); | |||
voice_data = (espeak_VOICE *)p; | |||
p = &p[sizeof(espeak_VOICE)]; | |||
memcpy(p,languages,langix); | |||
voice_data->languages = p; | |||
strcpy(&p[langix],fname); | |||
voice_data->identifier = &p[langix]; | |||
voice_data->name = &p[langix]; | |||
if(vname[0] != 0) | |||
{ | |||
langix += strlen(fname)+1; | |||
strcpy(&p[langix],vname); | |||
voice_data->name = &p[langix]; | |||
} | |||
voice_data->age = age; | |||
voice_data->gender = gender; | |||
voice_data->variant = 0; | |||
voice_data->xx1 = n_variants; | |||
return(voice_data); | |||
} // end of ReadVoiceFile | |||
void VoiceReset(int tone_only) | |||
{//=========================== | |||
// Set voice to the default values | |||
@@ -379,6 +517,7 @@ voice_t *LoadVoice(char *vname, int control) | |||
char phonemes_name[40]; | |||
char *language_type; | |||
char buf[200]; | |||
char path_voices[140]; | |||
char langname[4]; | |||
int stress_amps[8]; | |||
@@ -392,7 +531,8 @@ voice_t *LoadVoice(char *vname, int control) | |||
if(voicename[0]==0) | |||
strcpy(voicename,"default"); | |||
sprintf(buf,"%s%cvoices%c%s",path_home,PATHSEP,PATHSEP,voicename); | |||
sprintf(path_voices,"%s%cvoices%c",path_home,PATHSEP,PATHSEP); | |||
sprintf(buf,"%s%s",path_voices,voicename); | |||
if(GetFileLength(buf) <= 0) | |||
{ | |||
@@ -400,10 +540,15 @@ voice_t *LoadVoice(char *vname, int control) | |||
langname[0] = voicename[0]; | |||
langname[1] = voicename[1]; | |||
langname[2] = 0; | |||
sprintf(buf,"%s%cvoices%c%s%c%s",path_home,PATHSEP,PATHSEP,langname,PATHSEP,voicename); | |||
sprintf(buf,"%s%s%c%s",path_voices,langname,PATHSEP,voicename); | |||
} | |||
f_voice = fopen(buf,"r"); | |||
if(first_voice == NULL) | |||
{ | |||
first_voice = ReadVoiceFile(f_voice,buf+len_path_voices,voicename); | |||
rewind(f_voice); | |||
} | |||
language_type = "en"; // default | |||
if(f_voice == NULL) | |||
@@ -776,7 +921,7 @@ static int ScoreVoice(espeak_VOICE *voice_spec, int spec_n_parts, int spec_lang_ | |||
p = voice->languages; // list of languages+dialects for which this voice is suitable | |||
if(voice_spec->languages == NULL) | |||
if(spec_n_parts == 0) | |||
{ | |||
score = 100; | |||
} | |||
@@ -836,10 +981,18 @@ static int ScoreVoice(espeak_VOICE *voice_spec, int spec_n_parts, int spec_lang_ | |||
if(score == 0) | |||
return(0); | |||
if((voice_spec->name != NULL) && (strcmp(voice_spec->name,voice->name)==0)) | |||
if(voice_spec->name != NULL) | |||
{ | |||
// match on voice name | |||
score += 400; | |||
if(strcmp(voice_spec->name,voice->name)==0) | |||
{ | |||
// match on voice name | |||
score += 500; | |||
} | |||
else | |||
if(strcmp(voice_spec->name,voice->identifier)==0) | |||
{ | |||
score += 400; | |||
} | |||
} | |||
if(((voice_spec->gender == 1) || (voice_spec->gender == 2)) && | |||
@@ -886,14 +1039,15 @@ static int SetVoiceScores(espeak_VOICE *voice_select, espeak_VOICE **voices) | |||
int ix; | |||
int score; | |||
int nv; // number of candidates | |||
int n_parts=1; | |||
int n_parts=0; | |||
int lang_len=0; | |||
char *p; | |||
espeak_VOICE *vp; | |||
// count number of parts in the specified language | |||
if(voice_select->languages != NULL) | |||
if((voice_select->languages != NULL) && (voice_select->languages[0] != 0)) | |||
{ | |||
n_parts = 1; | |||
lang_len = strlen(voice_select->languages); | |||
for(p = voice_select->languages; *p != 0; p++) | |||
{ | |||
@@ -901,7 +1055,6 @@ static int SetVoiceScores(espeak_VOICE *voice_select, espeak_VOICE **voices) | |||
n_parts++; | |||
} | |||
} | |||
// select those voices which match the specified language | |||
nv = 0; | |||
for(ix=0; ix<n_voices_list; ix++) | |||
@@ -926,139 +1079,6 @@ static int SetVoiceScores(espeak_VOICE *voice_select, espeak_VOICE **voices) | |||
static espeak_VOICE *ReadVoiceFile(FILE *f_in, const char *fname, const char*leafname) | |||
{//=================================================================================== | |||
// Read a Voice file, allocate a VOICE_DATA and set data from the | |||
// file's language, gender, name lines | |||
char linebuf[120]; | |||
char vname[80]; | |||
char vgender[80]; | |||
char vlanguage[80]; | |||
char languages[300]; // allow space for several alternate language names and priorities | |||
unsigned int len; | |||
int langix = 0; | |||
int n_languages = 0; | |||
char *p; | |||
espeak_VOICE *voice_data; | |||
int priority; | |||
int age; | |||
int n_variants = 3; // default, number of variants of this voice before using another voice | |||
int gender; | |||
#ifdef PLATFORM_WINDOWS | |||
if(memcmp(leafname,"mb-",3) == 0) | |||
{ | |||
// check whether the mbrola speech data is present for this voice | |||
memcpy(vname,&leafname[3],3); | |||
vname[3] = 0; | |||
sprintf(linebuf,"%s/mbrola/%s",path_home,vname); | |||
if(GetFileLength(linebuf) <= 0) | |||
return(0); | |||
} | |||
#endif | |||
vname[0] = 0; | |||
vgender[0] = 0; | |||
age = 0; | |||
while(fgets(linebuf,sizeof(linebuf),f_in) != NULL) | |||
{ | |||
linebuf[strlen(linebuf)-1] = 0; | |||
if(memcmp(linebuf,"name",4)==0) | |||
{ | |||
p = &linebuf[4]; | |||
while(isspace(*p)) p++; | |||
strncpy0(vname,p,sizeof(vname)); | |||
} | |||
else | |||
if(memcmp(linebuf,"language",8)==0) | |||
{ | |||
priority = DEFAULT_LANGUAGE_PRIORITY; | |||
vlanguage[0] = 0; | |||
sscanf(&linebuf[8],"%s %d",vlanguage,&priority); | |||
len = strlen(vlanguage) + 2; | |||
// check for space in languages[] | |||
if(len < (sizeof(languages)-langix-1)) | |||
{ | |||
languages[langix] = priority; | |||
strcpy(&languages[langix+1],vlanguage); | |||
langix += len; | |||
n_languages++; | |||
} | |||
} | |||
else | |||
if(memcmp(linebuf,"gender",6)==0) | |||
{ | |||
sscanf(&linebuf[6],"%s %d",vgender,&age); | |||
} | |||
else | |||
if(memcmp(linebuf,"variants",8)==0) | |||
{ | |||
sscanf(&linebuf[8],"%d",&n_variants); | |||
} | |||
} | |||
languages[langix++] = 0; | |||
gender = LookupMnem(genders,vgender); | |||
if(n_languages == 0) | |||
{ | |||
#ifdef deleted | |||
// Read voice variant files | |||
// Don't use this, instead preset the variants_* arrays | |||
// no language is specified, this voice file only affects the voice characteristics | |||
if(memcmp(leafname,"!variant",8)==0) | |||
{ | |||
if(((variant = atoi(&leafname[8])) > 0) && (strlen(variants_either) < N_VOICE_VARIANTS)) | |||
{ | |||
char string[2]; | |||
string[0] = variant; | |||
string[1] = 0; | |||
strcat(variants_either,string); | |||
if(gender == 1) | |||
strcat(variants_male,string); | |||
if(gender == 2) | |||
strcat(variants_female,string); | |||
} | |||
} | |||
#endif | |||
return(NULL); // no language lines in the voice file | |||
} | |||
p = (char *)calloc(sizeof(espeak_VOICE) + langix + strlen(fname) + strlen(vname) + 3, 1); | |||
voice_data = (espeak_VOICE *)p; | |||
p = &p[sizeof(espeak_VOICE)]; | |||
memcpy(p,languages,langix); | |||
voice_data->languages = p; | |||
strcpy(&p[langix],fname); | |||
voice_data->identifier = &p[langix]; | |||
voice_data->name = &p[langix]; | |||
if(vname[0] != 0) | |||
{ | |||
langix += strlen(fname)+1; | |||
strcpy(&p[langix],vname); | |||
voice_data->name = &p[langix]; | |||
} | |||
voice_data->age = age; | |||
voice_data->gender = gender; | |||
voice_data->variant = 0; | |||
voice_data->xx1 = n_variants; | |||
return(voice_data); | |||
} // end of ReadVoiceFile | |||
static espeak_VOICE *SelectVoiceByName(espeak_VOICE **voices, const char *name) | |||
{//============================================================================ | |||
int ix; | |||
@@ -1212,7 +1232,7 @@ void GetVoices(const char *path) | |||
FILE *f_voice; | |||
espeak_VOICE *voice_data; | |||
int ftype; | |||
char fname[80]; | |||
char fname[140]; | |||
#ifdef PLATFORM_RISCOS | |||
#else | |||
@@ -1305,7 +1325,7 @@ espeak_ERROR SetVoiceByName(const char *name) | |||
espeak_VOICE *v; | |||
int variant=0; | |||
char *p; | |||
char buf[80]; | |||
static char buf[60]; | |||
strncpy0(buf,name,sizeof(buf)); | |||
if((p = strchr(buf,'+')) != NULL) | |||
@@ -1315,6 +1335,14 @@ espeak_ERROR SetVoiceByName(const char *name) | |||
variant = atoi(p+1); | |||
} | |||
// first check for a voice with this filename | |||
if(LoadVoice(buf,1) != NULL) | |||
{ | |||
voice_selected = first_voice; | |||
WavegenSetVoice(voice); | |||
return(EE_OK); | |||
} | |||
if(n_voices_list == 0) | |||
espeak_ListVoices(NULL); // create the voices list | |||
@@ -1358,7 +1386,7 @@ ESPEAK_API const espeak_VOICE **espeak_ListVoices(espeak_VOICE *voice_spec) | |||
int ix; | |||
static espeak_VOICE *voices[N_VOICES_LIST]; | |||
char selected_voice_id[80]; | |||
char path_voices[80]; | |||
char path_voices[130]; | |||
// free previous voice list data | |||
if((voice_selected != NULL) && (voice_selected->identifier != NULL)) |