int32 vithist_utt_begin(vithist_t * vh, int32 startwid, int32 lwid) { vithist_entry_t *ve; assert(vh->n_entry == 0); assert(vh->entry[0] == NULL); assert(vh->lwidlist == NULL); /* Create an initial dummy <s> entry. This is the root for the utterance */ ve = vithist_entry_alloc(vh); ve->wid = startwid; ve->sf = -1; ve->ef = -1; ve->ascr = 0; ve->lscr = 0; ve->path.score = 0; ve->path.pred = -1; ve->type = 0; ve->valid = 1; ve->lmstate.lm3g.lwid[0] = lwid; ve->lmstate.lm3g.lwid[1] = NGRAM_INVALID_WID; vh->n_frm = 0; vh->frame_start[0] = 1; vh->bestscore[0] = MAX_NEG_INT32; vh->bestvh[0] = -1; return 0; }
static void vithist_enter (vithist_t *vh, kbcore_t *kbc, vithist_entry_t *tve) { vithist_entry_t *ve; int32 vhid; /* Check if an entry with this LM state already exists in current frame */ vhid = vh_lmstate_find (vh, &(tve->lmstate)); if (vhid < 0) { /* Not found; allocate new entry */ vhid = vh->n_entry; ve = vithist_entry_alloc (vh); *ve = *tve; vithist_lmstate_enter (vh, vhid, ve); /* Enter new vithist info into LM state tree */ } else { ve = vh->entry[VITHIST_ID2BLK(vhid)] + VITHIST_ID2BLKOFFSET(vhid); if (ve->score < tve->score) *ve = *tve; } /* Update best exit score in this frame */ if (vh->bestscore[vh->n_frm] < tve->score) { vh->bestscore[vh->n_frm] = tve->score; vh->bestvh[vh->n_frm] = vhid; } }
int32 vithist_utt_begin (vithist_t *vh, kbcore_t *kbc) { vithist_entry_t *ve; lm_t *lm; dict_t *dict; lm = kbcore_lm(kbc); dict = kbcore_dict(kbc); assert (vh->n_entry == 0); assert (vh->entry[0] == NULL); assert (vh->lwidlist == NULL); /* Create an initial dummy <s> entry. This is the root for the utterance */ ve = vithist_entry_alloc (vh); ve->wid = dict_startwid(dict); ve->sf = -1; ve->ef = -1; ve->ascr = 0; ve->lscr = 0; ve->score = 0; ve->pred = -1; ve->type = 0; ve->valid = 1; ve->lmstate.lm3g.lwid[0] = lm_startwid(lm); ve->lmstate.lm3g.lwid[1] = BAD_S3LMWID; vh->n_frm = 0; vh->frame_start[0] = 1; vh->bestscore[0] = MAX_NEG_INT32; vh->bestvh[0] = -1; return 0; }
int32 vithist_utt_end(vithist_t * vh, ngram_model_t *lm, s3dict_t *dict, dict2pid_t *dict2pid, fillpen_t *fp) { int32 f, i; int32 sv, nsv, scr, bestscore, bestvh, vhid; vithist_entry_t *ve, *bestve = 0; int32 endwid = NGRAM_INVALID_WID; bestscore = MAX_NEG_INT32; bestvh = -1; /* Find last frame with entries in vithist table */ /* by ARCHAN 20050525, it is possible that the last frame will not be reached in decoding */ for (f = vh->n_frm - 1; f >= 0; --f) { sv = vh->frame_start[f]; /* First vithist entry in frame f */ nsv = vh->frame_start[f + 1]; /* First vithist entry in next frame (f+1) */ if (sv < nsv) break; } if (f < 0) return -1; if (f != vh->n_frm - 1) E_WARN("No word exit in frame %d, using exits from frame %d\n", vh->n_frm - 1, f); /* Terminate in a final </s> node (make this optional?) */ endwid = ngram_wid(lm, S3_FINISH_WORD); for (i = sv; i < nsv; i++) { int n_used; ve = vithist_id2entry(vh, i); scr = ve->path.score; scr += ngram_tg_score(lm, endwid, ve->lmstate.lm3g.lwid[0], ve->lmstate.lm3g.lwid[1], &n_used); if (bestscore < scr) { bestscore = scr; bestvh = i; bestve = ve; } } assert(bestvh >= 0); if (f != vh->n_frm - 1) { E_ERROR("No word exit in frame %d, using exits from frame %d\n", vh->n_frm - 1, f); /* Add a dummy silwid covering the remainder of the utterance */ assert(vh->frame_start[vh->n_frm - 1] == vh->frame_start[vh->n_frm]); vh->n_frm -= 1; vithist_rescore(vh, lm, dict, dict2pid, fp, s3dict_silwid(dict), vh->n_frm, bestve->path.score, bestvh, -1, -1); vh->n_frm += 1; vh->frame_start[vh->n_frm] = vh->n_entry; return vithist_utt_end(vh, lm, dict, dict2pid, fp); } /* vithist_dump(vh,-1,kbc,stdout); */ /* Create an </s> entry */ ve = vithist_entry_alloc(vh); ve->wid = s3dict_finishwid(dict); ve->sf = (bestve->ef == BAD_S3FRMID) ? 0 : bestve->ef + 1; ve->ef = vh->n_frm; ve->ascr = 0; ve->lscr = bestscore - bestve->path.score; ve->path.score = bestscore; ve->path.pred = bestvh; ve->type = 0; ve->valid = 1; ve->lmstate.lm3g.lwid[0] = endwid; ve->lmstate.lm3g.lwid[1] = ve->lmstate.lm3g.lwid[0]; vhid = vh->n_entry - 1; /* vithist_dump(vh,-1,kbc,stdout); */ return vhid; }
/* Rclist is separate from tve because C structure copying is used in *ve = *tve */ void vithist_enter(vithist_t * vh, /**< The history table */ s3dict_t *dict, /**< Dictionary */ dict2pid_t *dict2pid, /**< Context table mapping thing */ vithist_entry_t * tve, /**< an input vithist element */ int32 comp_rc /**< a compressed rc. If it is the actual rc, it won't work. */ ) { vithist_entry_t *ve; int32 vhid; int32 n_ci; int32 n_rc_info; int32 old_n_rc_info; n_ci = vh->n_ci; /* Check if an entry with this LM state already exists in current frame */ vhid = vh_lmstate_find(vh, &(tve->lmstate)); n_rc_info = 0; /* Just fill in something if not using crossword triphon */ assert(comp_rc < n_rc_info); if (vhid < 0) { /* Not found; allocate new entry */ vhid = vh->n_entry; ve = vithist_entry_alloc(vh); vithist_entry_dirty_cp(ve, tve, n_rc_info); vithist_lmstate_enter(vh, vhid, ve); /* Enter new vithist info into LM state tree */ /* E_INFO("Start a new entry wid %d\n",ve->wid); */ if (ve->rc != NULL) clean_up_rc_info(ve->rc, ve->n_rc); if (comp_rc != -1) { if (ve->rc == NULL) { ve->n_rc = get_rc_nssid(dict2pid, ve->wid, dict); /* Always allocate n_ci for rc_info */ ve->rc = ckd_calloc(vh->n_ci, sizeof(*ve->rc)); clean_up_rc_info(ve->rc, ve->n_rc); } assert(comp_rc < ve->n_rc); if (ve->rc[comp_rc].score < tve->path.score) { ve->rc[comp_rc].score = tve->path.score; ve->rc[comp_rc].pred = tve->path.pred; } } } else { ve = vithist_id2entry(vh, vhid); /* E_INFO("Replace the old entry\n"); */ /* E_INFO("Old entry wid %d, New entry wid %d\n",ve->wid, tve->wid); */ if (comp_rc == -1) { if (ve->path.score < tve->path.score) { vithist_entry_dirty_cp(ve, tve, n_rc_info); assert(comp_rc < n_rc_info); if (ve->rc != NULL) clean_up_rc_info(ve->rc, ve->n_rc); } } else { /* This is wrong, the score Alright, how vhid was searched in the first place? */ if (ve->path.score < tve->path.score) { old_n_rc_info = ve->n_rc; vithist_entry_dirty_cp(ve, tve, n_rc_info); assert(comp_rc < n_rc_info); assert(ve->rc); clean_up_rc_info(ve->rc, ve->n_rc); ve->rc[comp_rc].score = tve->path.score; ve->rc[comp_rc].pred = tve->path.pred; } } } /* Update best exit score in this frame */ if (vh->bestscore[vh->n_frm] < tve->path.score) { vh->bestscore[vh->n_frm] = tve->path.score; vh->bestvh[vh->n_frm] = vhid; } }
int32 vithist_utt_end (vithist_t *vh, kbcore_t *kbc) { int32 f, i, b, l; int32 sv, nsv, scr, bestscore, bestvh, vhid; vithist_entry_t *ve, *bestve=0; s3lmwid_t endwid; lm_t *lm; dict_t *dict; /* Find last frame with entries in vithist table */ for (f = vh->n_frm-1; f >= 0; --f) { sv = vh->frame_start[f]; /* First vithist entry in frame f */ nsv = vh->frame_start[f+1]; /* First vithist entry in next frame (f+1) */ if (sv < nsv) break; } if (f < 0) return -1; if (f != vh->n_frm-1) E_ERROR("No word exit in frame %d, using exits from frame %d\n", vh->n_frm-1, f); /* Terminate in a final </s> node (make this optional?) */ lm = kbcore_lm (kbc); endwid = lm_finishwid (lm); bestscore = MAX_NEG_INT32; bestvh = -1; for (i = sv; i < nsv; i++) { b = VITHIST_ID2BLK (i); l = VITHIST_ID2BLKOFFSET (i); ve = vh->entry[b] + l; scr = ve->score; scr += lm_tg_score (lm, ve->lmstate.lm3g.lwid[1], ve->lmstate.lm3g.lwid[0], endwid); if (bestscore < scr) { bestscore = scr; bestvh = i; bestve = ve; } } assert (bestvh >= 0); dict = kbcore_dict (kbc); if (f != vh->n_frm-1) { E_ERROR("No word exit in frame %d, using exits from frame %d\n", vh->n_frm-1, f); /* Add a dummy silwid covering the remainder of the utterance */ assert (vh->frame_start[vh->n_frm-1] == vh->frame_start[vh->n_frm]); vh->n_frm -= 1; vithist_rescore (vh, kbc, dict_silwid (dict), vh->n_frm, bestve->score, bestvh, -1); vh->n_frm += 1; vh->frame_start[vh->n_frm] = vh->n_entry; return vithist_utt_end (vh, kbc); } /* Create an </s> entry */ vhid = vh->n_entry; ve = vithist_entry_alloc (vh); ve->wid = dict_finishwid (dict); ve->sf = (bestve->ef == BAD_S3FRMID) ? 0 : bestve->ef + 1; ve->ef = vh->n_frm; ve->ascr = 0; ve->lscr = bestscore - bestve->score; ve->score = bestscore; ve->pred = bestvh; ve->type = 0; ve->valid = 1; ve->lmstate.lm3g.lwid[0] = endwid; ve->lmstate.lm3g.lwid[1] = ve->lmstate.lm3g.lwid[0]; return vhid; }