Browse Source

[1.44.18]

Change in format of *_dict files.  'Word-boundary' at the start of a rule from *_rules is not implied by a new rule type RULE_PRE_ATSTART.
espeakedit: Improvements to Tools->Process Lexicon->Italian which makes the file dictsource/it_listx.
lang=hu, fixes for ordinal numbers.
Speed-up, add files sonic.cpp, sonic.h



git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@255 d46cf337-b52f-0410-862d-fd96e6ae7743
master
jonsd 14 years ago
parent
commit
b89d8bde63

+ 253
- 102
dictsource/da_list View File

@@ -67,7 +67,7 @@ _? spWrgsmVlstajn
_! udRVbstejn
_- binnesdrai
__ b'Onsdrai
& ou
& Vw
£ pun?
€ euro
© kopyrajt
@@ -127,7 +127,7 @@ _0M3 milij'A:d3
_1M4 'e:n||bilij'o:n
_0M4 bilij'o:n3

_0and 3
_0and V
_dpt _k,Vm&:

// PB a number followed by dot
@@ -280,7 +280,6 @@ z sEt
ø W

// PB English words
bacon _^_EN
bondage _^_EN
volleyball _^_EN
dj _^_EN
@@ -303,7 +302,6 @@ coke _^_EN
cool _^_EN
couch _^_EN
cursor _^_EN
//cowboy _^_EN
debugger _^_EN
ensemble _^_FR
event _^_EN
@@ -316,12 +314,11 @@ hooligan _^_EN
interface _^_EN
image _^_EN
joke _^_EN
joystick _^_EN
laptop _^_EN
level _^_EN
login _^_EN
look _^_EN
lord _^_EN
//lord _^_EN
macho _^_EN
management _^_EN
message _^_EN
@@ -382,7 +379,6 @@ boyle _^_EN $alt
clarence _^_EN $alt
cyrus _^_EN
cia _^_EN $alt
fbi _^_EN $alt
fox _^_EN
jones _^_EN
larry _^_EN $alt
@@ -467,69 +463,70 @@ tonnage $alt
trikotage $alt

// PB final -abel - stressed a
acceptabel $alt
affabel $alt
aimabel $alt
amortisabel $alt
analysabel $alt
appellabel $alt
applikabel $alt
deklinabel $alt
demontabel $alt
differentiabel $alt
diskutabel $alt
disputabel $alt
durabel $alt
fashionabel $alt
favorabel $alt
formidabel $alt
inacceptabel $alt
inkommensurabel $alt
irritabel $alt
kapabel $alt
kassabel $alt
komfortabel $alt
kommensurabel $alt
kommutabel $alt
komparabel $alt
kondemnabel $alt
konfiskabel $alt
konstabel $alt
kontrollabel $alt
konvenabel $alt
konversabel $alt
kritisabel $alt
kurabel $alt
//mirabel $alt
miserabel $alt
mutabel $alt
navigabel $alt
negligeabel $alt
negotiabel $alt
notabel $alt
operabel $alt
parabel $alt
passabel $alt
portabel $alt
praktikabel $alt
praktisabel $alt
profitabel $alt
præsentabel $alt
realisabel $alt
remarkabel $alt
rentabel $alt
reparabel $alt
respektabel $alt
risikabel $alt
ræsonnabel $alt
spendabel $alt
tolerabel $alt
trafikabel $alt
transportabel $alt
variabel $alt
venerabel $alt
veritabel $alt
vulnerabel $alt
// "el" has been removed in order to make rules for
// "konstabel" and the plural "konstabler" without "e"
acceptab $alt
affab $alt
aimab $alt
amortisab $alt
analysab $alt
appellab $alt
applikab $alt
deklinab $alt
demontab $alt
differentiab $alt
diskutab $alt
disputab $alt
durab $alt
fashionab $alt
favorab $alt
formidab $alt
inacceptab $alt
inkommensurab $alt
irritab $alt
kapab $alt
kassab $alt
komfortab $alt
kommensurab $alt
kommutab $alt
komparab $alt
kondemnab $alt
konfiskab $alt
konstab $alt
kontrollab $alt
konvenab $alt
konversab $alt
kritisab $alt
kurab $alt
miserab $alt
mutab $alt
navigab $alt
negligeab $alt
negotiab $alt
notab $alt
operab $alt
parab $alt
passab $alt
portab $alt
praktikab $alt
praktisab $alt
profitab $alt
præsentab $alt
realisab $alt
remarkab $alt
rentab $alt
reparab $alt
respektab $alt
risikab $alt
ræsonnab $alt
spendab $alt
tolerab $alt
trafikab $alt
transportab $alt
variab $alt
venerab $alt
veritab $alt
vulnerab $alt

// PB adjectives and nouns with final -ant - stressed a
acceptant $alt
@@ -796,6 +793,7 @@ fiskal $alt
fluvial $alt
foderal $alt
formal $alt
fokal $alt
fraktal $alt
frontal $alt
frugal $alt
@@ -893,7 +891,6 @@ mondial $alt
monumental $alt
moral $alt
museal $alt
musical mju:sik3l $alt
nasal $alt
national $alt
neural $alt
@@ -2038,6 +2035,22 @@ viborgenser $alt
vordingborgenser $alt
ålborgenser $alt

// PB final -em: stressed e
problem $alt
bekvem $alt
diadem $alt
eksem $alt
ekstrem $alt
emblem $alt
fonem $alt
grafem $alt
morfem $alt
myxødem $alt
poem $alt
system $alt
teorem $alt
ødem $alt
// PB country names with final -ien - stress on previous syllable
abessinien $alt
abkhasien $alt
@@ -2332,6 +2345,7 @@ elskerinde $alt
forfatterinde $alt
forstanderinde $alt
fyrstinde $alt
fristerinde $alt
gelinde gel'end@ $alt
gemalinde $alt
grevinde $alt
@@ -2765,7 +2779,6 @@ kosmogoni $alt
kvadrofoni $alt
litani $alt
ludomani $alt
mahogni m&h'oni $alt
makaroni m&k@r'Vni $alt
mani $alt
misogyni $alt
@@ -2831,6 +2844,7 @@ polygami $alt
salami sal'&mi $alt
socionomi $alt
sodomi $alt
stomi $alt
synonymi $alt
taksonomi $alt
trakeotomi $alt
@@ -2997,7 +3011,6 @@ mezzanin $alt
mokkasin $alt
morfin $alt
muezzin $alt
muffin mVf'en $alt
musselin $alt
naftalin $alt
nankin $alt
@@ -3638,6 +3651,110 @@ timid $alt
tyfoid $alt
valid $alt

// PB final -iker: stressed previous syllable
afatiker $alt
agnostiker $alt
akademiker $alt
akustiker $alt
alkoholiker $alt
allergiker $alt
analytiker $alt
anorektiker $alt
apoplektiker $alt
aritmetiker $alt
asteniker $alt
astigmatiker $alt
astmatiker $alt
atlantiker $alt
blasfemiker $alt
botaniker $alt
bulimiker $alt
datamatiker $alt
diabetiker $alt
diagnostiker $alt
dialektiker $alt
didaktiker $alt
diætetiker $alt
dogmatiker $alt
dramatiker $alt
dysfatiker $alt
dyslektiker $alt
egocentriker $alt
eklektiker $alt
elegiker $alt
elektriker $alt
elektroniker $alt
empiriker $alt
epigrafiker $alt
epileptiker $alt
erotiker $alt
excentriker $alt
fanatiker $alt
filharmoniker $alt
flegmatiker $alt
fonetiker $alt
føniker $alt
genetiker $alt
gnostiker $alt
grammatiker $alt
heraldiker $alt
hermeneutiker $alt
historiker $alt
homiletiker $alt
hysteriker $alt
hæretiker $alt
idylliker $alt
ironiker $alt
karismatiker $alt
keramiker $alt
kiromantiker $alt
kiropraktiker $alt
koleriker $alt
logistiker $alt
matematiker $alt
mekaniker $alt
melankoliker $alt
melodiker $alt
metafysiker $alt
metodiker $alt
metriker $alt
nekromantiker $alt
neurasteniker $alt
neurotiker $alt
nostalgiker $alt
numismatiker $alt
obstetriker $alt
pantomimiker $alt
paralytiker $alt
parlamentariker $alt
peripatetiker $alt
platoniker $alt
polemiker $alt
politiker $alt
polytekniker $alt
pragmatiker $alt
prognostiker $alt
prosaiker $alt
retoriker $alt
reumatiker $alt
romantiker $alt
sangviniker $alt
satiriker $alt
sekteriker $alt
semantiker $alt
semiotiker $alt
skeptiker $alt
skismatiker $alt
skolastiker $alt
statistiker $alt
syfilitiker $alt
symfoniker $alt
systematiker $alt
teoretiker $alt
typotekniker $alt
æstetiker $alt
økumeniker $alt

//PB words with final -isk - stress on the previous syllable
abkhasisk $alt
absolutistisk $alt
@@ -5318,6 +5435,7 @@ tvivlagtig $alt
tvivlrådig $alt
tyvagtig $alt
tålmodig $alt
ungdommelig $alt
vankundig $alt
vederheftig $alt
vederhæftig $alt
@@ -5593,6 +5711,7 @@ skribleri $alt
skriveri $alt
skruebrækkeri $alt
skrædderi $alt
skyderi $alt
skulkeri $alt
skumleri $alt
skyderi $alt
@@ -5789,7 +5908,7 @@ augmentere $alt
auktionere $alt
auskulter $alt
autentificer $alt
autografer $alt
autografere $alt
autoklaver $alt
automatiser $alt
autonomiser $alt
@@ -5797,7 +5916,7 @@ autoriser $alt
avancere $alt
averter $alt
bagatelliser $alt
bajader $alt
bajadere $alt
balancere $alt
balkaniser $alt
balloter $alt
@@ -5807,7 +5926,7 @@ bandagere $alt
banderolere $alt
barbariser $alt
barbere $alt
barder $alt
bardere $alt
barrier $alt
barrikader $alt
basere $alt
@@ -6120,6 +6239,7 @@ formaliser $alt
formatere $alt
formere $alt
formuler $alt
omformuler $alt
fortificer $alt
fosfatere $alt
fosforescer $alt
@@ -6368,15 +6488,15 @@ karboniser $alt
karburer $alt
karesser $alt
kariker $alt
karrier $alt
karriere $alt
karter $alt
kartonner $alt
kaserner $alt
kasernere $alt
kassere $alt
kastrer $alt
katalogiser $alt
katalyser $alt
katapulter $alt
katapultere $alt
kategoriser $alt
katekiser $alt
katolicer $alt
@@ -6425,7 +6545,7 @@ kompiler $alt
komplementer $alt
kompletter $alt
komplicer $alt
komplimenter $alt
komplimentere $alt
komponer $alt
komposter $alt
komprimer $alt
@@ -6751,7 +6871,7 @@ persifler $alt
persister $alt
personaliser $alt
personificer $alt
perspektiver $alt
perspektivere $alt
perturber $alt
perverter $alt
petitioner $alt
@@ -6766,7 +6886,7 @@ pivoter $alt
pizziker $alt
placer $alt
plagier $alt
plakater $alt
plakatere $alt
planere $alt
plastificer $alt
platiner $alt
@@ -6879,7 +6999,7 @@ reaktiver $alt
realiser $alt
reassumer $alt
reassurer $alt
rebeller $alt
rebellere $alt
recenser $alt
recidiver $alt
recirkuler $alt
@@ -6890,7 +7010,7 @@ redresser $alt
reducer $alt
referer $alt
reflekter $alt
reformer $alt
reformere $alt
refunder $alt
refuser $alt
regaler $alt
@@ -7117,7 +7237,7 @@ synkretiser $alt
synkroniser $alt
syntetiser $alt
systematiser $alt
tabeller $alt
tabellere $alt
tabuere $alt
tabuiser $alt
tabuler $alt
@@ -7197,12 +7317,13 @@ typiser $alt
typografer $alt
tyranniser $alt
uniformere $alt
undervurder $alt
urbaniser $alt
urger $alt
uriner $alt
usurper $alt
vacciner $alt
vagabonder $alt
vagabondere $alt
valider $alt
valoriser $alt
valuter $alt
@@ -7222,7 +7343,7 @@ vidimer $alt
vikarier $alt
vindicer $alt
viriliser $alt
visere $alt
//visere $alt
visiter $alt
visualiser $alt
vitaliser $alt
@@ -8853,6 +8974,7 @@ automation $alt
autorisation $alt
aversion $alt
ballotation $alt
baron $alt
bastion $alt
benediktion $alt
billion $alt
@@ -9599,7 +9721,7 @@ liaison li&s'VN $alt
meson $alt
person $alt
ræson REs'VN $alt
sæson sEs'VN $alt
//sæson sEs'VN $alt
unison $alt

// PB exceptions from the "be" rule in group "be"
@@ -10501,6 +10623,7 @@ emulgator $alt
eskalator $alt
evaluator $alt
evaporator $alt
faktor $alt
fundator $alt
generator $alt
gladiator $alt
@@ -10553,6 +10676,7 @@ likvidator $alt
makulator $alt
manipulator $alt
multiplikator $alt
motor $alt
nomenklator $alt
observator $alt
operator $alt
@@ -10602,6 +10726,40 @@ versifikator $alt
vibrator $alt
visitator $alt
ækvator $alt
junior $alt
prior $alt
senior $alt
aggressor $alt
assessor $alt
censor $alt
decisor $alt
defensor $alt
dimissor $alt
divisor $alt
kompressor $alt
kondensor $alt
processor $alt
professor $alt
provisor $alt
revisor $alt
sensor $alt
sponsor $alt
successor $alt
kondor $alt
korridor $alt
labrador $alt
matador $alt
picador $alt
ronkedor $alt
toreador $alt
//major $alt
anafor $alt
metafor $alt
hydrofor $alt
donor $alt
sonor $alt
tenor $alt
tumor $alt

