Browse Source

[1.39.26]

Added languages: ca (Catalan) lv (Latvian)
Numbers: allow for languages which have numbers for 100,000 and (or not) 10,000,000 (eg. hi, sw)
Phoneme [ts] new files in phsource/ustop
*_rules: fix crash for lettergroups numbers greater than 10, and better error reporting.
Languages: eo, jbo: adjust syllable lengths.
Language: en, fix "1st, 2nd, 3rd, 5th".  But a full ordinal number feature is still needed.


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

+ 34
- 10
dictsource/dict_phonemes View File

Dictionary eo_dict Dictionary eo_dict


@- a aI aU e eI eU i @- a aI aU e eI eU i
o OI u uI
o oI u uI


* b d dZ f g h j * b d dZ f g h j
k l m n p r R s k l m n p r R s


Dictionary jbo_dict Dictionary jbo_dict


@ a aI aU e eI i l-
o OI r- u
@ @- a aI aU e eI i
l- o oI r- u


b d dZ f g h j k
l m n N p R s S
t tS v w x z Z
* - b d dZ f g h
j k l m n N p R
s S t tS v w x z
Z




Dictionary ko_dict Dictionary ko_dict
Dictionary lv_dict Dictionary lv_dict


a a: ai au e e: ei i a a: ai au e e: ei i
i: ie iu o o: oi u u:
ui uo
i: ie iu o o: u u: ui
uo


: b c d dZ f g h : b c d dZ f g h
j J k l l^ m n n^ j J k l l^ m n n^
: b c ch d d. dZ f : b c ch d d. dZ f
g h j J k kh l l. g h j J k kh l l.
m n N n. n^ p ph R m n N n. n^ p ph R
R2 s s. S; t t. t.h th
tS v w z
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;

+ 24
- 16
dictsource/en_list View File

?5 _% pVRs'Ent ?5 _% pVRs'Ent
_& amp@sand _& amp@sand
_' kwoUt _' kwoUt
_( lEftbrakI2t
_) raItbrakI2t
_[ lEftbrakI2t
_] raItbrakI2t
_( lEftpa2rEn
_) raItpa2rEn
_* ast@rIsk _* ast@rIsk
_+ plVs _+ plVs
_, k0m@ _, k0m@
_- h,aIf@n _- h,aIf@n
?3 _- daS
_. d0t _. d0t
_: koUl@n _: koUl@n
_; sEmIk'oUl@n _; sEmIk'oUl@n
_< ElaNg@L
_< lEsDan
_= i:kw@Lz _= i:kw@Lz
_> A@aNg@L
_> greIt@Dan
_? kwEstS@n _? kwEstS@n
_@ at|saIn _@ at|saIn
_[ lEftskwe@
_] raItskwe@
_^ s3:kVmfl,Eks _^ s3:kVmfl,Eks
?5 _^ sIRkVmfl,Eks ?5 _^ sIRkVmfl,Eks
__ 'Vnd3sk,o@ __ 'Vnd3sk,o@
₨ ru:pi: ₨ ru:pi:
₩ w0n ₩ w0n
§ sEkS@n § sEkS@n
¶ par@graf // in en_rules
¶ par@graf
¶¶ par@grafs
¤ kVr@nsIsaIn ¤ kVr@nsIsaIn
© k0pIraIt © k0pIraIt
® rEdZIst3d ® rEdZIst3d
_dpt pOInt _dpt pOInt
_roman roUm@n_ _roman roUm@n_


(1 st) f3:st
(2 nd) sEk@nd
(3 rd) T3:d
(5 th) fIT



// ABBREVIATIONS // ABBREVIATIONS
//************** //**************
i.e aIi:_! $pause i.e aIi:_! $pause
irc $abbrev irc $abbrev
lbs paUndz lbs paUndz
LBS $abbrev
ltd lImI2tI2d ltd lImI2tI2d
mc m@k $alt2 // combine with the following word mc m@k $alt2 // combine with the following word
oem $abbrev oem $abbrev
xy $abbrev xy $abbrev




nd $only
rd $only
th $only
st $only
nd $only
rd $only
th $only
st $only


mr mIst3 $dot mr mIst3 $dot
mrs mIsI2z $dot mrs mIsI2z $dot
//ms mIz $dot //ms mIz $dot
dr d0kt3 $dot $capital
lt $dot
prof $dot
rev $dot
st $dot
dr $dot
lt $dot
prof $dot
rev $dot
st $dot


// not abbreviations when all-caps // not abbreviations when all-caps
all O:l $allcaps all O:l $allcaps

+ 0
- 2
dictsource/en_rules View File

%) % (% %) % (%
%%) % (_ _:: %%) % (_ _::


// extra symbols (mostly in en_list)
¶¶ par@grafs

+ 23
- 1
dictsource/eo_list View File

_0M4 duili'ono _0M4 duili'ono
_dpt komo_ _dpt komo_


// accent names
_acu dekst@-*akoRno
_brv hoko
_cir tsiRkumflekso
_dia dupunktasupeRsigno
_grv maldekst@-*akoRno
_tld tildo


_?? liteRo
_. punkto _. punkto
_: dupunkto
_; punktokomo
_, komo
_? demandosigno
_- dividost@-*eko
~ tildo
° gradoI
% p@-*otsento
@ po
& kaI



v vo // not Roman numbers v vo // not Roman numbers
x ikso x ikso


// misc adverbs etc // misc adverbs etc
eĉ $brk eĉ $brk
(pli ol) pliol
pli pl,i
plej pl,eI


// pronouns // pronouns
mi $u mi $u

+ 6
- 9
dictsource/eo_rules View File

.group o .group o
_) o(_ o _) o(_ o
o o o o
oj OI
oj oI
-) oj (_ %oI
-) on (_ %on
.group p .group p
_) p(_ po _) p(_ po
\.) . \.) .




