Merge commit 'e4854a9cd6' into android

Conflicts:
	src/voices.cpp
This commit is contained in:
Reece H. Dunn
2013-03-13 20:55:49 +00:00
38 changed files with 1442 additions and 1169 deletions
+95 -52
View File
@@ -27,6 +27,7 @@
#include "wx/wfstream.h"
#include "wx/dir.h"
#include "wx/filename.h"
#include <wx/numdlg.h>
#include "speak_lib.h"
#include "main.h"
@@ -45,6 +46,7 @@ extern void FindPhonemesUsed(void);
extern void DisplayErrorFile(const char *fname);
extern int utf8_out(unsigned int c, char *buf);
extern void DrawEnvelopes();
extern void ReadPhondataManifest();
char path_source[sizeof(path_home)+20];
@@ -465,7 +467,7 @@ return;
instn_category = (instn >> 12) & 0xf;
data1 = instn & 0xff;
type2 = (instn >> 8) & 0xf;
fprintf(f_out, " %.3x: %.4x %s",pc-prog_buf,instn,instn_category_string[instn_category]);
fprintf(f_out, " %.3x: %.4x %s",(unsigned int)(pc-prog_buf),instn,instn_category_string[instn_category]);
switch(instn_category)
{
@@ -644,6 +646,7 @@ static int duplicate_references = 0;
static int count_frames = 0;
static int error_count = 0;
static int resample_count = 0;
static int resample_fails = 0;
static int then_count = 0;
static int after_if = 0;
@@ -738,7 +741,6 @@ static void CompileReport(void)
const char *data_path;
int prev_table;
int prev_mnemonic;
char fname[sizeof(path_source)+20];
if(f_report == NULL)
return;
@@ -1791,8 +1793,12 @@ static int LoadWavefile(FILE *f, const char *fname)
int max = 0;
int length;
int sr1, sr2;
int failed;
int len;
int resample_wav = 0;
const char *fname2;
char fname_temp[100];
char msg[120];
int scale_factor=0;
fseek(f,24,SEEK_SET);
@@ -1802,53 +1808,67 @@ static int LoadWavefile(FILE *f, const char *fname)
if((sr1 != samplerate_native) || (sr2 != sr1*2))
{
#ifdef PLATFORM_WINDOWS
if(sr1 != samplerate_native)
int fd_temp;
char command[sizeof(path_source)+200];
failed = 0;
#ifdef PLATFORM_POSIX
strcpy(fname_temp,"/tmp/espeakXXXXXX");
if((fd_temp = mkstemp(fname_temp)) >= 0)
{
fprintf(f_errors,"Wrong samplerate %d, wants %d\n",sr1,samplerate_native);
error("Wrong samplerate: %s",fname);
}
if(sr2 != sr1*2)
{
error("Not mono: %s",fname);
close(fd_temp);
}
#else
{
int fd_temp;
char command[sizeof(path_source)+200];
strcpy(fname_temp,"/tmp/espeakXXXXXX");
if((fd_temp = mkstemp(fname_temp)) >= 0)
{
close(fd_temp);
sprintf(command,"sox \"%s%s.wav\" -c1 -t wav %s rate -h %d\n",path_source,fname,fname_temp,samplerate_native);
if(system(command) < 0)
{
error("Failed to resample: %s",command);
remove(fname_temp);
return(0);
}
}
if(GetFileLength(fname_temp) <= 0)
{
error("Failed to resample: %s",command);
remove(fname_temp);
return(0);
}
f = fopen(fname_temp,"rb");
if(f == NULL)
{
error("Can't read temp file: %s",fname_temp);
return(0);
}
if(f_report != NULL)
fprintf(f_report, "resampled %s\n", fname);
resample_count++;
resample_wav = 1;
fseek(f,40,SEEK_SET); // skip past the WAV header, up to before "data length"
}
strcpy(fname_temp,tmpnam(NULL));
#endif
fname2 = fname;
len = strlen(fname);
if(strcmp(&fname[len-4], ".wav") == 0)
{
strcpy(msg, fname);
msg[len-4] = 0;
fname2 = msg;
}
sprintf(command,"sox \"%s%s.wav\" -r %d -c1 -t wav %s\n",path_source,fname2,samplerate_native, fname_temp);
if(system(command) < 0)
{
failed = 1;
}
if(failed || (GetFileLength(fname_temp) <= 0))
{
if(resample_fails < 2)
error("Resample command failed: %s", command);
resample_fails++;
if(sr1 != samplerate_native)
{
sprintf(msg, "Can't resample (%d to %d): %s", sr1, samplerate_native, fname);
error("%s", msg);
}
else
{
error("WAV file is not mono: %s", fname);
}
remove(fname_temp);
return(0);
}
f = fopen(fname_temp,"rb");
if(f == NULL)
{
error("Can't read temp file: %s",fname_temp);
return(0);
}
if(f_report != NULL)
fprintf(f_report, "resampled %s\n", fname);
resample_count++;
resample_wav = 1;
fseek(f,40,SEEK_SET); // skip past the WAV header, up to before "data length"
}
displ = ftell(f_phdata);
@@ -3321,8 +3341,11 @@ static void CompileEquivalents()
p_start[2] = n_bytes >> 8; // index of next table
p_start[3] = n_bytes;
LoadVoice(voice_name2,0); // reset the original phoneme table
LoadVoiceVariant(save_voice_name,0);
if(gui_flag != 0)
{
LoadVoice(voice_name2,0); // reset the original phoneme table
LoadVoiceVariant(save_voice_name,0);
}
} // end of CompileEquivalents
@@ -3362,6 +3385,7 @@ static void CompilePhonemeFiles()
case kINCLUDE:
NextItem(tSTRING);
sprintf(buf,"%s%s",path_source,item_string);
if((stack_ix < N_STACK) && (f = fopen_log(f_errors,buf,"rb")) != NULL)
{
fprintf(f_errors,"include %s\n",item_string);
@@ -3421,6 +3445,7 @@ make_envs();
n_envelopes = 0;
error_count = 0;
resample_count = 0;
memset(markers_used,0,sizeof(markers_used));
f_errors = stderr;
@@ -3534,6 +3559,7 @@ memset(markers_used,0,sizeof(markers_used));
// write a word so that further data doesn't start at displ=0
Write4Bytes(f_phdata,version_phdata);
Write4Bytes(f_phdata,samplerate_native);
Write4Bytes(f_phindex,version_phdata);
memset(ref_hash_tab,0,sizeof(ref_hash_tab));
@@ -3555,9 +3581,10 @@ fprintf(f_errors,"\nRefs %d, Reused %d\n",count_references,duplicate_references
fclose(f_phtab);
fclose(f_phcontents);
LoadPhData();
LoadVoice(voice_name2,0);
LoadPhData(NULL);
if(gui_flag != 0)
LoadVoice(voice_name2,0);
CompileReport();
report_dict = CompileAllDictionaries();
@@ -3595,6 +3622,8 @@ fprintf(f_errors,"\nRefs %d, Reused %d\n",count_references,duplicate_references
fprintf(stderr,"%s\n",fname);
}
ReadPhondataManifest();
} // end of CompilePhonemeData
@@ -3759,7 +3788,6 @@ void CompileIntonation()
char buf[sizeof(path_source)+120];
error_count = 0;
resample_count = 0;
sprintf(fname_errors,"%s%s",path_source,"error_intonation");
if((f_errors = fopen(fname_errors,"w")) == NULL)
@@ -4036,7 +4064,7 @@ void CompileIntonation()
{
DisplayErrorFile(fname_errors);
}
LoadPhData();
LoadPhData(NULL);
} // end of CompileIntonation
@@ -4044,7 +4072,22 @@ void CompileIntonation()
void CompilePhonemeData()
{
WavegenInit(22050, 0);
WavegenSetVoice(voice);
CompilePhonemeData2("phonemes");
return;
}
void CompileSampleRate()
{
long value;
value = wxGetNumberFromUser(_T("Compile phoneme data with a specified sample rate"), _T("Sample rate"), _T("Resample (needs sox)"), 22050, 5000, 48000);
if(value > 1000)
{
WavegenInit(value, 0);
WavegenSetVoice(voice);
CompilePhonemeData2("phonemes");
}
}
-4
View File
@@ -300,10 +300,6 @@ int LoadDictionary(Translator *tr, const char *name, int no_error)
// set up indices into data_dictrules
InitGroups(tr);
if(tr->groups1[0] == NULL)
{
fprintf(stderr,"Error in %s_rules, no default rule group\n",name);
}
// set up hash table for data_dictlist
p = &(tr->data_dictlist[8]);
+28 -12
View File
@@ -43,11 +43,11 @@
#include "prosodydisplay.h"
#ifdef deleted
static const char *about_string = "espeakedit: %s\nAuthor: Jonathan Duddington (c) 2009\n\n"
static const char *about_string2 = "espeakedit: %s\nAuthor: Jonathan Duddington (c) 2009\n\n"
"Licensed under GNU General Public License version 3\n"
"http://espeak.sourceforge.net/";
#endif
static const char *about_string = "<font size=0><b>espeakedit </b> %s<br>Author: Jonathan Duddington (c) 2009<br>"
"<a href=\"http://espeak.sourceforge.net/\">http://espeak.sourceforge.net</a><br>"
@@ -63,6 +63,7 @@ extern void DictionarySort(const char *dictname);
extern void init_z();
extern void CompilePhonemeData(void);
extern void CompileSampleRate(void);
extern void CompileMbrola();
extern void CompileIntonation();
extern void InitSpectrumDisplay();
@@ -133,22 +134,21 @@ if(argc > 1)
if((strcmp(param,"--help")==0) || (strcmp(param,"-h")==0))
{
printf(about_string,espeak_Info(NULL));
printf(help_text);
printf(about_string2,espeak_Info(NULL));
printf("%s", help_text);
exit(0);
}
ConfigInit();
VoiceReset(0);
WavegenSetVoice(voice);
WavegenInitSound();
if(strcmp(param,"--compile")==0)
{
LoadPhData(NULL);
samplerate_native = samplerate = 22050;
CompilePhonemeData();
CompileIntonation();
exit(0);
}
exit(0);
}
ConfigInit();
@@ -205,6 +205,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(MENU_PATH3, MyFrame::OnOptions)
EVT_MENU(MENU_PATH4, MyFrame::OnOptions)
EVT_MENU(MENU_COMPILE_PH, MyFrame::OnTools)
EVT_MENU(MENU_COMPILE_PH2, MyFrame::OnTools)
EVT_MENU(MENU_COMPILE_DICT, MyFrame::OnTools)
EVT_MENU(MENU_COMPILE_DICT_DEBUG, MyFrame::OnTools)
EVT_MENU(MENU_FORMAT_DICTIONARY, MyFrame::OnTools)
@@ -266,6 +267,7 @@ MyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title, c
int error_flag = 0;
int result;
int param;
int srate;
notebook = new wxNotebook(this, ID_NOTEBOOK, wxDefaultPosition, wxSize(312,760));
// notebook->AddPage(voicedlg,_T("Voice"),FALSE);
@@ -301,9 +303,8 @@ MyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title, c
SetSize(pos.x, pos.y, size.GetWidth(), size.GetHeight());
LoadConfig();
WavegenInitSound();
if((result = LoadPhData()) != 1)
if((result = LoadPhData(&srate)) != 1)
{
if(result == -1)
wxLogError(_T("Failed to read espeak-data/phontab,phondata,phonindex\nPath = ")+wxString(path_home,wxConvLocal)+_T("\n\nThe 'eSpeak' package needs to be installed"));
@@ -311,7 +312,10 @@ MyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title, c
wxLogError(_T("Wrong version of espeak-data at:\n")+ wxString(path_home,wxConvLocal)+_T("\nVersion 0x%x (expects 0x%x)"),result,version_phdata);
error_flag = 1;
srate = 22050;
}
WavegenInit(srate,0);
WavegenInitSound();
f_trans = stdout;
option_ssml = 1;
@@ -350,7 +354,13 @@ MyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title, c
void MyFrame::SetVoiceTitle(char *voice_name)
{//==========================================
char buf[100];
SetTitle(AppName + _T(" - ") + wxString(voice_name,wxConvLocal) + _T(" voice"));
if(samplerate_native == 22050)
sprintf(buf, " - %s voice", voice_name);
else
sprintf(buf, " - %s voice %dHz", voice_name, samplerate_native);
SetTitle(AppName + wxString(buf,wxConvLocal));
if((data_menu != NULL) && (translator != NULL))
{
sprintf(buf,"Compile &dictionary '%s'",translator->dictionary_name);
@@ -738,6 +748,12 @@ void MyFrame::OnTools(wxCommandEvent& event)
case MENU_COMPILE_PH:
CompilePhonemeData();
SetVoiceTitle(voice_name2);
break;
case MENU_COMPILE_PH2:
CompileSampleRate();
SetVoiceTitle(voice_name2);
break;
case MENU_COMPILE_MBROLA:
+20 -20
View File
@@ -135,7 +135,7 @@ int TestSynthCallback(short *wav, int numsamples, espeak_EVENT *events)
else
if(type==espeakEVENT_PHONEME)
{
char buf[10];
// char buf[10];
fprintf(f_events,"[%s]\n",WordToString(events->id.number)); //old version, only 4 characters bytes
// memcpy(buf, events->id.string, 8);
// buf[8] = 0;
@@ -206,7 +206,7 @@ static const unsigned short KOI8_R[0x60] = {
#define N_CHARS 34
#define PH(c1,c2) (c2<<8)+c1 // combine two characters into an integer for phoneme name
#define PH(c1,c2) (c2<<8)+c1 // combine two characters into an integer for phoneme name
@@ -236,7 +236,7 @@ static void DecodePhonemes2(const char *inptr, char *outptr)
continue; /* indicates unrecognised phoneme */
if((ph = phoneme_tab[phcode]) == NULL)
continue;
if((ph->type == phSTRESS) && (ph->std_length <= 4) && (ph->program == 0))
{
if(ph->std_length > 2)
@@ -281,7 +281,7 @@ static void DecodePhonemes2(const char *inptr, char *outptr)
else
if(mnem != 0)
{
while((c = (mnem & 0xff)) != 0)
while((c = (mnem & 0xff)) != 0)
{
*outptr++ = c;
mnem = mnem >> 8;
@@ -363,7 +363,7 @@ void Lexicon_It(int pass)
path_dir1 = wxFileName(fname_lex).GetPath();
strcpy(buf_out, path_dir1.mb_str(wxConvLocal));
sprintf(buf, "%s/IT_errors", buf_out);
if((f_out = fopen(buf,"w")) == NULL)
{
str = wxString(buf, wxConvLocal);
@@ -412,7 +412,7 @@ void Lexicon_It(int pass)
if((p = strstr(buf,"//")) != NULL)
*p = 0;
if((sscanf(buf,"%s %s",word,temp)) < 2)
continue;
@@ -522,7 +522,7 @@ void Lexicon_It(int pass)
fputc(*p, f_listx); // omit secondary stress marks
}
fputc('\n',f_listx);
}
else
if((stress_posn1 != stress_posn2) && (stress_posn1 > 0) && (stress_posn2 > 0))
@@ -706,7 +706,7 @@ void Lexicon_De()
return;
}
path_dir1 = wxFileName(fname).GetPath();
if((f_out = fopen("compare_de","w")) == NULL)
{
wxLogError(_T("Can't write file "));
@@ -934,7 +934,7 @@ void Lexicon_Bg()
FILE *f_in;
FILE *f_out;
char word[80];
char word_in[80];
char phonemes[N_WORD_PHONEMES];
@@ -1101,7 +1101,7 @@ if(n_stress > 1) n_stress = 1;
if(done)
n_out++;
}
}
n_words++;
}
@@ -1383,10 +1383,10 @@ void Lexicon_Ru()
len = strlen(suffix);
if(len >= (wlen-2))
continue;
if(ru_stress > (vcount - suffixes[sfx].syllables))
continue;
if(strcmp(suffix,&word[wlen-len])==0)
{
strcpy(word2,word);
@@ -1547,7 +1547,7 @@ void CountWordFreq(wxString path, wcount **hashtab)
// skip leading spaces, numbers, etc
if(feof(f_in)) break;
}
// read utf8 bytes until a space, number or punctuation
ix = 0;
while(!feof(f_in) && (c >= 'A') && (ix < sizeof(buf)-1))
@@ -1557,7 +1557,7 @@ void CountWordFreq(wxString path, wcount **hashtab)
}
buf[ix++] = 0;
buf[ix] = 0;
// the buf may contain non-alphabetic characters
j = 0;
n_chars = 0;
@@ -1583,7 +1583,7 @@ void CountWordFreq(wxString path, wcount **hashtab)
}
}
fclose(f_in);
} // end of CountWordFreq
@@ -1645,7 +1645,7 @@ void MakeWordFreqList()
free(p);
}
fclose(f_out);
} // end of Make WorkFreqList
@@ -2129,9 +2129,9 @@ void SetSpeedTab(void)
// Interpolation table to translate from words-per-minute to internal speed
// words-per-minute values (measured)
static float wpm1[N_WPM] =
{0, 82, 96, 108, 124, 134, 147, 162, 174, 189, 224, 259, 273, 289, 307, 326, 346, 361, 370 };
{0, 82, 96, 108, 124, 134, 147, 162, 174, 189, 224, 259, 273, 289, 307, 326, 346, 361, 370 };
// corresponding internal speed values
static float wpm2[N_WPM] =
static float wpm2[N_WPM] =
{0,253,200, 170, 140, 125, 110, 95, 85, 75, 55, 40, 35, 30, 25, 20, 15, 10, 5 };
unsigned char speed_lookup[290];
@@ -2245,7 +2245,7 @@ void CharsetToUnicode(const char *charset)
#ifdef deleted
void Test2()
{
//
//
char buf[120];
FILE *f;
FILE *f_out;
@@ -2299,7 +2299,7 @@ if(control==2)
f = fopen("/home/jsd1/speechdata/text/test.txt","r");
if(f==NULL)
return;
while(!feof(f) && (ix < sizeof(textbuf)-2))
{
+1
View File
@@ -136,6 +136,7 @@ enum {
MENU_PROSODY,
MENU_COMPILE_PH,
MENU_COMPILE_PH2,
MENU_COMPILE_DICT,
MENU_COMPILE_DICT_DEBUG,
MENU_FORMAT_DICTIONARY,
+2 -1
View File
@@ -1,5 +1,5 @@
/***************************************************************************
* Copyright (C) 2005 to 2010 by Jonathan Duddington *
* Copyright (C) 2005 to 2013 by Jonathan Duddington *
* email: jonsd@users.sourceforge.net *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -90,6 +90,7 @@ wxMenuBar *MakeMenu(int type, const char *dict_name)
// DATA MENU
data_menu = new wxMenu;
data_menu->Append(MENU_COMPILE_PH, _("Compile &phoneme data"));
data_menu->Append(MENU_COMPILE_PH2, _("Change sample &rate"));
data_menu->Append(MENU_COMPILE_DICT, _("Compile &dictionary"));
data_menu->Append(MENU_COMPILE_DICT_DEBUG, _("Compile dictionary (debu&g)"));
data_menu->AppendSeparator();
+26 -26
View File
@@ -1,5 +1,5 @@
/***************************************************************************
* Copyright (C) 2005 to 2011 by Jonathan Duddington *
* Copyright (C) 2005 to 2013 by Jonathan Duddington *
* email: jonsd@users.sourceforge.net *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -439,7 +439,7 @@ void LookupAccentedLetter(Translator *tr, unsigned int letter, char *ph_buf)
if((letter >= 0x250) && (letter <= 0x2a8))
{
accent_data = letter_accents_250[letter - 0x250];
}
}
if(accent_data != 0)
{
@@ -555,7 +555,7 @@ void LookupLetter(Translator *tr, unsigned int letter, int next_byte, char *ph_b
// if the $accent flag is set for this letter, use the accents table (below)
dict_flags[1] = 0;
if(Lookup(tr, &single_letter[1], ph_buf3) == 0)
{
single_letter[1] = ' ';
@@ -682,7 +682,7 @@ int TranslateLetter(Translator *tr, char *word, char *phonemes, int control)
if((ph_buf[0]==0) && !iswspace(letter))
Lookup(tr, "_??", ph_buf);
if(ph_buf[0] != 0)
{
// speak the hexadecimal number of the character code
@@ -876,7 +876,7 @@ int TranslateRoman(Translator *tr, char *word, char *ph_out, WORD_TAB *wtab)
static const char *roman_numbers = "ixcmvld";
static int roman_values[] = {1,10,100,1000,5,50,500};
acc = 0;
prev = 0;
subtract = 0x7fff;
@@ -926,7 +926,7 @@ int TranslateRoman(Translator *tr, char *word, char *ph_out, WORD_TAB *wtab)
if(isdigit(word[0]))
return(0); // eg. 'xx2'
acc += prev;
if(acc < tr->langopts.min_roman)
return(0);
@@ -989,7 +989,7 @@ int TranslateRoman(Translator *tr, char *word, char *ph_out, WORD_TAB *wtab)
static const char *M_Variant(int value)
{//====================================
// returns M, or perhaps MA or MB for some cases
int teens = 0;
if(((value % 100) > 10) && ((value % 100) < 20))
@@ -1078,7 +1078,7 @@ static int LookupThousands(Translator *tr, int value, int thousandplex, int thou
if(found_value == 0)
{
if((value % 100) >= 20)
if((value % 100) >= 20)
{
Lookup(tr, "_0of", ph_of);
}
@@ -1203,7 +1203,7 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out
if(is_ordinal)
{
strcpy(ph_ordinal, ph_ordinal2);
if(control & 4)
{
sprintf(string,"_%d%cx",value,ord_type); // LANG=hu, special word for 1. 2. when there are no higher digits
@@ -1216,7 +1216,7 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out
}
found_ordinal = found;
}
if(found == 0)
{
if(control & 2)
@@ -1250,9 +1250,9 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out
}
}
}
// no, speak as tens+units
if((control & 0x10) && (value < 10))
{
// speak leading zero
@@ -1266,8 +1266,8 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out
}
else
{
if((is_ordinal) &&
if((is_ordinal) &&
((units == 0) || (tr->langopts.numbers & NUM_SWAP_TENS) || (tr->langopts.numbers2 & NUM2_MULTIPLE_ORDINAL)))
{
sprintf(string,"_%dX%c", tens, ord_type);
@@ -1287,7 +1287,7 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out
sprintf(string,"_%dX", tens);
Lookup(tr, string, ph_tens);
}
if((ph_tens[0] == 0) && (tr->langopts.numbers & NUM_VIGESIMAL))
{
// tens not found, (for example) 73 is 60+13
@@ -1295,12 +1295,12 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out
sprintf(string,"_%dX", tens & 0xfe);
Lookup(tr, string, ph_tens);
}
ph_digits[0] = 0;
if(units > 0)
{
{
found = 0;
if((control & 2) && (digit_lookup[0] != 0))
{
// we have an entry for this digit (possibly together with the next word)
@@ -1350,7 +1350,7 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out
}
}
}
if((is_ordinal) && (found_ordinal == 0) && (ph_ordinal[0] == 0))
{
if((value >= 20) && (((value % 10) == 0) || (tr->langopts.numbers & NUM_SWAP_TENS)))
@@ -1358,7 +1358,7 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out
if(ph_ordinal[0] == 0)
Lookup(tr, "_ord", ph_ordinal);
}
if((tr->langopts.numbers & (NUM_SWAP_TENS | NUM_AND_UNITS)) && (ph_tens[0] != 0) && (ph_digits[0] != 0))
{
Lookup(tr, "_0and", ph_and);
@@ -1381,7 +1381,7 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out
{
if((next_phtype = phoneme_tab[(unsigned int)(ph_digits[0])]->type) == phSTRESS)
next_phtype = phoneme_tab[(unsigned int)(ph_digits[1])]->type;
if((phoneme_tab[(unsigned int)(ph_tens[ix])]->type == phVOWEL) && (next_phtype == phVOWEL))
ph_tens[ix] = 0;
}
@@ -1563,13 +1563,13 @@ static int LookupNum3(Translator *tr, int value, char *ph_out, int suppress_null
sprintf(string,"_%dC0",hundreds);
found = Lookup(tr, string, ph_digits);
}
if(!found)
{
sprintf(string,"_%dC",hundreds);
found = Lookup(tr, string, ph_digits); // is there a specific pronunciation for n-hundred ?
}
if(found)
{
ph_100[0] = 0;
@@ -1632,7 +1632,7 @@ static int LookupNum3(Translator *tr, int value, char *ph_out, int suppress_null
x = 8; // use variant (feminine) for before thousands and millions
}
if(LookupNum2(tr, tensunits, x | control & 0x100, buf2) != 0)
if(LookupNum2(tr, tensunits, x | (control & 0x100), buf2) != 0)
{
if(tr->langopts.numbers & NUM_SINGLE_AND)
ph_hundred_and[0] = 0; // don't put 'and' after 'hundred' if there's 'and' between tens and units
@@ -1791,7 +1791,7 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned
// this is an ordinal suffix
ordinal = 2;
flags[0] |= FLAG_SKIPWORDS;
skipwords = 1;
skipwords = 1;
}
}
}
@@ -2052,7 +2052,7 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned
break;
n_digits++;
strcat(ph_out, buf1);
}
}
}
}
+7 -14
View File
@@ -1,5 +1,5 @@
/***************************************************************************
* Copyright (C) 2005 to 2007 by Jonathan Duddington *
* Copyright (C) 2005 to 2013 by Jonathan Duddington *
* email: jonsd@users.sourceforge.net *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -79,7 +79,7 @@ Options::~Options()
for(ix=0; ix < 1; ix++)
delete m_lab[ix];
delete m_samplerate;
delete m_save;
delete m_close;
@@ -89,13 +89,13 @@ void Options::OnCommand(wxCommandEvent& event)
{//===========================================
int id;
int value;
switch(id = event.GetId())
{
case wxID_SAVE:
value = GetNumeric(m_samplerate);
if(value > 0) WavegenInit(value,0);
Destroy();
break;
@@ -120,11 +120,10 @@ void ConfigSetPaths()
void ConfigInit()
{//==============
long value;
wxString string;
wxString basedir;
const char *path_base;
#ifdef PLATFORM_WINDOWS
int found = 0;
char buf[200];
@@ -134,7 +133,7 @@ void ConfigInit()
{
sprintf(path_home,"%s\\espeak-data",path_base);
if(GetFileLength(path_home) == -2)
found = 1; // an espeak-data directory exists
found = 1; // an espeak-data directory exists
}
if(found == 0)
@@ -142,7 +141,7 @@ void ConfigInit()
if(pRegKey->Exists() )
{
wxString RegVal;
pRegKey->QueryValue(_T("Path"),RegVal);
pRegKey->QueryValue(_T("Path"),RegVal);
strncpy0(buf,RegVal.mb_str(wxConvLocal),sizeof(buf));
path_base = buf;
}
@@ -161,12 +160,6 @@ void ConfigInit()
wxFileConfig *pConfig = new wxFileConfig(_T("espeakedit"));
wxFileConfig::Set(pConfig);
pConfig->Read(_T("/samplerate"),&value,22050);
#ifdef PLATFORM_WINDOWS
value = 22050;
#endif
WavegenInit(value,0);
basedir = wxString(path_base,wxConvLocal); // this is only used to set defaults for other paths if they are not in the config file
pConfig->Read(_T("/spectload"),&path_spectload,basedir+_T("/phsource"));
pConfig->Read(_T("/spectload2"),&path_spectload2,basedir+_T("/phsource"));
+88 -3
View File
@@ -50,6 +50,86 @@ static wxPen PEN_PHSELECTED(wxColour(255,0,0),2,wxSOLID);
static wxPen PEN_PHSTRESSED(wxColour(80,80,196),3,wxSOLID);
static wxPen PEN_PHSTRESSED2(wxColour(160,160,255),2,wxSOLID);
typedef struct {
unsigned int value;
char *name;
} NAMETAB;
NAMETAB *manifest = NULL;
int n_manifest;
const char *LookupManifest(unsigned int addr)
{//=============================================
int ix;
if(manifest != NULL)
{
for(ix=0; ix < n_manifest; ix++)
{
if(manifest[ix].value == addr)
return(manifest[ix].name);
if(manifest[ix].value > addr)
break;
}
}
return("");
}
void ReadPhondataManifest()
{//=========================
// Read the phondata-manifest file
FILE *f;
int n_lines=0;
int ix;
char *p;
unsigned int value;
char buf[sizeof(path_home)+40];
char name[120];
sprintf(buf,"%s%c%s",path_home,PATHSEP,"phondata-manifest");
if((f = fopen(buf, "r")) == NULL)
return;
while(fgets(buf, sizeof(buf), f) != NULL)
n_lines++;
rewind(f);
if(manifest != NULL)
{
for(ix=0; ix < n_manifest; ix++)
free(manifest[ix].name);
}
if((manifest = (NAMETAB *)realloc(manifest, n_lines * sizeof(NAMETAB))) == NULL)
return;
n_manifest = 0;
while(fgets(buf, sizeof(buf), f) != NULL)
{
if(!isalpha(buf[0]))
continue;
if(sscanf(&buf[2], "%x %s", &value, name) == 2)
{
if((p = (char *)malloc(strlen(name)+1)) != NULL)
{
strcpy(p, name);
manifest[n_manifest].value = value;
manifest[n_manifest].name = p;
n_manifest++;
}
}
}
fclose(f);
}
ProsodyDisplay::ProsodyDisplay(wxWindow *parent, const wxPoint& pos, const wxSize& size)
: wxScrolledWindow(parent, -1, pos, size,
wxSUNKEN_BORDER | wxNO_FULL_REPAINT_ON_RESIZE)
@@ -76,6 +156,7 @@ void InitProsodyDisplay()
int ix;
wxString string;
ReadPhondataManifest();
menu_envelopes = new wxMenu;
// entries match those in envelope_data[] in intonation.cpp
@@ -142,6 +223,7 @@ void ProsodyDisplay::SelectPh(int index)
int ix;
const char *name = "?";
char buf[120];
char len_string[20];
if(index < 0) return;
@@ -162,8 +244,12 @@ void ProsodyDisplay::SelectPh(int index)
}
y1 = p->pitch1;
y2 = p->pitch2;
sprintf(buf,"Stress %s%d Amp %2d StdLength %2d LengthMod %2d Pitch %3d %3d %s PhFlags %.2x ",
emphasized,p->stresslevel&0x7,p->amp,p->std_length*2, p->length,y1,y2,name,p->ph->phflags);
len_string[0] = 0;
if(p->std_length > 0)
sprintf(len_string," Length %d", p->std_length*2);
sprintf(buf,"Stress %s%d Amp %2d LengthMod %2d Pitch %3d %3d %s PhFlags %.2x [%s%s]",
emphasized,p->stresslevel&0x7,p->amp, p->length,y1,y2,name,p->ph->phflags, LookupManifest(p->phontab_addr), len_string);
wxLogStatus(wxString(buf,wxConvLocal));
}
@@ -625,4 +711,3 @@ void MyFrame::OnProsody(wxCommandEvent& WXUNUSED(event))
adding_page = 2; // work around for wxNotebook bug (version 2.8.7)
screenpages->AddPage(prosodycanvas, _T("Prosody"), true);
}
+1 -8
View File
@@ -741,7 +741,6 @@ static int LoadSoundFile(const char *fname, int index)
{
int ix;
int fd_temp;
const char *resample;
int header[3];
char command[sizeof(fname2)+sizeof(fname2)+40];
@@ -755,17 +754,11 @@ static int LoadSoundFile(const char *fname, int index)
fclose(f);
f = NULL;
if(header[2] == samplerate)
resample = "";
else
resample = "polyphase";
strcpy(fname_temp,"/tmp/espeakXXXXXX");
if((fd_temp = mkstemp(fname_temp)) >= 0)
{
close(fd_temp);
// sprintf(fname_temp,"%s.wav",tmpnam(NULL));
sprintf(command,"sox \"%s\" -r %d -w -s -c1 %s %s\n", fname, samplerate, fname_temp, resample);
sprintf(command,"sox \"%s\" -r %d -c1 -t wav %s\n", fname, samplerate, fname_temp);
if(system(command) == 0)
{
fname = fname_temp;
+11 -8
View File
@@ -104,7 +104,7 @@ static unsigned char pause_factor_350[] = {
15,15,15,15,15}; // 370
// wav_factor adjustments for speeds 350 to 450
// Use this to calibrate speed for wpm 350-450
// Use this to calibrate speed for wpm 350-450
static unsigned char wav_factor_350[] = {
120, 121, 120, 119, 119, // 350
118, 118, 117, 116, 116, // 355
@@ -275,6 +275,9 @@ void SetSpeed(int control)
speed.min_sample_len = 420 - (wpm - 440);
}
// adjust for different sample rates
speed.min_sample_len = (speed.min_sample_len * samplerate_native) / 22050;
speed.pause_factor = (256 * s1)/115; // full speed adjustment, used for pause length
speed.clause_pause_factor = 0;
@@ -463,7 +466,7 @@ void SetAmplitude(int amp)
if((amp >= 0) && (amp <= 20))
{
option_amplitude = (amplitude_factor[amp] * 480)/256;
option_amplitude = (amplitude_factor[amp] * 480)/256;
}
}
#endif
@@ -606,7 +609,7 @@ void CalcLengths(Translator *tr)
case phPAUSE:
last_pitch = 0;
break;
case phSTOP:
last_pitch = 0;
if(prev->type == phFRICATIVE)
@@ -710,7 +713,7 @@ void CalcLengths(Translator *tr)
p->amp = tr->stress_amps[0]; // unless changed later
p->length = 256; // TEMPORARY
min_drop = 0;
if(p->newword)
{
if(prev->type==phLIQUID)
@@ -733,12 +736,12 @@ void CalcLengths(Translator *tr)
if((prev->type==phVOWEL) || (prev->type == phLIQUID))
{
p->length = prev->length;
if(p->type == phLIQUID)
{
p->length = speed1;
}
if(next->type == phVSTOP)
{
p->length = (p->length * 160)/100;
@@ -963,11 +966,11 @@ if(p->type != phVOWEL)
next->synthflags &= ~SFLAG_SEQCONTINUE;
if(next->type == phNASAL && next2->type != phVOWEL)
next->synthflags |= SFLAG_SEQCONTINUE;
if(next->type == phLIQUID)
{
next->synthflags |= SFLAG_SEQCONTINUE;
if(next2->type == phVOWEL)
{
next->synthflags &= ~SFLAG_SEQCONTINUE;
+4 -3
View File
@@ -1,5 +1,5 @@
/***************************************************************************
* Copyright (C) 2005 to 2007 by Jonathan Duddington *
* Copyright (C) 2005 to 2013 by Jonathan Duddington *
* email: jonsd@users.sourceforge.net *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -397,6 +397,7 @@ static int initialise(void)
{//========================
int param;
int result;
int srate = 22050; // default sample rate
// It seems that the wctype functions don't work until the locale has been set
// to something other than the default "C". Then, not only Latin1 but also the
@@ -412,8 +413,7 @@ static int initialise(void)
#endif
WavegenInit(22050,0); // 22050
if((result = LoadPhData()) != 1)
if((result = LoadPhData(&srate)) != 1)
{
if(result == -1)
{
@@ -423,6 +423,7 @@ static int initialise(void)
else
fprintf(stderr,"Wrong version of espeak-data 0x%x (expects 0x%x) at %s\n",result,version_phdata,path_home);
}
WavegenInit(srate,0);
LoadConfig();
SetVoiceStack(NULL, "");
SynthesizeInit();
+4 -2
View File
@@ -377,11 +377,12 @@ static int initialise(int control)
{//===============================
int param;
int result;
int srate = 22050; // default sample rate 22050 Hz
err = EE_OK;
LoadConfig();
WavegenInit(22050,0); // 22050
if((result = LoadPhData()) != 1)
if((result = LoadPhData(&srate)) != 1) // reads sample rate from espeak-data/phontab
{
if(result == -1)
{
@@ -394,6 +395,7 @@ static int initialise(int control)
else
fprintf(stderr,"Wrong version of espeak-data 0x%x (expects 0x%x) at %s\n",result,version_phdata,path_home);
}
WavegenInit(srate,0);
memset(&current_voice_selected,0,sizeof(current_voice_selected));
SetVoiceStack(NULL, "");
+20 -7
View File
@@ -35,8 +35,8 @@
#include "translate.h"
#include "wave.h"
const char *version_string = "1.46.35 14.Feb.13";
const int version_phdata = 0x014631;
const char *version_string = "1.46.37 20.Feb.13";
const int version_phdata = 0x014636;
int option_device_number = -1;
FILE *f_logespeak = NULL;
@@ -108,13 +108,14 @@ static char *ReadPhFile(void *ptr, const char *fname, int *size)
} // end of ReadPhFile
int LoadPhData()
{//=============
int LoadPhData(int *srate)
{//========================
int ix;
int n_phonemes;
int version;
int result = 1;
int length;
int rate;
unsigned char *p;
int *pw;
@@ -126,14 +127,16 @@ int LoadPhData()
return(-1);
if((tunes = (TUNE *)ReadPhFile((void *)(tunes),"intonations",&length)) == NULL)
return(-1);
wavefile_data = (unsigned char *)phondata_ptr;
wavefile_data = (unsigned char *)phondata_ptr;
n_tunes = length / sizeof(TUNE);
// read the version number from the first 4 bytes of phondata
version = 0;
// read the version number and sample rate from the first 8 bytes of phondata
version = 0; // bytes 0-3, version number
rate = 0; // bytes 4-7, sample rate
for(ix=0; ix<4; ix++)
{
version += (wavefile_data[ix] << (ix*8));
rate += (wavefile_data[ix+4] << (ix*8));
}
if(version != version_phdata)
@@ -163,6 +166,8 @@ int LoadPhData()
if(phoneme_tab_number >= n_phoneme_tables)
phoneme_tab_number = 0;
if(srate != NULL)
*srate = rate;
return(result);
} // end of LoadPhData
@@ -970,7 +975,9 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_
phdata->pd_param[i_LENGTH_MOD] = ph->length_mod;
if(ph->program == 0)
{
return;
}
end_flag = 0;
@@ -1215,7 +1222,13 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_
memcpy(&worddata->prev_vowel, &plist[0], sizeof(PHONEME_LIST));
}
#ifdef _ESPEAKEDIT
plist->std_length = phdata->pd_param[i_SET_LENGTH];
if(phdata->sound_addr[0] != 0)
plist->phontab_addr = phdata->sound_addr[0]; // FMT address
else
plist->phontab_addr = phdata->sound_addr[1]; // WAV address
#endif
} // end of InterpretPhoneme
+6 -3
View File
@@ -1,5 +1,5 @@
/***************************************************************************
* Copyright (C) 2005 to 2010 by Jonathan Duddington *
* Copyright (C) 2005 to 2013 by Jonathan Duddington *
* email: jonsd@users.sourceforge.net *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -40,7 +40,7 @@ static void SmoothSpect(void);
// list of phonemes in a clause
int n_phoneme_list=0;
PHONEME_LIST phoneme_list[N_PHONEME_LIST];
PHONEME_LIST phoneme_list[N_PHONEME_LIST+1];
int mbrola_delay;
char mbrola_name[20];
@@ -1377,7 +1377,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)
DoPause(0,0); // isolate from the previous clause
}
while(ix < (*n_ph))
while((ix < (*n_ph)) && (ix < N_PHONEME_LIST-2))
{
p = &phoneme_list[ix];
@@ -1448,6 +1448,9 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume)
{
case phPAUSE:
DoPause(p->length,0);
#ifdef _ESPEAKEDIT
p->std_length = p->ph->std_length;
#endif
break;
case phSTOP:
+6 -3
View File
@@ -1,5 +1,5 @@
/***************************************************************************
* Copyright (C) 2005 to 2007 by Jonathan Duddington *
* Copyright (C) 2005 to 2013 by Jonathan Duddington *
* email: jonsd@users.sourceforge.net *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -220,7 +220,10 @@ typedef struct {
unsigned char newword; // bit 0=start of word, bit 1=end of clause, bit 2=start of sentence
unsigned char pitch1;
unsigned char pitch2;
#ifdef _ESPEAKEDIT
unsigned char std_length;
unsigned int phontab_addr;
#endif
} PHONEME_LIST;
@@ -435,7 +438,7 @@ extern PHONEME_TAB *phoneme_tab[N_PHONEME_TAB];
// list of phonemes in a clause
extern int n_phoneme_list;
extern PHONEME_LIST phoneme_list[N_PHONEME_LIST];
extern PHONEME_LIST phoneme_list[N_PHONEME_LIST+1];
extern unsigned int embedded_list[];
extern unsigned char env_fall[128];
@@ -510,7 +513,7 @@ unsigned int LookupSound(PHONEME_TAB *ph1, PHONEME_TAB *ph2, int which, int *mat
frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, int *n_frames, PHONEME_LIST *plist);
unsigned char *LookupEnvelope(int ix);
int LoadPhData();
int LoadPhData(int *srate);
void SynthesizeInit(void);
int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume);
+2
View File
@@ -3382,6 +3382,8 @@ if((c == '/') && (tr->langopts.testing & 2) && IsDigit09(next_in) && IsAlpha(pre
}
MakePhonemeList(tr, clause_pause, new_sentence);
phoneme_list[N_PHONEME_LIST].ph = NULL; // recognize end of phoneme_list array, in Generate()
phoneme_list[N_PHONEME_LIST].sourceix = 1;
if(embedded_count) // ???? is this needed
{
+4 -2
View File
@@ -1,5 +1,5 @@
/***************************************************************************
* Copyright (C) 2005 to 2007 by Jonathan Duddington *
* Copyright (C) 2005 to 2013 by Jonathan Duddington *
* email: jonsd@users.sourceforge.net *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -503,13 +503,15 @@ void TranslDlg::OnCommand(wxCommandEvent& event)
if((n_ph_list + n_phoneme_list) >= N_PH_LIST)
{
n_phoneme_list = N_PH_LIST - n_ph_list - n_phoneme_list;
n_phoneme_list = N_PH_LIST - n_ph_list;
}
memcpy(&ph_list[n_ph_list],phoneme_list,sizeof(PHONEME_LIST)*n_phoneme_list);
n_ph_list += n_phoneme_list;
}
ph_list[N_PH_LIST].ph = NULL; // to recognize overrun off list (in Generate() )
t_phonetic->Clear();
if(option_phonemes == 2)
{
+18 -18
View File
@@ -410,7 +410,7 @@ void VoiceReset(int tone_only)
voice->voicing = 64;
voice->consonant_amp = 100;
voice->consonant_ampv = 100;
voice->samplerate = 22050;
voice->samplerate = samplerate_native;
memset(voice->klattv,0,sizeof(voice->klattv));
speed.fast_settings[0] = 450;
@@ -674,24 +674,24 @@ voice_t *LoadVoice(const char *vname, int control)
if(tone_only)
break;
priority = DEFAULT_LANGUAGE_PRIORITY;
language_name[0] = 0;
sscanf(p,"%s %d",language_name,&priority);
if(strcmp(language_name,"variant") == 0)
break;
len = strlen(language_name) + 2;
// check for space in languages[]
if(len < (sizeof(voice_languages)-langix-1))
{
voice_languages[langix] = priority;
strcpy(&voice_languages[langix+1],language_name);
langix += len;
}
// only act on the first language line
if(language_set == 0)
{
@@ -701,10 +701,10 @@ voice_t *LoadVoice(const char *vname, int control)
strcpy(new_dictionary,language_type);
strcpy(phonemes_name,language_type);
SelectPhonemeTableName(phonemes_name);
if(new_translator != NULL)
DeleteTranslator(new_translator);
new_translator = SelectTranslator(translator_name);
langopts = &new_translator->langopts;
}
@@ -1059,10 +1059,10 @@ static char *ExtractVoiceVariantName(char *vname, int variant_num, int add_dir)
{
// voice variant name, not number
sprintf(variant_name, "%s%s", variant_prefix, p);
}
}
}
}
if(variant_num > 0)
{
if(variant_num < 10)
@@ -1421,13 +1421,13 @@ char const *SelectVoice(espeak_VOICE *voice_select, int *found)
{
// no language is specified. Get language from the named voice
static char buf[60];
if(voice_select2.name == NULL)
{
if((voice_select2.name = voice_select2.identifier) == NULL)
voice_select2.name = "default";
}
strncpy0(buf,voice_select2.name,sizeof(buf));
variant_name = ExtractVoiceVariantName(buf,0,0);
@@ -1492,7 +1492,7 @@ char const *SelectVoice(espeak_VOICE *voice_select, int *found)
}
if(skip==0)
{
voices2[ix2++] = vp;
voices2[ix2++] = vp;
}
for(j=0; (j < vp->xx1) && (n_variants < N_VOICE_VARIANTS);)
@@ -1579,10 +1579,10 @@ static void GetVoices(const char *path)
}
else
{
// a regular line, add it to the voices list
// a regular line, add it to the voices list
if((f_voice = fopen(fname,"r")) == NULL)
continue;
// pass voice file name within the voices directory
voice_data = ReadVoiceFile(f_voice, fname+len_path_voices, &buf[20]);
fclose(f_voice);
@@ -1617,10 +1617,10 @@ static void GetVoices(const char *path)
else
if(ftype > 0)
{
// a regular line, add it to the voices list
// a regular line, add it to the voices list
if((f_voice = fopen(fname,"r")) == NULL)
continue;
// pass voice file name within the voices directory
voice_data = ReadVoiceFile(f_voice, fname+len_path_voices, FindFileData.cFileName);
fclose(f_voice);
@@ -1660,7 +1660,7 @@ static void GetVoices(const char *path)
else
if(ftype > 0)
{
// a regular line, add it to the voices list
// a regular line, add it to the voices list
if((f_voice = fopen(fname,"r")) == NULL)
{
LOGE("Unble to load voice file '%s': %s", fname, strerror(errno));