Browse Source

[1.29.15] Fix compiler warning, conversion from string constant to 'char *'.

espeakedit: Change compile_report file to include the phoneme name as well as phoneme table which uses each data file.


git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@95 d46cf337-b52f-0410-862d-fd96e6ae7743
master
jonsd 17 years ago
parent
commit
531de957cd

+ 27
- 13
dictsource/dict_phonemes View File



0 3 3: @ @- @2 @5 @L 0 3 3: @ @- @2 @5 @L
a a2 A: A@ aa aI aI@ aU a a2 A: A@ aa aI aI@ aU
aU@ E e@ eI I i I2 i:
i@ IR O O: o: O@ o@ OI
oU O~ U u: U@ V VR
aU@ E e@ eI I I2 i: i@
IR O O: o: O@ o@ OI oU
O~ U u: U@ V VR


: ; b C d D dZ f : ; b C d D dZ f
g g- h j k l L m
n N p Q r r- s S
t T t2 tS v w x z
Z
g h j k l m n N
p Q r r- s S t T
t2 tS v w x z Z




Dictionary eo_dict Dictionary eo_dict


@- a aI aU e eI eU i
o OI u uI
@- a aI aU e i o u


* b d dZ f g h j
k l m n p r R s
S t T tS ts v w x
z Z
* b d k l m n p
r R s t ts v z Z




Dictionary es_dict Dictionary es_dict
k k^ l l^ m n n^ p k k^ l l^ m n n^ p
r R s S t tS ts v r R s S t tS ts v
x z Z x z Z


Dictionary zh_dict



Dictionary zhh_dict

&? 0 0? @ @? @r @u A
A? E E~ i i&? i. i0 i;
i? i@ i@? i[ iA iA? iE iE~
io io? iu i~ o u u&? u?
u@ u@? uA uA? uE uE~ ui u~
y y? y@ y@? ya y~

c; f h k kh l m n
N p ph s s. t tc; tc;
th ts ts. ts. tsh v z.

+ 5
- 2
dictsource/sv_list View File

e e: e e:
f Ef f Ef
g ge: g ge:
h hO:
h ho:
i i: i i:
j ji: j ji:
k kO:
k ko:
l El l El
m Em m Em
n En n En
_1M3 bIlj'u:n _1M3 bIlj'u:n
_dpt p'8Nkt _dpt p'8Nkt


(1 : a) f'Ws.ta


// abbreviations // abbreviations
//************** //**************



+ 1743
- 598
phsource/compile_report
File diff suppressed because it is too large
View File


+ 31
- 0
phsource/ph_greek_ancient View File

// Ancient Greek - based on base2 // Ancient Greek - based on base2
//==================================================== //====================================================


phoneme : // Lengthen previous vowel by "length"
virtual
length 100
endphoneme


phoneme y phoneme y
vowel starttype (i) endtype (i) vowel starttype (i) endtype (i)
length 160 length 160
formants vowel/yy_4 formants vowel/yy_4
endphoneme endphoneme


phoneme e
vowel starttype (e) endtype (e)
length 140
formants vowel/e
endphoneme

phoneme E
vowel starttype (e) endtype (e)
length 150
formants vowel/ee_1
endphoneme

phoneme o
vowel starttype (o) endtype (o)
length 140
formants vowel/o
endphoneme

phoneme O
vowel starttype (o) endtype (o)
length 150
formants vowel/0
endphoneme


phoneme EU phoneme EU
vowel starttype (e) endtype (u) vowel starttype (e) endtype (u)
length 230 length 230

+ 7
- 0
phsource/phonemes View File

phonemetable zhy base phonemetable zhy base
include ph_zh_yue include ph_zh_yue


phonemetable zh base
include ph_zh

phonemetable zhh zh
include ph_zh_huai


phonemetable sw base phonemetable sw base
include ph_swahili include ph_swahili



BIN
phsource/vdiph/vowelchart.png View File


BIN
phsource/vdiph2/vowelchart.png View File


BIN
phsource/vowel/vowelchart.png View File


+ 104
- 100
src/compiledata.cpp View File



static int markers_used[8]; static int markers_used[8];


#define N_USED_BY 12
typedef struct { typedef struct {
void *link; void *link;
int value; int value;
short n_uses;
short n_used_by;
unsigned char used_by[N_USED_BY];
int ph_mnemonic;
short ph_table;
char string[1]; char string[1];
} REF_HASH_TAB; } REF_HASH_TAB;




FILE *f; FILE *f;
int id; int id;
int ix;
int hash; int hash;
int addr = 0;
int type_code=' '; int type_code=' ';
REF_HASH_TAB *p, *p2; REF_HASH_TAB *p, *p2;
char buf[sizeof(path_source)+120]; char buf[sizeof(path_source)+120];


if(strcmp(path,"NULL")==0)
return(0);
if(strcmp(path,"DFT")==0)
return(1);

count_references++; count_references++;


hash = Hash8(path); hash = Hash8(path);
{ {
if(strcmp(path,p->string)==0) if(strcmp(path,p->string)==0)
{ {
int found = 0;

duplicate_references++; duplicate_references++;
p->n_uses++;

// add the current phoneme table to a list of users of this data file, if not already listed
for(ix=0; (ix < p->n_used_by) && (ix < N_USED_BY); ix++)
{
if(p->used_by[ix] == n_phoneme_tabs)
{
found = 1;
break;
}
}
if(found == 0)
{
if(ix < N_USED_BY)
{
p->used_by[ix] = n_phoneme_tabs;
}
p->n_used_by++;
}

return(p->value); // already loaded this data
addr = p->value; // already loaded this data
break;
} }
p = (REF_HASH_TAB *)p->link; p = (REF_HASH_TAB *)p->link;
} }


sprintf(buf,"%s%s",path_source,path);

if(strcmp(path,"NULL")==0)
return(0);
if(strcmp(path,"DFT")==0)
return(1);

if((f = fopen(buf,"rb")) == NULL)
if(addr == 0)
{ {
sprintf(buf,"%s%s.wav",path_source,path);
sprintf(buf,"%s%s",path_source,path);
if((f = fopen(buf,"rb")) == NULL) if((f = fopen(buf,"rb")) == NULL)
{ {
Error("Can't read file",path);
return(0);
sprintf(buf,"%s%s.wav",path_source,path);
if((f = fopen(buf,"rb")) == NULL)
{
Error("Can't read file",path);
return(0);
}
} }
}

id = Read4Bytes(f);
// fread(&id,1,4,f);
rewind(f);


if(id == 0x43455053)
{
ix = LoadSpect(path, control);
type_code = 'S';
}
else
if(id == 0x46464952)
{
ix = LoadWavefile(f,path);
type_code = 'W';
}
else
if(id == 0x43544950)
{
ix = LoadEnvelope(f,path);
type_code = 'E';
}
else
if(id == 0x45564E45)
{
ix = LoadEnvelope2(f,path);
type_code = 'E';
}
else
{
Error("File not SPEC or RIFF",path);
ix = -1;
id = Read4Bytes(f);
rewind(f);
if(id == 0x43455053)
{
addr = LoadSpect(path, control);
type_code = 'S';
}
else
if(id == 0x46464952)
{
addr = LoadWavefile(f,path);
type_code = 'W';
}
else
if(id == 0x43544950)
{
addr = LoadEnvelope(f,path);
type_code = 'E';
}
else
if(id == 0x45564E45)
{
addr = LoadEnvelope2(f,path);
type_code = 'E';
}
else
{
Error("File not SPEC or RIFF",path);
addr = -1;
}
fclose(f);
if(addr > 0)
{
fprintf(f_phcontents,"%c 0x%.5x %s\n",type_code,addr & 0x7fffff,path);
}
} }
fclose(f);


if(ix > 0)
// add this item to the hash table
if(addr > 0)
{ {
fprintf(f_phcontents,"%c 0x%.5x %s\n",type_code,ix & 0x7fffff,path);
p = ref_hash_tab[hash];
p2 = (REF_HASH_TAB *)malloc(sizeof(REF_HASH_TAB)+strlen(path)+1);
p2->value = addr;
p2->ph_mnemonic = ph->mnemonic; // phoneme which uses this file
p2->ph_table = n_phoneme_tabs-1;
strcpy(p2->string,path);
p2->link = (char *)p;
ref_hash_tab[hash] = p2;
} }


// add this item to the hash table
p = ref_hash_tab[hash];
p2 = (REF_HASH_TAB *)malloc(sizeof(REF_HASH_TAB)+strlen(path)+1);
p2->value = ix;
p2->n_uses = 1;
p2->n_used_by = 1;
strcpy(p2->string,path);
p2->used_by[0] = n_phoneme_tabs;
p2->link = (char *)p;
ref_hash_tab[hash] = p2;

return(ix);
return(addr);
} // end of Compile::LoadDataFile } // end of Compile::LoadDataFile






