static void compute_fwdflat_sen_active(ngram_search_t *ngs, int frame_idx) { int32 i, w; int32 *awl; root_chan_t *rhmm; chan_t *hmm; acmod_clear_active(ps_search_acmod(ngs)); i = ngs->n_active_word[frame_idx & 0x1]; awl = ngs->active_word_list[frame_idx & 0x1]; for (w = *(awl++); i > 0; --i, w = *(awl++)) { rhmm = (root_chan_t *)ngs->word_chan[w]; if (hmm_frame(&rhmm->hmm) == frame_idx) { acmod_activate_hmm(ps_search_acmod(ngs), &rhmm->hmm); } for (hmm = rhmm->next; hmm; hmm = hmm->next) { if (hmm_frame(&hmm->hmm) == frame_idx) { acmod_activate_hmm(ps_search_acmod(ngs), &hmm->hmm); } } } }
static int phone_loop_search_step(ps_search_t *search, int frame_idx) { phone_loop_search_t *pls = (phone_loop_search_t *)search; acmod_t *acmod = ps_search_acmod(search); int16 const *senscr; int i; /* All CI senones are active all the time. */ if (!ps_search_acmod(pls)->compallsen) { acmod_clear_active(ps_search_acmod(pls)); for (i = 0; i < pls->n_phones; ++i) acmod_activate_hmm(acmod, (hmm_t *)&pls->hmms[i]); } /* Calculate senone scores for current frame. */ senscr = acmod_score(acmod, &frame_idx); /* Renormalize, if necessary. */ if (pls->best_score + (2 * pls->beam) WORSE_THAN WORST_SCORE) { E_INFO("Renormalizing Scores at frame %d, best score %d\n", frame_idx, pls->best_score); renormalize_hmms(pls, frame_idx, pls->best_score); } /* Evaluate phone HMMs for current frame. */ evaluate_hmms(pls, senscr, frame_idx); /* Store hmm scores for senone penaly calculation */ store_scores(pls, frame_idx); /* Prune phone HMMs. */ prune_hmms(pls, frame_idx); /* Do phone transitions. */ phone_transition(pls, frame_idx); return 0; }