mirror of
https://github.com/rhasspy/espeak-ng.git
synced 2026-10-31 05:35:35 +00:00
[1.28.07] Changed the format of envelope files (phsource/envelope). These are not text files which contains coordinates which define the envelope.
The compile_phoneme_data operation now produces an image file phsource/envelopes.png which shows the shape of the envelopes. git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@78 d46cf337-b52f-0410-862d-fd96e6ae7743
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -73,7 +73,7 @@ BSC32=bscmake.exe
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib winmm.lib user32.lib gdi32.lib winspool.lib comdlg32.lib PAStaticWMME.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
|
||||
+86
-2
@@ -75,6 +75,7 @@
|
||||
extern void Write4Bytes(FILE *f, int value);
|
||||
extern void MakeVowelLists(void);
|
||||
extern void FindPhonemesUsed(void);
|
||||
extern void DrawEnvelopes();
|
||||
extern int CompileDictionary(const char *dsource, const char *dict_name, FILE *log, char *fname);
|
||||
extern char voice_name[];
|
||||
|
||||
@@ -91,6 +92,14 @@ typedef struct {
|
||||
} REF_HASH_TAB;
|
||||
|
||||
|
||||
#define N_ENVELOPES 30
|
||||
#define ENV_LEN 128
|
||||
int n_envelopes = 0;
|
||||
char envelope_paths[N_ENVELOPES][80];
|
||||
unsigned char envelope_dat[N_ENVELOPES][ENV_LEN];
|
||||
|
||||
|
||||
|
||||
class Compile
|
||||
{//==========
|
||||
public:
|
||||
@@ -119,6 +128,7 @@ private:
|
||||
int LoadSpect(const char *path, int control);
|
||||
int LoadWavefile(FILE *f, const char *fname);
|
||||
int LoadEnvelope(FILE *f, const char *fname);
|
||||
int LoadEnvelope2(FILE *f, const char *fname);
|
||||
int LoadDataFile(const char *path, int control);
|
||||
int AddSpect(int phcode, int *list, int control);
|
||||
void AddSpectList(int *list, int control);
|
||||
@@ -879,6 +889,13 @@ int Compile::LoadEnvelope(FILE *f, const char *fname)
|
||||
fread(buf,1,128,f);
|
||||
fwrite(buf,1,128,f_phdata);
|
||||
|
||||
if(n_envelopes < N_ENVELOPES)
|
||||
{
|
||||
strncpy0(envelope_paths[n_envelopes],fname,sizeof(envelope_paths[0]));
|
||||
memcpy(envelope_dat[n_envelopes],buf,sizeof(envelope_dat[0]));
|
||||
n_envelopes++;
|
||||
}
|
||||
|
||||
return(displ);
|
||||
}
|
||||
|
||||
@@ -971,6 +988,12 @@ int Compile::LoadDataFile(const char *path, int control)
|
||||
type_code = 'E';
|
||||
}
|
||||
else
|
||||
if(id == 0x45564E45)
|
||||
{
|
||||
ix = LoadEnvelope2(f,path);
|
||||
type_code = 'E';
|
||||
}
|
||||
else
|
||||
{
|
||||
Error("File not SPEC or RIFF",path);
|
||||
ix = -1;
|
||||
@@ -979,7 +1002,6 @@ int Compile::LoadDataFile(const char *path, int control)
|
||||
|
||||
if(ix > 0)
|
||||
{
|
||||
// fprintf(f_phcontents,"%c %-15s %4d 0x%.5x %s\n",type_code,current_fname,linenum,ix & 0x7fffff,path);
|
||||
fprintf(f_phcontents,"%c 0x%.5x %s\n",type_code,ix & 0x7fffff,path);
|
||||
}
|
||||
|
||||
@@ -1808,6 +1830,67 @@ void make_envs()
|
||||
}
|
||||
#endif
|
||||
|
||||
int Compile::LoadEnvelope2(FILE *f, const char *fname)
|
||||
{//===================================================
|
||||
int ix;
|
||||
int n;
|
||||
int x, y;
|
||||
int displ;
|
||||
int n_points;
|
||||
char line_buf[128];
|
||||
float env_x[20];
|
||||
float env_y[20];
|
||||
int env_lin[20];
|
||||
unsigned char env[ENV_LEN];
|
||||
|
||||
n_points = 0;
|
||||
fgets(line_buf,sizeof(line_buf),f); // skip first line
|
||||
while(!feof(f))
|
||||
{
|
||||
if(fgets(line_buf,sizeof(line_buf),f) == NULL)
|
||||
break;
|
||||
|
||||
env_lin[n_points] = 0;
|
||||
n = sscanf(line_buf,"%f %f %d",&env_x[n_points],&env_y[n_points],&env_lin[n_points]);
|
||||
if(n >= 2)
|
||||
{
|
||||
env_x[n_points] *= 1.28; // convert range 0-100 to 0-128
|
||||
n_points++;
|
||||
}
|
||||
}
|
||||
env_x[n_points] = env_x[n_points-1];
|
||||
env_y[n_points] = env_y[n_points-1];
|
||||
|
||||
ix = -1;
|
||||
for(x=0; x<ENV_LEN; x++)
|
||||
{
|
||||
if(x > env_x[ix+4])
|
||||
ix++;
|
||||
|
||||
if(n_points > 3)
|
||||
y = (int)(polint(&env_x[ix],&env_y[ix],4,x) * 2.55); // convert to range 0-255
|
||||
else
|
||||
y = (int)(polint(&env_x[ix],&env_y[ix],3,x) * 2.55);
|
||||
if(y < 0) y = 0;
|
||||
if(y > 255) y = 255;
|
||||
env[x] = y;
|
||||
}
|
||||
|
||||
|
||||
if(n_envelopes < N_ENVELOPES)
|
||||
{
|
||||
strncpy0(envelope_paths[n_envelopes],fname,sizeof(envelope_paths[0]));
|
||||
memcpy(envelope_dat[n_envelopes],env,ENV_LEN);
|
||||
n_envelopes++;
|
||||
}
|
||||
|
||||
displ = ftell(f_phdata);
|
||||
fwrite(env,1,128,f_phdata);
|
||||
|
||||
return(displ);
|
||||
}
|
||||
|
||||
|
||||
static int ref_sorter(char **a, char **b)
|
||||
{//======================================
|
||||
|
||||
@@ -2081,6 +2164,7 @@ void Compile::CPhonemeTab(const char *source)
|
||||
make_envs();
|
||||
#endif
|
||||
|
||||
n_envelopes = 0;
|
||||
error_count = 0;
|
||||
memset(markers_used,0,sizeof(markers_used));
|
||||
|
||||
@@ -2192,7 +2276,7 @@ fprintf(f_errors,"Refs %d, Reused %d\n",count_references,duplicate_references);
|
||||
LoadPhData();
|
||||
LoadVoice(voice_name,0);
|
||||
Report();
|
||||
|
||||
DrawEnvelopes();
|
||||
|
||||
report_dict = CompileAllDictionaries();
|
||||
|
||||
|
||||
+1
-1
@@ -35,7 +35,7 @@
|
||||
#include "translate.h"
|
||||
#include "wave.h"
|
||||
|
||||
const char *version_string = "1.28.05 17.Aug.07";
|
||||
const char *version_string = "1.28.07 21.Aug.07";
|
||||
const int version_phdata = 0x012801;
|
||||
|
||||
int option_device_number = -1;
|
||||
|
||||
@@ -506,3 +506,55 @@ void MakeVowelLists(void)
|
||||
LoadVoice(voice_name,0); // reset the original phoneme table
|
||||
delete progress;
|
||||
}
|
||||
|
||||
|
||||
extern int n_envelopes;
|
||||
extern char envelope_paths[][80];
|
||||
extern unsigned char envelope_dat[][128];
|
||||
|
||||
#define HT_ENV 140
|
||||
#define WD_ENV 128*2
|
||||
|
||||
void DrawEnvelopes()
|
||||
{//================
|
||||
int ix_env;
|
||||
int y_base;
|
||||
int x;
|
||||
unsigned char *env;
|
||||
char name[80];
|
||||
|
||||
wxBitmap bitmap(WD_ENV,HT_ENV*n_envelopes);
|
||||
|
||||
// Create a memory DC
|
||||
wxMemoryDC dc;
|
||||
dc.SelectObject(bitmap);
|
||||
dc.SetBrush(*wxWHITE_BRUSH);
|
||||
dc.SetFont(*wxSWISS_FONT);
|
||||
dc.Clear();
|
||||
|
||||
|
||||
for(ix_env=0; ix_env<n_envelopes; ix_env++)
|
||||
{
|
||||
y_base = HT_ENV * ix_env;
|
||||
dc.SetPen(*wxLIGHT_GREY_PEN);
|
||||
dc.DrawLine(0,y_base+0,256,y_base+0);
|
||||
dc.DrawLine(0,y_base+64,256,y_base+64);
|
||||
dc.DrawLine(0,y_base+128,256,y_base+128);
|
||||
dc.DrawLine(128,y_base+0,128,y_base+128);
|
||||
|
||||
dc.SetPen(*wxBLACK_PEN);
|
||||
strncpy0(name,envelope_paths[ix_env],sizeof(name));
|
||||
dc.DrawText(wxString(name,wxConvLocal),1,y_base);
|
||||
|
||||
env = envelope_dat[ix_env];
|
||||
y_base = y_base+128;
|
||||
for(x=0; x<127; x++)
|
||||
{
|
||||
dc.DrawLine(x*2, y_base-env[x]/2, (x+1)*2, y_base-env[x+1]/2);
|
||||
}
|
||||
}
|
||||
|
||||
bitmap.SaveFile(path_phsource+_T("/envelopes.png"),wxBITMAP_TYPE_PNG);
|
||||
|
||||
}
|
||||
|
||||
|
||||
+9
-2
@@ -1020,6 +1020,7 @@ void *wave_test_get_write_buffer()
|
||||
#else
|
||||
// notdef USE_PORTAUDIO
|
||||
|
||||
void wave_flush(void* theHandler) {}
|
||||
void wave_init() {}
|
||||
void* wave_open(char* the_api) {return (void *)1;}
|
||||
size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize) {return theSize;}
|
||||
@@ -1028,11 +1029,17 @@ int wave_is_busy(void* theHandler) {return 0;}
|
||||
void wave_terminate() {}
|
||||
uint32_t wave_get_read_position(void* theHandler) {return 0;}
|
||||
uint32_t wave_get_write_position(void* theHandler) {return 0;}
|
||||
int wave_get_remaining_time(uint32_t sample, uint32_t* time) {return 0;}
|
||||
void wave_flush(void* theHandler) {}
|
||||
typedef int (t_wave_callback)(void);
|
||||
void wave_set_callback_is_output_enabled(t_wave_callback* cb) {}
|
||||
extern void* wave_test_get_write_buffer() {return 0;}
|
||||
extern void* wave_test_get_write_buffer() {return NULL;}
|
||||
|
||||
int wave_get_remaining_time(uint32_t sample, uint32_t* time)
|
||||
{
|
||||
if (!time) return(-1);
|
||||
*time = (uint32_t)0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif // of USE_PORTAUDIO
|
||||
|
||||
|
||||
Reference in New Issue
Block a user