Treat echo-delay = 0 as "no echo", even if ech-amplitude is set. lang=ru, fix crash for "words" which has produce no phonemes (wg. ":"). git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@88 d46cf337-b52f-0410-862d-fd96e6ae7743master
ie (_ ije | ie (_ ije | ||||
ii (_ iji | ii (_ iji | ||||
io (_ ijo | io (_ ijo | ||||
iu (_ ijo | |||||
iu (_ iju | |||||
_) i (on j | _) i (on j | ||||
C) ight ajt // right, night | C) ight ajt // right, night |
has %ha2z $pastf $only | has %ha2z $pastf $only | ||||
has haz $only $atend | has haz $only $atend | ||||
(has been) %haz%bIn $pastf | (has been) %haz%bIn $pastf | ||||
(has to) haztU $atend | |||||
hath %haT $pastf $only | hath %haT $pastf $only | ||||
had %had $pastf $strend2 $only | had %had $pastf $strend2 $only | ||||
(had been) %had%bIn $pastf | (had been) %had%bIn $pastf |
_kö) zs (ég zS | _kö) zs (ég zS | ||||
_nehé) zs (ely zS | _nehé) zs (ely zS | ||||
_) zürich tsyR2iC | |||||
.group | .group | ||||
$ dolla:R2 | $ dolla:R2 | ||||
ä E | ä E |
38 phoneme tables | |||||
39 phoneme tables | |||||
new total | new total | ||||
base 96 96 | base 96 96 | ||||
base2 23 114 | base2 23 114 | ||||
en 53 144 | en 53 144 | ||||
en_n 29 144 | |||||
en_n 30 144 | |||||
en_us 37 144 | en_us 37 144 | ||||
en_sc 39 146 | en_sc 39 146 | ||||
en_rp 34 144 | en_rp 34 144 | ||||
vi 42 134 | vi 42 134 | ||||
zhy 40 129 | zhy 40 129 | ||||
sw 14 105 | sw 14 105 | ||||
en_x 33 144 | |||||
3 b/b base hi ro | 3 b/b base hi ro | ||||
2 b/b_ base hi | 2 b/b_ base hi | ||||
1 l^/j2u base | 1 l^/j2u base | ||||
1 l^/_l^ base | 1 l^/_l^ base | ||||
1 l^/l^ base | 1 l^/l^ base | ||||
9 l/l base en af hu sk ru la pt ro | |||||
11 l/_l base en af de hu sk ru la pt ro | |||||
10 l/l base en af hu sk ru la pt ro en_x | |||||
12 l/_l base en af de hu sk ru la pt ro en_x | |||||
1 l/l_ base | 1 l/l_ base | ||||
2 l/l@ base | 2 l/l@ base | ||||
1 l/L1_aL base | 1 l/L1_aL base | ||||
4 l/l_long base fr la ro | 4 l/l_long base fr la ro | ||||
2 l/lo base | 2 l/lo base | ||||
2 l/lu base | 2 l/lu base | ||||
9 l/tl base en af hu sk ru la pt ro | |||||
10 l/tl base en af hu sk ru la pt ro en_x | |||||
6 l/xl base | 6 l/xl base | ||||
3 m/_m base ru ro | 3 m/_m base ru ro | ||||
3 m/m_ base ru ro | 3 m/m_ base ru ro | ||||
2 ustop/ts_pzd_ hi hu | 2 ustop/ts_pzd_ hi hu | ||||
2 ustop/ts_pzd2 hi hu | 2 ustop/ts_pzd2 hi hu | ||||
2 vdiph/0i pt vi | 2 vdiph/0i pt vi | ||||
2 vdiph/0i_2 en_sc no | |||||
2 vdiph2/e@ en_sc | |||||
3 vdiph/0i_2 en_sc no en_x | |||||
3 vdiph2/e@ en_sc en_x | |||||
1 vdiph2/ea ro | 1 vdiph2/ea ro | ||||
1 vdiph2/eo ro | 1 vdiph2/eo ro | ||||
1 vdiph2/e[u ro | 1 vdiph2/e[u ro | ||||
1 vdiph2/i@ en_n | 1 vdiph2/i@ en_n | ||||
1 vdiph2/i@_2 en_wm | 1 vdiph2/i@_2 en_wm | ||||
1 vdiph2/ie fi | |||||
2 vdiph2/ie fi en_x | |||||
1 vdiph2/ii@ en | 1 vdiph2/ii@ en | ||||
1 vdiph2/ii@_3 vi | 1 vdiph2/ii@_3 vi | ||||
3 vdiph2/iu base2 vi zhy | 3 vdiph2/iu base2 vi zhy | ||||
1 vdiph2/iy fi | 1 vdiph2/iy fi | ||||
1 vdiph2/o@ af | 1 vdiph2/o@ af | ||||
1 vdiph2/oa ro | 1 vdiph2/oa ro | ||||
1 vdiph2/o_oo is | |||||
2 vdiph2/o_oo is en_x | |||||
1 vdiph2/u-@ vi | 1 vdiph2/u-@ vi | ||||
1 vdiph2/u#@ en_sc | 1 vdiph2/u#@ en_sc | ||||
1 vdiph2/uo fi | 1 vdiph2/uo fi | ||||
4 vdiph2/uu@ en en_n en_wm vi | |||||
5 vdiph2/uu@ en en_n en_wm vi en_x | |||||
1 vdiph2/y#@ af | 1 vdiph2/y#@ af | ||||
1 vdiph2/yu nl | 1 vdiph2/yu nl | ||||
1 vdiph2/y-y# fi | 1 vdiph2/y-y# fi | ||||
2 vdiph/aai_2 af cy | 2 vdiph/aai_2 af cy | ||||
1 vdiph/aai_3 fi | 1 vdiph/aai_3 fi | ||||
1 vdiph/aau fi | 1 vdiph/aau fi | ||||
4 vdiph/aau_2 de nl la zhy | |||||
5 vdiph/aau_2 de nl la zhy en_x | |||||
1 vdiph/aau_3 hi | 1 vdiph/aau_3 hi | ||||
1 vdiph/aau_4 vi | 1 vdiph/aau_4 vi | ||||
1 vdiph/ae fr_ca | 1 vdiph/ae fr_ca | ||||
1 vdiph/ae_2 en_n | 1 vdiph/ae_2 en_n | ||||
7 vdiph/ai base2 eo sk hr it pt vi | |||||
8 vdiph/ai base2 eo sk hr it pt vi en_x | |||||
2 vdiph/ai_2 cy | 2 vdiph/ai_2 cy | ||||
1 vdiph/ai_3 no | 1 vdiph/ai_3 no | ||||
1 vdiph/ai_4 af | 1 vdiph/ai_4 af | ||||
4 vowel/0_2 en_n en_wm pt_pt sw | 4 vowel/0_2 en_n en_wm pt_pt sw | ||||
4 vowel/0_3 en_us en_sc en_rp hu | 4 vowel/0_3 en_us en_sc en_rp hu | ||||
2 vowel/@_2 fr | 2 vowel/@_2 fr | ||||
2 vowel/&_2 en_us | |||||
6 vowel/@_3 en_sc de hi | 6 vowel/@_3 en_sc de hi | ||||
1 vowel/3_2 en_n | 1 vowel/3_2 en_n | ||||
1 vowel/3_3 en_rp | 1 vowel/3_3 en_rp | ||||
1 vowel/@_4 nl | 1 vowel/@_4 nl | ||||
2 vowel/8_2 en_us sv | 2 vowel/8_2 en_us sv | ||||
1 vowel/8_3 zhy | 1 vowel/8_3 zhy | ||||
14 vowel/a en_n cy de hu nl pl sk hr sr it la | |||||
4 vowel/a# base2 en_sc pt | |||||
7 vowel/a_2 base2 eo la pt pt_pt ro vi | |||||
16 vowel/a en_n en_wm cy de hu nl pl sk hr sr it la | |||||
5 vowel/a# base2 en_sc pt en_x | |||||
11 vowel/a_2 base2 eo la pt pt_pt ro vi en_x | |||||
4 vowel/a#_2 hr sv is sw | 4 vowel/a#_2 hr sv is sw | ||||
7 vowel/a_3 en_sc fr cs is | 7 vowel/a_3 en_sc fr cs is | ||||
12 vowel/a#_3 en en_n en_us en_wm de hi ru pt_pt vi zhy | 12 vowel/a#_3 en en_n en_us en_wm de hi ru pt_pt vi zhy | ||||
4 vowel/a_4 en_wm el vi | |||||
2 vowel/a_4 el vi | |||||
3 vowel/a_5 it sv sw | 3 vowel/a_5 it sv sw | ||||
5 vowel/aa fi fr_ca no zhy | 5 vowel/aa fi fr_ca no zhy | ||||
1 vowel/aa# fi | 1 vowel/aa# fi | ||||
2 vowel/aa_8 en_us | 2 vowel/aa_8 en_us | ||||
3 vowel/a_en en fr | 3 vowel/a_en en fr | ||||
1 vowel/@_bck hi | 1 vowel/@_bck hi | ||||
14 vowel/e base2 en en_n af cy eo fr hr it la pt pt_pt ++ | |||||
15 vowel/e base2 en en_n af cy eo fr hr it la pt pt_pt ++ | |||||
2 vowel/e# en_sc | 2 vowel/e# en_sc | ||||
7 vowel/e_2 en_sc de hi it sv no | 7 vowel/e_2 en_sc de hi it sv no | ||||
1 vowel/e_3 hu | 1 vowel/e_3 hu | ||||
1 vowel/e_5 en_sc | 1 vowel/e_5 en_sc | ||||
3 vowel/ee fr pl sv | 3 vowel/ee fr pl sv | ||||
2 vowel/e_e en_sc is | 2 vowel/e_e en_sc is | ||||
8 vowel/ee_1 base2 en en_n pl la sv no zhy | |||||
3 vowel/ee_2 en cy nl | |||||
9 vowel/ee_1 base2 en en_n en_wm pl la sv no zhy | |||||
4 vowel/ee_2 en en_us cy nl | |||||
1 vowel/ee#_2 sv | 1 vowel/ee#_2 sv | ||||
4 vowel/ee_3 af pt vi | 4 vowel/ee_3 af pt vi | ||||
3 vowel/ee_6 en_n sk sv | 3 vowel/ee_6 en_n sk sv | ||||
13 vowel/e_mid en_rp en_wm fr_ca hi hu sk cs hr it es pt_pt no ++ | |||||
13 vowel/e_mid en_rp fr_ca hi hu sk cs hr it es pt_pt no is ++ | |||||
10 vowel/e_mid2 af de fi nl sk ro el sw | 10 vowel/e_mid2 af de fi nl sk ro el sw | ||||
1 vowel/@_fnt hr | |||||
3 vowel/@_fnt hr en_x | |||||
1 vowel/@_hgh no | 1 vowel/@_hgh no | ||||
18 vowel/i base2 en_n en_rp en_wm cy eo fr hu pl it pt pt_pt ++ | |||||
18 vowel/i base2 en_n en_wm cy eo fr hu pl it pt pt_pt ro ++ | |||||
2 vowel/i# en_rp cy | 2 vowel/i# en_rp cy | ||||
5 vowel/i_2 de nl la sv | |||||
6 vowel/i_2 en_rp de nl la sv | |||||
3 vowel/i_3 af fr sk | 3 vowel/i_3 af fr sk | ||||
4 vowel/i_4 fi hu it is | 4 vowel/i_4 fi hu it is | ||||
5 vowel/i_5 en_sc | 5 vowel/i_5 en_sc | ||||
3 vowel/i#_5 pt_pt ro | 3 vowel/i#_5 pt_pt ro | ||||
1 vowel/i_6 hr | 1 vowel/i_6 hr | ||||
3 vowel/i_en en en_us vi | 3 vowel/i_en en en_us vi | ||||
2 vowel/i_fnt hi | |||||
3 vowel/i_fnt hi en_x | |||||
12 vowel/ii en_rp en_wm cy de fr_ca nl is zhy | 12 vowel/ii en_rp en_wm cy de fr_ca nl is zhy | ||||
3 vowel/ii# cy pl ru | 3 vowel/ii# cy pl ru | ||||
1 vowel/ii_2 la | 1 vowel/ii_2 la | ||||
6 vowel/ii_3 fi hi sk hr sv no | |||||
7 vowel/ii_3 fi hi sk hr sv no en_x | |||||
5 vowel/ii_4 en en_n | 5 vowel/ii_4 en en_n | ||||
2 vowel/ii_5 en_x | |||||
2 vowel/ii_6 en_wm | 2 vowel/ii_6 en_wm | ||||
1 vowel/ii_en en | 1 vowel/ii_en en | ||||
10 vowel/@_low en_rp hi ro no | 10 vowel/@_low en_rp hi ro no | ||||
11 vowel/o base2 en en_wm de hi it la pt_pt sv | |||||
12 vowel/o base2 en en_wm de hi it la pt_pt sv en_x | |||||
4 vowel/o_2 cy hi hu no | 4 vowel/o_2 cy hi hu no | ||||
2 vowel/o-_2 en_n en_wm | 2 vowel/o-_2 en_n en_wm | ||||
3 vowel/o_3 en_sc fr | 3 vowel/o_3 en_sc fr | ||||
1 vowel/oe_2 no | 1 vowel/oe_2 no | ||||
1 vowel/oe_4 sv | 1 vowel/oe_4 sv | ||||
2 vowel/o_mid fr hu | 2 vowel/o_mid fr hu | ||||
9 vowel/oo en_sc de eo la es el sv no zhy | |||||
11 vowel/oo_1 en_n en_rp en_wm af fi sk hr vi | |||||
12 vowel/oo en_sc de eo la es el sv no zhy en_x | |||||
10 vowel/oo_1 en_n en_rp en_wm af fi sk hr vi | |||||
3 vowel/oo_2 en_sc cy cs | 3 vowel/oo_2 en_sc cy cs | ||||
1 vowel/oo_3 af | 1 vowel/oo_3 af | ||||
3 vowel/oo_4 hi pl it | |||||
6 vowel/oo_4 hi pl it en_x | |||||
1 vowel/oo_5 is | 1 vowel/oo_5 is | ||||
6 vowel/oo_en en en_n en_rp | 6 vowel/oo_en en en_n en_rp | ||||
2 vowelr/aa_r en_sc | 2 vowelr/aa_r en_sc | ||||
4 vowelr/r-voc hi sk hr | 4 vowelr/r-voc hi sk hr | ||||
2 vowelr/V3_r en en_sc | 2 vowelr/V3_r en en_sc | ||||
1 vowelr/V_r en | 1 vowelr/V_r en | ||||
6 vowel/u cy de eo fr cs la | |||||
7 vowel/u cy de eo fr cs la en_x | |||||
5 vowel/u# en en_sc | 5 vowel/u# en en_sc | ||||
5 vowel/u_2 fi fr sk hr ro | 5 vowel/u_2 fi fr sk hr ro | ||||
1 vowel/u#_2 sv | 1 vowel/u#_2 sv | ||||
3 vowel/uu_2 base2 de la | 3 vowel/uu_2 base2 de la | ||||
1 vowel/uu_3 af | 1 vowel/uu_3 af | ||||
2 vowel/uu_4 fi sv | 2 vowel/uu_4 fi sv | ||||
8 vowel/uu_bck en_n fr_ca hi hu pt no zhy | |||||
9 vowel/uu_bck en_n fr_ca hi hu pt no zhy en_x | |||||
1 vowel/V en_sc | 1 vowel/V en_sc | ||||
4 vowel/V_2 en af ru | |||||
5 vowel/V_2 en en_us af ru | |||||
3 vowel/V_3 en_rp hi vi | 3 vowel/V_3 en_rp hi vi | ||||
1 vowel/V_4 en_sc | 1 vowel/V_4 en_sc | ||||
6 vowel/y en de fi hu nl zhy | 6 vowel/y en de fi hu nl zhy | ||||
1 vwl_af/@ af | 1 vwl_af/@ af | ||||
1 vwl_af/I af | 1 vwl_af/I af | ||||
2 vwl_af/r@ af | 2 vwl_af/r@ af | ||||
6 vwl_en/aI@ en en_n en_us en_sc en_rp en_wm | |||||
7 vwl_en/aI@ en en_n en_us en_sc en_rp en_wm en_x | |||||
2 vwl_en/aI@_2 en_sc | 2 vwl_en/aI@_2 en_sc | ||||
5 vwl_en/aU@ en en_n en_us en_sc en_wm | |||||
6 vwl_en/aU@ en en_n en_us en_sc en_wm en_x | |||||
12 vwl_en/@L en en_us en_sc en_rp en_wm af | 12 vwl_en/@L en en_us en_sc en_rp en_wm af | ||||
3 vwl_en/@L_2 en_sc | 3 vwl_en/@L_2 en_sc | ||||
1 vwl_en_n/aa_5 en_n | 1 vwl_en_n/aa_5 en_n | ||||
1 vwl_en_n/O@ en_n | |||||
2 vwl_en_n/O@ en_n | |||||
1 vwl_en_n/u_ en_n | 1 vwl_en_n/u_ en_n | ||||
3 vwl_en_rp/aa en_rp | 3 vwl_en_rp/aa en_rp | ||||
1 vwl_en_rp/aU@ en_rp | 1 vwl_en_rp/aU@ en_rp | ||||
1 vwl_en/u en | 1 vwl_en/u en | ||||
4 vwl_en/u_L en en_n en_us en_rp | 4 vwl_en/u_L en en_n en_us en_rp | ||||
2 vwl_en_us/3_us en_us | 2 vwl_en_us/3_us en_us | ||||
2 vwl_en_us/a en_us | |||||
1 vwl_en_us/aai en_us | 1 vwl_en_us/aai en_us | ||||
2 vwl_en_us/ar en_us | 2 vwl_en_us/ar en_us | ||||
1 vwl_en_us/ee en_us | |||||
1 vwl_en_us/er en_us | 1 vwl_en_us/er en_us | ||||
1 vwl_en_us/i_final3 en_us | 1 vwl_en_us/i_final3 en_us | ||||
2 vwl_en_us/ii en_us | 2 vwl_en_us/ii en_us | ||||
1 vwl_en_us/oor en_us | 1 vwl_en_us/oor en_us | ||||
3 vwl_en_us/or en_us en_sc | 3 vwl_en_us/or en_us en_sc | ||||
1 vwl_en_us/ur en_us | 1 vwl_en_us/ur en_us | ||||
1 vwl_en_us/V en_us | |||||
1 vwl_en_wm/i en_wm | 1 vwl_en_wm/i en_wm | ||||
2 vwl_fr/@R fr pt_pt | |||||
3 vwl_fr/@R fr pt_pt | |||||
1 vwl_fr/@R2 fr_ca | 1 vwl_fr/@R2 fr_ca | ||||
1 vwl_fr/rfr fr | |||||
1 vwl_hi/A hi | 1 vwl_hi/A hi | ||||
3 vwl_hi/l-voc hi sk | 3 vwl_hi/l-voc hi sk | ||||
2 vwl_no/& no | 2 vwl_no/& no |
phoneme O@ | phoneme O@ | ||||
vowel starttype (o) endtype (@) | vowel starttype (o) endtype (@) | ||||
length 240 | length 240 | ||||
formants vowel/oo_1 | |||||
formants vwl_en_n/O@ | |||||
linkout r- | linkout r- | ||||
endphoneme | endphoneme | ||||
phoneme O@ | |||||
phoneme o@ | |||||
vowel starttype (o) endtype (@) | vowel starttype (o) endtype (@) | ||||
length 240 | length 240 | ||||
formants vwl_en_n/O@ | formants vwl_en_n/O@ |
phoneme i: | phoneme i: | ||||
vowel starttype (i) endtype (i) | vowel starttype (i) endtype (i) | ||||
length 175 | length 175 | ||||
formants vowel/i | |||||
formants vowel/i_2 | |||||
after w w/wi2 | after w w/wi2 | ||||
linkout ; | linkout ; | ||||
endphoneme | endphoneme |
phoneme a | phoneme a | ||||
vowel starttype (a) endtype (@) | vowel starttype (a) endtype (@) | ||||
length 190 | |||||
formants vwl_en_us/a | |||||
length 180 | |||||
formants vowel/&_2 | |||||
// formants vwl_en_us/a | |||||
reduceto a2 0 | reduceto a2 0 | ||||
endphoneme | endphoneme | ||||
phoneme aa // 'bath' etc. | phoneme aa // 'bath' etc. | ||||
vowel starttype (a) endtype (@) | vowel starttype (a) endtype (@) | ||||
length 190 | length 190 | ||||
formants vwl_en_us/a | |||||
formants vowel/&_2 | |||||
// formants vwl_en_us/a | |||||
linkout r- | linkout r- | ||||
endphoneme | endphoneme | ||||
phoneme E | phoneme E | ||||
vowel starttype (e) endtype (e) | vowel starttype (e) endtype (e) | ||||
length 160 | length 160 | ||||
formants vwl_en_us/ee | |||||
formants vowel/ee_2 | |||||
reduceto I 0 | reduceto I 0 | ||||
endphoneme | endphoneme | ||||
phoneme V | phoneme V | ||||
vowel starttype (a) endtype (@) | vowel starttype (a) endtype (@) | ||||
length 170 | length 170 | ||||
formants vwl_en_us/V | |||||
// formants vowel/V_2 | |||||
// formants vwl_en_us/V | |||||
formants vowel/V_2 | |||||
reduceto @ 0 | reduceto @ 0 | ||||
endphoneme | endphoneme | ||||
phoneme a | phoneme a | ||||
vowel starttype (a) endtype (a) | vowel starttype (a) endtype (a) | ||||
length 170 | length 170 | ||||
formants vowel/a_4 | |||||
formants vowel/a | |||||
reduceto a2 0 | reduceto a2 0 | ||||
endphoneme | endphoneme | ||||
phoneme E | phoneme E | ||||
vowel starttype (e) endtype (e) | vowel starttype (e) endtype (e) | ||||
length 150 | length 150 | ||||
formants vowel/e_mid | |||||
formants vowel/ee_1 | |||||
reduceto I 0 | reduceto I 0 | ||||
// before l/ DFT-30+L/eL_af | |||||
endphoneme | endphoneme | ||||
vowel starttype (u) endtype (u) | vowel starttype (u) endtype (u) | ||||
length 150 | length 150 | ||||
formants vowel/uu | formants vowel/uu | ||||
linkout _| | |||||
endphoneme | endphoneme | ||||
phoneme aa // 'bath' etc. | phoneme aa // 'bath' etc. | ||||
vowel starttype (a) endtype (a) | vowel starttype (a) endtype (a) | ||||
length 150 | length 150 | ||||
formants vowel/a_4 | |||||
formants vowel/a | |||||
linkout r- | linkout r- | ||||
endphoneme | endphoneme | ||||
phoneme d | phoneme d | ||||
vcd alv stop | vcd alv stop | ||||
vowelin f1=2 f2=1700 -300 300 f3=-100 80 | |||||
vowelin f1=1 f2=1700 -300 300 f3=-100 80 | |||||
vowelout f1=2 f2=1700 -300 300 f3=-100 80 | vowelout f1=2 f2=1700 -300 300 f3=-100 80 | ||||
formants d/d+x/d | formants d/d+x/d | ||||
before _ d/d_+x/d_ | before _ d/d_+x/d_ | ||||
//phonemetable f_en basef | //phonemetable f_en basef | ||||
//include pf_english | //include pf_english | ||||
phonemetable en_x en | |||||
include ph_english_x | |||||
int ix; | int ix; | ||||
int v; | int v; | ||||
int v_stress; | int v_stress; | ||||
int reduce_level; | |||||
int stressed_syllable; // position of stressed syllable | int stressed_syllable; // position of stressed syllable | ||||
int max_stress_posn; | int max_stress_posn; | ||||
int unstressed_word = 0; | int unstressed_word = 0; | ||||
if(phonetic[ix] == 0) | if(phonetic[ix] == 0) | ||||
break; | break; | ||||
} | } | ||||
if(ix == 0) return; | |||||
final_ph = phonetic[ix-1]; | final_ph = phonetic[ix-1]; | ||||
max_output = output + (N_WORD_PHONEMES-3); /* check for overrun */ | max_output = output + (N_WORD_PHONEMES-3); /* check for overrun */ | ||||
if(v_stress > 0) | if(v_stress > 0) | ||||
*output++ = stress_phonemes[v_stress]; // mark stress of all vowels except 0 (unstressed) | *output++ = stress_phonemes[v_stress]; // mark stress of all vowels except 0 (unstressed) | ||||
while((ph->reduce_to != 0) && (((dictionary_flags & FLAG_FOUND)==0) || (langopts.param[LOPT_REDUCE] & 1))) | |||||
{ | |||||
// this vowel can be reduced to another if the stress is below a specified value | |||||
int reduce = 0; | |||||
switch(reduce_level = (ph->phflags >> 28) & 7) | |||||
{ | |||||
case 0: | |||||
/* reduce unstressed-diminished to schwa */ | |||||
if((vowel_stress[v+1] <= 1) && (v >= (vowel_count-2))) | |||||
{ | |||||
/* not if followed by another, terminating, unstessed syllable */ | |||||
break; | |||||
} // drop through to next case | |||||
case 1: | |||||
if(v_stress == 1) // diminished stress only | |||||
reduce = 1; | |||||
break; | |||||
default: | |||||
if(v_stress < reduce_level) | |||||
reduce = 1; | |||||
break; | |||||
} | |||||
if(max_stress == 1) max_stress = 0; | |||||
if(unstressed_word && (langopts.param[LOPT_REDUCE] & 0x2) && (v_stress >= max_stress)) | |||||
{ | |||||
// don't reduce the most stressed syllable in an unstressed word | |||||
reduce = 0; | |||||
} | |||||
if(reduce) | |||||
{ | |||||
phcode = ph->reduce_to; | |||||
ph = phoneme_tab[phcode]; | |||||
#ifdef deleted | |||||
if(*p == phonLENGTHEN) | |||||
{ | |||||
/* delete length indicator after vowel now that it has been reduced */ | |||||
p++; | |||||
} | |||||
#endif | |||||
} | |||||
else | |||||
break; | |||||
} | |||||
if(vowel_stress[v] > max_stress) | if(vowel_stress[v] > max_stress) | ||||
{ | { |
int Translator::ChangePhonemes(PHONEME_LIST2 *phlist, int n_ph, int index, PHONEME_TAB *ph, CHANGEPH *ch) | int Translator::ChangePhonemes(PHONEME_LIST2 *phlist, int n_ph, int index, PHONEME_TAB *ph, CHANGEPH *ch) | ||||
{//====================================================================================================== | {//====================================================================================================== | ||||
// Called for each phoneme in the phoneme list, to allow a language to make changes | // Called for each phoneme in the phoneme list, to allow a language to make changes | ||||
// flags: bit 0=1 last phoneme in a word | |||||
// bit 1=1 this is the highest stressed vowel in the current word | |||||
// bit 2=1 after the highest stressed vowel in the current word | |||||
// bit 3=1 the phonemes were specified explicitly, or found from an entry in the xx_list dictionary | |||||
// ph The current phoneme | // ph The current phoneme | ||||
return(0); | return(0); | ||||
} | } | ||||
PHONEME_TAB *ph; | PHONEME_TAB *ph; | ||||
PHONEME_TAB *prev, *next, *next2; | PHONEME_TAB *prev, *next, *next2; | ||||
int unstress_count = 0; | int unstress_count = 0; | ||||
int word_has_stress = 0; | |||||
int word_stress = 0; | |||||
int switched_language = 0; | int switched_language = 0; | ||||
int max_stress; | int max_stress; | ||||
int voicing; | int voicing; | ||||
} | } | ||||
if(plist2->sourceix) | if(plist2->sourceix) | ||||
word_has_stress = 0; // start of a word | |||||
{ | |||||
// start of a word | |||||
int k; | |||||
word_stress = 0; | |||||
// find the highest stress level in this word | |||||
for(k=j+1; k < n_ph_list2; k++) | |||||
{ | |||||
if(ph_list3[k].sourceix) | |||||
break; // start of the next word | |||||
if(ph_list3[k].stress > word_stress) | |||||
word_stress = ph_list3[k].stress; | |||||
} | |||||
} | |||||
if(ph == NULL) continue; | if(ph == NULL) continue; | ||||
{ | { | ||||
// in a sequence of unstressed syllables, reduce alternate syllables to 'diminished' | // in a sequence of unstressed syllables, reduce alternate syllables to 'diminished' | ||||
// stress. But not for the last phoneme of a stressed word | // stress. But not for the last phoneme of a stressed word | ||||
if((langopts.stress_flags & 0x2) || (word_has_stress && ((plist2+1)->sourceix!=0))) | |||||
if((langopts.stress_flags & 0x2) || ((word_stress > 3) && ((plist2+1)->sourceix!=0))) | |||||
{ | { | ||||
// An unstressed final vowel of a stressed word | // An unstressed final vowel of a stressed word | ||||
unstress_count=1; // try again for next syllable | unstress_count=1; // try again for next syllable | ||||
else | else | ||||
{ | { | ||||
unstress_count = 0; | unstress_count = 0; | ||||
if(plist2->stress > 3) | |||||
word_has_stress = 1; // word has a primary or a secondary stress | |||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
if((ph->reduce_to != 0) && (ph->type != phVOWEL) && !(plist2->synthflags & SFLAG_DICTIONARY)) | |||||
while((ph->reduce_to != 0) && (!(plist2->synthflags & SFLAG_DICTIONARY) || (langopts.param[LOPT_REDUCE] & 1))) | |||||
{ | { | ||||
// reduction for vowels has already been done in SetWordStress | |||||
int reduce_level; | int reduce_level; | ||||
int stress_level; | |||||
int reduce = 0; | |||||
reduce_level = (ph->phflags >> 28) & 7; | |||||
if(next->type == phVOWEL) | |||||
if(ph->type == phVOWEL) | |||||
{ | { | ||||
reduce_level = (ph->phflags >> 28) & 7; | |||||
if((&plist2[1])->stress < reduce_level) | |||||
{ | |||||
// look at the stress of the following vowel | |||||
ph = phoneme_tab[ph->reduce_to]; | |||||
} | |||||
stress_level = plist2->stress; | |||||
} | |||||
else | |||||
{ | |||||
// consonant, get stress from the following vowel | |||||
if(next->type == phVOWEL) | |||||
stress_level = (plist2+1)->stress; | |||||
else | |||||
break; | |||||
} | |||||
if(stress_level == 1) | |||||
reduce = 1; // stress = 'reduced' | |||||
if(stress_level < reduce_level) | |||||
reduce =1; | |||||
if((word_stress < 4) && (langopts.param[LOPT_REDUCE] & 0x2) && (stress_level >= word_stress)) | |||||
{ | |||||
// don't reduce the most stressed syllable in an unstressed word | |||||
reduce = 0; | |||||
} | } | ||||
if(reduce) | |||||
ph = phoneme_tab[ph->reduce_to]; | |||||
else | |||||
break; | |||||
} | } | ||||
if((plist2+1)->synthflags & SFLAG_LENGTHEN) | if((plist2+1)->synthflags & SFLAG_LENGTHEN) |
int Translator_Russian::ChangePhonemes(PHONEME_LIST2 *phlist, int n_ph, int index, PHONEME_TAB *ph, CHANGEPH *ch) | int Translator_Russian::ChangePhonemes(PHONEME_LIST2 *phlist, int n_ph, int index, PHONEME_TAB *ph, CHANGEPH *ch) | ||||
{//============================================================================================================== | {//============================================================================================================== | ||||
// Called for each phoneme in the phoneme list, to allow a language to make changes | // Called for each phoneme in the phoneme list, to allow a language to make changes | ||||
// flags: bit 0=1 last phoneme in a word | |||||
// bit 1=1 this is the highest stressed vowel in the current word | |||||
// bit 2=1 after the highest stressed vowel in the current word | |||||
// bit 3=1 the phonemes were specified explicitly, or found from an entry in the xx_list dictionary | |||||
// bits 8-15 syllable number, 1=first syllable, etc. | |||||
// ph The current phoneme | // ph The current phoneme | ||||
int variant; | int variant; |
if(last_char == 'f') | if(last_char == 'f') | ||||
TranslateRules(&word_ss[1], phonemes, N_WORD_PHONEMES, NULL, 0, 0); | TranslateRules(&word_ss[1], phonemes, N_WORD_PHONEMES, NULL, 0, 0); | ||||
else | else | ||||
if(strchr_w("hsx",last_char)==NULL) | |||||
if((last_char==0) || (strchr_w("hsx",last_char)==NULL)) | |||||
TranslateRules(&word_zz[1], phonemes, N_WORD_PHONEMES, NULL, 0, 0); | TranslateRules(&word_zz[1], phonemes, N_WORD_PHONEMES, NULL, 0, 0); | ||||
else | else | ||||
TranslateRules(&word_iz[1], phonemes, N_WORD_PHONEMES, NULL, 0, 0); | TranslateRules(&word_iz[1], phonemes, N_WORD_PHONEMES, NULL, 0, 0); |
// Set parameters for a formant | // Set parameters for a formant | ||||
int ix; | int ix; | ||||
int formant; | int formant; | ||||
int freq = -1; | |||||
int height = -1; | |||||
int width = -1; | |||||
int freq = 100; | |||||
int height = 100; | |||||
int width = 100; | |||||
ix = sscanf(p,"%d %d %d %d",&formant,&freq,&height,&width); | ix = sscanf(p,"%d %d %d %d",&formant,&freq,&height,&width); | ||||
if(ix < 2) | if(ix < 2) | ||||
{ | { | ||||
while(isspace(*p)) p++; | while(isspace(*p)) p++; | ||||
n = -1; | n = -1; | ||||
if((n = atoi(p)) > 0) | |||||
if(((n = atoi(p)) > 0) && (n < 32)) | |||||
{ | { | ||||
p++; | p++; | ||||
conditional_rules |= (1 << n); | conditional_rules |= (1 << n); |
amp = embedded_value[EMBED_H]; | amp = embedded_value[EMBED_H]; | ||||
delay = 130; | delay = 130; | ||||
} | } | ||||
if(delay == 0) | |||||
amp = 0; | |||||
echo_head = (delay * samplerate)/1000; | echo_head = (delay * samplerate)/1000; | ||||
echo_amp = amp; | echo_amp = amp; | ||||
// compensate (partially) for increase in amplitude due to echo | // compensate (partially) for increase in amplitude due to echo | ||||
{ | { | ||||
peak_harmonic[pk] = peaks[pk].freq / pitch; | peak_harmonic[pk] = peaks[pk].freq / pitch; | ||||
x = peaks[pk].height >> 14; | x = peaks[pk].height >> 14; | ||||
peak_height[pk] = x * x * 5; | |||||
peak_height[pk] = (x * x * 5)/2; | |||||
// only use harmonics up to half the samplerate | // only use harmonics up to half the samplerate | ||||
if(peak_harmonic[pk] >= hmax_samplerate) | if(peak_harmonic[pk] >= hmax_samplerate) | ||||
for(h=0; h<=hmax; h++, f+=pitch) | for(h=0; h<=hmax; h++, f+=pitch) | ||||
{ | { | ||||
x = htab[h] >> 15; | x = htab[h] >> 15; | ||||
htab[h] = (x * x) >> 7; | |||||
htab[h] = (x * x) >> 8; | |||||
if((ix = (f >> 19)) < N_TONE_ADJUST) | if((ix = (f >> 19)) < N_TONE_ADJUST) | ||||
{ | { | ||||
maxh2 = PeaksToHarmspect(peaks,pitch<<4,hspect[0],0); | maxh2 = PeaksToHarmspect(peaks,pitch<<4,hspect[0],0); | ||||
// adjust amplitude to compensate for fewer harmonics at higher pitch | // adjust amplitude to compensate for fewer harmonics at higher pitch | ||||
amplitude2 = (amplitude * pitch)/(100 << 12); | |||||
amplitude2 = (amplitude * pitch)/(100 << 11); | |||||
// switch sign of harmonics above about 900Hz, to reduce max peak amplitude | // switch sign of harmonics above about 900Hz, to reduce max peak amplitude | ||||
h_switch_sign = 890 / (pitch >> 12); | h_switch_sign = 890 / (pitch >> 12); | ||||
cycle_count++; | cycle_count++; | ||||
// adjust amplitude to compensate for fewer harmonics at higher pitch | // adjust amplitude to compensate for fewer harmonics at higher pitch | ||||
amplitude2 = (amplitude * pitch)/(100 << 12); | |||||
amplitude2 = (amplitude * pitch)/(100 << 11); | |||||
if(glottal_flag > 0) | if(glottal_flag > 0) | ||||
{ | { |