static int ref_sorter(char **a, char **b) static int ref_sorter(char **a, char **b)
{//====================================== {//======================================
int ix;

REF_HASH_TAB *p1 = (REF_HASH_TAB *)(*a); REF_HASH_TAB *p1 = (REF_HASH_TAB *)(*a);
REF_HASH_TAB *p2 = (REF_HASH_TAB *)(*b);
REF_HASH_TAB *p2 = (REF_HASH_TAB *)(*b);

ix = strcoll(p1->string,p2->string);
if(ix != 0)
return ix;

ix = p1->ph_table - p2->ph_table;
if(ix != 0)
return ix;


return(strcoll(p1->string,p2->string));
} /* end of strcmp2 */
return(p1->ph_mnemonic - p2->ph_mnemonic);
} /* end of ref_sorter */






REF_HASH_TAB *p; REF_HASH_TAB *p;
REF_HASH_TAB **list; REF_HASH_TAB **list;
FILE *f_report; FILE *f_report;
const char *data_path;
int prev_table;
int prev_mnemonic;
char fname[sizeof(path_source)+20]; char fname[sizeof(path_source)+20];


// make a list of all the references and sort it // make a list of all the references and sort it
list = (REF_HASH_TAB **)malloc(count_references * sizeof(REF_HASH_TAB *));
list = (REF_HASH_TAB **)malloc((count_references)* sizeof(REF_HASH_TAB *));
if(list == NULL) if(list == NULL)
return; return;


} }
fputc('\n',f_report); fputc('\n',f_report);


