Browse Source

[1.46.24]

Changes to: pt, tt, es
Added new language data: ko (Korean)

Phoneme definitions, added new condition: prevVowel()

git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@289 d46cf337-b52f-0410-862d-fd96e6ae7743
master
jonsd 12 years ago
parent
commit
1acf8a12de

+ 20
- 10
dictsource/dict_phonemes View File

@@ -129,15 +129,16 @@ s S t T tS ts v w
x z Z


Dictionary es_dict 2012-09-04
Dictionary es_dict 2012-09-11

@ a aI aU e E eI eU
i o O oI u

: b B d D f g h
j J J^ k l m n N
n^ p Q r R R2 s S
t T tS w x z
: b B d D dZ f g
h j J J^ k l l^ m
n N n^ p Q r R R2
s S t T tS ts w x
z


Dictionary fi_dict 2011-10-14
@@ -202,7 +203,7 @@ q r r. s S s. t T
t. th th. v w x z


Dictionary ta_dict 2012-09-05
Dictionary ta_dict 2012-09-11

a a: aI aU e E e: i
I i: o o: u U u2 u:
@@ -375,7 +376,7 @@ S s; S; t t; tS ts tS;
ts; v w x z Z Z;


Dictionary pt_dict 2012-09-08
Dictionary pt_dict 2012-09-11

& &/ &U~ &~ @ @- a A
aI aU e E eI EI eU EU
@@ -813,12 +814,21 @@ tS ts tS; v x z Z z;
Z;


Dictionary tt_dict 2012-09-09
Dictionary tt_dict 2012-09-11

a A e i I o u V
W y
a A A2 e e2 i I o
u u2 V W y

: ? b d f g h j
k l m n N p q r
R s S S; t w x z
Z Z;


Dictionary ko_dict 2012-06-14

@ a e E i o u u-

* - ; b d dZ; g h
j k k- kh l m n p
p- ph s t t- tS tS; w

+ 31
- 18
dictsource/es_list View File

@@ -158,7 +158,7 @@ _0M1o mil'Esim

vi bi // not a Roman number

// unstressed words
// articles
el $u
el $atend
@@ -224,9 +224,9 @@ vuestra $u
vuestra $atend
vuestras $u
vuestras $atend

// prepositions
a $u // at
a $atend
al $u
al $atend
de $u // of,from
@@ -243,22 +243,32 @@ por $u // for,through,along,via
por $atend
tras $u
tras $atend
ante $u
ante $u $only
ante $atend
para $u // for,in order,by
para $atend
entre $u
entre $atend $capital
entre $atend
sobre $u
sobre $atend
bajo $u
bajo $atend
desde $u // from,since
desde $atend
hasta $u
hasta $atend
hacia $u
hacia $atend
// conjunctions


e $u $only
e $atend
y %i // and
o $u // or
o $atend
u $u
u $atend


aunque $u // although
aunque $atend
@@ -266,6 +276,8 @@ pero $u
pero $atend
porque $u // because
porque $atend


que $u // what
que $atend
cuando $u
@@ -276,15 +288,16 @@ donde $u
donde $atend
como $u
como $atend
quien $u
quien $atend
quienes $u
quienes $atend
mientras $u
mientras $atend
si $u
si $atend
// negative

// auxillary verbs

// some common adjectives and adverbs


// Letters
@@ -315,21 +328,16 @@ x _|Ekis
z TEta

_a a
a a $atend
_e e
e e $atend
_o o
o o $atend
_y igr'iEQa
y igr'iEQa $atend
_y igri'eQa
y igri'eQa $atend
ch tSe
ll EJ^e
?2 ll Ej:e
ll 'El^e
á 'a||aTEntw'aDa
é 'e||aTEntw'aDa
í 'i||aTEntw'aDa
_ó 'o||aTEntw'aDa
ó 'o||aTEntw'aDa $atend
ú 'u||aTEntw'aDa
ü ,uDj'ErEsis

@@ -375,7 +383,7 @@ microsoft m'aIkrosoft
software s'oftwer
hardware h'ardwer
skype sk'aIp
messenger m'esenJer
messenger m'esendZer
live l'aIB
facebook f'eIsbuk
twitter tw'iter
@@ -394,9 +402,14 @@ apple 'ap@l
iphone 'aIfon
(i pod) 'aIpod
ipod 'aIpod
jaws J'os
jaws dZ'os
window w'indow
eyes 'aIs
free fr'i
google g'ug@l
chrome kr'owm
office 'ofis
service s'erBis
power p'awer
thunderbird t'anderbird
jazz dZ'as

+ 34
- 33
dictsource/es_rules View File

@@ -42,7 +42,7 @@

c (Y T // ce, ci
ch tS
A) ck k

.group d
d d
@@ -94,12 +94,12 @@

