46 #include "EST_cutils.h"
47 #include "EST_wave_utils.h"
48 #include "esps_utils.h"
55 enum EST_write_status put_esps(
const char *filename,
const char *style,
float *t,
float *a,
56 int *v,
float fsize,
float rate,
int num_points)
64 if ((fd=fopen(filename,
"wb")) == NULL)
66 fprintf(stderr,
"ESPS file: cannot open file \"%s\" for writing\n",
68 return misc_write_error;
71 hdr = make_esps_hdr();
73 if (streq(style,
"F0"))
75 add_field(hdr,
"F0",ESPS_DOUBLE,1);
76 add_field(hdr,
"prob_voice",ESPS_DOUBLE,1);
77 add_field(hdr,
"rms",ESPS_DOUBLE,1);
78 add_field(hdr,
"ac_peak",ESPS_DOUBLE,1);
79 add_field(hdr,
"k1",ESPS_DOUBLE,1);
80 add_fea_d(hdr,
"record_freq",0,(
double)rate);
81 add_fea_d(hdr,
"frame_duration",0,(
double)fsize);
82 add_fea_d(hdr,
"start_time",0,(
double)0);
83 add_fea_special(hdr,ESPS_FEA_COMMAND,
84 "EDST F0 written as ESPS FEA_SD.\n");
85 write_esps_hdr(hdr,fd);
86 rec = new_esps_rec(hdr);
87 for (i = 0; i < num_points; i++)
89 set_field_d(rec,0,0,a[i]);
90 set_field_d(rec,1,0,(
float)v[i]);
91 set_field_d(rec,2,0,0.5);
92 set_field_d(rec,3,0,0.5);
93 set_field_d(rec,4,0,0.5);
94 write_esps_rec(rec,hdr,fd);
100 add_field(hdr,
"Track",ESPS_DOUBLE,1);
101 add_fea_d(hdr,
"window_duration",0,(
double)0.049);
102 add_fea_d(hdr,
"frame_duration",0,(
double)fsize);
103 add_fea_d(hdr,
"record_freq",0,(
double)rate);
104 add_fea_d(hdr,
"start_time",0,(
double)0);
105 add_fea_special(hdr,ESPS_FEA_COMMAND,
106 "EDST Track written as ESPS FEA_SD.\n");
107 write_esps_hdr(hdr,fd);
108 rec = new_esps_rec(hdr);
109 for (i = 0; i < num_points; i++)
111 set_field_d(rec,0,0,a[i]);
112 write_esps_rec(rec,hdr,fd);
114 delete_esps_rec(rec);
117 delete_esps_hdr(hdr);
123 enum EST_write_status put_track_esps(
const char *filename,
char **f_names,
124 float **a,
float fsize,
float rate,
125 int order,
int num_points,
short fixed)
132 hdr = make_esps_hdr();
134 if ((fd = fopen(filename,
"wb")) == NULL)
136 fprintf(stderr,
"ESPS file: cannot open file \"%s\" for writing\n",
138 return misc_write_error;
141 for (i = 0; i < order; ++i)
142 add_field(hdr,f_names[i],ESPS_DOUBLE,1);
144 if (!streq(f_names[0],
"F0"))
146 add_fea_s(hdr,
"lpccep_order",0,(
short)order);
147 add_fea_i(hdr,
"step",0,(
int)fsize);
148 add_fea_d(hdr,
"window_duration",0,(
double)0.049);
149 add_fea_i(hdr,
"start",0,(
int)1);
150 add_fea_f(hdr,
"warping_param",0,(
float)0.0);
151 add_fea_s(hdr,
"window_type",0,(
short)2);
153 add_fea_d(hdr,
"record_freq",0,(
double)rate);
154 add_fea_d(hdr,
"frame_duration",0,(
double)fsize);
155 add_fea_d(hdr,
"start_time",0,(
double)0.0);
157 add_fea_s(hdr,
"est_variable_frame", 0, (
short)1);
159 write_esps_hdr(hdr,fd);
161 rec = new_esps_rec(hdr);
162 for (i = 0; i < num_points; ++i)
164 for (j = 0; j < order; ++j)
165 set_field_d(rec, j, 0,(
double)a[i][j]);
166 write_esps_rec(rec,hdr,fd);
169 delete_esps_hdr(hdr);
174 enum EST_read_status get_esps(
const char *filename,
char *style,
175 float **t,
float **a,
int **v,
float *fsize,
int *num_points)
179 enum EST_read_status rv;
180 int ff0, fprob_voice, i;
187 if ((fd = fopen(filename,
"rb")) == NULL)
189 fprintf(stderr,
"Can't open esps file %s for reading\n", filename);
190 return misc_read_error;
193 if ((rv=read_esps_hdr(&hdr,fd)) != format_ok)
198 ta = walloc(
float,hdr->num_records);
199 tv = walloc(
int,hdr->num_records);
201 for (ff0=fprob_voice=-1,i=0; i < hdr->num_fields; i++)
202 if (streq(
"F0",hdr->field_name[i]))
204 else if (streq(
"prob_voice",hdr->field_name[i]))
207 rec = new_esps_rec(hdr);
208 for (i=0; i < hdr->num_records; i++)
210 if (read_esps_rec(rec,hdr,fd) == EOF)
212 fprintf(stderr,
"ESPS file: unexpected end of file when reading record %d\n", i);
213 delete_esps_rec(rec);
214 delete_esps_hdr(hdr);
216 return misc_read_error;
220 switch(rec->field[0]->type)
223 ta[i] = get_field_d(rec,0,0);
break;
225 ta[i] = get_field_f(rec,0,0);
break;
227 fprintf(stderr,
"ESPS file: doesn't seem to be F0 file\n");
228 delete_esps_rec(rec);
229 delete_esps_hdr(hdr);
231 return misc_read_error;
235 ta[i] = get_field_d(rec,ff0,0);
236 if (fprob_voice == -1)
239 tv[i] = ((get_field_d(rec,fprob_voice,0) < 0.5) ? 0 : 1);
242 *num_points = hdr->num_records;
245 if (fea_value_d(
"record_freq",0,hdr,&d) != 0)
252 strcpy(style,
"track");
253 delete_esps_rec(rec);
254 delete_esps_hdr(hdr);
260 enum EST_read_status get_track_esps(
const char *filename,
char ***fields,
261 float ***a,
float *fsize,
262 int *num_points,
int *num_fields,
268 int i, j, order, num_recs;
269 enum EST_read_status rv;
274 if ((fd = fopen(filename,
"rb")) == NULL)
275 return misc_read_error;
277 if ((rv=read_esps_hdr(&hdr,fd)) != format_ok)
282 num_recs = hdr->num_records;
283 order = hdr->num_fields;
285 ta = walloc(
float *,num_recs);
286 tf = walloc(
char *,order);
287 for (j = 0; j < num_recs; ++j)
288 ta[j] = walloc(
float,order);
291 rec = new_esps_rec(hdr);
295 *fixed = fea_value_s(
"est_variable_frame", 0, hdr, &v) != 0;
298 for (j = 0; j < hdr->num_records; j++)
300 if (read_esps_rec(rec,hdr,fd) == EOF)
302 fprintf(stderr,
"ESPS file: unexpected end of file when reading record %d\n", j);
303 delete_esps_rec(rec);
304 delete_esps_hdr(hdr);
306 for (i = 0; i < order; ++i)
307 switch (rec->field[i]->type)
310 ta[j][i]=get_field_d(rec,i,0);
break;
312 ta[j][i]=get_field_f(rec,i,0);
break;
314 ta[j][i]=(float)get_field_i(rec,i,0);
break;
316 ta[j][i]=(float)get_field_s(rec,i,0);
break;
318 ta[j][i]=(float)get_field_c(rec,i,0);
break;
320 ta[j][i]=(float)get_field_s(rec,i,0);
break;
322 fprintf(stderr,
"ESPS file: unsupported type in record %d\n",
323 rec->field[i]->type);
324 delete_esps_rec(rec);
325 delete_esps_hdr(hdr);
327 return misc_read_error;
333 for (j = 0; j < order; ++j)
334 tf[j] = wstrdup(hdr->field_name[j]);
338 *num_points = num_recs;
342 if (fea_value_d(
"record_freq",0,hdr,&d) != 0)
347 delete_esps_rec(rec);
348 delete_esps_hdr(hdr);