fprintf(f_report,"Data file Used by\n");
ix = 0; ix = 0;
for(hash=0; (hash < 256) && (ix < count_references); hash++) for(hash=0; (hash < 256) && (ix < count_references); hash++)
{ {
n = ix; n = ix;
qsort((void *)list,n,sizeof(REF_HASH_TAB *),(int (*)(const void *,const void *))ref_sorter); qsort((void *)list,n,sizeof(REF_HASH_TAB *),(int (*)(const void *,const void *))ref_sorter);
data_path = "";
prev_mnemonic = 0;
prev_table = 0;
for(ix=0; ix<n; ix++) for(ix=0; ix<n; ix++)
{ {
int j, ph_tab_num;
int j = 0;


fprintf(f_report,"%3d %s",list[ix]->n_uses, list[ix]->string);
for(j = strlen(list[ix]->string); j < 14; j++)
if(strcmp(list[ix]->string, data_path) != 0)
{ {
fputc(' ',f_report); // pad filename with spaces
data_path = list[ix]->string;
j = strlen(data_path);
fprintf(f_report,"%s",data_path);
} }
for(j=0; (j < list[ix]->n_used_by) && (j<N_USED_BY); j++)
else
{ {
ph_tab_num = list[ix]->used_by[j];
fprintf(f_report," %s",phoneme_tab_list2[ph_tab_num-1].name);
if((list[ix]->ph_table == prev_table) && (list[ix]->ph_mnemonic == prev_mnemonic))
continue; // same phoneme, don't list twice
} }
if(j < list[ix]->n_used_by)

while(j < 14)
{ {
fprintf(f_report," ++");
fputc(' ',f_report); // pad filename with spaces
j++;
} }

fprintf(f_report," [%s] %s",WordToString(prev_mnemonic = list[ix]->ph_mnemonic), phoneme_tab_list2[prev_table = list[ix]->ph_table].name);
fputc('\n',f_report); fputc('\n',f_report);

free(list[ix]);
} }
free(list); free(list);
fclose(f_report); fclose(f_report);

+ 16
- 14
src/compiledict.cpp View File

char *p; char *p;
char *word; char *word;
char *phonetic; char *phonetic;
int ix;
unsigned int ix;
int step; int step;
int n_flag_codes = 0;
unsigned int n_flag_codes = 0;
int flag_offset; int flag_offset;
int length; int length;
int multiple_words = 0; int multiple_words = 0;
unsigned char flag_codes[100]; unsigned char flag_codes[100];
char encoded_ph[200]; char encoded_ph[200];
unsigned char bad_phoneme[4]; unsigned char bad_phoneme[4];
static char nullstring[] = {0};


comment = NULL; comment = NULL;
text_not_phonemes = 0; text_not_phonemes = 0;
phonetic = word = "";
phonetic = word = nullstring;


p = linebuf; p = linebuf;
// while(isspace2(*p)) p++; // while(isspace2(*p)) p++;
int n_rules=0; int n_rules=0;
int count=0; int count=0;
int different; int different;
char *prev_rgroup_name;
const char *prev_rgroup_name;
unsigned int char_code; unsigned int char_code;
int compile_mode=0; int compile_mode=0;
char *buf; char *buf;
if(buf[0] == '\r') buf++; // ignore extra \r in \r\n if(buf[0] == '\r') buf++; // ignore extra \r in \r\n
} }


if((buf != NULL) && (memcmp(buf,".L",2)==0))
{
if(compile_lettergroup(&buf[2], f_out) != 0)
{
fprintf(f_log,"%5d: Bad lettergroup\n",linenum);
error_count++;
}
continue;
}

