int main(int argc, char **argv) { cst_wave *in, *out; cst_val *files; cst_features *args; int i,j; int w, a, t; args = new_features(); files = cst_args(argv,argc, "usage: dcoffset_wave OPTIONS\n" "Subtract window average from waveform\n" "-i <string> Input waveform\n" "-o <string> Output waveform\n" "-w <int> Window size (in samples)\n", args); w = flite_get_param_int(args,"-w",20); in = new_wave(); cst_wave_load_riff(in,flite_get_param_string(args,"-i","-")); out = copy_wave(in); for (i=0; i<=out->num_samples; i++) { for (t=a=0,j=i-w/2; j < i+w/2; j++) { if ((j > 0) && (j < out->num_samples)) { t += 1; a+=in->samples[j]; } } /* printf("%d %d %d %d %d\n",i,out->samples[i],a/t,t,out->samples[i]-a/t); */ out->samples[i] -= a/t; } cst_wave_save_riff(out,flite_get_param_string(args,"-o","-")); return 0; }
cst_voice *cst_cg_load_voice(const char *filename, const cst_lang *lang_table) { cst_voice *vox; cst_lexicon *lex = NULL; int i, end_of_features; const char *language; const char *xname; cst_cg_db *cg_db; char* fname; char* fval; cst_file vd; vd = cst_fopen(filename,CST_OPEN_READ | CST_OPEN_BINARY); if (vd == NULL) { cst_errmsg("Error load voice: can't open file %s\n",filename); return NULL; } if (cst_cg_read_header(vd) != 0) { cst_errmsg("Error load voice: %s does not have expected header\n",filename); cst_fclose(vd); return NULL; } vox = new_voice(); /* Read voice features from the external file */ /* Read until the feature is "end_of_features" */ fname=""; end_of_features = 0; while (end_of_features == 0) { cst_read_voice_feature(vd,&fname, &fval); if (cst_streq(fname,"end_of_features")) end_of_features = 1; else { xname = feat_own_string(vox->features,fname); flite_feat_set_string(vox->features,xname, fval); } cst_free(fname); cst_free(fval); } /* Load up cg_db from external file */ cg_db = cst_cg_load_db(vox,vd); if (cg_db == NULL) { cst_fclose(vd); return NULL; } /* Use the language feature to initialize the correct voice */ language = flite_get_param_string(vox->features, "language", ""); /* Search Lang table for lang_init() and lex_init(); */ for (i=0; lang_table[i].lang; i++) { if (cst_streq(language,lang_table[i].lang)) { (lang_table[i].lang_init)(vox); lex = (lang_table[i].lex_init)(); break; } } if (lex == NULL) { /* Language is not supported */ /* Delete allocated memory in cg_db */ cst_cg_free_db(vd,cg_db); cst_fclose(vd); cst_errmsg("Error load voice: lang/lex %s not supported in this binary\n",language); return NULL; } /* Things that weren't filled in already. */ vox->name = cg_db->name; flite_feat_set_string(vox->features,"name",cg_db->name); flite_feat_set_string(vox->features,"pathname",filename); flite_feat_set(vox->features,"lexicon",lexicon_val(lex)); flite_feat_set(vox->features,"postlex_func",uttfunc_val(lex->postlex)); /* No standard segment durations are needed as its done at the */ /* HMM state level */ flite_feat_set_string(vox->features,"no_segment_duration_model","1"); flite_feat_set_string(vox->features,"no_f0_target_model","1"); /* Waveform synthesis */ flite_feat_set(vox->features,"wave_synth_func",uttfunc_val(&cg_synth)); flite_feat_set(vox->features,"cg_db",cg_db_val(cg_db)); flite_feat_set_int(vox->features,"sample_rate",cg_db->sample_rate); cst_fclose(vd); return vox; }