| | #include <pocketsphinx.h> |
| | #include <stdio.h> |
| | #include <string.h> |
| |
|
| | #include "pocketsphinx_internal.h" |
| |
|
| | #include "test_macros.h" |
| |
|
| | int |
| | ps_decoder_test(cmd_ln_t *config, char const *sname, char const *expected) |
| | { |
| | ps_decoder_t *ps; |
| | mfcc_t **cepbuf; |
| | float32 **floatbuf; |
| | FILE *rawfh; |
| | int16 *buf; |
| | int16 const *bptr; |
| | size_t nread; |
| | size_t nsamps; |
| | int32 nfr, i, score, prob; |
| | char const *hyp; |
| | double n_speech, n_cpu, n_wall; |
| | ps_seg_t *seg; |
| | char *prev_cmn; |
| |
|
| | TEST_ASSERT(ps = ps_init(config)); |
| | prev_cmn = ckd_salloc(ps_get_cmn(ps, FALSE)); |
| | printf("CMN: %s\n", prev_cmn); |
| | err_set_loglevel(ERR_INFO); |
| | |
| | TEST_ASSERT(rawfh = fopen(DATADIR "/goforward.raw", "rb")); |
| | ps_decode_raw(ps, rawfh, -1); |
| | hyp = ps_get_hyp(ps, &score); |
| | prob = ps_get_prob(ps); |
| | printf("%s: %s (%d, %d)\n", sname, hyp, score, prob); |
| | TEST_EQUAL(0, strcmp(hyp, expected)); |
| | TEST_ASSERT(prob <= 0); |
| | ps_get_utt_time(ps, &n_speech, &n_cpu, &n_wall); |
| | printf("%.2f seconds speech, %.2f seconds CPU, %.2f seconds wall\n", |
| | n_speech, n_cpu, n_wall); |
| | printf("%.2f xRT (CPU), %.2f xRT (elapsed)\n", |
| | n_cpu / n_speech, n_wall / n_speech); |
| | TEST_ASSERT(0 != strcmp(prev_cmn, ps_get_cmn(ps, FALSE))); |
| | ckd_free(prev_cmn); |
| | prev_cmn = ckd_salloc(ps_get_cmn(ps, FALSE)); |
| | printf("CMN: %s\n", prev_cmn); |
| |
|
| | |
| | clearerr(rawfh); |
| | fseek(rawfh, 0, SEEK_END); |
| | nsamps = ftell(rawfh) / sizeof(*buf); |
| | fseek(rawfh, 0, SEEK_SET); |
| | ps_start_stream(ps); |
| | TEST_EQUAL(0, ps_start_utt(ps)); |
| | nsamps = 2048; |
| | buf = ckd_calloc(nsamps, sizeof(*buf)); |
| | i = 0; |
| | while (!feof(rawfh)) { |
| | nread = fread(buf, sizeof(*buf), nsamps, rawfh); |
| | ps_process_raw(ps, buf, nread, FALSE, FALSE); |
| | if (i++ == 1) { |
| | |
| | TEST_ASSERT(0 != strcmp(prev_cmn, ps_get_cmn(ps, TRUE))); |
| | ckd_free(prev_cmn); |
| | prev_cmn = ckd_salloc(ps_get_cmn(ps, FALSE)); |
| | printf("CMN: %s\n", prev_cmn); |
| | } |
| | } |
| | TEST_EQUAL(0, ps_end_utt(ps)); |
| | hyp = ps_get_hyp(ps, &score); |
| | prob = ps_get_prob(ps); |
| | printf("%s: %s (%d, %d)\n", sname, hyp, score, prob); |
| | TEST_EQUAL(0, strcmp(hyp, expected)); |
| | ps_get_utt_time(ps, &n_speech, &n_cpu, &n_wall); |
| | printf("%.2f seconds speech, %.2f seconds CPU, %.2f seconds wall\n", |
| | n_speech, n_cpu, n_wall); |
| | printf("%.2f xRT (CPU), %.2f xRT (elapsed)\n", |
| | n_cpu / n_speech, n_wall / n_speech); |
| |
|
| | |
| | ps_start_stream(ps); |
| | clearerr(rawfh); |
| | fseek(rawfh, 0, SEEK_END); |
| | nsamps = ftell(rawfh) / sizeof(*buf); |
| | fseek(rawfh, 0, SEEK_SET); |
| | bptr = buf = ckd_realloc(buf, nsamps * sizeof(*buf)); |
| | TEST_EQUAL(nsamps, fread(buf, sizeof(*buf), nsamps, rawfh)); |
| | fe_process_frames(ps->acmod->fe, &bptr, &nsamps, NULL, &nfr); |
| | cepbuf = ckd_calloc_2d(nfr + 1, |
| | fe_get_output_size(ps->acmod->fe), |
| | sizeof(**cepbuf)); |
| | fe_start_utt(ps->acmod->fe); |
| | fe_process_frames(ps->acmod->fe, &bptr, &nsamps, cepbuf, &nfr); |
| | fe_end_utt(ps->acmod->fe, cepbuf[nfr], &i); |
| |
|
| | |
| | #ifdef FIXED_POINT |
| | floatbuf = ckd_calloc_2d(nfr + 1, |
| | fe_get_output_size(ps->acmod->fe), |
| | sizeof(**floatbuf)); |
| | fe_mfcc_to_float(ps->acmod->fe, cepbuf, floatbuf, nfr + 1); |
| | #else |
| | floatbuf = cepbuf; |
| | #endif |
| |
|
| | TEST_EQUAL(0, ps_start_utt(ps)); |
| | for (i = 0; i < nfr; ++i) { |
| | ps_process_cep(ps, floatbuf + i, 1, FALSE, FALSE); |
| | if (i == nfr - 5) { |
| | |
| | TEST_ASSERT(0 != strcmp(prev_cmn, ps_get_cmn(ps, TRUE))); |
| | ckd_free(prev_cmn); |
| | prev_cmn = ckd_salloc(ps_get_cmn(ps, FALSE)); |
| | printf("CMN: %s\n", prev_cmn); |
| | } |
| | } |
| | TEST_EQUAL(0, ps_end_utt(ps)); |
| | hyp = ps_get_hyp(ps, &score); |
| | prob = ps_get_prob(ps); |
| | printf("%s: %s (%d, %d)\n", sname, hyp, score, prob); |
| | TEST_EQUAL(0, strcmp(hyp, expected)); |
| | TEST_ASSERT(prob <= 0); |
| | for (seg = ps_seg_iter(ps); seg; |
| | seg = ps_seg_next(seg)) { |
| | char const *word; |
| | int sf, ef; |
| | int32 post, lscr, ascr, lback; |
| |
|
| | word = ps_seg_word(seg); |
| | ps_seg_frames(seg, &sf, &ef); |
| | post = ps_seg_prob(seg, &ascr, &lscr, &lback); |
| | printf("%s (%d:%d) P(w|o) = %f ascr = %d lscr = %d lback = %d post=%d\n", word, sf, ef, |
| | logmath_exp(ps_get_logmath(ps), post), ascr, lscr, lback, post); |
| | } |
| |
|
| | ps_get_utt_time(ps, &n_speech, &n_cpu, &n_wall); |
| | printf("%.2f seconds speech, %.2f seconds CPU, %.2f seconds wall\n", |
| | n_speech, n_cpu, n_wall); |
| | printf("%.2f xRT (CPU), %.2f xRT (elapsed)\n", |
| | n_cpu / n_speech, n_wall / n_speech); |
| | ps_get_all_time(ps, &n_speech, &n_cpu, &n_wall); |
| | printf("TOTAL: %.2f seconds speech, %.2f seconds CPU, %.2f seconds wall\n", |
| | n_speech, n_cpu, n_wall); |
| | printf("TOTAL: %.2f xRT (CPU), %.2f xRT (elapsed)\n", |
| | n_cpu / n_speech, n_wall / n_speech); |
| | TEST_ASSERT(0 != strcmp(prev_cmn, ps_get_cmn(ps, FALSE))); |
| | ckd_free(prev_cmn); |
| | prev_cmn = ckd_salloc(ps_get_cmn(ps, FALSE)); |
| | printf("CMN: %s\n", prev_cmn); |
| |
|
| | fclose(rawfh); |
| | ps_free(ps); |
| | ps_config_free(config); |
| | #ifdef FIXED_POINT |
| | ckd_free_2d(floatbuf); |
| | #endif |
| | ckd_free_2d(cepbuf); |
| | ckd_free(buf); |
| | ckd_free(prev_cmn); |
| |
|
| | return 0; |
| | } |
| |
|