. (D _:k'omo_
* asteRisko * asteRisko
pundo
(D _pundOI_:
£ pundo
£ (D _pundoI_:
! ,ekk@-*io, ! ,ekk@-*io,
: dupunkto
- _ - _
- (_a - (_a
$ dolaRo $ dolaRo
$ (D _dolaROI_:
% p@-*otsento
@ po
& %kaI
$ (D _dolaRoI_:



+ 1
- 1
dictsource/es_list View File

_» kom'iJ^as||dE**'EtSas _» kom'iJ^as||dE**'EtSas


^ TiRkumfl'exo ^ TiRkumfl'exo
€ eU*o
€ eU**o
% pOrTj'Ento % pOrTj'Ento
& ampERs'ant & ampERs'ant
@ a*R'oBa @ a*R'oBa

+ 5
- 5
dictsource/hi_list View File

_98 ath:'a:n@we: _98 ath:'a:n@we:
_99 nIn^j'a:n@we: _99 nIn^j'a:n@we:


_0C s'O:
_0M1 h@z'a:r
_0M2 d,Vsla:kh@_ // until we fix numbers > 100,000
_1M2 d,Vsla:kh@_ // until we fix numbers > 100,000
_0L l'a:kh
_0C s'O:
_0M1 h@z'a:r
_0M2 l'a:kh
_0M3 cr'ore
_0M4 b'ilion // ?? English
_dpt _d@s@ml'o:_ // ?? what is Hi for "." ? _dpt _d@s@ml'o:_ // ?? what is Hi for "." ?


// Single consonants // Single consonants

+ 9
- 9
dictsource/jbo_list View File

_i ibu _i ibu
j Z@ j Z@
k k@ k k@
l l@
m m@
n n@
_l l@
_m m@
_n n@
_o obu _o obu
p p@ p p@
r R@
_r R@
s s@ s s@
t t@ t t@
_u ubu _u ubu
i i_: $u // sentence break (recognised by eSpeak program). Try a short pause after ".i" i i_: $u // sentence break (recognised by eSpeak program). Try a short pause after ".i"


// end-of-clause [_;_] before these // end-of-clause [_;_] before these
noi _;_nOI $u
poi _;_pOI $u
noi _;_noI $u
poi _;_poI $u
no'u _;_nohu $u no'u _;_nohu $u
po'u _;_pohu $u po'u _;_pohu $u
goi _;_gOI $u
goi _;_goI $u


ija _;_iZa // should this series be unstressed? ija _;_iZa // should this series be unstressed?
ijanai _;_iZanaI ijanai _;_iZanaI


// terminators (include a pause after) // terminators (include a pause after)
ku ku_:: $u ku ku_:: $u
boi bOI_:: $u
boi boI_:: $u
vau vaU_:: $u vau vaU_:: $u
kei keI_:: $u kei keI_:: $u
toi tOI_:: $u
toi toI_:: $u

+ 20
- 17
dictsource/jbo_rules View File

a a a a
ai aI ai aI
au aU au aU
X) a (_ %a // single-syllable cmavo are unstressed
X) ai (_ %aI
X) au (_ %aU
X) a (_ ,a // single-syllable cmavo are unstressed
X) ai (_ ,aI
X) au (_ ,aU


.group b .group b
b b b b
.group e .group e
e e e e
ei eI ei eI
X) e (_ %e
X) ei (_ %eI
X) e (_ ,e
X) ei (_ ,eI


.group f .group f
f f f f
.group i .group i
i i i i
i (A j i (A j
X) i (_ %i
X) i (A_ %j
X) i (_ ,i
X) i (A_ ,j


.group j .group j
j Z j Z
k k k k


.group l .group l
l l-
l l- // syllabic
A) l l A) l l
l (A l l (A l


m m m m


.group n .group n
n n
n n- // syllabic
A) n n
n (A n
n (g N n (g N
n (k N n (k N


.group o .group o
o o o o
oi OI
X) o (_ %o
X) oi (_ %OI
oi oI
X) o (_ ,o
X) oi (_ ,oI


.group p .group p
p p p p
q kw q kw


.group r .group r
r r-
r r- // syllabic
A) r R A) r R
C) r (A @-*
r (A R r (A R




.group u .group u
u u u u
u (A w u (A w
X) u (_ %u
X) u (A_ %w
X) u (_ ,u
X) u (A_ ,w


.group v .group v
v v v v
' h ' h
_) ' (_ '@h@ _) ' (_ '@h@


. _!
. _! // dot
_) . (@P1 _! // remove . prefix _) . (@P1 _! // remove . prefix
. (_S1 _! // remove . suffix . (_S1 _! // remove . suffix




ˈ ' // U+2c8 stress marker
ˈ ' // U+2c8 stress marker (from syllable capitalisation)

+ 11
- 10
dictsource/sw_list View File

_7C m,ias'aba _7C m,ias'aba
_8C m,ian'ane _8C m,ian'ane
_9C m,iat'isa _9C m,iat'isa
_1L l'akim'oJa
_2L l'aki_|mb'ili
_3L l'akit'atu
_4L l'aki'n-ne
_5L l'akit'ano
_6L l'akis'ita
_7L l'akis'aba
_8L l'akin'ane
_9L l'akit'isa
_0M1 'elfu _0M1 'elfu
_1M1 ,elfum'oJa _1M1 ,elfum'oJa
_2M1 ,elfu_|mb'ili _2M1 ,elfu_|mb'ili
_7M1 ,elfus'aba _7M1 ,elfus'aba
_8M1 ,elfun'ane _8M1 ,elfun'ane
_9M1 ,elfut'isa _9M1 ,elfut'isa
_0M2 _|mili'oni
_1M2 l'akim'oJa
_2M2 l'aki_|mb'ili
_3M2 l'akit'atu
_4M2 l'aki'n-ne
_5M2 l'akit'ano
_6M2 l'akis'ita
_7M2 l'akis'aba
_8M2 l'akin'ane
_9M2 l'akit'isa
_0M3 _|mili'oni // 1,000,000
_0M4 _|bili'oni
_dpt _nukta _dpt _nukta
_0and _|na _0and _|na



+ 4
- 0
espeak-data/voices/ca View File

name catalan-test
language ca
gender male


+ 6
- 0
espeak-data/voices/lv View File

name latvian
language lv
gender male

replace 03 o o:


+ 73
- 46
phsource/compile_report View File

58 phoneme tables
59 phoneme tables
new total new total
base 101 101 base 101 101
base2 24 120 base2 24 120
hi 52 139 hi 52 139
ta 17 142 ta 17 142
hu 23 117 hu 23 117
lv 28 123
nl 28 124 nl 28 124
pl 18 114 pl 18 114
sk 29 132 sk 29 132
la 21 119 la 21 119
es 9 121 es 9 121
es_la 1 121 es_la 1 121
ca 9 122
pt 28 137 pt 28 137
pt_pt 20 137 pt_pt 20 137
ro 36 144 ro 36 144
kn 15 141 kn 15 141
bn 59 147 bn 59 147
ne 23 151 ne 23 151
lv 28 123
hy 17 115 hy 17 115
om 18 118
om 21 121


Data file Used by Data file Used by
b/b [b] base b/b [b] base
[<h>] la [<h>] la
[H] bn [H] bn
[h] bn [h] bn
[a#] om
h/he [h] base h/he [h] base
[h] fi [h] fi
[H] hi [H] hi
[l] sk [l] sk
[l] ru [l] ru
[l] la [l] la
[l] ca
[l] pt [l] pt
[l;] ro [l;] ro
l/_l [l] base l/_l [l] base
[l] sk [l] sk
[l] ru [l] ru
[l] la [l] la
[l] ca
[l] pt [l] pt
[l;] ro [l;] ro
[l] zh [l] zh
[l] sk [l] sk
[l] ru [l] ru
[l] la [l] la
[l] ca
[l] pt [l] pt
[l;] ro [l;] ro
[l] sq [l] sq
r3/r_trill [R2] base r3/r_trill [R2] base
[R3] base [R3] base
[r] af [r] af
[R2] lv
[r] nl [r] nl
[R] sk [R] sk
[r*] sr [r*] sr
[x] pt [x] pt
[R2] lv
r3/r_trill2 [R] base r3/r_trill2 [R] base
[r] cy [r] cy
[R] hr [R] hr
[r] af [r] af
[r] nl [r] nl
r3/r_trill.wav [R2] base r3/r_trill.wav [R2] base
[R2] lv
[R] sk [R] sk
[r*] sr [r*] sr
[x] pt [x] pt
[R2] lv
r3/r_u [(u)] base r3/r_u [(u)] base
r3/r_ulv [r"] hy r3/r_ulv [r"] hy
r3/r_uvl [r"] hy r3/r_uvl [r"] hy
[z2] fr [z2] fr
[z3] fr [z3] fr
[s2] hu [s2] hu
[s2] lv
[s] es [s] es
[s#] pt [s#] pt
[z;] ro [z;] ro
[s2] is [s2] is
[s2] lv
ufric/s! [s] base ufric/s! [s] base
[s2] fi [s2] fi
[s] fr [s] fr
[s2] hu [s2] hu
[s2] lv
[s] es [s] es
[s#] pt [s#] pt
[s2] is [s2] is
[s2] lv
ufric/s_continue [s2] fi ufric/s_continue [s2] fi
[s2] hu [s2] hu
[s2] is
[s2] lv [s2] lv
[s2] is
ufric/sh [S] base ufric/sh [S] base
[S] fr [S] fr
[s#] pt_pt [s#] pt_pt
ufric/xx3 [X] base ufric/xx3 [X] base
[Q] hy [Q] hy
ustop/c [c] base ustop/c [c] base
ustop/c_ejc [c`] om
ustop/k [k] base ustop/k [k] base
[k] en [k] en
[k] fr [k] fr
[k] fr [k] fr
[kh] hi [kh] hi
[k] hu [k] hu
[k] lv
[k] sk [k] sk
[k] el [k] el
[kh] zh [kh] zh
[k] sw [k] sw
[k] sq [k] sq
[kh] bn [kh] bn
[k] lv
ustop/k_ejc [k`] om
ustop/ki [c] base ustop/ki [c] base
[k] base [k] base
[k] base2 [k] base2
[k] fi [k] fi
[k] fr [k] fr
[k] hu [k] hu
[k] lv
[k] sk [k] sk
[k^] mk [k^] mk
[c] is [c] is
[c] tr [c] tr
[J] ku [J] ku
[c] ku [c] ku
[k] lv
ustop/ki_ejc [k`] om
ustop/kl [k] base ustop/kl [k] base
[k] base2 [k] base2
[k] en [k] en
[k] fr [k] fr
[kh] hi [kh] hi
[k] hu [k] hu
[k] lv
[k] sk [k] sk
[k] el [k] el
[k] zhy [k] zhy
[k] sw [k] sw
[kh] bn [kh] bn
[k] lv
ustop/kr [k] base ustop/kr [k] base
[k] base2 [k] base2
[k] en [k] en
[k] fr [k] fr
[kh] hi [kh] hi
[k] hu [k] hu
[k] lv
[k] sk [k] sk
[k] el [k] el
[k] zhy [k] zhy
[k] sw [k] sw
[kh] bn [kh] bn
[k] lv
ustop/k_unasp [k] base ustop/k_unasp [k] base
[k] base2 [k] base2
[k] fi [k] fi
[k] hi [k] hi
[k] hu [k] hu
[k] lv
[k] sk [k] sk
[k] el [k] el
[k] zhy [k] zhy
[k`] ko [k`] ko
[k] sq [k] sq
[k] bn [k] bn
[k] lv
[k`] om
ustop/k_unasp_ [k] zh ustop/k_unasp_ [k] zh
ustop/null [?] base ustop/null [?] base
[dh] om
ustop/p [p] base ustop/p [p] base
[p] fr [p] fr
[p2] fr [p2] fr
[ph] hy [ph] hy
ustop/p_asp [ph] hi ustop/p_asp [ph] hi
[ph] hy [ph] hy
ustop/p_ejc [p`] om
ustop/percus10 [(X1] base ustop/percus10 [(X1] base
ustop/pl [p] base ustop/pl [p] base
[p] base2 [p] base2
[p] hi [p] hi
[ph] hi [ph] hi
[p] hu [p] hu
[p] lv
[p] sk [p] sk
[p] la [p] la
[p;] ro [p;] ro
[p] sq [p] sq
[p] bn [p] bn
[ph] bn [ph] bn
[p] lv
[ph] hy [ph] hy
ustop/pr [p] base ustop/pr [p] base
[p] base2 [p] base2
[p] fr [p] fr
[p] hi [p] hi
[p] hu [p] hu
[p] lv
[p] sk [p] sk
[p] la [p] la
[p;] ro [p;] ro
[p`] ko [p`] ko
[p] sq [p] sq
[p] bn [p] bn
[p] lv
[p`] om
ustop/p_unasp_ [p] base2 ustop/p_unasp_ [p] base2
[p] fi [p] fi
[p] hi [p] hi
[p] hu [p] hu
[p] lv
[p] sk [p] sk
[p] la [p] la
[p;] ro [p;] ro
[p] sq [p] sq
[p] bn [p] bn
[p] lv
ustop/q [q] base ustop/q [q] base
ustop/q_u [q] base ustop/q_u [q] base
ustop/t [t] base ustop/t [t] base
[t3] fr [t3] fr
[t.] hi [t.] hi
[t.h] hi [t.h] hi
[t] lv
[t] sk [t] sk
[t] el [t] el
[th] zh [th] zh
[t] sq [t] sq
[t.] bn [t.] bn
[t.h] bn [t.h] bn
[t] lv
ustop/t_dnt [t] base ustop/t_dnt [t] base
[t[] base [t[] base
[t] base2 [t] base2
[t] sw [t] sw
[t`] ko [t`] ko
[t] bn [t] bn
[t`] om
ustop/t_dnt2 [t[] vi ustop/t_dnt2 [t[] vi
ustop/t_ejc [t`] om
ustop/t_hi [t] hi ustop/t_hi [t] hi
[t] bn [t] bn
[th] bn [th] bn
[ts;] ro [ts;] ro
[z] zhy [z] zhy
[tsh] zh [tsh] zh
[ts] hy
ustop/ts_ [ts] base2
[ts] de
[ts] eo
[ts] hu
[ts] lv [ts] lv
[ts] pl
[ts] ru
[ts;] ro
[ts] hy [ts] hy
ustop/ts2 [ts] lv
ustop/tsh [tS] base ustop/tsh [tS] base
[c] zhy [c] zhy
ustop/tsh_ [tS] base ustop/tsh_ [tS] base
[t2] fr [t2] fr
[t3] fr [t3] fr
[t.] hi [t.] hi
[t] lv
[t] sk [t] sk
[t] el [t] el
[t] sq [t] sq
[t.] bn [t.] bn
[t] lv
ustop/tsh_pzd [tS;] zh ustop/tsh_pzd [tS;] zh
ustop/tsh_pzd_unasp [tS;] zh ustop/tsh_pzd_unasp [tS;] zh
ustop/tsh_sr [tS] sr ustop/tsh_sr [tS] sr
[c] hu [c] hu
[c`] ko [c`] ko
[c] bn [c] bn
[c`] om
ustop/ts_pzd3 [tS;] hr ustop/ts_pzd3 [tS;] hr
[dZ;] hr [dZ;] hr
ustop/t_sr [d] sr ustop/t_sr [d] sr
vdiph/8u [oU] en_us vdiph/8u [oU] en_us
[ou] zh [ou] zh
vdiph/aae [aI] en_us vdiph/aae [aI] en_us
vdiph/aai [aai] zhy
vdiph/aai [ai] lv
[aai] zhy
[aI] ne [aI] ne
[ai] lv
vdiph/aai_2 [AI] af vdiph/aai_2 [AI] af
[AY] cy [AY] cy
vdiph/aai_3 [ai] fi vdiph/aai_3 [ai] fi
vdiph/aau [au] fi vdiph/aau [au] fi
[au] lv
vdiph/aau_2 [aU] en_wi vdiph/aau_2 [aU] en_wi
[aU] de [aU] de
[VU] nl [VU] nl
[eI] hy [eI] hy
vdiph/eei_2 [eI] eo vdiph/eei_2 [eI] eo
[ei] fi [ei] fi
[eI] id
[ei] lv [ei] lv
[eI] id
vdiph/eei_3 [eI] sk vdiph/eei_3 [eI] sk
[eI] ku [eI] ku
vdiph/eeu [EU] pt vdiph/eeu [EU] pt
[OI] en_n [OI] en_n
[OI] cy [OI] cy
[OY] cy [OY] cy
[OI] eo
[oI] eo
[oi] fi [oi] fi
[oi] lv
[OI] no [OI] no
[oi] zhy [oi] zhy
[oi] lv
vdiph/ooi_2 [OI] af vdiph/ooi_2 [OI] af
vdiph/ooi_3 [OI] en_rp vdiph/ooi_3 [OI] en_rp
[aI] en_wm [aI] en_wm
vdiph/ooi_4 [OI] en_us vdiph/ooi_4 [OI] en_us
vdiph/oou [oU] cs vdiph/oou [oU] cs
[OU] grc [OU] grc
[au] lv
vdiph/ou [ou] fi vdiph/ou [ou] fi
[ou] zhy [ou] zhy
[oU] ne [oU] ne
vdiph/ui [uI] base2 vdiph/ui [uI] base2
[uI] eo [uI] eo
[ui] fi [ui] fi
[ui] lv
[uI] vi [uI] vi
[ui] zhy [ui] zhy
[uI] ne [uI] ne
[ui] lv
vdiph/u-i [yI] vi vdiph/u-i [yI] vi
vdiph/ui_2 [uI] af vdiph/ui_2 [uI] af
vdiph/ui_3 [uI] cy vdiph/ui_3 [uI] cy
[D] es [D] es
voc/dh_ [D] base voc/dh_ [D] base
[D] es [D] es
voc/dh_om [d`] om
voc/j [J^] base voc/j [J^] base
voc/Q [Q] base voc/Q [Q] base
[Q^] base [Q^] base
vowel/& [a] en_rp vowel/& [a] en_rp
[&] fi [&] fi
[&:] hi [&:] hi
[&] lv
[&:] lv
[&] sv [&] sv
[&] bn [&] bn
[&:] bn [&:] bn
[&] lv
[&:] lv
vowel/0 [0] en vowel/0 [0] en
[O] hi [O] hi
[O] pt [O] pt
[&/] pt [&/] pt
[a#] rw [a#] rw
[a/] rw [a/] rw
[a] om
vowel/a_2 [a] base2 vowel/a_2 [a] base2
[a] en_wi [a] en_wi
[A:] en_wi [A:] en_wi
[A@] en_wi [A@] en_wi
[aa] en_wi [aa] en_wi
[a] eo [a] eo
[a] ca
[A] pt [A] pt
[a] pt_pt [a] pt_pt
[a] ro [a] ro
[a/] sw [a/] sw
[a/] sq [a/] sq
[a] kn [a] kn
[a] om
vowel/a_3 [a] en_sc vowel/a_3 [a] en_sc
[a/] en_sc [a/] en_sc
[A:] en_sc [A:] en_sc
[a] is [a] is
[A] zh [A] zh
[A] da [A] da
[a:] om
vowel/a#_3 [a2] en vowel/a#_3 [a2] en
[a2] en_n [a2] en_n
[a2] en_us [a2] en_us
[@] de [@] de
[a] hi [a] hi
[a#] ru [a#] ru
[a#] ca
[&] pt_pt [&] pt_pt
[&/] pt_pt [&/] pt_pt
[@] vi [@] vi
[a] bn [a] bn
vowel/a_4 [a/] el vowel/a_4 [a/] el
[a] vi [a] vi
[a:] om
vowel/a_5 [a:] ta vowel/a_5 [a:] ta
[a/] it [a/] it
[a] la [a] la
[a] sq [a] sq
[a:] ml [a:] ml
[a:] kn [a:] kn
[A:] om
vowel/a_6 [a] fr vowel/a_6 [a] fr
[a2] fr [a2] fr
vowel/aa [a] fi vowel/aa [a] fi
[A] fr_ca [A] fr_ca
[a] lv
[a:] lv
[A] no [A] no
[A:] no [A:] no
[aa] zhy [aa] zhy
[a] lv
[a:] lv
[a] hy [a] hy
vowel/aa# [O] en_us vowel/aa# [O] en_us
[0] en_wi [0] en_wi
[e] hr [e] hr
[e/] it [e/] it
[e:] la [e:] la
[e] ca
[e] pt [e] pt
[e] pt_pt [e] pt_pt
[e] grc [e] grc
[E3] sv [E3] sv
[E] ku [E] ku
vowel/e_mid [E] en_rp vowel/e_mid [E] en_rp
[e] jbo
[E] fr [E] fr
[E2] fr [E2] fr
[E] fr_ca [E] fr_ca
[E] hr [E] hr
[E] it [E] it
[E] es [E] es
[E] ca
[E] pt_pt [E] pt_pt
[E] no [E] no
[E] is [E] is
[E] de [E] de
[E2] de [E2] de
[E:] de [E:] de
[e] jbo
[e] fi [e] fi
[e] lv
[e:] lv
[E] nl [E] nl
[e] sk [e] sk
[e] es [e] es
[e] tr [e] tr
[E] ko [E] ko
[e] kn [e] kn
[e] lv
[e:] lv
[E] om [E] om
vowel/@_fnt [@] en_wi vowel/@_fnt [@] en_wi
[@2] en_wi [@2] en_wi
[i] fr [i] fr
[i:] fr [i:] fr
[i:] sk [i:] sk
[i:] lv
vowel/i_4 [i] fi vowel/i_4 [i] fi
[i] hu [i] hu
[I] it [I] it
[i/] pt_pt [i/] pt_pt
[y] ro [y] ro
vowel/i_6 [i] ta vowel/i_6 [i] ta
[i] lv
[i:] lv
[i] hr [i] hr
[i] tr [i] tr
[i] ku [i] ku
[i] id [i] id
[i] ml [i] ml
[i] kn [i] kn
[i] lv
vowel/i#_6 [i.] zh vowel/i#_6 [i.] zh
vowel/i_7 [i] pl vowel/i_7 [i] pl
vowel/i#_7 [i[] zh vowel/i#_7 [i[] zh
[o] it [o] it
[o/] it [o/] it
[O] la [O] la
[o] ca
[o] pt_pt [o] pt_pt
[o] grc [o] grc
[o:] sv [o:] sv
[O] de [O] de
[o] eo [o] eo
[O] es [O] es
[O] ca
[o] el [o] el
[O] sv [O] sv
[O] no [O] no
[O@] en_wm [O@] en_wm
[O:] af [O:] af
[o] fi [o] fi
[o] lv
[o:] lv
[o] sk [o] sk
[o:] sk [o:] sk
[o] hr [o] hr
[o] vi [o] vi
[O/] sq [O/] sq
[o] lv
[o:] lv
vowel/oo_2 [0] en_sc vowel/oo_2 [0] en_sc
[O] cy [O] cy
[o] cs [o] cs
[U:] ta [U:] ta
vowel/u#_4 [U] en_sc vowel/u#_4 [U] en_sc
[u:] en_sc [u:] en_sc
vowel/u_5 [u] sw
vowel/u_5 [u] lv
[u:] lv
[u] sw
vowel/u_6 [U] pt_pt vowel/u_6 [U] pt_pt
[u] pt_pt [u] pt_pt
[u] ku [u] ku
vowel/uu# [U] ku vowel/uu# [U] ku
vowel/uu_2 [U] base2 vowel/uu_2 [U] base2
[U] de [U] de
[U] ca
[U] tr [U] tr
[u] lv
[u:] lv
vowel/uu_3 [u] af vowel/uu_3 [u] af
[y] zh [y] zh
vowel/uu_4 [U] fi vowel/uu_4 [U] fi
[y] is [y] is
[y] hy [y] hy
vweak/@ [@#] om vweak/@ [@#] om
vweak/a [a#] om
vwl_af/@ [@] af vwl_af/@ [@] af
vwl_af/I [I] af vwl_af/I [I] af
vwl_af/r@ [@] af vwl_af/r@ [@] af
vwl_zh/uo [uo] zh vwl_zh/uo [uo] zh
vwl_zh/y& [y&] zh vwl_zh/y& [y&] zh
vwl_zh/yee [yE] zh vwl_zh/yee [yE] zh
w/iw_ [w/] base
w/w [w] base w/w [w] base
w/_w [w] base w/_w [w] base
[w] zh [w] zh
w/xw [(@)] base w/xw [(@)] base
[(a)] base [(a)] base
[(e)] base [(e)] base
[(i)] base
[(o)] base [(o)] base
[(u)] base [(u)] base
x/b [b] base x/b [b] base
[d] is [d] is
[d] id [d] id
[d.] bn [d.] bn
[d`] om
x/d_ [d] base x/d_ [d] base
[d[] base [d[] base
[d] base2 [d] base2

+ 1
- 0
phsource/ph_base2 View File

vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
lengthmod 2 lengthmod 2
wave ustop/ts wave ustop/ts
before _ ustop/ts_
endphoneme endphoneme





+ 67
- 0
phsource/ph_catalan View File


//====================================================
// Catalan - based on Spanish and Base2
//====================================================

phoneme a
vowel starttype (a) endtype (a)
length 180
formants vowel/a_2
reduceto a# 2
endphoneme

phoneme a#
vowel starttype (@) endtype (@)
length 170
formants vowel/a#_3
unstressed
endphoneme

phoneme e
vowel starttype (e) endtype (e)
length 170
formants vowel/e
reduceto @ 2
endphoneme

phoneme E
vowel starttype (e) endtype (e)
length 180
formants vowel/e_mid
reduceto @ 2
endphoneme

phoneme O
vowel starttype (o) endtype (o)
length 170
formants vowel/oo
reduceto U 2
endphoneme

phoneme o
vowel starttype (o) endtype (o)
length 170
formants vowel/o
reduceto U 2
endphoneme

phoneme U
vowel starttype (u) endtype (u)
length 160
formants vowel/uu_2
unstressed
endphoneme



phoneme l
liquid
length 100
lengthmod 7
beforenotvowel l/2 // use 'dark' [l] after a vowel
formants l/l
after _ l/_l t l/tl
endphoneme




+ 8
- 7
phsource/ph_esperanto View File



phoneme aU phoneme aU
vowel starttype (a) endtype (u) vowel starttype (a) endtype (u)
length 230
length 250
formants vdiph/au_4 formants vdiph/au_4
endphoneme endphoneme




phoneme eU phoneme eU
vowel starttype (e) endtype (u) vowel starttype (e) endtype (u)
length 230
length 250
formants vdiph/eu formants vdiph/eu
endphoneme endphoneme




phoneme aI phoneme aI
vowel starttype (a) endtype (i) vowel starttype (a) endtype (i)
length 240
length 250
formants vdiph/ai formants vdiph/ai
endphoneme endphoneme




phoneme eI phoneme eI
vowel starttype (e) endtype (i) vowel starttype (e) endtype (i)
length 230
length 250
formants vdiph/eei_2 formants vdiph/eei_2
endphoneme endphoneme




phoneme OI
phoneme oI
vowel starttype (o) endtype (i) vowel starttype (o) endtype (i)
length 240
length 250
formants vdiph/ooi formants vdiph/ooi
endphoneme endphoneme




phoneme uI phoneme uI
vowel starttype (u) endtype (i) vowel starttype (u) endtype (i)
length 230
length 250
formants vdiph/ui formants vdiph/ui
endphoneme endphoneme


vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
lengthmod 2 lengthmod 2
wave ustop/ts wave ustop/ts
before _ ustop/ts_
endphoneme endphoneme





+ 1
- 0
phsource/ph_german View File

vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
lengthmod 2 lengthmod 2
wave ustop/ts wave ustop/ts
before _ ustop/ts_
endphoneme endphoneme





+ 1
- 0
phsource/ph_hungarian View File

vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
lengthmod 2 lengthmod 2
wave ustop/ts wave ustop/ts
before _ ustop/ts_
endphoneme endphoneme





+ 217
- 0
phsource/ph_latvian View File


phoneme @
vowel starttype (@) endtype (@)
length 120
formants vowel/8_7
endphoneme
phoneme i
vowel starttype (i) endtype (i)
length 110
formants vowel/i_6
linkout ;
endphoneme

phoneme i:
vowel starttype (i) endtype (i)
length 300
formants vowel/i_6
linkout ;
endphoneme


phoneme e
vowel starttype (e) endtype (e)
length 120
formants vowel/e_mid2
endphoneme

phoneme e:
vowel starttype (e) endtype (e)
length 330
formants vowel/e_mid2
endphoneme


phoneme &
vowel starttype (a) endtype (a)
length 120
formants vowel/&
endphoneme

phoneme &:
vowel starttype (a) endtype (a)
length 330
formants vowel/&
endphoneme


phoneme a
vowel starttype (a) endtype (a)
length 120
formants vowel/aa
endphoneme

phoneme a:
vowel starttype (a) endtype (a)
length 350
formants vowel/aa
endphoneme


phoneme o
vowel starttype (o) endtype (o)
length 120
formants vowel/oo_1
endphoneme

phoneme o:
vowel starttype (o) endtype (o)
length 330
formants vowel/oo_1
endphoneme


phoneme u
vowel starttype (u) endtype (u)
length 110
formants vowel/u_5
endphoneme

phoneme u:
vowel starttype (u) endtype (u)
length 330
formants vowel/u_5
endphoneme


phoneme ai
vowel starttype (a) endtype (i)
length 310
long
formants vdiph/aai
endphoneme

phoneme ei
vowel starttype (e) endtype (i)
length 300
long
formants vdiph/eei_2
endphoneme

phoneme au
vowel starttype (a) endtype (u)
length 300
long
formants vdiph/aau
endphoneme

phoneme uo
vowel starttype (u) endtype (a)
length 300
long
// formants vdiph2/uo
formants vdiph2/uaa
endphoneme

phoneme oi
vowel starttype (o) endtype (i)
length 290
long
formants vdiph/ooi
endphoneme

phoneme ui
vowel starttype (u) endtype (i)
length 290
long
formants vdiph/ui
endphoneme

phoneme ie
vowel starttype (i) endtype (e)
length 290
long
formants vdiph2/ie_2
endphoneme

phoneme iu
vowel starttype (i) endtype (u)
length 290
long
formants vdiph2/iu_2
endphoneme




phoneme R2 // this is [R] from Slovak/Czech
liquid
vowelin f1=0 f2=1700 -300 300 f3=-300 80
vowelout f1=2 f2=1700 -300 300 f3=-300 80 brk
formants r3/r_trill+r3/r_trill.wav%50
trill
lengthmod 6
endphoneme


phoneme ts
vls alv afr sibilant lengthenstop
vowelin f1=0 f2=1700 -300 300 f3=-100 80
vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
lengthmod 2
wave ustop/ts2%90
before _ ustop/ts_
endphoneme


phoneme t // try disable this and try using English [t]
vls alv stop lengthenstop
vowelin f1=0 f2=1700 -300 300 f3=-100 80
vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
lengthmod 2
wave ustop/t_short%115
before _ ustop/t_
switchvoicing d
endphoneme

phoneme p
vls blb stop
vowelin f1=0 f2=1000 -50 -100 f3=-200 80
vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=30
lengthmod 2
wave ustop/p_unasp%120
before _ ustop/p_unasp_%80
before l ustop/pl
switchvoicing b
endphoneme


phoneme k
vls vel stop
vowelin f1=0 f2=2300 200 400 f3=-100 80
vowelout f1=0 f2=2300 300 400 f3=-100 80 rms=20
lengthmod 2
wave ustop/k_unasp%60 // weaker
before _ ustop/k_
before r ustop/kr
before l ustop/kl
before (i) ustop/ki
before l^ ustop/ki
switchvoicing g
endphoneme


phoneme s2 // second part of long [s:]
vls alv frc sibilant
vowelin f1=0 f2=1700 -300 300 f3=-100 80
vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
lengthmod 3
wave ufric/s_continue
before _ ufric/s_
before p ufric/s!
before t ufric/s!
before k ufric/s!
switchvoicing z
endphoneme


+ 1
- 1
phsource/ph_lojban View File

phoneme e phoneme e
vowel starttype (e) endtype (e) vowel starttype (e) endtype (e)
length 170 length 170
formants vowel/e_mid
formants vowel/e_mid2
endphoneme endphoneme





+ 1
- 0
phsource/ph_polish View File

vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
lengthmod 2 lengthmod 2
wave ustop/ts wave ustop/ts
before _ ustop/ts_
endphoneme endphoneme





+ 1
- 0
phsource/ph_romanian View File

vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 colr=1 vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 colr=1
lengthmod 2 lengthmod 2
wave ustop/ts wave ustop/ts
before _ ustop/ts_
endphoneme endphoneme





+ 1
- 0
phsource/ph_russian View File

vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
lengthmod 2 lengthmod 2
wave ustop/ts wave ustop/ts
before _ ustop/ts_
endphoneme endphoneme





+ 1
- 1
phsource/ph_tamil View File



phoneme u: phoneme u:
vowel starttype (u) endtype (u) vowel starttype (u) endtype (u)
length 250
length 260
formants vowel/u formants vowel/u
endphoneme endphoneme



+ 10
- 4
phsource/phonemes View File

formants NULL formants NULL
starttype _ endtype _ starttype _ endtype _
length 1 length 1
lengthmod 1
lengthmod 5
endphoneme endphoneme


phoneme _: // Standard pause phoneme _: // Standard pause
before N DFT-40+nn/inn before N DFT-40+nn/inn
before ; DFT-40+j2/xj2 before ; DFT-40+j2/xj2
before l DFT-40+l/xl before l DFT-40+l/xl
before w DFT-30+w/xw
before j DFT-30+j/xj before j DFT-30+j/xj
before r- DFT-60+r/xr before r- DFT-60+r/xr
before r/ DFT+r3/r_i before r/ DFT+r3/r_i
vowelout len=50 vowelout len=50
length 100 length 100
formants w/w_ formants w/w_
after (i) w/iw_
lengthmod 7 lengthmod 7
beforevowel w beforevowel w
endphoneme endphoneme
phonemetable hu base phonemetable hu base
include ph_hungarian include ph_hungarian


phonemetable lv base
include ph_latvian

phonemetable nl base phonemetable nl base
include ph_dutch include ph_dutch


phonemetable es_la es phonemetable es_la es
include ph_spanish_la include ph_spanish_la


phonemetable ca es
include ph_catalan

phonemetable pt base2 phonemetable pt base2
include ph_pt_brazil include ph_pt_brazil


phonemetable ne hi phonemetable ne hi
include ph_nepali include ph_nepali


phonemetable lv base
include ph_latvian

phonemetable hy base phonemetable hy base
include ph_armenian_west include ph_armenian_west


phonemetable om base phonemetable om base
include ph_oromo include ph_oromo


BIN
phsource/ustop/ts2.wav View File


BIN
phsource/ustop/ts_.wav View File


BIN
phsource/vdiph/aai View File


BIN
phsource/vdiph/aau View File


BIN
phsource/vdiph/eei_2 View File


BIN
phsource/vdiph/vowelchart.png View File


BIN
phsource/vowel/aa View File


BIN
phsource/vowel/i_3 View File


BIN
phsource/vowel/i_6 View File


BIN
phsource/w/w_ View File


+ 2
- 1
src/compiledata.cpp View File

{"long", 0x2000000+phLONG}, {"long", 0x2000000+phLONG},
{"brkafter", 0x2000000+phBRKAFTER}, {"brkafter", 0x2000000+phBRKAFTER},
{"nonsyllabic",0x2000000+phNONSYLLABIC}, {"nonsyllabic",0x2000000+phNONSYLLABIC},
{"lengthenstop",0x2000000+phLENGTHENSTOP},


// voiced / unvoiced // voiced / unvoiced
{"vcd", 0x2000000+phVOICED}, {"vcd", 0x2000000+phVOICED},
float total; float total;
float pkheight; float pkheight;
int marker1_set=0; int marker1_set=0;
int frame_vowelbreak=NULL;
int frame_vowelbreak=0;
SpectFrame *fr; SpectFrame *fr;
wxString path_sep = _T("/"); wxString path_sep = _T("/");



+ 25
- 9
src/compiledict.cpp View File



int hash_counts[N_HASH_DICT]; int hash_counts[N_HASH_DICT];
char *hash_chains[N_HASH_DICT]; char *hash_chains[N_HASH_DICT];
char letterGroupsDefined[N_LETTER_GROUPS];


MNEM_TAB mnem_flags[] = { MNEM_TAB mnem_flags[] = {
// these in the first group put a value in bits0-3 of dictionary_flags // these in the first group put a value in bits0-3 of dictionary_flags
text_not_phonemes = 0; text_not_phonemes = 0;
phonetic = word = nullstring; phonetic = word = nullstring;


if(memcmp(linebuf,"_-",2)==0)
{
step=1; // TEST
}
p = linebuf; p = linebuf;
// while(isspace2(*p)) p++; // while(isspace2(*p)) p++;


break; break;
case 1: case 1:
if(c == '-')
if((c == '-') && (word[0] != '_'))
{ {
flag_codes[n_flag_codes++] = BITNUM_FLAG_HYPHENATED; flag_codes[n_flag_codes++] = BITNUM_FLAG_HYPHENATED;
c = ' '; c = ' ';
c = *p++ - '0'; c = *p++ - '0';
value = *p++ - '0'; value = *p++ - '0';
c = c * 10 + value; c = c * 10 + value;
if((value < 0) || (value > 9) || (c <= 0) || (c >= N_LETTER_GROUPS))
if((value < 0) || (value > 9))
{ {
c = 0; c = 0;
fprintf(f_log,"%5d: Expected 2 digits after 'L'",linenum);
fprintf(f_log,"%5d: Expected 2 digits after 'L'\n",linenum);
error_count++;
}
else
if((c <= 0) || (c >= N_LETTER_GROUPS) || (letterGroupsDefined[(int)c] == 0))
{
fprintf(f_log,"%5d: Letter group L%.2d not defined\n",linenum,c);
error_count++; error_count++;
} }
c += 'A'; c += 'A';
p = input; p = input;
if(!isdigit(p[0]) || !isdigit(p[1])) if(!isdigit(p[0]) || !isdigit(p[1]))
{ {
fprintf(f_log,"%5d: Expected 2 digits after '.L'\n",linenum);
error_count++;
return(1); return(1);
} }


group = atoi(&p[1]);
group = atoi(&p[0]);
if(group >= N_LETTER_GROUPS) if(group >= N_LETTER_GROUPS)
{
fprintf(f_log,"%5d: lettergroup out of range (01-%.2d)\n",linenum,N_LETTER_GROUPS);
error_count++;
return(1); return(1);
}


while(!isspace2(*p)) p++; while(!isspace2(*p)) p++;


fputc(RULE_GROUP_START,f_out); fputc(RULE_GROUP_START,f_out);
fputc(RULE_LETTERGP2,f_out); fputc(RULE_LETTERGP2,f_out);
fputc(group + 'A', f_out); fputc(group + 'A', f_out);
letterGroupsDefined[group] = 1;


for(;;) for(;;)
{ {


if(memcmp(buf,".L",2)==0) if(memcmp(buf,".L",2)==0)
{ {
if(compile_lettergroup(&buf[2], f_out) != 0)
{
fprintf(f_log,"%5d: Bad lettergroup\n",linenum);
error_count++;
}
compile_lettergroup(&buf[2], f_out);
continue; continue;
} }


char path[sizeof(path_home)+40]; // path_dsource+20 char path[sizeof(path_home)+40]; // path_dsource+20


error_count = 0; error_count = 0;
memset(letterGroupsDefined,0,sizeof(letterGroupsDefined));

debug_flag = flags & 1; debug_flag = flags & 1;


if(dsource == NULL) if(dsource == NULL)

+ 13
- 1
src/dictionary.cpp View File

char *w; char *w;


p = letterGroups[group]; p = letterGroups[group];
if(p == NULL)
return(0);


while(*p != RULE_GROUP_END) while(*p != RULE_GROUP_END)
{ {
int unstressed_word = 0; int unstressed_word = 0;
char *max_output; char *max_output;
int final_ph; int final_ph;
int final_ph2;
int mnem; int mnem;
int mnem2;
int post_tonic; int post_tonic;
int opt_length; int opt_length;
int done; int done;
} }
if(ix == 0) return; if(ix == 0) return;
final_ph = phonetic[ix-1]; final_ph = phonetic[ix-1];
final_ph2 = phonetic[ix-2];


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


else else
{ {
mnem = phoneme_tab[final_ph]->mnemonic; mnem = phoneme_tab[final_ph]->mnemonic;
if((mnem != 'n') && (mnem != 's'))
mnem2 = phoneme_tab[final_ph2]->mnemonic;

if((mnem == 's') && (mnem2 == 'n'))
{
// -ns stress remains on penultimate syllable
}
else
if(((mnem != 'n') && (mnem != 's')) || (phoneme_tab[final_ph2]->type != phVOWEL))
{ {
stressed_syllable = vowel_count - 1; stressed_syllable = vowel_count - 1;
} }

+ 12
- 20
src/numbers.cpp View File

int subtract; int subtract;
int repeat = 0; int repeat = 0;
unsigned int flags; unsigned int flags;
char ph_roman[30];
char number_chars[N_WORD_BYTES]; char number_chars[N_WORD_BYTES];


static const char *roman_numbers = "ixcmvld"; static const char *roman_numbers = "ixcmvld";
if(acc > langopts.max_roman) if(acc > langopts.max_roman)
return(0); return(0);


Lookup("_roman",ph_out); // precede by "roman" if _rom is defined in *_list
p = &ph_out[strlen(ph_out)];
Lookup("_roman",ph_roman); // precede by "roman" if _rom is defined in *_list
p = &ph_out[0];

if((langopts.numbers & NUM_ROMAN_AFTER) == 0)
{
strcpy(ph_out,ph_roman);
p = &ph_out[strlen(ph_out)];
}


sprintf(number_chars," %d ",acc); sprintf(number_chars," %d ",acc);
TranslateNumber(&number_chars[1],p,&flags,0); TranslateNumber(&number_chars[1],p,&flags,0);

if(langopts.numbers & NUM_ROMAN_AFTER)
strcat(ph_out,ph_roman);
return(1); return(1);
} // end of TranslateRoman } // end of TranslateRoman


{ {
if((thousandplex > 0) && (value < 1000)) if((thousandplex > 0) && (value < 1000))
{ {
if(langopts.numbers2 & 0x100)
{
if((thousandplex == 1) && (value >= 100))
{
// special word for 100,000's
char ph_buf3[20];
sprintf(string,"_%dL",value / 100);
if(Lookup(string,ph_buf2) == 0)
{
LookupNum2(value/100,0,ph_buf2);
Lookup("_0L",ph_buf3);
strcat(ph_buf2,ph_buf3);
}
value %= 100;
if(value == 0)
suppress_null = 1;
}
}
if((suppress_null == 0) && (LookupThousands(value,thousandplex,ph_append))) if((suppress_null == 0) && (LookupThousands(value,thousandplex,ph_append)))
{ {
// found an exact match for N thousand // found an exact match for N thousand

+ 3
- 2
src/phoneme.h View File

#define phBEFORENOTVOWEL2 0x1000 #define phBEFORENOTVOWEL2 0x1000
#define phSWITCHVOICING 0x0800 #define phSWITCHVOICING 0x0800


#define phNONSYLLABIC 0x100000 // don't count this vowel as a syllable when finding the stress position
#define phLONG 0x200000
#define phNONSYLLABIC 0x100000 // don't count this vowel as a syllable when finding the stress position
#define phLONG 0x200000
#define phLENGTHENSTOP 0x400000 // make the pre-pause slightly longer


// fixed phoneme code numbers, these can be used from the program code // fixed phoneme code numbers, these can be used from the program code
#define phonCONTROL 1 #define phonCONTROL 1

+ 5
- 1
src/phonemelist.cpp View File

{ {
if((x = (langopts.word_gap & 0x7)) != 0) if((x = (langopts.word_gap & 0x7)) != 0)
{ {
insert_ph = pause_phonemes[x];
if((x > 1) || ((insert_ph != phonPAUSE_SHORT) && (insert_ph != phonPAUSE_NOLINK)))
{
// don't reduce the pause
insert_ph = pause_phonemes[x];
}
} }
if(option_wordgap > 0) if(option_wordgap > 0)
{ {

+ 5
- 2
src/setlengths.cpp View File

if((langopts.word_gap & 0x10) && (p->newword)) if((langopts.word_gap & 0x10) && (p->newword))
p->prepause = 60; p->prepause = 60;


if(p->ph->phflags & phLENGTHENSTOP)
p->prepause += 30;

if(p->synthflags & SFLAG_LENGTHEN) if(p->synthflags & SFLAG_LENGTHEN)
p->prepause += langopts.long_stop; p->prepause += langopts.long_stop;
break; break;
} }


// calc length modifier // calc length modifier
if(next->ph->code == phonPAUSE_VSHORT)
if((next->ph->code == phonPAUSE_VSHORT) && (next2->type == phPAUSE))
{ {
// ignore very short pause
// if PAUSE_VSHORT is followed by a pause, then use that
next = next2; next = next2;
next2 = next3; next2 = next3;
next3 = &phoneme_list[ix+4]; next3 = &phoneme_list[ix+4];

+ 1
- 1
src/synthdata.cpp View File

#include "translate.h" #include "translate.h"
#include "wave.h" #include "wave.h"


const char *version_string = "1.39.22 10.Nov.08";
const char *version_string = "1.39.26 15.Nov.08";
const int version_phdata = 0x013900; const int version_phdata = 0x013900;


int option_device_number = -1; int option_device_number = -1;

+ 35
- 8
src/tr_languages.cpp View File



case L('e','o'): case L('e','o'):
{ {
static const short stress_lengths_eo[8] = {145, 145, 200, 170, 0, 0, 320, 340};
static const short stress_lengths_eo[8] = {145, 145, 230, 170, 0, 0, 360, 370};
static const unsigned char stress_amps_eo[] = {16,14, 20,20, 20,24, 24,22 }; static const unsigned char stress_amps_eo[] = {16,14, 20,20, 20,24, 24,22 };
static const wchar_t eo_char_apostrophe[2] = {'l',0}; static const wchar_t eo_char_apostrophe[2] = {'l',0};
tr->char_plus_apostrophe = eo_char_apostrophe; tr->char_plus_apostrophe = eo_char_apostrophe;


tr->langopts.word_gap = 1; tr->langopts.word_gap = 1;
tr->langopts.vowel_pause = 2;
tr->langopts.stress_rule = 2; tr->langopts.stress_rule = 2;
tr->langopts.stress_flags = 0x6 | 0x10; tr->langopts.stress_flags = 0x6 | 0x10;
tr->langopts.unstressed_wd1 = 3; tr->langopts.unstressed_wd1 = 3;
break; break;


case L('e','s'): // Spanish case L('e','s'): // Spanish
case L('c','a'): // Catalan
{ {
static const short stress_lengths_es[8] = {170, 200, 180, 180, 0, 0, 220, 250};
static const short stress_lengths_es[8] = {180, 210, 190, 190, 0, 0, 230, 260};
// static const short stress_lengths_es[8] = {170, 200, 180, 180, 0, 0, 220, 250};
static const unsigned char stress_amps_es[8] = {16,12, 18,18, 20,20, 20,20 }; // 'diminished' is used to mark a quieter, final unstressed syllable static const unsigned char stress_amps_es[8] = {16,12, 18,18, 20,20, 20,20 }; // 'diminished' is used to mark a quieter, final unstressed syllable
static const wchar_t ca_punct_within_word[] = {'\'',0xb7,0}; // ca: allow middle-dot within word


tr = new Translator(); tr = new Translator();
SetupTranslator(tr,stress_lengths_es,stress_amps_es); SetupTranslator(tr,stress_lengths_es,stress_amps_es);
tr->langopts.unstressed_wd2 = 2; tr->langopts.unstressed_wd2 = 2;
tr->langopts.param[LOPT_SONORANT_MIN] = 120; // limit the shortening of sonorants before short vowels tr->langopts.param[LOPT_SONORANT_MIN] = 120; // limit the shortening of sonorants before short vowels


tr->langopts.numbers = 0x529 + NUM_ROMAN;
tr->langopts.numbers = 0x529 + NUM_ROMAN + NUM_ROMAN_AFTER;

if(name2 == L('c','a'))
{
tr->punct_within_word = ca_punct_within_word;
tr->langopts.stress_flags = 0x200 | 0x6 | 0x30; // stress last syllable unless word ends with a vowel
}
} }
break; break;


tr->langopts.stress_rule = 6; // stress on last heaviest syllable, excluding final syllable tr->langopts.stress_rule = 6; // stress on last heaviest syllable, excluding final syllable
tr->langopts.stress_flags = 0x10004; // use 'diminished' for unstressed final syllable tr->langopts.stress_flags = 0x10004; // use 'diminished' for unstressed final syllable
tr->langopts.numbers = 0x011; tr->langopts.numbers = 0x011;
tr->langopts.numbers2 = 0x100;
tr->langopts.numbers2 = NUM2_100000;
tr->letter_bits_offset = OFFSET_DEVANAGARI; tr->letter_bits_offset = OFFSET_DEVANAGARI;
SetIndicLetters(tr); SetIndicLetters(tr);
} }


case L_jbo: // Lojban case L_jbo: // Lojban
{ {
static const short stress_lengths_jbo[8] = {185,170, 200,200, 0,0, 290,300};
static const short stress_lengths_jbo[8] = {145,145, 170,160, 0,0, 330,350};
static const wchar_t jbo_punct_within_word[] = {'.',',','\'',0x2c8,0}; // allow period and comma within a word, also stress marker (from LOPT_SYLLABLE_CAPS) static const wchar_t jbo_punct_within_word[] = {'.',',','\'',0x2c8,0}; // allow period and comma within a word, also stress marker (from LOPT_SYLLABLE_CAPS)
tr = new Translator(); tr = new Translator();
SetupTranslator(tr,stress_lengths_jbo,NULL); SetupTranslator(tr,stress_lengths_jbo,NULL);
tr->langopts.stress_rule = 2; tr->langopts.stress_rule = 2;
tr->langopts.vowel_pause = 0x20c; // pause before a word which starts with a vowel, or after a word which ends in a consonant tr->langopts.vowel_pause = 0x20c; // pause before a word which starts with a vowel, or after a word which ends in a consonant
// tr->langopts.word_gap = 1;
tr->punct_within_word = jbo_punct_within_word; tr->punct_within_word = jbo_punct_within_word;
tr->langopts.param[LOPT_SYLLABLE_CAPS] = 1; // capitals indicate stressed syllables tr->langopts.param[LOPT_SYLLABLE_CAPS] = 1; // capitals indicate stressed syllables
SetLetterVowel(tr,'y'); SetLetterVowel(tr,'y');


case L('l','v'): // latvian case L('l','v'): // latvian
{ {
static const unsigned char stress_amps_lv[8] = {17,14, 20,20, 20,22, 22,22 };
static const short stress_lengths_lv[8] = {180,140, 210,210, 0,0, 210,210};
tr = new Translator(); tr = new Translator();
SetupTranslator(tr,stress_lengths_sk,stress_amps_sk);
SetupTranslator(tr,stress_lengths_lv,stress_amps_lv);


tr->langopts.stress_rule = 0; tr->langopts.stress_rule = 0;
tr->langopts.spelling_stress = 1; tr->langopts.spelling_stress = 1;
} }
break; break;


case L('o','m'):
{
static const unsigned char stress_amps_om[] = {16,16, 20,20, 20,24, 24,22 };
static const short stress_lengths_om[8] = {200,200, 200,200, 0,0, 200,200};
tr = new Translator();
SetupTranslator(tr,stress_lengths_om,stress_amps_om);

tr->langopts.stress_rule = 3;
}
break;

case L('p','l'): // Polish case L('p','l'): // Polish
{ {
static const short stress_lengths_pl[8] = {160, 190, 175, 175, 0, 0, 200, 210}; static const short stress_lengths_pl[8] = {160, 190, 175, 175, 0, 0, 200, 210};
tr->langopts.stress_flags = 0x6 | 0x10; tr->langopts.stress_flags = 0x6 | 0x10;


tr->langopts.numbers = 0x4e1; tr->langopts.numbers = 0x4e1;
tr->langopts.numbers2 = 0x100;
tr->langopts.numbers2 = NUM2_100000a;
} }
break; break;


if(name2 == L('k','n')) if(name2 == L('k','n'))
{ {
tr->letter_bits_offset = OFFSET_KANNADA; tr->letter_bits_offset = OFFSET_KANNADA;
tr->langopts.numbers = 0x1;
tr->langopts.numbers2 = NUM2_100000;
} }
tr->langopts.param[LOPT_WORD_MERGE] = 1; // don't break vowels betwen words tr->langopts.param[LOPT_WORD_MERGE] = 1; // don't break vowels betwen words
SetIndicLetters(tr); // call this after setting OFFSET_ SetIndicLetters(tr); // call this after setting OFFSET_
} }
break; break;


#ifdef deleted
case L('t','h'): // Thai case L('t','h'): // Thai
{ {
static const short stress_lengths_th[8] = {230,150, 230,230, 230,0, 230,250}; static const short stress_lengths_th[8] = {230,150, 230,230, 230,0, 230,250};
tr->langopts.word_gap = 0x21; // length of a final vowel is less dependent on the next consonant, don't merge consonant with next word tr->langopts.word_gap = 0x21; // length of a final vowel is less dependent on the next consonant, don't merge consonant with next word
} }
break; break;
#endif


case L('t','r'): // Turkish case L('t','r'): // Turkish
{ {

+ 62
- 6
src/translate.cpp View File



for(ix=0; ix<word_count; ix++) for(ix=0; ix<word_count; ix++)
{ {
int j;
int nx;
int c_temp; int c_temp;
char *pn; char *pn;
char *pw; char *pw;
static unsigned int break_numbers1 = 0x49249248;
static unsigned int break_numbers2 = 0x492492a8; // for languages which have numbers for 100,000 and 100,00,000
static unsigned int break_numbers3 = 0x49249268; // for languages which have numbers for 100,000 and 1,000,000
unsigned int break_numbers;
char number_buf[80]; char number_buf[80];


// start speaking at a specified word position in the text? // start speaking at a specified word position in the text?


// digits should have been converted to Latin alphabet ('0' to '9') // digits should have been converted to Latin alphabet ('0' to '9')
word = pw = &sbuf[words[ix].start]; word = pw = &sbuf[words[ix].start];

if(iswdigit(word[0]) && (langopts.numbers2 & NUM2_100000))
{
// Languages with 100000 numbers. Remove thousands separators so that we can insert them again later
pn = number_buf;
while(pn < &number_buf[sizeof(number_buf)-3])
{
if(iswdigit(*pw))
{
*pn++ = *pw++;
}
else
if((*pw == langopts.thousands_sep) && (pw[1] == ' ') && iswdigit(pw[2]))
{
pw += 2;
ix++; // skip "word"
}
else
{
nx = pw - word;
memset(word,' ',nx);
nx = pn - number_buf;
memcpy(word,number_buf,nx);
break;
}
}
pw = word;
}

for(n_digits=0; iswdigit(word[n_digits]); n_digits++); // count consecutive digits for(n_digits=0; iswdigit(word[n_digits]); n_digits++); // count consecutive digits

if((n_digits > 4) && (word[0] != '0')) if((n_digits > 4) && (word[0] != '0'))
{ {
// word is entirely digits, insert commas and break into 3 digit "words" // word is entirely digits, insert commas and break into 3 digit "words"
number_buf[0] = ' '; number_buf[0] = ' ';
pn = &number_buf[1]; pn = &number_buf[1];
j = n_digits;
nx = n_digits;

if(langopts.numbers2 & NUM2_100000a)
break_numbers = break_numbers3;
else
if(langopts.numbers2 & NUM2_100000)
break_numbers = break_numbers2;
else
break_numbers = break_numbers1;

while(pn < &number_buf[sizeof(number_buf)-3]) while(pn < &number_buf[sizeof(number_buf)-3])
{ {
if(!isdigit(c = *pw++) && (c != langopts.decimal_sep)) if(!isdigit(c = *pw++) && (c != langopts.decimal_sep))
break; break;


*pn++ = c; *pn++ = c;
if((--j > 0) && (j % 3)==0)
if((--nx > 0) && (break_numbers & (1 << nx)))
{ {
if(langopts.thousands_sep != ' ') if(langopts.thousands_sep != ' ')
{
*pn++ = langopts.thousands_sep; *pn++ = langopts.thousands_sep;
}
*pn++ = ' '; *pn++ = ' ';
if(break_numbers & (1 << (nx-1)))
{
// the next group only has 1 digits (i.e. NUM2_10000), make it three
*pn++ = '0';
*pn++ = '0';
}
if(break_numbers & (1 << (nx-2)))
{
// the next group only has 2 digits (i.e. NUM2_10000), make it three
*pn++ = '0';
}
} }
} }
pn[0] = ' '; pn[0] = ' ';
for(pw = word; *pw != ' ';) for(pw = word; *pw != ' ';)
{ {
memset(number_buf,' ',9); memset(number_buf,' ',9);
j = utf8_in(&c_temp, pw, 0);
memcpy(&number_buf[2],pw,j);
nx = utf8_in(&c_temp, pw, 0);
memcpy(&number_buf[2],pw,nx);
TranslateWord2(&number_buf[2], &words[ix], 0, 0 ); TranslateWord2(&number_buf[2], &words[ix], 0, 0 );
pw += j;
pw += nx;
} }
} }



+ 10
- 5
src/translate.h View File

#define N_RULE_GROUP2 120 // max num of two-letter rule chains #define N_RULE_GROUP2 120 // max num of two-letter rule chains
#define N_HASH_DICT 1024 #define N_HASH_DICT 1024
#define N_CHARSETS 20 #define N_CHARSETS 20
#define N_LETTER_GROUPS 20
#define N_LETTER_GROUPS 25




/* dictionary flags, word 1 */ /* dictionary flags, word 1 */
unsigned char *length_mods; unsigned char *length_mods;
unsigned char *length_mods0; unsigned char *length_mods0;


#define NUM_ROMAN 0x20000
#define NUM_ROMAN_UC 0x40000
#define NUM_NOPAUSE 0x80000
#define NUM_ROMAN 0x20000
#define NUM_ROMAN_UC 0x40000
#define NUM_NOPAUSE 0x80000
#define NUM_ROMAN_AFTER 0x200000


// bits0-1=which numbers routine to use. // bits0-1=which numbers routine to use.
// bit2= thousands separator must be space // bit2= thousands separator must be space
// bit18=Roman numbers only if upper case // bit18=Roman numbers only if upper case
// bit19=don't add pause after a number // bit19=don't add pause after a number
// bit20='and' before hundreds // bit20='and' before hundreds
// bit21= say "roman" after the number, not before
int numbers; int numbers;


#define NUM2_100000 0x100 // numbers for 100,000 and 10,000,000
#define NUM2_100000a 0x500 // numbers for 100,000 and 1,000,000
// bits 1-4 use variant form of numbers before thousands,millions,etc. // bits 1-4 use variant form of numbers before thousands,millions,etc.
// bit6=(LANG=pl) two forms of plural, M or MA // bit6=(LANG=pl) two forms of plural, M or MA
// bit7=(LANG-ru) use MB for 1 thousand, million, etc // bit7=(LANG-ru) use MB for 1 thousand, million, etc
// bit8=(LANG=sw) special word for 100,000s
// bit8=(LANG=hi) special word for 100,000 and 10,000,000
// bit9=(LANG=rw) say "thousand" and "million" before its number, not after // bit9=(LANG=rw) say "thousand" and "million" before its number, not after
// bit10=(LANG=sw) special word for 100,000 and 1,000,000
int numbers2; int numbers2;


int max_roman; int max_roman;

Loading…
Cancel
Save