.group h
h // silent
_) hi (A J^
_) hi (A j


.group i
i i
i (A J^
i (A j
C) i (A j
gu) i (A j
?!3 l) i (A %i
@@ -117,22 +117,19 @@

.group l
l l
_) ll (A J^ // allowe _ll
ll J^
?2 A) ll (A j:
ll (_ l
_) ll (A l^ // allowe _ll
?2 _) ll (A J^
?2 ll j:
?2 n_) ll (A dZ
ll l^



.group m
m m
_) mn (em n

m (K n
m (L04 m
m (_L04 m
m (L05 N
m (_L05 N
m (j N
_) mb (A mb


.group n
@@ -140,9 +137,10 @@
n (L04 m
n (_L04 m
n (L05 N
n (_L05 N
n (_L05 N
n (j N

ny (A n^ // catalan words
_) nh (A n

.group o
o o
@@ -153,13 +151,14 @@
oi oI
oy (K oI
oy (_ 'oI
ou ow

.group p
p p
_) p (L01A p // allow pl pr at start of word
p (t p:
_) ph f
_) ph (A f
ph (@ f
ph (K f
_) ps (i s
_) ps (eudo s
@@ -169,7 +168,8 @@

.group q
q k
qu k
qu (Y k // que, qui
_) qw (A kw // qwerty


.group r
@@ -189,26 +189,28 @@
.group s
s s
&) s (_S1 s
_) s (C@ %Es
ss (K s
_) s (K@ s
ss s
_) sh (A S
_) sh (L01A S
sh (K S
?!1 sc (Y s // sce sci for non castilian accent

.group t
t t
_) t (L01A t // all tr at start of word
_) th (A t
_) th (@ t
th (K t
_) tx (A tS
tx tS


.group u
u u
u (u u
u (A w
!?3 l) u (A %u
!?3 r) u (A %u

g) u (e
g) u (i
g) u (é
@@ -235,25 +237,24 @@ g) u (í

.group x
x ks
?1 A) x (A Qs
x (_ =Qs
_) x ($unpr s // ?
?!1 xc (Y ks // xce xci for non castilian accent

.group y
y i
_) y ($unpr J
_m) y J
n) y J
_l) y J
y (A J^
?2 A) y (A j:
u) y (K j
_m) y (A j
_l) y (A j
y (A j:
_) y (A J^
u) y (K j:
n_) y (A dZ
y (_ i

.group z
z T
?2 z (L02 z
zz ts


.group

+ 126
- 0
dictsource/ko_list View File

@@ -0,0 +1,126 @@
$textmode

_0 ᅧᆼ
_1 ᅵᆯ
_2 ᅵ
_3 삼
_4 사
_5 ᅩ
_6 ᅲᆨ
_7 칠
_8 팔
_9 구
_1X 십
_2X ᅵ십
_3X 삼십
_4X 사십
_5X ᅩ십
_6X ᅲᆨ십
_7X 칠십
_8X 팔십
_9X 구십
_0C 백
_0M1 천
_1M1 천

// 사ᅵ시ᅩᆺ
고랫재 고랟째
귓밥 귇빱
나룻배 나룯빼
나뭇가지 나묻까지
냇가 낻ː까
댓가지 댇까지
뒷갈망 뒫ː깔망
맷돌 맫똘
머릿기름 머릳끼림
모깃불 모ː긷뿔
못자리 몯짜리
바닷가 바닫까
뱃길 밷낄
볏가리 볃까리
부싯돌 부싣똘
선짓국 선짇꾹
쇳조각 쉗쪼각
ᅡ랫집 ᅡ랟찝
ᅮ렁ᅵᆺ속 ᅮ렁ᅵᆮ쏙
ᅵᆺ자국 ᅵᆮ짜국
잿더미 잳떠미
조갯살 조갣쌀
찻집 찯찝
쳇바퀴 첻빠퀴
킷값 킫깝
핏대 핃때
햇볕 핻뼏
혓바늘 혇빠늘
// (2) 뒷말ᅴ 첫소리 'ᄂ, ᄆ' ᅡᇁᅦ서 'ᄂ' 소리가 덧나는 것
멧나물 멘나물
ᅡ랫니 ᅡ랜니
텃마당 턴마당
ᅡ랫마ᅳᆯ ᅡ랜마ᅳᆯ
뒷머리 뒨ː머리
ᅵᆺ몸 ᅵᆫ몸
깻묵 깬묵
냇물 낸ː물
빗물 빈물
// (3) 뒷말ᅴ 첫소리 모ᅳᆷ ᅡᇁᅦ서 'ᄂᄂ' 소리가 덧나는 것
도리깻ᅧᆯ 도리깬녈
뒷ᅲᆾ 뒨ː뉻
두렛ᅵᆯ 두렌닐
뒷ᅵᆯ 뒨ː닐
뒷ᅵᆸ맛 뒨ː님맏
베갯ᅵᆺ 베갠닏
ᅭᆺᅵᆺ ᅭᆫ닏
깻ᅵᇁ 깬닙
나뭇ᅵᇁ 나문닙
댓ᅵᇁ 댄닙
// 2. 순 ᅮ리말과 한자ᅥ로 된 합성ᅥ로서 ᅡᇁ말ᅵ 모ᅳᆷᅳ로 끝난 경ᅮ
// (1) 뒷말ᅴ 첫소리가 된소리로 나는 것
귓병 귇뼝
머릿방 머릳빵
뱃병 밷뼝
봇둑 볻뚝
사잣밥 사ː잗빱
샛강 샏ː깡
ᅡ랫방 ᅡ랟빵
자릿세 자릳쎄
전깃세 전긷쎄
전셋집 전섿찝
찻잔 찯짠
찻종 찯쫑
촛국 촏꾹
콧병 콛뼝
탯줄 탣쭐
텃세 턷쎄
핏기 핃끼
햇수 핻쑤
횟가루 휃까루
횟배 휃빼
// (2) 뒷말ᅴ 첫소리 'ᄂ, ᄆ' ᅡᇁᅦ서 'ᄂ' 소리가 덧나는 것
곗날 곈ː날/겐ː날
제삿날 제ː삳날
훗날 훈ː날
툇마루 퇸ː마루/퉨ː마루
ᅣᆼ칫물 ᅣᆼ친물
// (3) 뒷말ᅴ 첫소리 모ᅳᆷ ᅡᇁᅦ서 'ᄂᄂ' 소리가 덧나는 것
가ᅬᆺᅵᆯ 가ᅬᆫ닐/가ᅰᆫ닐
사삿ᅵᆯ 사산닐
ᅨ삿ᅵᆯ ᅨː산닐
훗ᅵᆯ 훈ː닐
// 3. 두 ᅳᆷ절로 된 다ᅳᆷ 한자ᅥ
곳간 곧깐
셋방 섿빵
숫자 숟짜
찻간 찯깐
툇간 퇻깐
횟수 횓쑤

찻잔 찯짠

ᄉᄇ 시바


+ 286
- 0
dictsource/ko_rules View File

@@ -0,0 +1,286 @@
// This file is UTF8 encoded

.replace

// Note: These specific range of "normalized" unicode characters of Korean are
// hardly used as individually, and look broken and badly aligned in most
// fonts.
// We're using hard tabs so that we can recognize where they are placed at
// the first place.

// Stop finals and their consorts: ㄱㄲㅋ ㄷㅌ ㅂㅍ ㅅㅆㅈㅊ
.L01 ᆨ ᆩ ᆿ ᆮ ᇀ ᆸ ᇁ ᆺ ᆻ ᆽ ᆾ ᆪ ᆹ ᆬ ᆰ ᆱ ᆲ ᆳ ᆴ ᆵ
// i and j-vowels: ㅣ ㅑㅒ ㅕㅖ ㅛㅠ
.L02 ᅵ ᅣ ᅤ ᅧ ᅨ ᅭ ᅲ
// h-finals: ㅎ ㄶㅀ
.L03 ᇂ ᆭ ᆶ

// Initials
// Order: ㄱㄲㅋ ㄷㄸㅌ ㅂㅃㅍ ㅅㅆㅈㅉㅊ ㄴㅁ ㄹ ㅎ

.group ᄀ // ㄱ
ᄀ g
_) ᄀ k
L01) ᄀ k-
L03) ᄀ kh

.group ᄁ // ㄲ
ᄁ k-

.group ᄏ // ㅋ
ᄏ kh

.group ᄃ // ㄷ
ᄃ d
_) ᄃ t
L01) ᄃ t-
L03) ᄃ th

.group ᄄ // ㄸ
ᄄ t-

.group ᄐ // ㅌ
ᄐ th

.group ᄇ // ㅂ
ᄇ b
_) ᄇ p
L01) ᄇ p-
L03) ᄇ ph

.group ᄈ // ㅃ
ᄈ p-

.group ᄑ // ㅍ
ᄑ ph

.group ᄉ // ㅅ
ᄉ s
L01) ᄉ s-

.group ᄊ // ㅆ
ᄊ s- // TODO: phoneme

.group ᄌ // ㅈ
ᄌ dZ;
_) ᄌ tS;
L01) ᄌ tS;-
L03) ᄌ tSh;

.group ᄍ // ㅉ
ᄍ tS;- // TODO: phoneme

.group ᄎ // ㅊ
ᄎ tSh; // TODO: phoneme

.group ᄂ // ㄴ
ᄂ n

.group ᄆ // ㅁ
ᄆ m

.group ᄅ // ㄹ
ᄅ * // TODO: alveolar flap [ɾ]
ᄅ (_ l

.group ᄒ // ㅎ
ᄒ h // TODO: [ɦ]
_) ᄒ h

// Medials

.group ᅡ // ㅏ
ᅡ a

.group ᅢ // ㅐ
ᅢ E

.group ᅣ // ㅑ
ᅣ ja

.group ᅤ // ㅒ
ᅤ jE

.group ᅥ // ㅓ
ᅥ @

.group ᅦ // ㅔ
ᅦ e

.group ᅧ // ㅕ
ᅧ j@

.group ᅨ // ㅖ
ᅨ je

.group ᅩ // ㅗ
ᅩ o

.group ᅪ // ㅘ
ᅪ wa

.group ᅫ // ㅙ
ᅫ wE

.group ᅬ // ㅚ
ᅬ we // was [Y] until 1970s

.group ᅭ // ㅛ
ᅭ jo

.group ᅮ // ㅜ
ᅮ u

.group ᅯ // ㅝ
ᅯ w@

.group ᅰ // ㅞ
ᅰ we

.group ᅱ // ㅟ
ᅱ wi // was [y] until 1970s

.group ᅲ // ㅠ
ᅲ ju

.group ᅳ // ㅡ
ᅳ u-

.group ᅴ // ㅢ
ᅴ u-j // TODO: [ɰi]
C) ᅴ i

.group ᅵ // ㅣ
ᅵ i

// Finals
// Order: ㄱㄳㄲㅋ ㄷㅌ ㅂㅍ ㅅㅆㅈㅊ ㄴㅁ ㅇㅎ ㄹ

.group ᆨ // ㄱ
ᆨ k // TODO: final stops
ᆨᄒ kh

.group ᆪ // ㄳ
ᆪ k
ᆪ (A ks
ᆪᄒ kh

.group ᆩ // ㄲ
ᆩ k
ᆩ (A k-
ᆩᄒ kh // 꺾히다

.group ᆿ // ㅋ
ᆿ k
ᆿ (A kh

.group ᆮ // ㄷ
ᆮ t
ᆮᄂ nn
ᆮᄆ mm
ᆮᄒ th
ᆮ (L02 dZ;

.group ᇀ // ㅌ
ᇀ t
ᇀᄂ nn
ᇀᄆ mm
ᇀ (A th
ᇀ (L02 tSh;

.group ᆸ // ㅂ
ᆸ p
ᆸᄒ ph

.group ᆹ // ㅄ
ᆹ p
ᆹ (A ps-
ᆹᄒ ps-

.group ᇁ // ㅍ
ᇁ p
ᇁ (A ph

.group ᆺ // ㅅ
ᆺ t
ᆺᄂ nn
ᆺᄆ mm
ᆺ (A s
ᆺᄒ s-

.group ᆻ // ㅆ
ᆻ t
ᆻᄂ nn
ᆻᄆ mm
ᆻ (A s-

.group ᆽ // ㅈ
ᆽ t
ᆽᄂ nn
ᆽᄆ mm
ᆽ (A tS;

.group ᆾ // ㅊ
ᆾ t
ᆾᄂ nn
ᆾᄆ mm
ᆾ (A tSh;

.group ᆫ // ㄴ
ᆫ n

.group ᆬ // ㄵ
ᆬ n
ᆬ (A ndZ;

.group ᆭ // ㄶ
ᆭ n
ᆭ (A n // no nh

.group ᆷ // ㅁ
ᆷ m

.group ᆼ // ㅇ
ᆼ ng

.group ᇂ // ㅎ
ᇂ t
ᇂ (A

.group ᆯ // ㄹ
ᆯ l
ᆯᄅ l
ᆯ (A *

.group ᆰ // ㄺ
ᆰ k
ᆰ (A lg

.group ᆱ // ㄻ
ᆱ m
ᆱ (A lm

.group ᆲ // ㄼ
ᆲ p
ᆲ (A lb

.group ᆳ // ㄽ
ᆳ l
ᆳ (A ls

.group ᆴ // ㄾ
ᆴ l
ᆴ (A lth

.group ᆵ // ㄿ
ᆵ p
ᆵ (A lph

.group ᆶ // ㅀ
ᆶ l
ᆶ (A *

.group
.
ː


+ 30
- 4
dictsource/pt_list View File

@@ -651,6 +651,7 @@ albatrozes $alt
alcateia $alt
alferes $alt
algozes $alt
alicerce $alt
amanheça $alt2
amanheço $alt2
amarelo $alt
@@ -659,6 +660,9 @@ amores $alt2
anoiteça $alt2
anoiteço $alt2
apreço $alt2
aperto $alt2 $noun
apoio $alt $verb
aprendeste $alt2
assembleia $alt
atrozes $alt
austera $alt
@@ -685,6 +689,7 @@ cerco $alt $verb
chamego $alt2
chefe $alt
chinelo $alt
choro $alt2 $noun
coco $alt2
cofre $alt
colmeia $alt
@@ -697,6 +702,7 @@ coreia $alt
corneta $alt2
cornos $alt
corpos $alt
correste $alt2
corto $alt
corvos $alt
coto $alt2
@@ -706,32 +712,40 @@ couberdes $alt
couberes $alt
crede $alt2
cresce $alt
crescem $alt
der $alt
desce $alt
descem $alt
descova $alt2
desfecho $alt2
desprezo $alt $verb
deva $alt2
devo $alt2
dez $alt
diarreia $alt
discordo $alt
dobro $alt2 $noun
doce $alt2
droga $alt
endereço $alt2
enumerem $alt
enxerto $alt2 $noun
epopeia $alt
eritreia $alt
erro $alt2 $noun
escopeta $alt2
escroto $alt2
esforço $alt $verb
esforços $alt
esperma $alt
espeto $alt2 $noun
espiroqueta $alt2
estrofe $alt
enterro $alt2 $noun
estiverdes $alt
estiveres $alt
estrofe $alt
etiqueta $alt2
exagero $alt $verb
expeça $alt2
expeço $alt2
farofa $alt
@@ -740,11 +754,13 @@ fere $alt
ferem $alt
fezes $alt
fizer $alt
Fizeram $alt
fizerem $alt
fizerdes $alt
fizeres $alt
fogos $alt
fores $alt2
forro $alt $verb
fosse $alt2
fossem $alt2
foste $alt2
@@ -755,6 +771,7 @@ gelo $alt $verb
germe $alt
gesso $alt2
gonorreia $alt
gozo $alt $verb
grego $alt2
grelha $alt
groselha $alt
@@ -783,7 +800,7 @@ mexo m'eSU
miolo $alt2
modo $alt
modos $alt
molho $alt $verb
molho $alt2 $noun
monera $alt
morcego $alt2
morda $alt2
@@ -796,6 +813,7 @@ muito mw'iNtU // -s is included as a suffix
muita mw'iNt&
mulheres $alt
mureta $alt2
mutreta $alt2
naquele $alt2
negro $alt2
novos $alt
@@ -804,6 +822,7 @@ onu $1
opereta $alt2
osso $alt2
ovos $alt
padeceste $alt2
paexa paeSa
pangeia $alt
palheta $alt2
@@ -828,6 +847,7 @@ porra $alt2
portos $alt
pose $alt2
povos $alt
poxa p'oS&
preta $alt2
preto $alt2
profere $alt
@@ -838,14 +858,19 @@ recordo $alt
recorto $alt
rede $alt2
reforços $alt
refresco $alt $verb
remorso $alt
resolve $alt
resolvem $alt
rixa xiS&
rixa x'iS&
rogas $alt
saleta $alt2
seborreia $alt
seco $alt2 $noun
selo $alt $verb
selvagem seUv'aZeIN
sincera $alt
sincero $alt
sobe $alt
sobem $alt
soco $alt2
@@ -855,6 +880,7 @@ sofreste $alt2
sopre $alt
soprem $alt
sorvete $alt2
sossego $alt2 $noun
souber $alt
souberdes $alt
souberes $alt
@@ -864,7 +890,6 @@ sugerem $alt
suor swOr
tapete $alt2
teta $alt2
tijolo $alt2
tiver $alt
tiveres $alt
toga $alt
@@ -882,6 +907,7 @@ verme $alt
vierem $alt
violeta $alt2
vozes $alt
zelo $alt $verb
zero $alt
zorra $alt2


+ 3
- 6
dictsource/pt_rules View File

@@ -151,8 +151,6 @@
?1 e (_iN =i/ // drop final [i] is next word starts with another i

?1 e (e i //eg: candeeiro
?2 ee i
?2 pr) ee (n ee

?2 el (K EU
e (lh+ e
@@ -342,6 +340,7 @@
_estr) ei (L01_ EI
_inv) e (jL02_ E
_dec) e (pL02_ E
_g) e (rL02_ E
_op) e (rL02_ E
_qu) e (rL02_ E
_alt) e (rL02_ E
@@ -547,11 +546,9 @@ _reapar) e (çL01_ e
oi ($w_alt OI
oi (a_ OI // ??
oi (cA_ OI
oi (de_ OI
oi (s oI
o (iCK o
oo u
oon u~N
c) oo oo
?1 C) oo (_ ow // eg: voo, enjoo, etc...
oy OI

@@ -660,7 +657,7 @@ _reapar) e (çL01_ e
c) o (rrL03_ o // escorra, incorra, corra, recorra
_m) o (rrL03_ o
_ap) oi (L03_ OI
p) o (stos_ O // dispostos etc.
p) ostos (_ Ost=Us# // dispostos etc.

.group ô
ô ''o

+ 2
- 1
dictsource/ta_rules View File

@@ -1888,7 +1888,8 @@ _அகாலி_) த (ள dV
_) தௌலதாப (ாத daUlVd.a:b
_சா) த்த (ியக்கூற dd
_சா) த்த (ியங்கள dd
_சா) த்தியத்த ddijVddV#
_சா) த்த (ியத்த dd
_சா) த்த (ியந் dd
_சா) த்த (ியப்பட dd
_சா) த்த (ியம dd
_) த (்ராட்சை d

+ 1
- 1
dictsource/tt_list View File

@@ -80,4 +80,4 @@ _1M3 milli'Ard
_0M4 billi'on
_1M4 billi'on

_dpt bWt,Wn
_dpt bWt,en

+ 4
- 3
dictsource/tt_rules View File

@@ -21,7 +21,8 @@
д d

.group е
е e // may be [je] [j@]
_) е je2 // may be [je] [jV]
е e

.group ё
ё jo
@@ -119,10 +120,10 @@
э e

.group ю
ю ju // or jy
ю ju2 // or jy

.group я
я jA // or ja
я jA2 // or ja

.group
$ dolAR

+ 22
- 8
phsource/compile_report View File

@@ -1,4 +1,4 @@
82 phoneme tables
83 phoneme tables
new total
base 107 107
consonants 10 116
@@ -81,7 +81,8 @@ consonants 10 116
kk 20 117
fa 9 110
ga 21 125
tt 15 113
tt 18 116
ko 15 114

Data file Used by
b/b [b] base
@@ -198,6 +199,7 @@ dzh/dzh [dZ] base
[dZ] sr
[dZ;] sr
[dZ;] sq
[dZ;] ko
dzh/dzh_ [dZ] base
[dZ;] base
[dZ;] lt
@@ -415,7 +417,7 @@ l/l_ [l] base
[l/] fr
l/l_@ [l/3] base
[l/] fr
l/l@ [h6r] base
l/l@ [hæu] base
[l#] base
[l] fr
[l/2] fr
@@ -449,7 +451,7 @@ l/L2_oL [l/2] base
l/L2_uL [l/2] base
l/l_3 [l/] de
l/l_4 [ll] sq
l/la [h6r] base
l/la [hæu] base
[l#] base
[l] fr
[l/2] fr
@@ -457,7 +459,7 @@ l/la [h6r] base
[K] tn
l/l_a [l/3] base
[l/] fr
l/le [h6r] base
l/le [hæu] base
[l#] base
[l] fr
[l/2] fr
@@ -469,7 +471,7 @@ l/L_eL_af [&] af
[&:] af
l/l_front [L] sq
l/l_front_ [l/4] sq
l/li [h6r] base
l/li [hæu] base
[l#] base
[l] fr
[l/2] fr
@@ -483,7 +485,7 @@ ll/ll [L] bg
ll/_ll [L] bg
l/l_long [l] base
[l] fr
l/lo [h6r] base
l/lo [hæu] base
[l#] base
[l/2] fr
[K] nso
@@ -494,7 +496,7 @@ l^/l_rfx [l.] base
[l;] lt
[l] ru
[l^] ru
l/lu [h6r] base
l/lu [hæu] base
[l#] base
[l] fr
[l/2] fr
@@ -690,7 +692,9 @@ r3/rx [*] base
r3/rz_cs [R^] sk
[R^/] sk
r3/@tap [**] base
[*] ko
r3/@tap2 [**] base
[*] ko
r3/@tap_rfx [r.] base
r/a_ [r] da
r/aa [R] da
@@ -873,6 +877,7 @@ ustop/k_unasp [k] base
[k] sq
[k-] tn
ustop/k_unasp_ [k] zh
[k-] ko
ustop/null [?] base
[t2] hu
ustop/p [p] base
@@ -1007,6 +1012,7 @@ ustop/ts_pzd_ [c2] consonants
ustop/ts_pzd2 [c2] consonants
ustop/ts_pzd3 [tS;] hr
[dZ;] hr
[tS;] ko
ustop/t_sr [d] sr
[t] sr
ustop/ts_rfx [ts.] zh
@@ -1014,6 +1020,7 @@ ustop/ts_rfx_unasp [ts.] zh
ustop/ts_sr [tS;] sr
[dZ;] sr
ustop/ts_unasp [ts] zh
ustop/t_unasp [t-] ko
ustop/t_unasp2 [t] el
[t] zh
vdiph/0i [OI] pt
@@ -1675,6 +1682,7 @@ vowel/aa_8 [0] en-us
[A1] et
[A] nl
[a:] is
[a] ko
vowel/aa_9 [a] fi
[a] et
[a:] hi
@@ -1783,6 +1791,7 @@ vowel/ee_5 [E] en
[E] wo
[E:] wo
[E] tn
[E] ko
vowel/ee_6 [&] sk
[E3] sv
[E] ku
@@ -1934,6 +1943,7 @@ vowel/i_7 [i:] et
[i] sq
vowel/i#_7 [i1] et
[i[] zh
[u-] ko
vowel/i_8 [i] et
[i] fr
[i] ht
@@ -2082,6 +2092,7 @@ vowel/o_6 [O] nl
vowel/o_7 [o] ku
vowel/o_8 [o] fr
[o] ht
[o] ko
vowel/oe [W] af
[W] de
[W] hy
@@ -2151,6 +2162,7 @@ vowel/oo_2 [0] en-sc
[o] cs
[0] da
[O] ak
[@] ko
vowel/oo_3 [O] af
vowel/oo_4 [O] base2
[0] en-wm
@@ -2277,6 +2289,7 @@ vowel/u_bck [u] base2
[u] pa
[u] mt
[u:] ga
[u] ko
vowel/u_bck2 [u] et
[u] fr
[u:] fr
@@ -2621,6 +2634,7 @@ x/dzh_ [dZ] base
[dZ;] ru
x/dz_pzd [dZ;] base
[dZ;] mk
[dZ;] ko
x/g [g] fr
x/g_ [g] base
[g] cy

+ 27
- 0
phsource/mbrola/hn1 View File

@@ -0,0 +1,27 @@

// Korean

0 k- NULL 0 k_>
0 t- NULL 0 t_>
0 * NULL 0 4
0 p- NULL 0 p_>
0 s- NULL 0 s_>
0 tS; NULL 0 ts\
0 tS;- NULL 0 ts\_>
0 tSh; NULL 0 ts\_h
0 k_h NULL 0 ts\_h
0 tSh; NULL 0 ts\_h
0 kh NULL 0 k_h
0 th NULL 0 t_h
0 ph NULL 0 p_h
0 dZ; NULL 0 dz\

0 ng NULL 0 N

0 @ NULL 0 V
0 j@ NULL 0 jV
0 Y NULL 0 2
0 w@ NULL 0 wV
0 u- NULL 0 M
0 u-j NULL 0 M\i


+ 110
- 0
phsource/ph_korean View File

@@ -0,0 +1,110 @@

// vowels

phoneme a // a(ㅏ)
ipa ɐ
vowel starttype #a endtype #a
length 200
FMT(vowel/aa_8)
endphoneme

phoneme E // ae(ㅐ)
ipa ɛ
vowel starttype #e endtype #e
length 200
FMT(vowel/ee_5)
endphoneme

phoneme @ // eo(ㅓ)
ipa ʌ
vowel starttype #@ endtype #@
length 200
FMT(vowel/oo_2)
endphoneme

phoneme o // o(ㅗ)
ipa o
vowel starttype #o endtype #o
length 200
FMT(vowel/o_8)
endphoneme

phoneme u // u(ㅜ)
ipa u
vowel starttype #u endtype #u
length 200
FMT(vowel/u_bck)
endphoneme

phoneme u- // eu(ㅡ)
ipa ɯ
vowel starttype #u endtype #u
length 200
FMT(vowel/i#_7)
endphoneme

// diphthongs


// consonants

phoneme k- // /ㄲ/
vls vel stop
lengthmod 3
Vowelin f1=1 f2=1700 0 200 f3=-300 80 f4
Vowelout f1=1 f2=1700 0 200 f3=-300 80 f4 rms=30
WAV(ustop/k_unasp_, 75)
length 100
endphoneme

phoneme kh // /ㅋ/
import_phoneme consonants/kh
endphoneme

phoneme t- // /ㄸ/
vls alv stop
lengthmod 3
Vowelin f1=0 f2=1700 -300 300 f3=-100 80 rms=40
Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
WAV(ustop/t_unasp, 40) // TODO
endphoneme

// TODO: ㅌ

phoneme p- // /ㅃ/
import_phoneme consonants/p-
endphoneme

phoneme ph // /ㅍ/
import_phoneme consonants/ph
endphoneme

phoneme tS; // voiceless /ㅈ/
vls pla afr sibilant palatal
ipa tɕ
lengthmod 2
Vowelin f1=0 f2=2700 400 600 f3=300 80
WAV(ustop/ts_pzd3)
endphoneme

phoneme dZ; // voiced /ㅈ/
vcd pla afr sibilant palatal
ipa dʑ
lengthmod 2
Vowelin f1=0 f2=2700 400 600 f3=300 80
FMT(dzh/dzh) addWav(x/dz_pzd)
endphoneme

phoneme * // r(ㄹ) at initial, medial
vcd alv flp rhotic
ipa ɾ
lengthmod 3
Vowelout f1=3 f2=1600 -300 300 f3=-300 80 rms=35 len=15
Vowelin f1=2 f2=1600 -300 300 f3=-100 80 len=20

IF prevPh(#i) OR prevPh(#e) THEN
FMT(r3/@tap2)
ENDIF
FMT(r3/@tap)
endphoneme


+ 37
- 8
phsource/ph_tatar View File

@@ -1,12 +1,15 @@


// use 'flag1' for front vowels

phoneme i
vowel starttype #i endtype #i
vowel flag1 starttype #i endtype #i
length 180
FMT(vowel/i)
endphoneme

phoneme y
vowel starttype #u endtype #u
vowel flag1 starttype #u endtype #u
length 180
FMT(vowel/y)
endphoneme
@@ -17,16 +20,34 @@ phoneme u
FMT(vowel/u)
endphoneme

phoneme u2 // letter 'ю'
vowel starttype #u endtype #u
length 180
IF prevVowel(isFlag1) OR nextVowel(isFlag1) THEN
ChangePhoneme(y)
ELSE
ChangePhoneme(u)
ENDIF
endphoneme

phoneme e
vowel starttype #@ endtype #@
vowel flag1 starttype #@ endtype #@
length 100
FMT(vowel/ii#)
endphoneme

phoneme W
phoneme e2 // 'e' at start of word
vowel starttype #@ endtype #@
length 100
IF nextVowel(isFlag1) THEN
ChangePhoneme(e)
ENDIF
ChangePhoneme(V)
endphoneme

phoneme W
vowel flag1 starttype #@ endtype #@
length 100
FMT(vowel/oe)
endphoneme

@@ -44,7 +65,7 @@ endphoneme


phoneme a
vowel starttype #a endtype #a
vowel flag1 starttype #a endtype #a
length 180
FMT(vowel/&_2)
endphoneme
@@ -55,22 +76,30 @@ phoneme A
IF thisPh(isFirstVowel) THEN
ChangePhoneme(0)
ENDIF
IF thisPh(isSeqFlag1) THEN
IF prevVowel(0) THEN
ChangePhoneme(0)
ENDIF
FMT(vowel/aa)
endphoneme

phoneme A2 // letter 'я'
vowel starttype #a endtype #a
length 180
IF prevVowel(isFlag1) OR nextVowel(isFlag1) THEN
ChangePhoneme(a)
ENDIF
ChangePhoneme(A)
endphoneme

phoneme 0
vowel starttype #o endtype #o
flag1
length 180
FMT(vowel/0_3)
endphoneme


phoneme I
vowel starttype #i endtype #i
vowel flag1 starttype #i endtype #i
length 100
FMT(vowel/ii)
endphoneme

+ 4
- 0
phsource/phonemes View File

@@ -1900,3 +1900,7 @@ include ph_irish

phonemetable tt base
include ph_tatar

phonemetable ko base
include ph_korean


+ 57
- 44
src/compiledata.cpp View File

@@ -90,17 +90,18 @@ static keywtab_t k_conditions[] = {
{"AND", 0, k_AND},
{"OR", 0, k_OR},
{"THEN", 0, k_THEN},
{"prevPh", tWHICH_PHONEME, 0x000},
{"prevPhW", tWHICH_PHONEME, 0x500},
{"thisPh", tWHICH_PHONEME, 0x100},
{"nextPh", tWHICH_PHONEME, 0x200},
{"next2Ph", tWHICH_PHONEME, 0x300},
{"nextPhW", tWHICH_PHONEME, 0x400},
{"nextVowel",tWHICH_PHONEME, 0x600},
// {"next2PhW", tWHICH_PHONEME, 0x700},
{"prevPh", tWHICH_PHONEME, 0},
{"prevPhW", tWHICH_PHONEME, 5},
{"thisPh", tWHICH_PHONEME, 1},
{"nextPh", tWHICH_PHONEME, 2},
{"next2Ph", tWHICH_PHONEME, 3},
{"nextPhW", tWHICH_PHONEME, 4},
{"next2PhW", tWHICH_PHONEME, 6},
{"nextVowel",tWHICH_PHONEME, 7},
{"prevVowel",tWHICH_PHONEME, 8},
// {"next2PhW", tWHICH_PHONEME, 0x800},

// {"numVowels", tTEST, 0x000},
// {"afterStress", tTEST, 0x000},

{"PreVoicing", tTEST, 0xf01},
{"KlattSynth", tTEST, 0xf02},
@@ -605,7 +606,7 @@ return;
case 13:
case 14:
case 15:
address = ((instn & 0xf) << 16) + *pc++;
address = ((instn & 0xf) << 16) + *pc++;
fprintf(f_out, " %d %.5x",(instn >> 4) & 0xff,address*4);
break;
}
@@ -770,7 +771,7 @@ static void CompileReport(void)
}
n = ix;
qsort((void *)list,n,sizeof(REF_HASH_TAB *),(int (*)(const void *,const void *))ref_sorter);
data_path = "";
prev_mnemonic = 0;
prev_table = 0;
@@ -1197,7 +1198,7 @@ static int LookupPhoneme(const char *string, int control)

// don't use phoneme number 0, reserved for string terminator
start = 1;
if(control==2)
start = 8; // don't look for control and stress phonemes (allows these characters to be
// used for other purposes)
@@ -1267,12 +1268,12 @@ static int NextItem(int type)
int sign;
char *p;
keywtab_t *pk;
item_type = -1;

f_in_displ = ftell(f_in);
f_in_linenum = linenum;
while(!feof(f_in))
{
c = get_char();
@@ -1592,7 +1593,7 @@ int LoadSpect(const char *path, int control)

wxString filename = path_phsource + path_sep + wxString(path,wxConvLocal);
wxFileInputStream stream(filename);
if(stream.Ok() == FALSE)
{
error("Failed to open: '%s'",path);
@@ -1616,7 +1617,7 @@ int LoadSpect(const char *path, int control)
seq_out.sqflags=0;
seq_out.length_total=0;

total = 0;
total = 0;
for(frame=0; frame < spectseq->numframes; frame++)
{

@@ -1650,7 +1651,7 @@ for(ix=0; ix<8; ix++)
seq_out.n_frames++;
if(frame > 0)
total += spectseq->frames[frame-1]->length;
}
}
}
seq_out.length_total = int(total);

@@ -1665,7 +1666,7 @@ for(ix=0; ix<8; ix++)
for(frame=0; frame < spectseq->numframes; frame++)
{
fr = spectseq->frames[frame];
if(fr->keyframe)
{
if(klatt_flag)
@@ -1756,7 +1757,7 @@ for(ix=0; ix<8; ix++)
n_frames++;
}
}
if(klatt_flag)
{
seqk_out.n_frames = seq_out.n_frames;
@@ -1799,7 +1800,7 @@ static int LoadWavefile(FILE *f, const char *fname)
fseek(f,24,SEEK_SET);
sr1 = Read4Bytes(f);
sr2 = Read4Bytes(f);
fseek(f,40,SEEK_SET);
fseek(f,40,SEEK_SET);

if((sr1 != samplerate_native) || (sr2 != sr1*2))
{
@@ -1828,7 +1829,7 @@ static int LoadWavefile(FILE *f, const char *fname)
return(0);
}
}
f = fopen(fname_temp,"rb");
if(f == NULL)
{
@@ -2078,7 +2079,7 @@ static int LoadDataFile(const char *path, int control)
if(addr == 0)
{
sprintf(buf,"%s%s",path_source,path);
if((f = fopen(buf,"rb")) == NULL)
{
sprintf(buf,"%s%s.wav",path_source,path);
@@ -2091,7 +2092,7 @@ static int LoadDataFile(const char *path, int control)

id = Read4Bytes(f);
rewind(f);
if(id == 0x43455053)
{
addr = LoadSpect(path, control);
@@ -2121,7 +2122,7 @@ static int LoadDataFile(const char *path, int control)
addr = -1;
}
fclose(f);
if(addr > 0)
{
fprintf(f_phcontents,"%c 0x%.5x %s\n",type_code,addr & 0x7fffff,path);
@@ -2188,7 +2189,7 @@ static int CompileToneSpec(void)
*prog_out++ = i_AMPENV + ((amp_env >> 16) & 0xf);
*prog_out++ = amp_env;
}
return(0);
} // end of CompileToneSpec

@@ -2217,7 +2218,7 @@ int CompileSound(int keyword, int isvowel)
{
value = -128;
error("Parameter < -128",NULL);
}
}
}
else
{
@@ -2256,6 +2257,7 @@ int CompileIf(int elif)
int key;
int finish = 0;
int word = 0;
int word2 = 0;
int data;
int bitmap;
int brackets;
@@ -2274,10 +2276,18 @@ int CompileIf(int elif)

if((key = NextItem(tCONDITION)) < 0)
error("Expected a condition, not '%s'",item_string);
if(item_type == tWHICH_PHONEME)
{
// prevPh(), thisPh(), nextPh(), next2Ph()
// prevPh(), thisPh(), nextPh(), next2Ph() etc
if(key >= 6)
{
// put the 'which' code in the next instruction
word2 = key;
key = 6;
}
key = key << 8;

data = NextItemBrackets(tPROPERTIES,0);
if(data >= 0)
{
@@ -2320,6 +2330,9 @@ int CompileIf(int elif)
prog_last_if = prog_out;
*prog_out++ = word | i_CONDITION;

if(word2 != 0)
*prog_out++ = word2;

// expect AND, OR, THEN
switch(NextItem(tCONDITION))
{
@@ -2416,7 +2429,7 @@ int CompileElse(void)
{
ref = prog_out;
*prog_out++ = 0;
if((p = if_stack[if_level].p_else) != NULL)
{
*ref = ref - p; // backwards offset to the previous else
@@ -2461,14 +2474,14 @@ int CompileEndif(void)
do
{
chain = *p; // a chain of previous else links
offset = prog_out - p;
if(offset > MAX_JUMP)
{
error("IF block is too long",NULL);
}
*p = i_JUMP + offset;
p -= chain;
} while (chain > 0);
}
@@ -2489,7 +2502,7 @@ static int CompileSwitch(int type)
// check the instructions in the Switch
return(0);
}
// count_VowelStart = 0;
// count_VowelEnding = 0;

@@ -2664,7 +2677,7 @@ int CompilePhoneme(int compile_phoneme)
phoneme_flags = 0;
place_articulation = 0;

NextItem(tSTRING);
NextItem(tSTRING);
if(compile_phoneme)
{
phcode = LookupPhoneme(item_string,1); // declare phoneme if not already there
@@ -2825,7 +2838,7 @@ int CompilePhoneme(int compile_phoneme)
phcode = LookupPhoneme(item_string,1);
phoneme_out->start_type = phcode;
break;
case kENDTYPE:
phcode = NextItem(tPHONEMEMNEM);
if(phcode == -1)
@@ -2882,7 +2895,7 @@ int CompilePhoneme(int compile_phoneme)
case kSWITCH_PREVVOWEL:
endphoneme = CompileSwitch(1);
break;
case kSWITCH_NEXTVOWEL:
endphoneme = CompileSwitch(2);
break;
@@ -2908,7 +2921,7 @@ int CompilePhoneme(int compile_phoneme)
DecThenCount();
endphoneme = CompileSound(keyword,0);
break;
case kVOWELIN:
DecThenCount();
endphoneme = CompileVowelTransition(1);
@@ -2968,7 +2981,7 @@ int CompilePhoneme(int compile_phoneme)
}
phoneme_out->phflags = place_articulation << 16;
phoneme_out->phflags |= phoneme_flags;
if(phoneme_out->phflags & phVOICED)
{
if(phoneme_out->type == phSTOP)
@@ -2977,15 +2990,15 @@ int CompilePhoneme(int compile_phoneme)
if(phoneme_out->type == phFRICATIVE)
phoneme_out->type = phVFRICATIVE;
}
if(phoneme_out->std_length == 0)
{
if(phoneme_out->type == phVOWEL)
phoneme_out->std_length = 180/2; // default length for vowel
}
phoneme_out->phflags |= phLOCAL; //declared in this phoneme table
if(phoneme_out->type == phDELETED)
{
phoneme_out->mnemonic = 0x01; // will not be recognised
@@ -3334,7 +3347,7 @@ static void CompilePhonemeFiles()
stack[stack_ix].linenum = linenum;
strcpy(stack[stack_ix].fname,current_fname);
stack[stack_ix++].file = f_in;
f_in = f;
strncpy0(current_fname,item_string,sizeof(current_fname));
linenum = 1;
@@ -3382,7 +3395,7 @@ static void CompilePhonemeData2(const char *source)
wxString report_dict;

#ifdef MAKE_ENVELOPES
make_envs();
make_envs();
#endif

n_envelopes = 0;
@@ -3525,7 +3538,7 @@ fprintf(f_errors,"\nRefs %d, Reused %d\n",count_references,duplicate_references
{
strncpy0(fname,(report+report_dict).mb_str(wxConvLocal),sizeof(fname));
fprintf(stderr,"%s\n",fname);
}
} // end of CompilePhonemeData

@@ -3605,7 +3618,7 @@ void CompileMbrola()
wxLogError(_T("Can't write to: ")+wxString(buf,wxConvLocal));
return;
}
data[count].name = 0; // list terminator
Write4Bytes(f_out, mbrola_ctrl);


+ 38
- 38
src/dictionary.cpp View File

@@ -18,7 +18,7 @@
***************************************************************************/

#include "StdAfx.h"
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
@@ -218,7 +218,7 @@ static void InitGroups(Translator *tr)
{
if(tr->groups2_start[c] == 255)
tr->groups2_start[c] = tr->n_groups2;
tr->groups2_count[c]++;
tr->groups2[tr->n_groups2] = p;
tr->groups2_name[tr->n_groups2++] = (c + (c2 << 8));
@@ -489,7 +489,7 @@ sprintf(outptr,"* ");
continue; /* indicates unrecognised phoneme */
if((ph = phoneme_tab[phcode]) == NULL)
continue;
if((ph->type == phSTRESS) && (ph->std_length <= 4) && (ph->program == 0))
{
if(ph->std_length > 1)
@@ -499,7 +499,7 @@ sprintf(outptr,"* ");
{
mnem = ph->mnemonic;

while((c = (mnem & 0xff)) != 0)
while((c = (mnem & 0xff)) != 0)
{
*outptr++ = c;
mnem = mnem >> 8;
@@ -565,7 +565,7 @@ char *WritePhMnemonic(char *phon_out, PHONEME_TAB *ph, PHONEME_LIST *plist, int
}
else
{
InterpretPhoneme(NULL, 0, plist, &phdata);
InterpretPhoneme(NULL, 0, plist, &phdata, NULL);
}

len = strlen(phdata.ipa_string);
@@ -638,7 +638,7 @@ void GetTranslatedPhonemeString(char *phon_out, int n_phon_out, int use_ipa)
char *buf;
char phon_buf[30];
PHONEME_LIST *plist;
static const char *stress_chars = "==,,''";

if(phon_out != NULL)
@@ -694,7 +694,7 @@ void GetTranslatedPhonemeString(char *phon_out, int n_phon_out, int use_ipa)
buf = WritePhMnemonic(buf, phoneme_tab[plist->tone_ph], NULL, use_ipa);
}
}
len = buf - phon_buf;
max_len = (n_phon_out - phon_out_ix - 5); // allow for " ..." and zero byte terminator
if(len > max_len)
@@ -939,7 +939,7 @@ static int GetVowelStress(Translator *tr, unsigned char *phonemes, signed char *
max_stress = 4;
primary_posn = j;
}
/* reduce any preceding primary stress markers */
for(ix=1; ix<j; ix++)
{
@@ -1166,7 +1166,7 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags,

max_output = output + (N_WORD_PHONEMES-3); /* check for overrun */

// any stress position marked in the xx_list dictionary ?
// any stress position marked in the xx_list dictionary ?
stressed_syllable = dflags & 0x7;
if(dflags & 0x8)
{
@@ -1217,7 +1217,7 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags,
ix++;
}
}
switch(tr->langopts.stress_rule)
{
case 8:
@@ -1275,12 +1275,12 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags,
mnem = phoneme_tab[final_ph]->mnemonic;
mnem2 = phoneme_tab[final_ph2]->mnemonic;

if((mnem == 's') && (mnem2 == 'n'))
if((mnem == 's') && (phoneme_tab[final_ph2]->type == phNASAL))
{
// -ns stress remains on penultimate syllable
}
else
if(((mnem != 'n') && (mnem != 's')) || (phoneme_tab[final_ph2]->type != phVOWEL))
if(((phoneme_tab[final_ph]->type != phNASAL) && (mnem != 's')) || (phoneme_tab[final_ph2]->type != phVOWEL))
{
stressed_syllable = vowel_count - 1;
}
@@ -1710,7 +1710,7 @@ void AppendPhonemes(Translator *tr, char *string, int size, const char *ph)
/* Add new phoneme string "ph" to "string"
Keeps count of the number of vowel phonemes in the word, and whether these
can be stressed syllables. These values can be used in translation rules
*/
*/
const char *p;
unsigned char c;
int unstress_mark;
@@ -1748,7 +1748,7 @@ void AppendPhonemes(Translator *tr, char *string, int size, const char *ph)
}
}
}
if(string != NULL)
strcat(string,ph);
} /* end of AppendPhonemes */
@@ -1843,7 +1843,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
match.points = 1;
match.end_type = 0;
match.del_fwd = NULL;
pre_ptr = *word;
post_ptr = *word + group_length;

@@ -1909,7 +1909,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
case RULE_CONDITION:
/* conditional rule, next byte gives condition number */
condition_num = *rule++;
if(condition_num >= 32)
{
// allow the rule only if the condition number is NOT set
@@ -2017,7 +2017,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
else
failed = 1;
break;
case RULE_NONALPHA:
if(!iswalpha(letter_w))
{
@@ -2388,13 +2388,13 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_
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
@@ -2490,10 +2490,10 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c
p = p_start;
tr->word_vowel_count = 0;
tr->word_stressed_count = 0;
if(end_phonemes != NULL)
end_phonemes[0] = 0;
while(((c = *p) != ' ') && (c != 0))
{
wc_bytes = utf8_in(&wc,p);
@@ -2511,7 +2511,7 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c
string[1+wc_bytes] = 0;
Lookup(tr, string,buf);
if(++digit_count >= 2)
{
{
strcat(buf,str_pause);
digit_count=0;
}
@@ -2538,7 +2538,7 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c
/* there are some 2 byte chains for this initial letter */
c2 = p[1];
c12 = c + (c2 << 8); /* 2 characters */
g1 = tr->groups2_start[c];
for(g=g1; g < (g1+n); g++)
{
@@ -2563,7 +2563,7 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c
}
}
}
if(!found)
{
/* alphabetic, single letter chain */
@@ -2619,14 +2619,14 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c
p[-1] = ix;
while((p[0] = p[n]) != ' ') p++;
while(n-- > 0) *p++ = ' '; // replacement character must be no longer than original
if(tr->langopts.param[LOPT_DIERESES] && (lookupwchar(diereses_list,letter) > 0))
{
// vowel with dieresis, replace and continue from this point
p = p2;
continue;
}
phonemes[0] = 0; // delete any phonemes which have been produced so far
p = p_start;
tr->word_vowel_count = 0;
@@ -2685,7 +2685,7 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c

if(match1.phonemes == NULL)
match1.phonemes = "";
if(match1.points > 0)
{
if(word_flags & FLAG_UNPRON_TEST)
@@ -2888,7 +2888,7 @@ int TransposeAlphabet(Translator *tr, char *text)
if(bits >= 8)
{
bits -= 8;
*p2++ = (acc >> bits);
*p2++ = (acc >> bits);
}
}
if(bits > 0)
@@ -3206,7 +3206,7 @@ static const char *LookupDict2(Translator *tr, const char *word, const char *wor

if(flags != NULL)
flags[0] |= FLAG_FOUND; // this flag indicates word was found in dictionary
if(option_phonemes == 2)
{
char ph_decoded[N_WORD_PHONEMES];
@@ -3344,9 +3344,9 @@ int LookupDictList(Translator *tr, char **wordptr, char *ph_out, unsigned int *f
if(found == 0)
{
ph_out[0] = 0;
// try modifications to find a recognised word
if((end_flags & FLAG_SUFX_E_ADDED) && (word[length-1] == 'e'))
{
// try removing an 'e' which has been added by RemoveEnding
@@ -3439,7 +3439,7 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy)
This routine is language specific. In English it deals with reversing y->i and e-dropping
that were done when the suffix was added to the original word.
*/
int i;
char *word_end;
int len_ending;
@@ -3447,7 +3447,7 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy)
const char *p;
int len;
static char ending[12];
// these lists are language specific, but are only relevent if the 'e' suffix flag is used
static const char *add_e_exceptions[] = {
"ion", NULL };
@@ -3476,7 +3476,7 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy)
len_ending++;
}
}
// remove bytes from the end of the word and replace them by spaces
for(i=0; i<len_ending; i++)
{
@@ -3487,17 +3487,17 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy)
word_end--; /* now pointing at last character of stem */

end_flags = (end_type & 0xfff0) | FLAG_SUFX;
/* add an 'e' to the stem if appropriate,
if stem ends in vowel+consonant
or stem ends in 'c' (add 'e' to soften it) */
if(end_type & SUFX_I)
{
if(word_end[0] == 'i')
word_end[0] = 'y';
}
if(end_type & SUFX_E)
{
if(tr->translator_name == L('n','l'))
@@ -3517,7 +3517,7 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy)
if(IsLetter(tr, word_end[-1],LETTERGP_VOWEL2) && IsLetter(tr, word_end[0],1))
{
// vowel(incl.'y') + hard.consonant
for(i=0; (p = add_e_exceptions[i]) != NULL; i++)
{
len = strlen(p);

+ 13
- 11
src/phonemelist.cpp View File

@@ -63,24 +63,24 @@ static int SubstitutePhonemes(Translator *tr, PHONEME_LIST *plist_out)
{
if(ix < (n_ph_list2 -1))
next = phoneme_tab[ph_list2[ix+1].phcode];
word_end = 0;
if((plist2+1)->sourceix || ((next != 0) && (next->type == phPAUSE)))
word_end = 1; // this phoneme is the end of a word
// check whether a Voice has specified that we should replace this phoneme
for(k=0; k<n_replace_phonemes; k++)
{
if(plist2->phcode == replace_phonemes[k].old_ph)
{
replace_flags = replace_phonemes[k].type;
if((replace_flags & 1) && (word_end == 0))
continue; // this replacement only occurs at the end of a word
if((replace_flags & 2) && ((plist2->stresslevel & 0x7) > 3))
continue; // this replacement doesn't occur in stressed syllables
// substitute the replacement phoneme
plist2->phcode = replace_phonemes[k].new_ph;
if((plist2->stresslevel > 1) && (phoneme_tab[plist2->phcode]->phflags & phUNSTRESSED))
@@ -88,7 +88,7 @@ static int SubstitutePhonemes(Translator *tr, PHONEME_LIST *plist_out)
break;
}
}
if(plist2->phcode == 0)
{
continue; // phoneme has been replaced by NULL, so don't copy it
@@ -131,7 +131,9 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence)
PHONEME_LIST ph_list3[N_PHONEME_LIST];

PHONEME_LIST2 *plist2;
WORD_PH_DATA worddata;

memset(&worddata, 0, sizeof(worddata));
plist2 = ph_list2;
phlist = phoneme_list;
end_sourceix = plist2[n_ph_list2-1].sourceix;
@@ -339,7 +341,7 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence)

if(ph == NULL) continue;

InterpretPhoneme(tr, 0x100, plist3, &phdata);
InterpretPhoneme(tr, 0x100, plist3, &phdata, &worddata);

if((alternative = phdata.pd_param[pd_INSERTPHONEME]) > 0)
{
@@ -363,7 +365,7 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence)

// re-interpret the changed phoneme
// But it doesn't obey a second ChangePhoneme()
InterpretPhoneme(tr, 0x100, plist3, &phdata);
InterpretPhoneme(tr, 0x100, plist3, &phdata, &worddata);
}

if((alternative = phdata.pd_param[pd_CHANGEPHONEME]) > 0)
@@ -388,7 +390,7 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence)

// re-interpret the changed phoneme
// But it doesn't obey a second ChangePhoneme()
InterpretPhoneme(tr, 0x100, plist3, &phdata);
InterpretPhoneme(tr, 0x100, plist3, &phdata, &worddata);
}

if(ph->type == phVOWEL)
@@ -478,7 +480,7 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence)
else
insert_ph = phonPAUSE_VSHORT;
}
if((ph->type == phVOWEL) && ((x = tr->langopts.vowel_pause & 0x03) != 0))
{
// adjacent vowels over a word boundary
@@ -487,7 +489,7 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence)
else
insert_ph = phonPAUSE_VSHORT;
}
if(((plist3+1)->stresslevel >= 4) && (tr->langopts.vowel_pause & 0x100))
{
// pause before a words which starts with a stressed vowel

+ 12
- 12
src/synth_mbrola.cpp View File

@@ -77,7 +77,7 @@ HINSTANCE hinstDllMBR = NULL;
BOOL load_MBR()
{
if(hinstDllMBR != NULL)
return TRUE; // already loaded
return TRUE; // already loaded

if ((hinstDllMBR=LoadLibraryA("mbrola.dll")) == 0)
return FALSE;
@@ -150,14 +150,14 @@ espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int
}
}
}
close_MBR();
close_MBR();
#endif
#ifdef PLATFORM_WINDOWS
if(load_MBR() == FALSE) // load mbrola.dll
{
fprintf(stderr, "Can't load mbrola.dll\n");
return(EE_INTERNAL_ERROR);
}
}
#endif

if(init_MBR(path) != 0) // initialise the required mbrola voice
@@ -169,14 +169,14 @@ espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int
sprintf(path,"%s/mbrola_ph/%s",path_home,phtrans);
size = GetFileLength(path);
if((f_in = fopen(path,"rb")) == NULL) {
close_MBR();
close_MBR();
return(EE_NOT_FOUND);
}

if((mbrola_tab = (MBROLA_TAB *)realloc(mbrola_tab,size)) == NULL)
{
fclose(f_in);
close_MBR();
close_MBR();
return(EE_INTERNAL_ERROR);
}

@@ -190,7 +190,7 @@ espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int
fclose(f_in);

setVolumeRatio_MBR((float)(mbrola_control & 0xff) /16.0f);
// srate = getFreq_MBR();
// srate = getFreq_MBR();
samplerate = srate;
if(srate == 22050)
SetParameter(espeakVOICETYPE,0,0);
@@ -543,7 +543,7 @@ int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbr

if(released == 0)
p->synthflags |= SFLAG_NEXT_PAUSE;
InterpretPhoneme(NULL, 0, p, &phdata);
InterpretPhoneme(NULL, 0, p, &phdata, NULL);
len = DoSample3(&phdata, 0, -1);

len = (len * 1000)/samplerate; // convert to mS
@@ -556,7 +556,7 @@ int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbr

case phFRICATIVE:
len = 0;
InterpretPhoneme(NULL, 0, p, &phdata);
InterpretPhoneme(NULL, 0, p, &phdata, NULL);
if(p->synthflags & SFLAG_LENGTHEN)
len = DoSample3(&phdata, p->length, -1); // play it twice for [s:] etc.
len += DoSample3(&phdata, p->length, -1);
@@ -568,7 +568,7 @@ int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbr
if(next->type != phVOWEL)
{
memset(&fmtp, 0, sizeof(fmtp));
InterpretPhoneme(NULL, 0, p, &phdata);
InterpretPhoneme(NULL, 0, p, &phdata, NULL);
fmtp.fmt_addr = phdata.sound_addr[pd_FMT];
len = DoSpect2(p->ph, 0, &fmtp, p, -1);
// len = DoSpect(p->ph,prev->ph,phoneme_tab[phonPAUSE],2,p,-1);
@@ -601,7 +601,7 @@ int MbrolaTranslate(PHONEME_LIST *plist, int n_phonemes, int resume, FILE *f_mbr

if(pause)
{
len += PauseLength(pause,0);
len += PauseLength(pause,0);
ptr += sprintf(ptr,"_ \t%d\n",PauseLength(pause,0));
pause = 0;
}
@@ -655,7 +655,7 @@ int MbrolaGenerate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)
int again = MbrolaTranslate(phoneme_list, *n_ph, resume, f_mbrola);
if (!again)
*n_ph = 0;
return again;
return again;
}


@@ -710,7 +710,7 @@ void MbrolaReset(void)

espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int srate)
{
return(EE_INTERNAL_ERROR);
return(EE_INTERNAL_ERROR);
}

int MbrolaGenerate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)

+ 110
- 50
src/synthdata.cpp View File

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

const char *version_string = "1.46.23 09.Sep.12";
const int version_phdata = 0x014600;
const char *version_string = "1.46.24 11.Sep.12";
const int version_phdata = 0x014624;

int option_device_number = -1;
FILE *f_logespeak = NULL;
@@ -80,7 +80,7 @@ static char *ReadPhFile(void *ptr, const char *fname, int *size)

sprintf(buf,"%s%c%s",path_home,PATHSEP,fname);
length = GetFileLength(buf);
if((f_in = fopen(buf,"rb")) == NULL)
{
fprintf(stderr,"Can't read data file: '%s'\n",buf);
@@ -89,7 +89,7 @@ static char *ReadPhFile(void *ptr, const char *fname, int *size)

if(ptr != NULL)
Free(ptr);
if((p = Alloc(length)) == NULL)
{
fclose(f_in);
@@ -230,7 +230,7 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params,
SPECT_SEQK *seqk, *seqk2;
frame_t *frame;
static frameref_t frames_buf[N_SEQ_FRAMES];
seq = (SPECT_SEQ *)(&phondata_ptr[fmt_params->fmt_addr]);
seqk = (SPECT_SEQK *)seq;
nf = seq->n_frames;
@@ -268,7 +268,7 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params,
nf -= seq_break;
}
}
// do we need to modify a frame for blending with a consonant?
if((this_ph->type == phVOWEL) && (fmt_params->fmt2_addr == 0) && (fmt_params->use_vowelin))
{
@@ -286,7 +286,7 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params,
// add these spectra to the main sequence
seq2 = (SPECT_SEQ *)(&phondata_ptr[fmt_params->fmt2_addr]);
seqk2 = (SPECT_SEQK *)seq2;
// first frame of the addition just sets the length of the last frame of the main seq
nf--;
for(ix=0; ix<seq2->n_frames; ix++)
@@ -306,7 +306,7 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params,
}
wavefile_ix = 0;
}
if(length1 > 0)
{
if(which==2)
@@ -324,7 +324,7 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params,


length_factor = (length_std * 256)/ length1;
for(ix=0; ix<nf1; ix++)
{
frames[ix].length = (frames[ix].length * length_factor)/256;
@@ -362,7 +362,7 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params,
}
}
}
*n_frames = nf;
return(frames);
} // end of LookupSpect
@@ -562,7 +562,7 @@ static bool StressCondition(Translator *tr, PHONEME_LIST *plist, int condition,
// change phoneme. Don't change phonemes which are given for the word in the dictionary.
return(false);
}
if((tr->langopts.param[LOPT_REDUCE] & 0x2) && (stress_level >= pl->wordstress))
{
// treat the most stressed syllable in an unstressed word as stressed
@@ -607,69 +607,107 @@ static int CountVowelPosition(PHONEME_LIST *plist)
} // end of CoundVowelPosition


static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist, int instn)
{//========================================================================================
static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist, USHORT *p_prog, WORD_PH_DATA *worddata)
{//========================================================================================================================
int which;
unsigned int data;
int instn;
int instn2;
int count;
PHONEME_TAB *ph;
PHONEME_LIST *plist_this;
static int ph_position[8] = {0, 1, 2, 3, 2, 0, 1, 3}; // prevPh, thisPh, nextPh, next2Ph, nextPhW, prevPhW, nextVowel, (other conditions)

// instruction: 2xxx, 3xxx

// bits 8-10 = 0 to 6, which phoneme
// bits 8-10 = 0 to 5, which phoneme, =6 the 'which' information is in the next instruction.
// bit 11 = 0, bits 0-7 are a phoneme code
// bit 11 = 1, bits 5-7 type of data, bits 0-4 data value

// bits 8-10 = 7, other conditions

instn = (*p_prog) & 0xfff;
data = instn & 0xff;
instn2 = instn >> 8;

if(instn2 < 14)
{
plist_this = plist;
which = (instn2) % 7;

if(which==6)
{
// the 'which' code is in the next instruction
p_prog++;
which = (*p_prog);
}

if(which==4)
{
// nextPh not word boundary
// nextPhW not word boundary
if(plist[1].sourceix)
return(false);
}
if(which==5)
{
// prevPh, not word boundary
// prevPhW, not word boundary
if(plist[0].sourceix)
return(false);
}
if(which==6)
{
{
// next2PhW, not word boundary
if(plist[1].sourceix || plist[2].sourceix)
return(false);
}


switch(which)
{
case 0: // prevPh
case 5: // prevPhW
plist--;
break;

case 1: // thisPh
break;

case 2: // nextPh
case 4: // nextPhW
plist++;
break;

case 3: // next2Ph
case 6: // next2PhW
plist += 2;
break;

case 7:
// nextVowel, not word boundary
for(which=2;;which++)
for(which=1;;which++)
{
if(plist[which-1].sourceix)
if(plist[which].sourceix)
return(false);
if(phoneme_tab[plist[which-1].phcode]->type == phVOWEL)
if(phoneme_tab[plist[which].phcode]->type == phVOWEL)
{
plist = &plist[which];
break;
}
}
}
else
{
which = ph_position[which];
}
break;

plist_this = plist;
plist = &plist[which-1];
case 8: // prevVowel in this word
if((worddata==NULL) || (worddata->prev_vowel.ph == NULL))
return(false); // no previous vowel
plist = &(worddata->prev_vowel);
break;
}

if(which == 0)
if((which == 0) || (which == 5))
{
if(plist->phcode == 1)
{
// This is a NULL phoneme, a phoneme has been deleted so look at the previous phoneme
plist = &plist[-1];
plist--;
}
}

@@ -739,7 +777,7 @@ static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist,
plist--;
if((plist->stresslevel & 0xf) >= 4)
return(true);
} while (plist->sourceix == 0);
break;

@@ -814,8 +852,8 @@ static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist,
} // end of InterpretCondition


static void SwitchVowelType(PHONEME_LIST *plist, PHONEME_DATA *phdata, USHORT **p_prog, int instn_type)
{//=====================================================================================================
static void SwitchOnVowelType(PHONEME_LIST *plist, PHONEME_DATA *phdata, USHORT **p_prog, int instn_type)
{//========================================================================================================
USHORT *prog;
int voweltype;
signed char x;
@@ -848,18 +886,27 @@ static int NumInstnWords(USHORT *prog)
int instn;
int instn2;
int instn_type;
static char n_words[11] = {1,1,1,1,1,1,1,1,1,2,4};
int n;
static const char n_words[16] = {1,1,0,0,1,1,1,1,1,2,4,0,0,0,0,0};

instn = *prog;
instn_type = instn >> 12;
if(instn_type < 11)
return(n_words[instn_type]);
if((n = n_words[instn_type]) > 0)
return(n);

if(instn_type < 4)
{
// a condition, check for a 2-word instruction
if(((n = instn & 0x0f00) == 0x600) || (n == 0x0d00))
return(2);
return(1);
}

// 11 to 15, 2 words
// instn_type 11 to 15, 2 words
instn2 = prog[2];
if((instn2 >> 12) == 0xf)
{
// addWav(), 2 more words
// This instruction is followed by addWav(), 2 more words
return(4);
}
if(instn2 == i_CONTINUE)
@@ -871,8 +918,8 @@ static int NumInstnWords(USHORT *prog)



void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_DATA *phdata)
{//==========================================================================================
void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_DATA *phdata, WORD_PH_DATA *worddata)
{//===================================================================================================================
// control:
//bit 0: PreVoicing
//bit 8: change phonemes
@@ -893,6 +940,12 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_

ph = plist->ph;

if((worddata != NULL) && (plist->sourceix))
{
// start of a word, reset word data
worddata->prev_vowel.ph = NULL;
}

memset(phdata, 0, sizeof(PHONEME_DATA));
phdata->pd_param[i_SET_LENGTH] = ph->std_length;
phdata->pd_param[i_LENGTH_MOD] = ph->length_mod;
@@ -901,13 +954,13 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_
return;

end_flag = 0;
for(prog = &phoneme_index[ph->program]; end_flag != 1; prog++)
{
instn = *prog;
instn2 = (instn >> 8) & 0xf;
or_flag = 0;
switch(instn >> 12)
{
case 0: // 0xxx
@@ -992,11 +1045,13 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_
{
// process a sequence of conditions, using boolean accumulator
if(or_flag)
truth = (truth || InterpretCondition(tr, control, plist, instn & 0xfff));
truth = (truth || InterpretCondition(tr, control, plist, prog, worddata));
else
truth = (truth && InterpretCondition(tr, control, plist, instn & 0xfff));
truth = (truth && InterpretCondition(tr, control, plist, prog, worddata));
or_flag = instn & 0x1000;
instn = *(++prog);
prog += NumInstnWords(prog);
instn = *prog;
// instn = *(++prog);
}

if(truth == false)
@@ -1010,7 +1065,7 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_
// instruction after a condition is not JUMP_FALSE, so skip the instruction.
prog += NumInstnWords(prog);
if((prog[0] & 0xfe00) == 0x6000)
prog++; // and skip ELSE jump
prog++; // and skip ELSE jump
}
}
prog--;
@@ -1029,11 +1084,11 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_
break;

case 5: // NexttVowelStarts
SwitchVowelType(plist, phdata, &prog, 2);
SwitchOnVowelType(plist, phdata, &prog, 2);
break;

case 6: // PrevVowelTypeEndings
SwitchVowelType(plist, phdata, &prog, 3);
SwitchOnVowelType(plist, phdata, &prog, 3);
break;
}
break;
@@ -1130,6 +1185,11 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_
}
}

if((worddata != NULL) && (plist->type == phVOWEL))
{
memcpy(&worddata->prev_vowel, &plist[0], sizeof(PHONEME_LIST));
}

} // end of InterpretPhoneme


@@ -1150,5 +1210,5 @@ void InterpretPhoneme2(int phcode, PHONEME_DATA *phdata)
plist[1].ph = phoneme_tab[phcode];
plist[2].sourceix = 1;

InterpretPhoneme(NULL, 0, &plist[1], phdata);
InterpretPhoneme(NULL, 0, &plist[1], phdata, NULL);
} // end of InterpretPhoneme2

+ 20
- 18
src/synthesize.cpp View File

@@ -483,7 +483,7 @@ static void set_frame_rms(frame_t *fr, int new_rms)
}
return;
}
if(fr->rms == 0) return; // check for divide by zero
x = (new_rms * 64)/fr->rms;
if(x >= 200) x = 199;
@@ -507,7 +507,7 @@ static void formants_reduce_hf(frame_t *fr, int level)

if(voice->klattv[0])
return;
for(ix=2; ix < 8; ix++)
{
x = fr->fheight[ix] * level;
@@ -594,7 +594,7 @@ static void AdjustFormants(frame_t *fr, int target, int min, int max, int f1_adj
fr->ffreq[1] += x;
fr->ffreq[0] += x;
}
formants_reduce_hf(fr,hf_reduce);
formants_reduce_hf(fr,hf_reduce);
}


@@ -717,7 +717,7 @@ if(voice->klattv[0])
fr = CopyFrame(seq[n_frames-1].frame,0);
seq[n_frames-1].frame = fr;
rms = RMS_GLOTTAL1;
// degree of glottal-stop effect depends on closeness of vowel (indicated by f1 freq)
modn_flags = 0x400 + (VowelCloseness(fr) << 8);
}
@@ -726,7 +726,7 @@ if(voice->klattv[0])
fr = DuplicateLastFrame(seq,n_frames++,len);
if(len > 36)
seq_len_adjust += (len - 36);
if(f2 != 0)
{
AdjustFormants(fr, f2, f2_min, f2_max, f1, f3_adj, f3_amp, flags);
@@ -741,7 +741,7 @@ if(voice->klattv[0])
{
fr = CopyFrame(seq[ix].frame,0);
seq[ix].frame = fr;
for(formant=1; formant<=5; formant++)
{
int x;
@@ -1182,7 +1182,7 @@ if(which==1)
q[1] = len + (modulation << 16);
q[2] = (long64)frame1;
q[3] = (long64)frame2;
WcmdqInc();
}
last_frame = frame1 = frame2;
@@ -1348,6 +1348,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)
PHONEME_DATA phdata_next;
PHONEME_DATA phdata_tone;
FMT_PARAMS fmtp;
static WORD_PH_DATA worddata;

if(option_quiet)
return(0);
@@ -1372,6 +1373,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)
syllable_centre = -1;
last_pitch_cmd = -1;
memset(vowel_transition,0,sizeof(vowel_transition));
memset(&worddata, 0, sizeof(worddata));
DoPause(0,0); // isolate from the previous clause
}

@@ -1463,13 +1465,13 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)
if(released == 0)
p->synthflags |= SFLAG_NEXT_PAUSE;

InterpretPhoneme(NULL, 0, p, &phdata);
InterpretPhoneme(NULL, 0, p, &phdata, &worddata);
phdata.pd_control |= pd_DONTLENGTHEN;
DoSample3(&phdata, 0, 0);
break;

case phFRICATIVE:
InterpretPhoneme(NULL, 0, p, &phdata);
InterpretPhoneme(NULL, 0, p, &phdata, &worddata);

if(p->synthflags & SFLAG_LENGTHEN)
{
@@ -1509,7 +1511,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)
if((prev->type==phVOWEL) || (prev->ph->phflags & phVOWEL2) || (ph->phflags & phPREVOICE))
{
// a period of voicing before the release
InterpretPhoneme(NULL, 0x01, p, &phdata);
InterpretPhoneme(NULL, 0x01, p, &phdata, &worddata);
fmtp.fmt_addr = phdata.sound_addr[pd_FMT];
fmtp.fmt_amp = phdata.sound_param[pd_FMT];

@@ -1537,7 +1539,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)
{
p->synthflags |= SFLAG_NEXT_PAUSE;
}
InterpretPhoneme(NULL,0, p, &phdata);
InterpretPhoneme(NULL,0, p, &phdata, &worddata);
fmtp.fmt_addr = phdata.sound_addr[pd_FMT];
fmtp.fmt_amp = phdata.sound_param[pd_FMT];
fmtp.wav_addr = phdata.sound_addr[pd_ADDWAV];
@@ -1582,7 +1584,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)
{
p->synthflags |= SFLAG_NEXT_PAUSE;
}
InterpretPhoneme(NULL,0, p, &phdata);
InterpretPhoneme(NULL,0, p, &phdata, &worddata);
memset(&fmtp, 0, sizeof(fmtp));
fmtp.std_length = phdata.pd_param[i_SET_LENGTH]*2;
fmtp.fmt_addr = phdata.sound_addr[pd_FMT];
@@ -1608,7 +1610,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)
last_frame = NULL;
}

InterpretPhoneme(NULL,0, p, &phdata);
InterpretPhoneme(NULL,0, p, &phdata, &worddata);
fmtp.std_length = phdata.pd_param[i_SET_LENGTH]*2;
fmtp.fmt_addr = phdata.sound_addr[pd_FMT];
fmtp.fmt_amp = phdata.sound_param[pd_FMT];
@@ -1653,7 +1655,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)
{
StartSyllable();
}
InterpretPhoneme(NULL, 0, p, &phdata);
InterpretPhoneme(NULL, 0, p, &phdata, &worddata);
fmtp.std_length = phdata.pd_param[i_SET_LENGTH]*2;
fmtp.fmt_addr = phdata.sound_addr[pd_FMT];
fmtp.fmt_amp = phdata.sound_param[pd_FMT];
@@ -1669,7 +1671,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)

memset(&fmtp, 0, sizeof(fmtp));

InterpretPhoneme(NULL, 0, p, &phdata);
InterpretPhoneme(NULL, 0, p, &phdata, &worddata);
fmtp.std_length = phdata.pd_param[i_SET_LENGTH] * 2;

if(((fmtp.fmt_addr = phdata.sound_addr[pd_VWLSTART]) != 0) && ((phdata.pd_control & pd_FORNEXTPH) == 0))
@@ -1681,7 +1683,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)
if(prev->type != phPAUSE)
{
// check the previous phoneme
InterpretPhoneme(NULL, 0, prev, &phdata_prev);
InterpretPhoneme(NULL, 0, prev, &phdata_prev, NULL);
if((fmtp.fmt_addr = phdata_prev.sound_addr[pd_VWLSTART]) != 0)
{
// a vowel start has been specified by the Vowel program
@@ -1763,7 +1765,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)
if(next->type != phPAUSE)
{
fmtp.fmt2_lenadj = 0;
InterpretPhoneme(NULL, 0, next, &phdata_next);
InterpretPhoneme(NULL, 0, next, &phdata_next, NULL);

fmtp.use_vowelin = 1;
fmtp.transition0 = phdata_next.vowel_transition[2]; // always do vowel_transition, even if ph_VWLEND ?? consider [N]
@@ -1939,7 +1941,7 @@ int SpeakNextClause(FILE *f_in, const void *text_in, int control)
if(option_phonemes > 0)
{
fprintf(f_trans,"%s\n",translator->phon_out);
if(!iswalpha(0x010d))
{
// check that c-caron is recognized as an alphabetic character

+ 4
- 1
src/synthesize.h View File

@@ -265,6 +265,9 @@ typedef struct {
int std_length;
} FMT_PARAMS;

typedef struct {
PHONEME_LIST prev_vowel;
} WORD_PH_DATA;

// instructions

@@ -417,7 +420,7 @@ typedef struct {
unsigned char split_tail_start;
unsigned char split_tail_end;
unsigned char split_tune;
unsigned char spare[8];
int spare2; // the struct length should be a multiple of 4 bytes
} TUNE;

+ 12
- 12
src/translate.h View File

@@ -18,7 +18,7 @@
***************************************************************************/


#define L(c1,c2) (c1<<8)+c2 // combine two characters into an integer for translator name
#define L(c1,c2) (c1<<8)+c2 // combine two characters into an integer for translator name

#define CTRL_EMBEDDED 0x01 // control character at the start of an embedded command
#define REPLACED_E 'E' // 'e' replaced by silent e
@@ -29,7 +29,7 @@
#define N_RULE_GROUP2 120 // max num of two-letter rule chains
#define N_HASH_DICT 1024
#define N_CHARSETS 20
#define N_LETTER_GROUPS 95 // maximum is 127-32
#define N_LETTER_GROUPS 95 // maximum is 127-32


/* dictionary flags, word 1 */
@@ -52,7 +52,7 @@
#define FLAG_STEM 0x40000 // must have a suffix

#define FLAG_DOUBLING 0x80000 // doubles the following consonant
#define BITNUM_FLAG_ALT 19 // bit number of FLAG_ALT_TRANS - 1
#define BITNUM_FLAG_ALT 19 // bit number of FLAG_ALT_TRANS - 1
#define FLAG_ALT_TRANS 0x100000 // language specific
#define FLAG_ALT2_TRANS 0x200000 // language specific
#define FLAG_ALT3_TRANS 0x400000 // language specific
@@ -110,7 +110,7 @@
#define FLAG_MULTIPLE_SPACES 0x40000 // word is preceded by multiple spaces, newline, or tab
#define FLAG_INDIVIDUAL_DIGITS 0x80000 // speak number as individual digits
#define FLAG_DELETE_WORD 0x100000 // don't speak this word, it has been spoken as part of the previous word
#define FLAG_CHAR_REPLACED 0x200000 // characters have been replaced by .replace in the *_rules
#define FLAG_CHAR_REPLACED 0x200000 // characters have been replaced by .replace in the *_rules

#define FLAG_SUFFIX_VOWEL 0x08000000 // remember an initial vowel from the suffix
#define FLAG_NO_TRACE 0x10000000 // passed to TranslateRules() to suppress dictionary lookup printout
@@ -235,7 +235,7 @@ typedef struct {
int end_type;
char *del_fwd;
} MatchRecord;

// used to mark words with the source[] buffer
typedef struct{
@@ -377,7 +377,7 @@ typedef struct {
// bit20= hyphenated words, 2nd part is unstressed
// bit21= don't lengthen vowels at end-of-clause

int stress_flags;
int stress_flags;
int unstressed_wd1; // stress for $u word of 1 syllable
int unstressed_wd2; // stress for $u word of >1 syllable
int param[N_LOPTS];
@@ -542,18 +542,18 @@ typedef struct

// groups1 and groups2 are indexes into data_dictrules, set up by InitGroups()
// the two-letter rules for each letter must be consecutive in the language_rules source
char *groups1[256]; // translation rule lists, index by single letter
char *groups3[128]; // index by offset letter
char *groups2[N_RULE_GROUP2]; // translation rule lists, indexed by two-letter pairs
unsigned int groups2_name[N_RULE_GROUP2]; // the two letter pairs for groups2[]
int n_groups2; // number of groups2[] entries used
unsigned char groups2_count[256]; // number of 2 letter groups for this initial letter
unsigned char groups2_start[256]; // index into groups2
const short *frequent_pairs; // list of frequent pairs of letters, for use in compressed *_list
int expect_verb;
int expect_past; // expect past tense
int expect_verb_s;
@@ -563,7 +563,7 @@ typedef struct

int word_vowel_count; // number of vowels so far
int word_stressed_count; // number of vowels so far which could be stressed
int clause_upper_count; // number of upper case letters in the clause
int clause_lower_count; // number of lower case letters in the clause

@@ -685,7 +685,7 @@ void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *t
int ReadClause(Translator *tr, FILE *f_in, char *buf, short *charix, int *charix_top, int n_buf, int *tone_type, char *voice_change);

void SetVoiceStack(espeak_VOICE *v, const char *variant_name);
void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_DATA *phdata);
void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_DATA *phdata, WORD_PH_DATA *worddata);
void InterpretPhoneme2(int phcode, PHONEME_DATA *phdata);
char *WritePhMnemonic(char *phon_out, PHONEME_TAB *ph, PHONEME_LIST *plist, int use_ipa);


Loading…
Cancel
Save