int feat_set_subvecs(feat_t *fcb, int32 **subvecs) { int32 **sv; int32 n_sv, n_dim, i; if (subvecs == 0) { subvecs_free(fcb->subvecs); ckd_free(fcb->sv_buf); ckd_free(fcb->sv_len); fcb->n_sv = 0; fcb->subvecs = 0; fcb->sv_len = 0; fcb->sv_buf = 0; fcb->sv_dim = 0; return 0; } if (fcb->n_stream != 1) { E_ERROR("Subvector specifications require single-stream features!"); return -1; } n_sv = 0; n_dim = 0; for (sv = subvecs; sv && *sv; ++sv) { int32 *d; for (d = *sv; d && *d != -1; ++d) { ++n_dim; } ++n_sv; } if (n_dim > (int32)feat_dimension(fcb)) { E_ERROR("Total dimensionality of subvector specification %d " "> feature dimensionality %d\n", n_dim, feat_dimension(fcb)); return -1; } fcb->n_sv = n_sv; fcb->subvecs = subvecs; fcb->sv_len = (uint32*)ckd_calloc(n_sv, sizeof(*fcb->sv_len)); fcb->sv_buf = (mfcc_t*)ckd_calloc(n_dim, sizeof(*fcb->sv_buf)); fcb->sv_dim = n_dim; for (i = 0; i < n_sv; ++i) { int32 *d; for (d = subvecs[i]; d && *d != -1; ++d) { ++fcb->sv_len[i]; } } return 0; }
void acmod_grow_feat_buf(acmod_t *acmod, int nfr) { mfcc_t ***new_feat_buf; new_feat_buf = feat_array_alloc(acmod->fcb, nfr); if (acmod->n_feat_frame || acmod->grow_feat) { memcpy(new_feat_buf[0][0], acmod->feat_buf[0][0], (acmod->n_feat_alloc * feat_dimension(acmod->fcb) * sizeof(***acmod->feat_buf))); } feat_array_free(acmod->feat_buf); acmod->framepos = ckd_realloc(acmod->framepos, nfr * sizeof(*acmod->framepos)); acmod->feat_buf = new_feat_buf; acmod->n_feat_alloc = nfr; }
void feat_lda_transform(feat_t *fcb, mfcc_t ***inout_feat, uint32 nfr) { mfcc_t *tmp; uint32 i, j, k; tmp = ckd_calloc(fcb->stream_len[0], sizeof(mfcc_t)); for (i = 0; i < nfr; ++i) { /* Do the matrix multiplication inline here since fcb->lda * is transposed (eigenvectors in rows not columns). */ /* FIXME: In the future we ought to use the BLAS. */ memset(tmp, 0, sizeof(mfcc_t) * fcb->stream_len[0]); for (j = 0; j < feat_dimension(fcb); ++j) { for (k = 0; k < fcb->stream_len[0]; ++k) { tmp[j] += MFCCMUL(inout_feat[i][0][k], fcb->lda[0][j][k]); } } memcpy(inout_feat[i][0], tmp, fcb->stream_len[0] * sizeof(mfcc_t)); } ckd_free(tmp); }
int main(int argc, char *argv[]) { lexicon_t *lex; model_def_t *omdef; model_def_t *dmdef; feat_t *feat; uint32 n_stream, blksize; uint32 *veclen; uint32 ts_off; uint32 ts_cnt; FILE *fp; if (main_initialize(argc, argv, &lex, &omdef, &dmdef, &feat) != S3_SUCCESS) { return -1; } n_stream = feat_dimension1(feat); veclen = feat_stream_lengths(feat); blksize = feat_dimension(feat); if (strcmp(cmd_ln_str("-gthobj"), "state") == 0) { ts_off = cmd_ln_int32("-tsoff"); if (cmd_ln_str("-tscnt") == NULL) { ts_cnt = omdef->n_tied_state - ts_off; } else { ts_cnt = cmd_ln_int32("-tscnt"); } if (ts_off + ts_cnt > omdef->n_tied_state) { E_FATAL("Too many tied states specified\n"); } n_tot_frame = 0; ptmr_reset(&all_timer); ptmr_reset(&km_timer); ptmr_reset(&var_timer); ptmr_reset(&em_timer); ptmr_start(&all_timer); if (init_state(cmd_ln_str("-segdmpfn"), cmd_ln_str("-segidxfn"), cmd_ln_int32("-ndensity"), n_stream, veclen, blksize, cmd_ln_int32("-reest"), cmd_ln_str("-mixwfn"), cmd_ln_str("-meanfn"), cmd_ln_str("-varfn"), ts_off, ts_cnt, omdef->n_tied_state, (dmdef != NULL ? dmdef->n_tied_state : omdef->n_tied_state)) != S3_SUCCESS) { E_ERROR("Unable to train [%u %u]\n", ts_off, ts_off+ts_cnt-1); } ptmr_stop(&all_timer); if (n_tot_frame > 0) { E_INFO("TOTALS:"); E_INFOCONT(" km %4.3fx %4.3e", km_timer.t_cpu / (n_tot_frame * 0.01), (km_timer.t_cpu > 0 ? km_timer.t_elapsed / km_timer.t_cpu : 0.0)); E_INFOCONT(" var %4.3fx %4.3e", var_timer.t_cpu / (n_tot_frame * 0.01), (var_timer.t_cpu > 0 ? var_timer.t_elapsed / var_timer.t_cpu : 0.0)); E_INFOCONT(" em %4.3fx %4.3e", em_timer.t_cpu / (n_tot_frame * 0.01), (em_timer.t_cpu > 0 ? em_timer.t_elapsed / em_timer.t_cpu : 0.0)); E_INFOCONT(" all %4.3fx %4.3e", all_timer.t_cpu / (n_tot_frame * 0.01), (all_timer.t_cpu > 0 ? all_timer.t_elapsed / all_timer.t_cpu : 0.0)); E_INFOCONT("\n"); } if (cmd_ln_str("-tsrngfn") != NULL) { fp = fopen(cmd_ln_str("-tsrngfn"), "w"); if (fp == NULL) { E_FATAL_SYSTEM("Unable to open %s for reading", cmd_ln_str("-tsrngfn")); } fprintf(fp, "%d %d\n", ts_off, ts_cnt); } else if (ts_cnt != omdef->n_tied_state) { E_WARN("Subset of tied states specified, but no -tsrngfn arg"); } } else if (strcmp(cmd_ln_str("-gthobj"), "single") == 0) { n_tot_frame = 0; ptmr_reset(&all_timer); ptmr_reset(&km_timer); ptmr_reset(&var_timer); ptmr_reset(&em_timer); ptmr_start(&all_timer); if (init_state(cmd_ln_str("-segdmpfn"), NULL, /* No index -> single class dump file */ cmd_ln_int32("-ndensity"), n_stream, veclen, blksize, cmd_ln_int32("-reest"), cmd_ln_str("-mixwfn"), cmd_ln_str("-meanfn"), cmd_ln_str("-varfn"), 0, 1, 1, 1) != S3_SUCCESS) { E_ERROR("Unable to train\n"); } ptmr_stop(&all_timer); if (n_tot_frame > 0) { E_INFO("TOTALS:"); E_INFOCONT(" km %4.3fx %4.3e", km_timer.t_cpu / (n_tot_frame * 0.01), (km_timer.t_cpu > 0 ? km_timer.t_elapsed / km_timer.t_cpu : 0.0)); E_INFOCONT(" var %4.3fx %4.3e", var_timer.t_cpu / (n_tot_frame * 0.01), (var_timer.t_cpu > 0 ? var_timer.t_elapsed / var_timer.t_cpu : 0.0)); E_INFOCONT(" em %4.3fx %4.3e", em_timer.t_cpu / (n_tot_frame * 0.01), (em_timer.t_cpu > 0 ? em_timer.t_elapsed / em_timer.t_cpu : 0.0)); E_INFOCONT(" all %4.3fx %4.3e", all_timer.t_cpu / (n_tot_frame * 0.01), (all_timer.t_cpu > 0 ? all_timer.t_elapsed / all_timer.t_cpu : 0.0)); E_INFOCONT("\n"); } } return 0; }