static void utt_confidence(void *data, utt_res_t * ur, int32 sf, int32 ef, char *uttid) { if (ur->lmname) lmset_set_curlm_wname(lmset, ur->lmname); confidence_utt(uttid, inmatchsegfp); }
lmset_t * lmset_init(const char *lmfile, const char *lmctlfile, const char *ctl_lm, const char *lmname, const char *lmdumpdir, float32 lw, float32 wip, float32 uw, dict_t * dict, logmath_t * logmath) { lmset_t *lms; lms = NULL; if (lmfile && lmctlfile) E_FATAL("Please only specify either -lm or -lmctlfn\n"); if (!lmfile && !lmctlfile) E_FATAL("Please specify either one of -lm or -lmctlfn\n"); if (lmfile) { /* Data structure are shared. But it is still a sore point to have two interfaces for -lm and -lmctlfile */ if (lmname != NULL) lms = lmset_read_lm(lmfile, dict, lmname, lw, wip, uw, lmdumpdir, logmath); else lms = lmset_read_lm(lmfile, dict, "default", lw, wip, uw, lmdumpdir, logmath); if (lms == NULL) E_FATAL("lmset_read_lm(%s,%e,%e,%e) failed\n:", lmctlfile, lw, wip, uw); } else if (lmctlfile) { E_INFO("Reading LM ctl file\n"); lms = lmset_read_ctl(lmctlfile, dict, lw, wip, uw, lmdumpdir, logmath); if (lms == NULL) E_FATAL("lmset_read_ctl(%s,%e,%e,%e) failed\n:", lmctlfile, lw, wip, uw); } else { E_FATAL("You must specify either -lm or -lmctlfn\n"); } if (lms && ctl_lm == NULL) { const char *name; if (lmname == NULL) name = lms->lmarray[0]->name; else name = lmname; /* Set the default LM */ if (name) lmset_set_curlm_wname(lms, name); /* If this failed, then give up. */ if (lms->cur_lm == NULL) E_FATAL("Failed to set default LM\n"); } return lms; }
/* Decode the given mfc file and write result to given directory */ static void utt_astar(void *data, utt_res_t * ur, int32 sf, int32 ef, char *uttid) { char dagfile[1024], nbestfile[1024]; const char *latdir; const char *latext; const char *nbestext; dag_t *dag; int32 nfrm; if (ur->lmname) lmset_set_curlm_wname(lmset, ur->lmname); latdir = cmd_ln_str_r(config, "-inlatdir"); latext = cmd_ln_str_r(config, "-latext"); nbestext = cmd_ln_str_r(config, "-nbestext"); if (latdir) { build_output_uttfile(dagfile, latdir, uttid, ur->uttfile); strcat(dagfile, "."); strcat(dagfile, latext); } else sprintf(dagfile, "%s.%s", uttid, latext); ptmr_reset(&tm_utt); ptmr_start(&tm_utt); nfrm = 0; if ((dag = dag_load(dagfile, cmd_ln_int32_r(config, "-maxedge"), cmd_ln_float32_r(config, "-logbase"), cmd_ln_int32_r(config, "-dagfudge"), dict, fpen, config, logmath)) != NULL) { if (dict_filler_word(dict, dag->end->wid)) dag->end->wid = dict->finishwid; dag_remove_unreachable(dag); if (dag_bypass_filler_nodes(dag, 1.0, dict, fpen) < 0) { E_ERROR("maxedge limit (%d) exceeded\n", dag->maxedge); goto search_done; } dag_compute_hscr(dag, dict, lmset->cur_lm, 1.0); dag_remove_bypass_links(dag); E_INFO("%5d frames, %6d nodes, %8d edges, %8d bypass\n", dag->nfrm, dag->nnode, dag->nlink, dag->nbypass); nfrm = dag->nfrm; build_output_uttfile(nbestfile, nbestdir, uttid, ur->uttfile); strcat(nbestfile, "."); strcat(nbestfile, nbestext); nbest_search(dag, nbestfile, uttid, 1.0, dict, lmset->cur_lm, fpen); lm_cache_stats_dump(lmset->cur_lm); lm_cache_reset(lmset->cur_lm); } else E_ERROR("Dag load (%s) failed\n", uttid); search_done: dag_destroy(dag); ptmr_stop(&tm_utt); printf("%s: TMR: %5d Frm", uttid, nfrm); if (nfrm > 0) { printf(" %6.2f xEl", tm_utt.t_elapsed * 100.0 / nfrm); printf(" %6.2f xCPU", tm_utt.t_cpu * 100.0 / nfrm); } printf("\n"); fflush(stdout); }