if((buf == NULL) || (buf[0] == '.')) if((buf == NULL) || (buf[0] == '.'))
{ {
// next .group or end of file, write out the previous group // next .group or end of file, write out the previous group
{ {
// end of the character replacements section // end of the character replacements section
fwrite(&n_rules,1,4,f_out); // write a zero word to terminate the replacemenmt list fwrite(&n_rules,1,4,f_out); // write a zero word to terminate the replacemenmt list
compile_mode = 0;
} }


if(buf == NULL) break; // end of file if(buf == NULL) break; // end of file


if(memcmp(buf,".L",2)==0)
{
if(compile_lettergroup(&buf[2], f_out) != 0)
{
fprintf(f_log,"%5d: Bad lettergroup\n",linenum);
error_count++;
}
continue;
}

if(memcmp(buf,".replace",8)==0) if(memcmp(buf,".replace",8)==0)
{ {
compile_mode = 2; compile_mode = 2;

+ 36
- 19
src/dictionary.cpp View File



if(p[0] == RULE_REPLACEMENTS) if(p[0] == RULE_REPLACEMENTS)
{ {
pw = (unsigned int *)(((int)p+4) & ~3); // advance to next word boundary
pw = (unsigned int *)(((long)p+4) & ~3); // advance to next word boundary
langopts.replace_chars = pw; langopts.replace_chars = pw;
while(pw[0] != 0) while(pw[0] != 0)
{ {






int Translator::IsLetterGroup(char *word, int group)
{//=================================================
int Translator::IsLetterGroup(char *word, int group, int pre)
{//==========================================================
// match the word against a list of utf-8 strings // match the word against a list of utf-8 strings
char *p; char *p;
char *w; char *w;
if(rb == RULE_ENDING) if(rb == RULE_ENDING)
{ {
static char *flag_chars = "ei vtfq t";
static const char *flag_chars = "ei vtfq t";
flags = ((rule[0] & 0x7f)<< 8) + (rule[1] & 0x7f); flags = ((rule[0] & 0x7f)<< 8) + (rule[1] & 0x7f);
suffix_char = 'S'; suffix_char = 'S';
if(flags & (SUFX_P >> 8)) if(flags & (SUFX_P >> 8))
failed = 1; failed = 1;
break; break;


case RULE_LETTERGP2: // match against a list of utf-t strings
case RULE_LETTERGP2: // match against a list of utf-8 strings
letter_group = *rule++ - 'A'; letter_group = *rule++ - 'A';
if((n_bytes = IsLetterGroup(post_ptr-1,letter_group)) >0)
if((n_bytes = IsLetterGroup(post_ptr-1,letter_group,0)) >0)
{ {
match.points += (20-distance_right); match.points += (20-distance_right);
post_ptr += (n_bytes-1); post_ptr += (n_bytes-1);
failed = 1; failed = 1;
break; break;


case RULE_LETTERGP2: // match against a list of utf-8 strings
letter_group = *rule++ - 'A';
if((n_bytes = IsLetterGroup(pre_ptr-letter_xbytes,letter_group,1)) >0)
{
match.points += (20-distance_right);
pre_ptr -= (n_bytes-1);
}
else
failed =1;
break;

case RULE_NOTVOWEL: case RULE_NOTVOWEL:
if(!IsLetter(letter_w,0)) if(!IsLetter(letter_w,0))
{ {
} }
} }
} }
if(match1.phonemes == NULL) if(match1.phonemes == NULL)
match1.phonemes = ""; match1.phonemes = "";






int Translator::LookupDict2(char *word, char *word2, char *phonetic, unsigned int *flags, int end_flags)
//======================================================================================================
const char *Translator::LookupDict2(const char *word, const char *word2, char *phonetic, unsigned int *flags, int end_flags)
//====================================================================================================================
/* Find an entry in the word_dict file for a specified word. /* Find an entry in the word_dict file for a specified word.
Returns 1 if an entry is found
Returns NULL if no match, else returns 'word_end'


word zero terminated word to match word zero terminated word to match
word2 pointer to next word(s) in the input text (terminated by space) word2 pointer to next word(s) in the input text (terminated by space)
int condition_failed=0; int condition_failed=0;
int n_chars; int n_chars;
int no_phonemes; int no_phonemes;
char *word_end;
char *word1;
const char *word_end;
const char *word1;
char word_buf[N_WORD_BYTES]; char word_buf[N_WORD_BYTES];


word1 = word; word1 = word;
fprintf(f_trans,"Found: %s [%s] %s\n",word1,ph_decoded,print_dflags(flags1)); fprintf(f_trans,"Found: %s [%s] %s\n",word1,ph_decoded,print_dflags(flags1));
} }
} }
return(1);
return(word_end);


} }
return(0); return(0);
*/ */
{ {
int length; int length;
int found;
char *word1;
char *word2;
const char *found;
const char *word1;
const char *word2;
unsigned char c; unsigned char c;
int nbytes; int nbytes;
int c2; int c2;
int len;
char word[N_WORD_BYTES]; char word[N_WORD_BYTES];
static char word_replacement[N_WORD_BYTES]; static char word_replacement[N_WORD_BYTES];


word_replacement[0] = 0; word_replacement[0] = 0;
word_replacement[1] = ' '; word_replacement[1] = ' ';
strcpy(&word_replacement[2],ph_out); // replacement word, preceded by zerochar and space strcpy(&word_replacement[2],ph_out); // replacement word, preceded by zerochar and space

word1 = *wordptr;
*wordptr = &word_replacement[2]; *wordptr = &word_replacement[2];


if(option_phonemes == 2) if(option_phonemes == 2)
{ {
len = found - word1;
memcpy(word,word1,len); // include multiple matching words
fprintf(f_trans,"Replace: %s %s\n",word,*wordptr); fprintf(f_trans,"Replace: %s %s\n",word,*wordptr);
} }
} }






int Translator::Lookup(char *word, char *ph_out)
{//=============================================
int Translator::Lookup(const char *word, char *ph_out)
{//===================================================
unsigned int flags; unsigned int flags;
return(LookupDictList(&word,ph_out,&flags,0));
char *word1 = (char *)word;
return(LookupDictList(&word1,ph_out,&flags,0));
} }





+ 16
- 16
src/espeak_command.cpp View File

case ET_VOICE_SPEC: case ET_VOICE_SPEC:
{ {
espeak_VOICE* data = &(the_command->u.my_voice_spec);
if (data->name)
{
free(data->name);
}
if (data->languages)
{
free(data->languages);
}
if (data->identifier)
{
free(data->identifier);
}
espeak_VOICE* data = &(the_command->u.my_voice_spec);
if (data->name)
{
free((void *)data->name);
}
if (data->languages)
{
free((void *)data->languages);
}
if (data->identifier)
{
free((void *)data->identifier);
}
} }
break; break;



+ 1
- 1
src/espeakedit.cpp View File

#include "prosodydisplay.h" #include "prosodydisplay.h"




static char *about_string = "espeakedit: %s\nAuthor: Jonathan Duddington (c) 2007\n\n"
static const char *about_string = "espeakedit: %s\nAuthor: Jonathan Duddington (c) 2007\n\n"
"Licensed under GNU General Public License version 3\n" "Licensed under GNU General Public License version 3\n"
"http://espeak.sourceforge.net/"; "http://espeak.sourceforge.net/";



+ 5
- 5
src/extras.cpp View File

char phonemes2[80]; char phonemes2[80];
WORD_TAB winfo; WORD_TAB winfo;


static char *vowels = "aeiouyAEIOUY29@";
static const char *vowels = "aeiouyAEIOUY29@";


wxString fname = wxFileSelector(_T("German Lexicon"),path_dir1,_T(""),_T(""),_T("*"),wxOPEN); wxString fname = wxFileSelector(_T("German Lexicon"),path_dir1,_T(""),_T(""),_T("*"),wxOPEN);


int input_length; int input_length;


int sfx; int sfx;
char *suffix;
const char *suffix;
int wlen; int wlen;
int len; int len;
int check_root; int check_root;
static char vowels[] = {0xa3,0xc0,0xc1,0xc5,0xc9,0xcf,0xd1,0xd5,0xd9,0xdc,0}; static char vowels[] = {0xa3,0xc0,0xc1,0xc5,0xc9,0xcf,0xd1,0xd5,0xd9,0xdc,0};


typedef struct { typedef struct {
char *suffix;
const char *suffix;
int syllables; int syllables;
} SUFFIX; } SUFFIX;


#define TEXT "Hello world." #define TEXT "Hello world."
#define TEXT_SSML ("<speak>" TEXT "</speak>") #define TEXT_SSML ("<speak>" TEXT "</speak>")
static void static void
speak(char *text)
speak(const char *text)
{ {
int result; int result;
result = espeak_Synth(text, strlen(text) + 1, 0, POS_CHARACTER, 0, espeakSSML, NULL, NULL); result = espeak_Synth(text, strlen(text) + 1, 0, POS_CHARACTER, 0, espeakSSML, NULL, NULL);
} }




char* text1 = "Hello World2. <audio src=\"here\"> Some text</audio> This is the second sentence";
const char* text1 = "Hello World2. <audio src=\"here\"> Some text</audio> This is the second sentence";


void TestTest(int control) void TestTest(int control)
{//======================= {//=======================

+ 71
- 17
src/intonation.cpp View File

PHONEME_LIST *p; PHONEME_LIST *p;
int ix; int ix;
int count_stressed=0; int count_stressed=0;
int count_stressed2=0;
int final_stressed=0; int final_stressed=0;


int tone_ph; int tone_ph;
PHONEME_TAB *tph;
PHONEME_TAB *prev_tph; // forget across word boundary
PHONEME_TAB *prevw_tph; // remember across word boundary
PHONEME_TAB *prev2_tph; // 2 tones previous
PHONEME_LIST *prev_p;


int pitch_adjust = 13; // pitch gradient through the clause - inital value int pitch_adjust = 13; // pitch gradient through the clause - inital value
int pitch_decrement = 3; // decrease by this for each stressed syllable int pitch_decrement = 3; // decrease by this for each stressed syllable
} }




p = &phoneme_list[0];
prev_p = p = &phoneme_list[0];
prev_tph = prevw_tph = phoneme_tab[phonPAUSE];

// perform tone sandhi
for(ix=0; ix<n_phoneme_list; ix++, p++) for(ix=0; ix<n_phoneme_list; ix++, p++)
{ {
if((p->newword) && ((option_tone1 & 1)==0))
{
prev_tph = phoneme_tab[phonPAUSE]; // forget across word boundaries
}

if(p->type == phVOWEL) if(p->type == phVOWEL)
{ {
tone_ph = p->tone_ph; tone_ph = p->tone_ph;
if(tone_ph == 0)
p->tone_ph = tone_ph = LookupPh("11"); // default tone 5

tph = phoneme_tab[tone_ph];


if(p->tone >= 2)
// Mandarin
if(translator_name == L('z','h'))
{ {
// a stressed syllable
if(p->tone >= 4)
if(prev_tph->mnemonic == 0x343132) // [214]
{ {

count_stressed2++;
if(count_stressed2 == count_stressed)
{
// the last stressed syllable
pitch_adjust = pitch_low;
}
if(tph->mnemonic == 0x343132) // [214]
prev_p->tone_ph = LookupPh("35");
else else
{
pitch_adjust -= pitch_decrement;
if(pitch_adjust <= pitch_low)
pitch_adjust = pitch_high;
}
prev_p->tone_ph = LookupPh("21");
}
if((prev_tph->mnemonic == 0x3135) && (tph->mnemonic == 0x3135)) // [51] + [51]
{
prev_p->tone_ph = LookupPh("53");
}

if(tph->mnemonic == 0x3131) // [11] Tone 5
{
// tone 5, change its level depending on the previous tone (across word boundaries)
if(prevw_tph->mnemonic == 0x3535)
p->tone_ph = LookupPh("22");
if(prevw_tph->mnemonic == 0x3533)
p->tone_ph = LookupPh("33");
if(prevw_tph->mnemonic == 0x343132)
p->tone_ph = LookupPh("44");

// tone 5 is unstressed (shorter)
p->tone = 1; // diminished stress
}
}

prev_p = p;
prev2_tph = prevw_tph;
prevw_tph = prev_tph = tph;
}
}

// convert tone numbers to pitch
p = &phoneme_list[0];
for(ix=0; ix<n_phoneme_list; ix++, p++)
{
if(p->type == phVOWEL)
{
tone_ph = p->tone_ph;

if(p->tone >= 0) // TEST, consider all syllables as stressed
{
if(ix == final_stressed)
{
// the last stressed syllable
pitch_adjust = pitch_low;
}
else
{
pitch_adjust -= pitch_decrement;
if(pitch_adjust <= pitch_low)
pitch_adjust = pitch_high;
} }


if(tone_ph ==0) if(tone_ph ==0)

+ 3
- 4
src/numbers.cpp View File



#include "StdAfx.h" #include "StdAfx.h"



#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include <stdlib.h> #include <stdlib.h>
unsigned int flags; unsigned int flags;
char number_chars[N_WORD_BYTES]; char number_chars[N_WORD_BYTES];


static char *roman_numbers = "ixcmvld";
static const char *roman_numbers = "ixcmvld";
static int roman_values[] = {1,10,100,1000,5,50,500}; static int roman_values[] = {1,10,100,1000,5,50,500};
acc = 0; acc = 0;






static char *M_Variant(int value)
{//==============================
static const char *M_Variant(int value)
{//====================================
// returns M, or perhaps MA for some cases // returns M, or perhaps MA for some cases
if(((value % 100)>20) || ((value % 100)<10)) // but not teens, 10 to 19 if(((value % 100)>20) || ((value % 100)<10)) // but not teens, 10 to 19

+ 9
- 13
src/readclause.cpp View File

#define N_XML_BUF 256 #define N_XML_BUF 256




char *xmlbase = ""; // base URL from <speak>
const char *xmlbase = ""; // base URL from <speak>


int namedata_ix=0; int namedata_ix=0;
int n_namedata = 0; int n_namedata = 0;
static void UngetC(int c) static void UngetC(int c)
{//====================== {//======================
ungot_char = c; ungot_char = c;

if((f_input != NULL) && feof(f_input))
{
// ungetc(' ',f_input);
}
} }






const char *Translator::LookupSpecial(char *string)
{//================================================
const char *Translator::LookupSpecial(const char *string)
{//======================================================
unsigned int flags; unsigned int flags;
char phonemes[55]; char phonemes[55];
char phonemes2[55]; char phonemes2[55];
static char buf[60]; static char buf[60];
char *string1 = (char *)string;


if(LookupDictList(&string,phonemes,&flags,0))
if(LookupDictList(&string1,phonemes,&flags,0))
{ {
SetWordStress(phonemes,flags,-1,0); SetWordStress(phonemes,flags,-1,0);
DecodePhonemes(phonemes,phonemes2); DecodePhonemes(phonemes,phonemes2);






static char *VoiceFromStack()
{//==========================
static const char *VoiceFromStack()
{//================================
// Use the voice properties from the SSML stack to choose a voice, and switch // Use the voice properties from the SSML stack to choose a voice, and switch
// to that voice if it's not the current voice // to that voice if it's not the current voice
int ix; int ix;
SSML_STACK *sp; SSML_STACK *sp;
char *v_id;
const char *v_id;
espeak_VOICE voice_select; espeak_VOICE voice_select;
char voice_name[40]; char voice_name[40];
char language[40]; char language[40];
wchar_t *name; wchar_t *name;
wchar_t *age; wchar_t *age;
wchar_t *variant; wchar_t *variant;
char *new_voice_id;
const char *new_voice_id;


static const MNEM_TAB mnem_gender[] = { static const MNEM_TAB mnem_gender[] = {
{"male", 1}, {"male", 1},

+ 2
- 0
src/speak_lib.cpp View File

int length; int length;
int finished = 0; int finished = 0;
int count_buffers = 0; int count_buffers = 0;
#ifdef USE_ASYNC
uint32_t a_write_pos=0; uint32_t a_write_pos=0;
#endif


#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
if (text) if (text)

+ 3
- 3
src/speak_lib.h View File



// voice table // voice table
typedef struct { typedef struct {
char *name; // a given name for this voice. UTF8 string.
char *languages; // list of pairs of (byte) priority + (string) language (and dialect qualifier)
char *identifier; // the filename for this voice within espeak-data/voices
const char *name; // a given name for this voice. UTF8 string.
const char *languages; // list of pairs of (byte) priority + (string) language (and dialect qualifier)
const char *identifier; // the filename for this voice within espeak-data/voices
unsigned char gender; // 0=none 1=male, 2=female, unsigned char gender; // 0=none 1=male, 2=female,
unsigned char age; // 0=not specified, or age in years unsigned char age; // 0=not specified, or age in years
unsigned char variant; // only used when passed as a parameter to espeak_SetVoiceByProperties unsigned char variant; // only used when passed as a parameter to espeak_SetVoiceByProperties

+ 1
- 1
src/synthdata.cpp View File

#include "translate.h" #include "translate.h"
#include "wave.h" #include "wave.h"


const char *version_string = "1.29.12 29.Oct.07";
const char *version_string = "1.29.15 01.Nov.07";
const int version_phdata = 0x012901; const int version_phdata = 0x012901;


int option_device_number = -1; int option_device_number = -1;

+ 4
- 2
src/synthesize.cpp View File

// entries in the wavegen command queue // entries in the wavegen command queue
p_text = translator->TranslateClause(f_text,p_text,&clause_tone,&voice_change); p_text = translator->TranslateClause(f_text,p_text,&clause_tone,&voice_change);


translator->CalcPitches(clause_tone);
translator->CalcLengths();

translator->GetTranslatedPhonemeString(translator->phon_out,sizeof(translator->phon_out));
if(option_phonemes > 0) if(option_phonemes > 0)
{ {
fprintf(f_trans,"%s\n",translator->phon_out); fprintf(f_trans,"%s\n",translator->phon_out);
phoneme_callback(translator->phon_out); phoneme_callback(translator->phon_out);
} }


translator->CalcPitches(clause_tone);
translator->CalcLengths();


if(skipping_text) if(skipping_text)
{ {

+ 6
- 6
src/tr_languages.cpp View File

{ {
static int stress_amps_sk[8] = {16,16, 20,20, 20,24, 24,22 }; static int stress_amps_sk[8] = {16,16, 20,20, 20,24, 24,22 };
static int stress_lengths_sk[8] = {190,190, 210,210, 0,0, 210,210}; static int stress_lengths_sk[8] = {190,190, 210,210, 0,0, 210,210};
static char *sk_voiced = "bdgjlmnrvwzaeiouy";
static const char *sk_voiced = "bdgjlmnrvwzaeiouy";


tr = new Translator(); tr = new Translator();
SetupTranslator(tr,stress_lengths_sk,stress_amps_sk); SetupTranslator(tr,stress_lengths_sk,stress_amps_sk);
break; break;


case L('z','h'): case L('z','h'):
case L_qa + 'a': // Test qaa
{ {
static int stress_lengths_qaa[8] = {200,200, 248,248, 248,0, 248,250};
static int stress_amps_qaa[] = {16,16, 20,20, 24,24, 24,22 };
static int stress_lengths_qaa[8] = {220,150, 230,230, 230,0, 230,250};
static int stress_amps_qaa[] = {22,18, 22,22, 22,22, 22,22 };
tr = new Translator(); tr = new Translator();
SetupTranslator(tr,stress_lengths_qaa,stress_amps_qaa); SetupTranslator(tr,stress_lengths_qaa,stress_amps_qaa);


tr->langopts.stress_rule = 0;
tr->langopts.stress_rule = 3; // stress on final syllable of a "word"
tr->langopts.stress_flags = 1; // don't automatically set diminished stress (may be set in the intonation module)
tr->langopts.vowel_pause = 0; tr->langopts.vowel_pause = 0;
tr->langopts.intonation = 1; // Tone language, use CalcPitches_Tone() rather than CalcPitches() tr->langopts.intonation = 1; // Tone language, use CalcPitches_Tone() rather than CalcPitches()
tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable
tr->langopts.tone_numbers = 9;
tr->langopts.tone_numbers = 9; // a number after letters indicates a tone number (eg. pinyin or jyutping)
tr->langopts.ideographs = 1; tr->langopts.ideographs = 1;
tr->langopts.word_gap = 0x5; // length of a final vowel is less dependent on the next consonant, don't merge consonant with next word tr->langopts.word_gap = 0x5; // length of a final vowel is less dependent on the next consonant, don't merge consonant with next word
} }

+ 9
- 4
src/translate.cpp View File

} // end of utf8_out } // end of utf8_out




int utf8_in(int *c, char *buf, int backwards)
{//==========================================
int utf8_in(int *c, const char *buf, int backwards)
{//================================================
int c1; int c1;
int n_bytes; int n_bytes;
int ix; int ix;
int source_ix; int source_ix;
int len; int len;
int sylimit; // max. number of syllables in a word to be combined with a preceding preposition int sylimit; // max. number of syllables in a word to be combined with a preceding preposition
char *new_language;
const char *new_language;
unsigned char bad_phoneme[4]; unsigned char bad_phoneme[4];


len = wtab->length; len = wtab->length;
prev_out2 = prev_out; prev_out2 = prev_out;
utf8_in(&prev_out,&sbuf[ix-1],1); // prev_out = sbuf[ix-1]; utf8_in(&prev_out,&sbuf[ix-1],1); // prev_out = sbuf[ix-1];


if(langopts.tone_numbers && isdigit(prev_out) && IsAlpha(prev_out2))
{
// tone numbers can be part of a word, consider them as alphabetic
prev_out = 'a';
}

if(prev_in2 != 0) if(prev_in2 != 0)
{ {
prev_in = prev_in2; prev_in = prev_in2;


prev_clause_pause = clause_pause; prev_clause_pause = clause_pause;


GetTranslatedPhonemeString(phon_out,sizeof(phon_out));
*tone_out = tone; *tone_out = tone;


new_sentence = 0; new_sentence = 0;

+ 7
- 6
src/translate.h View File

// match 1 pre 2 post 0 - use common phoneme string // match 1 pre 2 post 0 - use common phoneme string
// match 1 pre 2 post 3 0 - empty phoneme string // match 1 pre 2 post 3 0 - empty phoneme string


typedef const char * constcharptr;


typedef struct { typedef struct {
int points; int points;
int LoadDictionary(const char *name, int no_error); int LoadDictionary(const char *name, int no_error);
virtual void CalcLengths(); virtual void CalcLengths();
virtual void CalcPitches(int clause_tone); virtual void CalcPitches(int clause_tone);
void GetTranslatedPhonemeString(char *phon_out, int n_phon_out);
LANGUAGE_OPTIONS langopts; LANGUAGE_OPTIONS langopts;
int translator_name; int translator_name;
int TranslateWord2(char *word, WORD_TAB *wtab, int pre_pause, int next_pause); int TranslateWord2(char *word, WORD_TAB *wtab, int pre_pause, int next_pause);
int TranslateLetter(char *letter, char *phonemes, int control); int TranslateLetter(char *letter, char *phonemes, int control);
void SetSpellingStress(char *phonemes, int control); void SetSpellingStress(char *phonemes, int control);
void GetTranslatedPhonemeString(char *phon_out, int n_phon_out);
void WriteMnemonic(int *ix, int mnem); void WriteMnemonic(int *ix, int mnem);
void MakePhonemeList(int post_pause, int new_sentence); void MakePhonemeList(int post_pause, int new_sentence);
int SubstitutePhonemes(PHONEME_LIST2 *plist_out); int SubstitutePhonemes(PHONEME_LIST2 *plist_out);
int ReadClause(FILE *f_in, char *buf, unsigned short *charix, int n_buf); int ReadClause(FILE *f_in, char *buf, unsigned short *charix, int n_buf);
int AnnouncePunctuation(int c1, int c2, char *buf, int ix); int AnnouncePunctuation(int c1, int c2, char *buf, int ix);


int LookupDict2(char *word, char *word2, char *phonetic, unsigned int *flags, int end_flags);
const char *LookupSpecial(char *string);
const char *LookupDict2(const char *word, const char *word2, char *phonetic, unsigned int *flags, int end_flags);
const char *LookupSpecial(const char *string);
const char *LookupCharName(int c); const char *LookupCharName(int c);
int LookupNum2(int value, int control, char *ph_out); int LookupNum2(int value, int control, char *ph_out);
int LookupNum3(int value, char *ph_out, int suppress_null, int thousandplex, int prev_thousands); int LookupNum3(int value, char *ph_out, int suppress_null, int thousandplex, int prev_thousands);
void ApplySpecialAttribute(char *phonemes, int dict_flags); void ApplySpecialAttribute(char *phonemes, int dict_flags);


int IsLetter(int letter, int group); int IsLetter(int letter, int group);
int IsLetterGroup(char *word, int group);
int IsLetterGroup(char *word, int group, int pre);


void CalcPitches_Tone(int clause_tone); void CalcPitches_Tone(int clause_tone);




int IsVowel(int letter); int IsVowel(int letter);
int LookupDictList(char **wordptr, char *ph_out, unsigned int *flags, int end_flags); int LookupDictList(char **wordptr, char *ph_out, unsigned int *flags, int end_flags);
int Lookup(char *word, char *ph_out);
int Lookup(const char *word, char *ph_out);


// groups1 and groups2 are indexes into data_dictrules, set up by InitGroups() // groups1 and groups2 are indexes into data_dictrules, set up by InitGroups()
int PhonemeCode(unsigned int mnem); int PhonemeCode(unsigned int mnem);
void ChangeWordStress(Translator *tr, char *word, int new_stress); void ChangeWordStress(Translator *tr, char *word, int new_stress);
int TransposeAlphabet(char *text, int offset, int min, int max); int TransposeAlphabet(char *text, int offset, int min, int max);
int utf8_in(int *c, char *buf, int backwards);
int utf8_in(int *c, const char *buf, int backwards);
int utf8_out(unsigned int c, char *buf); int utf8_out(unsigned int c, char *buf);
int lookupwchar(const unsigned short *list,int c); int lookupwchar(const unsigned short *list,int c);
int Eof(void); int Eof(void);

+ 3
- 2
src/transldlg.cpp View File

while((vp != NULL) && (n_ph_list < N_PH_LIST)) while((vp != NULL) && (n_ph_list < N_PH_LIST))
{ {
vp = translator->TranslateClause(NULL,vp,&clause_tone,NULL); vp = translator->TranslateClause(NULL,vp,&clause_tone,NULL);
translator->CalcPitches(clause_tone);
translator->CalcLengths();


translator->GetTranslatedPhonemeString(translator->phon_out,sizeof(translator->phon_out));
if(clause_count++ > 0) if(clause_count++ > 0)
strcat(phon_out," ||"); strcat(phon_out," ||");
strcat(phon_out,translator->phon_out); strcat(phon_out,translator->phon_out);
t_phonetic->SetValue(wxString(translator->phon_out,wxConvLocal)); t_phonetic->SetValue(wxString(translator->phon_out,wxConvLocal));
translator->CalcPitches(clause_tone);
translator->CalcLengths();


if((n_ph_list + n_phoneme_list) >= N_PH_LIST) if((n_ph_list + n_phoneme_list) >= N_PH_LIST)
{ {

+ 1
- 1
src/voice.h View File

extern voice_t *voice; extern voice_t *voice;
extern int tone_points[10]; extern int tone_points[10];


char *SelectVoice(espeak_VOICE *voice_select);
const char *SelectVoice(espeak_VOICE *voice_select);
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);

+ 7
- 7
src/voices.cpp View File

char translator_name[40]; char translator_name[40];
char new_dictionary[40]; char new_dictionary[40];
char phonemes_name[40]; char phonemes_name[40];
char *language_type;
const char *language_type;
char buf[200]; char buf[200];
char path_voices[sizeof(path_home)+12]; char path_voices[sizeof(path_home)+12];
char langname[4]; char langname[4];
static int ScoreVoice(espeak_VOICE *voice_spec, int spec_n_parts, int spec_lang_len, espeak_VOICE *voice) static int ScoreVoice(espeak_VOICE *voice_spec, int spec_n_parts, int spec_lang_len, espeak_VOICE *voice)
{//====================================================================================================== {//======================================================================================================
int ix; int ix;
char *p;
const char *p;
int c1, c2; int c1, c2;
int language_priority; int language_priority;
int n_parts; int n_parts;
int nv; // number of candidates int nv; // number of candidates
int n_parts=0; int n_parts=0;
int lang_len=0; int lang_len=0;
char *p;
const char *p;
espeak_VOICE *vp; espeak_VOICE *vp;


// count number of parts in the specified language // count number of parts in the specified language
int match_fname = -1; int match_fname = -1;
int match_fname2 = -1; int match_fname2 = -1;
int match_name = -1; int match_name = -1;
char *id;
const char *id;
int last_part_len; int last_part_len;
char last_part[41]; char last_part[41];








char *SelectVoice(espeak_VOICE *voice_select)
{//==========================================
char const *SelectVoice(espeak_VOICE *voice_select)
{//================================================
// Returns a path within espeak-voices, with a possible +variant suffix // Returns a path within espeak-voices, with a possible +variant suffix
// variant is an output-only parameter // variant is an output-only parameter
int nv; // number of candidates int nv; // number of candidates


espeak_ERROR SetVoiceByProperties(espeak_VOICE *voice_selector) espeak_ERROR SetVoiceByProperties(espeak_VOICE *voice_selector)
{//============================================================ {//============================================================
char *voice_id;
const char *voice_id;


voice_id = SelectVoice(voice_selector); voice_id = SelectVoice(voice_selector);



+ 5
- 5
src/vowelchart.cpp View File





// size of the vowelchart png // size of the vowelchart png
#define WIDTH 1200
#define WIDTH 1580
#define HEIGHT 800 #define HEIGHT 800






static int VowelX(int f2) static int VowelX(int f2)
{//====================== {//======================
return(WIDTH - int((log2a(f2) - 9.49)*WIDTH/1.8));
// return(1024 - int((log2a(f2) - 9.50)*1020/1.8));
return(WIDTH - int((log2a(f2) - 9.40)*WIDTH/1.9));
// return(WIDTH - int((log2a(f2) - 9.49)*WIDTH/1.8));
} }


static int VowelY(int f1) static int VowelY(int f1)
if(y < 0) y = 0; if(y < 0) y = 0;
if(y > (HEIGHT-4)) y= (HEIGHT-4); if(y > (HEIGHT-4)) y= (HEIGHT-4);
if(x < 0) x = 0; if(x < 0) x = 0;
if(x > (WIDTH-8)) x = (WIDTH-8);
if(x > (WIDTH-12)) x = (WIDTH-12);


r = z; r = z;
g = 255; g = 255;
if((ix % 100) == 0) if((ix % 100) == 0)
dc.DrawText(wxString::Format(_T("%d"),ix),1,y); dc.DrawText(wxString::Format(_T("%d"),ix),1,y);
} }
for(ix=800; ix<=2400; ix+=100)
for(ix=700; ix<=2400; ix+=100)
{ {
x = VowelX(ix); x = VowelX(ix);
dc.DrawLine(x,0,x,HEIGHT); dc.DrawLine(x,0,x,HEIGHT);

+ 2
- 2
src/wave.cpp View File

//> //>
//<wave_open //<wave_open


void* wave_open(char* the_api)
void* wave_open(const char* the_api)
{ {
ENTER("wave_open"); ENTER("wave_open");
static int once=0; static int once=0;




void wave_init() {} void wave_init() {}
void* wave_open(char* the_api) {return (void *)1;}
void* wave_open(const char* the_api) {return (void *)1;}
size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize) {return theSize;} size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize) {return theSize;}
int wave_close(void* theHandler) {return 0;} int wave_close(void* theHandler) {return 0;}
int wave_is_busy(void* theHandler) {return 0;} int wave_is_busy(void* theHandler) {return 0;}

+ 1
- 1
src/wave.h View File



extern void wave_init(); extern void wave_init();
// TBD: the arg could be "alsa", "oss",... // TBD: the arg could be "alsa", "oss",...
extern void* wave_open(char* the_api);
extern void* wave_open(const char* the_api);


extern size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize); extern size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize);
extern int wave_close(void* theHandler); extern int wave_close(void* theHandler);

Loading…
Cancel
Save