int main(int argc, char *argv[]) { ps_decoder_t *ps; cmd_ln_t *config; TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/hmm/en_US/hub4wsj_sc_8k", "-lm", MODELDIR "/lm/en_US/wsj0vp.5000.DMP", "-dict", MODELDIR "/lm/en_US/cmu07a.dic", "-fwdtree", "yes", "-fwdflat", "yes", "-bestpath", "yes", "-input_endian", "little", "-samprate", "16000", NULL)); TEST_ASSERT(ps = ps_init(config)); TEST_ASSERT(config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm", MODELDIR "/hmm/en/tidigits", "-lm", MODELDIR "/lm/en/tidigits.DMP", "-dict", MODELDIR "/lm/en/tidigits.dic", "-fwdtree", "yes", "-fwdflat", "yes", "-bestpath", "yes", "-input_endian", "little", "-samprate", "16000", NULL)); TEST_EQUAL(0, ps_reinit(ps, config)); ps_free(ps); return 0; }
ps_decoder_t * ps_init(cmd_ln_t *config) { ps_decoder_t *ps; ps = ckd_calloc(1, sizeof(*ps)); ps->refcount = 1; if (ps_reinit(ps, config) < 0) { ps_free(ps); return NULL; } return ps; }
ps_decoder_t * ps_init(cmd_ln_t *config) { ps_decoder_t *ps; if (!config) { E_ERROR("No configuration specified"); return NULL; } ps = ckd_calloc(1, sizeof(*ps)); ps->refcount = 1; if (ps_reinit(ps, config) < 0) { ps_free(ps); return NULL; } return ps; }
static void gst_pocketsphinx_set_property(GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstPocketSphinx *ps = GST_POCKETSPHINX(object); switch (prop_id) { case PROP_CONFIGURED: ps_reinit(ps->ps, ps->config); break; case PROP_HMM_DIR: gst_pocketsphinx_set_string(ps, "-hmm", value); break; case PROP_LM_FILE: /* FSG and LM are mutually exclusive. */ gst_pocketsphinx_set_string(ps, "-fsg", NULL); gst_pocketsphinx_set_string(ps, "-lmctl", NULL); gst_pocketsphinx_set_string(ps, "-lm", value); break; case PROP_LMCTL_FILE: /* FSG and LM are mutually exclusive. */ gst_pocketsphinx_set_string(ps, "-fsg", NULL); gst_pocketsphinx_set_string(ps, "-lmctl", value); gst_pocketsphinx_set_string(ps, "-lm", NULL); break; case PROP_LM_NAME: gst_pocketsphinx_set_string(ps, "-fsg", NULL); gst_pocketsphinx_set_string(ps, "-lm", NULL); gst_pocketsphinx_set_string(ps, "-lmname", value); /** * Chances are that lmctl is already loaded and all * corresponding searches are configured, so we simply * try to set the search */ if (value != NULL) { ps_set_search(ps->ps, g_value_get_string(value)); } break; case PROP_DICT_FILE: gst_pocketsphinx_set_string(ps, "-dict", value); break; case PROP_MLLR_FILE: gst_pocketsphinx_set_string(ps, "-mllr", value); break; case PROP_FSG_MODEL: { fsg_model_t *fsg = g_value_get_pointer(value); const char *name = fsg_model_name(fsg); ps_set_fsg(ps->ps, name, fsg); ps_set_search(ps->ps, name); } break; case PROP_FSG_FILE: /* FSG and LM are mutually exclusive */ gst_pocketsphinx_set_string(ps, "-lm", NULL); gst_pocketsphinx_set_string(ps, "-fsg", value); break; case PROP_FWDFLAT: gst_pocketsphinx_set_boolean(ps, "-fwdflat", value); break; case PROP_BESTPATH: gst_pocketsphinx_set_boolean(ps, "-bestpath", value); break; case PROP_LATDIR: if (ps->latdir) g_free(ps->latdir); ps->latdir = g_strdup(g_value_get_string(value)); break; case PROP_MAXHMMPF: gst_pocketsphinx_set_int(ps, "-maxhmmpf", value); break; case PROP_MAXWPF: gst_pocketsphinx_set_int(ps, "-maxwpf", value); break; case PROP_BEAM: gst_pocketsphinx_set_double(ps, "-beam", value); break; case PROP_PBEAM: gst_pocketsphinx_set_double(ps, "-pbeam", value); break; case PROP_WBEAM: gst_pocketsphinx_set_double(ps, "-wbeam", value); break; case PROP_DSRATIO: gst_pocketsphinx_set_int(ps, "-ds", value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); return; } }
/*! function to load a grammar to the asr interface */ static switch_status_t pocketsphinx_asr_load_grammar(switch_asr_handle_t *ah, const char *grammar, const char *name) { char *jsgf, *dic, *model, *rate = NULL; pocketsphinx_t *ps = (pocketsphinx_t *) ah->private_info; switch_status_t status = SWITCH_STATUS_FALSE; if (switch_test_flag(ps, PSFLAG_READY)) { ps_end_utt(ps->ps); switch_clear_flag(ps, PSFLAG_READY); } if (switch_is_file_path(grammar)) { char *dot = strrchr(grammar, '.'); if (dot && !strcmp(dot, ".gram")) { jsgf = strdup(grammar); } else { jsgf = switch_mprintf("%s.gram", grammar); } } else { jsgf = switch_mprintf("%s%s%s.gram", SWITCH_GLOBAL_dirs.grammar_dir, SWITCH_PATH_SEPARATOR, grammar); } if (ah->rate == 8000) { model = switch_mprintf("%s%smodel%s%s", SWITCH_GLOBAL_dirs.grammar_dir, SWITCH_PATH_SEPARATOR, SWITCH_PATH_SEPARATOR, globals.model8k); } else { model = switch_mprintf("%s%smodel%s%s", SWITCH_GLOBAL_dirs.grammar_dir, SWITCH_PATH_SEPARATOR, SWITCH_PATH_SEPARATOR, globals.model16k); } dic = switch_mprintf("%s%s%s", SWITCH_GLOBAL_dirs.grammar_dir, SWITCH_PATH_SEPARATOR, globals.dictionary); if (switch_file_exists(dic, ah->memory_pool) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't open dictionary %s.\n", dic); goto end; } if (switch_file_exists(model, ah->memory_pool) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Can't open speech model %s.\n", model); goto end; } if (switch_file_exists(jsgf, ah->memory_pool) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Can't open grammar file %s.\n", jsgf); goto end; } rate = switch_mprintf("%d", ah->rate); switch_assert(jsgf && dic && model); ps->config = cmd_ln_init(ps->config, ps_args(), FALSE, "-samprate", rate, "-hmm", model, "-jsgf", jsgf, "-lw", globals.language_weight, "-dict", dic, "-frate", "50", "-silprob", "0.005", NULL); if (ps->config == NULL) { status = SWITCH_STATUS_GENERR; goto end; } switch_mutex_lock(ps->flag_mutex); if (switch_test_flag(ps, PSFLAG_ALLOCATED)) { ps_reinit(ps->ps, ps->config); } else { if (!(ps->ps = ps_init(ps->config))) { switch_mutex_unlock(ps->flag_mutex); goto end; } switch_set_flag(ps, PSFLAG_ALLOCATED); } switch_mutex_unlock(ps->flag_mutex); ps_start_utt(ps->ps, NULL); switch_set_flag(ps, PSFLAG_READY); switch_safe_free(ps->grammar); ps->grammar = strdup(grammar); status = SWITCH_STATUS_SUCCESS; end: switch_safe_free(rate); switch_safe_free(jsgf); switch_safe_free(dic); switch_safe_free(model); return status; }
static void gst_pocketsphinx_set_property(GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstPocketSphinx *ps = GST_POCKETSPHINX(object); switch (prop_id) { case PROP_HMM_DIR: gst_pocketsphinx_set_string(ps, "-hmm", value); if (ps->ps) { /* Reinitialize the decoder with the new acoustic model. */ ps_reinit(ps->ps, NULL); } break; case PROP_LM_FILE: /* FSG and LM are mutually exclusive. */ gst_pocketsphinx_set_string(ps, "-fsg", NULL); gst_pocketsphinx_set_string(ps, "-lmctl", NULL); gst_pocketsphinx_set_string(ps, "-lm", value); break; case PROP_LMCTL_FILE: /* FSG and LM are mutually exclusive. */ gst_pocketsphinx_set_string(ps, "-fsg", NULL); gst_pocketsphinx_set_string(ps, "-lmctl", value); gst_pocketsphinx_set_string(ps, "-lm", NULL); break; case PROP_LM_NAME: gst_pocketsphinx_set_string(ps, "-fsg", NULL); gst_pocketsphinx_set_string(ps, "-lmname", value); break; case PROP_DICT_FILE: gst_pocketsphinx_set_string(ps, "-dict", value); if (ps->ps) { /* Reinitialize the decoder with the new dictionary. */ ps_reinit(ps->ps, NULL); } break; case PROP_MLLR_FILE: gst_pocketsphinx_set_string(ps, "-mllr", value); /* Reinitialize the decoder with the new MLLR transform. */ if (ps->ps) ps_reinit(ps->ps, NULL); break; case PROP_FSG_MODEL: { fsg_model_t *fsg = g_value_get_pointer(value); const char *name = fsg_model_name(fsg); ps_set_fsg(ps->ps, name, fsg); ps_set_search(ps->ps, name); } break; case PROP_FSG_FILE: /* FSG and LM are mutually exclusive */ gst_pocketsphinx_set_string(ps, "-lm", NULL); gst_pocketsphinx_set_string(ps, "-fsg", value); break; case PROP_FWDFLAT: gst_pocketsphinx_set_boolean(ps, "-fwdflat", value); break; case PROP_BESTPATH: gst_pocketsphinx_set_boolean(ps, "-bestpath", value); break; case PROP_LATDIR: if (ps->latdir) g_free(ps->latdir); ps->latdir = g_strdup(g_value_get_string(value)); break; case PROP_NBEST_SIZE: ps->n_best_size = g_value_get_int(value); break; case PROP_MAXHMMPF: gst_pocketsphinx_set_int(ps, "-maxhmmpf", value); break; case PROP_MAXWPF: gst_pocketsphinx_set_int(ps, "-maxwpf", value); break; case PROP_BEAM: gst_pocketsphinx_set_float(ps, "-beam", value); break; case PROP_PBEAM: gst_pocketsphinx_set_float(ps, "-pbeam", value); break; case PROP_WBEAM: gst_pocketsphinx_set_float(ps, "-wbeam", value); break; case PROP_DSRATIO: gst_pocketsphinx_set_int(ps, "-ds", value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); return; } }