name Vietnamese (Northern) | name Vietnamese (Northern) | ||||
language vi | language vi | ||||
gender male | |||||
words 1 | words 1 | ||||
pitch 80 118 | pitch 80 118 |
language vi-vn-x-central | language vi-vn-x-central | ||||
phonemes vi-hue | phonemes vi-hue | ||||
dictrules 1 | dictrules 1 | ||||
gender male | |||||
words 1 | words 1 | ||||
pitch 82 118 //80 118 | pitch 82 118 //80 118 |
language vi-vn-x-south | language vi-vn-x-south | ||||
phonemes vi-sgn | phonemes vi-sgn | ||||
dictrules 2 | dictrules 2 | ||||
gender male | |||||
words 1 | words 1 | ||||
pitch 82 118 //80 118 | pitch 82 118 //80 118 |
name Esperanto | name Esperanto | ||||
language eo | language eo | ||||
gender male | |||||
apostrophe 2 | apostrophe 2 |
name Lingua Franca Nova | name Lingua Franca Nova | ||||
language lfn | language lfn | ||||
gender male | |||||
phonemes base2 | phonemes base2 | ||||
l_unpronouncable 0 | l_unpronouncable 0 |
name Nahuatl (Classical) | name Nahuatl (Classical) | ||||
language nci | language nci | ||||
gender male | |||||
intonation 3 | intonation 3 | ||||
stressrule 2 | stressrule 2 |
name Lithuanian | name Lithuanian | ||||
language lt | language lt | ||||
gender male | |||||
name Latvian | name Latvian | ||||
language lv | language lv | ||||
gender male | |||||
maintainer Valdis Vitolins <[email protected]> | maintainer Valdis Vitolins <[email protected]> | ||||
status mature | status mature | ||||
words 0 2 | words 0 2 |
name Swahili | name Swahili | ||||
language sw | language sw | ||||
gender male | |||||
status testing | status testing |
name Setswana | name Setswana | ||||
language tn | language tn | ||||
gender male | |||||
status testing | status testing |
name Welsh | name Welsh | ||||
language cy | language cy | ||||
gender male | |||||
intonation 4 | intonation 4 |
name Malayalam | name Malayalam | ||||
language ml | language ml | ||||
gender male | |||||
intonation 2 | intonation 2 | ||||
//consonants 80 | //consonants 80 |
name Tamil | name Tamil | ||||
language ta | language ta | ||||
gender male | |||||
intonation 2 | intonation 2 | ||||
consonants 80 | consonants 80 |
name Danish | name Danish | ||||
language da | language da | ||||
gender male | |||||
tunes s2 c2 q2 e2 | tunes s2 c2 q2 e2 | ||||
name Icelandic | name Icelandic | ||||
language is | language is | ||||
gender male | |||||
name Norwegian | name Norwegian | ||||
language no | language no | ||||
language nb | language nb | ||||
gender male | |||||
intonation 4 | intonation 4 |
name Swedish | name Swedish | ||||
language sv | language sv | ||||
gender male | |||||
name Afrikaans | name Afrikaans | ||||
language af | language af | ||||
gender male | |||||
maintainer Christo de Klerk <[email protected]> | maintainer Christo de Klerk <[email protected]> | ||||
status mature | status mature |
name German | name German | ||||
language de | language de | ||||
gender male | |||||
name English (Great Britain) | name English (Great Britain) | ||||
language en-gb 2 | language en-gb 2 | ||||
language en 2 | language en 2 | ||||
gender male | |||||
maintainer Reece H. Dunn <[email protected]> | maintainer Reece H. Dunn <[email protected]> | ||||
status mature | status mature |
name English (Caribbean) | name English (Caribbean) | ||||
language en-029 | language en-029 | ||||
language en 10 | language en 10 | ||||
gender male | |||||
maintainer Reece H. Dunn <[email protected]> | maintainer Reece H. Dunn <[email protected]> | ||||
status mature | status mature |
name English (Scotland) | name English (Scotland) | ||||
language en-gb-scotland | language en-gb-scotland | ||||
language en 4 | language en 4 | ||||
gender male | |||||
maintainer Reece H. Dunn <[email protected]> | maintainer Reece H. Dunn <[email protected]> | ||||
status mature | status mature |
language en-gb-x-gbclan | language en-gb-x-gbclan | ||||
language en-gb 3 | language en-gb 3 | ||||
language en 5 | language en 5 | ||||
gender male | |||||
maintainer Reece H. Dunn <[email protected]> | maintainer Reece H. Dunn <[email protected]> | ||||
status mature | status mature | ||||
replace 00 i@3 i@ | replace 00 i@3 i@ | ||||
replace 03 N n | replace 03 N n | ||||
replace 03 i I2 | replace 03 i I2 | ||||
language en-gb-x-gbcwmd | language en-gb-x-gbcwmd | ||||
language en-gb 9 | language en-gb 9 | ||||
language en 9 | language en 9 | ||||
gender male | |||||
phonemes en-wm | phonemes en-wm | ||||
language en-gb-x-rp | language en-gb-x-rp | ||||
language en-gb 4 | language en-gb 4 | ||||
language en 5 | language en 5 | ||||
gender male | |||||
maintainer Reece H. Dunn <[email protected]> | maintainer Reece H. Dunn <[email protected]> | ||||
status mature | status mature |
name English (America) | name English (America) | ||||
language en-us 2 | language en-us 2 | ||||
language en 3 | language en 3 | ||||
gender male | |||||
maintainer Reece H. Dunn <[email protected]> | maintainer Reece H. Dunn <[email protected]> | ||||
status mature | status mature | ||||
replace 03 I i | replace 03 I i | ||||
replace 03 I2 i | replace 03 I2 i | ||||
name Dutch | name Dutch | ||||
language nl | language nl | ||||
gender male |
name Greek (Modern) | name Greek (Modern) | ||||
language el | language el | ||||
gender male | |||||
name Greek (Ancient) | name Greek (Ancient) | ||||
language grc | language grc | ||||
gender male | |||||
stressLength 170 170 190 190 0 0 230 240 | stressLength 170 170 190 190 0 0 230 240 | ||||
dictrules 1 | dictrules 1 | ||||
words 3 | words 3 | ||||
name Bengali | name Bengali | ||||
language bn | language bn | ||||
gender male |
name Hindi | name Hindi | ||||
language hi | language hi | ||||
gender male |
name Nepali | name Nepali | ||||
language ne | language ne | ||||
gender male | |||||
dictrules 1 | dictrules 1 |
name Armenian (East Armenia) | name Armenian (East Armenia) | ||||
language hy | language hy | ||||
gender male |
name Armenian (West Armenia) | name Armenian (West Armenia) | ||||
language hy-arevmda | language hy-arevmda | ||||
language hy 8 | language hy 8 | ||||
gender male | |||||
dictrules 1 | dictrules 1 | ||||
replace 00 k g | replace 00 k g | ||||
replace 00 R2 R // ?? | replace 00 R2 R // ?? | ||||
name Albanian | name Albanian | ||||
language sq | language sq | ||||
gender male | |||||
// add this line to remove 'ë' at the end of words | // add this line to remove 'ë' at the end of words | ||||
// replace 00 @/ NULL | // replace 00 @/ NULL |
name Kurdish | name Kurdish | ||||
language ku | language ku | ||||
gender male | |||||
//words 1 48 | //words 1 48 | ||||
name Latin | name Latin | ||||
language la | language la | ||||
gender male | |||||
stressrule 2 33 0 2 | stressrule 2 33 0 2 | ||||
// rule=penultimate | // rule=penultimate | ||||
// flags=0100001 (no automatic secondary stress + don't stres monosyllables) | // flags=0100001 (no automatic secondary stress + don't stres monosyllables) |
name Japanese | name Japanese | ||||
language jp | language jp | ||||
phonemes jp | phonemes jp | ||||
gender male | |||||
intonation 4 | intonation 4 |
name Korean | name Korean | ||||
language ko | language ko | ||||
gender male | |||||
pitch 80 118 | pitch 80 118 | ||||
intonation 2 | intonation 2 | ||||
name Indonesian | name Indonesian | ||||
language id | language id | ||||
gender male | |||||
stressLength 160 200 180 180 0 0 220 240 | stressLength 160 200 180 180 0 0 220 240 | ||||
stressAmp 16 18 18 18 0 0 22 21 | stressAmp 16 18 18 18 0 0 22 21 |
// Last updated: 14 October 2010, Jason Ong ([email protected]) | // Last updated: 14 October 2010, Jason Ong ([email protected]) | ||||
name Malay | name Malay | ||||
language ms | language ms | ||||
gender male | |||||
phonemes id | phonemes id | ||||
translator id | translator id |
name Aragonese | name Aragonese | ||||
language an | language an | ||||
gender male |
name Catalan | name Catalan | ||||
language ca | language ca | ||||
gender male | |||||
name Spanish (Spain) | name Spanish (Spain) | ||||
language es | language es | ||||
gender male | |||||
dictrules 1 | dictrules 1 | ||||
tunes s6 c6 q6 e6 | tunes s6 c6 q6 e6 |
language es-419 | language es-419 | ||||
language es-mx 6 | language es-mx 6 | ||||
language es 6 | language es 6 | ||||
gender male | |||||
phonemes es-la | phonemes es-la | ||||
dictrules 2 | dictrules 2 |
name French (France) | name French (France) | ||||
language fr-fr | language fr-fr | ||||
language fr | language fr | ||||
gender male | |||||
dictrules 1 | dictrules 1 | ||||
tunes s3 c3 q3 e3 | tunes s3 c3 q3 e3 |
name French (Belgium) | name French (Belgium) | ||||
language fr-be | language fr-be | ||||
language fr 8 | language fr 8 | ||||
gender male | |||||
dictrules 2 | dictrules 2 | ||||
tunes s3 c3 q3 e3 | tunes s3 c3 q3 e3 |
name Italian | name Italian | ||||
language it | language it | ||||
gender male | |||||
maintainer Christian Leo M <[email protected]> | maintainer Christian Leo M <[email protected]> | ||||
status mature | status mature | ||||
tunes s4 c4 q4 e4 | tunes s4 c4 q4 e4 | ||||
name Portuguese (Brazil) | name Portuguese (Brazil) | ||||
language pt-br | language pt-br | ||||
language pt | language pt | ||||
gender male | |||||
dictrules 2 | dictrules 2 | ||||
stressLength 200 115 230 230 0 0 250 270 | stressLength 200 115 230 230 0 0 250 270 |
name Portuguese (Portugal) | name Portuguese (Portugal) | ||||
language pt-pt | language pt-pt | ||||
language pt 6 | language pt 6 | ||||
gender male | |||||
phonemes pt-pt | phonemes pt-pt | ||||
dictrules 1 | dictrules 1 |
name Romanian | name Romanian | ||||
language ro | language ro | ||||
gender male |
name Arabic | name Arabic | ||||
language ar | language ar | ||||
phonemes ar | phonemes ar | ||||
gender male | |||||
pitch 160 120 | pitch 160 120 | ||||
roughness 0 | roughness 0 | ||||
speed 70 | speed 70 |
name Chinese (Mandarin) | name Chinese (Mandarin) | ||||
language zh | language zh | ||||
gender male | |||||
words 1 | words 1 | ||||
pitch 80 118 | pitch 80 118 | ||||
translator zhy | translator zhy | ||||
phonemes zhy | phonemes zhy | ||||
dictionary zhy | dictionary zhy | ||||
gender male | |||||
// interpret English letters as 1=English words, 2=jyutping | // interpret English letters as 1=English words, 2=jyutping | ||||
dictrules 1 | dictrules 1 |
name Turkish | name Turkish | ||||
language tr | language tr | ||||
gender male | |||||
name Tatar | name Tatar | ||||
language tt | language tt | ||||
gender male |
name Finnish | name Finnish | ||||
language fi | language fi | ||||
gender male | |||||
name Hungarian | name Hungarian | ||||
language hu | language hu | ||||
gender male | |||||
option bracket 0 0 | option bracket 0 0 | ||||
pitch 81 117 | pitch 81 117 | ||||
language bs | language bs | ||||
phonemes hr | phonemes hr | ||||
dictionary hbs | dictionary hbs | ||||
gender male | |||||
pitch 81 120 | pitch 81 120 | ||||
formant 0 100 100 100 | formant 0 100 100 100 |
name Czech | name Czech | ||||
language cs | language cs | ||||
gender male | |||||
name Croatian | name Croatian | ||||
language hr | language hr | ||||
language hbs | language hbs | ||||
gender male | |||||
dictionary hbs | dictionary hbs | ||||
name Macedonian | name Macedonian | ||||
language mk | language mk | ||||
gender male | |||||
name Polish | name Polish | ||||
language pl | language pl | ||||
gender male | |||||
intonation 2 | intonation 2 |
name Russian | name Russian | ||||
language ru | language ru | ||||
gender male | |||||
replace 03 a a# | replace 03 a a# | ||||
name Slovak | name Slovak | ||||
language sk | language sk | ||||
gender male | |||||
name Serbian | name Serbian | ||||
language sr | language sr | ||||
gender male | |||||
dictionary hbs | dictionary hbs | ||||
// attributes towards !variant3 pitch 80 120 | // attributes towards !variant3 pitch 80 120 |
&tone_pts[8], &tone_pts[9]); | &tone_pts[8], &tone_pts[9]); | ||||
} | } | ||||
static espeak_VOICE *ReadVoiceFile(FILE *f_in, const char *fname) | |||||
static espeak_VOICE *ReadVoiceFile(FILE *f_in, const char *fname, int is_language_file) | |||||
{ | { | ||||
// Read a Voice file, allocate a VOICE_DATA and set data from the | // Read a Voice file, allocate a VOICE_DATA and set data from the | ||||
// file's language, gender, name lines | // file's language, gender, name lines | ||||
break; | break; | ||||
case V_GENDER: | case V_GENDER: | ||||
sscanf(p, "%s %d", vgender, &age); | sscanf(p, "%s %d", vgender, &age); | ||||
if (is_language_file) | |||||
fprintf(stderr, "Error (%s): gender attribute specified on a language file\n", fname); | |||||
break; | break; | ||||
case V_VARIANTS: | case V_VARIANTS: | ||||
sscanf(p, "%d", &n_variants); | sscanf(p, "%d", &n_variants); | ||||
return vp->identifier; | return vp->identifier; | ||||
} | } | ||||
static void GetVoices(const char *path, int len_path_voices) | |||||
static void GetVoices(const char *path, int len_path_voices, int is_language_file) | |||||
{ | { | ||||
FILE *f_voice; | FILE *f_voice; | ||||
espeak_VOICE *voice_data; | espeak_VOICE *voice_data; | ||||
if (ftype == -EISDIR) { | if (ftype == -EISDIR) { | ||||
// a sub-directory | // a sub-directory | ||||
GetVoices(fname, len_path_voices); | |||||
GetVoices(fname, len_path_voices, is_language_file); | |||||
} else if (ftype > 0) { | } else if (ftype > 0) { | ||||
// a regular file, add it to the voices list | // a regular file, add it to the voices list | ||||
if ((f_voice = fopen(fname, "r")) == NULL) | if ((f_voice = fopen(fname, "r")) == NULL) | ||||
continue; | continue; | ||||
// pass voice file name within the voices directory | // pass voice file name within the voices directory | ||||
voice_data = ReadVoiceFile(f_voice, fname+len_path_voices); | |||||
voice_data = ReadVoiceFile(f_voice, fname+len_path_voices, is_language_file); | |||||
fclose(f_voice); | fclose(f_voice); | ||||
if (voice_data != NULL) | if (voice_data != NULL) | ||||
if (ftype == -EISDIR) { | if (ftype == -EISDIR) { | ||||
// a sub-directory | // a sub-directory | ||||
GetVoices(fname, len_path_voices); | |||||
GetVoices(fname, len_path_voices, is_language_file); | |||||
} else if (ftype > 0) { | } else if (ftype > 0) { | ||||
// a regular file, add it to the voices list | // a regular file, add it to the voices list | ||||
if ((f_voice = fopen(fname, "r")) == NULL) | if ((f_voice = fopen(fname, "r")) == NULL) | ||||
continue; | continue; | ||||
// pass voice file name within the voices directory | // pass voice file name within the voices directory | ||||
voice_data = ReadVoiceFile(f_voice, fname+len_path_voices); | |||||
voice_data = ReadVoiceFile(f_voice, fname+len_path_voices, is_language_file); | |||||
fclose(f_voice); | fclose(f_voice); | ||||
if (voice_data != NULL) | if (voice_data != NULL) | ||||
FreeVoiceList(); | FreeVoiceList(); | ||||
sprintf(path_voices, "%s%cvoices", path_home, PATHSEP); | sprintf(path_voices, "%s%cvoices", path_home, PATHSEP); | ||||
GetVoices(path_voices, strlen(path_voices)+1); | |||||
GetVoices(path_voices, strlen(path_voices)+1, 0); | |||||
sprintf(path_voices, "%s%clang", path_home, PATHSEP); | sprintf(path_voices, "%s%clang", path_home, PATHSEP); | ||||
GetVoices(path_voices, strlen(path_voices)+1); | |||||
GetVoices(path_voices, strlen(path_voices)+1, 1); | |||||
voices_list[n_voices_list] = NULL; // voices list terminator | voices_list[n_voices_list] = NULL; // voices list terminator | ||||
espeak_VOICE **new_voices = (espeak_VOICE **)realloc(voices, sizeof(espeak_VOICE *)*(n_voices_list+1)); | espeak_VOICE **new_voices = (espeak_VOICE **)realloc(voices, sizeof(espeak_VOICE *)*(n_voices_list+1)); |