|
|
@@ -69,6 +69,7 @@ enum { |
|
|
|
V_TRANSLATOR, |
|
|
|
V_PHONEMES, |
|
|
|
V_DICTIONARY, |
|
|
|
V_VARIANTS, |
|
|
|
|
|
|
|
V_MAINTAINER, |
|
|
|
V_STATUS, |
|
|
@@ -125,6 +126,7 @@ static MNEM_TAB keyword_tab[] = { |
|
|
|
{ "maintainer", V_MAINTAINER }, |
|
|
|
{ "status", V_STATUS }, |
|
|
|
|
|
|
|
{ "variants", V_VARIANTS }, |
|
|
|
{ "formant", V_FORMANT }, |
|
|
|
{ "pitch", V_PITCH }, |
|
|
|
{ "phonemes", V_PHONEMES }, |
|
|
@@ -289,15 +291,23 @@ static espeak_VOICE *ReadVoiceFile(FILE *f_in, const char *fname) |
|
|
|
age = 0; |
|
|
|
|
|
|
|
while (fgets_strip(linebuf, sizeof(linebuf), f_in) != NULL) { |
|
|
|
if (memcmp(linebuf, "name", 4) == 0) { |
|
|
|
p = &linebuf[4]; |
|
|
|
// isolate the attribute name |
|
|
|
for (p = linebuf; (*p != 0) && !isspace(*p); p++) ; |
|
|
|
*p++ = 0; |
|
|
|
|
|
|
|
if (linebuf[0] == 0) continue; |
|
|
|
|
|
|
|
switch (LookupMnem(keyword_tab, linebuf)) |
|
|
|
{ |
|
|
|
case V_NAME: |
|
|
|
while (isspace(*p)) p++; |
|
|
|
strncpy0(vname, p, sizeof(vname)); |
|
|
|
} else if (memcmp(linebuf, "language", 8) == 0) { |
|
|
|
break; |
|
|
|
case V_LANGUAGE: |
|
|
|
priority = DEFAULT_LANGUAGE_PRIORITY; |
|
|
|
vlanguage[0] = 0; |
|
|
|
|
|
|
|
sscanf(&linebuf[8], "%s %d", vlanguage, &priority); |
|
|
|
sscanf(p, "%s %d", vlanguage, &priority); |
|
|
|
len = strlen(vlanguage) + 2; |
|
|
|
// check for space in languages[] |
|
|
|
if (len < (sizeof(languages)-langix-1)) { |
|
|
@@ -307,10 +317,13 @@ static espeak_VOICE *ReadVoiceFile(FILE *f_in, const char *fname) |
|
|
|
langix += len; |
|
|
|
n_languages++; |
|
|
|
} |
|
|
|
} else if (memcmp(linebuf, "gender", 6) == 0) |
|
|
|
sscanf(&linebuf[6], "%s %d", vgender, &age); |
|
|
|
else if (memcmp(linebuf, "variants", 8) == 0) |
|
|
|
sscanf(&linebuf[8], "%d", &n_variants); |
|
|
|
break; |
|
|
|
case V_GENDER: |
|
|
|
sscanf(p, "%s %d", vgender, &age); |
|
|
|
break; |
|
|
|
case V_VARIANTS: |
|
|
|
sscanf(p, "%d", &n_variants); |
|
|
|
} |
|
|
|
} |
|
|
|
languages[langix++] = 0; |
|
|
|
|