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
| @@ -198,7 +198,7 @@ | |||
| ie (_ ije | |||
| ii (_ iji | |||
| io (_ ijo | |||
| iu (_ ijo | |||
| iu (_ iju | |||
| _) i (on j | |||
| C) ight ajt // right, night | |||
| @@ -2481,6 +2481,7 @@ haves havz | |||
| has %ha2z $pastf $only | |||
| has haz $only $atend | |||
| (has been) %haz%bIn $pastf | |||
| (has to) haztU $atend | |||
| hath %haT $pastf $only | |||
| had %had $pastf $strend2 $only | |||
| (had been) %had%bIn $pastf | |||
| @@ -314,6 +314,9 @@ _szára) zs (ág zS | |||
| _kö) zs (ég zS | |||
| _nehé) zs (ely zS | |||
| _) zürich tsyR2iC | |||
| .group | |||
| $ dolla:R2 | |||
| ä E | |||
| @@ -1,9 +1,9 @@ | |||
| 38 phoneme tables | |||
| 39 phoneme tables | |||
| new total | |||
| base 96 96 | |||
| base2 23 114 | |||
| en 53 144 | |||
| en_n 29 144 | |||
| en_n 30 144 | |||
| en_us 37 144 | |||
| en_sc 39 146 | |||
| en_rp 34 144 | |||
| @@ -38,6 +38,7 @@ | |||
| vi 42 134 | |||
| zhy 40 129 | |||
| sw 14 105 | |||
| en_x 33 144 | |||
| 3 b/b base hi ro | |||
| 2 b/b_ base hi | |||
| @@ -107,8 +108,8 @@ | |||
| 1 l^/j2u 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 | |||
| 2 l/l@ base | |||
| 1 l/L1_aL base | |||
| @@ -131,7 +132,7 @@ | |||
| 4 l/l_long base fr la ro | |||
| 2 l/lo 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 | |||
| 3 m/_m base ru ro | |||
| 3 m/m_ base ru ro | |||
| @@ -272,14 +273,14 @@ | |||
| 2 ustop/ts_pzd_ hi hu | |||
| 2 ustop/ts_pzd2 hi hu | |||
| 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/eo ro | |||
| 1 vdiph2/e[u ro | |||
| 1 vdiph2/i@ en_n | |||
| 1 vdiph2/i@_2 en_wm | |||
| 1 vdiph2/ie fi | |||
| 2 vdiph2/ie fi en_x | |||
| 1 vdiph2/ii@ en | |||
| 1 vdiph2/ii@_3 vi | |||
| 3 vdiph2/iu base2 vi zhy | |||
| @@ -289,11 +290,11 @@ | |||
| 1 vdiph2/iy fi | |||
| 1 vdiph2/o@ af | |||
| 1 vdiph2/oa ro | |||
| 1 vdiph2/o_oo is | |||
| 2 vdiph2/o_oo is en_x | |||
| 1 vdiph2/u-@ vi | |||
| 1 vdiph2/u#@ en_sc | |||
| 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/yu nl | |||
| 1 vdiph2/y-y# fi | |||
| @@ -302,12 +303,12 @@ | |||
| 2 vdiph/aai_2 af cy | |||
| 1 vdiph/aai_3 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_4 vi | |||
| 1 vdiph/ae fr_ca | |||
| 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 | |||
| 1 vdiph/ai_3 no | |||
| 1 vdiph/ai_4 af | |||
| @@ -416,6 +417,7 @@ | |||
| 4 vowel/0_2 en_n en_wm pt_pt sw | |||
| 4 vowel/0_3 en_us en_sc en_rp hu | |||
| 2 vowel/@_2 fr | |||
| 2 vowel/&_2 en_us | |||
| 6 vowel/@_3 en_sc de hi | |||
| 1 vowel/3_2 en_n | |||
| 1 vowel/3_3 en_rp | |||
| @@ -423,13 +425,13 @@ | |||
| 1 vowel/@_4 nl | |||
| 2 vowel/8_2 en_us sv | |||
| 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 | |||
| 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 | |||
| 4 vowel/a_4 en_wm el vi | |||
| 2 vowel/a_4 el vi | |||
| 3 vowel/a_5 it sv sw | |||
| 5 vowel/aa fi fr_ca no zhy | |||
| 1 vowel/aa# fi | |||
| @@ -442,41 +444,42 @@ | |||
| 2 vowel/aa_8 en_us | |||
| 3 vowel/a_en en fr | |||
| 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 | |||
| 7 vowel/e_2 en_sc de hi it sv no | |||
| 1 vowel/e_3 hu | |||
| 1 vowel/e_5 en_sc | |||
| 3 vowel/ee fr pl sv | |||
| 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 | |||
| 4 vowel/ee_3 af pt vi | |||
| 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 | |||
| 1 vowel/@_fnt hr | |||
| 3 vowel/@_fnt hr en_x | |||
| 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 | |||
| 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 | |||
| 4 vowel/i_4 fi hu it is | |||
| 5 vowel/i_5 en_sc | |||
| 3 vowel/i#_5 pt_pt ro | |||
| 1 vowel/i_6 hr | |||
| 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 | |||
| 3 vowel/ii# cy pl ru | |||
| 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 | |||
| 2 vowel/ii_5 en_x | |||
| 2 vowel/ii_6 en_wm | |||
| 1 vowel/ii_en en | |||
| 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 | |||
| 2 vowel/o-_2 en_n en_wm | |||
| 3 vowel/o_3 en_sc fr | |||
| @@ -488,11 +491,11 @@ | |||
| 1 vowel/oe_2 no | |||
| 1 vowel/oe_4 sv | |||
| 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 | |||
| 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 | |||
| 6 vowel/oo_en en en_n en_rp | |||
| 2 vowelr/aa_r en_sc | |||
| @@ -501,7 +504,7 @@ | |||
| 4 vowelr/r-voc hi sk hr | |||
| 2 vowelr/V3_r en en_sc | |||
| 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_2 fi fr sk hr ro | |||
| 1 vowel/u#_2 sv | |||
| @@ -517,9 +520,9 @@ | |||
| 3 vowel/uu_2 base2 de la | |||
| 1 vowel/uu_3 af | |||
| 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 | |||
| 4 vowel/V_2 en af ru | |||
| 5 vowel/V_2 en en_us af ru | |||
| 3 vowel/V_3 en_rp hi vi | |||
| 1 vowel/V_4 en_sc | |||
| 6 vowel/y en de fi hu nl zhy | |||
| @@ -538,13 +541,13 @@ | |||
| 1 vwl_af/@ af | |||
| 1 vwl_af/I 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 | |||
| 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 | |||
| 3 vwl_en/@L_2 en_sc | |||
| 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 | |||
| 3 vwl_en_rp/aa en_rp | |||
| 1 vwl_en_rp/aU@ en_rp | |||
| @@ -554,10 +557,8 @@ | |||
| 1 vwl_en/u en | |||
| 4 vwl_en/u_L en en_n en_us en_rp | |||
| 2 vwl_en_us/3_us en_us | |||
| 2 vwl_en_us/a en_us | |||
| 1 vwl_en_us/aai 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/i_final3 en_us | |||
| 2 vwl_en_us/ii en_us | |||
| @@ -566,11 +567,9 @@ | |||
| 1 vwl_en_us/oor en_us | |||
| 3 vwl_en_us/or en_us en_sc | |||
| 1 vwl_en_us/ur en_us | |||
| 1 vwl_en_us/V en_us | |||
| 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/rfr fr | |||
| 1 vwl_hi/A hi | |||
| 3 vwl_hi/l-voc hi sk | |||
| 2 vwl_no/& no | |||
| @@ -132,12 +132,12 @@ endphoneme | |||
| phoneme O@ | |||
| vowel starttype (o) endtype (@) | |||
| length 240 | |||
| formants vowel/oo_1 | |||
| formants vwl_en_n/O@ | |||
| linkout r- | |||
| endphoneme | |||
| phoneme O@ | |||
| phoneme o@ | |||
| vowel starttype (o) endtype (@) | |||
| length 240 | |||
| formants vwl_en_n/O@ | |||
| @@ -160,7 +160,7 @@ endphoneme | |||
| phoneme i: | |||
| vowel starttype (i) endtype (i) | |||
| length 175 | |||
| formants vowel/i | |||
| formants vowel/i_2 | |||
| after w w/wi2 | |||
| linkout ; | |||
| endphoneme | |||
| @@ -53,8 +53,9 @@ endphoneme | |||
| phoneme a | |||
| vowel starttype (a) endtype (@) | |||
| length 190 | |||
| formants vwl_en_us/a | |||
| length 180 | |||
| formants vowel/&_2 | |||
| // formants vwl_en_us/a | |||
| reduceto a2 0 | |||
| endphoneme | |||
| @@ -62,7 +63,8 @@ endphoneme | |||
| phoneme aa // 'bath' etc. | |||
| vowel starttype (a) endtype (@) | |||
| length 190 | |||
| formants vwl_en_us/a | |||
| formants vowel/&_2 | |||
| // formants vwl_en_us/a | |||
| linkout r- | |||
| endphoneme | |||
| @@ -79,7 +81,7 @@ endphoneme | |||
| phoneme E | |||
| vowel starttype (e) endtype (e) | |||
| length 160 | |||
| formants vwl_en_us/ee | |||
| formants vowel/ee_2 | |||
| reduceto I 0 | |||
| endphoneme | |||
| @@ -120,8 +122,8 @@ endphoneme | |||
| phoneme V | |||
| vowel starttype (a) endtype (@) | |||
| length 170 | |||
| formants vwl_en_us/V | |||
| // formants vowel/V_2 | |||
| // formants vwl_en_us/V | |||
| formants vowel/V_2 | |||
| reduceto @ 0 | |||
| endphoneme | |||
| @@ -18,7 +18,7 @@ endphoneme | |||
| phoneme a | |||
| vowel starttype (a) endtype (a) | |||
| length 170 | |||
| formants vowel/a_4 | |||
| formants vowel/a | |||
| reduceto a2 0 | |||
| endphoneme | |||
| @@ -26,9 +26,8 @@ endphoneme | |||
| phoneme E | |||
| vowel starttype (e) endtype (e) | |||
| length 150 | |||
| formants vowel/e_mid | |||
| formants vowel/ee_1 | |||
| reduceto I 0 | |||
| // before l/ DFT-30+L/eL_af | |||
| endphoneme | |||
| @@ -79,6 +78,7 @@ phoneme U | |||
| vowel starttype (u) endtype (u) | |||
| length 150 | |||
| formants vowel/uu | |||
| linkout _| | |||
| endphoneme | |||
| @@ -110,7 +110,7 @@ endphoneme | |||
| phoneme aa // 'bath' etc. | |||
| vowel starttype (a) endtype (a) | |||
| length 150 | |||
| formants vowel/a_4 | |||
| formants vowel/a | |||
| linkout r- | |||
| endphoneme | |||
| @@ -619,7 +619,7 @@ endphoneme | |||
| phoneme d | |||
| 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 | |||
| formants d/d+x/d | |||
| before _ d/d_+x/d_ | |||
| @@ -1241,4 +1241,7 @@ include ph_swahili | |||
| //phonemetable f_en basef | |||
| //include pf_english | |||
| phonemetable en_x en | |||
| include ph_english_x | |||
| @@ -931,7 +931,6 @@ void Translator::SetWordStress(char *output, unsigned int dictionary_flags, int | |||
| int ix; | |||
| int v; | |||
| int v_stress; | |||
| int reduce_level; | |||
| int stressed_syllable; // position of stressed syllable | |||
| int max_stress_posn; | |||
| int unstressed_word = 0; | |||
| @@ -966,6 +965,7 @@ void Translator::SetWordStress(char *output, unsigned int dictionary_flags, int | |||
| if(phonetic[ix] == 0) | |||
| break; | |||
| } | |||
| if(ix == 0) return; | |||
| final_ph = phonetic[ix-1]; | |||
| max_output = output + (N_WORD_PHONEMES-3); /* check for overrun */ | |||
| @@ -1360,53 +1360,6 @@ void Translator::SetWordStress(char *output, unsigned int dictionary_flags, int | |||
| if(v_stress > 0) | |||
| *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) | |||
| { | |||
| @@ -35,10 +35,6 @@ | |||
| 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 | |||
| // 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 | |||
| return(0); | |||
| } | |||
| @@ -184,7 +180,7 @@ void Translator::MakePhonemeList(int post_pause, int start_sentence) | |||
| PHONEME_TAB *ph; | |||
| PHONEME_TAB *prev, *next, *next2; | |||
| int unstress_count = 0; | |||
| int word_has_stress = 0; | |||
| int word_stress = 0; | |||
| int switched_language = 0; | |||
| int max_stress; | |||
| int voicing; | |||
| @@ -338,7 +334,21 @@ void Translator::MakePhonemeList(int post_pause, int start_sentence) | |||
| } | |||
| 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; | |||
| @@ -353,7 +363,7 @@ void Translator::MakePhonemeList(int post_pause, int start_sentence) | |||
| { | |||
| // in a sequence of unstressed syllables, reduce alternate syllables to 'diminished' | |||
| // 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 | |||
| unstress_count=1; // try again for next syllable | |||
| @@ -367,8 +377,6 @@ void Translator::MakePhonemeList(int post_pause, int start_sentence) | |||
| else | |||
| { | |||
| unstress_count = 0; | |||
| if(plist2->stress > 3) | |||
| word_has_stress = 1; // word has a primary or a secondary stress | |||
| } | |||
| } | |||
| @@ -426,20 +434,44 @@ void Translator::MakePhonemeList(int post_pause, int start_sentence) | |||
| } | |||
| } | |||
| 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 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) | |||
| @@ -744,11 +744,6 @@ typedef struct { | |||
| 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 | |||
| // 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 | |||
| int variant; | |||
| @@ -923,7 +923,7 @@ strcpy(phonemes2,phonemes); | |||
| if(last_char == 'f') | |||
| TranslateRules(&word_ss[1], phonemes, N_WORD_PHONEMES, NULL, 0, 0); | |||
| 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); | |||
| else | |||
| TranslateRules(&word_iz[1], phonemes, N_WORD_PHONEMES, NULL, 0, 0); | |||
| @@ -396,9 +396,9 @@ static void VoiceFormant(char *p) | |||
| // Set parameters for a formant | |||
| int ix; | |||
| 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); | |||
| if(ix < 2) | |||
| @@ -713,7 +713,7 @@ voice_t *LoadVoice(const char *vname, int control) | |||
| { | |||
| while(isspace(*p)) p++; | |||
| n = -1; | |||
| if((n = atoi(p)) > 0) | |||
| if(((n = atoi(p)) > 0) && (n < 32)) | |||
| { | |||
| p++; | |||
| conditional_rules |= (1 << n); | |||
| @@ -817,6 +817,9 @@ static void WavegenSetEcho(void) | |||
| amp = embedded_value[EMBED_H]; | |||
| delay = 130; | |||
| } | |||
| if(delay == 0) | |||
| amp = 0; | |||
| echo_head = (delay * samplerate)/1000; | |||
| echo_amp = amp; | |||
| // compensate (partially) for increase in amplitude due to echo | |||
| @@ -893,7 +896,7 @@ int PeaksToHarmspect(wavegen_peaks_t *peaks, int pitch, int *htab, int control) | |||
| { | |||
| peak_harmonic[pk] = peaks[pk].freq / pitch; | |||
| 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 | |||
| if(peak_harmonic[pk] >= hmax_samplerate) | |||
| @@ -905,7 +908,7 @@ int PeaksToHarmspect(wavegen_peaks_t *peaks, int pitch, int *htab, int control) | |||
| for(h=0; h<=hmax; h++, f+=pitch) | |||
| { | |||
| x = htab[h] >> 15; | |||
| htab[h] = (x * x) >> 7; | |||
| htab[h] = (x * x) >> 8; | |||
| if((ix = (f >> 19)) < N_TONE_ADJUST) | |||
| { | |||
| @@ -1134,7 +1137,7 @@ static int Wavegen() | |||
| maxh2 = PeaksToHarmspect(peaks,pitch<<4,hspect[0],0); | |||
| // 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 | |||
| h_switch_sign = 890 / (pitch >> 12); | |||
| @@ -1181,7 +1184,7 @@ static int Wavegen() | |||
| cycle_count++; | |||
| // adjust amplitude to compensate for fewer harmonics at higher pitch | |||
| amplitude2 = (amplitude * pitch)/(100 << 12); | |||
| amplitude2 = (amplitude * pitch)/(100 << 11); | |||
| if(glottal_flag > 0) | |||
| { | |||