mirror of
https://github.com/rhasspy/espeak-ng.git
synced 2026-10-31 05:35:35 +00:00
[1.39.28]
Added experimental Klatt synthesizer. Klatt phonemes use a new format of phoneme data. espeakedit, new dialog fields and layout for Klatt phonemes. Added Klatt versions of English phonemes. Fixed some compilation warnings on Windows. Fixed bug in Lettergroups > L10 Increased amplitude of harmonics below F1 peak, to increase bass. Allow 5 (up from 4) pairs of values in "tone" command in voice files. Default to slightly wider pk_shape1. If words are separated by hyphens, don't add word-gap, and don't pass new-word flag onto phoneme processing. git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@203 d46cf337-b52f-0410-862d-fd96e6ae7743
This commit is contained in:
+4
-1
@@ -1,4 +1,4 @@
|
||||
//maintainer: Willem van der Walt
|
||||
//maintainer: Willem van der Walt
|
||||
// email: wvdwalt@csir.co.za
|
||||
// tel: +27 12 8413996
|
||||
// Meraka Institute, CSIR
|
||||
@@ -103,6 +103,9 @@ _rng 'A:nb&l
|
||||
_stk str'e@p
|
||||
_tld t'Ild@
|
||||
|
||||
// symbols
|
||||
⅓ d&:rd@
|
||||
⅔ tw,e@d'&:rd@s
|
||||
|
||||
// numeric
|
||||
_0 'nWl
|
||||
|
||||
+64
-64
@@ -28,6 +28,18 @@ r. s S s. t t. t.h th
|
||||
tS x z
|
||||
|
||||
|
||||
Dictionary ca_dict
|
||||
|
||||
@ a a# aI e E i o
|
||||
O u U
|
||||
|
||||
* ** : b B d D dZ;
|
||||
f g j J J^ k l l^
|
||||
m n N n^ p Q r R
|
||||
R2 s S; t T tS ts tS;
|
||||
v v# w z Z Z;
|
||||
|
||||
|
||||
Dictionary cs_dict
|
||||
|
||||
@- a a: aU e e: eI eU
|
||||
@@ -109,10 +121,10 @@ Dictionary eo_dict
|
||||
@- a aI aU e eI eU i
|
||||
o oI u uI
|
||||
|
||||
* b d dZ f g h j
|
||||
k l m n p r R s
|
||||
S t T tS ts v w x
|
||||
z Z
|
||||
* - b d dZ f g h
|
||||
j k l m n p r R
|
||||
s S t T tS ts v w
|
||||
x z Z
|
||||
|
||||
|
||||
Dictionary es_dict
|
||||
@@ -200,6 +212,16 @@ N n^ p R R2 s S s2
|
||||
t tS ts v z Z
|
||||
|
||||
|
||||
Dictionary hy_dict
|
||||
|
||||
@ a aI e eI i i@ o
|
||||
u W y
|
||||
|
||||
** b d dZ f g h j
|
||||
k l m n p R3 s S
|
||||
t tS ts v x z Z
|
||||
|
||||
|
||||
Dictionary id_dict
|
||||
|
||||
@ a aI aU e E E2 i
|
||||
@@ -246,6 +268,19 @@ s S t tS v w x z
|
||||
Z
|
||||
|
||||
|
||||
Dictionary kn_dict
|
||||
|
||||
a a: aI aU e E e: i
|
||||
I i: o o: r- u u: V
|
||||
y
|
||||
|
||||
: b c ch d d. dZ f
|
||||
g h j J k kh l l.
|
||||
m n N n. n^ p ph R
|
||||
R2 s S s. S; t t. t.h
|
||||
th tS v w z
|
||||
|
||||
|
||||
Dictionary ko_dict
|
||||
|
||||
a e E i ji o u u-
|
||||
@@ -279,6 +314,18 @@ g h j k l m n N
|
||||
p r R s t w z
|
||||
|
||||
|
||||
Dictionary lv_dict
|
||||
|
||||
a a: ai au e e: ei i
|
||||
i: ie iu o o: u u: ui
|
||||
uo
|
||||
|
||||
: b c d dZ f g h
|
||||
j J k l l^ m n n^
|
||||
p r R R2 s S t tS
|
||||
ts v x z Z
|
||||
|
||||
|
||||
Dictionary mk_dict
|
||||
|
||||
& @ @- @2 a A a: E
|
||||
@@ -344,6 +391,17 @@ k l m n N p r R
|
||||
s S s; t v w x z
|
||||
|
||||
|
||||
Dictionary om_dict
|
||||
|
||||
@# a a: E e I I# i:
|
||||
O o: U u:
|
||||
|
||||
** : a# b B c` d d`
|
||||
dZ f g h j k k` l
|
||||
m n n^ p p` R s S
|
||||
t t` tS v w z
|
||||
|
||||
|
||||
Dictionary pl_dict
|
||||
|
||||
@- a E E# E~ i O O~
|
||||
@@ -423,8 +481,8 @@ t t; tS ts v x z Z
|
||||
|
||||
Dictionary sq_dict
|
||||
|
||||
@ a A e E i O u
|
||||
V y yE
|
||||
@ a A aI e E i O
|
||||
u V y yE
|
||||
|
||||
* ** b c d D dZ f
|
||||
g h j J k l ll m
|
||||
@@ -511,61 +569,3 @@ oi ong ou u ui yu
|
||||
b c d f g h j k
|
||||
l m n N p r s t
|
||||
tS v w z
|
||||
|
||||
|
||||
Dictionary lv_dict
|
||||
|
||||
a a: ai au e e: ei i
|
||||
i: ie iu o o: u u: ui
|
||||
uo
|
||||
|
||||
: b c d dZ f g h
|
||||
j J k l l^ m n n^
|
||||
p r R R2 s S t tS
|
||||
ts v x z Z
|
||||
|
||||
|
||||
Dictionary hy_dict
|
||||
|
||||
@ a aI e eI i i@ o
|
||||
u W y
|
||||
|
||||
** b d dZ f g h j
|
||||
k l m n p R3 s S
|
||||
t tS ts v x z Z
|
||||
|
||||
|
||||
Dictionary kn_dict
|
||||
|
||||
a a: aI aU e E e: i
|
||||
I i: o o: r- u u: V
|
||||
y
|
||||
|
||||
: b c ch d d. dZ f
|
||||
g h j J k kh l l.
|
||||
m n N n. n^ p ph R
|
||||
R2 s S s. S; t t. t.h
|
||||
th tS v w z
|
||||
|
||||
|
||||
Dictionary om_dict
|
||||
|
||||
@# a a: E e I I# i:
|
||||
O o: U u:
|
||||
|
||||
** : a# b B c` d d`
|
||||
dZ f g h j k k` l
|
||||
m n n^ p p` R s S
|
||||
t t` tS v w z
|
||||
|
||||
|
||||
Dictionary ca_dict
|
||||
|
||||
@ a a# aI e E i o
|
||||
O u U
|
||||
|
||||
* ** : b B d D dZ;
|
||||
f g j J J^ k l l^
|
||||
m n N n^ p Q r R
|
||||
R2 s S; t T tS ts tS;
|
||||
v v# w z Z Z;
|
||||
|
||||
+12
-2
@@ -28,7 +28,7 @@ e i:
|
||||
f Ef
|
||||
g dZi:
|
||||
h eItS
|
||||
_i aI
|
||||
i aI
|
||||
j dZeI
|
||||
k keI
|
||||
l El
|
||||
@@ -191,17 +191,22 @@ _₠ jU@roU
|
||||
® rEdZIst3d
|
||||
° dIgr'i:z
|
||||
− maIn@s
|
||||
± plVs@maIn@s
|
||||
± plVsO@m'aIn@s
|
||||
µ maIkroU
|
||||
¼ a2kwO@t3
|
||||
½ a2hA:f
|
||||
¾ Tri:kwO@t3
|
||||
⅓ w0nT'3:d
|
||||
⅔ tu:T'3:dz
|
||||
× taImz
|
||||
÷ dI2v'aIdbaI
|
||||
€ jU@roUz
|
||||
♯ SA@p
|
||||
♭ flat
|
||||
¬ n0t_|saIn
|
||||
√ skw,e@r'u:t
|
||||
∞ Inf'InI2tI2
|
||||
≠ n0t'i:kw@LtU
|
||||
|
||||
ß S,A@p'Es
|
||||
ə SwA:
|
||||
@@ -1091,6 +1096,7 @@ galore ga2lo@
|
||||
gases gasI2z
|
||||
gauche goUS
|
||||
gauge geIdZ
|
||||
gecko gEkoU
|
||||
geese gi:s
|
||||
gemini dZEmI2naI
|
||||
geni dZi:nI
|
||||
@@ -2144,6 +2150,7 @@ wretched rEtSI2d
|
||||
writable raIt@b@L
|
||||
writh raID
|
||||
wrongdoing r0Ndu:I2N
|
||||
wuss wUs
|
||||
|
||||
xmas Eksma2s
|
||||
|
||||
@@ -2445,6 +2452,7 @@ Emma Em@
|
||||
Evan Ev@n
|
||||
Gary garI
|
||||
Geraint gEraInt
|
||||
Gibbs gIbz
|
||||
Giles gaIlz
|
||||
Glynn glIn
|
||||
Graeme greI@m
|
||||
@@ -2465,7 +2473,9 @@ Isiah aIz'aI@
|
||||
Ivan aIv@n
|
||||
Jacob dZeIk@b
|
||||
Jamie dZeImI
|
||||
Jacques Zak
|
||||
Jesus dZi:z@s
|
||||
Jonah dZoUn@
|
||||
José hoUs'eI
|
||||
Jose hoUs'eI
|
||||
Juan hwA:n
|
||||
|
||||
+7
-3
@@ -159,12 +159,13 @@
|
||||
h) a (z eI
|
||||
h) a (zar 'a
|
||||
l) a (z eI
|
||||
r) a (z eI
|
||||
r) a (zA eI
|
||||
@) a (zi_ 'A:
|
||||
br) a (zil a
|
||||
bl) a (zon eI
|
||||
r) a (zor eI
|
||||
sw) a (B 0
|
||||
sw) a (g a
|
||||
sw) a (m_ a
|
||||
sw) a (nk a
|
||||
sw) a (th eI
|
||||
@@ -263,6 +264,7 @@
|
||||
_) ache (+ eIk
|
||||
d) ache (_ eIk
|
||||
h) ache (_ eIk
|
||||
k) ache (_ eIk
|
||||
r) ache (_ eIk
|
||||
rt) ache (_ eIk
|
||||
y) ache (_ eIk
|
||||
@@ -291,7 +293,7 @@
|
||||
acou (st a2ku:
|
||||
ac (quie ,a
|
||||
_) acre eIk@
|
||||
ac (rid ak
|
||||
_) ac (ri ak
|
||||
ac (ro ak
|
||||
m) acro (@ akr@
|
||||
_) ac (t ak
|
||||
@@ -974,7 +976,7 @@
|
||||
as (ive 'eIs
|
||||
as (ymp as
|
||||
&) asy (_ @s%I
|
||||
w) aste eIst
|
||||
w) ast (e# eIst
|
||||
|
||||
.group at
|
||||
pal) ate (_ @t
|
||||
@@ -2288,6 +2290,7 @@
|
||||
_) eth (A i:T
|
||||
?!3 eth (ane i:T
|
||||
_) eth (a ET
|
||||
_) eth (el ET
|
||||
eth (ic ET
|
||||
eth (y i:T
|
||||
@C) eth (_S3e @T
|
||||
@@ -4634,6 +4637,7 @@
|
||||
_) trie traI
|
||||
_) tri (CA traI
|
||||
_) tri (Cy traI
|
||||
tribe traIb
|
||||
_) tri (bu trI
|
||||
_) tri (g trI
|
||||
_) tri (ni trI
|
||||
|
||||
+55
-22
@@ -38,6 +38,7 @@ _grv maldekst@-*akoRno
|
||||
_tld tildo
|
||||
|
||||
|
||||
|
||||
_?? liteRo
|
||||
_. punkto
|
||||
_: dupunkto
|
||||
@@ -48,41 +49,68 @@ _- dividost@-*eko
|
||||
~ tildo
|
||||
° gradoI
|
||||
% p@-*otsento
|
||||
@ po
|
||||
@ _tSe_
|
||||
& kaI
|
||||
= ,,egala,
|
||||
\\ deklivo
|
||||
/ oblik'vo
|
||||
* asteRisko
|
||||
© k'opiraIto
|
||||
|
||||
|
||||
v vo // not Roman numbers
|
||||
x ikso
|
||||
|
||||
t.e t'e,e
|
||||
|
||||
|
||||
// Abbreviations
|
||||
a.k ,antaUk@-*'isto
|
||||
a.k. ,antaUk@-*'isto
|
||||
akk alinome
|
||||
anst anstataU
|
||||
bea $abbrev
|
||||
ekz ekzemple
|
||||
i.a 'i'a
|
||||
k.a kaIal'iaI
|
||||
k.c kaItset'eRe
|
||||
n.b n'otu||b'one
|
||||
nro numeRo
|
||||
pĝ paZo
|
||||
p.k p,ostk@-*'isto
|
||||
p.k. p,ostk@-*'isto
|
||||
uea $abbrev
|
||||
uk $abbrev
|
||||
a.k ,antaUk@-*'isto $dot
|
||||
akk alinome
|
||||
anst anstataU $dot
|
||||
bea $abbrev
|
||||
bv bon,volu%
|
||||
ekz ekzemple $dot
|
||||
i.a 'i'a
|
||||
k.a kaIal'iaI
|
||||
k.c kaItset'eRe
|
||||
Kg k'ilog@-*'amoI
|
||||
Km k'ilom'et-*oI
|
||||
kp k,omp'aru $dot
|
||||
k.s kaI,s'im'ile
|
||||
n.b n'otu||b'one
|
||||
nro numeRo
|
||||
pĝ padZo $dot
|
||||
p.k p,ostk@-*'isto $dot
|
||||
ps p,ostask@-*'ibo
|
||||
p.s p,ostask@-*'ibo
|
||||
str st@-*'ato
|
||||
t.e tio,estas
|
||||
t.n t'iel,nom'ata
|
||||
uea $abbrev
|
||||
uk $abbrev
|
||||
ktp kaIt'iel,pl,u_
|
||||
k.t.p kaIt'iel,pl,u_
|
||||
|
||||
|
||||
|
||||
Jan i,anu'aRo // months
|
||||
Feb f,eb@-*u'aRo
|
||||
Mar m'a@-*to
|
||||
Apr ap@-*'ilo
|
||||
Maj m'aIo%
|
||||
Jun iun'io
|
||||
Jul iul'io
|
||||
Aŭg augusto%
|
||||
Sept sep,temb@-*o
|
||||
Okt ok,tob@-*o
|
||||
//Nov nov,emb@-*o (problem: no difference between Nov and nov- [es: nov-jorko] )
|
||||
Dec detsemb@-*o
|
||||
|
||||
l' la
|
||||
la %la
|
||||
ne $u+ // negative
|
||||
ĉu $u // interogative particle
|
||||
ĉi $u // interogative particle
|
||||
ĉu $u $brk // interogative particle and conjunction
|
||||
ĉi $u // this
|
||||
ia $u // any
|
||||
|
||||
// prepositions
|
||||
@@ -123,6 +151,10 @@ tra $u $pause
|
||||
eĉ $brk
|
||||
pli pl,i
|
||||
plej pl,eI
|
||||
//ĝojo dZoIo
|
||||
//ĉashundo tSas,hundo
|
||||
//ligno lig,no
|
||||
//signo sig,no
|
||||
|
||||
// pronouns
|
||||
mi $u
|
||||
@@ -197,7 +229,7 @@ kio $u+ $pause
|
||||
kiu $u+ $pause
|
||||
kiuj $u+ $pause
|
||||
kiun $pause
|
||||
kiunj $pause
|
||||
kiujn $pause
|
||||
kiam $u+ $pause
|
||||
|
||||
tio $u+
|
||||
@@ -209,12 +241,13 @@ ke $u $pause // that (conj)
|
||||
aŭ $u $pause
|
||||
ĉar $u $pause
|
||||
kaj $u $pause
|
||||
sed $u $pause
|
||||
sed $u $pause //but
|
||||
nek $u $pause
|
||||
se $u $pause
|
||||
ju $u $brk
|
||||
des $u $pause
|
||||
do $pause // therefore, so, then
|
||||
ekde $pause // since
|
||||
tamen $pause //however (avversative)
|
||||
|
||||
|
||||
|
||||
+32
-16
@@ -1,4 +1,4 @@
|
||||
// translation rules
|
||||
// translation rules for Esperanto
|
||||
// This file is UTF-8 encoded
|
||||
|
||||
// includes both accented characters and ascii digraph alternatives (cx, gx, ux, etc)
|
||||
@@ -21,7 +21,8 @@
|
||||
D_-_) an (_ %an //'an' after a number
|
||||
D_) a (_ %a //'a' after a number
|
||||
D_) an (_ %an //'an' after a number
|
||||
|
||||
-) ano (_ an%o // 'ano' = member
|
||||
|
||||
.group b
|
||||
_) b(_ bo
|
||||
b b
|
||||
@@ -41,6 +42,8 @@
|
||||
_) d (-ro_ dokt'o
|
||||
_) d (-rino_ d,okto
|
||||
|
||||
-) do (_ d%o
|
||||
|
||||
.group e
|
||||
_) e(_ e
|
||||
e e
|
||||
@@ -78,7 +81,12 @@
|
||||
.group k
|
||||
_) k(_ ko
|
||||
k k
|
||||
|
||||
|
||||
_) k (-do_ kamaR'a
|
||||
_) k (-dino_ k'amaRa
|
||||
_) k (-ino_ k'amaRad
|
||||
|
||||
|
||||
.group l
|
||||
_) l(_ lo
|
||||
l l
|
||||
@@ -86,7 +94,7 @@
|
||||
|
||||
-) lo (_ l%o
|
||||
|
||||
|
||||
|
||||
.group m
|
||||
_) m(_ mo
|
||||
m m
|
||||
@@ -125,7 +133,7 @@
|
||||
rr RR
|
||||
|
||||
-) ro (_ R%o // d-ro, n-ro
|
||||
|
||||
|
||||
.group s
|
||||
_) s(_ so
|
||||
_) sh(_ So
|
||||
@@ -135,6 +143,11 @@
|
||||
|
||||
_) s (-ino_ s,injoR
|
||||
_) s (-ro_ sinj'o
|
||||
|
||||
_) s (-ano_ s'am,ide
|
||||
_) s (-anino_ s'am,ide
|
||||
|
||||
_) s (-ta_ s'ank
|
||||
|
||||
|
||||
.group t
|
||||
@@ -142,6 +155,8 @@
|
||||
t t
|
||||
th (K T // foreign words
|
||||
K) th T // foreign words
|
||||
|
||||
-) ta (_ t%a // s-ta = sankta
|
||||
|
||||
.group u
|
||||
_) u(_ u
|
||||
@@ -161,6 +176,7 @@
|
||||
.group x
|
||||
_) x(_ ikso
|
||||
x ks
|
||||
_) x z // foreign words
|
||||
|
||||
.group y
|
||||
_) y(_ ipsilono
|
||||
@@ -193,11 +209,8 @@
|
||||
ŭ w
|
||||
|
||||
|
||||
= ,,egala,
|
||||
\ malantaIst@-*eko
|
||||
/ st@-*eko
|
||||
'
|
||||
+ plus
|
||||
+ plus_
|
||||
_) ++ (_ plusplus
|
||||
|
||||
. punkto
|
||||
@@ -205,13 +218,16 @@
|
||||
\.) .
|
||||
|
||||
|
||||
* asteRisko
|
||||
£ pundo
|
||||
£ (D _pundoI_:
|
||||
! ,ekk@-*io,
|
||||
- _
|
||||
- (_a
|
||||
£ (_D _pundoI_:
|
||||
_! _k@-*isig'no_
|
||||
__) - (_D minus_
|
||||
D_) - (_D st@-*ek'eto_
|
||||
A_) - (_D _
|
||||
C_) - (_D _
|
||||
--) -
|
||||
- minus_
|
||||
- (_a
|
||||
$ dolaRo
|
||||
$ (D _dolaRoI_:
|
||||
|
||||
$ (_D _dolaRoI_:
|
||||
|
||||
|
||||
+4
-2
@@ -23,7 +23,7 @@
|
||||
|
||||
// 2006-11-18 Gilles Casse <gcasse@oralux.org>
|
||||
//
|
||||
// Updated: 2008-11-01 Michel Such <michel.such@free.fr>
|
||||
// Updated: 2008-11-19 Michel Such <michel.such@free.fr>
|
||||
//
|
||||
|
||||
// Letter classes:
|
||||
@@ -441,6 +441,8 @@ _) en (A A~n // enivrer
|
||||
-) est (_ Est // -est
|
||||
|
||||
dg) et (_ Et // Bridget, gadget
|
||||
Ack) et (_ Et
|
||||
m) et (_ Et2
|
||||
|
||||
eu Y // eu
|
||||
_) eu (ss y // eu
|
||||
@@ -513,7 +515,6 @@ _) en (A A~n // enivrer
|
||||
_) e (xA E
|
||||
Cr) eamer i:mWr
|
||||
Cl) eaner i:nWr
|
||||
Ack) et (_ Et
|
||||
vert) e (rX W
|
||||
eïn (_ 'Ein
|
||||
|
||||
@@ -694,6 +695,7 @@ _) half _^_en
|
||||
anqu) ill il // tranquille
|
||||
dist) ill il // distiller
|
||||
_m) ill il // mille
|
||||
osc) ill il // osciller
|
||||
v) ill il // village
|
||||
qu) ill ij // cuillière cueillir
|
||||
A) ill j // caillou
|
||||
|
||||
+2
-1
@@ -4,7 +4,8 @@
|
||||
|
||||
|
||||
// character names
|
||||
_cap k'apital
|
||||
_cap maj'uskola
|
||||
|
||||
_?? s'imbolo
|
||||
_?A let:'e:Ra
|
||||
|
||||
|
||||
+245
-10
@@ -1,4 +1,4 @@
|
||||
59 phoneme tables
|
||||
60 phoneme tables
|
||||
new total
|
||||
base 101 101
|
||||
base2 24 120
|
||||
@@ -52,13 +52,14 @@
|
||||
rw 15 127
|
||||
ko 18 149
|
||||
da 15 131
|
||||
sq 23 129
|
||||
sq 24 129
|
||||
ml 13 141
|
||||
kn 15 141
|
||||
bn 59 147
|
||||
ne 23 151
|
||||
hy 17 115
|
||||
om 21 121
|
||||
en_klatt 77 147
|
||||
|
||||
Data file Used by
|
||||
b/b [b] base
|
||||
@@ -345,12 +346,190 @@ j/xj [(@)] base
|
||||
[(i)] base
|
||||
[(o)] base
|
||||
[(u)] base
|
||||
klatt/b/b [b] en_klatt
|
||||
klatt/b/b_ [b] en_klatt
|
||||
klatt/b/xb [b] en_klatt
|
||||
klatt/d/d [d] en_klatt
|
||||
klatt/d/d_ [d] en_klatt
|
||||
klatt/d/dr [d] en_klatt
|
||||
klatt/d/xd [d] en_klatt
|
||||
klatt/dzh/dzh [dZ] en_klatt
|
||||
klatt/dzh/dzh_ [dZ] en_klatt
|
||||
klatt/dzh/xdzh [dZ] en_klatt
|
||||
klatt/g/g [g] en_klatt
|
||||
[g-] en_klatt
|
||||
klatt/g/g_ [g] en_klatt
|
||||
[g-] en_klatt
|
||||
klatt/g/xg [g] en_klatt
|
||||
[g-] en_klatt
|
||||
klatt/j2/j2 [(@)] en_klatt
|
||||
[(a)] en_klatt
|
||||
[(e)] en_klatt
|
||||
[(i)] en_klatt
|
||||
[(o)] en_klatt
|
||||
[(u)] en_klatt
|
||||
klatt/j2/xj2 [(i)] en_klatt
|
||||
klatt/j/j [(@)] en_klatt
|
||||
[(a)] en_klatt
|
||||
[(e)] en_klatt
|
||||
[(i)] en_klatt
|
||||
[(o)] en_klatt
|
||||
[(u)] en_klatt
|
||||
klatt/j/_j [j] en_klatt
|
||||
klatt/j/j_ [j/] en_klatt
|
||||
klatt/j/xj [(@)] en_klatt
|
||||
[(a)] en_klatt
|
||||
[(e)] en_klatt
|
||||
[(o)] en_klatt
|
||||
[(u)] en_klatt
|
||||
klatt/l/l [(@)] en_klatt
|
||||
[(a)] en_klatt
|
||||
[(e)] en_klatt
|
||||
[(i)] en_klatt
|
||||
[(o)] en_klatt
|
||||
[(u)] en_klatt
|
||||
klatt/l/_l [l] en_klatt
|
||||
klatt/l/L2_eL [(@)] en_klatt
|
||||
[(a)] en_klatt
|
||||
[(e)] en_klatt
|
||||
klatt/l/L2_uL [(i)] en_klatt
|
||||
[(o)] en_klatt
|
||||
[(u)] en_klatt
|
||||
klatt/l/tl [l] en_klatt
|
||||
klatt/l/xl [(@)] en_klatt
|
||||
[(a)] en_klatt
|
||||
[(e)] en_klatt
|
||||
[(i)] en_klatt
|
||||
[(o)] en_klatt
|
||||
[(u)] en_klatt
|
||||
klatt/m/m [(@)] en_klatt
|
||||
[(a)] en_klatt
|
||||
[(e)] en_klatt
|
||||
[(i)] en_klatt
|
||||
[(o)] en_klatt
|
||||
[(u)] en_klatt
|
||||
klatt/m/_m [m] en_klatt
|
||||
klatt/m/m_ [m] en_klatt
|
||||
klatt/m/mj [m] en_klatt
|
||||
klatt/n/n [(@)] en_klatt
|
||||
[(a)] en_klatt
|
||||
[(e)] en_klatt
|
||||
[(i)] en_klatt
|
||||
[(o)] en_klatt
|
||||
[(u)] en_klatt
|
||||
klatt/n/_n [n] en_klatt
|
||||
klatt/n/n_ [n] en_klatt
|
||||
klatt/n/nj [n] en_klatt
|
||||
klatt/nn/nn [(a)] en_klatt
|
||||
[(e)] en_klatt
|
||||
[(i)] en_klatt
|
||||
[(o)] en_klatt
|
||||
[(u)] en_klatt
|
||||
klatt/nn/_nn [N] en_klatt
|
||||
klatt/nn/nn_ [N] en_klatt
|
||||
klatt/nn/nnj [N] en_klatt
|
||||
klatt/r/r [(@)] en_klatt
|
||||
[(a)] en_klatt
|
||||
[(e)] en_klatt
|
||||
[(i)] en_klatt
|
||||
[(o)] en_klatt
|
||||
[(u)] en_klatt
|
||||
klatt/r/_r [r] en_klatt
|
||||
[r-] en_klatt
|
||||
klatt/r/r2 [(@)] en_klatt
|
||||
[(a)] en_klatt
|
||||
[(e)] en_klatt
|
||||
[(i)] en_klatt
|
||||
[(o)] en_klatt
|
||||
[(u)] en_klatt
|
||||
klatt/r/tr [r] en_klatt
|
||||
klatt/r/xr [(@)] en_klatt
|
||||
[(a)] en_klatt
|
||||
[(e)] en_klatt
|
||||
[(i)] en_klatt
|
||||
[(o)] en_klatt
|
||||
[(u)] en_klatt
|
||||
klatt/vdiph2/ii@ [i@] en_klatt
|
||||
[i@3] en_klatt
|
||||
klatt/vdiph2/uu@ [U@] en_klatt
|
||||
klatt/vdiph2/uw_2 [u:] en_klatt
|
||||
klatt/vdiph/aai [aI] en_klatt
|
||||
klatt/vdiph/au [aU] en_klatt
|
||||
klatt/vdiph/eei [eI] en_klatt
|
||||
klatt/vdiph/eu [eU] en_klatt
|
||||
klatt/vdiph/ooi [OI] en_klatt
|
||||
klatt/vdiph/@u_en [oU] en_klatt
|
||||
klatt/vnasal/aa_n2 [A~] en_klatt
|
||||
klatt/vnasal/ee_n [E~] en_klatt
|
||||
klatt/vnasal/oo_n [O~] en_klatt
|
||||
klatt/voc/dh [D] en_klatt
|
||||
klatt/voc/dh_ [D] en_klatt
|
||||
klatt/voc/v [v] en_klatt
|
||||
klatt/voc/v_ [v] en_klatt
|
||||
klatt/voc/vj [v] en_klatt
|
||||
klatt/voc/z [z] en_klatt
|
||||
klatt/voc/z_ [z] en_klatt
|
||||
klatt/voc/zh [Z] en_klatt
|
||||
klatt/voc/zh_ [Z] en_klatt
|
||||
klatt/vowel/@ [3] en_klatt
|
||||
[@] en_klatt
|
||||
[@2] en_klatt
|
||||
[@5] en_klatt
|
||||
klatt/vowel/@- [@-] en_klatt
|
||||
klatt/vowel/0_2 [0] en_klatt
|
||||
klatt/vowel/3_en [3:] en_klatt
|
||||
klatt/vowel/a#_3 [a2] en_klatt
|
||||
klatt/vowel/a_4 [a] en_klatt
|
||||
[aa] en_klatt
|
||||
klatt/vowel/aa_2 [A:] en_klatt
|
||||
[A@] en_klatt
|
||||
klatt/vowel/e [e:] en_klatt
|
||||
klatt/vowel/ee_1 [e@] en_klatt
|
||||
klatt/vowel/ee_2 [E] en_klatt
|
||||
klatt/vowel/i_en [i:] en_klatt
|
||||
klatt/vowel/ii_4 [I] en_klatt
|
||||
[I2] en_klatt
|
||||
klatt/vowel/ii_en [i] en_klatt
|
||||
klatt/vowel/o [o:] en_klatt
|
||||
klatt/vowel/oe [W] en_klatt
|
||||
klatt/vowel/oo_en [O] en_klatt
|
||||
[O:] en_klatt
|
||||
[O@] en_klatt
|
||||
[o@] en_klatt
|
||||
klatt/vowelr/V3_r [VR] en_klatt
|
||||
klatt/vowelr/V_r [IR] en_klatt
|
||||
klatt/vowel/uu [U] en_klatt
|
||||
klatt/vowel/V_2 [V] en_klatt
|
||||
klatt/vowel/y [y:] en_klatt
|
||||
klatt/vowel/y# [Y:] en_klatt
|
||||
klatt/vwl_en/aI@ [aI@] en_klatt
|
||||
klatt/vwl_en/aU@ [aU@] en_klatt
|
||||
klatt/vwl_en/@L [@L] en_klatt
|
||||
klatt/w/w [(@)] en_klatt
|
||||
[(a)] en_klatt
|
||||
[(e)] en_klatt
|
||||
[(o)] en_klatt
|
||||
klatt/w/_w [w] en_klatt
|
||||
klatt/w/wi [(i)] en_klatt
|
||||
klatt/w/wu [(u)] en_klatt
|
||||
klatt/w/xw [(@)] en_klatt
|
||||
[(a)] en_klatt
|
||||
[(e)] en_klatt
|
||||
[(i)] en_klatt
|
||||
[(o)] en_klatt
|
||||
[(u)] en_klatt
|
||||
l^/j2@ [(@)] base
|
||||
[(@)] en_klatt
|
||||
l^/j2a [(a)] base
|
||||
[(a)] en_klatt
|
||||
l^/j2e [(e)] base
|
||||
[(e)] en_klatt
|
||||
l^/j2i [(i)] base
|
||||
[(i)] en_klatt
|
||||
l^/j2o [(o)] base
|
||||
[(o)] en_klatt
|
||||
l^/j2u [(u)] base
|
||||
[(u)] en_klatt
|
||||
l^/_l^ [l^] base
|
||||
l^/l^ [l^] base
|
||||
l/l [l] base
|
||||
@@ -390,16 +569,24 @@ l/l_@ [(@)] base
|
||||
[W] fr
|
||||
[Y] fr
|
||||
[W2] fr
|
||||
[(@)] en_klatt
|
||||
l/l@ [(@)] base
|
||||
[W] fr
|
||||
[Y] fr
|
||||
[W2] fr
|
||||
[(@)] en_klatt
|
||||
l/L1_aL [(a)] base
|
||||
[(a)] en_klatt
|
||||
l/L1_eL [(e)] base
|
||||
[(e)] en_klatt
|
||||
l/L1_iL [(i)] base
|
||||
[(i)] en_klatt
|
||||
l/L1_@L [(@)] base
|
||||
[(@)] en_klatt
|
||||
l/L1_oL [(o)] base
|
||||
[(o)] en_klatt
|
||||
l/L1_uL [(u)] base
|
||||
[(u)] en_klatt
|
||||
l/L2_aL [(a)] base
|
||||
l/L2_eL [(e)] base
|
||||
l/L2_iL [(i)] base
|
||||
@@ -415,18 +602,22 @@ l/l_4 [ll] sq
|
||||
l/la [(a)] base
|
||||
[a] fr
|
||||
[a2] fr
|
||||
[(a)] en_klatt
|
||||
l/l_a [(a)] base
|
||||
[a] fr
|
||||
[a2] fr
|
||||
[wA] fr
|
||||
[A~] fr
|
||||
[(a)] en_klatt
|
||||
l/le [(e)] base
|
||||
[E] fr
|
||||
[e] fr
|
||||
[E2] fr
|
||||
[(e)] en_klatt
|
||||
l/l_e [(e)] base
|
||||
[E] fr
|
||||
[E2] fr
|
||||
[(e)] en_klatt
|
||||
l/L_eL_af [&] af
|
||||
[&:] af
|
||||
l/l_front [l] sq
|
||||
@@ -434,11 +625,13 @@ l/li [(i)] base
|
||||
[i] fr
|
||||
[i:] fr
|
||||
[l] zh
|
||||
[(i)] en_klatt
|
||||
l/l_i [(i)] base
|
||||
[i] fr
|
||||
[i:] fr
|
||||
[w^i] fr
|
||||
[i] sq
|
||||
[(i)] en_klatt
|
||||
l/l_long [l] base
|
||||
[l] fr
|
||||
[l] la
|
||||
@@ -450,10 +643,12 @@ l/lo [(o)] base
|
||||
[O2] fr
|
||||
[o2] fr
|
||||
[wA] fr
|
||||
[(o)] en_klatt
|
||||
l/l_o [(o)] base
|
||||
[O] fr
|
||||
[O2] fr
|
||||
[o2] fr
|
||||
[(o)] en_klatt
|
||||
l^/l_rfx [l.] hi
|
||||
[l.] sq
|
||||
[l.] bn
|
||||
@@ -462,9 +657,11 @@ l/lu [(u)] base
|
||||
[y] fr
|
||||
[u:] fr
|
||||
[w^i] fr
|
||||
[(u)] en_klatt
|
||||
l/l_u [(u)] base
|
||||
[u] fr
|
||||
[u:] fr
|
||||
[(u)] en_klatt
|
||||
l/l_y [y] fr
|
||||
l/tl [l] base
|
||||
[l] en
|
||||
@@ -506,6 +703,7 @@ m/mu [(u)] base
|
||||
n^/_n^ [n^] base
|
||||
n^/n^_ [n^] base
|
||||
n^/n^@ [(@)] base
|
||||
[(@)] en_klatt
|
||||
n^/n^#_ [n^#] is
|
||||
n/_n [n] base
|
||||
[n;] ro
|
||||
@@ -518,10 +716,13 @@ n/n@ [(@)] base
|
||||
n/n#_ [n#] is
|
||||
[n] da
|
||||
n^/n^a [(a)] base
|
||||
[(a)] en_klatt
|
||||
n/na [(a)] base
|
||||
n^/n^e [(e)] base
|
||||
[(e)] en_klatt
|
||||
n/ne [(e)] base
|
||||
n^/n^i [(i)] base
|
||||
[(i)] en_klatt
|
||||
n/ni [(i)] base
|
||||
[n] zh
|
||||
nn/inn [(i)] base
|
||||
@@ -537,6 +738,7 @@ nn/_nn [N] base
|
||||
nn/nn_ [N] base
|
||||
[N] en
|
||||
nn/nn@ [(@)] base
|
||||
[(@)] en_klatt
|
||||
nn/nn#_ [N#] is
|
||||
nn/nn2_ [N] zh
|
||||
[N-] zh
|
||||
@@ -547,10 +749,12 @@ nn/nnj [N] base
|
||||
nn/nno [(o)] base
|
||||
nn/nnu [(u)] base
|
||||
n^/n^o [(o)] base
|
||||
[(o)] en_klatt
|
||||
n/no [(o)] base
|
||||
n/_nr [n.] base
|
||||
n/nr_ [n.] base
|
||||
n^/n^u [(u)] base
|
||||
[(u)] en_klatt
|
||||
n/nu [(u)] base
|
||||
r2/_r2 [r-] base
|
||||
r2/r2@ [(@)] base
|
||||
@@ -562,21 +766,28 @@ r2/r2u [(u)] base
|
||||
r3/r_ [r/] base
|
||||
[r/] af
|
||||
[r/] ru
|
||||
[r/] en_klatt
|
||||
r3/r_@ [(@)] base
|
||||
[@2] fr
|
||||
[(@)] en_klatt
|
||||
r3/r#_ [r#] is
|
||||
r3/r_2 [r/2] fr
|
||||
r3/r_a [(a)] base
|
||||
[(a)] en_klatt
|
||||
r3/r_e [(e)] base
|
||||
[(e)] en_klatt
|
||||
r3/r_i [(i)] base
|
||||
[i] fr
|
||||
[w^i] fr
|
||||
[(i)] en_klatt
|
||||
r3/r_n [r/] base
|
||||
[r/2] fr
|
||||
[r/] ru
|
||||
[r/] en_klatt
|
||||
r3/r_o [(o)] base
|
||||
[O] fr
|
||||
[O2] fr
|
||||
[(o)] en_klatt
|
||||
r3/r_ru [R4] ru
|
||||
r3/r_ru2 [R4] ru
|
||||
r3/r_sr [r.] bn
|
||||
@@ -603,6 +814,7 @@ r3/r_trill.wav [R2] base
|
||||
[r*] sr
|
||||
[x] pt
|
||||
r3/r_u [(u)] base
|
||||
[(u)] en_klatt
|
||||
r3/r_ulv [r"] hy
|
||||
r3/r_uvl [r"] hy
|
||||
r3/rx [*] base
|
||||
@@ -618,6 +830,7 @@ r3/rx [*] base
|
||||
[*;] ro
|
||||
[r#] is
|
||||
[Q2] hy
|
||||
[r/] en_klatt
|
||||
r3/rz_cs [R^] sk
|
||||
[R^/] sk
|
||||
r3/@tap [**] base
|
||||
@@ -642,6 +855,7 @@ r/r_ [r] base
|
||||
[r] ro
|
||||
[r] sw
|
||||
[r.] bn
|
||||
[r] en_klatt
|
||||
r/r@ [(@)] base
|
||||
r/ra [(a)] base
|
||||
r/re [(e)] base
|
||||
@@ -656,6 +870,7 @@ r/rr [r/] base
|
||||
[r/] ru
|
||||
[r] ro
|
||||
[r] sw
|
||||
[r/] en_klatt
|
||||
r/ru [(u)] base
|
||||
r/tr [r] base
|
||||
[r] en_sc
|
||||
@@ -670,6 +885,7 @@ r/trr [r/] base
|
||||
[r] ro
|
||||
[r] sv
|
||||
[r] sw
|
||||
[r/] en_klatt
|
||||
r/xr [(@)] base
|
||||
[(a)] base
|
||||
[(e)] base
|
||||
@@ -711,6 +927,7 @@ ufric/s [s] base
|
||||
[s] es
|
||||
[s#] pt
|
||||
[s`] ko
|
||||
[s] en_klatt
|
||||
ufric/s_ [s] base
|
||||
[z] base
|
||||
[s2] fi
|
||||
@@ -724,6 +941,8 @@ ufric/s_ [s] base
|
||||
[s#] pt
|
||||
[z;] ro
|
||||
[s2] is
|
||||
[s] en_klatt
|
||||
[z] en_klatt
|
||||
ufric/s! [s] base
|
||||
[s2] fi
|
||||
[s] fr
|
||||
@@ -732,6 +951,7 @@ ufric/s! [s] base
|
||||
[s] es
|
||||
[s#] pt
|
||||
[s2] is
|
||||
[s] en_klatt
|
||||
ufric/s_continue [s2] fi
|
||||
[s2] hu
|
||||
[s2] lv
|
||||
@@ -739,9 +959,11 @@ ufric/s_continue [s2] fi
|
||||
ufric/sh [S] base
|
||||
[S] fr
|
||||
[s#] pt_pt
|
||||
[S] en_klatt
|
||||
ufric/sh_ [S] base
|
||||
[S] fr
|
||||
[s#] pt_pt
|
||||
[S] en_klatt
|
||||
ufric/sh3 [S] hr
|
||||
[Z] hr
|
||||
ufric/sh_pzd [S;] base
|
||||
@@ -1108,6 +1330,7 @@ vdiph/8u [oU] en_us
|
||||
vdiph/aae [aI] en_us
|
||||
vdiph/aai [ai] lv
|
||||
[aai] zhy
|
||||
[aI] sq
|
||||
[aI] ne
|
||||
vdiph/aai_2 [AI] af
|
||||
[AY] cy
|
||||
@@ -1138,7 +1361,8 @@ vdiph/ai [aI] base2
|
||||
[aI] id
|
||||
[aI] kn
|
||||
[aI] hy
|
||||
vdiph/ai_2 [aI] cy
|
||||
vdiph/ai_2 [aI] en
|
||||
[aI] cy
|
||||
[aY] cy
|
||||
vdiph/ai_3 [aI] no
|
||||
vdiph/ai_4 [aI] af
|
||||
@@ -1148,7 +1372,6 @@ vdiph/ai_6 [aI] en_rp
|
||||
vdiph/ai_7 [aI] en_sc
|
||||
[aI2] en_sc
|
||||
[aI] is
|
||||
vdiph/ai_en2 [aI] en
|
||||
vdiph/aoo [aU] en_us
|
||||
vdiph/au [aU] en
|
||||
[aU] af
|
||||
@@ -1374,6 +1597,7 @@ voc/vj [v] base
|
||||
[v] fr
|
||||
vocw/dh [D] base
|
||||
[D] es
|
||||
[D] en_klatt
|
||||
vocw/Q [Q] base
|
||||
[Q^] base
|
||||
vocw/Q_ [Q] base
|
||||
@@ -1386,8 +1610,10 @@ vocw/v [B] base
|
||||
[v] ta
|
||||
[v#] es
|
||||
[v;] ro
|
||||
[v] en_klatt
|
||||
vocw/zh [Z] base
|
||||
[Z;] ro
|
||||
[Z] en_klatt
|
||||
vocw/zh_rfx [z.] base
|
||||
voc/z [z] base
|
||||
[z] fr
|
||||
@@ -1474,15 +1700,19 @@ vowel/8_2 [U] en_us
|
||||
vowel/8_3 [eo] zhy
|
||||
vowel/8_5 [8] ku
|
||||
vowel/8_7 [@] lv
|
||||
vowel/a [a] en_n
|
||||
vowel/a [a] en
|
||||
[aa] en
|
||||
[a] en_n
|
||||
[aa] en_n
|
||||
[a] en_wm
|
||||
[aa] en_wm
|
||||
[a] cy
|
||||
[a] de
|
||||
[A] fr
|
||||
[a] ta
|
||||
[a:] hu
|
||||
[a:] nl
|
||||
[a] pl
|
||||
[a] sk
|
||||
[a:] sk
|
||||
[A] hr
|
||||
@@ -1592,10 +1822,6 @@ vowel/aa_8 [0] en_us
|
||||
vowel/aa_9 [a:] hi
|
||||
[a:] bn
|
||||
[a] ne
|
||||
vowel/a_en [a] en
|
||||
[aa] en
|
||||
[A] fr
|
||||
[a] pl
|
||||
vowel/@_bck [@] hi
|
||||
[@/] hi
|
||||
[@] zh
|
||||
@@ -1654,7 +1880,6 @@ vowel/ee [E] en_n
|
||||
vowel/e_e [E] en_sc
|
||||
[e] is
|
||||
vowel/ee# [E#] pl
|
||||
[E] sq
|
||||
vowel/ee_1 [E] base2
|
||||
[e@] en
|
||||
[E] pl
|
||||
@@ -1670,6 +1895,7 @@ vowel/ee_2 [E] en
|
||||
[E#] ku
|
||||
[&] da
|
||||
vowel/ee#_2 [E-] sv
|
||||
[E] sq
|
||||
vowel/ee_3 [&] af
|
||||
[&:] af
|
||||
[E] pt
|
||||
@@ -2296,8 +2522,10 @@ x/b [b] base
|
||||
[b;] ro
|
||||
[b] is
|
||||
[b] bn
|
||||
[b] en_klatt
|
||||
x/b_ [b] base
|
||||
[b] fr
|
||||
[b] en_klatt
|
||||
x/d [d] base
|
||||
[t#] en_us
|
||||
[d] fr
|
||||
@@ -2308,6 +2536,7 @@ x/d [d] base
|
||||
[d] id
|
||||
[d.] bn
|
||||
[d`] om
|
||||
[d] en_klatt
|
||||
x/d_ [d] base
|
||||
[d[] base
|
||||
[d] base2
|
||||
@@ -2326,6 +2555,7 @@ x/d_ [d] base
|
||||
[d] id
|
||||
[d] bn
|
||||
[d.] bn
|
||||
[d] en_klatt
|
||||
x/d_dnt [d[] base
|
||||
[d] base2
|
||||
[d] fi
|
||||
@@ -2342,6 +2572,7 @@ x/dzh [J] base
|
||||
[dZ] base
|
||||
[J2] hi
|
||||
[J2] bn
|
||||
[dZ] en_klatt
|
||||
x/dzh_ [dZ] base
|
||||
[dZ;] base
|
||||
[dz;] base
|
||||
@@ -2349,6 +2580,7 @@ x/dzh_ [dZ] base
|
||||
[dZ;] mk
|
||||
[dZ;] ru
|
||||
[J] bn
|
||||
[dZ] en_klatt
|
||||
x/dz_pzd [dZ;] base
|
||||
[dz;] base
|
||||
[J] hi
|
||||
@@ -2362,6 +2594,7 @@ x/g_ [g] base
|
||||
[g] fr
|
||||
[g] es
|
||||
[g] is
|
||||
[g] en_klatt
|
||||
x/g2 [g] base
|
||||
[g] cy
|
||||
[g] fr
|
||||
@@ -2369,6 +2602,8 @@ x/g2 [g] base
|
||||
[g] es
|
||||
[g] is
|
||||
[g] bn
|
||||
[g] en_klatt
|
||||
x/g2_ [g-] base
|
||||
[g] hi
|
||||
[g] bn
|
||||
[g-] en_klatt
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
// Czech phonemes inherit from Slovak
|
||||
|
||||
phoneme e
|
||||
vowel starttype (e) endtype (e)
|
||||
length 120
|
||||
|
||||
+6
-3
@@ -103,7 +103,8 @@ endphoneme
|
||||
phoneme a
|
||||
vowel starttype (a) endtype (a)
|
||||
length 150
|
||||
formants vowel/a_en
|
||||
// formants vowel/a_en
|
||||
formants vowel/a
|
||||
reduceto a2 0
|
||||
endphoneme
|
||||
|
||||
@@ -120,7 +121,8 @@ endphoneme
|
||||
phoneme aa // 'bath' etc.
|
||||
vowel starttype (a) endtype (a)
|
||||
length 150
|
||||
formants vowel/a_en
|
||||
// formants vowel/a_en
|
||||
formants vowel/a
|
||||
linkout r-
|
||||
endphoneme
|
||||
|
||||
@@ -272,7 +274,8 @@ endphoneme
|
||||
phoneme aI
|
||||
vowel starttype (a) endtype (i)
|
||||
length 230
|
||||
formants vdiph/ai_en2
|
||||
// formants vdiph/ai_en2
|
||||
formants vdiph/ai_2
|
||||
endphoneme
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -289,7 +289,7 @@ endphoneme
|
||||
phoneme A // same as [a]
|
||||
vowel starttype (a) endtype (a)
|
||||
length 166
|
||||
formants vowel/a_en
|
||||
formants vowel/a
|
||||
endphoneme
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
phoneme a
|
||||
vowel starttype (a) endtype (a)
|
||||
length 190
|
||||
formants vowel/a_en
|
||||
formants vowel/a
|
||||
reduceto a# 0
|
||||
endphoneme
|
||||
|
||||
|
||||
@@ -1347,3 +1347,6 @@ include ph_armenian_west
|
||||
phonemetable om base
|
||||
include ph_oromo
|
||||
|
||||
phonemetable en_klatt en
|
||||
include ph_english_klatt
|
||||
]
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+78
-36
@@ -597,17 +597,21 @@ int Compile::LoadSpect(const char *path, int control)
|
||||
int peak;
|
||||
int displ;
|
||||
int frame;
|
||||
int n_frames;
|
||||
int ix;
|
||||
int x;
|
||||
int x, x2;
|
||||
int rms;
|
||||
float total;
|
||||
float pkheight;
|
||||
int marker1_set=0;
|
||||
int frame_vowelbreak=0;
|
||||
int klatt_flag=0;
|
||||
SpectFrame *fr;
|
||||
frame_t *fr_out;
|
||||
wxString path_sep = _T("/");
|
||||
|
||||
SPECT_SEQ seq_out;
|
||||
SPECT_SEQK seqk_out;
|
||||
|
||||
// create SpectSeq and import data
|
||||
spectseq = new SpectSeq;
|
||||
@@ -627,11 +631,14 @@ int Compile::LoadSpect(const char *path, int control)
|
||||
}
|
||||
spectseq->Load(stream);
|
||||
|
||||
if(spectseq->synthesizer_type == 1)
|
||||
klatt_flag = FRFLAG_KLATT;
|
||||
|
||||
displ = ftell(f_phdata);
|
||||
|
||||
seq_out.n_frames=0;
|
||||
seq_out.flags=0;
|
||||
seq_out.length=0;
|
||||
seq_out.length_total=0;
|
||||
|
||||
total = 0;
|
||||
for(frame=0; frame < spectseq->numframes; frame++)
|
||||
@@ -669,7 +676,7 @@ for(ix=0; ix<8; ix++)
|
||||
total += spectseq->frames[frame-1]->length;
|
||||
}
|
||||
}
|
||||
seq_out.length = int(total);
|
||||
seq_out.length_total = int(total);
|
||||
|
||||
if((control & 1) && (marker1_set == 0))
|
||||
{
|
||||
@@ -678,68 +685,103 @@ for(ix=0; ix<8; ix++)
|
||||
spectseq->frames[frame_vowelbreak]->markers |= FRFLAG_VOWEL_CENTRE;
|
||||
}
|
||||
|
||||
ix = 0;
|
||||
n_frames = 0;
|
||||
for(frame=0; frame < spectseq->numframes; frame++)
|
||||
{
|
||||
fr = spectseq->frames[frame];
|
||||
|
||||
if(fr->keyframe)
|
||||
{
|
||||
if(klatt_flag)
|
||||
fr_out = &seqk_out.frame[n_frames];
|
||||
else
|
||||
fr_out = (frame_t *)&seq_out.frame[n_frames];
|
||||
|
||||
x = int(fr->length + 0.5); // round to nearest mS
|
||||
if(x > 255) x = 255;
|
||||
seq_out.frame[ix].length = x;
|
||||
fr_out->length = x;
|
||||
|
||||
fr_out->frflags = fr->markers | klatt_flag;
|
||||
|
||||
seq_out.frame[ix].frflags = fr->markers;
|
||||
rms = int(fr->GetRms(spectseq->amplitude));
|
||||
if(rms > 255) rms = 255;
|
||||
seq_out.frame[ix].rms = rms;
|
||||
fr_out->rms = rms;
|
||||
|
||||
if(n_frames == (seq_out.n_frames-1))
|
||||
fr_out->length = 0; // give last frame zero length
|
||||
|
||||
if(ix == (seq_out.n_frames-1))
|
||||
seq_out.frame[ix].length = 0; // give last frame zero length
|
||||
|
||||
// write: peak data
|
||||
count_frames++;
|
||||
for(peak=0; peak<N_PEAKS; peak++)
|
||||
{
|
||||
seq_out.frame[ix].ffreq[peak] = fr->peaks[peak].pkfreq;
|
||||
pkheight = spectseq->amplitude * fr->amp_adjust * fr->peaks[peak].pkheight;
|
||||
pkheight = pkheight/640000;
|
||||
if(pkheight > 255) pkheight = 255;
|
||||
seq_out.frame[ix].fheight[peak] = int(pkheight);
|
||||
fr_out->ffreq[peak] = fr->peaks[peak].pkfreq;
|
||||
|
||||
if(klatt_flag)
|
||||
{
|
||||
pkheight = fr->peaks[peak].pkheight / 128;
|
||||
}
|
||||
else
|
||||
{
|
||||
pkheight = spectseq->amplitude * fr->amp_adjust * fr->peaks[peak].pkheight;
|
||||
pkheight = pkheight/640000;
|
||||
if(pkheight > 255) pkheight = 255;
|
||||
}
|
||||
fr_out->fheight[peak] = int(pkheight);
|
||||
|
||||
if(peak < 6)
|
||||
{
|
||||
x = fr->peaks[peak].pkwidth/4;
|
||||
x = fr->peaks[peak].pkwidth/2;
|
||||
x2 = fr->peaks[peak].pkright;
|
||||
if(klatt_flag == 0)
|
||||
{
|
||||
x /= 2;
|
||||
x2 /= 4;
|
||||
}
|
||||
if(x > 255) x = 255;
|
||||
seq_out.frame[ix].fwidth[peak] = x;
|
||||
fr_out->fwidth[peak] = x;
|
||||
|
||||
x = fr->peaks[peak].pkright/4;
|
||||
if(x > 255) x = 255;
|
||||
seq_out.frame[ix].fright[peak] = x;
|
||||
if(x2 > 255) x2 = 255;
|
||||
fr_out->fright[peak] = x2;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef LOG_DETAIL
|
||||
fprintf(f_errors,"Frame %d %3dmS rms=%3d flags=%2d pk=%4d %4d %4d",ix,seq_out.frame[ix].length,
|
||||
seq_out.frame[ix].rms,seq_out.frame[ix].flags,
|
||||
seq_out.frame[ix].peaks[1].pkfreq,seq_out.frame[ix].peaks[2].pkfreq,seq_out.frame[ix].peaks[3].pkfreq);
|
||||
if(klatt_flag)
|
||||
{
|
||||
if(fr->klatt_param[KLATT_Kopen] == 0)
|
||||
{
|
||||
Error("Klatt_Kopen has value 0");
|
||||
}
|
||||
|
||||
if(fr->markers != 0)
|
||||
{
|
||||
fprintf(f_errors," [%x]",fr->markers);
|
||||
}
|
||||
fputc('\n',f_errors);
|
||||
#endif
|
||||
|
||||
ix++;
|
||||
// additional fields
|
||||
for(ix=0; ix<N_KLATTP; ix++)
|
||||
{
|
||||
fr_out->klattp[ix] = fr->klatt_param[ix];
|
||||
}
|
||||
fr_out->fwidth6 = fr->peaks[6].pkwidth/2;
|
||||
fr_out->fright6 = fr->peaks[6].pkright;
|
||||
}
|
||||
|
||||
n_frames++;
|
||||
}
|
||||
}
|
||||
|
||||
ix = (char *)(&seq_out.frame[seq_out.n_frames]) - (char *)(&seq_out);
|
||||
ix = (ix+3) & 0xfffc; // round up to multiple of 4 bytes
|
||||
if(klatt_flag)
|
||||
{
|
||||
seqk_out.n_frames = seq_out.n_frames;
|
||||
seqk_out.flags = seq_out.flags;
|
||||
seqk_out.length_total = seq_out.length_total;
|
||||
|
||||
ix = (char *)(&seqk_out.frame[seqk_out.n_frames]) - (char *)(&seqk_out);
|
||||
ix = (ix+3) & 0xfffc; // round up to multiple of 4 bytes
|
||||
fwrite(&seqk_out,ix,1,f_phdata);
|
||||
}
|
||||
else
|
||||
{
|
||||
ix = (char *)(&seq_out.frame[seq_out.n_frames]) - (char *)(&seq_out);
|
||||
ix = (ix+3) & 0xfffc; // round up to multiple of 4 bytes
|
||||
fwrite(&seq_out,ix,1,f_phdata);
|
||||
}
|
||||
|
||||
fwrite(&seq_out,ix,1,f_phdata);
|
||||
|
||||
delete spectseq;
|
||||
return(displ);
|
||||
} // end of Compile::LoadSpect
|
||||
|
||||
+1
-1
@@ -1268,7 +1268,7 @@ static int compile_lettergroup(char *input, FILE *f_out)
|
||||
group = atoi(&p[0]);
|
||||
if(group >= N_LETTER_GROUPS)
|
||||
{
|
||||
fprintf(f_log,"%5d: lettergroup out of range (01-%.2d)\n",linenum,N_LETTER_GROUPS);
|
||||
fprintf(f_log,"%5d: lettergroup out of range (01-%.2d)\n",linenum,N_LETTER_GROUPS-1);
|
||||
error_count++;
|
||||
return(1);
|
||||
}
|
||||
|
||||
+1
-1
@@ -232,7 +232,7 @@ wxSashLayoutWindow *win;
|
||||
win = new wxSashLayoutWindow(this, ID_WINDOW_LEFT2,
|
||||
wxDefaultPosition, wxSize(200, 30),
|
||||
wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN);
|
||||
win->SetDefaultSize(wxSize(208, 1000));
|
||||
win->SetDefaultSize(wxSize(212, 1000));
|
||||
win->SetOrientation(wxLAYOUT_VERTICAL);
|
||||
win->SetAlignment(wxLAYOUT_LEFT);
|
||||
// win->SetBackgroundColour(wxColour(0, 255, 255));
|
||||
|
||||
+117
-32
@@ -43,10 +43,10 @@ ByteGraph *pitchgraph=NULL;
|
||||
BEGIN_EVENT_TABLE(FormantDlg, wxPanel)
|
||||
EVT_BUTTON(T_ZOOMOUT,FormantDlg::OnCommand)
|
||||
EVT_BUTTON(T_ZOOMIN,FormantDlg::OnCommand)
|
||||
EVT_SPINCTRL(T_AMPLITUDE,FormantDlg::OnSpin)
|
||||
EVT_SPINCTRL(T_TIMESEQ,FormantDlg::OnSpin)
|
||||
EVT_SPINCTRL(T_AMPFRAME,FormantDlg::OnSpin)
|
||||
EVT_SPINCTRL(T_TIMEFRAME,FormantDlg::OnSpin)
|
||||
EVT_SPINCTRL(-1,FormantDlg::OnSpin)
|
||||
// EVT_SPINCTRL(T_TIMESEQ,FormantDlg::OnSpin)
|
||||
// EVT_SPINCTRL(T_AMPFRAME,FormantDlg::OnSpin)
|
||||
// EVT_SPINCTRL(T_TIMEFRAME,FormantDlg::OnSpin)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
@@ -79,21 +79,19 @@ void FormantDlg::OnSpin(wxSpinEvent& event)
|
||||
|
||||
switch(id = event.GetId())
|
||||
{
|
||||
case T_AMPLITUDE:
|
||||
case T_TIMESEQ:
|
||||
case T_TIMEFRAME:
|
||||
currentcanvas->RefreshDialogValues(0);
|
||||
break;
|
||||
|
||||
case T_AMPFRAME:
|
||||
currentcanvas->RefreshDialogValues(1);
|
||||
break;
|
||||
|
||||
default:
|
||||
currentcanvas->RefreshDialogValues(0);
|
||||
break;
|
||||
}
|
||||
currentcanvas->SetFocus();
|
||||
}
|
||||
|
||||
FormantDlg::FormantDlg(wxWindow *parent) : wxPanel(parent,-1,wxDefaultPosition,wxSize(400,1000))
|
||||
{//==========================================================================
|
||||
{//=============================================================================================
|
||||
int ix;
|
||||
int y;
|
||||
int xplace;
|
||||
@@ -104,6 +102,7 @@ FormantDlg::FormantDlg(wxWindow *parent) : wxPanel(parent,-1,wxDefaultPosition,w
|
||||
xplace = 28;
|
||||
id = 201;
|
||||
new wxStaticText(this,-1,_T("Formants"),wxPoint(4,5));
|
||||
t_lab[4] = new wxStaticText(this,-1,_T(" BW BWp Ap"),wxPoint(78,5),wxSize(300,20));
|
||||
|
||||
for(ix=0; ix<N_PEAKS; ix++)
|
||||
{
|
||||
@@ -115,48 +114,124 @@ FormantDlg::FormantDlg(wxWindow *parent) : wxPanel(parent,-1,wxDefaultPosition,w
|
||||
wxPoint(xplace,y+24*ix),wxSize(48,20),
|
||||
wxTE_CENTRE+wxTE_READONLY);
|
||||
t_pkheight[ix] = new wxTextCtrl(this,id++,_T(""),
|
||||
wxPoint(xplace+52,y+24*ix),wxSize(36,20),
|
||||
wxPoint(xplace+50,y+24*ix),wxSize(36,20),
|
||||
wxTE_CENTRE+wxTE_READONLY);
|
||||
t_pkwidth[ix] = new wxTextCtrl(this,id++,_T(""),
|
||||
wxPoint(xplace+92,y+24*ix),wxSize(48,20),
|
||||
wxPoint(xplace+88,y+24*ix),wxSize(48,20),
|
||||
wxTE_CENTRE+wxTE_READONLY);
|
||||
#ifdef WIDTH2
|
||||
t_pkright[ix] = new wxTextCtrl(this,id++,_T(""),
|
||||
wxPoint(xplace+132,y+24*ix),wxSize(36,20),
|
||||
wxPoint(xplace+138,y+24*ix),wxSize(36,20),
|
||||
wxTE_CENTRE+wxTE_READONLY);
|
||||
#endif
|
||||
if(ix>5) t_pkwidth[ix]->Hide();
|
||||
}
|
||||
|
||||
t_ampframe = new wxSpinCtrl(this,T_AMPFRAME,_T(""),
|
||||
wxPoint(6,244),wxSize(52,24),wxTE_CENTRE,0,500);
|
||||
t_lab[3] = new wxStaticText(this,-1,_T("% amp - Frame"),wxPoint(61,248));
|
||||
t_timeframe = new wxSpinCtrl(this,T_TIMEFRAME,_T(""),
|
||||
wxPoint(6,272),wxSize(52,24),wxTE_CENTRE,0,500);
|
||||
t_orig_frame = new wxStaticText(this,-1,_T("mS"),wxPoint(61,276));
|
||||
y=240;
|
||||
t_timeframe = new wxSpinCtrl(this,T_TIMEFRAME,_T(""), wxPoint(6,y+0), wxSize(52,24), wxTE_CENTRE,0,500);
|
||||
t_orig_frame = new wxStaticText(this,-1,_T("mS"),wxPoint(57,y+8));
|
||||
t_ampframe = new wxSpinCtrl(this,T_AMPFRAME,_T(""), wxPoint(100,y+0), wxSize(52,24), wxTE_CENTRE,0,500);
|
||||
t_lab[3] = new wxStaticText(this,-1,_T("% amp - Frame"),wxPoint(151,y+8));
|
||||
|
||||
t_zoomout = new wxButton(this,T_ZOOMOUT,_T("Zoom-"),wxPoint(16,310));
|
||||
t_zoomin = new wxButton(this,T_ZOOMIN,_T("Zoom+"),wxPoint(106,310));
|
||||
s_klatt[KLATT_AV] = new wxSpinCtrl(this,T_AV,_T(""), wxPoint(6,y+32), wxSize(52,24), wxTE_CENTRE,0,500);
|
||||
t_klatt[KLATT_AV] = new wxStaticText(this,-1,_T("AV"),wxPoint(61,y+36));
|
||||
s_klatt[KLATT_AVp] = new wxSpinCtrl(this,T_AVP,_T(""), wxPoint(100,y+32), wxSize(52,24), wxTE_CENTRE,0,500);
|
||||
t_klatt[KLATT_AVp] = new wxStaticText(this,-1,_T("AVp"),wxPoint(155,y+36));
|
||||
|
||||
s_klatt[KLATT_Fric] = new wxSpinCtrl(this,T_FRIC,_T(""), wxPoint(6,y+60), wxSize(52,24), wxTE_CENTRE,0,500);
|
||||
t_klatt[KLATT_Fric] = new wxStaticText(this,-1,_T("Fric"),wxPoint(61,y+64));
|
||||
s_klatt[KLATT_FricBP] = new wxSpinCtrl(this,T_FRICBP,_T(""), wxPoint(100,y+60), wxSize(52,24), wxTE_CENTRE,0,500);
|
||||
t_klatt[KLATT_FricBP] = new wxStaticText(this,-1,_T("FricBP"),wxPoint(155,y+64));
|
||||
|
||||
s_klatt[KLATT_Aspr] = new wxSpinCtrl(this,T_ASPR,_T(""), wxPoint(6,y+88), wxSize(52,24), wxTE_CENTRE,0,500);
|
||||
t_klatt[KLATT_Aspr] = new wxStaticText(this,-1,_T("Aspr"),wxPoint(61,y+92));
|
||||
s_klatt[KLATT_Turb] = new wxSpinCtrl(this,T_TURB,_T(""), wxPoint(100,y+88), wxSize(52,24), wxTE_CENTRE,0,500);
|
||||
t_klatt[KLATT_Turb] = new wxStaticText(this,-1,_T("Turb"),wxPoint(155,y+92));
|
||||
|
||||
s_klatt[KLATT_Skew] = new wxSpinCtrl(this,T_SKEW,_T(""), wxPoint(6,y+116), wxSize(52,24), wxTE_CENTRE,0,500);
|
||||
t_klatt[KLATT_Skew] = new wxStaticText(this,-1,_T("Skew"),wxPoint(61,y+120));
|
||||
s_klatt[KLATT_Tilt] = new wxSpinCtrl(this,T_TILT,_T(""), wxPoint(100,y+116), wxSize(52,24), wxTE_CENTRE,0,500);
|
||||
t_klatt[KLATT_Tilt] = new wxStaticText(this,-1,_T("Tilt"),wxPoint(155,y+120));
|
||||
|
||||
s_klatt[KLATT_Kopen] = new wxSpinCtrl(this,T_KOPEN,_T(""), wxPoint(6,y+144), wxSize(52,24), wxTE_CENTRE,0,500);
|
||||
t_klatt[KLATT_Kopen] = new wxStaticText(this,-1,_T("kopen"),wxPoint(61,y+148));
|
||||
|
||||
|
||||
// usepitchenv = new wxCheckBox(this,T_USEPITCHENV,_T("???"),wxPoint(20,320));
|
||||
t_zoomout = new wxButton(this,T_ZOOMOUT,_T("Zoom-"),wxPoint(16,420));
|
||||
t_zoomin = new wxButton(this,T_ZOOMIN,_T("Zoom+"),wxPoint(106,420));
|
||||
|
||||
y=468;
|
||||
t_amplitude = new wxSpinCtrl(this,T_AMPLITUDE,_T(""),
|
||||
wxPoint(6,370),wxSize(52,24),wxTE_CENTRE,0,500);
|
||||
t_lab[2] = new wxStaticText(this,-1,_T("% amp - Sequence"),wxPoint(61,374));
|
||||
wxPoint(6,y),wxSize(52,24),wxTE_CENTRE,0,y+130);
|
||||
t_lab[2] = new wxStaticText(this,-1,_T("% amp - Sequence"),wxPoint(61,y+4));
|
||||
// t_timeseq = new wxSpinCtrl(this,T_TIMESEQ,_T(""),
|
||||
// wxPoint(6,400),wxSize(52,24),wxTE_CENTRE,0,500);
|
||||
t_orig_seq = new wxStaticText(this,-1,_T("mS"),wxPoint(61,404));
|
||||
t_orig_seq = new wxStaticText(this,-1,_T("mS"),wxPoint(61,y+30));
|
||||
|
||||
t_pitch = new wxStaticText(this,-1,_T(""),wxPoint(4,440),wxSize(192,24));
|
||||
t_pitch = new wxStaticText(this,-1,_T(""),wxPoint(4,520),wxSize(192,24));
|
||||
|
||||
pitchgraph = new ByteGraph(this,wxPoint(0,460),wxSize(200,140));
|
||||
pitchgraph = new ByteGraph(this,wxPoint(0,538),wxSize(200,140));
|
||||
pitchgraph->SetData(128,env_fall);
|
||||
pitchgraph->ShowSpectrum(1);
|
||||
pitchgraph->Show();
|
||||
}
|
||||
|
||||
|
||||
void FormantDlg::HideFields(int synth_type)
|
||||
{//=======================================
|
||||
int ix;
|
||||
static int prev_synth_type = -1;
|
||||
|
||||
if(synth_type == prev_synth_type)
|
||||
return; // no change
|
||||
|
||||
if(synth_type == 0)
|
||||
{
|
||||
for(ix=0; ix<9; ix++)
|
||||
{
|
||||
s_klatt[ix]->Hide();
|
||||
t_klatt[ix]->Hide();
|
||||
}
|
||||
for(ix=6; ix<9; ix++)
|
||||
{
|
||||
t_pkfreq[ix]->Show();
|
||||
t_pkheight[ix]->Show();
|
||||
t_pkwidth[ix]->Hide();
|
||||
t_pkright[ix]->Hide();
|
||||
}
|
||||
t_ampframe->Show();
|
||||
t_amplitude->Show();
|
||||
t_lab[2]->Show();
|
||||
t_lab[3]->Show();
|
||||
t_labpk[7]->Show();
|
||||
t_labpk[8]->Show();
|
||||
t_lab[4]->Hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
for(ix=0; ix<9; ix++)
|
||||
{
|
||||
s_klatt[ix]->Show();
|
||||
t_klatt[ix]->Show();
|
||||
}
|
||||
for(ix=7; ix<9; ix++)
|
||||
{
|
||||
t_pkfreq[ix]->Hide();
|
||||
t_pkheight[ix]->Hide();
|
||||
t_pkwidth[ix]->Hide();
|
||||
t_pkright[ix]->Hide();
|
||||
}
|
||||
t_pkwidth[6]->Show(1);
|
||||
t_pkright[6]->Show(1);
|
||||
t_ampframe->Hide();
|
||||
t_amplitude->Hide();
|
||||
t_lab[2]->Hide();
|
||||
t_lab[3]->Hide();
|
||||
t_labpk[7]->Hide();
|
||||
t_labpk[8]->Hide();
|
||||
t_lab[4]->Show();
|
||||
}
|
||||
prev_synth_type = synth_type;
|
||||
}
|
||||
|
||||
|
||||
void FormantDlg::ShowFrame(SpectSeq *spectseq, int frame, int pk, int field)
|
||||
{//==============================================================
|
||||
@@ -169,6 +244,8 @@ void FormantDlg::ShowFrame(SpectSeq *spectseq, int frame, int pk, int field)
|
||||
return;
|
||||
sf = spectseq->frames[frame];
|
||||
|
||||
HideFields(spectseq->synthesizer_type);
|
||||
|
||||
if(field == 0xff)
|
||||
{
|
||||
// indicate the selected peak
|
||||
@@ -203,10 +280,8 @@ void FormantDlg::ShowFrame(SpectSeq *spectseq, int frame, int pk, int field)
|
||||
{
|
||||
value.Printf(_T("%3d"),sf->peaks[ix].pkwidth);
|
||||
t_pkwidth[ix]->SetValue(value);
|
||||
#ifdef WIDTH2
|
||||
value.Printf(_T("%3d"),sf->peaks[ix].pkright);
|
||||
t_pkright[ix]->SetValue(value);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,6 +291,16 @@ void FormantDlg::ShowFrame(SpectSeq *spectseq, int frame, int pk, int field)
|
||||
t_orig_frame->SetLabel(value);
|
||||
value.Printf(_T("%3d"),sf->amp_adjust);
|
||||
t_ampframe->SetValue(value);
|
||||
|
||||
if(spectseq->synthesizer_type == 1)
|
||||
{
|
||||
for(ix=0; ix<9; ix++)
|
||||
{
|
||||
SetSpinCtrl(s_klatt[ix], sf->klatt_param[ix]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // end of FormantDlg::ShowFrame
|
||||
|
||||
|
||||
|
||||
+1282
File diff suppressed because it is too large
Load Diff
+138
@@ -0,0 +1,138 @@
|
||||
|
||||
|
||||
#define CASCADE_PARALLEL 1 /* Type of synthesis model */
|
||||
#define ALL_PARALLEL 2
|
||||
|
||||
#define IMPULSIVE 1 /* Type of voicing source */
|
||||
#define NATURAL 2
|
||||
#define SAMPLED 3
|
||||
|
||||
#define PI 3.1415927
|
||||
|
||||
|
||||
/* typedef's that need to be exported */
|
||||
|
||||
typedef long flag;
|
||||
|
||||
/* Resonator Structure */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
double a;
|
||||
double b;
|
||||
double c;
|
||||
double p1;
|
||||
double p2;
|
||||
double a_inc;
|
||||
double b_inc;
|
||||
double c_inc;
|
||||
} resonator_t, *resonator_ptr;
|
||||
|
||||
/* Structure for Klatt Globals */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
flag synthesis_model; /* cascade-parallel or all-parallel */
|
||||
flag outsl; /* Output waveform selector */
|
||||
long samrate; /* Number of output samples per second */
|
||||
long FLPhz ; /* Frequeny of glottal downsample low-pass filter */
|
||||
long BLPhz ; /* Bandwidth of glottal downsample low-pass filter */
|
||||
flag glsource; /* Type of glottal source */
|
||||
int f0_flutter; /* Percentage of f0 flutter 0-100 */
|
||||
long nspfr; /* number of samples per frame */
|
||||
long nper; /* Counter for number of samples in a pitch period */
|
||||
long ns;
|
||||
long T0; /* Fundamental period in output samples times 4 */
|
||||
long nopen; /* Number of samples in open phase of period */
|
||||
long nmod; /* Position in period to begin noise amp. modul */
|
||||
long nrand; /* Varible used by random number generator */
|
||||
double pulse_shape_a; /* Makes waveshape of glottal pulse when open */
|
||||
double pulse_shape_b; /* Makes waveshape of glottal pulse when open */
|
||||
double minus_pi_t;
|
||||
double two_pi_t;
|
||||
double onemd;
|
||||
double decay;
|
||||
double amp_bypas; /* AB converted to linear gain */
|
||||
double amp_voice; /* AVdb converted to linear gain */
|
||||
double par_amp_voice; /* AVpdb converted to linear gain */
|
||||
double amp_aspir; /* AP converted to linear gain */
|
||||
double amp_frica; /* AF converted to linear gain */
|
||||
double amp_breth; /* ATURB converted to linear gain */
|
||||
double amp_gain0; /* G0 converted to linear gain */
|
||||
int num_samples; /* number of glottal samples */
|
||||
double sample_factor; /* multiplication factor for glottal samples */
|
||||
short *natural_samples; /* pointer to an array of glottal samples */
|
||||
long original_f0; /* original value of f0 not modified by flutter */
|
||||
|
||||
int fadeout; // set to 64 to cause fadeout over 64 samples
|
||||
int scale_wav; // depends on the voicing source
|
||||
|
||||
#define N_RSN 20
|
||||
#define Rnpc 0
|
||||
#define R1c 1
|
||||
#define R2c 2
|
||||
#define R3c 3
|
||||
#define R4c 4
|
||||
#define R5c 5
|
||||
#define R6c 6
|
||||
#define R7c 7
|
||||
#define R8c 8
|
||||
#define Rnz 9
|
||||
|
||||
#define Rparallel 10
|
||||
#define Rnpp 10
|
||||
#define R1p 11
|
||||
#define R2p 12
|
||||
#define R3p 13
|
||||
#define R4p 14
|
||||
#define R5p 15
|
||||
#define R6p 16
|
||||
|
||||
#define RGL 17
|
||||
#define RLP 18
|
||||
#define Rout 19
|
||||
|
||||
resonator_t rsn[N_RSN]; // internal storage for resonators
|
||||
resonator_t rsn_next[N_RSN];
|
||||
|
||||
} klatt_global_t, *klatt_global_ptr;
|
||||
|
||||
/* Structure for Klatt Parameters */
|
||||
|
||||
#define F_NP 0 // nasal zero formant
|
||||
#define F1 1
|
||||
#define F2 2
|
||||
#define F3 3
|
||||
#define F4 4
|
||||
#define F5 5
|
||||
#define F6 6
|
||||
#define F_NZ 9 // nasal pole formant
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
long F0hz10; /* Voicing fund freq in Hz */
|
||||
long AVdb; /* Amp of voicing in dB, 0 to 70 */
|
||||
int Fhz[10]; // formant Hz, F_NZ to F6 to F_NP
|
||||
int Bhz[10];
|
||||
int Ap[10]; /* Amp of parallel formants in dB, 0 to 80 */
|
||||
int Bphz[10]; /* Parallel formants bw in Hz, 40 to 1000 */
|
||||
|
||||
long ASP; /* Amp of aspiration in dB, 0 to 70 */
|
||||
long Kopen; /* # of samples in open period, 10 to 65 */
|
||||
long Aturb; /* Breathiness in voicing, 0 to 80 */
|
||||
long TLTdb; /* Voicing spectral tilt in dB, 0 to 24 */
|
||||
long AF; /* Amp of frication in dB, 0 to 80 */
|
||||
long Kskew; /* Skewness of alternate periods, 0 to 40 in sample#/2 */
|
||||
|
||||
long AB; /* Amp of bypass fric. in dB, 0 to 80 */
|
||||
long AVpdb; /* Amp of voicing, par in dB, 0 to 70 */
|
||||
long Gain0; /* Overall gain, 60 dB is unity, 0 to 60 */
|
||||
|
||||
long AVdb_tmp; //copy of AVdb, which is changed within parwave()
|
||||
int Fhz_next[10]; // Fhz for the next chunk, so we can do interpolation of resonator (a,b,c) parameters
|
||||
int Bhz_next[10];
|
||||
} klatt_frame_t, *klatt_frame_ptr;
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -1186,7 +1186,7 @@ static int attr_prosody_value(int param_type, const wchar_t *pw, int *value_out)
|
||||
pw++;
|
||||
sign = -1;
|
||||
}
|
||||
value = wcstod(pw,&tail);
|
||||
value = (float)wcstod(pw,&tail);
|
||||
if(tail == pw)
|
||||
{
|
||||
// failed to find a number, return 100%
|
||||
|
||||
+2
-2
@@ -300,10 +300,10 @@ static void init_path(const char *path)
|
||||
}
|
||||
|
||||
buf[0] = 0;
|
||||
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Speech\\Voices\\Tokens\\eSpeak", 0, KEY_READ, &RegKey);
|
||||
RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Speech\\Voices\\Tokens\\eSpeak", 0, KEY_READ, &RegKey);
|
||||
size = sizeof(buf);
|
||||
var_type = REG_SZ;
|
||||
RegQueryValueEx(RegKey, "path", 0, &var_type, buf, &size);
|
||||
RegQueryValueExA(RegKey, "path", 0, &var_type, buf, &size);
|
||||
|
||||
sprintf(path_home,"%s\\espeak-data",buf);
|
||||
|
||||
|
||||
+113
-8
@@ -137,7 +137,8 @@ int SpectFrame::Import(wxInputStream& stream1)
|
||||
double x;
|
||||
unsigned short *spect_data;
|
||||
|
||||
wxTextInputStream stream(stream1);
|
||||
synthesizer_type = 0;
|
||||
wxTextInputStream stream(stream1);
|
||||
|
||||
stream >> time;
|
||||
stream >> pitch;
|
||||
@@ -273,12 +274,13 @@ int SpectFrame::ImportSPC2(wxInputStream& stream, float &time_acc)
|
||||
|
||||
|
||||
|
||||
int SpectFrame::Load(wxInputStream& stream)
|
||||
{//========================================
|
||||
int SpectFrame::Load(wxInputStream& stream, int synth_type)
|
||||
{//========================================================
|
||||
int ix;
|
||||
int x;
|
||||
unsigned short *spect_data;
|
||||
|
||||
synthesizer_type = synth_type;
|
||||
wxDataInputStream s(stream);
|
||||
|
||||
time = s.ReadDouble();
|
||||
@@ -300,6 +302,14 @@ int SpectFrame::Load(wxInputStream& stream)
|
||||
peaks[ix].pkright = s.Read16();
|
||||
}
|
||||
|
||||
if(synthesizer_type == 1)
|
||||
{
|
||||
for(ix=0; ix<N_KLATTP; ix++)
|
||||
{
|
||||
klatt_param[ix] = s.Read16();
|
||||
}
|
||||
}
|
||||
|
||||
spect_data = new USHORT[nx];
|
||||
|
||||
if(spect_data == NULL)
|
||||
@@ -324,7 +334,7 @@ int SpectFrame::Save(wxOutputStream& stream)
|
||||
{//=========================================
|
||||
int ix;
|
||||
|
||||
wxDataOutputStream s(stream);
|
||||
wxDataOutputStream s(stream);
|
||||
|
||||
s.WriteDouble(time);
|
||||
s.WriteDouble(pitch);
|
||||
@@ -345,6 +355,14 @@ int SpectFrame::Save(wxOutputStream& stream)
|
||||
s.Write16(peaks[ix].pkright);
|
||||
}
|
||||
|
||||
if(synthesizer_type == 1)
|
||||
{
|
||||
for(ix=0; ix<N_KLATTP; ix++)
|
||||
{
|
||||
s.Write16(klatt_param[ix]);
|
||||
}
|
||||
}
|
||||
|
||||
for(ix=0; ix<nx; ix++)
|
||||
{
|
||||
s.Write16(spect[ix]);
|
||||
@@ -367,6 +385,7 @@ void SpectFrame::ZeroPeaks()
|
||||
void SpectFrame::CopyPeaks(SpectFrame *sf)
|
||||
{//=======================================
|
||||
memcpy(peaks,sf->peaks,sizeof(peaks));
|
||||
memcpy(klatt_param, sf->klatt_param, sizeof(klatt_param));
|
||||
keyframe = sf->keyframe;
|
||||
}
|
||||
|
||||
@@ -448,6 +467,9 @@ void SpectFrame::DrawPeaks(wxDC *dc, int offy, int frame_width, int seq_amplitud
|
||||
int y1, y2;
|
||||
double yy;
|
||||
int max_ix;
|
||||
int height;
|
||||
int pkright;
|
||||
int pkwidth;
|
||||
int buf[DRAWPEAKWIDTH*2];
|
||||
|
||||
max_ix = int(9000 * scale_x);
|
||||
@@ -459,9 +481,24 @@ void SpectFrame::DrawPeaks(wxDC *dc, int offy, int frame_width, int seq_amplitud
|
||||
|
||||
if((pk->pkfreq == 0) || (pk->pkheight==0)) continue;
|
||||
|
||||
if(synthesizer_type==1)
|
||||
{
|
||||
if(peak==0) continue;
|
||||
|
||||
height = pk->pkheight + (64 * 64);
|
||||
height = (500000/height) * 100;
|
||||
pkright = pkwidth = pk->pkheight / 16;
|
||||
}
|
||||
else
|
||||
{
|
||||
height = pk->pkheight;
|
||||
pkright = pk->pkright;
|
||||
pkwidth = pk->pkwidth;
|
||||
}
|
||||
|
||||
x1 = (int)(pk->pkfreq*scale_x);
|
||||
x2 = (int)((pk->pkfreq + pk->pkright)*scale_x);
|
||||
x3 = (int)((pk->pkfreq - pk->pkwidth)*scale_x);
|
||||
x2 = (int)((pk->pkfreq + pkright)*scale_x);
|
||||
x3 = (int)((pk->pkfreq - pkwidth)*scale_x);
|
||||
|
||||
if(x3 >= DRAWPEAKWIDTH)
|
||||
continue; // whole peak is off the scale
|
||||
@@ -469,7 +506,7 @@ void SpectFrame::DrawPeaks(wxDC *dc, int offy, int frame_width, int seq_amplitud
|
||||
if((width = x2-x1) <= 0) continue;
|
||||
for(ix=0; ix<width; ix++)
|
||||
{
|
||||
buf[x1+ix] += pk->pkheight * pk_shape1[(ix*PEAKSHAPEW)/width];
|
||||
buf[x1+ix] += height * pk_shape1[(ix*PEAKSHAPEW)/width];
|
||||
}
|
||||
|
||||
if((width = x1-x3) <= 0) continue;
|
||||
@@ -477,7 +514,7 @@ void SpectFrame::DrawPeaks(wxDC *dc, int offy, int frame_width, int seq_amplitud
|
||||
{
|
||||
if(x3+ix >= 0)
|
||||
{
|
||||
buf[x3+ix] += pk->pkheight * pk_shape1[((width-ix)*PEAKSHAPEW)/width];
|
||||
buf[x3+ix] += height * pk_shape1[((width-ix)*PEAKSHAPEW)/width];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -633,3 +670,71 @@ void SpectFrame::Draw(wxDC& dc, int offy, int frame_width, double scalex, double
|
||||
|
||||
} // end of SpectFrame::Draw
|
||||
|
||||
|
||||
void SpectFrame::KlattDefaults()
|
||||
{//============================
|
||||
// set default values for Klatt parameters
|
||||
int pk;
|
||||
int bw;
|
||||
int bw3;
|
||||
|
||||
synthesizer_type = 1;
|
||||
|
||||
klatt_param[KLATT_AV] = 59;
|
||||
klatt_param[KLATT_AVp] = 0;
|
||||
klatt_param[KLATT_Fric] = 0;
|
||||
klatt_param[KLATT_FricBP] = 0;
|
||||
klatt_param[KLATT_Aspr] = 0;
|
||||
klatt_param[KLATT_Turb] = 0;
|
||||
klatt_param[KLATT_Skew] = 0;
|
||||
klatt_param[KLATT_Tilt] = 0;
|
||||
klatt_param[KLATT_Kopen] = 40;
|
||||
klatt_param[KLATT_spare1] = 0;
|
||||
|
||||
bw = 60;
|
||||
if(peaks[1].pkfreq < 400)
|
||||
bw = 55;
|
||||
if(peaks[1].pkfreq > 600)
|
||||
bw = 70;
|
||||
if(peaks[1].pkfreq > 650)
|
||||
bw = 80;
|
||||
if(peaks[1].pkfreq > 750)
|
||||
bw = 90;
|
||||
peaks[1].pkwidth = bw;
|
||||
|
||||
bw = 90;
|
||||
bw3 = 150;
|
||||
if(peaks[2].pkfreq < 1000)
|
||||
{
|
||||
bw = 80;
|
||||
bw3 = 120;
|
||||
}
|
||||
if(peaks[2].pkfreq > 1600)
|
||||
{
|
||||
bw = 100;
|
||||
bw3 = 200;
|
||||
}
|
||||
if(peaks[2].pkfreq > 2000)
|
||||
{
|
||||
bw = 110;
|
||||
bw3 = 250;
|
||||
}
|
||||
peaks[2].pkwidth = bw;
|
||||
peaks[3].pkwidth = bw3;
|
||||
peaks[4].pkwidth = 200;
|
||||
peaks[5].pkwidth = 200;
|
||||
peaks[6].pkwidth = 500;
|
||||
peaks[0].pkfreq = 280; // FNP
|
||||
peaks[0].pkwidth = 280; // FNZ
|
||||
|
||||
peaks[7].pkfreq = 7800;
|
||||
peaks[7].pkwidth = 0;
|
||||
peaks[8].pkfreq = 9000;
|
||||
peaks[8].pkwidth = 0;
|
||||
|
||||
for(pk=0; pk<=8; pk++)
|
||||
{
|
||||
peaks[pk].pkheight = peaks[pk].pkwidth << 6;
|
||||
peaks[pk].pkright = 0;
|
||||
}
|
||||
}
|
||||
|
||||
+29
-6
@@ -39,8 +39,20 @@
|
||||
#define T_TIMEFRAME 310
|
||||
#define T_TIMESEQ 311
|
||||
|
||||
#define T_AV 312
|
||||
#define T_AVP 313
|
||||
#define T_FRIC 314
|
||||
#define T_FRICBP 315
|
||||
#define T_ASPR 316
|
||||
#define T_TURB 317
|
||||
#define T_SKEW 318
|
||||
#define T_TILT 319
|
||||
#define T_KOPEN 320
|
||||
|
||||
|
||||
#define FILEID1_SPECTSEQ 0x43455053
|
||||
#define FILEID2_SPECTSEQ 0x51455354
|
||||
#define FILEID2_SPECTSEQ 0x51455354 // for eSpeak sequence
|
||||
#define FILEID2_SPECTSEK 0x4b455354 // for Klatt sequence
|
||||
|
||||
#define FILEID1_SPC2 0x32435053 // an old format for spectrum files
|
||||
|
||||
@@ -110,7 +122,7 @@ public:
|
||||
~SpectFrame();
|
||||
int Import(wxInputStream &stream);
|
||||
int ImportSPC2(wxInputStream &stream, float &time_acc);
|
||||
int Load(wxInputStream &stream);
|
||||
int Load(wxInputStream &stream, int synthesizer_type);
|
||||
int Save(wxOutputStream &stream);
|
||||
void Draw(wxDC &dc, int offy, int frame_width, double scalex, double scaley);
|
||||
|
||||
@@ -122,6 +134,7 @@ public:
|
||||
void MakeWave(int peaks, PitchEnvelope &pitch, int amplitude, int duration);
|
||||
void MakeHtab(int numh, int *htab, int pitch);
|
||||
double GetRms(int amp);
|
||||
void KlattDefaults();
|
||||
|
||||
int selected;
|
||||
int keyframe;
|
||||
@@ -136,8 +149,11 @@ public:
|
||||
int nx;
|
||||
int markers;
|
||||
int max_y;
|
||||
int synthesizer_type; // 0=eSpeak, 1=Klatt
|
||||
USHORT *spect; // sqrt of harmonic amplitudes, 1-nx at 'pitch'
|
||||
|
||||
short klatt_param[N_KLATTP];
|
||||
|
||||
formant_t formants[N_PEAKS]; // this is just the estimate given by Praat
|
||||
peak_t peaks[N_PEAKS];
|
||||
|
||||
@@ -171,7 +187,8 @@ public:
|
||||
float GetKeyedLength();
|
||||
void SetFrameLengths();
|
||||
void ConstructVowel(void);
|
||||
|
||||
void SetKlattDefaults(void);
|
||||
|
||||
int numframes;
|
||||
int amplitude;
|
||||
int spare;
|
||||
@@ -186,6 +203,8 @@ public:
|
||||
int bass_reduction;
|
||||
int max_x;
|
||||
int max_y;
|
||||
int synthesizer_type;
|
||||
|
||||
|
||||
private:
|
||||
void Load2(wxInputStream& stream, int import, int n);
|
||||
@@ -262,8 +281,9 @@ class FormantDlg : public wxPanel
|
||||
public:
|
||||
FormantDlg(wxWindow *parent);
|
||||
void ShowFrame(SpectSeq *spectseq, int frame, int pk, int field);
|
||||
void OnCommand(wxCommandEvent& event);
|
||||
void OnSpin(wxSpinEvent& event);
|
||||
void OnCommand(wxCommandEvent& event);
|
||||
void OnSpin(wxSpinEvent& event);
|
||||
void HideFields(int synth_type);
|
||||
|
||||
wxCheckBox *usepitchenv;
|
||||
|
||||
@@ -275,6 +295,9 @@ class FormantDlg : public wxPanel
|
||||
wxStaticText *t_orig_frame;
|
||||
wxStaticText *t_orig_seq;
|
||||
|
||||
wxSpinCtrl *s_klatt[N_KLATTP];
|
||||
wxStaticText *t_klatt[N_KLATTP];
|
||||
|
||||
private:
|
||||
wxStaticText *t_lab[10];
|
||||
wxStaticText *t_labpk[N_PEAKS];
|
||||
@@ -346,7 +369,7 @@ extern void WavegenInit(int samplerate, int wavemult_fact);
|
||||
extern void WavegenInitPkData(int); // initialise envelope data
|
||||
extern void SetPitch(int length, unsigned char *env, int pitch1, int pitch2);
|
||||
extern void SetSynthHtab(int length_mS, USHORT *ht1, int nh1, float pitch1, USHORT *ht2, int nh2, float pitch2);
|
||||
extern void MakeWaveFile();
|
||||
extern void MakeWaveFile(int synthesis_method);
|
||||
extern void MakeWaveBuf(int length, UCHAR *buf);
|
||||
|
||||
extern int OpenWaveFile(const char *path, int samplerate);
|
||||
|
||||
+69
-25
@@ -244,10 +244,19 @@ void SpectDisplay::ReadDialogValues()
|
||||
void SpectDisplay::RefreshDialogValues(int type)
|
||||
//{=============================================
|
||||
{
|
||||
int ix;
|
||||
SpectFrame *sf;
|
||||
|
||||
sf = spectseq->frames[sframe];
|
||||
|
||||
spectseq->amplitude = formantdlg->t_amplitude->GetValue();
|
||||
spectseq->frames[sframe]->amp_adjust = formantdlg->t_ampframe->GetValue();
|
||||
spectseq->frames[sframe]->length_adjust =
|
||||
formantdlg->t_timeframe->GetValue() - spectseq->GetFrameLength(sframe,0,NULL);
|
||||
sf->amp_adjust = formantdlg->t_ampframe->GetValue();
|
||||
sf->length_adjust = formantdlg->t_timeframe->GetValue() - spectseq->GetFrameLength(sframe,0,NULL);
|
||||
|
||||
for(ix=0; ix<9; ix++)
|
||||
{
|
||||
sf->klatt_param[ix] = formantdlg->s_klatt[ix]->GetValue();
|
||||
}
|
||||
|
||||
if(type==0)
|
||||
{
|
||||
@@ -472,7 +481,7 @@ void SpectDisplay::OnMenu(wxCommandEvent& event)
|
||||
int code;
|
||||
wxKeyEvent keyevent;
|
||||
SpectFrame *sf;
|
||||
static int key[] = {0x1044,0x3044,0x104e,0x1047,0x105a,0x1051,0x3051,WXK_F1,WXK_F2,0x1049,WXK_F10};
|
||||
static int key[] = {0x1044,0x3044,0x104e,0x1047,0x105a,0x1051,0x3051,WXK_F1,WXK_F2,0x1049,WXK_F10,0x104b};
|
||||
|
||||
id = event.GetId();
|
||||
|
||||
@@ -624,13 +633,19 @@ void SpectDisplay::OnKey(wxKeyEvent& event)
|
||||
if(event.ControlDown())
|
||||
{
|
||||
// CTRL, rotate, make right slope steeper
|
||||
pk->pkright-= 5;
|
||||
if(spectseq->synthesizer_type==0)
|
||||
pk->pkright-= 5;
|
||||
pk->pkwidth += 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
pk->pkright -= 10;
|
||||
if(spectseq->synthesizer_type==0)
|
||||
pk->pkright -= 10;
|
||||
pk->pkwidth -= 10;
|
||||
if(pk->pkright < 0)
|
||||
pk->pkright = 0;
|
||||
if(pk->pkwidth < 0)
|
||||
pk->pkwidth = 0;
|
||||
}
|
||||
field = 4;
|
||||
display = 1;
|
||||
@@ -640,12 +655,14 @@ void SpectDisplay::OnKey(wxKeyEvent& event)
|
||||
if(event.ControlDown())
|
||||
{
|
||||
// CTRL: rotate, make left slope steeper
|
||||
pk->pkright += 5;
|
||||
if(spectseq->synthesizer_type==0)
|
||||
pk->pkright += 5;
|
||||
pk->pkwidth -= 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
pk->pkright += 10;
|
||||
if(spectseq->synthesizer_type==0)
|
||||
pk->pkright += 10;
|
||||
pk->pkwidth += 10;
|
||||
}
|
||||
field = 4;
|
||||
@@ -653,19 +670,37 @@ void SpectDisplay::OnKey(wxKeyEvent& event)
|
||||
break;
|
||||
|
||||
case '<': // width--
|
||||
pk->pkright -= 2;
|
||||
if(spectseq->synthesizer_type==0)
|
||||
pk->pkright -= 2;
|
||||
pk->pkwidth -= 2;
|
||||
if(pk->pkwidth < 0)
|
||||
pk->pkwidth = 0;
|
||||
display = 1;
|
||||
field = 4;
|
||||
break;
|
||||
|
||||
case '>': // width++
|
||||
pk->pkright += 2;
|
||||
if(spectseq->synthesizer_type==0)
|
||||
pk->pkright += 2;
|
||||
pk->pkwidth += 2;
|
||||
display = 1;
|
||||
field = 4;
|
||||
break;
|
||||
|
||||
case '[': // width--
|
||||
pk->pkright -= 1;
|
||||
if(pk->pkright < 0)
|
||||
pk->pkright = 0;
|
||||
display = 1;
|
||||
field = 4;
|
||||
break;
|
||||
|
||||
case ']': // width++
|
||||
pk->pkright += 1;
|
||||
display = 1;
|
||||
field = 4;
|
||||
break;
|
||||
|
||||
case '/': // make left=right
|
||||
i = pk->pkwidth + pk->pkright;
|
||||
pk->pkwidth = pk->pkright = i/2;
|
||||
@@ -708,6 +743,11 @@ void SpectDisplay::OnKey(wxKeyEvent& event)
|
||||
display = 2;
|
||||
break;
|
||||
|
||||
case 0x104b: // CTRL-K
|
||||
spectseq->SetKlattDefaults();
|
||||
display = 3;
|
||||
break;
|
||||
|
||||
case 0x104d: // CTRL-M
|
||||
sf->ToggleMarker(1);
|
||||
display = 2;
|
||||
@@ -825,25 +865,28 @@ void SpectDisplay::OnKey(wxKeyEvent& event)
|
||||
sf = spectseq->frames[sframe];
|
||||
pk = &sf->peaks[pk_num];
|
||||
|
||||
if(pk->pkwidth < 50) pk->pkwidth = 50; // min. width
|
||||
if(pk->pkright < 50) pk->pkright = 50;
|
||||
if(spectseq->synthesizer_type==0)
|
||||
{
|
||||
if(pk->pkwidth < 50) pk->pkwidth = 50; // min. width
|
||||
if(pk->pkright < 50) pk->pkright = 50;
|
||||
|
||||
// ensure minimum separation between peaks & prevent crossover
|
||||
if(direction > 0)
|
||||
{
|
||||
for(i=pk_num+1; i<N_PEAKS; i++)
|
||||
// ensure minimum separation between peaks & prevent crossover
|
||||
if(direction > 0)
|
||||
{
|
||||
if(sf->peaks[i].pkfreq < sf->peaks[i-1].pkfreq + 100)
|
||||
sf->peaks[i].pkfreq = sf->peaks[i-1].pkfreq + 100;
|
||||
for(i=pk_num+1; i<N_PEAKS; i++)
|
||||
{
|
||||
if(sf->peaks[i].pkfreq < sf->peaks[i-1].pkfreq + 100)
|
||||
sf->peaks[i].pkfreq = sf->peaks[i-1].pkfreq + 100;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
if(direction < 0)
|
||||
{
|
||||
for(i=pk_num-1; i>=0; i--)
|
||||
else
|
||||
if(direction < 0)
|
||||
{
|
||||
if(sf->peaks[i].pkfreq > sf->peaks[i+1].pkfreq - 100)
|
||||
sf->peaks[i].pkfreq = sf->peaks[i+1].pkfreq - 100;
|
||||
for(i=pk_num-1; i>=0; i--)
|
||||
{
|
||||
if(sf->peaks[i].pkfreq > sf->peaks[i+1].pkfreq - 100)
|
||||
sf->peaks[i].pkfreq = sf->peaks[i+1].pkfreq - 100;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1008,6 +1051,7 @@ void InitSpectrumDisplay()
|
||||
menu_spectdisplay->Append(202,_T("Copy Peaks Up SHIFT+CTRL+D"));
|
||||
menu_spectdisplay->Append(204,_T("Grid (toggle) CTRL+G"));
|
||||
menu_spectdisplay->Append(210,_T("Interpolate (percentage) CTRL+I"));
|
||||
menu_spectdisplay->Append(212,_T("Convert sequence to Klatt format CTRL+K"));
|
||||
menu_spectdisplay->Append(203,_T("Marker (toggle) CTRL+N"));
|
||||
menu_spectdisplay->Append(206,_T("Show Interpolation CTRL+Q"));
|
||||
menu_spectdisplay->Append(207,_T("Hide Interpolation CTRL+SHIFT+Q"));
|
||||
|
||||
+160
-46
@@ -34,8 +34,12 @@
|
||||
|
||||
#define MAX_HARMONIC 400 // 400 * 50Hz = 20 kHz, more than enough
|
||||
|
||||
int SpeakNextClause(FILE *f_text, const void *text_in, int control);
|
||||
extern void SetSynth(int length, int modn, frame_t *fr1, frame_t *fr2);
|
||||
#define KLATT_TEST
|
||||
|
||||
extern void SetSynth_Klatt(int length, int modn, frame_t *fr1, frame_t *fr2, voice_t *v, int control);
|
||||
extern int Wavegen_Klatt(int resume);
|
||||
|
||||
extern void SetSynth(int length, int modn, frame_t *fr1, frame_t *fr2, voice_t *v);
|
||||
extern int Wavegen();
|
||||
extern void CloseWaveFile2();
|
||||
extern FILE *f_wave;
|
||||
@@ -100,18 +104,27 @@ static void PeaksZero(peak_t *sp, peak_t *zero)
|
||||
|
||||
|
||||
|
||||
void MakeWaveFile()
|
||||
{//================
|
||||
void MakeWaveFile(int synthesis_method)
|
||||
{//====================================
|
||||
int result=1;
|
||||
int resume=0;
|
||||
unsigned char wav_outbuf[1024];
|
||||
|
||||
while(result != 0)
|
||||
{
|
||||
out_ptr = out_start = wav_outbuf;
|
||||
out_end = &wav_outbuf[sizeof(wav_outbuf)];
|
||||
result = Wavegen();
|
||||
|
||||
#ifdef KLATT_TEST
|
||||
if(synthesis_method == 1)
|
||||
result = Wavegen_Klatt(resume);
|
||||
else
|
||||
#endif
|
||||
result = Wavegen();
|
||||
|
||||
if(f_wave != NULL)
|
||||
fwrite(wav_outbuf, 1, out_ptr - wav_outbuf, f_wave);
|
||||
resume=1;
|
||||
}
|
||||
} // end of MakeWaveFile
|
||||
|
||||
@@ -135,6 +148,7 @@ SpectSeq::SpectSeq(int n)
|
||||
|
||||
max_x = 3000;
|
||||
max_y = 1;
|
||||
synthesizer_type = 0;
|
||||
}
|
||||
|
||||
SpectSeq::~SpectSeq()
|
||||
@@ -378,7 +392,7 @@ void SpectSeq::Load2(wxInputStream& stream, int import, int n)
|
||||
}
|
||||
else
|
||||
{
|
||||
if(frame->Load(stream) != 0) break;
|
||||
if(frame->Load(stream, synthesizer_type) != 0) break;
|
||||
}
|
||||
|
||||
frames[numframes++] = frame;
|
||||
@@ -493,8 +507,19 @@ int SpectSeq::Load(wxInputStream & stream)
|
||||
stream.SeekI(4);
|
||||
return(ImportSPC2(stream));
|
||||
}
|
||||
if(id1 != FILEID1_SPECTSEQ || id2 != FILEID2_SPECTSEQ)
|
||||
else
|
||||
if((id1 == FILEID1_SPECTSEQ) && (id2 == FILEID2_SPECTSEQ))
|
||||
{
|
||||
synthesizer_type = 0; // eSpeak formants
|
||||
}
|
||||
else
|
||||
if((id1 == FILEID1_SPECTSEQ) && (id2 == FILEID2_SPECTSEK))
|
||||
{
|
||||
synthesizer_type = 1; // formants for Klatt synthesizer
|
||||
}
|
||||
else
|
||||
{
|
||||
// Praat analysis data
|
||||
stream.SeekI(0);
|
||||
return(Import(stream));
|
||||
}
|
||||
@@ -530,7 +555,10 @@ int SpectSeq::Save(wxOutputStream &stream, int selection)
|
||||
wxDataOutputStream s(stream);
|
||||
|
||||
s.Write32(FILEID1_SPECTSEQ);
|
||||
s.Write32(FILEID2_SPECTSEQ);
|
||||
if(synthesizer_type == 1)
|
||||
s.Write32(FILEID2_SPECTSEK);
|
||||
else
|
||||
s.Write32(FILEID2_SPECTSEQ);
|
||||
|
||||
s.WriteString(name);
|
||||
s.Write16(count);
|
||||
@@ -549,6 +577,23 @@ int SpectSeq::Save(wxOutputStream &stream, int selection)
|
||||
|
||||
|
||||
|
||||
void SpectSeq::SetKlattDefaults(void)
|
||||
{//==================================
|
||||
int ix;
|
||||
|
||||
synthesizer_type = 1;
|
||||
|
||||
for(ix=0; ix<numframes; ix++)
|
||||
{
|
||||
if(frames[ix]->keyframe)
|
||||
{
|
||||
frames[ix]->KlattDefaults();
|
||||
}
|
||||
frames[ix]->synthesizer_type = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SpectSeq::ConstructVowel(void)
|
||||
{//================================
|
||||
@@ -785,6 +830,7 @@ void SpectSeq::CopyDown(int frame, int direction)
|
||||
frames[frame]->peaks[pk].pkwidth = frames[f1]->peaks[pk].pkwidth;
|
||||
frames[frame]->peaks[pk].pkright = frames[f1]->peaks[pk].pkright;
|
||||
}
|
||||
memcpy(frames[frame]->klatt_param, frames[f1]->klatt_param, sizeof(frames[frame]->klatt_param));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -878,46 +924,88 @@ void SpectSeq::ApplyAmp_adjust(SpectFrame *sp, peak_t *peaks)
|
||||
int y;
|
||||
|
||||
memcpy(peaks,sp->peaks,sizeof(*peaks)*N_PEAKS);
|
||||
for(ix=0; ix<N_PEAKS; ix++)
|
||||
|
||||
if(synthesizer_type == 0)
|
||||
{
|
||||
y = peaks[ix].pkheight * sp->amp_adjust * amplitude;
|
||||
peaks[ix].pkheight = y / 10000;
|
||||
for(ix=0; ix<N_PEAKS; ix++)
|
||||
{
|
||||
y = peaks[ix].pkheight * sp->amp_adjust * amplitude;
|
||||
peaks[ix].pkheight = y / 10000;
|
||||
}
|
||||
}
|
||||
} // end of ApplyAmp_adjust
|
||||
|
||||
|
||||
|
||||
void PeaksToFrame(peak_t *pks, frame_t *fr)
|
||||
{//========================================
|
||||
void PeaksToFrame(SpectFrame *sp1, peak_t *pks, frame_t *fr)
|
||||
{//=========================================================
|
||||
int ix;
|
||||
int x;
|
||||
int x, x2;
|
||||
|
||||
for(ix=0; ix<N_PEAKS; ix++)
|
||||
{
|
||||
fr->ffreq[ix] = pks[ix].pkfreq;
|
||||
fr->fheight[ix] = pks[ix].pkheight >> 6;
|
||||
|
||||
if(sp1->synthesizer_type==0)
|
||||
{
|
||||
x = pks[ix].pkheight >> 6;
|
||||
}
|
||||
else
|
||||
{
|
||||
x = pks[ix].pkheight >> 7;
|
||||
fr->fwidth6 = pks[6].pkwidth >> 1;
|
||||
fr->fright6 = pks[6].pkright;
|
||||
}
|
||||
|
||||
if(x > 255)
|
||||
x = 255;
|
||||
fr->fheight[ix] = x;
|
||||
|
||||
if(ix < 6)
|
||||
{
|
||||
if((x = (pks[ix].pkwidth >> 2)) > 255)
|
||||
x = pks[ix].pkwidth/2;
|
||||
x2 = pks[ix].pkright;
|
||||
|
||||
if(sp1->synthesizer_type == 0)
|
||||
{
|
||||
x /= 2;
|
||||
x2 /= 4;
|
||||
}
|
||||
if(x > 255)
|
||||
x = 255;
|
||||
fr->fwidth[ix] = x;
|
||||
|
||||
if((x = (pks[ix].pkright >> 2)) > 255)
|
||||
x = 255;
|
||||
fr->fright[ix] = x;
|
||||
if(x2 > 255)
|
||||
x2 = 255;
|
||||
fr->fright[ix] = x2;
|
||||
}
|
||||
}
|
||||
|
||||
for(ix=0; ix<N_KLATTP; ix++)
|
||||
{
|
||||
fr->klattp[ix] = sp1->klatt_param[ix];
|
||||
}
|
||||
}
|
||||
|
||||
static void SetSynth_mS(int length_mS, peak_t *sp1, peak_t *sp2)
|
||||
{//=============================================================
|
||||
static void SetSynth_mS(int length_mS, SpectFrame *sp1, SpectFrame *sp2, peak_t *pks1, peak_t *pks2, int control)
|
||||
{//==============================================================================================================
|
||||
static frame_t fr1, fr2;
|
||||
|
||||
PeaksToFrame(sp1,&fr1);
|
||||
PeaksToFrame(sp2,&fr2);
|
||||
PeaksToFrame(sp1,pks1,&fr1);
|
||||
PeaksToFrame(sp2,pks2,&fr2);
|
||||
|
||||
#ifdef KLATT_TEST
|
||||
if(sp1->synthesizer_type == 1)
|
||||
{
|
||||
SetSynth_Klatt((length_mS * samplerate) / 1000, 0, &fr1, &fr2, voice, control); // convert mS to samples
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
SetSynth((length_mS * samplerate) / 1000, 0, &fr1, &fr2, voice); // convert mS to samples
|
||||
}
|
||||
};
|
||||
|
||||
SetSynth((length_mS * samplerate) / 1000, 0, &fr1, &fr2); // convert mS to samples
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -939,6 +1027,7 @@ void SpectSeq::MakeWave(int start, int end, PitchEnvelope &pitch)
|
||||
peak_t peaks1[N_PEAKS];
|
||||
peak_t peaks2[N_PEAKS];
|
||||
|
||||
KlattInit();
|
||||
SpeakNextClause(NULL,NULL,2); // stop speaking file
|
||||
|
||||
if(numframes==0) return;
|
||||
@@ -1007,23 +1096,39 @@ void SpectSeq::MakeWave(int start, int end, PitchEnvelope &pitch)
|
||||
{
|
||||
ApplyAmp_adjust(sp1,peaks1);
|
||||
ApplyAmp_adjust(sp2,peaks2);
|
||||
|
||||
if(first)
|
||||
{
|
||||
PeaksZero(peaks1,peaks0); // fade in
|
||||
SetSynth_mS(20,peaks0,peaks1);
|
||||
MakeWaveFile();
|
||||
if(synthesizer_type == 1)
|
||||
{
|
||||
memcpy(peaks0,peaks1,sizeof(peaks0));
|
||||
}
|
||||
else
|
||||
{
|
||||
PeaksZero(peaks1,peaks0); // fade in
|
||||
}
|
||||
SetSynth_mS(20,sp1,sp1,peaks0,peaks1,0);
|
||||
MakeWaveFile(synthesizer_type);
|
||||
first=0;
|
||||
}
|
||||
|
||||
length = int(sp1->length * lfactor);
|
||||
SetSynth_mS(length,peaks1,peaks2);
|
||||
MakeWaveFile();
|
||||
SetSynth_mS(length,sp1,sp2,peaks1,peaks2,0);
|
||||
MakeWaveFile(synthesizer_type);
|
||||
}
|
||||
}
|
||||
}
|
||||
PeaksZero(peaks2,peaks0); // fade out
|
||||
SetSynth_mS(30,peaks2,peaks0);
|
||||
MakeWaveFile();
|
||||
|
||||
if(synthesizer_type == 1)
|
||||
{
|
||||
memcpy(peaks0,peaks2,sizeof(peaks0));
|
||||
}
|
||||
else
|
||||
{
|
||||
PeaksZero(peaks2,peaks0); // fade out
|
||||
}
|
||||
SetSynth_mS(30,sp2,sp2,peaks2,peaks0,2);
|
||||
MakeWaveFile(synthesizer_type);
|
||||
|
||||
CloseWaveFile2();
|
||||
PlayWavFile(fname_speech);
|
||||
@@ -1054,6 +1159,7 @@ void SpectFrame::MakeWave(int control, PitchEnvelope &pitche, int amplitude, int
|
||||
char *fname_speech;
|
||||
// USHORT htab0[600];
|
||||
|
||||
KlattInit();
|
||||
SpeakNextClause(NULL,NULL,2); // stop speaking file
|
||||
|
||||
length = duration;
|
||||
@@ -1069,23 +1175,31 @@ void SpectFrame::MakeWave(int control, PitchEnvelope &pitche, int amplitude, int
|
||||
if(OpenWaveFile2(fname_speech) != 0)
|
||||
return;
|
||||
|
||||
|
||||
if(control==0)
|
||||
{
|
||||
memcpy(peaks1,peaks,sizeof(peaks1));
|
||||
for(ix=0; ix<N_PEAKS; ix++)
|
||||
{
|
||||
y = peaks1[ix].pkheight * amp_adjust * amplitude;
|
||||
peaks1[ix].pkheight = y/10000;
|
||||
}
|
||||
|
||||
PeaksZero(peaks1,peaks0);
|
||||
|
||||
SetSynth_mS(20,peaks0,peaks1);
|
||||
MakeWaveFile();
|
||||
SetSynth_mS(length,peaks1,peaks1);
|
||||
MakeWaveFile();
|
||||
SetSynth_mS(30,peaks1,peaks0);
|
||||
MakeWaveFile();
|
||||
if(synthesizer_type == 0)
|
||||
{
|
||||
for(ix=0; ix<N_PEAKS; ix++)
|
||||
{
|
||||
y = peaks1[ix].pkheight * amp_adjust * amplitude;
|
||||
peaks1[ix].pkheight = y/10000;
|
||||
}
|
||||
PeaksZero(peaks1,peaks0);
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(peaks0,peaks1,sizeof(peaks0));
|
||||
}
|
||||
|
||||
SetSynth_mS(20,this,this,peaks0,peaks1,0);
|
||||
MakeWaveFile(synthesizer_type);
|
||||
SetSynth_mS(length,this,this,peaks1,peaks1,0);
|
||||
MakeWaveFile(synthesizer_type);
|
||||
SetSynth_mS(30,this,this,peaks1,peaks0,2);
|
||||
MakeWaveFile(synthesizer_type);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <sys/types.h>
|
||||
|
||||
// conditional compilation options
|
||||
#define INCLUDE_KLATT
|
||||
|
||||
#if defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN
|
||||
#define ARCH_BIG
|
||||
|
||||
@@ -77,7 +77,7 @@ BOOL load_MBR()
|
||||
if(hinstDllMBR != NULL)
|
||||
return TRUE; // already loaded
|
||||
|
||||
if (!(hinstDllMBR=LoadLibrary("mbrola.dll")))
|
||||
if (!(hinstDllMBR=LoadLibraryA("mbrola.dll")))
|
||||
return FALSE;
|
||||
init_MBR =(PROCIC) GetProcAddress(hinstDllMBR,"init_MBR");
|
||||
write_MBR =(PROCIC) GetProcAddress(hinstDllMBR,"write_MBR");
|
||||
@@ -179,7 +179,7 @@ espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int
|
||||
|
||||
#ifdef USE_MBROLA_LIB
|
||||
#ifdef PLATFORM_WINDOWS
|
||||
setVolumeRatio_MBR((float)(mbrola_control & 0xff) /16.0);
|
||||
setVolumeRatio_MBR((float)(mbrola_control & 0xff) /16.0f);
|
||||
#else
|
||||
mbrolib_get_parameter(mb_handle,&m_parameters);
|
||||
m_parameters.ignore_error = 1;
|
||||
|
||||
+26
-10
@@ -35,7 +35,7 @@
|
||||
#include "translate.h"
|
||||
#include "wave.h"
|
||||
|
||||
const char *version_string = "1.39.26 15.Nov.08";
|
||||
const char *version_string = "1.39.28 22.Nov.08";
|
||||
const int version_phdata = 0x013900;
|
||||
|
||||
int option_device_number = -1;
|
||||
@@ -375,9 +375,10 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, PHONEME_TAB *prev_ph, PHONEME_TAB
|
||||
int length1;
|
||||
int length_std;
|
||||
int length_factor;
|
||||
SPECT_SEQ *seq;
|
||||
SPECT_SEQ *seq2;
|
||||
SPECT_SEQ *seq, *seq2;
|
||||
SPECT_SEQK *seqk, *seqk2;
|
||||
PHONEME_TAB *next2_ph;
|
||||
frame_t *frame;
|
||||
static frameref_t frames_buf[N_SEQ_FRAMES];
|
||||
|
||||
PHONEME_TAB *other_ph;
|
||||
@@ -389,6 +390,7 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, PHONEME_TAB *prev_ph, PHONEME_TAB
|
||||
if((ix = LookupSound(this_ph,other_ph,which,match_level,0)) < 4)
|
||||
return(NULL);
|
||||
seq = (SPECT_SEQ *)(&spects_data[ix]);
|
||||
seqk = (SPECT_SEQK *)seq;
|
||||
nf = seq->n_frames;
|
||||
|
||||
|
||||
@@ -397,15 +399,20 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, PHONEME_TAB *prev_ph, PHONEME_TAB
|
||||
|
||||
seq_break = 0;
|
||||
length1 = 0;
|
||||
|
||||
for(ix=0; ix<nf; ix++)
|
||||
{
|
||||
frames_buf[ix].frame = &seq->frame[ix];
|
||||
frames_buf[ix].frflags = seq->frame[ix].frflags;
|
||||
frames_buf[ix].length = seq->frame[ix].length;
|
||||
if(seq->frame[ix].frflags & FRFLAG_VOWEL_CENTRE)
|
||||
if(seq->frame[0].frflags & FRFLAG_KLATT)
|
||||
frame = &seqk->frame[ix];
|
||||
else
|
||||
frame = (frame_t *)&seq->frame[ix];
|
||||
frames_buf[ix].frame = frame;
|
||||
frames_buf[ix].frflags = frame->frflags;
|
||||
frames_buf[ix].length = frame->length;
|
||||
if(frame->frflags & FRFLAG_VOWEL_CENTRE)
|
||||
seq_break = ix;
|
||||
}
|
||||
|
||||
|
||||
frames = &frames_buf[0];
|
||||
if(seq_break > 0)
|
||||
{
|
||||
@@ -462,14 +469,23 @@ frameref_t *LookupSpect(PHONEME_TAB *this_ph, PHONEME_TAB *prev_ph, PHONEME_TAB
|
||||
// a secondary reference has been returned, which is not a wavefile
|
||||
// add these spectra to the main sequence
|
||||
seq2 = (SPECT_SEQ *)(&spects_data[wavefile_ix]);
|
||||
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++)
|
||||
{
|
||||
frames[nf].length = seq2->frame[ix].length;
|
||||
if(seq2->frame[0].frflags & FRFLAG_KLATT)
|
||||
frame = &seqk2->frame[ix];
|
||||
else
|
||||
frame = (frame_t *)&seq2->frame[ix];
|
||||
|
||||
frames[nf].length = frame->length;
|
||||
if(ix > 0)
|
||||
frames[nf].frame = &seq2->frame[ix];
|
||||
{
|
||||
frames[nf].frame = frame;
|
||||
frames[nf].frflags = frame->frflags;
|
||||
}
|
||||
nf++;
|
||||
}
|
||||
wavefile_ix = 0;
|
||||
|
||||
+31
-5
@@ -354,6 +354,15 @@ static void set_frame_rms(frame_t *fr, int new_rms)
|
||||
849,851,853,856,858,861,863,865,868,870,872,875,877,879,882,884,
|
||||
886,889,891,893,896,898,900,902};
|
||||
|
||||
if(fr->frflags & FRFLAG_KLATT)
|
||||
{
|
||||
if(new_rms == -1)
|
||||
{
|
||||
fr->klattp[KLATT_AV] = 50;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if(fr->rms == 0) return; // check for divide by zero
|
||||
x = (new_rms * 64)/fr->rms;
|
||||
if(x >= 200) x = 199;
|
||||
@@ -375,6 +384,9 @@ static void formants_reduce_hf(frame_t *fr, int level)
|
||||
int ix;
|
||||
int x;
|
||||
|
||||
if(fr->frflags & FRFLAG_KLATT)
|
||||
return;
|
||||
|
||||
for(ix=2; ix<N_PEAKS; ix++)
|
||||
{
|
||||
x = fr->fheight[ix] * level;
|
||||
@@ -540,6 +552,10 @@ static short vcolouring[N_VCOLOUR][5] = {
|
||||
|
||||
next_rms = seq[1].frame->rms;
|
||||
|
||||
if(fr->frflags & FRFLAG_KLATT)
|
||||
{
|
||||
fr->klattp[KLATT_AV] = 53; // reduce the amplituide of the start of a vowel
|
||||
}
|
||||
if(f2 != 0)
|
||||
{
|
||||
if(rms & 0x20)
|
||||
@@ -661,6 +677,9 @@ static void SmoothSpect(void)
|
||||
q = wcmdq[syllable_centre];
|
||||
frame_centre = (frame_t *)q[2];
|
||||
|
||||
//if(frame_centre->frflags & FRFLAG_KLATT)
|
||||
// return; // TESTING
|
||||
|
||||
// backwards
|
||||
ix = syllable_centre -1;
|
||||
frame = frame2 = frame_centre;
|
||||
@@ -672,7 +691,7 @@ static void SmoothSpect(void)
|
||||
if(q[0] == WCMD_PAUSE || q[0] == WCMD_WAVE)
|
||||
break;
|
||||
|
||||
if(q[0] == WCMD_SPECT || q[0] == WCMD_SPECT2)
|
||||
if(q[0] <= WCMD_SPECT2)
|
||||
{
|
||||
len = q[1] & 0xffff;
|
||||
|
||||
@@ -759,7 +778,7 @@ static void SmoothSpect(void)
|
||||
if(q[0] == WCMD_PAUSE || q[0] == WCMD_WAVE)
|
||||
break;
|
||||
|
||||
if(q[0] == WCMD_SPECT || q[0] == WCMD_SPECT2)
|
||||
if(q[0] <= WCMD_SPECT2)
|
||||
{
|
||||
|
||||
len = q[1] & 0xffff;
|
||||
@@ -834,7 +853,7 @@ static void SmoothSpect(void)
|
||||
}
|
||||
|
||||
syllable_start = syllable_end;
|
||||
}
|
||||
} // end of SmoothSpect
|
||||
|
||||
|
||||
static void StartSyllable(void)
|
||||
@@ -891,22 +910,29 @@ if(which==1)
|
||||
if(frames == NULL)
|
||||
return(0); // not found
|
||||
|
||||
frame1 = frames[0].frame;
|
||||
frame1_length = frames[0].length;
|
||||
if(frame1->frflags & FRFLAG_KLATT)
|
||||
wcmd_spect = WCMD_KLATT;
|
||||
|
||||
if(wavefile_ix == 0)
|
||||
{
|
||||
if(wave_flag)
|
||||
{
|
||||
// cancel any wavefile that was playing previously
|
||||
wcmd_spect = WCMD_SPECT2;
|
||||
if(frame1->frflags & FRFLAG_KLATT)
|
||||
wcmd_spect = WCMD_KLATT2;
|
||||
wave_flag = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
wcmd_spect = WCMD_SPECT;
|
||||
if(frame1->frflags & FRFLAG_KLATT)
|
||||
wcmd_spect = WCMD_KLATT;
|
||||
}
|
||||
}
|
||||
|
||||
frame1 = frames[0].frame;
|
||||
frame1_length = frames[0].length;
|
||||
if(last_frame != NULL)
|
||||
{
|
||||
if(((last_frame->length < 2) || (last_frame->frflags & FRFLAG_VOWEL_CENTRE))
|
||||
|
||||
+66
-7
@@ -22,11 +22,13 @@
|
||||
|
||||
#define MAX_HARMONIC 400 // 400 * 50Hz = 20 kHz, more than enough
|
||||
#define N_SEQ_FRAMES 25 // max frames in a spectrum sequence (real max is ablut 8)
|
||||
#define STEPSIZE 64 // 2.9mS at 22 kHz sample rate
|
||||
|
||||
#define PITCHfall 0
|
||||
#define PITCHrise 1
|
||||
|
||||
// flags set for frames within a spectrum sequence
|
||||
#define FRFLAG_KLATT 0x01 // this frame includes extra data for Klatt synthesizer
|
||||
#define FRFLAG_VOWEL_CENTRE 0x02 // centre point of vowel
|
||||
#define FRFLAG_LEN_MOD 0x04 // reduce effect of length adjustment
|
||||
#define FRFLAG_BREAK_LF 0x08 // but keep f3 upwards
|
||||
@@ -75,6 +77,18 @@ typedef struct {
|
||||
short pkright;
|
||||
} peak_t;
|
||||
|
||||
#define N_KLATTP 10 // this affects the phoneme data file format
|
||||
#define KLATT_AV 0
|
||||
#define KLATT_Kopen 1
|
||||
#define KLATT_Skew 2
|
||||
#define KLATT_Tilt 3
|
||||
#define KLATT_Turb 4
|
||||
#define KLATT_Aspr 5
|
||||
#define KLATT_AVp 6 // this is after the parameters which can be change by the Voice
|
||||
#define KLATT_Fric 7
|
||||
#define KLATT_FricBP 8
|
||||
#define KLATT_spare1 9
|
||||
|
||||
typedef struct {
|
||||
short frflags;
|
||||
unsigned char length;
|
||||
@@ -83,8 +97,20 @@ typedef struct {
|
||||
unsigned char fheight[9];
|
||||
unsigned char fwidth[6]; // width/4
|
||||
unsigned char fright[6]; // width/4
|
||||
unsigned char fwidth6, fright6;
|
||||
unsigned char klattp[N_KLATTP];
|
||||
} frame_t;
|
||||
|
||||
typedef struct {
|
||||
short frflags;
|
||||
unsigned char length;
|
||||
unsigned char rms;
|
||||
short ffreq[9];
|
||||
unsigned char fheight[9];
|
||||
unsigned char fwidth[6]; // width/4
|
||||
unsigned char fright[6]; // width/4
|
||||
} frame_t2; // the original, without Klatt additions, used for file "phondata"
|
||||
|
||||
|
||||
|
||||
// formant data used by wavegen
|
||||
@@ -103,6 +129,26 @@ typedef struct {
|
||||
DOUBLEX right_inc;
|
||||
} wavegen_peaks_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned char *pitch_env;
|
||||
int pitch; // pitch Hz*256
|
||||
int pitch_ix; // index into pitch envelope (*256)
|
||||
int pitch_inc; // increment to pitch_ix
|
||||
int pitch_base; // Hz*256 low, before modified by envelope
|
||||
int pitch_range; // Hz*256 range of envelope
|
||||
|
||||
unsigned char *mix_wavefile; // wave file to be added to synthesis
|
||||
int n_mix_wavefile; // length in bytes
|
||||
int mix_wave_scale; // 0=2 byte samples
|
||||
int mix_wave_amp;
|
||||
int mix_wavefile_ix;
|
||||
|
||||
int amplitude;
|
||||
int amplitude_v;
|
||||
int prev_was_synth; // previous sound was synthesized (not a played wave or pause)
|
||||
} WGEN_DATA;
|
||||
|
||||
|
||||
typedef struct {
|
||||
double a;
|
||||
double b;
|
||||
@@ -113,11 +159,19 @@ typedef struct {
|
||||
|
||||
|
||||
typedef struct {
|
||||
short length;
|
||||
short length_total; // not used
|
||||
unsigned char n_frames;
|
||||
unsigned char flags;
|
||||
frame_t2 frame[N_SEQ_FRAMES]; // max. frames in a spectrum sequence
|
||||
} SPECT_SEQ; // sequence of espeak formant frames
|
||||
|
||||
typedef struct {
|
||||
short length_total; // not used
|
||||
unsigned char n_frames;
|
||||
unsigned char flags;
|
||||
frame_t frame[N_SEQ_FRAMES]; // max. frames in a spectrum sequence
|
||||
} SPECT_SEQ;
|
||||
} SPECT_SEQK; // sequence of klatt formants frames
|
||||
|
||||
|
||||
typedef struct {
|
||||
short length;
|
||||
@@ -176,16 +230,18 @@ extern unsigned char env_frise[128];
|
||||
extern unsigned char pitch_adjust_tab[MAX_PITCH_VALUE+1];
|
||||
|
||||
// queue of commands for wavegen
|
||||
#define WCMD_AMPLITUDE 1
|
||||
#define WCMD_PITCH 2
|
||||
#define WCMD_KLATT 1
|
||||
#define WCMD_KLATT2 2
|
||||
#define WCMD_SPECT 3
|
||||
#define WCMD_SPECT2 4
|
||||
#define WCMD_PAUSE 5
|
||||
#define WCMD_WAVE 6
|
||||
#define WCMD_WAVE2 7
|
||||
#define WCMD_MARKER 8
|
||||
#define WCMD_VOICE 9
|
||||
#define WCMD_EMBEDDED 10
|
||||
#define WCMD_AMPLITUDE 8
|
||||
#define WCMD_PITCH 9
|
||||
#define WCMD_MARKER 10
|
||||
#define WCMD_VOICE 11
|
||||
#define WCMD_EMBEDDED 12
|
||||
|
||||
|
||||
#define N_WCMDQ 160
|
||||
@@ -278,3 +334,6 @@ int PauseLength(int pause, int control);
|
||||
int LookupPhonemeTable(const char *name);
|
||||
|
||||
void InitBreath(void);
|
||||
|
||||
void KlattInit();
|
||||
int Wavegen_Klatt2(int length, int modulation, int resume, frame_t *fr1, frame_t *fr2);
|
||||
|
||||
@@ -515,6 +515,7 @@ SetLengthMods(tr,3); // all equal
|
||||
tr->langopts.param[LOPT_SONORANT_MIN] = 130; // limit the shortening of sonorants before short vowels
|
||||
tr->langopts.param[LOPT_REDUCE] = 1; // reduce vowels even if phonemes are specified in it_list
|
||||
tr->langopts.numbers = 0x2709 + NUM_ROMAN;
|
||||
tr->langopts.accents = 2; // Say "Capital" after the letter.
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -769,8 +770,9 @@ SetLengthMods(tr,3); // all equal
|
||||
static const unsigned char stress_amps_sq[8] = {17,12, 17,17, 20,20, 24,22 };
|
||||
tr = new Translator();
|
||||
SetupTranslator(tr,stress_lengths_sq,stress_amps_sq);
|
||||
tr->langopts.stress_flags = 0x4;
|
||||
tr->langopts.stress_flags = 0x4 + 0x10;
|
||||
SetLetterVowel(tr,'y');
|
||||
tr->langopts.numbers = 0x69 + 0x8000;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
+5
-1
@@ -1747,7 +1747,11 @@ int Translator::TranslateWord2(char *word, WORD_TAB *wtab, int pre_pause, int ne
|
||||
first_phoneme = 0;
|
||||
}
|
||||
}
|
||||
plist2->sourceix = source_ix; // ????
|
||||
// don't set new-word if there is a hyphen before it
|
||||
if((word_flags & FLAG_HYPHEN) == 0)
|
||||
{
|
||||
plist2->sourceix = source_ix;
|
||||
}
|
||||
|
||||
end_stressed_vowel = 0;
|
||||
if((stress >= 4) && (phoneme_tab[ph_list2[n_ph_list2-1].phcode]->type == phVOWEL))
|
||||
|
||||
+1
-1
@@ -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 25
|
||||
#define N_LETTER_GROUPS 26
|
||||
|
||||
|
||||
/* dictionary flags, word 1 */
|
||||
|
||||
+3
-2
@@ -249,6 +249,7 @@ void MakeWave2(PHONEME_LIST *p, int n_phonemes)
|
||||
char *fname_speech;
|
||||
int n_ph;
|
||||
|
||||
KlattInit();
|
||||
n_ph = n_phonemes;
|
||||
fname_speech = WavFileName();
|
||||
OpenWaveFile2(fname_speech);
|
||||
@@ -275,9 +276,9 @@ TranslDlg::TranslDlg(wxWindow *parent) : wxPanel(parent)
|
||||
{//=====================================================
|
||||
|
||||
t_source = new wxTextCtrl(this,T_SOURCE,_T(""),wxPoint(0,4),
|
||||
wxSize(200,250),wxTE_MULTILINE);
|
||||
wxSize(204,250),wxTE_MULTILINE);
|
||||
t_phonetic = new wxTextCtrl(this,T_PHONETIC,_T(""),wxPoint(0,262),
|
||||
wxSize(200,350),wxTE_MULTILINE);
|
||||
wxSize(204,350),wxTE_MULTILINE);
|
||||
|
||||
t_translate = new wxButton(this,T_TRANSLATE,_T("Translate"),wxPoint(4,620));
|
||||
t_translate = new wxButton(this,T_RULES,_T("Show Rules"),wxPoint(4,652));
|
||||
|
||||
+2
-1
@@ -40,6 +40,7 @@ typedef struct {
|
||||
int formant_factor; // adjust nominal formant frequencies by this because of the voice's pitch (256ths)
|
||||
int consonant_amp; // amplitude of unvoiced consonants
|
||||
int consonant_ampv; // amplitude of the noise component of voiced consonants
|
||||
int klatt[8];
|
||||
|
||||
// parameters used by Wavegen
|
||||
short freq[N_PEAKS]; // 100% = 256
|
||||
@@ -68,7 +69,7 @@ extern USHORT voice_pcnt[N_PEAKS+1][3];
|
||||
|
||||
|
||||
extern voice_t *voice;
|
||||
extern int tone_points[10];
|
||||
extern int tone_points[12];
|
||||
|
||||
const char *SelectVoice(espeak_VOICE *voice_select);
|
||||
espeak_VOICE *SelectVoiceByName(espeak_VOICE **voices, const char *name);
|
||||
|
||||
+24
-15
@@ -49,8 +49,8 @@ MNEM_TAB genders [] = {
|
||||
{"female", 2},
|
||||
{NULL, 0 }};
|
||||
|
||||
//int tone_points[10] = {250,140, 1200,110, -1,0, -1,0, -1,0};
|
||||
int tone_points[10] = {600,170, 1200,135, 2000,110, 3000,110, -1,0};
|
||||
int tone_points[12] = {600,170, 1200,135, 2000,110, 3000,110, -1,0};
|
||||
//int tone_points[12] = {250,200, 400,170, 600,170, 1200,135, 2000,110, -1,0};
|
||||
|
||||
// limit the rate of change for each formant number
|
||||
//static int formant_rate_22050[9] = {50, 104, 165, 230, 220, 220, 220, 220, 220}; // values for 22kHz sample rate
|
||||
@@ -101,11 +101,13 @@ espeak_VOICE voice_selected;
|
||||
#define V_NUMBERS 25
|
||||
#define V_OPTION 26
|
||||
|
||||
#define V_MBROLA 27
|
||||
#define V_MBROLA 27
|
||||
#define V_KLATT 28
|
||||
|
||||
// these need a phoneme table to have been specified
|
||||
#define V_REPLACE 28
|
||||
#define V_CONSONANTS 29
|
||||
#define V_REPLACE 29
|
||||
#define V_CONSONANTS 30
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
@@ -144,6 +146,7 @@ static keywtab_t keyword_tab[] = {
|
||||
{"option", V_OPTION},
|
||||
{"mbrola", V_MBROLA},
|
||||
{"consonants", V_CONSONANTS},
|
||||
{"klatt", V_KLATT},
|
||||
|
||||
// these just set a value in langopts.param[]
|
||||
{"l_dieresis", 0x100+LOPT_DIERESES},
|
||||
@@ -195,7 +198,7 @@ void SetToneAdjust(voice_t *voice, int *tone_pts)
|
||||
int height2;
|
||||
double rate;
|
||||
|
||||
for(pt=0; pt<10; pt+=2)
|
||||
for(pt=0; pt<12; pt+=2)
|
||||
{
|
||||
if(tone_pts[pt] == -1)
|
||||
{
|
||||
@@ -225,15 +228,16 @@ void SetToneAdjust(voice_t *voice, int *tone_pts)
|
||||
|
||||
void ReadTonePoints(char *string, int *tone_pts)
|
||||
{//=============================================
|
||||
// tone_pts[] is int[10]
|
||||
// tone_pts[] is int[12]
|
||||
int ix;
|
||||
|
||||
for(ix=0; ix<10; ix++)
|
||||
for(ix=0; ix<12; ix++)
|
||||
tone_pts[ix] = -1;
|
||||
|
||||
sscanf(string,"%d %d %d %d %d %d %d %d",
|
||||
sscanf(string,"%d %d %d %d %d %d %d %d %d %d",
|
||||
&tone_pts[0],&tone_pts[1],&tone_pts[2],&tone_pts[3],
|
||||
&tone_pts[4],&tone_pts[5],&tone_pts[6],&tone_pts[7]);
|
||||
&tone_pts[4],&tone_pts[5],&tone_pts[6],&tone_pts[7],
|
||||
&tone_pts[8],&tone_pts[9]);
|
||||
}
|
||||
|
||||
|
||||
@@ -369,10 +373,11 @@ void VoiceReset(int tone_only)
|
||||
voice->echo_amp = 0;
|
||||
voice->flutter = 64;
|
||||
voice->n_harmonic_peaks = 5;
|
||||
voice->peak_shape = 1;
|
||||
voice->peak_shape = 0;
|
||||
voice->voicing = 64;
|
||||
voice->consonant_amp = 100;
|
||||
voice->consonant_ampv = 100;
|
||||
memset(voice->klatt,0,sizeof(voice->klatt));
|
||||
|
||||
#ifdef PLATFORM_RISCOS
|
||||
voice->roughness = 1;
|
||||
@@ -864,6 +869,11 @@ voice_t *LoadVoice(const char *vname, int control)
|
||||
}
|
||||
break;
|
||||
|
||||
case V_KLATT:
|
||||
Read8Numbers(p,voice->klatt);
|
||||
voice->klatt[KLATT_Kopen] -= 40;
|
||||
break;
|
||||
|
||||
default:
|
||||
if((key & 0xff00) == 0x100)
|
||||
{
|
||||
@@ -1493,13 +1503,12 @@ void GetVoices(const char *path)
|
||||
}
|
||||
#else
|
||||
#ifdef PLATFORM_WINDOWS
|
||||
WIN32_FIND_DATA FindFileData;
|
||||
WIN32_FIND_DATAA FindFileData;
|
||||
HANDLE hFind = INVALID_HANDLE_VALUE;
|
||||
DWORD dwError;
|
||||
|
||||
#undef UNICODE // we need FindFirstFileA() which takes an 8-bit c-string
|
||||
sprintf(fname,"%s\\*",path);
|
||||
hFind = FindFirstFile(fname, &FindFileData);
|
||||
hFind = FindFirstFileA(fname, &FindFileData);
|
||||
if(hFind == INVALID_HANDLE_VALUE)
|
||||
return;
|
||||
|
||||
@@ -1529,7 +1538,7 @@ void GetVoices(const char *path)
|
||||
voices_list[n_voices_list++] = voice_data;
|
||||
}
|
||||
}
|
||||
} while(FindNextFile(hFind, &FindFileData) != 0);
|
||||
} while(FindNextFileA(hFind, &FindFileData) != 0);
|
||||
FindClose(hFind);
|
||||
|
||||
#else
|
||||
|
||||
+13
-2
@@ -510,6 +510,7 @@ void MakeVowelLists(void)
|
||||
PHONEME_TAB *ph;
|
||||
FILE *f;
|
||||
SPECT_SEQ *seq;
|
||||
SPECT_SEQK *seqk;
|
||||
frame_t *frame;
|
||||
int match_level;
|
||||
char dirname[sizeof(path_source)+20];
|
||||
@@ -547,10 +548,20 @@ void MakeVowelLists(void)
|
||||
continue;
|
||||
|
||||
seq = (SPECT_SEQ *)(&spects_data[ix]);
|
||||
frame = &seq->frame[1];
|
||||
seqk = (SPECT_SEQK *)seq;
|
||||
|
||||
if(seq->frame[0].frflags & FRFLAG_KLATT)
|
||||
frame = &seqk->frame[1];
|
||||
else
|
||||
frame = (frame_t *)&seq->frame[1];
|
||||
|
||||
fprintf(f,"%s\t %3d %4d %4d",WordToString(ph->mnemonic),
|
||||
frame->ffreq[1],frame->ffreq[2],frame->ffreq[3]);
|
||||
frame = &seq->frame[seq->n_frames-1];
|
||||
|
||||
if(seq->frame[0].frflags & FRFLAG_KLATT)
|
||||
frame = &seqk->frame[seqk->n_frames-1];
|
||||
else
|
||||
frame = (frame_t *)&seq->frame[seq->n_frames-1];
|
||||
fprintf(f," %3d %4d %4d\n",frame->ffreq[1],frame->ffreq[2],frame->ffreq[3]);
|
||||
}
|
||||
fclose(f);
|
||||
|
||||
+81
-68
@@ -34,6 +34,8 @@
|
||||
#include "synthesize.h"
|
||||
#include "voice.h"
|
||||
|
||||
//#undef INCLUDE_KLATT
|
||||
|
||||
#ifdef USE_PORTAUDIO
|
||||
#include "portaudio.h"
|
||||
#undef USE_PORTAUDIO
|
||||
@@ -51,10 +53,9 @@
|
||||
|
||||
#define PI 3.1415927
|
||||
#define PI2 6.283185307
|
||||
#define STEPSIZE 64 // 2.9mS at 22 kHz sample rate
|
||||
#define N_WAV_BUF 10
|
||||
|
||||
static voice_t *wvoice;
|
||||
voice_t *wvoice;
|
||||
|
||||
FILE *f_log = NULL;
|
||||
int option_waveout = 0;
|
||||
@@ -98,24 +99,13 @@ static int hspect[2][MAX_HARMONIC]; // 2 copies, we interpolate between
|
||||
static int max_hval=0;
|
||||
|
||||
static int nsamples=0; // number to do
|
||||
static int amplitude = 32;
|
||||
static int amplitude_v = 0;
|
||||
static int modulation_type = 0;
|
||||
static int glottal_flag = 0;
|
||||
static int glottal_reduce = 0;
|
||||
|
||||
static unsigned char *mix_wavefile = NULL; // wave file to be added to synthesis
|
||||
static int n_mix_wavefile = 0; // length in bytes
|
||||
static int mix_wave_scale = 0; // 0=2 byte samples
|
||||
static int mix_wave_amp = 32;
|
||||
static int mix_wavefile_ix = 0;
|
||||
|
||||
static int pitch; // pitch Hz*256
|
||||
static int pitch_ix; // index into pitch envelope (*256)
|
||||
static int pitch_inc; // increment to pitch_ix
|
||||
static unsigned char *pitch_env=NULL;
|
||||
static int pitch_base; // Hz*256 low, before modified by envelope
|
||||
static int pitch_range; // Hz*256 range of envelope
|
||||
WGEN_DATA wdata;
|
||||
|
||||
static int amp_ix;
|
||||
static int amp_inc;
|
||||
static unsigned char *amplitude_env = NULL;
|
||||
@@ -385,8 +375,8 @@ static void WcmdqIncHead()
|
||||
// data points from which to make the presets for pk_shape1 and pk_shape2
|
||||
#define PEAKSHAPEW 256
|
||||
static const float pk_shape_x[2][8] = {
|
||||
{0,-0.6, 0.0, 0.6, 1.4, 2.5, 4.5, 5.5},
|
||||
{0,-0.6, 0.0, 0.6, 1.4, 2.0, 4.5, 5.5 }};
|
||||
{0,-0.6f, 0.0f, 0.6f, 1.4f, 2.5f, 4.5f, 5.5f},
|
||||
{0,-0.6f, 0.0f, 0.6f, 1.4f, 2.0f, 4.5f, 5.5f }};
|
||||
static const float pk_shape_y[2][8] = {
|
||||
{0, 67, 81, 67, 31, 14, 0, -6} ,
|
||||
{0, 77, 81, 77, 31, 7, 0, -6 }};
|
||||
@@ -737,6 +727,7 @@ void WavegenInit(int rate, int wavemult_fact)
|
||||
if(wavemult_fact == 0)
|
||||
wavemult_fact=60; // default
|
||||
|
||||
wvoice = NULL;
|
||||
samplerate = samplerate_native = rate;
|
||||
PHASE_INC_FACTOR = 0x8000000 / samplerate; // assumes pitch is Hz*32
|
||||
Flutter_inc = (64 * samplerate)/rate;
|
||||
@@ -745,6 +736,9 @@ void WavegenInit(int rate, int wavemult_fact)
|
||||
wavephase = 0x7fffffff;
|
||||
max_hval = 0;
|
||||
|
||||
wdata.amplitude = 32;
|
||||
wdata.prev_was_synth = 0;
|
||||
|
||||
for(ix=0; ix<N_EMBEDDED_VALUES; ix++)
|
||||
embedded_value[ix] = embedded_default[ix];
|
||||
|
||||
@@ -769,7 +763,11 @@ void WavegenInit(int rate, int wavemult_fact)
|
||||
|
||||
WavegenInitPkData(1);
|
||||
WavegenInitPkData(0);
|
||||
pk_shape = pk_shape2; // ph_shape2
|
||||
pk_shape = pk_shape2; // pk_shape2
|
||||
|
||||
#ifdef INCLUDE_KLATT
|
||||
KlattInit();
|
||||
#endif
|
||||
|
||||
#ifdef LOG_FRAMES
|
||||
remove("log-espeakedit");
|
||||
@@ -784,7 +782,7 @@ int GetAmplitude(void)
|
||||
// normal, none, reduced, moderate, strong
|
||||
static const unsigned char amp_emphasis[5] = {16, 16, 10, 16, 22};
|
||||
|
||||
amp = (embedded_value[EMBED_A])*60/100;
|
||||
amp = (embedded_value[EMBED_A])*55/100;
|
||||
general_amplitude = amp * amp_emphasis[embedded_value[EMBED_F]] / 16;
|
||||
return(general_amplitude);
|
||||
}
|
||||
@@ -903,6 +901,13 @@ int PeaksToHarmspect(wavegen_peaks_t *peaks, int pitch, int *htab, int control)
|
||||
}
|
||||
}
|
||||
|
||||
// increase bass, up to the F1 peak
|
||||
h=1;
|
||||
for(f=pitch; f<peaks[1].freq; f+=pitch)
|
||||
{
|
||||
htab[h++] += (peaks[1].height * 16);
|
||||
}
|
||||
|
||||
// find the nearest harmonic for HF peaks where we don't use shape
|
||||
for(; pk<N_PEAKS; pk++)
|
||||
{
|
||||
@@ -961,10 +966,10 @@ static void AdvanceParameters()
|
||||
static int Flutter_ix = 0;
|
||||
|
||||
// advance the pitch
|
||||
pitch_ix += pitch_inc;
|
||||
if((ix = pitch_ix>>8) > 127) ix = 127;
|
||||
x = pitch_env[ix] * pitch_range;
|
||||
pitch = (x>>8) + pitch_base;
|
||||
wdata.pitch_ix += wdata.pitch_inc;
|
||||
if((ix = wdata.pitch_ix>>8) > 127) ix = 127;
|
||||
x = wdata.pitch_env[ix] * wdata.pitch_range;
|
||||
wdata.pitch = (x>>8) + wdata.pitch_base;
|
||||
|
||||
amp_ix += amp_inc;
|
||||
|
||||
@@ -973,9 +978,9 @@ static void AdvanceParameters()
|
||||
Flutter_ix = 0;
|
||||
x = ((int)(Flutter_tab[Flutter_ix >> 6])-0x80) * flutter_amp;
|
||||
Flutter_ix += Flutter_inc;
|
||||
pitch += x;
|
||||
if(pitch < 102400)
|
||||
pitch = 102400; // min pitch, 25 Hz (25 << 12)
|
||||
wdata.pitch += x;
|
||||
if(wdata.pitch < 102400)
|
||||
wdata.pitch = 102400; // min pitch, 25 Hz (25 << 12)
|
||||
|
||||
if(samplecount == samplecount_start)
|
||||
return;
|
||||
@@ -1159,26 +1164,26 @@ int Wavegen()
|
||||
{
|
||||
hswitch = 0;
|
||||
harmspect = hspect[0];
|
||||
maxh2 = PeaksToHarmspect(peaks,pitch<<4,hspect[0],0);
|
||||
maxh2 = PeaksToHarmspect(peaks, wdata.pitch<<4, hspect[0], 0);
|
||||
|
||||
// adjust amplitude to compensate for fewer harmonics at higher pitch
|
||||
amplitude2 = (amplitude * pitch)/(100 << 11);
|
||||
amplitude2 = (wdata.amplitude * wdata.pitch)/(100 << 11);
|
||||
|
||||
// switch sign of harmonics above about 900Hz, to reduce max peak amplitude
|
||||
h_switch_sign = 890 / (pitch >> 12);
|
||||
h_switch_sign = 890 / (wdata.pitch >> 12);
|
||||
}
|
||||
else
|
||||
AdvanceParameters();
|
||||
|
||||
// pitch is Hz<<12
|
||||
phaseinc = (pitch>>7) * PHASE_INC_FACTOR;
|
||||
cycle_samples = samplerate/(pitch >> 12); // sr/(pitch*2)
|
||||
hf_factor = pitch >> 11;
|
||||
phaseinc = (wdata.pitch>>7) * PHASE_INC_FACTOR;
|
||||
cycle_samples = samplerate/(wdata.pitch >> 12); // sr/(pitch*2)
|
||||
hf_factor = wdata.pitch >> 11;
|
||||
|
||||
maxh = maxh2;
|
||||
harmspect = hspect[hswitch];
|
||||
hswitch ^= 1;
|
||||
maxh2 = PeaksToHarmspect(peaks,pitch<<4,hspect[hswitch],1);
|
||||
maxh2 = PeaksToHarmspect(peaks, wdata.pitch<<4, hspect[hswitch], 1);
|
||||
|
||||
SetBreath();
|
||||
}
|
||||
@@ -1211,11 +1216,11 @@ int Wavegen()
|
||||
for(pk=wvoice->n_harmonic_peaks+1; pk<N_PEAKS; pk++)
|
||||
{
|
||||
// find the nearest harmonic for HF peaks where we don't use shape
|
||||
peak_harmonic[pk] = peaks[pk].freq / (pitch*16);
|
||||
peak_harmonic[pk] = peaks[pk].freq / (wdata.pitch*16);
|
||||
}
|
||||
|
||||
// adjust amplitude to compensate for fewer harmonics at higher pitch
|
||||
amplitude2 = (amplitude * pitch)/(100 << 11);
|
||||
amplitude2 = (wdata.amplitude * wdata.pitch)/(100 << 11);
|
||||
|
||||
if(glottal_flag > 0)
|
||||
{
|
||||
@@ -1337,22 +1342,22 @@ int Wavegen()
|
||||
|
||||
// mix with sampled wave if required
|
||||
z2 = 0;
|
||||
if(mix_wavefile_ix < n_mix_wavefile)
|
||||
if(wdata.mix_wavefile_ix < wdata.n_mix_wavefile)
|
||||
{
|
||||
if(mix_wave_scale == 0)
|
||||
if(wdata.mix_wave_scale == 0)
|
||||
{
|
||||
// a 16 bit sample
|
||||
c = mix_wavefile[mix_wavefile_ix+1];
|
||||
sample = mix_wavefile[mix_wavefile_ix] + (c * 256);
|
||||
mix_wavefile_ix += 2;
|
||||
c = wdata.mix_wavefile[wdata.mix_wavefile_ix+1];
|
||||
sample = wdata.mix_wavefile[wdata.mix_wavefile_ix] + (c * 256);
|
||||
wdata.mix_wavefile_ix += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
// a 8 bit sample, scaled
|
||||
sample = (signed char)mix_wavefile[mix_wavefile_ix++] * mix_wave_scale;
|
||||
sample = (signed char)wdata.mix_wavefile[wdata.mix_wavefile_ix++] * wdata.mix_wave_scale;
|
||||
}
|
||||
z2 = (sample * amplitude_v) >> 10;
|
||||
z2 = (z2 * mix_wave_amp)/32;
|
||||
z2 = (sample * wdata.amplitude_v) >> 10;
|
||||
z2 = (z2 * wdata.mix_wave_amp)/32;
|
||||
}
|
||||
|
||||
z1 = z2 + (((total>>8) * amplitude2) >> 13);
|
||||
@@ -1587,8 +1592,8 @@ static void SetAmplitude(int length, unsigned char *amp_env, int value)
|
||||
else
|
||||
amp_inc = (256 * ENV_LEN * STEPSIZE)/length;
|
||||
|
||||
amplitude = (value * general_amplitude)/16;
|
||||
amplitude_v = (amplitude * wvoice->consonant_ampv * 15)/100; // for wave mixed with voiced sounds
|
||||
wdata.amplitude = (value * general_amplitude)/16;
|
||||
wdata.amplitude_v = (wdata.amplitude * wvoice->consonant_ampv * 15)/100; // for wave mixed with voiced sounds
|
||||
|
||||
amplitude_env = amp_env;
|
||||
}
|
||||
@@ -1641,18 +1646,18 @@ if(option_log_frames)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if((pitch_env = env)==NULL)
|
||||
pitch_env = env_fall; // default
|
||||
if((wdata.pitch_env = env)==NULL)
|
||||
wdata.pitch_env = env_fall; // default
|
||||
|
||||
pitch_ix = 0;
|
||||
wdata.pitch_ix = 0;
|
||||
if(length==0)
|
||||
pitch_inc = 0;
|
||||
wdata.pitch_inc = 0;
|
||||
else
|
||||
pitch_inc = (256 * ENV_LEN * STEPSIZE)/length;
|
||||
wdata.pitch_inc = (256 * ENV_LEN * STEPSIZE)/length;
|
||||
|
||||
SetPitch2(wvoice, pitch1, pitch2, &pitch_base, &pitch_range);
|
||||
SetPitch2(wvoice, pitch1, pitch2, &wdata.pitch_base, &wdata.pitch_range);
|
||||
// set initial pitch
|
||||
pitch = ((pitch_env[0]*pitch_range)>>8) + pitch_base; // Hz << 12
|
||||
wdata.pitch = ((wdata.pitch_env[0] * wdata.pitch_range) >>8) + wdata.pitch_base; // Hz << 12
|
||||
|
||||
flutter_amp = wvoice->flutter;
|
||||
|
||||
@@ -1662,15 +1667,14 @@ if(option_log_frames)
|
||||
|
||||
|
||||
|
||||
void SetSynth(int length, int modn, frame_t *fr1, frame_t *fr2)
|
||||
{//============================================================
|
||||
void SetSynth(int length, int modn, frame_t *fr1, frame_t *fr2, voice_t *v)
|
||||
{//========================================================================
|
||||
int ix;
|
||||
DOUBLEX next;
|
||||
int length2;
|
||||
int length4;
|
||||
int qix;
|
||||
int cmd;
|
||||
voice_t *v;
|
||||
static int glottal_reduce_tab1[4] = {0x30, 0x30, 0x40, 0x50}; // vowel before [?], amp * 1/256
|
||||
// static int glottal_reduce_tab1[4] = {0x30, 0x40, 0x50, 0x60}; // vowel before [?], amp * 1/256
|
||||
static int glottal_reduce_tab2[4] = {0x90, 0xa0, 0xb0, 0xc0}; // vowel after [?], amp * 1/256
|
||||
@@ -1724,8 +1728,6 @@ if(option_log_frames)
|
||||
break; // next is not from spectrum, so continue until end of wave cycle
|
||||
}
|
||||
|
||||
v = wvoice;
|
||||
|
||||
// round the length to a multiple of the stepsize
|
||||
length2 = (length + STEPSIZE/2) & ~0x3f;
|
||||
if(length2 == 0)
|
||||
@@ -1767,7 +1769,7 @@ if(option_log_frames)
|
||||
static int Wavegen2(int length, int modulation, int resume, frame_t *fr1, frame_t *fr2)
|
||||
{//====================================================================================
|
||||
if(resume==0)
|
||||
SetSynth(length,modulation,fr1,fr2);
|
||||
SetSynth(length, modulation, fr1, fr2, wvoice);
|
||||
|
||||
return(Wavegen());
|
||||
}
|
||||
@@ -1839,35 +1841,46 @@ int WavegenFill(int fill_zeros)
|
||||
{
|
||||
echo_complete -= length;
|
||||
}
|
||||
n_mix_wavefile = 0;
|
||||
wdata.n_mix_wavefile = 0;
|
||||
wdata.prev_was_synth = 0;
|
||||
result = PlaySilence(length,resume);
|
||||
break;
|
||||
|
||||
case WCMD_WAVE:
|
||||
echo_complete = echo_length;
|
||||
n_mix_wavefile = 0;
|
||||
wdata.n_mix_wavefile = 0;
|
||||
wdata.prev_was_synth = 0;
|
||||
result = PlayWave(length,resume,(unsigned char*)q[2], q[3] & 0xff, q[3] >> 8);
|
||||
break;
|
||||
|
||||
case WCMD_WAVE2:
|
||||
// wave file to be played at the same time as synthesis
|
||||
mix_wave_amp = q[3] >> 8;
|
||||
mix_wave_scale = q[3] & 0xff;
|
||||
if(mix_wave_scale == 0)
|
||||
n_mix_wavefile = length*2;
|
||||
wdata.mix_wave_amp = q[3] >> 8;
|
||||
wdata.mix_wave_scale = q[3] & 0xff;
|
||||
if(wdata.mix_wave_scale == 0)
|
||||
wdata.n_mix_wavefile = length*2;
|
||||
else
|
||||
n_mix_wavefile = length;
|
||||
mix_wavefile_ix = 0;
|
||||
mix_wavefile = (unsigned char *)q[2];
|
||||
wdata.n_mix_wavefile = length;
|
||||
wdata.mix_wavefile_ix = 0;
|
||||
wdata.mix_wavefile = (unsigned char *)q[2];
|
||||
break;
|
||||
|
||||
case WCMD_SPECT2: // as WCMD_SPECT but stop any concurrent wave file
|
||||
n_mix_wavefile = 0; // ... and drop through to WCMD_SPECT case
|
||||
wdata.n_mix_wavefile = 0; // ... and drop through to WCMD_SPECT case
|
||||
case WCMD_SPECT:
|
||||
echo_complete = echo_length;
|
||||
result = Wavegen2(length & 0xffff,q[1] >> 16,resume,(frame_t *)q[2],(frame_t *)q[3]);
|
||||
break;
|
||||
|
||||
#ifdef INCLUDE_KLATT
|
||||
case WCMD_KLATT2: // as WCMD_SPECT but stop any concurrent wave file
|
||||
wdata.n_mix_wavefile = 0; // ... and drop through to WCMD_SPECT case
|
||||
case WCMD_KLATT:
|
||||
echo_complete = echo_length;
|
||||
result = Wavegen_Klatt2(length & 0xffff,q[1] >> 16,resume,(frame_t *)q[2],(frame_t *)q[3]);
|
||||
break;
|
||||
#endif
|
||||
|
||||
case WCMD_MARKER:
|
||||
MarkerEvent(q[1],q[2],q[3],out_ptr);
|
||||
#ifdef LOG_FRAMES
|
||||
|
||||
Reference in New Issue
Block a user