7 #include <sphinxbase/err.h>
8 #include <sphinxbase/ad.h>
9 #include <sphinxbase/cont_ad.h>
11 #include <pocketsphinx.h>
13 #include <murphy/common/mm.h>
14 #include <murphy/common/log.h>
16 #include "decoder-set.h"
18 #include "utterance.h"
22 int decoder_set_create(context_t *ctx)
25 options_decoder_t *dec;
26 decoder_set_t *decset;
30 if (!ctx || !(opts = ctx->opts)) {
35 if (!(decset = mrp_allocz(sizeof(decoder_set_t))))
40 for (i = 0, retval = 0; i < opts->ndec; i++) {
43 sts = decoder_set_add(ctx, dec->name, dec->hmm, dec->lm,
44 dec->dict, dec->fsg, opts->topn);
46 mrp_log_error("failed to create '%s' decoder", dec->name);
52 decset->curdec = decset->decs;
57 void decoder_set_destroy(context_t *ctx)
59 decoder_set_t *decset;
63 if (ctx && (decset = ctx->decset)) {
66 for (i = 0; i < decset->ndec; i++) {
67 dec = decset->decs + i;
69 mrp_free((void *)dec->name);
74 for (j = 0; j < dec->nfsg; j++)
75 mrp_free((void *)dec->fsgs[j]);
76 mrp_free((void *)dec->fsgs);
79 mrp_free(decset->decs);
85 int decoder_set_add(context_t *ctx, const char *decoder_name,
86 const char *hmm, const char *lm,
87 const char *dict, const char *fsg,
90 #define FSG_NAMES_MAX 255
92 static const arg_t arg_defs[] = {
98 decoder_set_t *decset;
108 const char *fsgs[FSG_NAMES_MAX + 1];
112 if (!ctx || !(opts = ctx->opts) || !(decset = ctx->decset)) {
123 hmm = opts->decs[0].hmm;
125 curidx = decset->curdec - decset->decs;
126 new_size = sizeof(decoder_t) * (decset->ndec + 2);
128 if (!(decset->decs = realloc(decset->decs, new_size)) ||
129 !(dupnam = mrp_strdup(decoder_name)))
134 memset(decset->decs + decset->ndec, 0, sizeof(decoder_t) * 2);
136 dec = decset->decs + decset->ndec;
137 decset->curdec = decset->decs + curidx;
139 if (!(cfg = cmd_ln_init(NULL, arg_defs, 0, NULL))) {
140 mrp_log_error("failed to create cmd line struct");
144 cmd_ln_set_str_r(cfg, "-hmm", hmm);
145 cmd_ln_set_str_r(cfg, "-lm", lm);
146 cmd_ln_set_str_r(cfg, "-dict", dict);
147 cmd_ln_set_int_r(cfg, "-topn", topn);
148 cmd_ln_set_float_r(cfg, "-samprate", (double)opts->rate);
149 cmd_ln_set_boolean_r(cfg, "-verbose",
150 (ctx->verbose || opts->logfn != NULL) ? true : false);
152 if (opts->logfn != NULL) {
153 if (strcmp(opts->logfn, "srs"))
154 cmd_ln_set_str_r(cfg, "-logfn", opts->logfn);
158 err_set_logfp(stdout);
162 cmd_ln_set_str_r(cfg, "-fsg", fsg);
164 if (!(ps = ps_init(cfg)))
170 if (!(set = ps_get_fsgset(ps))) {
171 mrp_log_error("can't find fsg models");
176 mrp_log_info("found fsg models:");
178 for (nfsg = 0, sit = fsg_set_iter(set);
179 nfsg < FSG_NAMES_MAX && sit;
180 nfsg++, sit = fsg_set_iter_next(sit))
182 model = fsg_set_iter_fsg(sit);
183 modnam = fsg_model_name(model);
184 fsgs[nfsg] = mrp_strdup(modnam ? modnam : "<anonymous>");
186 mrp_log_info(" %s", fsgs[nfsg]);
190 mrp_log_info(" <none>");
199 dec->fsgs = mrp_allocz(sizeof(const char *) * (nfsg + 1));
201 dec->utproc = nfsg ? UTTERANCE_PROCESSOR_FSG:UTTERANCE_PROCESSOR_ACOUSTIC;
205 mrp_log_error("No memory");
210 memcpy((void *)dec->fsgs, (void *)fsgs, sizeof(const char *) * nfsg);
219 bool decoder_set_contains(context_t *ctx, const char *decoder_name)
221 decoder_set_t *decset;
224 if (!ctx || !(decset = ctx->decset))
227 for (d = decset->decs; d->name; d++) {
228 if (!strcmp(decoder_name, d->name))
235 int decoder_set_use(context_t *ctx, const char *decoder_name)
237 decoder_set_t *decset;
240 if (!ctx || !(decset = ctx->decset))
244 decset->curdec = decset->decs;
248 for (d = decset->decs; d->name; d++) {
249 if (!strcmp(decoder_name, d->name)) {
251 mrp_debug("switching to decoder '%s'", decoder_name);
259 mrp_log_error("unable to set decoder '%s': can't find it", decoder_name);
264 const char *decoder_set_name(context_t *ctx)
266 decoder_set_t *decset;
269 if (!ctx || !(decset = ctx->decset) || !(dec = decset->curdec))
279 * indent-tabs-mode: nil