// PB Final -ut - stressed u
absolut $alt
@@ -10645,6 +10803,7 @@ arrangør $alt
assurandør $alt
auditør $alt
bankør $alt
billettør $alt
causør $alt
charmør $alt
chauffør $alt
@@ -10848,6 +11007,7 @@ sententiøs $alt
seriøs $alt
serøs $alt
skabrøs $alt
skandaløs $alt
skarlatinøs $alt
skrofuløs $alt
spatiøs $alt
@@ -11010,15 +11170,6 @@ rejicere rejis'eV // PB should not be pronounced [raje]
rejicerer rejis'eV // PB
rejiceres rejis'eVs // PB
rejicering rejis'eRiN // PB
gele sjel'e // PB gele
gelé sjel'e // PB gelé
geleen sjel'e@-n // PB geleen
geleer sjel'e3 // PB geleer
geleens sjel'e@-ns // PB geleens
geleerne sjel'eVn@ // PB geleerne
geleernes sjel'eVn@s // PB geleernes
geleagtig sjel'eagte //PB geleagtig
geleagtige sjel'eagte@ //PB geleagtige
nogle n'o:@-n // PB English: 'some' - must be pronounced like the Danish word 'nogen'
nogen n'o:@-n // PB
ligesom lisVm // PB
@@ -11027,10 +11178,10 @@ konfirmand kVnferm'&nd // PB
konfirmander kVnferm'&nd3 // PB
konfirmanderne kVnferm'&nd3-n@ // PB
konfirmandernes kVnferm'&nd3-n@s // PB
dollar dVlV // PB
//dollar dVlV // PB
giv g'i // PB the v shouldn't be pronounced
giver gir // PB the v shouldn't be pronounced
jaloux sja'lu // PB jaloux
jaloux sj&'lu // PB jaloux
aficionado afisjo'na:do // PB
breakdance brEig'da:ns // PB breakdance
breakdancen brEig'da:ns@-n // PB breakdancen
@@ -11064,7 +11215,6 @@ calais kal'E // PB Calais - town in France
date dejt // PB date - stævnemøde
siger sir // PB silent d
(tids nok) tis||n'Vk // PB silent d
cologne ko'lVN3 // PB
skateboardet sk'eitbo@d3D // PB
billie bile // PB the name Billie
(hole in one) h'oulinw,0n // PB English golf expression used in Danish
@@ -11103,6 +11253,7 @@ co $abbrev $allcaps // PB for CO2-kvote
ngo $abbrev
edb $abbrev
mri $abbrev
kfuk $abbrev $allcaps
wc v'ese // w is pronounces as v in Danish
(wc'et) v'ese@d
(wc'er) v'eseV
@@ -11140,7 +11291,6 @@ hav hAu $atend
// PB problem with 'sig' [si] = "say" and 'sig' = "himself/herself" [saj]
(sig mig) si||maj // PB sig mig engang
(sig hvad) si||v& // PB sig hvad du mener
(sig det) si||de // PB sig det, du mener
sig $atend $sentence saj // end of a sentence - han vaskede sig.
(gør sig til) g,Wr||saj||t'el // PB
(gav sig til) g&||saj||tel // PB han gav sig til at ...
@@ -11187,11 +11337,12 @@ legenderne leg'EndVn3s
(så længe) sV||l'EN3
(så være) sV||v'EV
(så må) sV||m'O
(så må sige) s'O||m'O|s'i@
(så har) sV||har
(se så) se||sV
(så sent) sV||sent
(ville så) vil3||sV
så sV $sentence $atstart
//så sV $sentence $atstart
(hvad så) v&||sV $atend // "Hvad så?"
(virkede så) v'irkeD@||sV
(kom så) kVm||sV

+ 1815
- 1315
dictsource/da_rules
File diff suppressed because it is too large
View File


+ 21
- 9
dictsource/dict_phonemes View File

@@ -53,11 +53,11 @@ p r s S t T v w
x z


Dictionary da_dict 2010-10-28
Dictionary da_dict 2010-12-02

& &# 0 3 @ @- a A
e E i o O u V W
W# y Y
aI e E i o O u V
W W# y Y

* - : ? b B d D
dZ f g h j J k l
@@ -66,7 +66,7 @@ s S t T tS v w x
z


Dictionary hu_dict 2010-11-17
Dictionary hu_dict 2010-12-02

a A a: E e: i i: o
o: u u: Y y y: Y:
@@ -74,7 +74,7 @@ o: u u: Y y y: Y:
- : b c C d dZ dz
f g h j J k l m
n n^ p r R R2 s S
s2 t tS ts v z Z
s2 t t2 tS ts v z Z


Dictionary de_dict 2010-08-25
@@ -100,7 +100,7 @@ p Q r R s s; t T
ts v x z z;


Dictionary en_dict 2010-11-04
Dictionary en_dict 2010-11-18

0 3 3: @ @- @2 @5 @L
a a# A: A@ aa aI aI@ aU
@@ -200,7 +200,7 @@ q r r. s S s. t T
t. th th. v w x z


Dictionary ta_dict 2010-11-15
Dictionary ta_dict 2010-12-01

a a: aI aU e E e: i
I i: o o: u U u2 u:
@@ -249,7 +249,7 @@ n^# p Q r R r# R2 s
S s2 t T tl# v x z


Dictionary it_dict 2010-11-10
Dictionary it_dict 2010-12-03

@- a a/ aI aU e E eI
i I o O u
@@ -325,7 +325,7 @@ k l m n p R s S
t tS v w x


Dictionary nl_dict 2010-11-10
Dictionary nl_dict 2010-12-03

8 @ @- a A a: A~ E
E2 e: EI eU i I o O
@@ -662,3 +662,15 @@ W y
h j J k l m n p
Q R s S t tS v w
x z Z


Dictionary wo_dict 2010-11-30

@ @: a a: e E e: E:
i i: m- n- N- o O O:
o: u u:

: b c d f g h j
J k l m n N n^ p
q R R2 s s2 t v w
x z

+ 1
- 1
dictsource/en_list View File

@@ -1958,7 +1958,7 @@ scaly skeIlI
salmon sam@n
scalpel skalp@L
scared ske@d
scaring ske@rI2
scaring ske@rI2N
scenic si:nIk
scald sk0ld
scepter sEpt3

+ 2
- 3
dictsource/en_rules View File

@@ -3660,7 +3660,7 @@
r) ogue oUg
v) ogue oUg
@@) ogue 0g
l) o (gy @
@l) og (y =@dZ
oh oU
o (hA oU
j) oh (n 0
@@ -3786,7 +3786,6 @@
at) oll 0l
w) oll oUl
olm (_ oUm
olo (gy '0l@
olo (gi '0l@
olo (gic @l'0
v) olt oUlt
@@ -4996,7 +4995,7 @@
?8 &f) ully (_ Vl%I
&) u (lous_ =jU
b) ul (r Ul
&ic) ul (t @L
&ic) ul (t_ @L
_) ultra (@ ,Ultra
u (lul V
@) u (lum =jU

+ 29
- 8
dictsource/hu_list View File

@@ -9,9 +9,9 @@ _2 kEt:Y:
_2a ke:t // for 200, 2000
_3 ha:R2om
_4 ne:J
_5 Yt
_6 hAt
_7 he:t
_5 Yt2 // [t2] changes a following [t] to [t:]
_6 hAt2 // [t2] changes a following [t] to [t:]
_7 he:t2 // [t2] changes a following [t] to [t:]
_8 n^olts
_9 kilEnts
_10 ti:z
@@ -240,6 +240,7 @@ _#-ikának a:nAk
(0-st) nul:a:St
(1-gyet) EJ:Et
(1-gyes) EJ:ES
(2-szer) ke:ts:ER2
(2-őt) kEt:Y:t
(2-őn) kEt:Y:n
(2-n) kEt:Y:n
@@ -273,13 +274,14 @@ _#-ikának a:nAk
(6-tal) hAt:Al
(6-tól) hAt:o:l
(6-tól) h'Atodika:to:l $alt2
(6-szor) hAts:oR2
(7-től) he:t:Y:l
(7-től) hEtEdike:tY:l $alt2
(7-tel) he:t:El
(7-el) he:t:El
(7-sekre) hEtESEkR2E
(7-sel) hEtES:El
(7-szer) he:ts:ER2
(8-cal) n^olts:Al
(8-al) n^olts:Al
(9-el) kilEnts:El
@@ -292,6 +294,7 @@ _20e hus
(10-t) tizEt



//special number exceptions
(10-el) ti:zzEl
(20-al) hu:s:Al
@@ -413,6 +416,7 @@ _?? kAR2AktEr||ko:d // unknown characters (change this)

// Abbreviations
ADSL a:de:ESEl $allcaps //Internet connection type, we pronouns this with ádéesel
ÁFAa:fA $allcaps
ÁNTSZ a:Ente:Es $allcaps
ATM a:te:Em $allcaps //The ATM stands. We pronouns this abbreviation with átéem word. Default, Espeak pronouns this abbreviation with atéem word.
cm tsEntime:tER2
@@ -430,6 +434,7 @@ MLSZ EmElEs $allcaps
ORTT $abbrev $allcaps
ORFK oEREfka: $abbrev $allcaps
MÁV ma:v $allcaps
LMP ElEmpe: $allcaps
MTI $abbrev $allcaps
mm milime:tER2
RAM R2Am $allcaps //Espeak normaly spokening this abbreviation with erraem, but this is not good
@@ -537,6 +542,7 @@ elé $unstressend
előtt $alt $alt3 $unstressend
este $alt3
estéjén $alt3
éjszakára $alt3
mögül $unstressend // behind
mögött $unstressend
mögé $unstressend
@@ -568,6 +574,7 @@ nekem $unstressend
közül $unstressend
közé $unstressend
között $u $alt3
idén $alt3
környékén $alt3
an $u // so many persons
as $u
@@ -634,7 +641,13 @@ csütörtökig $alt3
péntekig $alt3
szombatig $alt3
vasárnapig $alt3

hétfőn $alt $alt3
kedden $alt3
szerdán $alt3
csütörtökön $alt3
pénteken $alt3
szombaton $alt3
vasárnapon $alt3
sok $unstressend // many
kevés $unstressend // few
se $unstressend // neither
@@ -1209,6 +1222,12 @@ járni $unstressend
döntöttek $unstressend
írt $unstressend
méltó $unstressend
dől $unstressend
nyomsz $unstressend
elnök $unstressend
itthon $unstressend
otthon $unstressend
köszönhető $unstressend

// word pairs

@@ -1344,7 +1363,7 @@ _– gondolAtjEl
_— kviR2tmi:nus
_" ide:zY:jEl
_( b'Alza:R2o:jEl $max3
_) j'obbza:R2o:jEl $max3
_) j'obza:R2o:jEl $max3
_[ n^'ito:sYglEtES $max3
_] z'a:R2o:sYglEtES $max3
_{ k'EzdY:kAptSoS $max3
@@ -1407,6 +1426,7 @@ nato na:to:

$textmode
MSZP emeszpé
MSZMP emeszempé
SZDSZ eszdéesz


@@ -1466,5 +1486,6 @@ CD-m) cédém
(NVDA-t) envédéát
(NVDA-tól) envédéától
(NVDA-val) envédéával


(%-kal) százalékkal
(ÁFÁ-t) áfát
(MB-al) megabájttal

+ 420
- 351
dictsource/hu_rules
File diff suppressed because it is too large
View File


+ 2
- 0
dictsource/it_list View File

@@ -149,6 +149,8 @@ _0Z3 mill'ezimi // 1000ths

// abbreviations
(http ://) 'ak:at,i:t,i:p'i:_
www 'vu'vu'vu
avv avvocato $text $hasdot

// articles
i $u $only

+ 153
- 125
dictsource/it_listx
File diff suppressed because it is too large
View File


+ 1
- 1
dictsource/it_rules View File

@@ -27,7 +27,7 @@
@) a (ggine_ 'a

_) ae (r aI
@) ano (_ %ano //ByFilo
// @) a (no_ =a //ByFilo, this seems to make it_listx longer
@) avano (_S5 'avano
a (tterA_ 'a


+ 35
- 1
dictsource/nl_list View File

@@ -778,8 +778,33 @@ libel $2
mirabel $3
tabel $2

// ending -eum is stressed ['e:8m]
atheneum $alt
colosseum $alt
jubileum $alt
lyceum $alt
mausoleum $alt
museum $alt
carbolineum $alt
linoleum $alt $2
marmoleum $alt
petroleum $alt $2

// ending -ot is stressed
fagot $2
kapot $2
patriot $3
komplot $2
poliglot $3
marmot $2
schavot $2

// words ending in el, elt, elde, elden, elend, elende, eld, ele, elen
// with stress on the previous syllable
// with stress on the previous syllable,
// also words ending in er. etc.

beter $alt

// adjectives
edel $alt
enkel $alt
@@ -1211,8 +1236,10 @@ actiepunt Aksip8nt
agenda $2
amino $1
amnestie $3
bijziend $2 // bijziendheid
boudoir budv#'a:r
bourgondier burx'o:ndi:@r
braille brAj@
circuit sIrku'i
chalet Sa:lE
champagne SAmp'An^@
@@ -1225,18 +1252,24 @@ chat tSEt
check tSEk
chiffon Sif'On
contour ko:nt'ur
divers div'Ers
dynastie $3
eensgelijks e:nsQ@l'EIks
emaille ,e:m'Aij@
eucharistie $4
inductie $2
ingewikkeld $3
ingrijpend $2
ingeval $3
ingevolge $3
ingrediënt $4
ingenieur Inzj@nj'Y:r
informatie $3
journaal Surn'a:l
maxima $1
meteen mEt'e:n
minima $1
nabij nab'EI
ongastvrij OnQAstv@-*'EI
ongelooflijk $3
ongemakkelijk $3
@@ -1257,6 +1290,7 @@ tegenstrijdig $3
tegenwoordig $3
travestie $3
verderop $3
volledig $2
waarschijnlijk $2



+ 48
- 6
dictsource/nl_rules View File

@@ -17,13 +17,17 @@
@) abel (_ 'a:bE2l
@) abele (_ 'a:b@l@
_) af (C@P2 'Af
age (_ 'a:Z@
age (_N 'a:Z@
ages (_S1 s
age (_$w_alt a:Q@
aire (_ 'E:r
air (_ 'Er
@) agne (_ 'An^@
ale (_ 'a:l@
@) ant (_ 'Ant
@) ant (e_ 'Ant
@) ant (en_ 'Ant
@) ant (er_ 'Ant

@) a (de_ 'a:
@) a (ta_ 'a:
@@ -37,6 +41,7 @@
&) baar (_ =ba:r
_) be (@P2 b@
_) b (ee+ b
_) bei (de bEI
_) be (ren bI:
_) be (rm bE
_) be (stia bE
@@ -47,6 +52,7 @@
_) bezig be:z@x
_) beu bY:
_) bij (C@P3 b'EI
_) brand br'And
_) bureau byr'o:
_) buurt (@@P5 b'yrt // buurtbewoner

@@ -88,6 +94,8 @@
ciële S'e:l@
coach ko:tS

_) congres kOnQr'Es


.group d
d d // auto-devoice at end-of-word
@@ -98,7 +106,7 @@

.group e
e e:
&C) e (_S1q @
&C) e (_S1qd @
e (_ @
e (CK E
e (x E
@@ -110,6 +118,7 @@
eeuw eU
eu Y:

ea (_ 'e:a:
eau o: //words with French origin
@) ee (_ 'e:
@) ee (X_ 'e:
@@ -131,18 +140,33 @@
&) el (den_$p_alt =@l
&) el (end_$p_alt =@l

&) er (_$p_alt =@r
&) er (e_$p_alt =@r
&) er (en_$p_alt =@r
&) er (t_$p_alt =@r
&) er (d_$p_alt =@r
&) er (de_$p_alt =@r
&) er (den_$p_alt =@r
&) er (end_$p_alt =@r

&) elijks @l@ks
&) em (_ @m
&) en (_S2qd @n
&) ens (_S3q @ns
&) end (_ @nd
&) ende (_ @nd@
@) ent (_ 'Ent
@) ent (e_ 'Ent
@) ent (en_ 'Ent
@) ent (er_ 'Ent
&) er (_ @r
&) ere (_ @r@
&) er (en_$p_alt @r // where 'eren' is not a verb ending
eren (_ 'I:r@n
&) es (_ @s
@) etten (_S3 @n
eum (_$w_alt 'e:8m
@mus) eum (_ ,e:8m // compounds
@) eur (_ 'Y:r

&) e (nB@ E2
@@ -152,6 +176,9 @@
@) e (raar_ @
&) e (rC@ E2

c) e (ntrum E // not @
_) expositie Ekspo:z'itsi



.group f
@@ -166,12 +193,15 @@
_) ge (@P2 Q@
_) gee Qe:
gener (aal Q,e:n@r
gelijk Q@lEIk
_) gelijk Q@lEIk
_) ge (rC QE
_) geu QY:
_) ge (ven Qe:
_) ge (ver Qe:
_) ge (ving Qe:

ge (sprek Q@ // in compounds


.group h
h h
@@ -179,6 +209,7 @@

_) her (@P3 hEr
_) her (en hI:r
&) heid (_S4 hEIt


.group i
@@ -199,9 +230,12 @@
&) ica (_ =ika:
&) ico (_ =iko:
ie (X 'i
ie (ren_ 'i
ie (rd_ 'i
@) ig (_S2dq @x
@) ige (_ @Q@
ij (_ 'EI
ij (e_ 'EI
@) ij (n_ 'EI
&) ika (_ =ika:
&) iko (_ =iko:
@@ -240,8 +274,10 @@
m m
m) m

mail me:Il
management ma:nIdZm@nt
_) mee (@P3 m'e:
menu (_ m@ny


.group n
@@ -271,8 +307,9 @@
@@C) o (_ =o:
oe (X_ 'u
oir (_ 'v#a:r
pr) o (gram o:
oo (X 'o:
telef) oo (n 'o:
oon 'o:n // in compounds, eg. telefoongesprek
_) op (@@P2 'Op
_) open (@P4 'o:p@n
_) op (era 'o:p
@@ -327,7 +364,9 @@
r r
A) r (A r
C) r (A r
rr *r
rr *r

route rut@ // route(s)

.group re
_) re (geren r@
@@ -356,6 +395,7 @@
@) ssi (o S

_) standaard (@P9 st'Anda:rt
_vre) s (e s


.group t
@@ -388,7 +428,7 @@
.group te
_) tegen (P5 t'e:Q@n
_) terug (P5 t@r'8x
_) te (gelijk t@
_) te (gelijkP2 t@
_) te (gemoetP2 t@
_) te (goed t@
_) te (hui t@ // tehuis
@@ -437,6 +477,8 @@
w (CK w

_) weg (@P3 v#'Ex
_) weg (en v#e:Q
_) weg (e_ v#e:Q // bewegelijk


.group x

+ 12
- 3
dictsource/ta_list View File

@@ -227,7 +227,6 @@ tamil தமிழ் $text
பாம்ப் $alt
பீராமண $alt
பால்ய $alt
பலு $alt
பில் $alt
பந்த் $alt
பில்லி $alt
@@ -254,8 +253,6 @@ tamil தமிழ் $text
பீர் $alt
போயிங் $alt
பலத்தாலான $alt
பெஞ்ச் $alt
பெஞ்சு $alt
பார $alt
பாமா $alt
பென்ஸ் $alt
@@ -279,6 +276,15 @@ tamil தமிழ் $text
பிஸி $alt
பேஷ் $alt
பாவே $alt
பாலு $alt
பீடி $alt
பிசி $alt
போன்சாய் $alt
போன்ஸாய் $alt
பீப் bi:p
ப்யூனஸ் $alt
பவுத்த $alt
பவுத்தம் $alt
(பி . ஏ) bije:


@@ -332,6 +338,8 @@ tamil தமிழ் $text
தொப்புனு $alt
தருமம் $alt
தாவே $alt
தருமமும் $alt
தராவி $alt


// initial ட
@@ -353,6 +361,7 @@ tamil தமிழ் $text
டிக் t.ik
ரெட்டி red.d.i
செல்லம் $alt
சிக்கன் $alt


கக $alt // initial க as [g]

+ 128
- 19
dictsource/ta_rules View File

@@ -52,6 +52,8 @@
// 'a' 'e' 'i'
.L03 இ எ அ

// alternative 's' characters
.L04 ச ஸ

// consonants

@@ -133,12 +135,26 @@
க (ாரர k
_) க (ிடுகிடு g
_) க (ின்னென்ற g
_) கி (ரக g
_) கி (ரகண g
_) கி (ரந்த g
_) கி (ரவுண்ட g
_) கி (ரஹ g
_) கி (ராக்கி g
_) கி (ராதக k
_) கி (ராம g
_) க (ிரிஜா g
_) க (ிரிதர g
_) கி (ரீட k
_) கி (ரீன்லாந்த g
_) கி (ரீம k
_) க (ிருகஸ்தர g
_) க (ிருஹஸ்தர g
_) கி (ரேக்க g
_) கி (ரைண்டர g
_) கி (ரௌண்ட g
_) கி (ளாஸ g
_) கி (ளினிக் k
_) க (ீதல k
_) க (ீத்த k
_) க (ுகநாத g
@@ -186,6 +202,7 @@
_) க (ுருதேவ g
_) க (ுருநா g
_) க (ுருபூஜை g
_) க (ுருப்பெயர g
_) க (ுருமார g
_) க (ுருரா g
_) க (ுருவா g
@@ -196,6 +213,7 @@
_) க (ுருவுடை g
_) க (ுருவை g
_) க (ுருவோட g
_) க (ுறட்டை g
_) கு (வாலியர g
_) க (ூகிள g
_) க (ூகுள g
@@ -215,6 +233,7 @@
_) க (ேட்டைத் g
_) க (ேட்டைப் g
_) க (ேலி g
_) க (ொறட்ட g
_) கோக (ிலா go:k
_) க (ோகுல g
_) க (ோதாவரி g
@@ -253,12 +272,14 @@
_) க (ௌ g
_) கௌட (ில்ய kaUt.
_) க (ௌட்டில்ய k
_) க (ௌவ k
_) க் (ரவுண்ட g
_) க் (ரூப g
_) க் (ரௌண்ட g
_) க் (வாலியர g
//endsort

//sort
_மை) க kV#
அலை) க (டல kV
சமையல்) க (ட் kV
உச்ச) க (ட்ட kV
@@ -304,6 +325,7 @@
_தென்) க (ாசி k
_நேர்) க (ாணல k
_கண்) க (ாணா k
விவே) க (ானந்த k
_வலை) க (ாப் k
தொல்) க (ாப்பி k
மூல) க (ாரண k
@@ -316,27 +338,14 @@
_ம) க (ிந்த H
மோ) க (ினி H
_ம) க (ிமை H
_) கி (ரக g
_) கி (ரகண g
கி (ரண g
பொற்) கி (ரண g
_) கி (ரந்த g
_) கி (ரஹ g
_) கி (ராக்கி g
_) கி (ராதக k
_) கி (ராம g
_) கி (ரீட k
_) கி (ரீன்லாந்த g
ஐஸ்) கி (ரீம k
ங்) க (ிரு g
கிரு (ஷ் kri
_) கி (ரைண்டர g
_) கி (ரௌண்ட g
இங்) கி (லீஷ் g
கி (லேச k
அங்) க (ிள k
_) கி (ளாஸ g
_) கி (ளினிக் k
_வட) க (ிழ k
தென்) க (ிழ k
_பா) க (ிஸ்தான k
@@ -379,6 +388,7 @@
வீண்) க (ோப k
_நாகர்) க (ோயில k
_ட) க் k
_மை) க் k
_ஷா) க் (_ k
துர்) க்க ggV#
மார்) க்க ggV#
@@ -396,6 +406,8 @@
அயோ) க்க (ிய gg
ஆரோ) க்க (ிய gg
வைரா) க்க (ிய gg
அநு) க்கி (ர gg
அனு) க்கி (ர gg
L03) க்கி (ரக gg // a,i
_வி) க்க (ிரக gg
சத்தியா) க்கி (ரக gg
@@ -406,6 +418,7 @@
_மு) க்க (ுண gg
அணு) க்க (ுண்ட gg
ஜன) க்க (ும்பல gg
_வி) க்ச (னரி ks.V
_பி) க்ச (ர ktSV
_மெ) க்சிக (ோ ksik
க்ட kt.V# // English words
@@ -468,11 +481,15 @@
ச (ந்தர tSV
_) ச (ந்தர்ப sV
ச (ந்திர tSV
_ஹட்) ச (ன sV
_வாட்) ச (ன sV
_) ச (ப்பாத்தி tSV
_) சரசு (வதி sVrVs
_) சர்ச (ி tSVrtS
மருதா) ச (ல tSV
வேதா) ச (ல tSV
_சேஷா) ச (ல tSV
_தணிகா) ச (ல tSV
அருணா) ச (ல tSV
_) ச (ாணக்கிய tS
ச (ாந்தி s.
@@ -488,8 +505,11 @@
ராஜோப) ச (ார tS
_) ச (ார்ஜை tS
_) ச (ார்ஜ்_ tS
_) ச (ார்லஸ tS
_) ச (ாளுக்கிய tS
_) சிக (ாகோ tSik
_) ச (ிக்கனு tS
_) ச (ிக்கனை tS
_) சிக் (மங்களூர tSik
_) சிக் (லெட் tSik
_) ச (ிட்டாக tS
@@ -504,6 +524,7 @@
_) ச (ித்திர tS
வி) ச (ித்திர tS
_) ச (ித்திரவதை tS
_) ச (ித்தூர tS
_) ச (ித்ரவதை tS
_) ச (ித்ரா tS
சு) சித (்ரா tSit
@@ -544,12 +565,14 @@
_) ச (ெல்லக்குட்டி tS
_) ச (ெல்லத்துக்கு tS
_) ச (ெல்லத்தை tS
_) ச (ெல்லப்ப tS
_) ச (ெல்லமா tS
_) ச (ெஸ் tS
_) ச (ேனல tS
_) ச (ேரி tS
_) ச (ேலஞ் tS
_) ச (ைனாவ tS
_) ச (ைனீஸ tS
_) ச (ௌதரி tS
//endsort

@@ -578,6 +601,8 @@

//sort

அர்ஜண்) ட t.V#
அர்ஜெண்) ட t.V#
_மில்) ட (ன t.V
_) ட (ன் t.V
ிங்) ட (ன் t.V // -ington
@@ -596,6 +621,7 @@
_) ட (ாக்க t. // talkies
_) டாக்ட (ர d.a:kt.V
_) டாக (்ஸி t.a:k
_) டாங்க (ர t.a:NkV
_) டாங்க (ி t.a:Nk
_) டாட (ா t.a:t.
அண்) டார்டிக t.a:rt.ikV#
@@ -605,6 +631,7 @@
_போர்) ட (ிகோ t.
ஆர்) டிக் t.ik
_) ட (ிக்க t.
_) டின்க (ரிங் t.inkV
_) டி (யூசன t.
_) டி (யூஷன t.
_) டி (ரங்கு t.
@@ -615,21 +642,26 @@
_) டிராபிக் t.ra:fik
_) ட (ிராம t.
கொலஸ்) டி (ரால _|t.
_) டி (ராலி t.
_) டி (ராவல t.
_) டி (ராவெல t.
_) டி (ரெயின t.
_) டி (ரெய்லர t.
_) டி (ரெஸ d.
_) டிரேயின (ை t.re:jn
_) டி (ரைவர d.
கண்) டி (ரோல t.
_) ட (ிவிய t.
_) ட (ெக்ஸாஸ t.
_) டென்டுல்க (ர t.ent.UlkV
_) ட (ென்ஷன t.
_) டெம்ப (ர t.empV
_) டெம்ப (ோ t.emp
டெலிப (ோன t.elif
_) ட (ெலிவிஷன t.
_) ட (ெல்_அவீவ t. // tel aviv
_) டெஸ்ட t.est.V#
_) டேங்க (ர t.e:NkV
_) ட (ேப t.
_) ட (ேஸ்ட t.
_) டைட (ில t.aIt.
@@ -637,6 +669,7 @@
_) ட (ைம்_ t.
_) ட (ோக்கன t.
_) ட (ோக்கியோ t.
_) டோரண்ட (ோ t.o:rVn.t.
_ல) ட்ட d.d.V#
_ரெ) ட்ட (ியா d.d.
இ) ட்ட (ிலி d.d.
@@ -645,12 +678,16 @@
_) ட்ராஃபிக் t.ra:fik
_) ட (்ரான்சிஸ்டர t.
_) ட்ராபிக் t.ra:fik
_) ட் (ராலி t.
_) ட் (ராவல t.
_) ட் (ராவெல t.
_) ட்ரெயி (லர t.rej
_) ட் (ரெய்லர t.
_பெ) ட் (ரோ t.
கண்) ட் (ரோல t.
_வீ) ட் (ல t.
_ஹி) ட் (லர t.
அ) ட்லாண்ட t.la:n.t.V# // atlant
//endsort


@@ -739,12 +776,14 @@
_) த (யாள dV
_) த (யை dV
_) த (ரணி dV
_) த (ராவிய dV
_) த (ரிசனங் dV
_) த (ரிசனத் dV
_) த (ரிசி dV
_) த (ரித்திரம dV
_) த (ருமத் dV
_) த (ருமன dV
_) தருமப (ுரி dVrUmVp
_) த (ருமர dV
_) த (ருமி dV
_) த (ர்க dV
@@ -770,11 +809,13 @@
_) த (ானத் d
_) த (ானமா d
_) த (ானிய d
_) த (ானியங்கி t
_) த (ானுவ d
_) த (ாமோதர d
_) த (ாம்_தூம d
_) த (ாயாதி d
_) த (ாரணி d
_) த (ாராசுர d
_) த (ாராபுர d
_) த (ாராள d
_) த (ாராவி d
@@ -852,6 +893,7 @@
_) த (ுச்சாதனன d
_) த (ுட்ட d
_) த (ுபாய d
_) த (ுப்பட்டா d
_) த (ுரதிருஷ்ட d
_) த (ுரதிர்ஷ்ட d
_) த (ுரதிஷ்ட d
@@ -896,6 +938,7 @@
_) த (ேவருலக d
_) த (ேவர்க d
_) த (ேவலோக d
_) த (ேவஸ்தான d
_) த (ேவாதி d
_) த (ேவாமிருத d
_) த (ேவாம்ச d
@@ -920,6 +963,7 @@
_ப) த (ஞ்சலி tV
_கீழ்) த (ட்ட tV
_மேல்) த (ட்ட tV
பிள்ளை) த (ன tV
முட்டாள்) த (ன tV
_கௌ) த (மி tV
_கீ) த (ா t
@@ -967,6 +1011,7 @@ _பார்வ) த (ி t
பு) த்த (ர ddV
_விரு) த்தாச (ல dda:tSV
அ) த்த (ாசி dd
_சி) த்தாந்த dda:ntV#
சி) த்த (ார் dd
பு) த்த (ி dd
அயோ) த்த (ி dd
@@ -995,6 +1040,7 @@ _பார்வ) த (ி t
வி) த்து (வான d
_முக) த்து (வார dd
அ) த்த (ெய்வ dd
L03) த்த (ெய்வ dd
குல) த்த (ெய்வ dd
உ) த்த (ேச dd
L03) த்த (ேச dd // a, e, i
@@ -1068,6 +1114,7 @@ _பார்வ) த (ி t
_) ப (ங்களா bV
_) ப (ங்கார bV
_) ப (சவகல்யாண bV
_) ப (ச்சன bV
_) ப (ஜ bV
_) ப (ட்சண bV
_) ப (ட்சிக்க bV
@@ -1101,11 +1148,14 @@ _பார்வ) த (ி t
_) ப (யப் bV
_) ப (யம bV
_) ப (யாலஜி bV
_) பயாஸ்கோப் bVja:sko:p
_) ப (யில்வான bV
_) ப (ரதநாட்டிய bV
_) ப (ரதன bV
_) ப (ரதர bV
_) ப (ராக்_ஒபாமா bV
_) ப (ரோட bV
_) ப (ர்கர bV
_) ப (ர்னாலா bV
_) ப (ர்மா bV
_) ப (ர்லாங் fV
@@ -1127,19 +1177,24 @@ _பார்வ) த (ி t
_) ப (லவீன bV
_) ப (லஹீன bV
_) பலாத்க (ார bVla:dk
_) ப (லிகடா bV
_) ப (லிக்கடா bV
_) ப (லிக்குச் bV
_) ப (லிக்கொ bV
_) ப (லிஜா bV
_) ப (லிபீட bV
_) ப (லிய bV
_) பலுச (ிஸ்தான bVlUtS
_) ப (லூன bV
_) ப (ல்கேரிய bV
_) பல்ட (ி bVlt.
_) ப (ல்பு bV
_) ப (ல்பை bV
_) ப (ளு bV
_) ப (வாணி bV
_) ப (வானி bV
_) பவுண்ட (ன faUn.t.V
_) ப (வுத்தத்தில bV
_) ப (வ்ய bV
_) ப (ஸ bV
_) ப (ஹதூர bV
@@ -1195,6 +1250,7 @@ _பார்வ) த (ி t
_) ப (ாரம b
_) ப (ாரம்பரிய p
_) ப (ாரிஸ்டர b
_) ப (ார்L04லோனா b
_) ப (ார்கவி b
_) ப (ார்ம f
_) ப (ாலக b
@@ -1202,6 +1258,7 @@ _பார்வ) த (ி t
_) ப (ாலக்காட p
_) ப (ாலச b
_) ப (ாலதண் b
_) பாலப (ாட ba:lVp
_) ப (ாலமுர b
_) ப (ாலாஜி b
_) ப (ாலாபிஷேக p
@@ -1209,9 +1266,10 @@ _பார்வ) த (ி t
_) ப (ாலாவ b
_) ப (ாலின் p
_) ப (ாலியத்த b
_) ப (ால b
_) ப (ாலிவுட் b
_) ப (ாலுடன் p
_) ப (ாலும்_ p
_) ப (ாலுவ b
_) ப (ாலை p
_) ப (ால் p
_) ப (ால்_தாக்கரே b
@@ -1231,7 +1289,9 @@ _முகத்தின்_) ப (ாவ b
முகத்திலிருந்து_) ப (ாவ b
_) ப (ாவனா b
_) ப (ாவனை b
_) ப (ாவிக்கப்பட b
_) ப (ாவிக்கிற b
_) ப (ாவிக்கும்போத b
_) ப (ாவித்த b
_) ப (ாவிப்பத b
_) ப (ாவிப்பதா b
@@ -1245,16 +1305,19 @@ _முகத்தின்_) ப (ாவ b
_) ப (ாஸ்மதி b
_) பி(ராந்தியு b
_) ப (ி_._பி_._சி b // b.b.c
_) ப (ிகர f
_) ப (ிக்கு b
_) ப (ிக்ஷு b
_) ப (ிக்ஷூ b
_) ப (ிங்கர்_ f
_) ப (ிசினஸ b
_) ப (ிசிய b
_) ப (ினாமி b
_) ப (ினிஷ f
_) ப (ின்லாந்த f
_) ப (ிபிசி b // bbc
_) ப (ிம்ப b
_) பி (யூனஸ்_ b
_) ப (ிரகதீ b
_) பி (ரகதீ b
_) பி (ரகலாதன p
@@ -1333,6 +1396,7 @@ _முகத்தின்_) ப (ாவ b
_) பி (ராப் p
_) பி (ராமண b
_) பி (ராமணன b
_) பி (ராமி b
_) பி (ராமிக் b
_) பி (ராமின்_ b
_) பி (ரார்தன p
@@ -1346,6 +1410,7 @@ _முகத்தின்_) ப (ாவ b
_) பி (ரிட b
_) ப (ிரித்தானி b
_) பி (ரித்தானி b
_) பிரின்சிப (ால prinsip
_) பி (ரியன p
_) பி (ரியப் p
_) பி (ரியம p
@@ -1386,15 +1451,20 @@ _முகத்தின்_) ப (ாவ b
_) ப (ீச்சு b
_) ப (ீஜ b
_) ப (ீஜிங b
_) ப (ீடி b
_) ப (ீடிகள b
_) ப (ீடிகை p
_) ப (ீடித்த p
_) ப (ீடிப்புகை b
_) ப (ீடிய b
_) பீட்ரூட் bi:t.ru:t.
_) ப (ீப்பொலி b
_) ப (ீம b
_) ப (ீரங்கி b
_) பீ (ராமண b
_) ப (ீராமணர b
_) ப (ீரை b
_) ப (ீரோ b
_) ப (ீர்பால b
_) ப (ீஹார b
_) ப (ுக்கில b
_) ப (ுக்கென்ற b
@@ -1440,11 +1510,12 @@ _முகத்தின்_) ப (ாவ b
_) ப (ூமி b
_) ப (ூலோக b
_) ப (ெங்களூர b
_) ப (ெங்கால b
_) பெஞ்ச bentSV#
_) ப (ெஞ்சமின b
_) ப (ெஞ்சா b
_) ப (ெஞ்சி b
_) பெட்ட (ுக்கு bed.d.
_) ப (ெட்ரூம b
_) ப (ெப்ரவரி f
_) ப (ெர்னார்ட b
_) ப (ெர்முடா b
_) ப (ெர்லிங b
@@ -1476,6 +1547,7 @@ _முகத்தின்_) ப (ாவ b
_) ப (ோதித் b
_) ப (ோதை b
_) ப (ோனிய b
_) ப (ோன்கள f
_) ப (ோன்ஸ்லே b
_) ப (ோபால b
_) ப (ோர்ஜரி f
@@ -1549,6 +1621,7 @@ _சந்திர_) ப (ோஸ b
_க) ப (த் bV
வீர) ப (த்தினி pV
உ) ப (ந்நியாச pV
_லிஸ்) ப (ன bV
கல்) ப (னா pV
_கம்) ப (னி pV
பிரதா) ப (ம bV
@@ -1563,15 +1636,21 @@ _சந்திர_) ப (ோஸ b
வீர) ப (ராக்கிரம pV
கரம்) ப (ற் pV
ப (ற்றி_ pV
_பக்கப்) ப (ல bV
படைப்) ப (ல bV
ஆயுதப்) ப (ல bV
_மகா) ப (லி bV
_மூடு) ப (ல்லக் pV
வேலைப்) ப (ளு bV
வட) ப (ழ pV
வீண்) ப (ழி pV
_வா) ப (ஸ pV
_தீ) ப (ா p
_கலி) ப (ா f
_கலீ) ப (ா f
_சம) ப (ாக b
முதற்) ப (ாக b
உதிரிப்) ப (ாக b
_பிக்) ப (ாக்க+ p
உ) ப (ாசனை p
சமன்) ப (ாட p
@@ -1581,6 +1660,7 @@ _சந்திர_) ப (ோஸ b
ராம) ப (ாண b // also இராமபாண
_யாழ்) ப (ாண p
தண்ட) ப (ாணி p
பஞ்ச) ப (ாண்ட p
ப (ாண்டி p
ப (ாதை p
ஜிந்தா) ப (ாத் b
@@ -1588,8 +1668,10 @@ _சந்திர_) ப (ோஸ b
_டீ) ப (ாய் p
எதிர்) ப (ார p
கண்) ப (ார்வை p
_ப்ரின்சி) ப (ால p
_சிவ) ப (ாலன b
_கா) ப (ாலி b
_டி) பால்ட fa:lt.V#
_நே) ப (ாள p
_பூ) ப (ாளம்_ p
_ராஜ) ப (ாளைய p
@@ -1602,7 +1684,9 @@ _சந்திர_) ப (ோஸ b
வாதா) ப (ி p
கோ) ப (ி p
சித்தப்) பி(ரமை b
_கன்) ப (ிகர f
_பசி) ப (ிக் f
கண்டு) ப (ிடி p
திமிர்) ப (ிடி p
ராவல்) ப (ிண்டி p
ர்) ப (ின்_ b
@@ -1610,9 +1694,12 @@ _சந்திர_) ப (ோஸ b
ம்) ப (ின்_ b
_முன்) ப (ின்_ p
@) ப (ின்நாலும்_ p
@) ப (ின்னர்_ p
@) ப (ின்னால்_ p
_) ப (ிப்ரவரி f
_லெஸ்) ப (ியன b
பிரக (ாஷ prVk
மதப்) பிரச (ார prVtS
பி (ரத p
வீண்) பி (ரமை b
துஷ்) பி (ரயோக p
@@ -1633,7 +1720,10 @@ _சந்திர_) ப (ோஸ b
_திம்) ப (ு p
_அன்) ப (ுட b
_மார்) ப (ுட b
வாயு) ப (ுத்திர p
அக்னி) ப (ுத்திர p
பாடலி) ப (ுத்திர p
அக்கினி) ப (ுத்திர p
வில்லி) ப (ுத்தூர p
ம்) ப (ுரா b
_தர்ம) ப (ுரி p
@@ -1647,10 +1737,12 @@ _சந்திர_) ப (ோஸ b
இன்ஸ்) ப (ெக்டர p
இளம்) ப (ெண் p
_கம்) ப (ெனி p
புலம்) ப (ெயர் p
இடம்) ப (ெயர p
_புலம்) ப (ெயர p
மொழி) ப (ெயர் p
ப (ெருமான p
ப (ெற p // ?? end-of-word + suffix ??
_க) ப (ே f
_கை) ப (ேசி p
_செல்) ப (ேசி p
அலை) ப (ேசி p
@@ -1659,6 +1751,8 @@ _சந்திர_) ப (ோஸ b
_வெல்) ப (ேர f
ப (ேரில்_ p
ப (ேர்_ p
_பழம்) ப (ொருள p
_தொல்) ப (ொருள p
வன்) ப (ொருள் p
மென்) ப (ொருள் p
வீண்) ப (ொழுத p
@@ -1685,9 +1779,11 @@ _சந்திர_) ப (ோஸ b
ப (ோதே_+ p
ஐ) ப (ோன f
_செல்) ப (ோன f
மைக்ரோ) ப (ோன f
ப (ோன_ p
ப (ோனா p
ப (ோன்ற+ p // ?? end-of-word + suffix ??
ப (ோயிரு p
ப (ோய் p
கலி) ப (ோர்னிய f
ப (ோல_ p
@@ -1696,6 +1792,7 @@ _சந்திர_) ப (ோஸ b
ப (ோலத்_ p
ப (ோலப்_ p
ப (ோலவே_ p
ப (ோலும்_ p
ப (ோல்_+ p
ப (ோவத p
_கம்) ப (ோஸ p
@@ -1726,6 +1823,7 @@ _சந்திர_) ப (ோஸ b
_ல) ப்ப (ை bb
துர்) ப்ப (ோதனை bb
கம்) ப்யூட (ர pjU:t.V
_மா) ப் (ள p
//endsort

// If ப+ appearing in the middle of a word is followed by ட+
@@ -1751,6 +1849,9 @@ _சந்திர_) ப (ோஸ b
பாப (K pa:pV
பப (ா pVp
பாப (ா pa:p
_) பாப (ம pa:bV
_) பாப (த் pa:bV
_) பாப (ங் pa:bV
// த) ப (K pV
தா) ப (K pV
// த) ப (ா p
@@ -1814,6 +1915,8 @@ _சந்திர_) ப (ோஸ b
ல lV
ல (B l

_செய) ல்ப RpV#


.group ள
ள l.V
@@ -1888,10 +1991,15 @@ _சந்திர_) ப (ோஸ b
இ (ராவுத்த
இ (ராஷ்டிர
இ (லகுவாக
இ (லட்சங்
இ (லட்சண
இ (லட்சத்
இ (லட்சம
இ (லட்சா
இ (லட்சிய
இ (லண்டன
இ (லவங்க
இ (லாப
இ (லேச
//endsort

@@ -1958,6 +2066,7 @@ _சந்திர_) ப (ோஸ b

ௌ aU
_த) ௌி el.i // for bad scanning
வ) ௌி el.i


் // virama

+ 27
- 8
phsource/compile_report View File

@@ -1,4 +1,4 @@
67 phoneme tables
68 phoneme tables
new total
base 107 107
consonants 9 115
@@ -21,7 +21,7 @@ consonants 9 115
fr-ca 11 140
hi 59 150
ta 21 153
hu 24 121
hu 25 122
lv 29 125
nl 25 126
pl 22 120
@@ -67,6 +67,7 @@ consonants 9 115
az 10 127
ak 8 109
am 8 123
wo 18 118

Data file Used by
b/b [b] base
@@ -345,7 +346,7 @@ l/l_ [l] base
[l/] fr
l/l_@ [l/3] base
[l/] fr
l/l@ [h}] base
l/l@ [há] base
[l#] base
[l] fr
[l/2] fr
@@ -378,14 +379,14 @@ l/L2_oL [l/2] base
l/L2_uL [l/2] base
l/l_3 [l/] de
l/l_4 [ll] sq
l/la [h}] base
l/la [há] base
[l#] base
[l] fr
[l/2] fr
[K] nso
l/l_a [l/3] base
[l/] fr
l/le [h}] base
l/le [há] base
[l#] base
[l] fr
[l/2] fr
@@ -396,7 +397,7 @@ l/L_eL_af [&] af
[&:] af
l/l_front [L] sq
l/l_front_ [l/4] sq
l/li [h}] base
l/li [há] base
[l#] base
[l] fr
[l/2] fr
@@ -409,7 +410,7 @@ ll/ll [L] bg
ll/_ll [L] bg
l/l_long [l] base
[l] fr
l/lo [h}] base
l/lo [há] base
[l#] base
[l] fr
[l/2] fr
@@ -417,7 +418,7 @@ l/lo [h}] base
l/l_o [l/3] base
[l/] fr
l^/l_rfx [l.] base
l/lu [h}] base
l/lu [há] base
[l#] base
[l] fr
[l/2] fr
@@ -738,6 +739,7 @@ ustop/k_unasp [k] base
[k] sq
ustop/k_unasp_ [k] zh
ustop/null [?] base
[t2] hu
ustop/p [p] base
[p2] fr
[p] zhy
@@ -1217,6 +1219,8 @@ vowel/@ [@] base
[@] hy
[@] ml
[@] sl
[@] wo
[@:] wo
vowel/@- [@-] base
[r*] hr
vowel/& [a] en-rp
@@ -1301,6 +1305,7 @@ vowel/a# [a] base2
[&] sr
[a#] rw
[a/] rw
[a] wo
vowel/a_2 [a] base2
[a] en-wi
[A:] en-wi
@@ -1314,6 +1319,7 @@ vowel/a_2 [a] base2
[a] da
[a] rw
vowel/a#_2 [A] nl
[a:] nl
[a#] pl
[&] hr
[a] sv
@@ -1364,6 +1370,7 @@ vowel/a_5 [a:] ta
[a:] ml
vowel/a_6 [a] ca
[a:] vi
[a:] wo
vowel/a_7 [a] en
[a] fr
[a] ht
@@ -1437,6 +1444,8 @@ vowel/e [e] base
[e:] ml
[e] ne
[e] sl
[e] wo
[e:] wo
vowel/e# [I] en-sc
vowel/e_2 [eI] en-sc
[e:] de
@@ -1483,6 +1492,8 @@ vowel/ee_3 [&] af
vowel/ee_4 [E] sq
vowel/ee_5 [E] en
[E] ak
[E] wo
[E:] wo
vowel/ee_6 [&] sk
[E3] sv
[E] ku
@@ -1564,6 +1575,7 @@ vowel/i [i] base
[i] nso
[i] ak
[i] am
[i:] wo
vowel/i# [y:] cy
vowel/i_2 [i2] de
[i:] de
@@ -1652,6 +1664,7 @@ vowel/ii_6 [I] en-wm
[i/] pt
[i] is
[I] sq
[i] wo
vowel/ii_en [i] en
[i] sq
vowel/ii_final [i] en-us
@@ -1698,6 +1711,8 @@ vowel/o [o] base2
[o:] pa
[o] sl
[o] ak
[o] wo
[o:] wo
vowel/o_2 [o:] cy
[o:] hi
[o:] hu
@@ -1749,6 +1764,8 @@ vowel/oo [o] base
[O] id
[o] prs
[o] bg
[O] wo
[O:] wo
vowel/oo_1 [O:] en-n
[O:] en-rp
[O@] en-rp
@@ -1812,6 +1829,7 @@ vowel/u [u] base
[u:] ml
[u] prs
[u] ak
[u:] wo
vowel/u# [u:] en-sc
[Y] tr
vowel/u_2 [u1] fi
@@ -1823,6 +1841,7 @@ vowel/u_2 [u1] fi
[u] sl
[u] bg
[u] am
[u] wo
vowel/u#_2 [u-] sv
vowel/u#_3 [U] ta
[U:] ta

BIN
phsource/j2/j2@ View File


BIN
phsource/j2/j2e View File


+ 1
- 0
phsource/mbrola/hu1 View File

@@ -26,6 +26,7 @@ volume 32
0 N NULL 0 n
0 C NULL 0 x
0 s2 NULL 0 s
0 t2 NULL 0 t


// map English phonemes to Hungarian

+ 5
- 1
phsource/ph_dutch View File

@@ -78,7 +78,11 @@ phoneme a:
vowel starttype #a endtype #a
length 210
IF thisPh(isUnstressed) THEN
FMT(vowel/a#_4)
IF thisPh(isWordEnd) THEN
FMT(vowel/a#_2)
ELSE
FMT(vowel/a#_4)
ENDIF
ENDIF
FMT(vowel/a)
endphoneme

+ 12
- 0
phsource/ph_hungarian View File

@@ -123,6 +123,18 @@ phoneme t // dental variant of /t/
endphoneme


phoneme t2
// changes to pause when followed by [t], so the [t][ becomes [t:]
vls dnt stop
lengthmod 2
IF nextPh(t) THEN
WAV(ustop/null, 0)
ELSE
ChangePhoneme(t)
ENDIF
endphoneme


phoneme d
vcd dnt stop
voicingswitch t

+ 2
- 2
phsource/ph_tamil View File

@@ -66,14 +66,14 @@ endphoneme

phoneme o
vowel starttype #o endtype #o
length 160
length 130
FMT(vowel/o)
endphoneme


phoneme o:
vowel starttype #o endtype #o
length 280
length 300
FMT(vowel/o)
endphoneme


+ 3
- 0
phsource/phonemes View File

@@ -1840,3 +1840,6 @@ include ph_akan

phonemetable am base2
include ph_amhari

phonemetable wo base
include ph_wolof

+ 8
- 0
platforms/windows/windows_dll/espeak.dsp View File

@@ -109,6 +109,10 @@ SOURCE=.\src\klatt.cpp
# End Source File
# Begin Source File
SOURCE=.\src\sonic.cpp
# End Source File
# Begin Source File
SOURCE=.\src\numbers.cpp
# End Source File
# Begin Source File
@@ -174,6 +178,10 @@ SOURCE=.\src\klatt.h
# End Source File
# Begin Source File
SOURCE=.\src\sonic.h
# End Source File
# Begin Source File
SOURCE=.\src\phoneme.h
# End Source File
# Begin Source File

+ 23
- 5
src/compiledict.cpp View File

@@ -208,14 +208,15 @@ char *DecodeRule(const char *group_chars, int group_length, char *rule, int cont
int flags;
int suffix_char;
int condition_num=0;
int at_start = 0;
const char *name;
char buf[60];
char buf_pre[60];
char suffix[20];
static char output[60];

static char symbols[] = {' ',' ',' ',' ',' ',' ',' ',' ',' ',
'@','&','%','+','#','S','D','Z','A','L','!',' ','?','?','J','N','K','V','?','T','X','?','W'};
static char symbols[] = {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
'&','%','+','#','S','D','Z','A','L','!',' ','@','?','J','N','K','V','?','T','X','?','W'};

static char symbols_lg[] = {'A','B','C','H','F','G','Y'};

@@ -241,6 +242,8 @@ char *DecodeRule(const char *group_chars, int group_length, char *rule, int cont
case RULE_PHONEMES:
finished=1;
break;
case RULE_PRE_ATSTART:
at_start = 1; // drop through to next case
case RULE_PRE:
match_type = RULE_PRE;
*p = 0;
@@ -342,8 +345,10 @@ char *DecodeRule(const char *group_chars, int group_length, char *rule, int cont
sprintf(p,"?%d ",condition_num);
p = &p[strlen(p)];
}
if((ix = strlen(buf_pre)) > 0)
if(((ix = strlen(buf_pre)) > 0) || at_start)
{
if(at_start)
*p++ = '_';
while(--ix >= 0)
*p++ = buf_pre[ix];
*p++ = ')';
@@ -1158,6 +1163,7 @@ static char *compile_rule(char *input)
char *prule;
int len;
int len_name;
int start;
int state=2;
int finish=0;
int pre_bracket=0;
@@ -1308,9 +1314,21 @@ static char *compile_rule(char *input)
}
if(rule_pre[0] != 0)
{
output[len++] = RULE_PRE;
start = 0;
if(rule_pre[0] == RULE_SPACE)
{
// omit '_' at the beginning of the pre-string and imply it by using RULE_PRE_ATSTART
c = RULE_PRE_ATSTART;
start = 1;
}
else
{
c = RULE_PRE;
}
output[len++] = c;

// output PRE string in reverse order
for(ix = strlen(rule_pre)-1; ix>=0; ix--)
for(ix = strlen(rule_pre)-1; ix>=start; ix--)
output[len++] = rule_pre[ix];
}


+ 53
- 26
src/dictionary.cpp View File

@@ -1090,6 +1090,7 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags,
int done;
int stressflags;
int dflags = 0;
int first_primary;

signed char vowel_stress[N_WORD_PHONEMES/2];
char syllable_weight[N_WORD_PHONEMES/2];
@@ -1433,6 +1434,7 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags,
}

done = 0;
first_primary = 0;
for(v=1; v<vowel_count; v++)
{
if(vowel_stress[v] < 0)
@@ -1469,6 +1471,18 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags,
stress = 3; /* use secondary stress for remaining syllables */
}
}

if(vowel_stress[v] >= 4)
{
if(first_primary == 0)
first_primary = v;
else
if(stressflags & S_FIRST_PRIMARY)
{
// reduce primary stresses after the first to secondary
vowel_stress[v] = 3;
}
}
}

if((unstressed_word) && (tonic < 0))
@@ -1737,7 +1751,6 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
int failed;
int unpron_ignore;
int consumed; /* number of letters consumed from input */
int count; /* count through rules in the group */
int syllable_count;
int vowel;
int letter_group;
@@ -1747,6 +1760,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
int n_bytes;
int add_points;
int command;
int check_atstart;

MatchRecord match;
static MatchRecord best;
@@ -1769,7 +1783,6 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_


total_consumed = 0;
count = 0;
common_phonemes = NULL;
match_type = 0;

@@ -1787,7 +1800,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
letter = 0;
distance_right= -6; /* used to reduce points for matches further away the current letter */
distance_left= -2;
count++;
check_atstart = 0;

match.points = 1;
match.end_type = 0;
@@ -1827,17 +1840,24 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
rule--; // so we are still pointing at the 0
failed=2; // matched OK
break;

case RULE_PRE_ATSTART: // pre rule with implied 'start of word'
check_atstart = 1;
unpron_ignore = 0;
match_type = RULE_PRE;
break;

case RULE_PRE:
match_type = RULE_PRE;
if(word_flags & FLAG_UNPRON_TEST)
{
// checking the start of the word for unpronouncable character sequences, only
// consider rules which explicitly match the start of a word
if(rule[0] != ' ')
failed = 1;
unpron_ignore = 0;
// Note: Those rules now use RULE_PRE_ATSTART
failed = 1;
}
break;

case RULE_POST:
match_type = RULE_POST;
break;
@@ -2306,31 +2326,34 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
match.points += add_points;
}


if((failed == 2) && (unpron_ignore == 0))
{
/* matched OK, is this better than the last best match ? */

if(match.points >= best.points)
{
memcpy(&best,&match,sizeof(match));
total_consumed = consumed;
}

if((option_phonemes == 2) && (match.points > 0) && ((word_flags & FLAG_NO_TRACE) == 0))
// do we also need to check for 'start of word' ?
if((check_atstart==0) || (pre_ptr[-1] == ' '))
{
// show each rule that matches, and it's points score
int pts;
char decoded_phonemes[80];
if(check_atstart)
match.points += 4;

// note: 'count' contains the rule number, if we want to include it
pts = match.points;
if(group_length > 1)
pts += 35; // to account for an extra letter matching
DecodePhonemes(match.phonemes,decoded_phonemes);
fprintf(f_trans,"%3d\t%s [%s]\n",pts,DecodeRule(group_chars, group_length, rule_start, word_flags), decoded_phonemes);
/* matched OK, is this better than the last best match ? */
if(match.points >= best.points)
{
memcpy(&best,&match,sizeof(match));
total_consumed = consumed;
}
if((option_phonemes == 2) && (match.points > 0) && ((word_flags & FLAG_NO_TRACE) == 0))
{
// show each rule that matches, and it's points score
int pts;
char decoded_phonemes[80];
pts = match.points;
if(group_length > 1)
pts += 35; // to account for an extra letter matching
DecodePhonemes(match.phonemes,decoded_phonemes);
fprintf(f_trans,"%3d\t%s [%s]\n",pts,DecodeRule(group_chars, group_length, rule_start, word_flags), decoded_phonemes);
}
}

}

/* skip phoneme string to reach start of next template */
@@ -3313,6 +3336,10 @@ int LookupDictList(Translator *tr, char **wordptr, char *ph_out, unsigned int *f
fprintf(f_trans,"Replace: %s %s\n",word,*wordptr);
}
}
else
{
flags[0] &= ~FLAG_SKIPWORDS;
}

ph_out[0] = 0;
return(0);

+ 4
- 2
src/espeakedit.cpp View File

@@ -232,7 +232,6 @@ BEGIN_EVENT_TABLE(MyFrame, wxMDIParentFrame)
EVT_MENU(MENU_LEXICON_BG, MyFrame::OnTools)
EVT_MENU(MENU_LEXICON_DE, MyFrame::OnTools)
EVT_MENU(MENU_LEXICON_IT, MyFrame::OnTools)
EVT_MENU(MENU_LEXICON_IT2, MyFrame::OnTools)
EVT_MENU(MENU_LEXICON_TEST, MyFrame::OnTools)
EVT_MENU(MENU_TO_UTF8, MyFrame::OnTools)
EVT_MENU(MENU_COUNT_WORDS, MyFrame::OnTools)
@@ -610,7 +609,6 @@ void MyFrame::OnTools(wxCommandEvent& event)
case MENU_LEXICON_BG:
case MENU_LEXICON_DE:
case MENU_LEXICON_IT:
case MENU_LEXICON_IT2:
case MENU_LEXICON_TEST:
CompareLexicon(event.GetId()); // Compare a lexicon with _rules translation
break;
@@ -699,6 +697,7 @@ void MyFrame::OnSpeak(wxCommandEvent& event)
break;

case MENU_SPEAK_FILE:
out_ptr = NULL;
transldlg->SpeakFile();
break;

@@ -707,11 +706,14 @@ void MyFrame::OnSpeak(wxCommandEvent& event)
break;

case MENU_SPEAK_PAUSE:
out_ptr = NULL;
SpeakNextClause(NULL,NULL,3);
if(SynthStatus() & 2)
speak_menu->SetLabel(MENU_SPEAK_PAUSE,_T("&Resume"));
else
{
speak_menu->SetLabel(MENU_SPEAK_PAUSE,_T("&Pause"));
}
break;

case MENU_SPEAK_VOICE:

+ 96
- 27
src/extras.cpp View File

@@ -289,11 +289,14 @@ static void DecodePhonemes2(const char *inptr, char *outptr)

void Lexicon_It(int pass)
{//======================
// Reads a lexicon of pairs of words: normal spelling and spelling with accents
// Creates file: dictsource/it_listx which includes corrections for stress position and [E]/[e] and [O]/[o] phonemes
// Words which are still in error are listed in file: it_compare (in the directory of the lexicon file).
int count=0;
int matched=0;
int ix;
int c;
char *p;
char *p, *p2;
int len;
int vowel_ix;
int stress_posn1;
@@ -305,8 +308,11 @@ void Lexicon_It(int pass)
FILE *f_out;
FILE *f_listx;
FILE *f_list_in = NULL;
int listx_count;
long int displ;
const char *alt_string;
wxString str;
static wxString fname_lex;
char buf[200];
char word[80];
char word1[80];
@@ -315,7 +321,10 @@ void Lexicon_It(int pass)
char temp[80];
char phonemes[80];
char phonemes2[80];
char buf_out[120];
char phonemes3[80];
char buf_out[200];
char buf_error[200];
char last_listx[200];
static const char *vowels1 = "aeiou";
static const char *vowels2 = "aeou";

@@ -333,31 +342,42 @@ void Lexicon_It(int pass)

static const char *exceptions[] = {ex1, ex2, ex3, ex4, ex5, ex6, ex7, ex8, ex9, ex10, NULL};

wxString fname = wxFileSelector(_T("Italian Lexicon"),path_dir1,_T(""),_T(""),_T("*"),wxOPEN);
if(pass == 1)
{
fname_lex = wxFileSelector(_T("Italian Lexicon"),path_dir1,_T(""),_T(""),_T("*"),wxOPEN);
}

strcpy(buf,fname.mb_str(wxConvLocal));
strcpy(buf,fname_lex.mb_str(wxConvLocal));
if((f_in = fopen(buf,"r")) == NULL)
{
wxLogError(_T("Can't read file ")+fname);
wxLogError(_T("Can't read file ")+fname_lex);
return;
}
path_dir1 = wxFileName(fname).GetPath();
path_dir1 = wxFileName(fname_lex).GetPath();
strcpy(buf_out, path_dir1.mb_str(wxConvLocal));
sprintf(buf, "%s/IT_errors", buf_out);
if((f_out = fopen("compare_it","w")) == NULL)
if((f_out = fopen(buf,"w")) == NULL)
{
wxLogError(_T("Can't write file: compare_it "));
str = wxString(buf, wxConvLocal);
wxLogError(_T("Can't write file: ") + str);
return;
}

listx_count = 0;
last_listx[0] = 0;

if(pass == 1)
{
sprintf(buf,"%s/it_listx",path_dsource);
remove(buf);
CompileDictionary(path_dsource,"it",NULL,NULL,0);
f_listx = fopen(buf,"w");
wxLogStatus(_T("Pass 1"));
}
else
{
CompileDictionary(path_dsource,"it",NULL,NULL,0);
sprintf(buf,"%s/it_listx2",path_dsource);
f_listx = fopen(buf,"w");
sprintf(buf,"%s/it_listx",path_dsource);
@@ -390,9 +410,9 @@ void Lexicon_It(int pass)
continue;

if(strlen(word) < 8)
sprintf(buf_out,"%s\t\t%s\t",word,temp);
sprintf(buf_error,"%s\t\t%s\t",word,temp);
else
sprintf(buf_out,"%s\t%s",word,temp);
sprintf(buf_error,"%s\t%s",word,temp);

sprintf(word1," %s ",word);

@@ -550,22 +570,37 @@ void Lexicon_It(int pass)
sscanf(buf, "%s", word1);
if(strcmp(word1, word_stem) < 0)
{
fprintf(f_listx,"%s",buf); // copy it_listx from pass 1 until we reach the matching word
sprintf(buf_out,"%s",buf); // copy it_listx from pass 1 until we reach the matching word
}
else
if(strcmp(word1, word_stem) == 0)
{
p = buf;
while((*p != '\n') && (*p != 0)) *p++;
*p = 0;
fprintf(f_listx,"%s %s\n",buf,alt_string); // add $alt or $alt2 to the entry
if(strcmp(word1, word_stem) == 0)
{
p = buf;
while((*p != '\n') && (*p != 0)) *p++;
*p = 0;
sprintf(buf_out,"%s %s\n",buf,alt_string); // add $alt or $alt2 to the entry
}
else
{
sprintf(buf_out,"%s %s\n", word_stem, alt_string); // add a new word with $alt or $alt2
fseek(f_list_in, displ, SEEK_SET);
}

if(strcmp(buf_out, last_listx) != 0)
{
fprintf(f_listx, "%s", buf_out);
listx_count++;
strcpy(last_listx, buf_out);
}
break;
}
else

if(strcmp(buf_out, last_listx) != 0)
{
fprintf(f_listx,"%s %s\n", word_stem, alt_string); // add a new word with $alt or $alt2
fseek(f_list_in, displ, SEEK_SET);
break;
fprintf(f_listx, "%s", buf_out);
listx_count++;
strcpy(last_listx, buf_out);
}
}
}
@@ -574,7 +609,26 @@ void Lexicon_It(int pass)
}
else
{
fprintf(f_out,"%s\t%s\t%s\n",buf_out,phonemes,phonemes2);
// allow if the only difference is no primary stress
p2 = phonemes2;
p = phonemes3;
while(*p2 != 0)
{
*p = *p2++;
if((*p2 == ':') && (strchr("aeiouEO", *p) != NULL)) p2++; // change lone vowels to short by removing ':'
if(*p == '\'') *p = ','; // change primary to secondary stress
p++;
}
*p = 0;
if(strcmp(phonemes, phonemes3) == 0)
{
matched++;
}
else
{
// still doesn't match, report this word
fprintf(f_out,"%s\t%s\t%s\n",buf_error,phonemes,phonemes2);
}
}
}

@@ -582,15 +636,32 @@ void Lexicon_It(int pass)
{
while(fgets(buf, sizeof(buf), f_list_in) != NULL)
{
fprintf(f_listx, "%s", buf); // copy the remaining entries from pass 1
if(strcmp(buf, last_listx) != 0) // check for duplicate entries
{
fprintf(f_listx, "%s", buf); // copy the remaining entries from pass 1
listx_count++;
strcpy(last_listx, buf);
}
}
fclose(f_list_in);
}
fclose(f_in);
fclose(f_out);
fclose(f_listx);
wxLogStatus(_T("Completed, equal=%d different=%d"),matched,count-matched);
}

if(pass == 2)
{
sprintf(buf,"%s/it_listx",path_dsource);
remove(buf);
sprintf(buf_out,"%s/it_listx2",path_dsource);
rename(buf_out, buf);
wxLogStatus(_T("Created file 'it_listx', entries=%d errors=%d total words=%d"),listx_count, count-matched, count);
}
else
{
wxLogStatus(_T("Pass 1, equal=%d different=%d"),matched,count-matched);
}
} // end of Lexicon_It


void Lexicon_De()
@@ -760,7 +831,7 @@ void Lexicon_De()
fclose(f_in);
fclose(f_out);
wxLogStatus(_T("Completed, equal=%d different=%d"),matched,count-matched);
}
} // end of Lexicon_De


extern int IsVowel(Translator *tr, int letter);
@@ -1340,8 +1411,6 @@ void CompareLexicon(int id)
break;
case MENU_LEXICON_IT:
Lexicon_It(1);
break;
case MENU_LEXICON_IT2:
Lexicon_It(2);
break;
case MENU_LEXICON_TEST:

+ 0
- 1
src/main.h View File

@@ -160,7 +160,6 @@ enum {
MENU_LEXICON_BG,
MENU_LEXICON_DE,
MENU_LEXICON_IT,
MENU_LEXICON_IT2,
MENU_LEXICON_TEST,
MENU_TO_UTF8,
MENU_COUNT_WORDS,

+ 0
- 1
src/menus.cpp View File

@@ -127,7 +127,6 @@ wxMenuBar *MakeMenu(int type, const char *dict_name)
lexicon_menu->Append(MENU_LEXICON_BG, _("Bulgarian"));
lexicon_menu->Append(MENU_LEXICON_DE, _("German"));
lexicon_menu->Append(MENU_LEXICON_IT, _("Italian"));
lexicon_menu->Append(MENU_LEXICON_IT2, _("Italian, pass 2"));
// lexicon_menu->Append(MENU_LEXICON_TEST, _("Test"));

tools_menu = new wxMenu;

+ 16
- 12
src/numbers.cpp View File

@@ -808,14 +808,18 @@ if((tr->prev_dict_flags & FLAG_ALT_TRANS) && ((c2 == 0) || (wtab[0].flags & FLAG
} // end of CheckDotOrdinal


static int hu_number_e(const char *word)
{//=====================================
static int hu_number_e(const char *word, int thousandplex, int value)
{//==================================================================
// lang-hu: variant form of numbers when followed by hyphen and a suffix starting with 'a' or 'e' (but not a, e, az, ez, azt, ezt, att. ett

if((word[0] == 'a') || (word[0] == 'e'))
{
if((word[1] == ' ') || (word[1] == 'z') || ((word[1] == 't') && (word[2] == 't')))
return(0);

if(((thousandplex==1) || ((value % 1000) == 0)) && (word[1] == 'l'))
return(0); // 1000-el

return(1);
}
return(0);
@@ -927,7 +931,7 @@ int TranslateRoman(Translator *tr, char *word, char *ph_out, WORD_TAB *wtab)
{
if(!(wtab[0].flags & FLAG_ORDINAL))
{
if((wtab[0].flags & FLAG_HYPHEN_AFTER) && hu_number_e(word))
if((wtab[0].flags & FLAG_HYPHEN_AFTER) && hu_number_e(word, 0, acc))
{
// should use the 'e' form of the number
num_control |= 1;
@@ -1111,7 +1115,6 @@ static int LookupNum2(Translator *tr, int value, int control, char *ph_out)
char ph_tens[50];
char ph_digits[50];
char ph_and[12];
char ph_ord_suffix[20];

units = value % 10;
tens = value / 10;
@@ -1214,8 +1217,7 @@ static int LookupNum2(Translator *tr, int value, int control, char *ph_out)
if((units != 0) && (tr->langopts.numbers2 & NUM2_MULTIPLE_ORDINAL))
{
// Use the ordinal form of tens as well as units. Add the ordinal ending
Lookup(tr, "_ord", ph_ord_suffix);
strcat(ph_tens, ph_ord_suffix);
strcat(ph_tens, ph_ordinal2);
}
}
}
@@ -1368,7 +1370,6 @@ static int LookupNum3(Translator *tr, int value, char *ph_out, int suppress_null
char ph_thousands[50];
char ph_hundred_and[12];
char ph_thousand_and[12];
char ph_ord_suffix[20];

ordinal = control & 0x22;
hundreds = value / 100;
@@ -1447,8 +1448,7 @@ static int LookupNum3(Translator *tr, int value, char *ph_out, int suppress_null
{
// Use ordinal form of hundreds, as well as for tens and units
// Add ordinal suffix to the hundreds
Lookup(tr, "_ord", ph_ord_suffix);
strcat(ph_digits, ph_ord_suffix);
strcat(ph_digits, ph_ordinal2);
}
}

@@ -1557,6 +1557,7 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned
int thousands_inc = 0;
int prev_thousands = 0;
int ordinal = 0;
int dot_ordinal;
int this_value;
int decimal_count;
int max_decimal_count;
@@ -1611,7 +1612,8 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned
if(prev_thousands || (word[0] != '0'))
{
// don't check for ordinal if the number has a leading zero
ordinal = CheckDotOrdinal(tr, word, &word[ix], wtab, 0);
if((ordinal = CheckDotOrdinal(tr, word, &word[ix], wtab, 0)) != 0)
dot_ordinal = 1;
}

if((word[ix] == '.') && !isdigit(word[ix+1]) && !isdigit(word[ix+2]) && !(wtab[1].flags & FLAG_NOSPACE))
@@ -1730,7 +1732,7 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned
if(tr->translator_name == L('h','u'))
{
// variant form of numbers when followed by hyphen and a suffix starting with 'a' or 'e' (but not a, e, az, ez, azt, ezt
if((wtab[thousandplex].flags & FLAG_HYPHEN_AFTER) && (thousands_exact==1) && hu_number_e(&word[suffix_ix]))
if((wtab[thousandplex].flags & FLAG_HYPHEN_AFTER) && (thousands_exact==1) && hu_number_e(&word[suffix_ix], thousandplex, value))
{
number_control |= 1; // use _1e variant of number
}
@@ -1790,9 +1792,11 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned
n_digit_lookup = 2;
}
}

// if((buf_digit_lookup[0] == 0) && (*p != '0') && (dot_ordinal==0))
if((buf_digit_lookup[0] == 0) && (*p != '0'))
{
// not found, lookup only the last digit
// not found, lookup only the last digit (?? but not if dot-ordinal has been found)
if(LookupDictList(tr, &p, buf_digit_lookup, flags, FLAG_SUFX, wtab)) // don't match '0', or entries with $only
{
n_digit_lookup = 1;

+ 5
- 7
src/setlengths.cpp View File

@@ -140,7 +140,6 @@ void SetSpeed(int control)
int s1;
int wpm;
int wpm2;
double wpm_inc;

speed.loud_consonants = 0;
speed.min_sample_len = 450;
@@ -154,18 +153,17 @@ void SetSpeed(int control)
// fast_settings[0] wpm where speedup starts
// fast_settings[1] wpm for maximum espeak speed
// fast_settings[2] maximum espeak speed

sonicSpeed = 1.0;
if(wpm > speed.fast_settings[0])
{
wpm2 = wpm;
wpm_inc = (double)(speed.fast_settings[2] - speed.fast_settings[0]) / (double)(speed.fast_settings[1] - speed.fast_settings[0]);

wpm_inc = (wpm2 - speed.fast_settings[0]) * wpm_inc;
wpm = speed.fast_settings[0] + (int)wpm_inc;

sonicSpeed = ((double)wpm2)/wpm;
wpm = speed.fast_settings[2];
// Maybe we can do better than a 10 wpm fudge factor?
sonicSpeed = ((double)wpm2 + 10)/wpm;
}


#ifdef TEST_SPEED
if(wpm > 1000)
{

+ 967
- 0
src/sonic.cpp View File

@@ -0,0 +1,967 @@
/* Sonic library
Copyright 2010
Bill Cox
This file is part of the Sonic Library.

The Sonic Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */

#include "StdAfx.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "sonic.h"

struct sonicStreamStruct {
short *inputBuffer;
short *outputBuffer;
short *pitchBuffer;
short *downSampleBuffer;
float speed;
float volume;
float pitch;
int numChannels;
int inputBufferSize;
int pitchBufferSize;
int outputBufferSize;
int numInputSamples;
int numOutputSamples;
int numPitchSamples;
int minPeriod;
int maxPeriod;
int maxRequired;
int remainingInputToCopy;
int sampleRate;
int prevPeriod;
int prevMaxDiff;
int prevMinDiff;
};

/* Just used for debugging */
void sonicMSG(char *format, ...)
{
char buffer[4096];
va_list ap;
FILE *file;

va_start(ap, format);
vsprintf((char *)buffer, (char *)format, ap);
va_end(ap);
file=fopen("/tmp/sonic.log", "a");
fprintf(file, "%s", buffer);
fclose(file);
}

/* Scale the samples by the factor. */
static void scaleSamples(
short *samples,
int numSamples,
float volume)
{
int fixedPointVolume = volume*4096.0f;
int value;

while(numSamples--) {
value = (*samples*fixedPointVolume) >> 12;
if(value > 32767) {
value = 32767;
} else if(value < -32767) {
value = -32767;
}
*samples++ = value;
}
}

/* Get the speed of the stream. */
float sonicGetSpeed(
sonicStream stream)
{
return stream->speed;
}

/* Set the speed of the stream. */
void sonicSetSpeed(
sonicStream stream,
float speed)
{
stream->speed = speed;
}

/* Get the pitch of the stream. */
float sonicGetPitch(
sonicStream stream)
{
return stream->pitch;
}

/* Set the pitch of the stream. */
void sonicSetPitch(
sonicStream stream,
float pitch)
{
stream->pitch = pitch;
}

/* Get the scaling factor of the stream. */
float sonicGetVolume(
sonicStream stream)
{
return stream->volume;
}

/* Set the scaling factor of the stream. */
void sonicSetVolume(
sonicStream stream,
float volume)
{
stream->volume = volume;
}

/* Get the sample rate of the stream. */
int sonicGetSampleRate(
sonicStream stream)
{
return stream->sampleRate;
}

/* Get the number of channels. */
int sonicGetNumChannels(
sonicStream stream)
{
return stream->numChannels;
}

/* Destroy the sonic stream. */
void sonicDestroyStream(
sonicStream stream)
{
if(stream->inputBuffer != NULL) {
free(stream->inputBuffer);
}
if(stream->outputBuffer != NULL) {
free(stream->outputBuffer);
}
if(stream->pitchBuffer != NULL) {
free(stream->pitchBuffer);
}
if(stream->downSampleBuffer != NULL) {
free(stream->downSampleBuffer);
}
free(stream);
}

/* Create a sonic stream. Return NULL only if we are out of memory and cannot
allocate the stream. */
sonicStream sonicCreateStream(
int sampleRate,
int numChannels)
{
sonicStream stream = (sonicStream)calloc(1, sizeof(struct sonicStreamStruct));
int minPeriod = sampleRate/SONIC_MAX_PITCH;
int maxPeriod = sampleRate/SONIC_MIN_PITCH;
int maxRequired = 2*maxPeriod;

if(stream == NULL) {
return NULL;
}
stream->inputBufferSize = maxRequired;
stream->inputBuffer = (short *)calloc(maxRequired, sizeof(short)*numChannels);
if(stream->inputBuffer == NULL) {
sonicDestroyStream(stream);
return NULL;
}
stream->outputBufferSize = maxRequired;
stream->outputBuffer = (short *)calloc(maxRequired, sizeof(short)*numChannels);
if(stream->outputBuffer == NULL) {
sonicDestroyStream(stream);
return NULL;
}
stream->pitchBufferSize = maxRequired;
stream->pitchBuffer = (short *)calloc(maxRequired, sizeof(short)*numChannels);
if(stream->pitchBuffer == NULL) {
sonicDestroyStream(stream);
return NULL;
}
stream->downSampleBuffer = (short *)calloc(maxRequired, sizeof(short));
stream->speed = 1.0f;
stream->pitch = 1.0f;
stream->volume = 1.0f;
stream->sampleRate = sampleRate;
stream->numChannels = numChannels;
stream->minPeriod = minPeriod;
stream->maxPeriod = maxPeriod;
stream->maxRequired = maxRequired;
return stream;
}

/* Enlarge the output buffer if needed. */
static int enlargeOutputBufferIfNeeded(
sonicStream stream,
int numSamples)
{
if(stream->numOutputSamples + numSamples > stream->outputBufferSize) {
stream->outputBufferSize += (stream->outputBufferSize >> 1) + numSamples;
stream->outputBuffer = (short *)realloc(stream->outputBuffer,
stream->outputBufferSize*sizeof(short)*stream->numChannels);
if(stream->outputBuffer == NULL) {
return 0;
}
}
return 1;
}

/* Enlarge the input buffer if needed. */
static int enlargeInputBufferIfNeeded(
sonicStream stream,
int numSamples)
{
if(stream->numInputSamples + numSamples > stream->inputBufferSize) {
stream->inputBufferSize += (stream->inputBufferSize >> 1) + numSamples;
stream->inputBuffer = (short *)realloc(stream->inputBuffer,
stream->inputBufferSize*sizeof(short)*stream->numChannels);
if(stream->inputBuffer == NULL) {
return 0;
}
}
return 1;
}

/* Add the input samples to the input buffer. */
static int addFloatSamplesToInputBuffer(
sonicStream stream,
float *samples,
int numSamples)
{
short *buffer;
int count = numSamples*stream->numChannels;

if(numSamples == 0) {
return 1;
}
if(!enlargeInputBufferIfNeeded(stream, numSamples)) {
return 0;
}
buffer = stream->inputBuffer + stream->numInputSamples*stream->numChannels;
while(count--) {
*buffer++ = (*samples++)*32767.0f;
}
stream->numInputSamples += numSamples;
return 1;
}

/* Add the input samples to the input buffer. */
static int addShortSamplesToInputBuffer(
sonicStream stream,
short *samples,
int numSamples)
{
if(numSamples == 0) {
return 1;
}
if(!enlargeInputBufferIfNeeded(stream, numSamples)) {
return 0;
}
memcpy(stream->inputBuffer + stream->numInputSamples*stream->numChannels, samples,
numSamples*sizeof(short)*stream->numChannels);
stream->numInputSamples += numSamples;
return 1;
}

/* Add the input samples to the input buffer. */
static int addUnsignedCharSamplesToInputBuffer(
sonicStream stream,
unsigned char *samples,
int numSamples)
{
short *buffer;
int count = numSamples*stream->numChannels;

if(numSamples == 0) {
return 1;
}
if(!enlargeInputBufferIfNeeded(stream, numSamples)) {
return 0;
}
buffer = stream->inputBuffer + stream->numInputSamples*stream->numChannels;
while(count--) {
*buffer++ = (*samples++ - 128) << 8;
}
stream->numInputSamples += numSamples;
return 1;
}

/* Remove input samples that we have already processed. */
static void removeInputSamples(
sonicStream stream,
int position)
{
int remainingSamples = stream->numInputSamples - position;

if(remainingSamples > 0) {
memmove(stream->inputBuffer, stream->inputBuffer + position*stream->numChannels,
remainingSamples*sizeof(short)*stream->numChannels);
}
stream->numInputSamples = remainingSamples;
}

/* Just copy from the array to the output buffer */
static int copyToOutput(
sonicStream stream,
short *samples,
int numSamples)
{
if(!enlargeOutputBufferIfNeeded(stream, numSamples)) {
return 0;
}
memcpy(stream->outputBuffer + stream->numOutputSamples*stream->numChannels,
samples, numSamples*sizeof(short)*stream->numChannels);
stream->numOutputSamples += numSamples;
return numSamples;
}

/* Just copy from the input buffer to the output buffer. Return 0 if we fail to
resize the output buffer. Otherwise, return numSamples */
static int copyInputToOutput(
sonicStream stream,
int position)
{
int numSamples = stream->remainingInputToCopy;

if(numSamples > stream->maxRequired) {
numSamples = stream->maxRequired;
}
if(!copyToOutput(stream, stream->inputBuffer + position*stream->numChannels,
numSamples)) {
return 0;
}
stream->remainingInputToCopy -= numSamples;
return numSamples;
}

/* Read data out of the stream. Sometimes no data will be available, and zero
is returned, which is not an error condition. */
int sonicReadFloatFromStream(
sonicStream stream,
float *samples,
int maxSamples)
{
int numSamples = stream->numOutputSamples;
int remainingSamples = 0;
short *buffer;
int count;

if(numSamples == 0) {
return 0;
}
if(numSamples > maxSamples) {
remainingSamples = numSamples - maxSamples;
numSamples = maxSamples;
}
buffer = stream->outputBuffer;
count = numSamples*stream->numChannels;
while(count--) {
*samples++ = (*buffer++)/32767.0f;
}
if(remainingSamples > 0) {
memmove(stream->outputBuffer, stream->outputBuffer + numSamples*stream->numChannels,
remainingSamples*sizeof(short)*stream->numChannels);
}
stream->numOutputSamples = remainingSamples;
return numSamples;
}

/* Read short data out of the stream. Sometimes no data will be available, and zero
is returned, which is not an error condition. */
int sonicReadShortFromStream(
sonicStream stream,
short *samples,
int maxSamples)
{
int numSamples = stream->numOutputSamples;
int remainingSamples = 0;

if(numSamples == 0) {
return 0;
}
if(numSamples > maxSamples) {
remainingSamples = numSamples - maxSamples;
numSamples = maxSamples;
}
memcpy(samples, stream->outputBuffer, numSamples*sizeof(short)*stream->numChannels);
if(remainingSamples > 0) {
memmove(stream->outputBuffer, stream->outputBuffer + numSamples*stream->numChannels,
remainingSamples*sizeof(short)*stream->numChannels);
}
stream->numOutputSamples = remainingSamples;
return numSamples;
}

/* Read unsigned char data out of the stream. Sometimes no data will be available, and zero
is returned, which is not an error condition. */
int sonicReadUnsignedCharFromStream(
sonicStream stream,
unsigned char *samples,
int maxSamples)
{
int numSamples = stream->numOutputSamples;
int remainingSamples = 0;
short *buffer;
int count;

if(numSamples == 0) {
return 0;
}
if(numSamples > maxSamples) {
remainingSamples = numSamples - maxSamples;
numSamples = maxSamples;
}
buffer = stream->outputBuffer;
count = numSamples*stream->numChannels;
while(count--) {
*samples++ = (char)((*buffer++) >> 8) + 128;
}
if(remainingSamples > 0) {
memmove(stream->outputBuffer, stream->outputBuffer + numSamples*stream->numChannels,
remainingSamples*sizeof(short)*stream->numChannels);
}
stream->numOutputSamples = remainingSamples;
return numSamples;
}

/* Force the sonic stream to generate output using whatever data it currently
has. No extra delay will be added to the output, but flushing in the middle of
words could introduce distortion. */
int sonicFlushStream(
sonicStream stream)
{
int maxRequired = stream->maxRequired;
int numSamples = stream->numInputSamples;
int remainingSpace, numOutputSamples, expectedSamples;

if(numSamples == 0) {
return 1;
}
if(numSamples >= maxRequired && !sonicWriteShortToStream(stream, NULL, 0)) {
return 0;
}
numSamples = stream->numInputSamples; /* Now numSamples < maxRequired */
if(numSamples == 0) {
return 1;
}
remainingSpace = maxRequired - numSamples;
memset(stream->inputBuffer + numSamples*stream->numChannels, 0,
remainingSpace*sizeof(short)*stream->numChannels);
stream->numInputSamples = maxRequired;
numOutputSamples = stream->numOutputSamples;
if(!sonicWriteShortToStream(stream, NULL, 0)) {
return 0;
}
/* Throw away any extra samples we generated due to the silence we added */
expectedSamples = (int)(numSamples*stream->speed + 0.5);
if(stream->numOutputSamples > numOutputSamples + expectedSamples) {
stream->numOutputSamples = numOutputSamples + expectedSamples;
}
return 1;
}

/* Return the number of samples in the output buffer */
int sonicSamplesAvailable(
sonicStream stream)
{
return stream->numOutputSamples;
}

/* If skip is greater than one, average skip samples togther and write them to
the down-sample buffer. If numChannels is greater than one, mix the channels
together as we down sample. */
static void downSampleInput(
sonicStream stream,
short *samples,
int skip)
{
int numSamples = stream->maxRequired/skip;
int samplesPerValue = stream->numChannels*skip;
int i, j;
int value;
short *downSamples = stream->downSampleBuffer;

for(i = 0; i < numSamples; i++) {
value = 0;
for(j = 0; j < samplesPerValue; j++) {
value += *samples++;
}
value /= samplesPerValue;
*downSamples++ = value;
}
}

/* Find the best frequency match in the range, and given a sample skip multiple.
For now, just find the pitch of the first channel. */
static int findPitchPeriodInRange(
short *samples,
int minPeriod,
int maxPeriod,
int *retMinDiff,
int *retMaxDiff)
{
int period, bestPeriod = 0;
short *s, *p, sVal, pVal;
unsigned long diff, minDiff = 1, maxDiff = 0;
int i;

for(period = minPeriod; period <= maxPeriod; period++) {
diff = 0;
s = samples;
p = samples + period;
for(i = 0; i < period; i++) {
sVal = *s++;
pVal = *p++;
diff += sVal >= pVal? (unsigned short)(sVal - pVal) :
(unsigned short)(pVal - sVal);
}
/* Note that the highest number of samples we add into diff will be less
than 256, since we skip samples. Thus, diff is a 24 bit number, and
we can safely multiply by numSamples without overflow */
if(diff*bestPeriod < minDiff*period) {
minDiff = diff;
bestPeriod = period;
}
if(diff*bestPeriod > maxDiff*period) {
maxDiff = diff;
}
}
*retMinDiff = minDiff;
*retMaxDiff = maxDiff;
return bestPeriod;
}

/* At abrupt ends of voiced words, we can have pitch periods that are better
aproximated by the previous pitch period estimate. Try to detect this case. */
static int prevPeriodBetter(
sonicStream stream,
int period,
int minDiff,
int maxDiff)
{
if(maxDiff*3/2 < stream->prevMaxDiff && (maxDiff*3.0f)*stream->prevMinDiff <
(float)stream->prevMaxDiff*minDiff*2) {
return 1;
}
return 0;
}

/* Find the pitch period. This is a critical step, and we may have to try
multiple ways to get a good answer. This version uses AMDF. To improve
speed, we down sample by an integer factor get in the 11KHz range, and then
do it again with a narrower frequency range without down sampling */
static int findPitchPeriod(
sonicStream stream,
short *samples)
{
int minPeriod = stream->minPeriod;
int maxPeriod = stream->maxPeriod;
int sampleRate = stream->sampleRate;
int minDiff, maxDiff, retPeriod;
int skip = 1;
int period;

if(sampleRate > SONIC_AMDF_FREQ) {
skip = sampleRate/SONIC_AMDF_FREQ;
}
if(stream->numChannels == 1 && skip == 1) {
period = findPitchPeriodInRange(samples, minPeriod, maxPeriod, &minDiff, &maxDiff);
} else {
downSampleInput(stream, samples, skip);
period = findPitchPeriodInRange(stream->downSampleBuffer, minPeriod/skip,
maxPeriod/skip, &minDiff, &maxDiff);
if(skip != 1) {
period *= skip;
minPeriod = period - (skip << 2);
maxPeriod = period + (skip << 2);
if(minPeriod < stream->minPeriod) {
minPeriod = stream->minPeriod;
}
if(maxPeriod > stream->maxPeriod) {
maxPeriod = stream->maxPeriod;
}
if(stream->numChannels == 1) {
period = findPitchPeriodInRange(samples, minPeriod, maxPeriod,
&minDiff, &maxDiff);
} else {
downSampleInput(stream, samples, 1);
period = findPitchPeriodInRange(stream->downSampleBuffer, minPeriod,
maxPeriod, &minDiff, &maxDiff);
}
}
}
if(prevPeriodBetter(stream, period, minDiff, maxDiff)) {
retPeriod = stream->prevPeriod;
} else {
retPeriod = period;
}
stream->prevMinDiff = minDiff;
stream->prevMaxDiff = maxDiff;
stream->prevPeriod = period;
return retPeriod;
}

/* Overlap two sound segments, ramp the volume of one down, while ramping the
other one from zero up, and add them, storing the result at the output. */
static void overlapAdd(
int numSamples,
int numChannels,
short *out,
short *rampDown,
short *rampUp)
{
short *o, *u, *d;
int i, t;

for(i = 0; i < numChannels; i++) {
o = out + i;
u = rampUp + i;
d = rampDown + i;
for(t = 0; t < numSamples; t++) {
*o = (*d*(numSamples - t) + *u*t)/numSamples;
o += numChannels;
d += numChannels;
u += numChannels;
}
}
}

/* Overlap two sound segments, ramp the volume of one down, while ramping the
other one from zero up, and add them, storing the result at the output. */
static void overlapAddWithSeparation(
int numSamples,
int numChannels,
int separation,
short *out,
short *rampDown,
short *rampUp)
{
short *o, *u, *d;
int i, t;

for(i = 0; i < numChannels; i++) {
o = out + i;
u = rampUp + i;
d = rampDown + i;
for(t = 0; t < numSamples + separation; t++) {
if(t < separation) {
*o = *d*(numSamples - t)/numSamples;
d += numChannels;
} else if(t < numSamples) {
*o = (*d*(numSamples - t) + *u*(t - separation))/numSamples;
d += numChannels;
u += numChannels;
} else {
*o = *u*(t - separation)/numSamples;
u += numChannels;
}
o += numChannels;
}
}
}

/* Just move the new samples in the output buffer to the pitch bufer */
static int moveNewSamplesToPitchBuffer(
sonicStream stream,
int originalNumOutputSamples)
{
int numSamples = stream->numOutputSamples - originalNumOutputSamples;
int numChannels = stream->numChannels;

if(stream->numPitchSamples + numSamples > stream->pitchBufferSize) {
stream->pitchBufferSize += (stream->pitchBufferSize >> 1) + numSamples;
stream->pitchBuffer = (short *)realloc(stream->pitchBuffer,
stream->pitchBufferSize*sizeof(short)*numChannels);
if(stream->pitchBuffer == NULL) {
return 0;
}
}
memcpy(stream->pitchBuffer + stream->numPitchSamples*numChannels,
stream->outputBuffer + originalNumOutputSamples*numChannels,
numSamples*sizeof(short)*numChannels);
stream->numOutputSamples = originalNumOutputSamples;
stream->numPitchSamples += numSamples;
return 1;
}

/* Remove processed samples from the pitch buffer. */
static void removePitchSamples(
sonicStream stream,
int numSamples)
{
int numChannels = stream->numChannels;
short *source = stream->pitchBuffer + numSamples*numChannels;

if(numSamples == 0) {
return;
}
if(numSamples != stream->numPitchSamples) {
memmove(stream->pitchBuffer, source, (stream->numPitchSamples -
numSamples)*sizeof(short)*numChannels);
}
stream->numPitchSamples -= numSamples;
}

/* Change the pitch. The latency this introduces could be reduced by looking at
past samples to determine pitch, rather than future. */
static int adjustPitch(
sonicStream stream,
int originalNumOutputSamples)
{
float pitch = stream->pitch;
int numChannels = stream->numChannels;
int period, newPeriod, separation;
int position = 0;
short *out, *rampDown, *rampUp;

if(stream->numOutputSamples == originalNumOutputSamples) {
return 1;
}
if(!moveNewSamplesToPitchBuffer(stream, originalNumOutputSamples)) {
return 0;
}
while(stream->numPitchSamples - position >= stream->maxRequired) {
period = findPitchPeriod(stream, stream->pitchBuffer + position*numChannels);
newPeriod = period/pitch;
if(!enlargeOutputBufferIfNeeded(stream, newPeriod)) {
return 0;
}
out = stream->outputBuffer + stream->numOutputSamples*numChannels;
if(pitch >= 1.0f) {
rampDown = stream->pitchBuffer + position*numChannels;
rampUp = stream->pitchBuffer + (position + period - newPeriod)*numChannels;
overlapAdd(newPeriod, numChannels, out, rampDown, rampUp);
} else {
rampDown = stream->pitchBuffer + position*numChannels;
rampUp = stream->pitchBuffer + position*numChannels;
separation = newPeriod - period;
overlapAddWithSeparation(period, numChannels, separation, out, rampDown, rampUp);
}
stream->numOutputSamples += newPeriod;
position += period;
}
removePitchSamples(stream, position);
return 1;
}

/* Skip over a pitch period, and copy period/speed samples to the output */
static int skipPitchPeriod(
sonicStream stream,
short *samples,
float speed,
int period)
{
long newSamples;
int numChannels = stream->numChannels;

if(speed >= 2.0f) {
newSamples = period/(speed - 1.0f);
} else if(speed > 1.0f) {
newSamples = period;
stream->remainingInputToCopy = period*(2.0f - speed)/(speed - 1.0f);
}
if(!enlargeOutputBufferIfNeeded(stream, newSamples)) {
return 0;
}
overlapAdd(newSamples, numChannels, stream->outputBuffer +
stream->numOutputSamples*numChannels, samples, samples + period*numChannels);
stream->numOutputSamples += newSamples;
return newSamples;
}

/* Insert a pitch period, and determine how much input to copy directly. */
static int insertPitchPeriod(
sonicStream stream,
short *samples,
float speed,
int period)
{
long newSamples;
short *out;
int numChannels = stream->numChannels;

if(speed < 0.5f) {
newSamples = period*speed/(1.0f - speed);
} else {
newSamples = period;
stream->remainingInputToCopy = period*(2.0f*speed - 1.0f)/(1.0f - speed);
}
if(!enlargeOutputBufferIfNeeded(stream, period + newSamples)) {
return 0;
}
out = stream->outputBuffer + stream->numOutputSamples*numChannels;
memcpy(out, samples, period*sizeof(short)*numChannels);
out = stream->outputBuffer + (stream->numOutputSamples + period)*numChannels;
overlapAdd(newSamples, numChannels, out, samples + period*numChannels, samples);
stream->numOutputSamples += period + newSamples;
return newSamples;
}

/* Resample as many pitch periods as we have buffered on the input. Return 0 if
we fail to resize an input or output buffer. Also scale the output by the volume. */
static int changeSpeed(
sonicStream stream,
float speed)
{
short *samples;
int numSamples = stream->numInputSamples;
int position = 0, period, newSamples;
int maxRequired = stream->maxRequired;

if(stream->numInputSamples < maxRequired) {
return 1;
}
do {
if(stream->remainingInputToCopy > 0) {
newSamples = copyInputToOutput(stream, position);
position += newSamples;
} else {
samples = stream->inputBuffer + position*stream->numChannels;
period = findPitchPeriod(stream, samples);
if(speed > 1.0) {
newSamples = skipPitchPeriod(stream, samples, speed, period);
position += period + newSamples;
} else {
newSamples = insertPitchPeriod(stream, samples, speed, period);
position += newSamples;
}
}
if(newSamples == 0) {
return 0; /* Failed to resize output buffer */
}
} while(position + maxRequired <= numSamples);
removeInputSamples(stream, position);
return 1;
}

/* Resample as many pitch periods as we have buffered on the input. Return 0 if
we fail to resize an input or output buffer. Also scale the output by the volume. */
static int processStreamInput(
sonicStream stream)
{
int originalNumOutputSamples = stream->numOutputSamples;
float speed = stream->speed/stream->pitch;

if(speed > 1.00001 || speed < 0.99999) {
changeSpeed(stream, speed);
} else {
if(!copyToOutput(stream, stream->inputBuffer, stream->numInputSamples)) {
return 0;
}
stream->numInputSamples = 0;
}
if(stream->pitch != 1.0f) {
if(!adjustPitch(stream, originalNumOutputSamples)) {
return 0;
}
}
if(stream->volume != 1.0f) {
/* Adjust output volume. */
scaleSamples(stream->outputBuffer + originalNumOutputSamples*stream->numChannels,
(stream->numOutputSamples - originalNumOutputSamples)*stream->numChannels,
stream->volume);
}
return 1;
}

/* Write floating point data to the input buffer and process it. */
int sonicWriteFloatToStream(
sonicStream stream,
float *samples,
int numSamples)
{
if(!addFloatSamplesToInputBuffer(stream, samples, numSamples)) {
return 0;
}
return processStreamInput(stream);
}

/* Simple wrapper around sonicWriteFloatToStream that does the short to float
conversion for you. */
int sonicWriteShortToStream(
sonicStream stream,
short *samples,
int numSamples)
{
if(!addShortSamplesToInputBuffer(stream, samples, numSamples)) {
return 0;
}
return processStreamInput(stream);
}

/* Simple wrapper around sonicWriteFloatToStream that does the unsigned char to float
conversion for you. */
int sonicWriteUnsignedCharToStream(
sonicStream stream,
unsigned char *samples,
int numSamples)
{
if(!addUnsignedCharSamplesToInputBuffer(stream, samples, numSamples)) {
return 0;
}
return processStreamInput(stream);
}

/* This is a non-stream oriented interface to just change the speed of a sound sample */
int sonicChangeFloatSpeed(
float *samples,
int numSamples,
float speed,
float pitch,
float volume,
int sampleRate,
int numChannels)
{
sonicStream stream = sonicCreateStream(sampleRate, numChannels);

sonicSetSpeed(stream, speed);
sonicSetPitch(stream, pitch);
sonicSetVolume(stream, volume);
sonicWriteFloatToStream(stream, samples, numSamples);
sonicFlushStream(stream);
numSamples = sonicSamplesAvailable(stream);
sonicReadFloatFromStream(stream, samples, numSamples);
sonicDestroyStream(stream);
return numSamples;
}

/* This is a non-stream oriented interface to just change the speed of a sound sample */
int sonicChangeShortSpeed(
short *samples,
int numSamples,
float speed,
float pitch,
float volume,
int sampleRate,
int numChannels)
{
sonicStream stream = sonicCreateStream(sampleRate, numChannels);

sonicSetSpeed(stream, speed);
sonicSetPitch(stream, pitch);
sonicSetVolume(stream, volume);
sonicWriteShortToStream(stream, samples, numSamples);
sonicFlushStream(stream);
numSamples = sonicSamplesAvailable(stream);
sonicReadShortFromStream(stream, samples, numSamples);
sonicDestroyStream(stream);
return numSamples;
}

+ 138
- 0
src/sonic.h View File

@@ -0,0 +1,138 @@
/* Sonic library
Copyright 2010
Bill Cox
This file is part of the Sonic Library.

The Sonic Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */

/*
The Sonic Library implements Pitch Based Resampling, which is a new algorithm
invented by Bill Cox for the specific purpose of speeding up speech by high
factors at high quality. It generates smooth speech at speed up factors as high
as 6X, possibly more. It is also capable of slowing down speech, and generates
high quality results regardless of the speed up or slow down factor. For
speeding up speech by 2X or more, the following equation is used:

newSamples = period/(speed - 1.0)
scale = 1.0/newSamples;

where period is the current pitch period, determined using AMDF or any other
pitch estimator, and speed is the speedup factor. If the current position in
the input stream is pointed to by "samples", and the current output stream
position is pointed to by "out", then newSamples number of samples can be
generated with:

out[t] = (samples[t]*(newSamples - t) + samples[t + period]*t)/newSamples;

where t = 0 to newSamples - 1.

For speed factors < 2X, an algorithm similar to PICOLA is used. The above
algorithm is first used to double the speed of one pitch period. Then, enough
input is directly copied from the input to the output to achieve the desired
speed up facter, where 1.0 < speed < 2.0. The amount of data copied is derived:

speed = (2*period + length)/(period + length)
speed*length + speed*period = 2*period + length
length(speed - 1) = 2*period - speed*period
length = period*(2 - speed)/(speed - 1)

For slowing down speech where 0.5 < speed < 1.0, a pitch period is inserted into
the output twice, and length of input is copied from the input to the output
until the output desired speed is reached. The length of data copied is:

length = period*(speed - 0.5)/(1 - speed)

For slow down factors between 0.5 and 0.5, no data is copied, and an algorithm
similar to high speed factors is used.
*/

#ifdef __cplusplus
extern "C" {
#endif

/* This specifies the range of voice pitches we try to match.
Note that if we go lower than 65, we could overflow in findPitchInRange */
#define SONIC_MIN_PITCH 65
#define SONIC_MAX_PITCH 400

/* These are used to down-sample some inputs to improve speed */
#define SONIC_AMDF_FREQ 4000

struct sonicStreamStruct;
typedef struct sonicStreamStruct *sonicStream;

/* For all of the following functions, numChannels is multiplied by numSamples
to determine the actual number of values read or returned. */

/* Create a sonic stream. Return NULL only if we are out of memory and cannot
allocate the stream. Set numChannels to 1 for mono, and 2 for stereo. */
sonicStream sonicCreateStream(int sampleRate, int numChannels);
/* Destroy the sonic stream. */
void sonicDestroyStream(sonicStream stream);
/* Use this to write floating point data to be speed up or down into the stream.
Values must be between -1 and 1. Return 0 if memory realloc failed, otherwise 1 */
int sonicWriteFloatToStream(sonicStream stream, float *samples, int numSamples);
/* Use this to write 16-bit data to be speed up or down into the stream.
Return 0 if memory realloc failed, otherwise 1 */
int sonicWriteShortToStream(sonicStream stream, short *samples, int numSamples);
/* Use this to write 8-bit unsigned data to be speed up or down into the stream.
Return 0 if memory realloc failed, otherwise 1 */
int sonicWriteUnsignedCharToStream(sonicStream stream, unsigned char *samples, int numSamples);
/* Use this to read floating point data out of the stream. Sometimes no data
will be available, and zero is returned, which is not an error condition. */
int sonicReadFloatFromStream(sonicStream stream, float *samples, int maxSamples);
/* Use this to read 16-bit data out of the stream. Sometimes no data will
be available, and zero is returned, which is not an error condition. */
int sonicReadShortFromStream(sonicStream stream, short *samples, int maxSamples);
/* Use this to read 8-bit unsigned data out of the stream. Sometimes no data will
be available, and zero is returned, which is not an error condition. */
int sonicReadUnsignedCharFromStream(sonicStream stream, unsigned char *samples, int maxSamples);
/* Force the sonic stream to generate output using whatever data it currently
has. No extra delay will be added to the output, but flushing in the middle of
words could introduce distortion. */
int sonicFlushStream(sonicStream stream);
/* Return the number of samples in the output buffer */
int sonicSamplesAvailable(sonicStream stream);
/* Get the speed of the stream. */
float sonicGetSpeed(sonicStream stream);
/* Set the speed of the stream. */
void sonicSetSpeed(sonicStream stream, float speed);
/* Get the pitch of the stream. */
float sonicGetPitch(sonicStream stream);
/* Set the pitch of the stream. */
void sonicSetPitch(sonicStream stream, float pitch);
/* Get the scaling factor of the stream. */
float sonicGetVolume(sonicStream stream);
/* Set the scaling factor of the stream. */
void sonicSetVolume(sonicStream stream, float volume);
/* Get the sample rate of the stream. */
int sonicGetSampleRate(sonicStream stream);
/* Get the number of channels. */
int sonicGetNumChannels(sonicStream stream);
/* This is a non-stream oriented interface to just change the speed of a sound
sample. It works in-place on the sample array, so there must be at least
speed*numSamples available space in the array. Returns the new number of samples. */
int sonicChangeFloatSpeed(float *samples, int numSamples, float speed, float pitch,
float volume, int sampleRate, int numChannels);
/* This is a non-stream oriented interface to just change the speed of a sound
sample. It works in-place on the sample array, so there must be at least
speed*numSamples available space in the array. Returns the new number of samples. */
int sonicChangeShortSpeed(short *samples, int numSamples, float speed, float pitch,
float volume, int sampleRate, int numChannels);

#ifdef __cplusplus
}
#endif

+ 2
- 2
src/speak_lib.cpp View File

@@ -528,8 +528,8 @@ static espeak_ERROR Synthesize(unsigned int unique_identifier, const void *text,
}
}
}
}
return(EE_OK);
}
return(EE_OK);
} // end of Synthesize

#ifdef DEBUG_ENABLED

+ 2
- 2
src/synthdata.cpp View File

@@ -35,8 +35,8 @@
#include "translate.h"
#include "wave.h"

const char *version_string = "1.44.13 17.Nov.10";
const int version_phdata = 0x014404;
const char *version_string = "1.44.18 03.Dec.10";
const int version_phdata = 0x014415;

int option_device_number = -1;
FILE *f_logespeak = NULL;

+ 6
- 0
src/tr_languages.cpp View File

@@ -915,6 +915,7 @@ SetLengthMods(tr,3); // all equal

tr->langopts.numbers = NUM_DECIMAL_COMMA | NUM_SWAP_TENS | NUM_OMIT_1_HUNDRED | NUM_ALLOW_SPACE | NUM_1900 | NUM_ORDINAL_DOT;
tr->langopts.ordinal_indicator = "e";
tr->langopts.stress_flags = S_FIRST_PRIMARY;
memcpy(tr->stress_lengths,stress_lengths_nl,sizeof(tr->stress_lengths));
}
break;
@@ -1211,6 +1212,11 @@ SetLengthMods(tr,3); // all equal
}
break;

case L('w','o'):
tr->langopts.stress_rule = STRESSPOSN_1L;
tr->langopts.numbers = NUM_AND_UNITS | NUM_HUNDRED_AND | NUM_OMIT_1_HUNDRED | NUM_OMIT_1_THOUSAND | NUM_SINGLE_STRESS;
break;

case L('z','h'):
case L_zhy:
{

+ 2
- 2
src/translate.cpp View File

@@ -2779,8 +2779,8 @@ if((c == '/') && (tr->langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(pre
// dot after a word, with space following, probably an abbreviation
words[word_count-1].flags |= FLAG_HAS_DOT;

if(IsSpace(next_in))
c = ' '; // remove the dot if it's followed by a space, so that it's not pronounced
if(IsSpace(next_in) || (next_in == '-'))
c = ' '; // remove the dot if it's followed by a space or hyphen, so that it's not pronounced
}
}
else

+ 5
- 2
src/translate.h View File

@@ -145,10 +145,11 @@
#define RULE_CONDITION 5 // followed by condition number (byte)
#define RULE_GROUP_START 6
#define RULE_GROUP_END 7
#define RULE_LINENUM 8 // next 2 bytes give a line number, for debugging purposes
#define RULE_PRE_ATSTART 8 // as RULE_PRE but also match with 'start of word'
#define RULE_LINENUM 9 // next 2 bytes give a line number, for debugging purposes

#define RULE_SPACE 32 // ascii space
#define RULE_SYLLABLE 9 // @
#define RULE_SYLLABLE 21 // @
#define RULE_STRESSED 10 // &
#define RULE_DOUBLE 11 // %
#define RULE_INC_SCORE 12 // +
@@ -342,6 +343,7 @@ typedef struct {
#define S_FINAL_NO_2 0x10
#define S_NO_AUTO_2 0x20
#define S_2_TO_HEAVY 0x40
#define S_FIRST_PRIMARY 0x80
#define S_2_SYL_2 0x1000
#define S_INITIAL_2 0x2000
#define S_NO_AUTO_DIM 0x10000
@@ -353,6 +355,7 @@ typedef struct {
// bit4=don't allow secondary stress on last syllable
// bit5-don't use automatic secondary stress
// bit6=light syllable followed by heavy, move secondary stress to the heavy syllable. LANG=Finnish
// bit7=if more than one primary stress, make the subsequent primaries to secondary stress
// bit8=stress last syllable if it doesn't end in a vowel
// bit9=stress last syllable if it doesn't end in vowel or "s" or "n" LANG=Spanish
// bit12= In a 2-syllable word, if one has primary stress then give the other secondary stress

+ 4
- 3
src/voices.cpp View File

@@ -411,9 +411,9 @@ void VoiceReset(int tone_only)
voice->samplerate = 22050;
memset(voice->klattv,0,sizeof(voice->klattv));

speed.fast_settings[0] = 250;
speed.fast_settings[1] = 600;
speed.fast_settings[2] = 300;
speed.fast_settings[0] = 350;
speed.fast_settings[1] = 800;
speed.fast_settings[2] = 175;

#ifdef PLATFORM_RISCOS
voice->roughness = 1;
@@ -512,6 +512,7 @@ static void PhonemeReplacement(int type, char *p)
static int Read8Numbers(char *data_in,int *data)
{//=============================================
// Read 8 integer numbers
memset(data, 0, 8+sizeof(int));
return(sscanf(data_in,"%d %d %d %d %d %d %d %d",
&data[0],&data[1],&data[2],&data[3],&data[4],&data[5],&data[6],&data[7]));
}

+ 34
- 15
src/wavegen.cpp View File

@@ -286,6 +286,11 @@ void WcmdqStop()
{//=============
wcmdq_head = 0;
wcmdq_tail = 0;
if(sonicSpeedupStream != NULL)
{
sonicDestroyStream(sonicSpeedupStream);
sonicSpeedupStream = NULL;
}
#ifdef USE_PORTAUDIO
Pa_AbortStream(pa_stream);
#endif
@@ -446,6 +451,10 @@ static int WaveCallback(const void *inputBuffer, void *outputBuffer,
fprintf(stderr, "espeak: out of memory\n");
}
outbuffer_size = ix;
out_ptr = NULL;
}
if(out_ptr == NULL)
{
out_ptr = out_start = outbuffer;
out_end = out_start + outbuffer_size;
}
@@ -1974,25 +1983,27 @@ int WavegenFill2(int fill_zeros)


/* Speed up the audio samples with libsonic. */
static int SpeedUp(short *outbuf, int length, int end_of_text)
{//===========================================================
if(sonicSpeedupStream != NULL && sonicGetSpeed(sonicSpeedupStream) != sonicSpeed)
{
sonicDestroyStream(sonicSpeedupStream);
sonicSpeedupStream = NULL;
}
if(sonicSpeedupStream == NULL)
static int SpeedUp(short *outbuf, int length_in, int length_out, int end_of_text)
{//==============================================================================
if(length_in >0)
{
sonicSpeedupStream = sonicCreateStream(sonicSpeed, 22050);
if(sonicSpeedupStream == NULL)
{
sonicSpeedupStream = sonicCreateStream(22050, 1);
}
if(sonicGetSpeed(sonicSpeedupStream) != sonicSpeed)
{
sonicSetSpeed(sonicSpeedupStream, sonicSpeed);
}
sonicWriteShortToStream(sonicSpeedupStream, outbuf, length_in);
}

sonicWriteShortToStream(sonicSpeedupStream, outbuf, length);

if(end_of_text)
{
sonicFlushStream(sonicSpeedupStream);
}
return sonicReadShortFromStream(sonicSpeedupStream, outbuf, length);
return sonicReadShortFromStream(sonicSpeedupStream, outbuf, length_out);
} // end of SpeedUp


@@ -2001,15 +2012,23 @@ int WavegenFill(int fill_zeros)
{//============================
int finished;
unsigned char *p_start;
int length;
int max_length;

p_start = out_ptr;

// fill_zeros is ignored. It is now done in the portaudio cakkback
// fill_zeros is ignored. It is now done in the portaudio callback
finished = WavegenFill2(0);

if(sonicSpeed > 1.0 && out_ptr > p_start)
if(sonicSpeed > 1.0)
{
out_ptr = p_start + 2*SpeedUp((short *)p_start, (out_ptr-p_start)/2, finished);
max_length = (out_end - p_start);
length = 2*SpeedUp((short *)p_start, (out_ptr-p_start)/2, max_length/2, finished);
out_ptr = p_start + length;

if(length >= max_length)
finished = 0; // there may be more data to flush
}
return finished;
} // end of WavegenFill


Loading…
Cancel
Save