diff --git a/dictsource/cs_rules b/dictsource/cs_rules index ca0286f1..042f2cb2 100644 --- a/dictsource/cs_rules +++ b/dictsource/cs_rules @@ -198,7 +198,7 @@ ie (_ ije ii (_ iji io (_ ijo - iu (_ ijo + iu (_ iju _) i (on j C) ight ajt // right, night diff --git a/dictsource/en_list b/dictsource/en_list index 41b121e0..e16b78cb 100644 --- a/dictsource/en_list +++ b/dictsource/en_list @@ -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 diff --git a/dictsource/hu_rules b/dictsource/hu_rules index 450ce6d9..6af25bc3 100644 --- a/dictsource/hu_rules +++ b/dictsource/hu_rules @@ -314,6 +314,9 @@ _szára) zs (ág zS _kö) zs (ég zS _nehé) zs (ely zS + _) zürich tsyR2iC + + .group $ dolla:R2 ä E diff --git a/phsource/compile_report b/phsource/compile_report index 9d2b83c1..e2e748d5 100644 --- a/phsource/compile_report +++ b/phsource/compile_report @@ -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 diff --git a/phsource/ph_english_n b/phsource/ph_english_n index e8aec158..9b1c93c2 100644 --- a/phsource/ph_english_n +++ b/phsource/ph_english_n @@ -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@ diff --git a/phsource/ph_english_rp b/phsource/ph_english_rp index 93bb0067..e0a783d8 100644 --- a/phsource/ph_english_rp +++ b/phsource/ph_english_rp @@ -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 diff --git a/phsource/ph_english_us b/phsource/ph_english_us index e38fab4f..4fc82801 100644 --- a/phsource/ph_english_us +++ b/phsource/ph_english_us @@ -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 diff --git a/phsource/ph_english_wm b/phsource/ph_english_wm index 2f9cdac0..db925e70 100644 --- a/phsource/ph_english_wm +++ b/phsource/ph_english_wm @@ -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 diff --git a/phsource/phonemes b/phsource/phonemes index 21ba3ff5..f668b501 100644 --- a/phsource/phonemes +++ b/phsource/phonemes @@ -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 + diff --git a/phsource/vdiph2/ie b/phsource/vdiph2/ie index abf3b96a..ef371624 100644 Binary files a/phsource/vdiph2/ie and b/phsource/vdiph2/ie differ diff --git a/phsource/vdiph2/o_oo b/phsource/vdiph2/o_oo index b6ad4959..958cf540 100644 Binary files a/phsource/vdiph2/o_oo and b/phsource/vdiph2/o_oo differ diff --git a/phsource/vdiph2/vowelchart.png b/phsource/vdiph2/vowelchart.png index 3efca2f5..cf204b70 100644 Binary files a/phsource/vdiph2/vowelchart.png and b/phsource/vdiph2/vowelchart.png differ diff --git a/phsource/vowel/&_2 b/phsource/vowel/&_2 index a383d49e..a6d61039 100644 Binary files a/phsource/vowel/&_2 and b/phsource/vowel/&_2 differ diff --git a/phsource/vowel/3_2 b/phsource/vowel/3_2 index 35ff3622..9f07c526 100644 Binary files a/phsource/vowel/3_2 and b/phsource/vowel/3_2 differ diff --git a/phsource/vowel/V_2 b/phsource/vowel/V_2 index acfe63b8..06daa258 100644 Binary files a/phsource/vowel/V_2 and b/phsource/vowel/V_2 differ diff --git a/phsource/vowel/ee# b/phsource/vowel/ee# index af548dd6..68ca5d68 100644 Binary files a/phsource/vowel/ee# and b/phsource/vowel/ee# differ diff --git a/phsource/vowel/i_2 b/phsource/vowel/i_2 index 6a8778a0..51f80a6c 100644 Binary files a/phsource/vowel/i_2 and b/phsource/vowel/i_2 differ diff --git a/phsource/vowel/ii_5 b/phsource/vowel/ii_5 new file mode 100644 index 00000000..b4f94243 Binary files /dev/null and b/phsource/vowel/ii_5 differ diff --git a/phsource/vowel/o b/phsource/vowel/o index 6694f26a..5bfed0a2 100644 Binary files a/phsource/vowel/o and b/phsource/vowel/o differ diff --git a/phsource/vowel/u b/phsource/vowel/u index 8409c1b1..ad86b5d2 100644 Binary files a/phsource/vowel/u and b/phsource/vowel/u differ diff --git a/phsource/vowel/uu b/phsource/vowel/uu index 9291f7db..b04d4bc1 100644 Binary files a/phsource/vowel/uu and b/phsource/vowel/uu differ diff --git a/phsource/vowel/vowelchart.png b/phsource/vowel/vowelchart.png index eb828587..c5877180 100644 Binary files a/phsource/vowel/vowelchart.png and b/phsource/vowel/vowelchart.png differ diff --git a/src/dictionary.cpp b/src/dictionary.cpp index 4f868163..4abb3959 100755 --- a/src/dictionary.cpp +++ b/src/dictionary.cpp @@ -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) { diff --git a/src/phonemelist.cpp b/src/phonemelist.cpp index ddc53943..a8975004 100755 --- a/src/phonemelist.cpp +++ b/src/phonemelist.cpp @@ -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)) - { - // reduction for vowels has already been done in SetWordStress - int reduce_level; - if(next->type == phVOWEL) + while((ph->reduce_to != 0) && (!(plist2->synthflags & SFLAG_DICTIONARY) || (langopts.param[LOPT_REDUCE] & 1))) + { + int reduce_level; + int stress_level; + int reduce = 0; + + reduce_level = (ph->phflags >> 28) & 7; + + 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) diff --git a/src/tr_languages.cpp b/src/tr_languages.cpp index 7aa0e1df..bc6182df 100644 --- a/src/tr_languages.cpp +++ b/src/tr_languages.cpp @@ -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; diff --git a/src/translate.cpp b/src/translate.cpp index 6f49f0fe..aeb4b473 100755 --- a/src/translate.cpp +++ b/src/translate.cpp @@ -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); diff --git a/src/voices.cpp b/src/voices.cpp index ece8191c..56c32d1b 100755 --- a/src/voices.cpp +++ b/src/voices.cpp @@ -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); diff --git a/src/wavegen.cpp b/src/wavegen.cpp index b1cc5361..13221957 100755 --- a/src/wavegen.cpp +++ b/src/wavegen.cpp @@ -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) {