diff --git a/dictsource/de_rules b/dictsource/de_rules index f9272fed..eef9611b 100644 --- a/dictsource/de_rules +++ b/dictsource/de_rules @@ -123,7 +123,8 @@ m) a (lt_ A:l ker) am (ik 'A:m @) an (_ 'A:n - @) ance (_ 'A~s + s) ance (_ 'A~s + s) ancen (_ 'A~s@n fr) ance (_ 'A~s@ ein) an (der 'an @) ant (_ 'ant @@ -823,6 +824,7 @@ formal) ie =I@ _) natur (C@P5 nA:t'u:r _) na (tür n%A: nce (_ _^_EN + nces (_ _^_EN _) ne (b ne: nebeneina (nd n,e:b@n_|aIn'a _) neben (@P5 n'e:b@n @@ -1035,6 +1037,7 @@ formal) ie =I@ schwer Sve:r _) sechs (P5 z'Eks + seku (nden ze:k'U _) selbst (@@P6 z'Elpst service (_S7 z%Ervi:s shop _^_EN @@ -1245,7 +1248,7 @@ formal) ie =I@ _) w (lad v _) w (rA v - @) wert (_ vErt + @) wert (_ ve:rt _) wh _^_EN &) ware (_ _^_EN _) wasch (@P5 v'aS diff --git a/dictsource/dict_phonemes b/dictsource/dict_phonemes index 56d061ba..72de4f79 100644 --- a/dictsource/dict_phonemes +++ b/dictsource/dict_phonemes @@ -609,7 +609,7 @@ s. t T t. th th. v x z Z z. -Dictionary bg_dict 2011-04-20 +Dictionary bg_dict 2011-04-25 @ a e i o u diff --git a/dictsource/en_rules b/dictsource/en_rules index 238dc88d..db691314 100644 --- a/dictsource/en_rules +++ b/dictsource/en_rules @@ -4379,7 +4379,7 @@ prede (ces pri:dI _) pre (diP3 pr%i _) pre (dic pr%I - _) pre (emp pr%I + _) pre (em pr%i: _) pre (fec pri: _) pre (feren prE pre (fix pri: diff --git a/dictsource/ta_rules b/dictsource/ta_rules index 3b235eb9..2a81f262 100644 --- a/dictsource/ta_rules +++ b/dictsource/ta_rules @@ -360,6 +360,8 @@ _மன்மதக்) க (ுகை g _) க் (ரௌண்ட g _) க்வ (A kw _) க் (வாலியர g + _) கி (ராம்ப k + _) க (ஞ்சா gV //endsort //sort @@ -582,6 +584,9 @@ _துப்பாக்கி) க்க (ுண்ட gg என்சை) க்லோப (ீடியா klo:p க் (ஸ k _மெ) க்ஸிக (ோ ksik + _ராஜ்) க (ிரண k + இராம) க (ாவிய k + _மெரு) க (ூட்ட g //endsort @@ -1350,6 +1355,9 @@ _நடுரோ) ட் (ல t. _) த (ோஹா d _) தௌலதாப (ாத daUlVd.a:b _) த (்ராட்சை d + _) த (வக்கால dV + _) த (ருமங் dV + _) த (ருமப் dV //endsort //sort @@ -1460,6 +1468,12 @@ _காமசூ) த் (ர t த) த (்ரூப t பா) த (்ரூம t _மை) த் (ரேய t + L03) த்த (ின dd + L03) த்த (ிசை dd + L03) த்த (ூச dd + L03) த்த (ேவன dd + L03) த்த (ேவர dd + L03) த்த (ேவத dd //endsort @@ -2111,6 +2125,10 @@ _சந்திர_) ப (ோஸ b _) ப் (ளவுஸ b _) ப் (ளோரிடா f _) ப் (ளௌஸ b + _) பு (ரோகித p + _) ப (ீன்ஸ b + _) ப (ிஜிலி b + _) ப (ேமானி b //endsort //sort @@ -2478,6 +2496,8 @@ _சந்தேக) ப்ப (ுத்தி bb ஏரோ) ப் (ளேன p _) ப் (ளோரன்ஸ f ப் (ஸ p + _அ) ப (ின்_ b + _குமார) ப (ாளைய p //endsort // If ப+ appearing in the middle of a word is followed by ட+ diff --git a/phsource/compile_report b/phsource/compile_report index 50743529..249d94ce 100644 --- a/phsource/compile_report +++ b/phsource/compile_report @@ -368,8 +368,8 @@ l/l_ [l] base [l/] fr l/l_@ [l/3] base [l/] fr -l/l@ [l#] base - [”¦] base +l/l@ [hös] base + [l#] base [l] fr [l/2] fr [K] nso @@ -402,16 +402,16 @@ l/L2_oL [l/2] base l/L2_uL [l/2] base l/l_3 [l/] de l/l_4 [ll] sq -l/la [l#] base - [”¦] base +l/la [hös] base + [l#] base [l] fr [l/2] fr [K] nso [K] tn l/l_a [l/3] base [l/] fr -l/le [l#] base - [”¦] base +l/le [hös] base + [l#] base [l] fr [l/2] fr [K] nso @@ -422,8 +422,8 @@ l/L_eL_af [&] af [&:] af l/l_front [L] sq l/l_front_ [l/4] sq -l/li [l#] base - [”¦] base +l/li [hös] base + [l#] base [l] fr [l/2] fr [l] zh @@ -436,8 +436,8 @@ ll/ll [L] bg ll/_ll [L] bg l/l_long [l] base [l] fr -l/lo [l#] base - [”¦] base +l/lo [hös] base + [l#] base [l/2] fr [K] nso [K] tn @@ -446,8 +446,8 @@ l/l_o [l/3] base l^/l_rfx [l.] base [l] ru [l^] ru -l/lu [l#] base - [”¦] base +l/lu [hös] base + [l#] base [l] fr [l/2] fr [K] nso diff --git a/src/dictionary.cpp b/src/dictionary.cpp index 43487b5b..6d7cb779 100644 --- a/src/dictionary.cpp +++ b/src/dictionary.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005 to 2010 by Jonathan Duddington * + * Copyright (C) 2005 to 2011 by Jonathan Duddington * * email: jonsd@users.sourceforge.net * * * * This program is free software; you can redistribute it and/or modify * @@ -523,15 +523,19 @@ unsigned short ipa1[96] = { }; -static void WritePhMnemonic(char *phon_out, int *ix, PHONEME_TAB *ph, PHONEME_LIST *plist) +static void WritePhMnemonic(char **buf, PHONEME_TAB *ph, PHONEME_LIST *plist) {//======================================================================================= int c; int mnem; int len; int first; + int ix = 0; + char *phon_out; unsigned int ipa_control=0; // first byte of ipa string may control the phoneme name interpretation. 0x20 = ignore this phoneme PHONEME_DATA phdata; + phon_out = *buf; + if(option_phonemes == 3) { // has an ipa name been defined for this phoneme ? @@ -551,11 +555,14 @@ static void WritePhMnemonic(char *phon_out, int *ix, PHONEME_TAB *ph, PHONEME_LI { if((ipa_control = phdata.ipa_string[0]) > 0x20) { - strcpy(&phon_out[*ix], phdata.ipa_string); - *ix += len; + strcpy(&phon_out[ix], phdata.ipa_string); + ix += len; } if(ipa_control >= 0x20) + { + *buf += ix; return; // 0x20 = ignore phoneme + } } } @@ -581,14 +588,16 @@ static void WritePhMnemonic(char *phon_out, int *ix, PHONEME_TAB *ph, PHONEME_LI if((c >= 0x20) && (c < 128)) c = ipa1[c-0x20]; - *ix += utf8_out(c, &phon_out[*ix]); + ix += utf8_out(c, &phon_out[ix]); } else { - phon_out[(*ix)++]= c; + phon_out[ix++]= c; } first = 0; } + + *buf += ix; } // end of WritePhMnemonic @@ -600,21 +609,27 @@ void GetTranslatedPhonemeString(char *phon_out, int n_phon_out) */ int ix; + int len; + int max_len; int phon_out_ix=0; int stress; unsigned int c; char *p; + char *buf; + char phon_buf[30]; PHONEME_LIST *plist; static const char *stress_chars = "==,,''"; if(phon_out != NULL) { - for(ix=1; ix<(n_phoneme_list-2) && (phon_out_ix < (n_phon_out - 6)); ix++) + for(ix=1; ix<(n_phoneme_list-2); ix++) { + buf = phon_buf; + plist = &phoneme_list[ix]; if(plist->newword) - phon_out[phon_out_ix++] = ' '; + *buf++ = ' '; if(plist->synthflags & SFLAG_SYLLABLE) { @@ -636,7 +651,7 @@ void GetTranslatedPhonemeString(char *phon_out, int n_phon_out) if(c != 0) { - phon_out_ix += utf8_out(c, &phon_out[phon_out_ix]); + buf += utf8_out(c, buf); } } } @@ -646,31 +661,44 @@ void GetTranslatedPhonemeString(char *phon_out, int n_phon_out) // the tone_ph field contains a phoneme table number p = phoneme_tab_list[plist->tone_ph].name; - sprintf(&phon_out[phon_out_ix], "(%s)", p); - phon_out_ix += (strlen(p) + 2); + sprintf(buf, "(%s)", p); + buf += (strlen(p) + 2); } else { - WritePhMnemonic(phon_out, &phon_out_ix, plist->ph, plist); + WritePhMnemonic(&buf, plist->ph, plist); if(plist->synthflags & SFLAG_LENGTHEN) { - WritePhMnemonic(phon_out, &phon_out_ix, phoneme_tab[phonLENGTHEN], NULL); + WritePhMnemonic(&buf, phoneme_tab[phonLENGTHEN], NULL); } if((plist->synthflags & SFLAG_SYLLABLE) && (plist->type != phVOWEL)) { // syllablic consonant - WritePhMnemonic(phon_out, &phon_out_ix, phoneme_tab[phonSYLLABIC], NULL); + WritePhMnemonic(&buf, phoneme_tab[phonSYLLABIC], NULL); } if(plist->tone_ph > 0) { - WritePhMnemonic(phon_out, &phon_out_ix, phoneme_tab[plist->tone_ph], NULL); + WritePhMnemonic(&buf, phoneme_tab[plist->tone_ph], NULL); } } - } - if(phon_out_ix >= n_phon_out) - phon_out_ix = n_phon_out - 1; + len = buf - phon_buf; + max_len = (n_phon_out - phon_out_ix - 5); // allow for " ..." and zero byte terminator + if(len > max_len) + { + strcpy(&phon_buf[max_len], " ..."); + len = max_len + 4; + } + phon_buf[len] = 0; + strcpy(&phon_out[phon_out_ix], phon_buf); + phon_out_ix += len; + + if(len > max_len) + { + break; + } + } phon_out[phon_out_ix] = 0; } } // end of GetTranslatedPhonemeString diff --git a/src/phonemelist.cpp b/src/phonemelist.cpp index 1c428385..f07a2877 100644 --- a/src/phonemelist.cpp +++ b/src/phonemelist.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005 to 2007 by Jonathan Duddington * + * Copyright (C) 2005 to 2011 by Jonathan Duddington * * email: jonsd@users.sourceforge.net * * * * This program is free software; you can redistribute it and/or modify * @@ -171,7 +171,7 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence) // set consonant clusters to all voiced or all unvoiced // Regressive int type; - int word_end_devoice = 0; + int stop_propagation = 0; voicing = 0; for(j=n_ph_list2-1; j>=0; j--) @@ -189,13 +189,10 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence) if(regression & 0x2) { - // LANG=Russian, [v] amd [v;] don't cause regression, or [R^] + // [v] amd [v;] don't cause regression, or [R^] if((ph->mnemonic == 'v') || (ph->mnemonic == ((';'<<8)+'v')) || ((ph->mnemonic & 0xff)== 'R')) { - if(word_end_devoice == 1) - voicing = 0; - else - type = phLIQUID; + stop_propagation = 1; } } @@ -237,8 +234,12 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence) voicing = 0; } } + if(stop_propagation) + { + voicing = 0; + stop_propagation = 0; + } - word_end_devoice = 0; if(plist2[j].sourceix) { if(regression & 0x04) @@ -252,7 +253,6 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence) if(voicing == 0) { voicing = 1; - word_end_devoice = 1; } } } diff --git a/src/readclause.cpp b/src/readclause.cpp index f1dd0533..12b37318 100644 --- a/src/readclause.cpp +++ b/src/readclause.cpp @@ -2691,10 +2691,11 @@ if(option_ssml) parag=1; } *charix_top = ix; - if(((ix > (n_buf-20)) && !IsAlpha(c1) && !iswdigit(c1)) || (ix >= (n_buf-2))) + if(((ix > (n_buf-75)) && !IsAlpha(c1) && !iswdigit(c1)) || (ix >= (n_buf-4))) { // clause too long, getting near end of buffer, so break here // try to break at a word boundary (unless we actually reach the end of buffer). + // (n_buf-4) is to allow for 3 bytes of multibyte character plus terminator. buf[ix] = ' '; buf[ix+1] = 0; UngetC(c2); diff --git a/src/synthdata.cpp b/src/synthdata.cpp index 4ad64b36..8ca6d826 100644 --- a/src/synthdata.cpp +++ b/src/synthdata.cpp @@ -35,7 +35,7 @@ #include "translate.h" #include "wave.h" -const char *version_string = "1.45.04 25.Apr.11"; +const char *version_string = "1.45.21 27.Apr.11"; const int version_phdata = 0x014500; int option_device_number = -1; diff --git a/src/translate.cpp b/src/translate.cpp index f57cfbbe..eb129a01 100644 --- a/src/translate.cpp +++ b/src/translate.cpp @@ -103,7 +103,7 @@ static int embedded_read; unsigned int embedded_list[N_EMBEDDED_LIST]; // the source text of a single clause (UTF8 bytes) -#define N_TR_SOURCE 700 +#define N_TR_SOURCE 800 static char source[N_TR_SOURCE+40]; // extra space for embedded command & voice change info at end int n_replace_phonemes; @@ -1783,7 +1783,7 @@ static int TranslateWord2(Translator *tr, char *word, WORD_TAB *wtab, int pre_pa strcpy(ph_buf,word_phonemes); flags2[0] = TranslateWord(translator, p2+1, 0, wtab+1); - if(flags2[0] & FLAG_WAS_UNPRONOUNCABLE) + if((flags2[0] & FLAG_WAS_UNPRONOUNCABLE) || (word_phonemes[0] == phonSWITCH)) ok = 0; if(sylimit & 0x100) diff --git a/src/translate.h b/src/translate.h index 9979d3f6..7c8b7ee6 100644 --- a/src/translate.h +++ b/src/translate.h @@ -265,7 +265,7 @@ extern const int param_defaults[N_SPEECH_PARAM]; #define LOPT_PREFIXES 3 // non-zero, change voiced/unoiced to match last consonant in a cluster - // bit 1=LANG=ru, don't propagate over [v] + // bit 1=LANG=cz,bg don't propagate over [v] // bit 2=don't propagate acress word boundaries // bit 3=LANG=pl, propagate over liquids and nasals // bit 4=devoice word-final consonants @@ -494,7 +494,7 @@ typedef struct int transpose_min; char dictionary_name[40]; - char phon_out[300]; + char phon_out[400]; char phonemes_repeat[20]; int phonemes_repeat_count; int phoneme_tab_ix;