static void prune_hmms(phone_loop_search_t *pls, int frame_idx) { int32 thresh = pls->best_score + pls->beam; int nf = frame_idx + 1; int i; /* Check all phones to see if they remain active in the next frame. */ for (i = 0; i < pls->n_phones; ++i) { hmm_t *hmm = (hmm_t *)&pls->phones[i]; if (hmm_frame(hmm) < frame_idx) continue; /* Retain if score better than threshold. */ if (hmm_bestscore(hmm) BETTER_THAN thresh) { hmm_frame(hmm) = nf; } else hmm_clear_scores(hmm); } }
static void store_scores(phone_loop_search_t *pls, int frame_idx) { int i, j, itr; for (i = 0; i < pls->n_phones; ++i) { hmm_t *hmm = (hmm_t *)&pls->hmms[i]; pls->pen_buf[pls->pen_buf_ptr][i] = (hmm_bestscore(hmm) - pls->best_score) * pls->penalty_weight; } pls->pen_buf_ptr++; pls->pen_buf_ptr = pls->pen_buf_ptr % pls->window; //update penalties for (i = 0; i < pls->n_phones; ++i) { pls->penalties[i] = WORST_SCORE; for (j = 0, itr = pls->pen_buf_ptr + 1; j < pls->window; j++, itr++) { itr = itr % pls->window; if (pls->pen_buf[itr][i] > pls->penalties[i]) pls->penalties[i] = pls->pen_buf[itr][i]; } } }
static int32 hmm_vit_eval_3st_lr_mpx(hmm_t * hmm) { uint8 const *tp = hmm->ctx->tp[hmm->tmatid][0]; int16 const *senscore = hmm->ctx->senscore; uint16 * const *sseq = hmm->ctx->sseq; uint16 *ssid = hmm->senid; int32 bestScore; int32 s3, s2, s1, s0, t2, t1, t0; /* Don't propagate WORST_SCORE */ t2 = INT_MIN; /* Not used unless skipstate is true */ if (ssid[2] == BAD_SSID) s2 = t1 = WORST_SCORE; else { s2 = hmm_score(hmm, 2) + mpx_senscr(2); t1 = s2 + hmm_tprob_3st(2, 3); } if (ssid[1] == BAD_SSID) s1 = t2 = WORST_SCORE; else { s1 = hmm_score(hmm, 1) + mpx_senscr(1); if (hmm_tprob_3st(1,3) BETTER_THAN TMAT_WORST_SCORE) t2 = s1 + hmm_tprob_3st(1, 3); } if (t1 BETTER_THAN t2) { s3 = t1; hmm_out_history(hmm) = hmm_history(hmm, 2); } else { s3 = t2; hmm_out_history(hmm) = hmm_history(hmm, 1); } if (s3 WORSE_THAN WORST_SCORE) s3 = WORST_SCORE; hmm_out_score(hmm) = s3; bestScore = s3; /* State 0 is always active */ s0 = hmm_in_score(hmm) + mpx_senscr(0); /* Don't propagate WORST_SCORE */ t0 = t1 = WORST_SCORE; if (s2 != WORST_SCORE) t0 = s2 + hmm_tprob_3st(2, 2); if (s1 != WORST_SCORE) t1 = s1 + hmm_tprob_3st(1, 2); if (hmm_tprob_3st(0,2) BETTER_THAN TMAT_WORST_SCORE) t2 = s0 + hmm_tprob_3st(0, 2); if (t0 BETTER_THAN t1) { if (t2 BETTER_THAN t0) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); ssid[2] = ssid[0]; } else s2 = t0; } else { if (t2 BETTER_THAN t1) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); ssid[2] = ssid[0]; } else { s2 = t1; hmm_history(hmm, 2) = hmm_history(hmm, 1); ssid[2] = ssid[1]; } } if (s2 WORSE_THAN WORST_SCORE) s2 = WORST_SCORE; if (s2 BETTER_THAN bestScore) bestScore = s2; hmm_score(hmm, 2) = s2; /* Don't propagate WORST_SCORE */ t0 = WORST_SCORE; if (s1 != WORST_SCORE) t0 = s1 + hmm_tprob_3st(1, 1); t1 = s0 + hmm_tprob_3st(0, 1); if (t0 BETTER_THAN t1) { s1 = t0; } else { s1 = t1; hmm_history(hmm, 1) = hmm_in_history(hmm); ssid[1] = ssid[0]; } if (s1 WORSE_THAN WORST_SCORE) s1 = WORST_SCORE; if (s1 BETTER_THAN bestScore) bestScore = s1; hmm_score(hmm, 1) = s1; /* State 0 is always active */ s0 += hmm_tprob_3st(0, 0); if (s0 WORSE_THAN WORST_SCORE) s0 = WORST_SCORE; if (s0 BETTER_THAN bestScore) bestScore = s0; hmm_in_score(hmm) = s0; hmm_bestscore(hmm) = bestScore; return bestScore; }
static int32 hmm_vit_eval_anytopo(hmm_t * hmm) { hmm_context_t *ctx = hmm->ctx; int32 to, from, bestfrom; int32 newscr, scr, bestscr; int final_state; /* Compute previous state-score + observation output prob for each emitting state */ ctx->st_sen_scr[0] = hmm_in_score(hmm) + hmm_senscr(hmm, 0); for (from = 1; from < hmm_n_emit_state(hmm); ++from) { if ((ctx->st_sen_scr[from] = hmm_score(hmm, from) + hmm_senscr(hmm, from)) WORSE_THAN WORST_SCORE) ctx->st_sen_scr[from] = WORST_SCORE; } /* FIXME/TODO: Use the BLAS for all this. */ /* Evaluate final-state first, which does not have a self-transition */ final_state = hmm_n_emit_state(hmm); to = final_state; scr = WORST_SCORE; bestfrom = -1; for (from = to - 1; from >= 0; --from) { if ((hmm_tprob(hmm, from, to) BETTER_THAN TMAT_WORST_SCORE) && ((newscr = ctx->st_sen_scr[from] + hmm_tprob(hmm, from, to)) BETTER_THAN scr)) { scr = newscr; bestfrom = from; } } hmm_out_score(hmm) = scr; if (bestfrom >= 0) hmm_out_history(hmm) = hmm_history(hmm, bestfrom); bestscr = scr; /* Evaluate all other states, which might have self-transitions */ for (to = final_state - 1; to >= 0; --to) { /* Score from self-transition, if any */ scr = (hmm_tprob(hmm, to, to) BETTER_THAN TMAT_WORST_SCORE) ? ctx->st_sen_scr[to] + hmm_tprob(hmm, to, to) : WORST_SCORE; /* Scores from transitions from other states */ bestfrom = -1; for (from = to - 1; from >= 0; --from) { if ((hmm_tprob(hmm, from, to) BETTER_THAN TMAT_WORST_SCORE) && ((newscr = ctx->st_sen_scr[from] + hmm_tprob(hmm, from, to)) BETTER_THAN scr)) { scr = newscr; bestfrom = from; } } /* Update new result for state to */ if (to == 0) { hmm_in_score(hmm) = scr; if (bestfrom >= 0) hmm_in_history(hmm) = hmm_history(hmm, bestfrom); } else { hmm_score(hmm, to) = scr; if (bestfrom >= 0) hmm_history(hmm, to) = hmm_history(hmm, bestfrom); } /* Propagate ssid for multiplex HMMs */ if (bestfrom >= 0 && hmm_is_mpx(hmm)) hmm->senid[to] = hmm->senid[bestfrom]; if (bestscr WORSE_THAN scr) bestscr = scr; } hmm_bestscore(hmm) = bestscr; return bestscr; }
static int32 hmm_vit_eval_5st_lr_mpx(hmm_t * hmm) { uint8 const *tp = hmm->ctx->tp[hmm->tmatid][0]; int16 const *senscore = hmm->ctx->senscore; uint16 * const *sseq = hmm->ctx->sseq; uint16 *ssid = hmm->senid; int32 bestScore; int32 s5, s4, s3, s2, s1, s0, t2, t1, t0; /* Don't propagate WORST_SCORE */ if (ssid[4] == BAD_SSID) s4 = t1 = WORST_SCORE; else { s4 = hmm_score(hmm, 4) + mpx_senscr(4); t1 = s4 + hmm_tprob_5st(4, 5); } if (ssid[3] == BAD_SSID) s3 = t2 = WORST_SCORE; else { s3 = hmm_score(hmm, 3) + mpx_senscr(3); t2 = s3 + hmm_tprob_5st(3, 5); } if (t1 BETTER_THAN t2) { s5 = t1; hmm_out_history(hmm) = hmm_history(hmm, 4); } else { s5 = t2; hmm_out_history(hmm) = hmm_history(hmm, 3); } if (s5 WORSE_THAN WORST_SCORE) s5 = WORST_SCORE; hmm_out_score(hmm) = s5; bestScore = s5; /* Don't propagate WORST_SCORE */ if (ssid[2] == BAD_SSID) s2 = t2 = WORST_SCORE; else { s2 = hmm_score(hmm, 2) + mpx_senscr(2); t2 = s2 + hmm_tprob_5st(2, 4); } t0 = t1 = WORST_SCORE; if (s4 != WORST_SCORE) t0 = s4 + hmm_tprob_5st(4, 4); if (s3 != WORST_SCORE) t1 = s3 + hmm_tprob_5st(3, 4); if (t0 BETTER_THAN t1) { if (t2 BETTER_THAN t0) { s4 = t2; hmm_history(hmm, 4) = hmm_history(hmm, 2); ssid[4] = ssid[2]; } else s4 = t0; } else { if (t2 BETTER_THAN t1) { s4 = t2; hmm_history(hmm, 4) = hmm_history(hmm, 2); ssid[4] = ssid[2]; } else { s4 = t1; hmm_history(hmm, 4) = hmm_history(hmm, 3); ssid[4] = ssid[3]; } } if (s4 WORSE_THAN WORST_SCORE) s4 = WORST_SCORE; if (s4 BETTER_THAN bestScore) bestScore = s4; hmm_score(hmm, 4) = s4; /* Don't propagate WORST_SCORE */ if (ssid[1] == BAD_SSID) s1 = t2 = WORST_SCORE; else { s1 = hmm_score(hmm, 1) + mpx_senscr(1); t2 = s1 + hmm_tprob_5st(1, 3); } t0 = t1 = WORST_SCORE; if (s3 != WORST_SCORE) t0 = s3 + hmm_tprob_5st(3, 3); if (s2 != WORST_SCORE) t1 = s2 + hmm_tprob_5st(2, 3); if (t0 BETTER_THAN t1) { if (t2 BETTER_THAN t0) { s3 = t2; hmm_history(hmm, 3) = hmm_history(hmm, 1); ssid[3] = ssid[1]; } else s3 = t0; } else { if (t2 BETTER_THAN t1) { s3 = t2; hmm_history(hmm, 3) = hmm_history(hmm, 1); ssid[3] = ssid[1]; } else { s3 = t1; hmm_history(hmm, 3) = hmm_history(hmm, 2); ssid[3] = ssid[2]; } } if (s3 WORSE_THAN WORST_SCORE) s3 = WORST_SCORE; if (s3 BETTER_THAN bestScore) bestScore = s3; hmm_score(hmm, 3) = s3; /* State 0 is always active */ s0 = hmm_in_score(hmm) + mpx_senscr(0); /* Don't propagate WORST_SCORE */ t0 = t1 = WORST_SCORE; if (s2 != WORST_SCORE) t0 = s2 + hmm_tprob_5st(2, 2); if (s1 != WORST_SCORE) t1 = s1 + hmm_tprob_5st(1, 2); t2 = s0 + hmm_tprob_5st(0, 2); if (t0 BETTER_THAN t1) { if (t2 BETTER_THAN t0) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); ssid[2] = ssid[0]; } else s2 = t0; } else { if (t2 BETTER_THAN t1) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); ssid[2] = ssid[0]; } else { s2 = t1; hmm_history(hmm, 2) = hmm_history(hmm, 1); ssid[2] = ssid[1]; } } if (s2 WORSE_THAN WORST_SCORE) s2 = WORST_SCORE; if (s2 BETTER_THAN bestScore) bestScore = s2; hmm_score(hmm, 2) = s2; /* Don't propagate WORST_SCORE */ t0 = WORST_SCORE; if (s1 != WORST_SCORE) t0 = s1 + hmm_tprob_5st(1, 1); t1 = s0 + hmm_tprob_5st(0, 1); if (t0 BETTER_THAN t1) { s1 = t0; } else { s1 = t1; hmm_history(hmm, 1) = hmm_in_history(hmm); ssid[1] = ssid[0]; } if (s1 WORSE_THAN WORST_SCORE) s1 = WORST_SCORE; if (s1 BETTER_THAN bestScore) bestScore = s1; hmm_score(hmm, 1) = s1; s0 += hmm_tprob_5st(0, 0); if (s0 WORSE_THAN WORST_SCORE) s0 = WORST_SCORE; if (s0 BETTER_THAN bestScore) bestScore = s0; hmm_in_score(hmm) = s0; hmm_bestscore(hmm) = bestScore; return bestScore; }
static int32 hmm_vit_eval_3st_lr(hmm_t * hmm) { int16 const *senscore = hmm->ctx->senscore; uint8 const *tp = hmm->ctx->tp[hmm->tmatid][0]; uint16 const *sseq = hmm->senid; int32 s3, s2, s1, s0, t2, t1, t0, bestScore; s2 = hmm_score(hmm, 2) + nonmpx_senscr(2); s1 = hmm_score(hmm, 1) + nonmpx_senscr(1); s0 = hmm_in_score(hmm) + nonmpx_senscr(0); /* It was the best of scores, it was the worst of scores. */ bestScore = WORST_SCORE; t2 = INT_MIN; /* Not used unless skipstate is true */ /* Transitions into non-emitting state 3 */ if (s1 BETTER_THAN WORST_SCORE) { t1 = s2 + hmm_tprob_3st(2, 3); if (hmm_tprob_3st(1,3) BETTER_THAN TMAT_WORST_SCORE) t2 = s1 + hmm_tprob_3st(1, 3); if (t1 BETTER_THAN t2) { s3 = t1; hmm_out_history(hmm) = hmm_history(hmm, 2); } else { s3 = t2; hmm_out_history(hmm) = hmm_history(hmm, 1); } if (s3 WORSE_THAN WORST_SCORE) s3 = WORST_SCORE; hmm_out_score(hmm) = s3; bestScore = s3; } /* All transitions into state 2 (state 0 is always active) */ t0 = s2 + hmm_tprob_3st(2, 2); t1 = s1 + hmm_tprob_3st(1, 2); if (hmm_tprob_3st(0, 2) BETTER_THAN TMAT_WORST_SCORE) t2 = s0 + hmm_tprob_3st(0, 2); if (t0 BETTER_THAN t1) { if (t2 BETTER_THAN t0) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); } else s2 = t0; } else { if (t2 BETTER_THAN t1) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); } else { s2 = t1; hmm_history(hmm, 2) = hmm_history(hmm, 1); } } if (s2 WORSE_THAN WORST_SCORE) s2 = WORST_SCORE; if (s2 BETTER_THAN bestScore) bestScore = s2; hmm_score(hmm, 2) = s2; /* All transitions into state 1 */ t0 = s1 + hmm_tprob_3st(1, 1); t1 = s0 + hmm_tprob_3st(0, 1); if (t0 BETTER_THAN t1) { s1 = t0; } else { s1 = t1; hmm_history(hmm, 1) = hmm_in_history(hmm); } if (s1 WORSE_THAN WORST_SCORE) s1 = WORST_SCORE; if (s1 BETTER_THAN bestScore) bestScore = s1; hmm_score(hmm, 1) = s1; /* All transitions into state 0 */ s0 = s0 + hmm_tprob_3st(0, 0); if (s0 WORSE_THAN WORST_SCORE) s0 = WORST_SCORE; if (s0 BETTER_THAN bestScore) bestScore = s0; hmm_in_score(hmm) = s0; hmm_bestscore(hmm) = bestScore; return bestScore; }
static void phmm_exit(allphone_search_t * allphs, int32 best) { s3cipid_t ci; phmm_t *p; int32 th, nf; history_t *h; blkarray_list_t *history; bin_mdef_t *mdef; int32 curfrm; phmm_t **ci_phmm; int32 *ci2lmwid; th = best + allphs->pbeam; history = allphs->history; mdef = ps_search_acmod(allphs)->mdef; curfrm = allphs->frame; ci_phmm = allphs->ci_phmm; ci2lmwid = allphs->ci2lmwid; nf = curfrm + 1; for (ci = 0; ci < mdef->n_ciphone; ci++) { for (p = ci_phmm[(unsigned) ci]; p; p = p->next) { if (hmm_frame(&(p->hmm)) == curfrm) { if (hmm_bestscore(&(p->hmm)) >= th) { h = (history_t *) ckd_calloc(1, sizeof(*h)); h->ef = curfrm; h->phmm = p; h->hist = hmm_out_history(&(p->hmm)); h->score = hmm_out_score(&(p->hmm)); if (!allphs->lm) { h->tscore = allphs->inspen; } else { if (h->hist > 0) { int32 n_used; history_t *pred = blkarray_list_get(history, h->hist); if (pred->hist > 0) { history_t *pred_pred = blkarray_list_get(history, h->hist); h->tscore = ngram_tg_score(allphs->lm, ci2lmwid [pred_pred->phmm->ci], ci2lmwid[pred-> phmm->ci], ci2lmwid[p->ci], &n_used) >> SENSCR_SHIFT; } else { h->tscore = ngram_bg_score(allphs->lm, ci2lmwid [pred->phmm->ci], ci2lmwid[p->ci], &n_used) >> SENSCR_SHIFT; } } else { /* * This is the beginning SIL and in srch_allphone_begin() * it's inscore is set to 0. */ h->tscore = 0; } }
static int32 hmm_vit_eval_5st_lr(hmm_t * hmm) { int16 const *senscore = hmm->ctx->senscore; uint8 const *tp = hmm->ctx->tp[hmm->tmatid][0]; uint16 const *sseq = hmm->senid; int32 s5, s4, s3, s2, s1, s0, t2, t1, t0, bestScore; /* It was the best of scores, it was the worst of scores. */ bestScore = WORST_SCORE; /* Cache problem here! */ s4 = hmm_score(hmm, 4) + nonmpx_senscr(4); s3 = hmm_score(hmm, 3) + nonmpx_senscr(3); /* Transitions into non-emitting state 5 */ if (s3 BETTER_THAN WORST_SCORE) { t1 = s4 + hmm_tprob_5st(4, 5); t2 = s3 + hmm_tprob_5st(3, 5); if (t1 BETTER_THAN t2) { s5 = t1; hmm_out_history(hmm) = hmm_history(hmm, 4); } else { s5 = t2; hmm_out_history(hmm) = hmm_history(hmm, 3); } if (s5 WORSE_THAN WORST_SCORE) s5 = WORST_SCORE; hmm_out_score(hmm) = s5; bestScore = s5; } s2 = hmm_score(hmm, 2) + nonmpx_senscr(2); /* All transitions into state 4 */ if (s2 BETTER_THAN WORST_SCORE) { t0 = s4 + hmm_tprob_5st(4, 4); t1 = s3 + hmm_tprob_5st(3, 4); t2 = s2 + hmm_tprob_5st(2, 4); if (t0 BETTER_THAN t1) { if (t2 BETTER_THAN t0) { s4 = t2; hmm_history(hmm, 4) = hmm_history(hmm, 2); } else s4 = t0; } else { if (t2 BETTER_THAN t1) { s4 = t2; hmm_history(hmm, 4) = hmm_history(hmm, 2); } else { s4 = t1; hmm_history(hmm, 4) = hmm_history(hmm, 3); } } if (s4 WORSE_THAN WORST_SCORE) s4 = WORST_SCORE; if (s4 BETTER_THAN bestScore) bestScore = s4; hmm_score(hmm, 4) = s4; } s1 = hmm_score(hmm, 1) + nonmpx_senscr(1); /* All transitions into state 3 */ if (s1 BETTER_THAN WORST_SCORE) { t0 = s3 + hmm_tprob_5st(3, 3); t1 = s2 + hmm_tprob_5st(2, 3); t2 = s1 + hmm_tprob_5st(1, 3); if (t0 BETTER_THAN t1) { if (t2 BETTER_THAN t0) { s3 = t2; hmm_history(hmm, 3) = hmm_history(hmm, 1); } else s3 = t0; } else { if (t2 BETTER_THAN t1) { s3 = t2; hmm_history(hmm, 3) = hmm_history(hmm, 1); } else { s3 = t1; hmm_history(hmm, 3) = hmm_history(hmm, 2); } } if (s3 WORSE_THAN WORST_SCORE) s3 = WORST_SCORE; if (s3 BETTER_THAN bestScore) bestScore = s3; hmm_score(hmm, 3) = s3; } s0 = hmm_in_score(hmm) + nonmpx_senscr(0); /* All transitions into state 2 (state 0 is always active) */ t0 = s2 + hmm_tprob_5st(2, 2); t1 = s1 + hmm_tprob_5st(1, 2); t2 = s0 + hmm_tprob_5st(0, 2); if (t0 BETTER_THAN t1) { if (t2 BETTER_THAN t0) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); } else s2 = t0; } else { if (t2 BETTER_THAN t1) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); } else { s2 = t1; hmm_history(hmm, 2) = hmm_history(hmm, 1); } } if (s2 WORSE_THAN WORST_SCORE) s2 = WORST_SCORE; if (s2 BETTER_THAN bestScore) bestScore = s2; hmm_score(hmm, 2) = s2; /* All transitions into state 1 */ t0 = s1 + hmm_tprob_5st(1, 1); t1 = s0 + hmm_tprob_5st(0, 1); if (t0 BETTER_THAN t1) { s1 = t0; } else { s1 = t1; hmm_history(hmm, 1) = hmm_in_history(hmm); } if (s1 WORSE_THAN WORST_SCORE) s1 = WORST_SCORE; if (s1 BETTER_THAN bestScore) bestScore = s1; hmm_score(hmm, 1) = s1; /* All transitions into state 0 */ s0 = s0 + hmm_tprob_5st(0, 0); if (s0 WORSE_THAN WORST_SCORE) s0 = WORST_SCORE; if (s0 BETTER_THAN bestScore) bestScore = s0; hmm_in_score(hmm) = s0; hmm_bestscore(hmm) = bestScore; return bestScore; }
static void fwdflat_prune_chan(ngram_search_t *ngs, int frame_idx) { int32 i, cf, nf, w, pip, newscore, thresh, wordthresh; int32 *awl; root_chan_t *rhmm; chan_t *hmm, *nexthmm; cf = frame_idx; nf = cf + 1; i = ngs->n_active_word[cf & 0x1]; awl = ngs->active_word_list[cf & 0x1]; bitvec_clear_all(ngs->word_active, ps_search_n_words(ngs)); thresh = ngs->best_score + ngs->fwdflatbeam; wordthresh = ngs->best_score + ngs->fwdflatwbeam; pip = ngs->pip; E_DEBUG(3,("frame %d thresh %d wordthresh %d\n", frame_idx, thresh, wordthresh)); /* Scan all active words. */ for (w = *(awl++); i > 0; --i, w = *(awl++)) { rhmm = (root_chan_t *) ngs->word_chan[w]; /* Propagate active root channels */ if (hmm_frame(&rhmm->hmm) == cf && hmm_bestscore(&rhmm->hmm) BETTER_THAN thresh) { hmm_frame(&rhmm->hmm) = nf; bitvec_set(ngs->word_active, w); /* Transitions out of root channel */ newscore = hmm_out_score(&rhmm->hmm); if (rhmm->next) { assert(!dict_is_single_phone(ps_search_dict(ngs), w)); newscore += pip; if (newscore BETTER_THAN thresh) { hmm = rhmm->next; /* Enter all right context phones */ if (hmm->info.rc_id >= 0) { for (; hmm; hmm = hmm->next) { if ((hmm_frame(&hmm->hmm) < cf) || (newscore BETTER_THAN hmm_in_score(&hmm->hmm))) { hmm_enter(&hmm->hmm, newscore, hmm_out_history(&rhmm->hmm), nf); } } } /* Just a normal word internal phone */ else { if ((hmm_frame(&hmm->hmm) < cf) || (newscore BETTER_THAN hmm_in_score(&hmm->hmm))) { hmm_enter(&hmm->hmm, newscore, hmm_out_history(&rhmm->hmm), nf); } } } } else { assert(dict_is_single_phone(ps_search_dict(ngs), w)); /* Word exit for single-phone words (where did their * whmms come from?) (either from * ngram_search_fwdtree, or from * ngram_fwdflat_allocate_1ph(), that's where) */ if (newscore BETTER_THAN wordthresh) { ngram_search_save_bp(ngs, cf, w, newscore, hmm_out_history(&rhmm->hmm), 0); } } } /* Transitions out of non-root channels. */ for (hmm = rhmm->next; hmm; hmm = hmm->next) { if (hmm_frame(&hmm->hmm) >= cf) { /* Propagate forward HMMs inside the beam. */ if (hmm_bestscore(&hmm->hmm) BETTER_THAN thresh) { hmm_frame(&hmm->hmm) = nf; bitvec_set(ngs->word_active, w); newscore = hmm_out_score(&hmm->hmm); /* Word-internal phones */ if (hmm->info.rc_id < 0) { newscore += pip; if (newscore BETTER_THAN thresh) { nexthmm = hmm->next; /* Enter all right-context phones. */ if (nexthmm->info.rc_id >= 0) { for (; nexthmm; nexthmm = nexthmm->next) { if ((hmm_frame(&nexthmm->hmm) < cf) || (newscore BETTER_THAN hmm_in_score(&nexthmm->hmm))) { hmm_enter(&nexthmm->hmm, newscore, hmm_out_history(&hmm->hmm), nf); } } } /* Enter single word-internal phone. */ else { if ((hmm_frame(&nexthmm->hmm) < cf) || (newscore BETTER_THAN hmm_in_score(&nexthmm->hmm))) { hmm_enter(&nexthmm->hmm, newscore, hmm_out_history(&hmm->hmm), nf); } } } } /* Right-context phones - apply word beam and exit. */ else { if (newscore BETTER_THAN wordthresh) { ngram_search_save_bp(ngs, cf, w, newscore, hmm_out_history(&hmm->hmm), hmm->info.rc_id); } } } /* Zero out inactive HMMs. */ else if (hmm_frame(&hmm->hmm) != nf) { hmm_clear_scores(&hmm->hmm); } } } } }
static int32 hmm_vit_eval_3st_lr_mpx(hmm_t * hmm) { const int32 *tp = hmm->ctx->tp[hmm->tmatid][0]; const int32 *senscore = hmm->ctx->senscore; const s3senid_t **sseq = hmm->ctx->sseq; int32 *ssid = hmm->s.mpx_ssid; int32 bestScore; int32 s3, s2, s1, s0, t2, t1, t0; /* Don't propagate WORST_SCORE */ t2 = INT_MIN; /* Not used unless skipstate is true */ if (ssid[2] == -1) s2 = t1 = WORST_SCORE; else { s2 = hmm_score(hmm, 2) + mpx_senscr(2); if (s2 < WORST_SCORE) s2 = WORST_SCORE; t1 = s2 + hmm_tprob_3st(2, 3); } if (ssid[1] == -1) s1 = WORST_SCORE; else { s1 = hmm_score(hmm, 1) + mpx_senscr(1); if (s1 < WORST_SCORE) s1 = WORST_SCORE; t2 = s1 + hmm_tprob_3st(1, 3); } if (t1 > t2) { s3 = t1; hmm_out_history(hmm) = hmm_history(hmm, 2); } else { s3 = t2; hmm_out_history(hmm) = hmm_history(hmm, 1); } if (s3 < WORST_SCORE) s3 = WORST_SCORE; hmm_out_score(hmm) = s3; bestScore = s3; /* State 0 is always active */ s0 = hmm_in_score(hmm) + mpx_senscr(0); if (s0 < WORST_SCORE) s0 = WORST_SCORE; /* Don't propagate WORST_SCORE */ t0 = t1 = WORST_SCORE; if (s2 != WORST_SCORE) t0 = s2 + hmm_tprob_3st(2, 2); if (s1 != WORST_SCORE) t1 = s1 + hmm_tprob_3st(1, 2); if (hmm_tprob_3st(0,2) > WORST_SCORE) t2 = s0 + hmm_tprob_3st(0, 2); if (t0 > t1) { if (t2 > t0) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); ssid[2] = ssid[0]; } else s2 = t0; } else { if (t2 > t1) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); ssid[2] = ssid[0]; } else { s2 = t1; hmm_history(hmm, 2) = hmm_history(hmm, 1); ssid[2] = ssid[1]; } } if (s2 < WORST_SCORE) s2 = WORST_SCORE; if (s2 > bestScore) bestScore = s2; hmm_score(hmm, 2) = s2; /* Don't propagate WORST_SCORE */ t0 = WORST_SCORE; if (s1 != WORST_SCORE) t0 = s1 + hmm_tprob_3st(1, 1); t1 = s0 + hmm_tprob_3st(0, 1); if (t0 > t1) { s1 = t0; } else { s1 = t1; hmm_history(hmm, 1) = hmm_in_history(hmm); ssid[1] = ssid[0]; } if (s1 < WORST_SCORE) s1 = WORST_SCORE; if (s1 > bestScore) bestScore = s1; hmm_score(hmm, 1) = s1; /* State 0 is always active */ s0 += hmm_tprob_3st(0, 0); if (s0 < WORST_SCORE) s0 = WORST_SCORE; if (s0 > bestScore) bestScore = s0; hmm_in_score(hmm) = s0; hmm_bestscore(hmm) = bestScore; return bestScore; }
static int32 hmm_vit_eval_3st_lr(hmm_t * hmm) { const int32 *senscore = hmm->ctx->senscore; const int32 *tp = hmm->ctx->tp[hmm->tmatid][0]; const s3senid_t *sseq = hmm->ctx->sseq[hmm_ssid(hmm, 0)]; int32 s3, s2, s1, s0, t2, t1, t0, bestScore; s2 = hmm_score(hmm, 2) + nonmpx_senscr(2); s1 = hmm_score(hmm, 1) + nonmpx_senscr(1); s0 = hmm_in_score(hmm) + nonmpx_senscr(0); /* It was the best of scores, it was the worst of scores. */ t0 = t1 = bestScore = WORST_SCORE; t2 = INT_MIN; /* Not used unless skipstate is true */ /* Transitions into non-emitting state 3 */ if (s2 > WORST_SCORE) { t1 = s2 + hmm_tprob_3st(2, 3); t0 = s2 + hmm_tprob_3st(2, 2); } if (s1 > WORST_SCORE && hmm_tprob_3st(1,3) > WORST_SCORE) t2 = s1 + hmm_tprob_3st(1, 3); if (t1 > t2) { s3 = t1; hmm_out_history(hmm) = hmm_history(hmm, 2); } else { s3 = t2; hmm_out_history(hmm) = hmm_history(hmm, 1); } if (s3 < WORST_SCORE) s3 = WORST_SCORE; hmm_out_score(hmm) = s3; bestScore = s3; /* All transitions into state 2 (state 0 is always active) */ t1 = t2 = WORST_SCORE; if (s1 > WORST_SCORE) t1 = s1 + hmm_tprob_3st(1, 2); if (hmm_tprob_3st(0, 2) > WORST_SCORE) t2 = s0 + hmm_tprob_3st(0, 2); if (t0 > t1) { if (t2 > t0) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); } else s2 = t0; } else { if (t2 > t1) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); } else { s2 = t1; hmm_history(hmm, 2) = hmm_history(hmm, 1); } } if (s2 < WORST_SCORE) s2 = WORST_SCORE; if (s2 > bestScore) bestScore = s2; hmm_score(hmm, 2) = s2; /* All transitions into state 1 */ t0 = t1 = WORST_SCORE; if (s1 > WORST_SCORE) t0 = s1 + hmm_tprob_3st(1, 1); if (s0 > WORST_SCORE) t1 = s0 + hmm_tprob_3st(0, 1); if (t0 > t1) { s1 = t0; } else { s1 = t1; hmm_history(hmm, 1) = hmm_in_history(hmm); } if (s1 < WORST_SCORE) s1 = WORST_SCORE; if (s1 > bestScore) bestScore = s1; hmm_score(hmm, 1) = s1; /* All transitions into state 0 */ s0 = s0 + hmm_tprob_3st(0, 0); if (s0 < WORST_SCORE) s0 = WORST_SCORE; if (s0 > bestScore) bestScore = s0; hmm_in_score(hmm) = s0; hmm_bestscore(hmm) = bestScore; return bestScore; }
static int32 hmm_vit_eval_5st_lr_mpx(hmm_t * hmm) { const int32 *tp = hmm->ctx->tp[hmm->tmatid][0]; const int32 *senscore = hmm->ctx->senscore; const s3senid_t **sseq = hmm->ctx->sseq; int32 *ssid = hmm->s.mpx_ssid; int32 bestScore; int32 s5, s4, s3, s2, s1, s0, t2, t1, t0; /* Don't propagate WORST_SCORE */ if (ssid[4] == -1) s4 = t1 = WORST_SCORE; else { s4 = hmm_score(hmm, 4) + mpx_senscr(4); t1 = s4 + hmm_tprob_5st(4, 5); } if (ssid[3] == -1) s3 = t2 = WORST_SCORE; else { s3 = hmm_score(hmm, 3) + mpx_senscr(3); t2 = s3 + hmm_tprob_5st(3, 5); } if (t1 > t2) { s5 = t1; hmm_out_history(hmm) = hmm_history(hmm, 4); } else { s5 = t2; hmm_out_history(hmm) = hmm_history(hmm, 3); } if (s5 < WORST_SCORE) s5 = WORST_SCORE; hmm_out_score(hmm) = s5; bestScore = s5; /* Don't propagate WORST_SCORE */ if (ssid[2] == -1) s2 = t2 = WORST_SCORE; else { s2 = hmm_score(hmm, 2) + mpx_senscr(2); t2 = s2 + hmm_tprob_5st(2, 4); } t0 = t1 = WORST_SCORE; if (s4 != WORST_SCORE) t0 = s4 + hmm_tprob_5st(4, 4); if (s3 != WORST_SCORE) t1 = s3 + hmm_tprob_5st(3, 4); if (t0 > t1) { if (t2 > t0) { s4 = t2; hmm_history(hmm, 4) = hmm_history(hmm, 2); ssid[4] = ssid[2]; } else s4 = t0; } else { if (t2 > t1) { s4 = t2; hmm_history(hmm, 4) = hmm_history(hmm, 2); ssid[4] = ssid[2]; } else { s4 = t1; hmm_history(hmm, 4) = hmm_history(hmm, 3); ssid[4] = ssid[3]; } } if (s4 < WORST_SCORE) s4 = WORST_SCORE; if (s4 > bestScore) bestScore = s4; hmm_score(hmm, 4) = s4; /* Don't propagate WORST_SCORE */ if (ssid[1] == -1) s1 = t2 = WORST_SCORE; else { s1 = hmm_score(hmm, 1) + mpx_senscr(1); t2 = s1 + hmm_tprob_5st(1, 3); } t0 = t1 = WORST_SCORE; if (s3 != WORST_SCORE) t0 = s3 + hmm_tprob_5st(3, 3); if (s2 != WORST_SCORE) t1 = s2 + hmm_tprob_5st(2, 3); if (t0 > t1) { if (t2 > t0) { s3 = t2; hmm_history(hmm, 3) = hmm_history(hmm, 1); ssid[3] = ssid[1]; } else s3 = t0; } else { if (t2 > t1) { s3 = t2; hmm_history(hmm, 3) = hmm_history(hmm, 1); ssid[3] = ssid[1]; } else { s3 = t1; hmm_history(hmm, 3) = hmm_history(hmm, 2); ssid[3] = ssid[2]; } } if (s3 < WORST_SCORE) s3 = WORST_SCORE; if (s3 > bestScore) bestScore = s3; hmm_score(hmm, 3) = s3; /* State 0 is always active */ s0 = hmm_in_score(hmm) + mpx_senscr(0); /* Don't propagate WORST_SCORE */ t0 = t1 = WORST_SCORE; if (s2 != WORST_SCORE) t0 = s2 + hmm_tprob_5st(2, 2); if (s1 != WORST_SCORE) t1 = s1 + hmm_tprob_5st(1, 2); t2 = s0 + hmm_tprob_5st(0, 2); if (t0 > t1) { if (t2 > t0) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); ssid[2] = ssid[0]; } else s2 = t0; } else { if (t2 > t1) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); ssid[2] = ssid[0]; } else { s2 = t1; hmm_history(hmm, 2) = hmm_history(hmm, 1); ssid[2] = ssid[1]; } } if (s2 < WORST_SCORE) s2 = WORST_SCORE; if (s2 > bestScore) bestScore = s2; hmm_score(hmm, 2) = s2; /* Don't propagate WORST_SCORE */ t0 = WORST_SCORE; if (s1 != WORST_SCORE) t0 = s1 + hmm_tprob_5st(1, 1); t1 = s0 + hmm_tprob_5st(0, 1); if (t0 > t1) { s1 = t0; } else { s1 = t1; hmm_history(hmm, 1) = hmm_in_history(hmm); ssid[1] = ssid[0]; } if (s1 < WORST_SCORE) s1 = WORST_SCORE; if (s1 > bestScore) bestScore = s1; hmm_score(hmm, 1) = s1; s0 += hmm_tprob_5st(0, 0); if (s0 < WORST_SCORE) s0 = WORST_SCORE; if (s0 > bestScore) bestScore = s0; hmm_in_score(hmm) = s0; hmm_bestscore(hmm) = bestScore; return bestScore; }
static int32 hmm_vit_eval_5st_lr(hmm_t * hmm) { const int32 *senscore = hmm->ctx->senscore; const int32 *tp = hmm->ctx->tp[hmm->tmatid][0]; const s3senid_t *sseq = hmm->ctx->sseq[hmm_ssid(hmm, 0)]; int32 s5, s4, s3, s2, s1, s0, t2, t1, t0, bestScore; /* It was the best of scores, it was the worst of scores. */ bestScore = WORST_SCORE; s4 = hmm_score(hmm, 4) + nonmpx_senscr(4); s3 = hmm_score(hmm, 3) + nonmpx_senscr(3); /* Transitions into non-emitting state 5 */ if (s3 > WORST_SCORE) { t1 = s4 + hmm_tprob_5st(4, 5); t2 = s3 + hmm_tprob_5st(3, 5); if (t1 > t2) { s5 = t1; hmm_out_history(hmm) = hmm_history(hmm, 4); } else { s5 = t2; hmm_out_history(hmm) = hmm_history(hmm, 3); } if (s5 < WORST_SCORE) s5 = WORST_SCORE; hmm_out_score(hmm) = s5; bestScore = s5; } s2 = hmm_score(hmm, 2) + nonmpx_senscr(2); /* All transitions into state 4 */ if (s2 > WORST_SCORE) { t0 = s4 + hmm_tprob_5st(4, 4); t1 = s3 + hmm_tprob_5st(3, 4); t2 = s2 + hmm_tprob_5st(2, 4); if (t0 > t1) { if (t2 > t0) { s4 = t2; hmm_history(hmm, 4) = hmm_history(hmm, 2); } else s4 = t0; } else { if (t2 > t1) { s4 = t2; hmm_history(hmm, 4) = hmm_history(hmm, 2); } else { s4 = t1; hmm_history(hmm, 4) = hmm_history(hmm, 3); } } if (s4 < WORST_SCORE) s4 = WORST_SCORE; if (s4 > bestScore) bestScore = s4; hmm_score(hmm, 4) = s4; } s1 = hmm_score(hmm, 1) + nonmpx_senscr(1); /* All transitions into state 3 */ if (s1 > WORST_SCORE) { t0 = s3 + hmm_tprob_5st(3, 3); t1 = s2 + hmm_tprob_5st(2, 3); t2 = s1 + hmm_tprob_5st(1, 3); if (t0 > t1) { if (t2 > t0) { s3 = t2; hmm_history(hmm, 3) = hmm_history(hmm, 1); } else s3 = t0; } else { if (t2 > t1) { s3 = t2; hmm_history(hmm, 3) = hmm_history(hmm, 1); } else { s3 = t1; hmm_history(hmm, 3) = hmm_history(hmm, 2); } } if (s3 < WORST_SCORE) s3 = WORST_SCORE; if (s3 > bestScore) bestScore = s3; hmm_score(hmm, 3) = s3; } s0 = hmm_in_score(hmm) + nonmpx_senscr(0); /* All transitions into state 2 (state 0 is always active) */ t0 = s2 + hmm_tprob_5st(2, 2); t1 = s1 + hmm_tprob_5st(1, 2); t2 = s0 + hmm_tprob_5st(0, 2); if (t0 > t1) { if (t2 > t0) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); } else s2 = t0; } else { if (t2 > t1) { s2 = t2; hmm_history(hmm, 2) = hmm_in_history(hmm); } else { s2 = t1; hmm_history(hmm, 2) = hmm_history(hmm, 1); } } if (s2 < WORST_SCORE) s2 = WORST_SCORE; if (s2 > bestScore) bestScore = s2; hmm_score(hmm, 2) = s2; /* All transitions into state 1 */ t0 = s1 + hmm_tprob_5st(1, 1); t1 = s0 + hmm_tprob_5st(0, 1); if (t0 > t1) { s1 = t0; } else { s1 = t1; hmm_history(hmm, 1) = hmm_in_history(hmm); } if (s1 < WORST_SCORE) s1 = WORST_SCORE; if (s1 > bestScore) bestScore = s1; hmm_score(hmm, 1) = s1; /* All transitions into state 0 */ s0 = s0 + hmm_tprob_5st(0, 0); if (s0 < WORST_SCORE) s0 = WORST_SCORE; if (s0 > bestScore) bestScore = s0; hmm_in_score(hmm) = s0; hmm_bestscore(hmm) = bestScore; return bestScore; }