SSML: Don't speak text within <metadata> </metadata> git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@145 d46cf337-b52f-0410-862d-fd96e6ae7743master
| @@ -190,6 +190,8 @@ int iswalpha(int c) | |||
| { | |||
| if(c < 0x100) | |||
| return(isalpha(c)); | |||
| if((c > 0x3040) && (c <= 0xa700)) | |||
| return(1); // japanese, chinese characters | |||
| if(c > MAX_WALPHA) | |||
| return(0); | |||
| return(walpha_tab[c-0x100]); | |||
| @@ -758,6 +760,7 @@ int Translator::AnnouncePunctuation(int c1, int c2, char *buf, int bufix) | |||
| #define SSML_AUDIO 11 | |||
| #define SSML_EMPHASIS 12 | |||
| #define SSML_BREAK 13 | |||
| #define SSML_METADATA 14 | |||
| #define HTML_BREAK 15 | |||
| #define SSML_CLOSE 0x10 // for a closing tag, OR this with the tag type | |||
| @@ -779,6 +782,7 @@ MNEM_TAB ssmltags[] = { | |||
| {"audio", SSML_AUDIO}, | |||
| {"emphasis", SSML_EMPHASIS}, | |||
| {"break", SSML_BREAK}, | |||
| {"metadata", SSML_METADATA}, | |||
| {"br", HTML_BREAK}, | |||
| {"li", HTML_BREAK}, | |||
| @@ -816,7 +820,7 @@ static const char *VoiceFromStack() | |||
| { | |||
| sp = &ssml_stack[ix]; | |||
| if(sp->voice_name[0] != 0) | |||
| if((sp->voice_name[0] != 0) && (SelectVoiceByName(NULL,sp->voice_name) != NULL)) | |||
| { | |||
| strcpy(voice_name, sp->voice_name); | |||
| language[0] = 0; | |||
| @@ -1495,7 +1499,12 @@ static int ProcessSsmlTag(wchar_t *xml_buf, char *outbuf, int &outix, int n_outb | |||
| } | |||
| break; | |||
| case SSML_METADATA: | |||
| ignore_text = 1; | |||
| break; | |||
| case SSML_SUB + SSML_CLOSE: | |||
| case SSML_METADATA + SSML_CLOSE: | |||
| ignore_text = 0; | |||
| break; | |||
| @@ -71,6 +71,7 @@ extern voice_t *voice; | |||
| extern int tone_points[10]; | |||
| const char *SelectVoice(espeak_VOICE *voice_select); | |||
| espeak_VOICE *SelectVoiceByName(espeak_VOICE **voices, const char *name); | |||
| voice_t *LoadVoice(const char *voice_name, int control); | |||
| voice_t *LoadVoiceVariant(const char *voice_name, int variant); | |||
| void DoVoiceChange(voice_t *v); | |||
| @@ -1221,8 +1221,8 @@ static int SetVoiceScores(espeak_VOICE *voice_select, espeak_VOICE **voices, int | |||
| static espeak_VOICE *SelectVoiceByName(espeak_VOICE **voices, const char *name) | |||
| {//============================================================================ | |||
| espeak_VOICE *SelectVoiceByName(espeak_VOICE **voices, const char *name) | |||
| {//===================================================================== | |||
| int ix; | |||
| int match_fname = -1; | |||
| int match_fname2 = -1; | |||
| @@ -1231,6 +1231,13 @@ static espeak_VOICE *SelectVoiceByName(espeak_VOICE **voices, const char *name) | |||
| int last_part_len; | |||
| char last_part[41]; | |||
| if(voices == NULL) | |||
| { | |||
| if(n_voices_list == 0) | |||
| espeak_ListVoices(NULL); // create the voices list | |||
| voices = voices_list; | |||
| } | |||
| sprintf(last_part,"%c%s",PATHSEP,name); | |||
| last_part_len = strlen(last_part); | |||