Browse Source

Fix crash: SSML when <voice name=""> has an unrecognised voice name.

SSML: Don't speak text within <metadata> </metadata>


git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@145 d46cf337-b52f-0410-862d-fd96e6ae7743
master
jonsd 17 years ago
parent
commit
134f750277
3 changed files with 20 additions and 3 deletions
  1. 10
    1
      src/readclause.cpp
  2. 1
    0
      src/voice.h
  3. 9
    2
      src/voices.cpp

+ 10
- 1
src/readclause.cpp View File

{ {
if(c < 0x100) if(c < 0x100)
return(isalpha(c)); return(isalpha(c));
if((c > 0x3040) && (c <= 0xa700))
return(1); // japanese, chinese characters
if(c > MAX_WALPHA) if(c > MAX_WALPHA)
return(0); return(0);
return(walpha_tab[c-0x100]); return(walpha_tab[c-0x100]);
#define SSML_AUDIO 11 #define SSML_AUDIO 11
#define SSML_EMPHASIS 12 #define SSML_EMPHASIS 12
#define SSML_BREAK 13 #define SSML_BREAK 13
#define SSML_METADATA 14
#define HTML_BREAK 15 #define HTML_BREAK 15
#define SSML_CLOSE 0x10 // for a closing tag, OR this with the tag type #define SSML_CLOSE 0x10 // for a closing tag, OR this with the tag type


{"audio", SSML_AUDIO}, {"audio", SSML_AUDIO},
{"emphasis", SSML_EMPHASIS}, {"emphasis", SSML_EMPHASIS},
{"break", SSML_BREAK}, {"break", SSML_BREAK},
{"metadata", SSML_METADATA},


{"br", HTML_BREAK}, {"br", HTML_BREAK},
{"li", HTML_BREAK}, {"li", HTML_BREAK},
{ {
sp = &ssml_stack[ix]; 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); strcpy(voice_name, sp->voice_name);
language[0] = 0; language[0] = 0;
} }
break; break;


case SSML_METADATA:
ignore_text = 1;
break;

case SSML_SUB + SSML_CLOSE: case SSML_SUB + SSML_CLOSE:
case SSML_METADATA + SSML_CLOSE:
ignore_text = 0; ignore_text = 0;
break; break;



+ 1
- 0
src/voice.h View File

extern int tone_points[10]; extern int tone_points[10];


const char *SelectVoice(espeak_VOICE *voice_select); 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 *LoadVoice(const char *voice_name, int control);
voice_t *LoadVoiceVariant(const char *voice_name, int variant); voice_t *LoadVoiceVariant(const char *voice_name, int variant);
void DoVoiceChange(voice_t *v); void DoVoiceChange(voice_t *v);

+ 9
- 2
src/voices.cpp View File







static espeak_VOICE *SelectVoiceByName(espeak_VOICE **voices, const char *name)
{//============================================================================
espeak_VOICE *SelectVoiceByName(espeak_VOICE **voices, const char *name)
{//=====================================================================
int ix; int ix;
int match_fname = -1; int match_fname = -1;
int match_fname2 = -1; int match_fname2 = -1;
int last_part_len; int last_part_len;
char last_part[41]; 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); sprintf(last_part,"%c%s",PATHSEP,name);
last_part_len = strlen(last_part); last_part_len = strlen(last_part);



Loading…
Cancel
Save