diff --git a/dictsource/zh_rules b/dictsource/zh_rules index 3cdfc1e5..076a54ab 100644 --- a/dictsource/zh_rules +++ b/dictsource/zh_rules @@ -59,7 +59,11 @@ language). a4o Au51 a (DnK a - a (DngK A + ch) a (DngK A + ch) a (4ngK a + ch) a (ng4K a + k) a (DngK A + _) a (DngK A y) a iA y) ao Au @@ -144,7 +148,6 @@ language). .group o o o - o (DngK u ou ou o1u ou55 o2u ou35 diff --git a/phsource/compile_report b/phsource/compile_report index c1da070d..79747bd3 100644 --- a/phsource/compile_report +++ b/phsource/compile_report @@ -426,9 +426,9 @@ nn/_nn [N] base [N] zh nn/nn_ [N] base [N] en - [N] zh nn/nn@ [(@)] base nn/nn#_ [N#] is +nn/nn2_ [N] zh nn/nna [(a)] base nn/nne [(e)] base nn/nni [(i)] base @@ -838,7 +838,6 @@ vdiph2/ie [i@] en_wi [ie] fi [ia] th [i:a] th -vdiph2/ie_2 [iE] zh vdiph2/ii@ [i@] en [i@3] en vdiph2/ii@_3 [i@] vi @@ -1438,6 +1437,7 @@ vowel/i_6 [i:] en_us [i] hr [i] id [i] tr +vowel/i#_6 [i.] zh vowel/i#_7 [i[] zh vowel/i_en [i:] en [i:] fr @@ -1521,7 +1521,6 @@ vowel/o_4 [oU] en_n vowel/o-_4 [o] ro vowel/o_5 [O] nl vowel/o_6 [O:] nl -vowel/o_7 [u] zh vowel/oe [W] en [W] af [W] de @@ -1530,6 +1529,7 @@ vowel/oe_2 [W] no vowel/oe_4 [W] sv vowel/o_mid [O] fr [o] hu + [o] zh [o] tr vowel/oo [O:] en_sc [O] en_wi @@ -1810,13 +1810,14 @@ vwl_ru/u#u [u"] ru vwl_sv/r_sv3 [r] sv vwl_zh/aang [aan] zhy vwl_zh/aau [Au] zh +vwl_zh/a_n [a] zh vwl_zh/ang [ang] zhy vwl_zh/eng [eng] zhy vwl_zh/iaa [iA] zh vwl_zh/iaau [iAu] zh +vwl_zh/ie [iE] zh vwl_zh/ing [ing] zhy vwl_zh/iou [iou] zh -vwl_zh/i_rfx [i.] zh vwl_zh/ng [ng] zhy vwl_zh/oeng [oen] zhy vwl_zh/ong [ong] zhy diff --git a/phsource/ph_zh b/phsource/ph_zh index 78d813f6..157cdf18 100644 --- a/phsource/ph_zh +++ b/phsource/ph_zh @@ -212,11 +212,11 @@ endphoneme phoneme N //should be more different from n vcd vel nasal - vowelout f1=3 f2=2300 300 400 f3=-200 80 len=40 rms=20 brk + vowelout f1=2 f2=1900 200 400 f3=400 80 len=50 rms=15 brk formants NULL - before _ nn/nn_ + before _ nn/nn2_ after _ nn/_nn - lengthmod 1 + lengthmod 7 after (i) nn/inn endphoneme @@ -224,6 +224,7 @@ phoneme a vowel starttype (a) endtype (a) length 250 formants vowel/a + before N vwl_zh/a_n endphoneme phoneme A @@ -287,7 +288,8 @@ endphoneme phoneme i. //after ts. ts.h s. z. vowel starttype (i) endtype (i) length 250 - formants vwl_zh/i_rfx +// formants vwl_zh/i_rfx + formants vowel/i#_6 endphoneme phoneme iA //try more before N @@ -305,7 +307,7 @@ endphoneme phoneme iE vowel starttype (i) endtype (e) length 250 - formants vdiph2/ie_2 + formants vwl_zh/ie endphoneme phoneme io @@ -324,6 +326,7 @@ phoneme o vowel starttype (o) endtype (o) length 250 formants vdiph2/o_oo + before N vowel/o_mid endphoneme phoneme o- @@ -342,7 +345,6 @@ phoneme u //try more before N vowel starttype (u) endtype (u) length 250 formants vowel/u_bck - before N vowel/o_7 endphoneme phoneme uA diff --git a/phsource/vowel/i#_6 b/phsource/vowel/i#_6 index a201cc43..d1bdd15f 100644 Binary files a/phsource/vowel/i#_6 and b/phsource/vowel/i#_6 differ diff --git a/phsource/vowel/vowelchart.png b/phsource/vowel/vowelchart.png index 3a86078d..34c8868d 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 82f26d9a..42fa8d14 100755 --- a/src/dictionary.cpp +++ b/src/dictionary.cpp @@ -1880,14 +1880,14 @@ void Translator::MatchRule(char *word[], const char *group, char *rule, MatchRec case RULE_DIGIT: if(IsDigit(letter_w)) { - match.points += (21-distance_right); + match.points += (20-distance_right); post_ptr += letter_xbytes; } else if(langopts.tone_numbers) { // also match if there is no digit - match.points += (21-distance_right); + match.points += (20-distance_right); post_ptr--; } else diff --git a/src/intonation.cpp b/src/intonation.cpp index e4a259f9..4561a423 100755 --- a/src/intonation.cpp +++ b/src/intonation.cpp @@ -759,8 +759,14 @@ void Translator::CalcPitches_Tone(int clause_tone) { if((p->type == phVOWEL) && (p->tone >= 4)) { - final_stressed = ix; - count_stressed++; + if(count_stressed == 0) + final_stressed = ix; + + if(p->tone >= 4) + { + final_stressed = ix; + count_stressed++; + } } } @@ -769,7 +775,6 @@ void Translator::CalcPitches_Tone(int clause_tone) { // LANG=vi p = &phoneme_list[final_stressed]; - p->tone = 7; if(p->tone_ph == 0) p->tone_ph = LookupPh("7"); // change tone 1 to falling tone at end of clause } @@ -889,6 +894,9 @@ void Translator::CalcPitches_Tone(int clause_tone) p->pitch2 = pitch_adjust + phoneme_tab[tone_ph]->end_type; } } + + phoneme_list[final_stressed].tone = 7; + } // end of Translator::CalcPitches_Tone diff --git a/src/speak_lib.cpp b/src/speak_lib.cpp index e66c5fb8..6afc8048 100644 --- a/src/speak_lib.cpp +++ b/src/speak_lib.cpp @@ -698,8 +698,9 @@ ENTER("espeak_Initialize"); if((out_start = outbuf) == NULL) return(EE_INTERNAL_ERROR); - // allocate space for event list. Allow 200 events per second - n_event_list = (buf_length*200)/1000; + // allocate space for event list. Allow 200 events per second. + // Add a constant to allow for very small buf_length + n_event_list = (buf_length*200)/1000 + 20; if((event_list = (espeak_EVENT *)realloc(event_list,sizeof(espeak_EVENT) * n_event_list)) == NULL) return(EE_INTERNAL_ERROR); diff --git a/src/synthdata.cpp b/src/synthdata.cpp index dcb25dc2..77a8d5f3 100755 --- a/src/synthdata.cpp +++ b/src/synthdata.cpp @@ -35,7 +35,7 @@ #include "translate.h" #include "wave.h" -const char *version_string = "1.31.05 04.Feb.08"; +const char *version_string = "1.31.06 05.Feb.08"; const int version_phdata = 0x013105; int option_device_number = -1; diff --git a/src/synthesize.cpp b/src/synthesize.cpp index 48801e6a..f5d94ee6 100755 --- a/src/synthesize.cpp +++ b/src/synthesize.cpp @@ -1097,6 +1097,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) unsigned char *amp_env; PHONEME_TAB *ph; PHONEME_TAB *prev_ph; + static int sourceix=0; #ifdef TEST_MBROLA if(mbrola_name[0] != 0) @@ -1140,15 +1141,16 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) if(p->newword) { last_frame = NULL; + sourceix = (p->sourceix & 0x7ff) + clause_start_char; if(p->newword & 4) - DoMarker(espeakEVENT_SENTENCE, (p->sourceix & 0x7ff) + clause_start_char, 0, count_sentences); // start of sentence + DoMarker(espeakEVENT_SENTENCE, sourceix, 0, count_sentences); // start of sentence // if(p->newword & 2) // DoMarker(espeakEVENT_END, count_characters, 0, count_sentences); // end of clause if(p->newword & 1) - DoMarker(espeakEVENT_WORD, (p->sourceix & 0x7ff) + clause_start_char, p->sourceix >> 11, clause_start_word + word_count++); + DoMarker(espeakEVENT_WORD, sourceix, p->sourceix >> 11, clause_start_word + word_count++); } EndAmplitude(); @@ -1156,9 +1158,10 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) if(p->prepause > 0) DoPause(p->prepause); - if(option_phoneme_events) + if(option_phoneme_events && (p->type != phVOWEL)) { - DoMarker(espeakEVENT_PHONEME, (p->sourceix & 0x7ff) + clause_start_char, 0, p->ph->mnemonic); + // Note, for vowels, do the phoneme event after the vowel-start + DoMarker(espeakEVENT_PHONEME, sourceix, 0, p->ph->mnemonic); } switch(p->type) @@ -1398,6 +1401,11 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) DoSpect(ph,prev->ph,next->ph,1,p,modulation); } + if(option_phoneme_events) + { + DoMarker(espeakEVENT_PHONEME, sourceix, 0, p->ph->mnemonic); + } + DoSpect(p->ph,prev->ph,next->ph,2,p,modulation); memset(vowel_transition,0,sizeof(vowel_transition)); diff --git a/src/tr_languages.cpp b/src/tr_languages.cpp index d7d88a19..4fee4ca1 100644 --- a/src/tr_languages.cpp +++ b/src/tr_languages.cpp @@ -718,7 +718,7 @@ SetLengthMods(tr,3); // all equal case L('z','h'): case L_zhy: { - static const short stress_lengths_zh[8] = {230,150, 230,230, 230,0, 230,250}; + static const short stress_lengths_zh[8] = {230,150, 230,230, 230,0, 230,300}; static const unsigned char stress_amps_zh[] = {22,16, 22,22, 22,22, 22,22 }; tr = new Translator;