SSML: <voice>, if a language is specified, forget previously selected voice name. Voice selection, convert language name to lower-case. espeak-data/mbrola_ph files, allow use by both little and big-endian processors. git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@149 d46cf337-b52f-0410-862d-fd96e6ae7743master
| @@ -115,11 +115,11 @@ Dictionary fr_dict | |||
| i i: o O O~ u W w^i | |||
| W~ y Y | |||
| * : ; b c d D dZ | |||
| f g h j k l L m | |||
| n N n2 n^ p p2 r R | |||
| s S t t2 tS v w z | |||
| Z z2 z3 | |||
| * : ; b c d dZ f | |||
| g h j k l L m n | |||
| N n2 n^ p p2 r R s | |||
| S t t2 tS v w z Z | |||
| z2 z3 | |||
| Dictionary hi_dict | |||
| @@ -405,8 +405,8 @@ Z | |||
| Dictionary ku_dict | |||
| a e E eI i I o u | |||
| U y | |||
| a e E eI eU i I o | |||
| u U y | |||
| : b d dZ f g h j | |||
| k l m n p q r R | |||
| @@ -1,6 +1,7 @@ | |||
| // moving towards US English | |||
| name en-rhotic | |||
| language en-r | |||
| language en-us | |||
| language en 3 | |||
| gender male | |||
| @@ -2251,6 +2251,8 @@ void CompileMbrola() | |||
| FILE *f_out; | |||
| int percent; | |||
| int n; | |||
| int *pw; | |||
| int *pw_end; | |||
| int count = 0; | |||
| int control; | |||
| char phoneme[40]; | |||
| @@ -2318,8 +2320,13 @@ void CompileMbrola() | |||
| } | |||
| data[count].name = 0; // list terminator | |||
| fwrite(&mbrola_ctrl,4,1,f_out); | |||
| fwrite(data,sizeof(MBROLA_TAB),count+1,f_out); | |||
| Write4Bytes(f_out, mbrola_ctrl); | |||
| pw_end = (int *)(&data[count+1]); | |||
| for(pw = (int *)data; pw < pw_end; pw++) | |||
| { | |||
| Write4Bytes(f_out, *pw); | |||
| } | |||
| fclose(f_out); | |||
| wxLogStatus(_T("Mbrola translation file: %d phonemes"),count); | |||
| } // end of CompileMbrola | |||
| @@ -804,6 +804,7 @@ static const char *VoiceFromStack() | |||
| int ix; | |||
| SSML_STACK *sp; | |||
| const char *v_id; | |||
| int voice_name_specified; | |||
| espeak_VOICE voice_select; | |||
| char voice_name[40]; | |||
| char language[40]; | |||
| @@ -818,9 +819,11 @@ static const char *VoiceFromStack() | |||
| for(ix=0; ix<n_ssml_stack; ix++) | |||
| { | |||
| sp = &ssml_stack[ix]; | |||
| voice_name_specified = 0; | |||
| if((sp->voice_name[0] != 0) && (SelectVoiceByName(NULL,sp->voice_name) != NULL)) | |||
| { | |||
| voice_name_specified = 1; | |||
| strcpy(voice_name, sp->voice_name); | |||
| language[0] = 0; | |||
| voice_select.gender = 0; | |||
| @@ -828,7 +831,11 @@ static const char *VoiceFromStack() | |||
| voice_select.variant = 0; | |||
| } | |||
| if(sp->language[0] != 0) | |||
| { | |||
| strcpy(language, sp->language); | |||
| if(voice_name_specified == 0) | |||
| voice_name[0] = 0; // forget a previous voice name if a language is specified | |||
| } | |||
| if(sp->voice_gender != 0) | |||
| voice_select.gender = sp->voice_gender; | |||
| if(sp->voice_age != 0) | |||
| @@ -33,6 +33,7 @@ | |||
| #include "translate.h" | |||
| #include "voice.h" | |||
| extern int Read4Bytes(FILE *f); | |||
| #ifdef USE_MBROLA_LIB | |||
| @@ -115,6 +116,8 @@ espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int | |||
| // Load a phoneme name translation table from espeak-data/mbrola | |||
| int size; | |||
| int ix; | |||
| int *pw; | |||
| FILE *f_in; | |||
| char path[sizeof(path_home)+15]; | |||
| @@ -160,10 +163,17 @@ espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int | |||
| fclose(f_in); | |||
| return(EE_INTERNAL_ERROR); | |||
| } | |||
| fread(&mbrola_control,4,1,f_in); | |||
| mbrola_control = Read4Bytes(f_in); | |||
| pw = (int *)mbrola_tab; | |||
| for(ix=4; ix<size; ix+=4) | |||
| { | |||
| *pw++ = Read4Bytes(f_in); | |||
| } | |||
| fread(mbrola_tab,size,1,f_in); | |||
| fclose(f_in); | |||
| #ifdef USE_MBROLA_LIB | |||
| #ifdef PLATFORM_WINDOWS | |||
| setVolumeRatio_MBR((float)(mbrola_control & 0xff) /16.0); | |||
| @@ -35,7 +35,7 @@ | |||
| #include "translate.h" | |||
| #include "wave.h" | |||
| const char *version_string = "1.31.13 21.Feb.08"; | |||
| const char *version_string = "1.31.14 21.Feb.08"; | |||
| const int version_phdata = 0x013105; | |||
| int option_device_number = -1; | |||
| @@ -1711,7 +1711,7 @@ int SubstituteChar(Translator *tr, unsigned int c, unsigned int next_in, int *in | |||
| new_c = replace_chars[ix+1]; | |||
| break; | |||
| } | |||
| if((word >> 16) == (unsigned int)tolower(next_in)) | |||
| if((word >> 16) == (unsigned int)towlower(next_in)) | |||
| { | |||
| new_c = replace_chars[ix+1]; | |||
| ignore_next = 1; | |||
| @@ -2393,6 +2393,10 @@ if((c == '/') && (langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(prev_ou | |||
| } | |||
| n_ph_list2 += 2; | |||
| if(count_words == 0) | |||
| { | |||
| clause_pause = 0; | |||
| } | |||
| if(Eof() && ((word_count == 0) || (option_endpause==0))) | |||
| { | |||
| clause_pause = 10; | |||
| @@ -1035,8 +1035,8 @@ static int __cdecl VoiceScoreSorter(const void *p1, const void *p2) | |||
| } | |||
| static int ScoreVoice(espeak_VOICE *voice_spec, int spec_n_parts, int spec_lang_len, espeak_VOICE *voice) | |||
| {//====================================================================================================== | |||
| static int ScoreVoice(espeak_VOICE *voice_spec, const char *spec_language, int spec_n_parts, int spec_lang_len, espeak_VOICE *voice) | |||
| {//========================================================================================================================= | |||
| int ix; | |||
| const char *p; | |||
| int c1, c2; | |||
| @@ -1058,7 +1058,7 @@ static int ScoreVoice(espeak_VOICE *voice_spec, int spec_n_parts, int spec_lang_ | |||
| } | |||
| else | |||
| { | |||
| if((*p == 0) && (strcmp(voice_spec->languages,"variants")==0)) | |||
| if((*p == 0) && (strcmp(spec_language,"variants")==0)) | |||
| { | |||
| // match on a voice with no languages if the required language is "variants" | |||
| score = 100; | |||
| @@ -1075,7 +1075,7 @@ static int ScoreVoice(espeak_VOICE *voice_spec, int spec_n_parts, int spec_lang_ | |||
| for(ix=0; ; ix++) | |||
| { | |||
| if((ix >= spec_lang_len) || ((c1 = voice_spec->languages[ix]) == '-')) | |||
| if((ix >= spec_lang_len) || ((c1 = spec_language[ix]) == '-')) | |||
| c1 = 0; | |||
| if((c2 = p[ix]) == '-') | |||
| c2 = 0; | |||
| @@ -1179,17 +1179,17 @@ static int SetVoiceScores(espeak_VOICE *voice_select, espeak_VOICE **voices, int | |||
| int nv; // number of candidates | |||
| int n_parts=0; | |||
| int lang_len=0; | |||
| const char *p; | |||
| espeak_VOICE *vp; | |||
| char language[80]; | |||
| // count number of parts in the specified language | |||
| if((voice_select->languages != NULL) && (voice_select->languages[0] != 0)) | |||
| { | |||
| n_parts = 1; | |||
| lang_len = strlen(voice_select->languages); | |||
| for(p = voice_select->languages; *p != 0; p++) | |||
| for(ix=0; (ix<=lang_len) && ((unsigned)ix < sizeof(language)); ix++) | |||
| { | |||
| if(*p == '-') | |||
| if((language[ix] = tolower(voice_select->languages[ix])) == '-') | |||
| n_parts++; | |||
| } | |||
| } | |||
| @@ -1201,7 +1201,7 @@ static int SetVoiceScores(espeak_VOICE *voice_select, espeak_VOICE **voices, int | |||
| if(((control & 1) == 0) && (memcmp(vp->identifier,"mb/",3) == 0)) | |||
| continue; | |||
| if((score = ScoreVoice(voice_select, n_parts, lang_len, voices_list[ix])) > 0) | |||
| if((score = ScoreVoice(voice_select, language, n_parts, lang_len, voices_list[ix])) > 0) | |||
| { | |||
| voices[nv++] = vp; | |||
| vp->score = score; | |||