static void phmm_free(allphone_search_t * allphs) { s3cipid_t ci; bin_mdef_t *mdef; if (!allphs->ci_phmm) //nothing to free return; ckd_free(allphs->ci_phmm[0]->lc); mdef = ((ps_search_t *) allphs)->acmod->mdef; for (ci = 0; ci < mdef_n_ciphone(mdef); ++ci) { phmm_t *p, *next; for (p = allphs->ci_phmm[ci]; p; p = next) { plink_t *l, *lnext; next = p->next; for (l = p->succlist; l; l = lnext) { lnext = l->next; ckd_free(l); } hmm_deinit(&(p->hmm)); ckd_free(p); } } ckd_free(allphs->ci_phmm); }
static void fsg_psubtree_free(fsg_pnode_t * head) { fsg_pnode_t *next; while (head) { next = head->alloc_next; hmm_deinit(&head->hmm); ckd_free(head); head = next; } }
static int phone_loop_search_reinit(ps_search_t *search, dict_t *dict, dict2pid_t *d2p) { phone_loop_search_t *pls = (phone_loop_search_t *)search; cmd_ln_t *config = ps_search_config(search); acmod_t *acmod = ps_search_acmod(search); int i; /* Free old dict2pid, dict, if necessary. */ ps_search_base_reinit(search, dict, d2p); /* Initialize HMM context. */ if (pls->hmmctx) hmm_context_free(pls->hmmctx); pls->hmmctx = hmm_context_init(bin_mdef_n_emit_state(acmod->mdef), acmod->tmat->tp, NULL, acmod->mdef->sseq); if (pls->hmmctx == NULL) return -1; /* Initialize penalty storage */ pls->n_phones = bin_mdef_n_ciphone(acmod->mdef); pls->window = cmd_ln_int32_r(config, "-pl_window"); if (pls->penalties) ckd_free(pls->penalties); pls->penalties = (int32 *)ckd_calloc(pls->n_phones, sizeof(*pls->penalties)); if (pls->pen_buf) ckd_free_2d(pls->pen_buf); pls->pen_buf = (int32 **)ckd_calloc_2d(pls->window, pls->n_phones, sizeof(**pls->pen_buf)); /* Initialize phone HMMs. */ if (pls->hmms) { for (i = 0; i < pls->n_phones; ++i) hmm_deinit((hmm_t *)&pls->hmms[i]); ckd_free(pls->hmms); } pls->hmms = (hmm_t *)ckd_calloc(pls->n_phones, sizeof(*pls->hmms)); for (i = 0; i < pls->n_phones; ++i) { hmm_init(pls->hmmctx, (hmm_t *)&pls->hmms[i], FALSE, bin_mdef_pid2ssid(acmod->mdef, i), bin_mdef_pid2tmatid(acmod->mdef, i)); } pls->penalty_weight = cmd_ln_float64_r(config, "-pl_weight"); pls->beam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-pl_beam")) >> SENSCR_SHIFT; pls->pbeam = logmath_log(acmod->lmath, cmd_ln_float64_r(config, "-pl_pbeam")) >> SENSCR_SHIFT; pls->pip = logmath_log(acmod->lmath, cmd_ln_float32_r(config, "-pl_pip")) >> SENSCR_SHIFT; E_INFO("State beam %d Phone exit beam %d Insertion penalty %d\n", pls->beam, pls->pbeam, pls->pip); return 0; }
static void phone_loop_search_free(ps_search_t *search) { phone_loop_search_t *pls = (phone_loop_search_t *)search; int i; ps_search_deinit(search); for (i = 0; i < pls->n_phones; ++i) hmm_deinit((hmm_t *)&pls->phones[i]); phone_loop_search_free_renorm(pls); ckd_free(pls->phones); hmm_context_free(pls->hmmctx); ckd_free(pls); }
static void ngram_fwdflat_free_1ph(ngram_search_t *ngs) { int i, w; int n_words = ps_search_n_words(ngs); for (i = w = 0; w < n_words; ++w) { if (!dict_is_single_phone(ps_search_dict(ngs), w)) continue; hmm_deinit(&ngs->rhmm_1ph[i].hmm); ++i; } ckd_free(ngs->rhmm_1ph); ngs->rhmm_1ph = NULL; ckd_free(ngs->single_phone_wid); }