mirror of
https://github.com/rhasspy/espeak-ng.git
synced 2026-11-06 23:16:21 +00:00
Possible fix to segfault when changing voices in SSML <s> tags.
git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@148 d46cf337-b52f-0410-862d-fd96e6ae7743
This commit is contained in:
+14
-15
@@ -126,7 +126,6 @@ typedef struct {
|
||||
|
||||
#define N_SSML_STACK 20
|
||||
int n_ssml_stack;
|
||||
SSML_STACK *ssml_sp;
|
||||
SSML_STACK ssml_stack[N_SSML_STACK];
|
||||
|
||||
char current_voice_id[40] = {0};
|
||||
@@ -765,7 +764,7 @@ int Translator::AnnouncePunctuation(int c1, int c2, char *buf, int bufix)
|
||||
#define SSML_CLOSE 0x10 // for a closing tag, OR this with the tag type
|
||||
|
||||
// these tags have no effect if they are self-closing, eg. <voice />
|
||||
static char ignore_if_self_closing[] = {0,1,1,1,1,0,0,0,0,1,1,0,1,0,0,0,0};
|
||||
static char ignore_if_self_closing[] = {0,1,1,1,1,0,0,0,0,1,1,0,1,0,1,0,0};
|
||||
|
||||
|
||||
MNEM_TAB ssmltags[] = {
|
||||
@@ -1176,6 +1175,7 @@ static int GetVoiceAttributes(wchar_t *pw, int tag_type)
|
||||
wchar_t *age;
|
||||
wchar_t *variant;
|
||||
const char *new_voice_id;
|
||||
SSML_STACK *ssml_sp;
|
||||
|
||||
static const MNEM_TAB mnem_gender[] = {
|
||||
{"male", 1},
|
||||
@@ -1190,7 +1190,6 @@ static int GetVoiceAttributes(wchar_t *pw, int tag_type)
|
||||
{
|
||||
n_ssml_stack--;
|
||||
}
|
||||
ssml_sp = &ssml_stack[n_ssml_stack];
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1334,6 +1333,7 @@ static int ProcessSsmlTag(wchar_t *xml_buf, char *outbuf, int &outix, int n_outb
|
||||
char tag_name[40];
|
||||
char buf[80];
|
||||
PARAM_STACK *sp;
|
||||
SSML_STACK *ssml_sp;
|
||||
|
||||
static const MNEM_TAB mnem_punct[] = {
|
||||
{"none", 1},
|
||||
@@ -1403,6 +1403,7 @@ static int ProcessSsmlTag(wchar_t *xml_buf, char *outbuf, int &outix, int n_outb
|
||||
|
||||
voice_change_flag = 0;
|
||||
terminator = CLAUSE_NONE;
|
||||
ssml_sp = &ssml_stack[n_ssml_stack-1];
|
||||
|
||||
switch(tag_type)
|
||||
{
|
||||
@@ -1649,7 +1650,7 @@ static int ProcessSsmlTag(wchar_t *xml_buf, char *outbuf, int &outix, int n_outb
|
||||
return(CLAUSE_COLON);
|
||||
|
||||
case SSML_SENTENCE:
|
||||
if((ssml_sp != NULL) && (ssml_sp->tag_type == SSML_SENTENCE))
|
||||
if(ssml_sp->tag_type == SSML_SENTENCE)
|
||||
{
|
||||
// new sentence implies end-of-sentence
|
||||
voice_change_flag = GetVoiceAttributes(px, SSML_SENTENCE+SSML_CLOSE);
|
||||
@@ -1659,18 +1660,15 @@ static int ProcessSsmlTag(wchar_t *xml_buf, char *outbuf, int &outix, int n_outb
|
||||
|
||||
|
||||
case SSML_PARAGRAPH:
|
||||
if(ssml_sp != NULL)
|
||||
if(ssml_sp->tag_type == SSML_SENTENCE)
|
||||
{
|
||||
if(ssml_sp->tag_type == SSML_SENTENCE)
|
||||
{
|
||||
// new paragraph implies end-of-sentence or end-of-paragraph
|
||||
voice_change_flag = GetVoiceAttributes(px, SSML_SENTENCE+SSML_CLOSE);
|
||||
}
|
||||
if(ssml_sp->tag_type == SSML_PARAGRAPH)
|
||||
{
|
||||
// new paragraph implies end-of-sentence or end-of-paragraph
|
||||
voice_change_flag |= GetVoiceAttributes(px, SSML_PARAGRAPH+SSML_CLOSE);
|
||||
}
|
||||
// new paragraph implies end-of-sentence or end-of-paragraph
|
||||
voice_change_flag = GetVoiceAttributes(px, SSML_SENTENCE+SSML_CLOSE);
|
||||
}
|
||||
if(ssml_sp->tag_type == SSML_PARAGRAPH)
|
||||
{
|
||||
// new paragraph implies end-of-sentence or end-of-paragraph
|
||||
voice_change_flag |= GetVoiceAttributes(px, SSML_PARAGRAPH+SSML_CLOSE);
|
||||
}
|
||||
voice_change_flag |= GetVoiceAttributes(px, tag_type);
|
||||
return(CLAUSE_PARAGRAPH + voice_change_flag);
|
||||
@@ -2197,6 +2195,7 @@ void InitText2(void)
|
||||
|
||||
n_ssml_stack =1;
|
||||
n_param_stack = 1;
|
||||
ssml_stack[0].tag_type = 0;
|
||||
|
||||
for(param=0; param<N_SPEECH_PARAM; param++)
|
||||
speech_parameters[param] = param_stack[0].parameter[param]; // set all speech parameters to defaults
|
||||
|
||||
Reference in New Issue
Block a user