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-fd96e6ae7743master
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; |
?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 |
%) % (% | %) % (% | ||||
%%) % (_ _:: | %%) % (_ _:: | ||||
// extra symbols (mostly in en_list) | |||||
¶¶ par@grafs |
_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 |
.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_: | |||||
_» 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 |
_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 |
_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 |
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) |
_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 | ||||
name catalan-test | |||||
language ca | |||||
gender male | |||||
name latvian | |||||
language lv | |||||
gender male | |||||
replace 03 o o: | |||||
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 |
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 | ||||
//==================================================== | |||||
// 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 | |||||
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 | ||||
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 | ||||
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 | ||||
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 | |||||
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 | ||||
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 | ||||
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 | ||||
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 | ||||
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 | ||||
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 | ||||
{"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("/"); | ||||
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) |
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; | ||||
} | } |
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 |
#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 |
{ | { | ||||
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) | ||||
{ | { |
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]; |
#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; |
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 | ||||
{ | { |
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; | |||||
} | } | ||||
} | } | ||||
#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; |