| | #include <pocketsphinx.h> |
| | #include <stdio.h> |
| | #include <string.h> |
| | #include <time.h> |
| |
|
| | #include "pocketsphinx_internal.h" |
| | #include "ngram_search_fwdtree.h" |
| | #include "ps_lattice_internal.h" |
| | #include "test_macros.h" |
| |
|
| | int |
| | test_decode(ps_decoder_t *ps) |
| | { |
| | FILE *rawfh; |
| | int16 buf[2048]; |
| | size_t nread; |
| | int16 const *bptr; |
| | int nfr; |
| | ps_lattice_t *dag; |
| | acmod_t *acmod; |
| | ngram_search_t *ngs; |
| | int i, j; |
| | ps_latlink_t *link; |
| | ps_latnode_t *node; |
| | latlink_list_t *x; |
| | int32 norm, post; |
| |
|
| | ngs = (ngram_search_t *)ps->search; |
| | acmod = ps->acmod; |
| |
|
| | |
| | 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; |
| | } |
| |
|
| | |
| | TEST_EQUAL(0, ps_lattice_write(dag, "test_posterior.lat")); |
| |
|
| | |
| | |
| | i = j = 0; |
| | for (link = ps_lattice_traverse_edges(dag, NULL, NULL); |
| | link; link = ps_lattice_traverse_next(dag, NULL)) { |
| | ++i; |
| | } |
| | for (link = ps_lattice_reverse_edges(dag, NULL, NULL); |
| | link; link = ps_lattice_reverse_next(dag, NULL)) { |
| | ++j; |
| | } |
| | printf("%d forward edges, %d reverse edges\n", i, j); |
| | TEST_EQUAL(i,j); |
| | |
| | for (node = dag->nodes; node; node = node->next) { |
| | for (x = node->exits; x; x = x->next) |
| | x->link->alpha = -42; |
| | } |
| | for (node = dag->nodes; node; node = node->next) { |
| | for (x = node->entries; x; x = x->next) |
| | TEST_EQUAL(x->link->alpha, -42); |
| | } |
| | |
| | for (link = ps_lattice_traverse_edges(dag, NULL, NULL); |
| | link; link = ps_lattice_traverse_next(dag, NULL)) { |
| | link->alpha = 0; |
| | for (x = link->from->entries; x; x = x->next) { |
| | TEST_EQUAL(x->link->alpha, 0); |
| | } |
| | } |
| | |
| | for (node = dag->nodes; node; node = node->next) { |
| | for (x = node->exits; x; x = x->next) |
| | x->link->alpha = -42; |
| | } |
| | for (link = ps_lattice_reverse_edges(dag, NULL, NULL); |
| | link; link = ps_lattice_reverse_next(dag, NULL)) { |
| | link->alpha = 0; |
| | for (x = link->to->exits; x; x = x->next) { |
| | TEST_EQUAL(x->link->alpha, 0); |
| | } |
| | } |
| | |
| | |
| | link = ps_lattice_bestpath(dag, ngs->lmset, 1.0, 1.0/20.0); |
| | printf("BESTPATH: %s\n", ps_lattice_hyp(dag, link)); |
| |
|
| | |
| | post = ps_lattice_posterior(dag, ngs->lmset, 1.0/20.0); |
| | printf("Best path score: %d\n", |
| | link->path_scr + dag->final_node_ascr); |
| | printf("P(S|O) = %d\n", post); |
| |
|
| | |
| | |
| | norm = logmath_get_zero(acmod->lmath); |
| | for (x = dag->start->exits; x; x = x->next) |
| | norm = logmath_add(acmod->lmath, norm, x->link->beta + x->link->alpha); |
| | E_INFO("Sum of final alphas+betas = %d\n", dag->norm); |
| | E_INFO("Sum of initial alphas+betas = %d\n", norm); |
| | TEST_EQUAL_LOG(dag->norm, norm); |
| |
|
| | |
| | while (link) { |
| | printf("P(%s,%d) = %d = %f\n", |
| | dict_wordstr(ps->search->dict, link->from->wid), |
| | link->ef, |
| | link->alpha + link->beta - dag->norm, |
| | logmath_exp(acmod->lmath, link->alpha + link->beta - dag->norm)); |
| | link = link->best_prev; |
| | } |
| |
|
| | return 0; |
| | } |
| |
|
| | int |
| | main(int argc, char *argv[]) |
| | { |
| | ps_decoder_t *ps; |
| | cmd_ln_t *config; |
| | int rv; |
| |
|
| | (void)argc; |
| | (void)argv; |
| | TEST_ASSERT(config = |
| | ps_config_parse_json( |
| | NULL, |
| | "hmm: \"" MODELDIR "/en-us/en-us\"," |
| | "lm: \"" MODELDIR "/en-us/en-us.lm.bin\"," |
| | "dict: \"" MODELDIR "/en-us/cmudict-en-us.dict\"," |
| | "fwdtree: true," |
| | "fwdflat: false," |
| | "bestpath: true," |
| | "samprate: 16000")); |
| | TEST_ASSERT(ps = ps_init(config)); |
| | rv = test_decode(ps); |
| | ps_free(ps); |
| | ps_config_free(config); |
| |
|
| | return rv; |
| | } |
| |
|