void ps_search_deinit(ps_search_t *search) { /* FIXME: We will have refcounting on acmod, config, etc, at which * point we will free them here too. */ dict_free(search->dict); dict2pid_free(search->d2p); ckd_free(search->hyp_str); ps_lattice_free(search->dag); }
int ps_start_utt(ps_decoder_t *ps) { int rv; char uttid[16]; if (ps->search == NULL) { E_ERROR("No search module is selected, did you forget to " "specify a language model or grammar?\n"); return -1; } ptmr_reset(&ps->perf); ptmr_start(&ps->perf); sprintf(uttid, "%09u", ps->uttno); ++ps->uttno; /* Remove any residual word lattice and hypothesis. */ ps_lattice_free(ps->search->dag); ps->search->dag = NULL; ps->search->last_link = NULL; ps->search->post = 0; ckd_free(ps->search->hyp_str); ps->search->hyp_str = NULL; if ((rv = acmod_start_utt(ps->acmod)) < 0) return rv; /* Start logging features and audio if requested. */ if (ps->mfclogdir) { char *logfn = string_join(ps->mfclogdir, "/", uttid, ".mfc", NULL); FILE *mfcfh; E_INFO("Writing MFCC log file: %s\n", logfn); if ((mfcfh = fopen(logfn, "wb")) == NULL) { E_ERROR_SYSTEM("Failed to open MFCC log file %s", logfn); ckd_free(logfn); return -1; } ckd_free(logfn); acmod_set_mfcfh(ps->acmod, mfcfh); } if (ps->rawlogdir) { char *logfn = string_join(ps->rawlogdir, "/", uttid, ".raw", NULL); FILE *rawfh; E_INFO("Writing raw audio log file: %s\n", logfn); if ((rawfh = fopen(logfn, "wb")) == NULL) { E_ERROR_SYSTEM("Failed to open raw audio log file %s", logfn); ckd_free(logfn); return -1; } ckd_free(logfn); acmod_set_rawfh(ps->acmod, rawfh); } if (ps->senlogdir) { char *logfn = string_join(ps->senlogdir, "/", uttid, ".sen", NULL); FILE *senfh; E_INFO("Writing senone score log file: %s\n", logfn); if ((senfh = fopen(logfn, "wb")) == NULL) { E_ERROR_SYSTEM("Failed to open senone score log file %s", logfn); ckd_free(logfn); return -1; } ckd_free(logfn); acmod_set_senfh(ps->acmod, senfh); } /* Start auxiliary phone loop search. */ if (ps->phone_loop) ps_search_start(ps->phone_loop); return ps_search_start(ps->search); }
int main(int argc, char *argv[]) { ps_decoder_t *ps; cmd_ln_t *config; acmod_t *acmod; ngram_search_t *ngs; ps_lattice_t *dag; clock_t c; int i; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/en-us/en-us", "-lm", MODELDIR "/en-us/en-us.lm.bin", "-dict", MODELDIR "/en-us/cmudict-en-us.dict", "-fwdtree", "yes", "-fwdflat", "no", "-bestpath", "yes", "-samprate", "16000", NULL)); TEST_ASSERT(ps = ps_init(config)); ngs = (ngram_search_t *)ps->search; acmod = ps->acmod; acmod_set_grow(ps->acmod, TRUE); setbuf(stdout, NULL); c = clock(); for (i = 0; i < 5; ++i) { FILE *rawfh; int16 buf[2048]; size_t nread; int16 const *bptr; int nfr; ps_astar_t *nbest; ps_latpath_t *path; char *besthyp; const char *astar_besthyp = NULL; int32 astar_hyp_score; int i; /* PocketSphinx API would do this for us but we have to do it manually here. */ ps_lattice_free(ps->search->dag); ps->search->dag = NULL; TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); TEST_EQUAL(0, acmod_start_utt(acmod)); ngram_fwdtree_start(ngs); while (!feof(rawfh)) { nread = fread(buf, sizeof(*buf), 2048, rawfh); bptr = buf; while ((nfr = acmod_process_raw(acmod, &bptr, &nread, FALSE)) > 0) { while (acmod->n_feat_frame > 0) { ngram_fwdtree_search(ngs, acmod->output_frame); acmod_advance(acmod); } } } ngram_fwdtree_finish(ngs); printf("FWDTREE: %s\n", ngram_search_bp_hyp(ngs, ngram_search_find_exit(ngs, -1, NULL))); TEST_ASSERT(acmod_end_utt(acmod) >= 0); fclose(rawfh); dag = ngram_search_lattice(ps->search); if (dag == NULL) { E_ERROR("Failed to build DAG!\n"); return 1; } besthyp = ckd_salloc (ps_lattice_hyp(dag, ps_lattice_bestpath (dag, ngs->lmset, 9.5/6.5, 1.0))); printf("BESTPATH: %s\n", besthyp); TEST_ASSERT(nbest = ps_astar_start(dag, ngs->lmset, 9.5/6.5, 0, -1, -1, -1)); i = 0; astar_hyp_score = WORST_SCORE; while ((path = ps_astar_next(nbest))) { if (i < 10) printf("NBEST %d: %s (%d)\n", i, ps_astar_hyp(nbest, path), path->score); if (path->score > astar_hyp_score) { astar_hyp_score = path->score; astar_besthyp = ps_astar_hyp(nbest, path); } i++; } TEST_EQUAL(0, strcmp(besthyp, astar_besthyp)); ps_astar_finish(nbest); ckd_free(besthyp); } printf("%s\n", ngram_search_bp_hyp(ngs, ngram_search_find_exit(ngs, -1, NULL))); TEST_EQUAL(0, strcmp("go forward ten meters", ngram_search_bp_hyp(ngs, ngram_search_find_exit(ngs, -1, NULL)))); c = clock() - c; printf("5 * fwdtree + bestpath + N-best search in %.2f sec\n", (double)c / CLOCKS_PER_SEC); ps_free(ps); cmd_ln_free_r(config); return 0; }