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) for (i = 0; i < pls->n_phones; ++i) acmod_activate_hmm(acmod, (hmm_t *)&pls->phones[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. */ pls->best_score = evaluate_hmms(pls, senscr, frame_idx); /* Prune phone HMMs. */ prune_hmms(pls, frame_idx); /* Do phone transitions. */ phone_transition(pls, frame_idx); return 0; }
static int state_align_search_step(ps_search_t *search, int frame_idx) { state_align_search_t *sas = (state_align_search_t *)search; acmod_t *acmod = ps_search_acmod(search); int16 const *senscr; int i; /* Calculate senone scores. */ for (i = 0; i < sas->n_phones; ++i) acmod_activate_hmm(acmod, sas->hmms + i); senscr = acmod_score(acmod, &frame_idx); /* Renormalize here if needed. */ /* FIXME: Make sure to (unit-)test this!!! */ if ((sas->best_score - 0x300000) WORSE_THAN WORST_SCORE) { E_INFO("Renormalizing Scores at frame %d, best score %d\n", frame_idx, sas->best_score); renormalize_hmms(sas, frame_idx, sas->best_score); } /* Viterbi step. */ sas->best_score = evaluate_hmms(sas, senscr, frame_idx); prune_hmms(sas, frame_idx); /* Transition out of non-emitting states. */ phone_transition(sas, frame_idx); /* Generate new tokens from best path results. */ record_transitions(sas, frame_idx); /* Update frame counter */ sas->frame = frame_idx; return 0; }