static int acmod_read_senfh_header(acmod_t *acmod) { char **name, **val; int32 swap; int i; if (bio_readhdr(acmod->insenfh, &name, &val, &swap) < 0) goto error_out; for (i = 0; name[i] != NULL; ++i) { if (!strcmp(name[i], "n_sen")) { if (atoi(val[i]) != bin_mdef_n_sen(acmod->mdef)) { E_ERROR("Number of senones in senone file (%d) does not " "match mdef (%d)\n", atoi(val[i]), bin_mdef_n_sen(acmod->mdef)); goto error_out; } } if (!strcmp(name[i], "logbase")) { if (fabs(atof_c(val[i]) - logmath_get_base(acmod->lmath)) > 0.001) { E_ERROR("Logbase in senone file (%f) does not match acmod " "(%f)\n", atof_c(val[i]), logmath_get_base(acmod->lmath)); goto error_out; } } } acmod->insen_swap = swap; bio_hdrarg_free(name, val); return 0; error_out: bio_hdrarg_free(name, val); return -1; }
acmod_t * acmod_copy(acmod_t *other) { acmod_t *acmod; acmod = ckd_calloc(1, sizeof(*acmod)); acmod->refcount = 1; acmod->config = cmd_ln_retain(other->config); acmod->lmath = logmath_retain(other->lmath); acmod->mdef = bin_mdef_retain(other->mdef); acmod->tmat = tmat_retain(other->tmat); acmod->mgau = ps_mgau_copy(other->mgau); acmod->fb = featbuf_retain(other->fb); acmod->fcb = other->fcb; /* Implicitly retained with fb, I think */ /* Senone computation stuff. */ acmod->senone_scores = ckd_calloc(bin_mdef_n_sen(acmod->mdef), sizeof(*acmod->senone_scores)); acmod->senone_active_vec = bitvec_alloc(bin_mdef_n_sen(acmod->mdef)); acmod->senone_active = ckd_calloc(bin_mdef_n_sen(acmod->mdef), sizeof(*acmod->senone_active)); acmod->log_zero = logmath_get_zero(acmod->lmath); acmod->compallsen = cmd_ln_boolean_r(acmod->config, "-compallsen"); acmod->feat_buf = feat_array_alloc(acmod->fcb, 1); return acmod; }
acmod_t * acmod_init(cmd_ln_t *config, logmath_t *lmath, featbuf_t *fb) { acmod_t *acmod; acmod = ckd_calloc(1, sizeof(*acmod)); acmod->refcount = 1; acmod->config = cmd_ln_retain(config); acmod->lmath = logmath_retain(lmath); acmod->fb = featbuf_retain(fb); acmod->fcb = featbuf_get_fcb(acmod->fb); /* Load acoustic model parameters. */ if (acmod_init_am(acmod) < 0) goto error_out; /* Senone computation stuff. */ acmod->senone_scores = ckd_calloc(bin_mdef_n_sen(acmod->mdef), sizeof(*acmod->senone_scores)); acmod->senone_active_vec = bitvec_alloc(bin_mdef_n_sen(acmod->mdef)); acmod->senone_active = ckd_calloc(bin_mdef_n_sen(acmod->mdef), sizeof(*acmod->senone_active)); acmod->log_zero = logmath_get_zero(acmod->lmath); acmod->compallsen = cmd_ln_boolean_r(config, "-compallsen"); acmod->feat_buf = feat_array_alloc(acmod->fcb, 1); return acmod; error_out: acmod_free(acmod); return NULL; }
/** * Internal version, used for reading previous frames in acmod_score() */ static int acmod_read_scores_internal(acmod_t *acmod) { FILE *senfh = acmod->insenfh; int16 n_active; size_t rv; if (acmod->n_feat_frame == acmod->n_feat_alloc) { if (acmod->grow_feat) acmod_grow_feat_buf(acmod, acmod->n_feat_alloc * 2); else return 0; } if (senfh == NULL) return -1; if ((rv = fread(&n_active, 2, 1, senfh)) != 1) goto error_out; acmod->n_senone_active = n_active; if (acmod->n_senone_active == bin_mdef_n_sen(acmod->mdef)) { if ((rv = fread(acmod->senone_scores, 2, acmod->n_senone_active, senfh)) != acmod->n_senone_active) goto error_out; } else { int i, n; if ((rv = fread(acmod->senone_active, 1, acmod->n_senone_active, senfh)) != acmod->n_senone_active) goto error_out; for (i = 0, n = 0; i < acmod->n_senone_active; ++i) { int j, sen = n + acmod->senone_active[i]; for (j = n + 1; j < sen; ++j) acmod->senone_scores[j] = SENSCR_DUMMY; if ((rv = fread(acmod->senone_scores + sen, 2, 1, senfh)) != 1) goto error_out; n = sen; } n++; while (n < bin_mdef_n_sen(acmod->mdef)) acmod->senone_scores[n++] = SENSCR_DUMMY; } return 1; error_out: if (ferror(senfh)) { E_ERROR_SYSTEM("Failed to read frame from senone file"); return -1; } return 0; }
int acmod_best_score(acmod_t *acmod, int *out_best_senid) { int i, best; best = SENSCR_DUMMY; if (acmod->compallsen) { for (i = 0; i < bin_mdef_n_sen(acmod->mdef); ++i) { if (acmod->senone_scores[i] < best) { best = acmod->senone_scores[i]; *out_best_senid = i; } } } else { int16 *senscr; senscr = acmod->senone_scores; for (i = 0; i < acmod->n_senone_active; ++i) { senscr += acmod->senone_active[i]; if (*senscr < best) { best = *senscr; *out_best_senid = i; } } } return best; }
void acmod_clear_active(acmod_t *acmod) { if (acmod->compallsen) return; bitvec_clear_all(acmod->senone_active_vec, bin_mdef_n_sen(acmod->mdef)); acmod->n_senone_active = 0; }
int32 acmod_flags2list(acmod_t *acmod) { int32 w, l, n, b, total_dists, total_words, extra_bits; bitvec_t *flagptr; total_dists = bin_mdef_n_sen(acmod->mdef); if (acmod->compallsen) { acmod->n_senone_active = total_dists; return total_dists; } total_words = total_dists / BITVEC_BITS; extra_bits = total_dists % BITVEC_BITS; w = n = l = 0; for (flagptr = acmod->senone_active_vec; w < total_words; ++w, ++flagptr) { if (*flagptr == 0) continue; for (b = 0; b < BITVEC_BITS; ++b) { if (*flagptr & (1UL << b)) { int32 sen = w * BITVEC_BITS + b; int32 delta = sen - l; /* Handle excessive deltas "lossily" by adding a few extra senones to bridge the gap. */ while (delta > 255) { acmod->senone_active[n++] = 255; delta -= 255; } acmod->senone_active[n++] = delta; l = sen; } } } for (b = 0; b < extra_bits; ++b) { if (*flagptr & (1UL << b)) { int32 sen = w * BITVEC_BITS + b; int32 delta = sen - l; /* Handle excessive deltas "lossily" by adding a few extra senones to bridge the gap. */ while (delta > 255) { acmod->senone_active[n++] = 255; delta -= 255; } acmod->senone_active[n++] = delta; l = sen; } } acmod->n_senone_active = n; E_DEBUG(1, ("acmod_flags2list: %d active in frame %d\n", acmod->n_senone_active, acmod->output_frame)); return n; }
int acmod_write_senfh_header(acmod_t *acmod, FILE *logfh) { char nsenstr[64], logbasestr[64]; sprintf(nsenstr, "%d", bin_mdef_n_sen(acmod->mdef)); sprintf(logbasestr, "%f", logmath_get_base(acmod->lmath)); return bio_writehdr(logfh, "version", "0.1", "mdef_file", cmd_ln_str_r(acmod->config, "-mdef"), "n_sen", nsenstr, "logbase", logbasestr, NULL); }
int acmod_write_scores(acmod_t *acmod, int n_active, uint8 const *active, int16 const *senscr, FILE *senfh) { int16 n_active2; /* Uncompressed frame format: * * (2 bytes) n_active: Number of active senones * If all senones active: * (n_active * 2 bytes) scores of active senones * * Otherwise: * (2 bytes) n_active: Number of active senones * (n_active bytes) deltas to active senones * (n_active * 2 bytes) scores of active senones */ n_active2 = n_active; if (fwrite(&n_active2, 2, 1, senfh) != 1) goto error_out; if (n_active == bin_mdef_n_sen(acmod->mdef)) { if (fwrite(senscr, 2, n_active, senfh) != n_active) goto error_out; } else { int i, n; if (fwrite(active, 1, n_active, senfh) != n_active) goto error_out; for (i = n = 0; i < n_active; ++i) { n += active[i]; if (fwrite(senscr + n, 2, 1, senfh) != 1) goto error_out; } } return 0; error_out: E_ERROR_SYSTEM("Failed to write frame to senone file"); return -1; }
acmod_t * acmod_init(cmd_ln_t *config, logmath_t *lmath, fe_t *fe, feat_t *fcb) { acmod_t *acmod; char const *featparams; acmod = ckd_calloc(1, sizeof(*acmod)); acmod->config = cmd_ln_retain(config); acmod->lmath = lmath; acmod->state = ACMOD_IDLE; /* Look for feat.params in acoustic model dir. */ if ((featparams = cmd_ln_str_r(acmod->config, "-featparams"))) { if (NULL != cmd_ln_parse_file_r(acmod->config, feat_defn, featparams, FALSE)) E_INFO("Parsed model-specific feature parameters from %s\n", featparams); } /* Initialize feature computation. */ if (fe) { if (acmod_fe_mismatch(acmod, fe)) goto error_out; fe_retain(fe); acmod->fe = fe; } else { /* Initialize a new front end. */ acmod->fe = fe_init_auto_r(config); if (acmod->fe == NULL) goto error_out; if (acmod_fe_mismatch(acmod, acmod->fe)) goto error_out; } if (fcb) { if (acmod_feat_mismatch(acmod, fcb)) goto error_out; feat_retain(fcb); acmod->fcb = fcb; } else { /* Initialize a new fcb. */ if (acmod_init_feat(acmod) < 0) goto error_out; } /* Load acoustic model parameters. */ if (acmod_init_am(acmod) < 0) goto error_out; /* The MFCC buffer needs to be at least as large as the dynamic * feature window. */ acmod->n_mfc_alloc = acmod->fcb->window_size * 2 + 1; acmod->mfc_buf = (mfcc_t **) ckd_calloc_2d(acmod->n_mfc_alloc, acmod->fcb->cepsize, sizeof(**acmod->mfc_buf)); /* Feature buffer has to be at least as large as MFCC buffer. */ acmod->n_feat_alloc = acmod->n_mfc_alloc + cmd_ln_int32_r(config, "-pl_window"); acmod->feat_buf = feat_array_alloc(acmod->fcb, acmod->n_feat_alloc); acmod->framepos = ckd_calloc(acmod->n_feat_alloc, sizeof(*acmod->framepos)); acmod->utt_start_frame = 0; /* Senone computation stuff. */ acmod->senone_scores = ckd_calloc(bin_mdef_n_sen(acmod->mdef), sizeof(*acmod->senone_scores)); acmod->senone_active_vec = bitvec_alloc(bin_mdef_n_sen(acmod->mdef)); acmod->senone_active = ckd_calloc(bin_mdef_n_sen(acmod->mdef), sizeof(*acmod->senone_active)); acmod->log_zero = logmath_get_zero(acmod->lmath); acmod->compallsen = cmd_ln_boolean_r(config, "-compallsen"); return acmod; error_out: acmod_free(acmod); return NULL; }