static GstFlowReturn gst_pocketsphinx_render (GstBaseSink * asink, GstBuffer * buffer) { GstPocketSphinx *sphinxsink = GST_POCKETSPHINX (asink); if (!sphinxsink->ad.initialized) { g_signal_emit (sphinxsink, gst_pocketsphinx_signals[SIGNAL_INITIALIZATION], 0, NULL); /* We initialized the cmd_ln module earlier. */ fbs_init(0, NULL); g_signal_emit (sphinxsink, gst_pocketsphinx_signals[SIGNAL_AFTER_INITIALIZATION], 0, NULL); sphinxsink->ad.initialized = TRUE; } gst_buffer_ref (buffer); gst_adapter_push (sphinxsink->adapter, buffer); while (gst_adapter_available (sphinxsink->adapter) >= REQUIRED_FRAME_BYTES) { if (sphinxsink->ad.calibrated) { gst_pocketsphinx_process_chunk (sphinxsink); } else { gst_pocketsphinx_calibrate_chunk (sphinxsink); } gst_adapter_flush (sphinxsink->adapter, REQUIRED_FRAME_BYTES); } return GST_FLOW_OK; }
static gboolean gst_pocketsphinx_stop (GstBaseSink * asink) { GstPocketSphinx *sphinxsink = GST_POCKETSPHINX (asink); cont_ad_close (sphinxsink->cont); return TRUE; }
static void gst_pocketsphinx_finalize(GObject * gobject) { GstPocketSphinx *ps = GST_POCKETSPHINX(gobject); ps_free(ps->ps); cmd_ln_free_r(ps->config); g_free(ps->last_result); G_OBJECT_CLASS(gst_pocketsphinx_parent_class)->finalize(gobject); }
int32 gst_pocketsphinx_ad_read(ad_rec_t *ad, int16 *buf, int32 max) { GstPocketSphinx *sphinxsink = GST_POCKETSPHINX (((GstSphinxSinkAd *)ad)->self); memcpy ((void *)buf, gst_adapter_peek (sphinxsink->adapter, REQUIRED_FRAME_BYTES), REQUIRED_FRAME_BYTES); return REQUIRED_FRAME_SAMPLES; }
static void gst_pocketsphinx_finalize(GObject * gobject) { GstPocketSphinx *ps = GST_POCKETSPHINX(gobject); g_hash_table_foreach(ps->arghash, string_disposal, NULL); g_hash_table_destroy(ps->arghash); g_free(ps->last_result); ps_free(ps->ps); cmd_ln_free_r(ps->config); GST_CALL_PARENT(G_OBJECT_CLASS, finalize,(gobject)); }
static void gst_pocketsphinx_finalize (GObject * gobject) { GstPocketSphinx *sphinxsink = GST_POCKETSPHINX (gobject); gst_adapter_clear (sphinxsink->adapter); g_object_unref (sphinxsink->adapter); g_hash_table_foreach (sphinxsink->arghash, string_disposal, NULL); g_hash_table_destroy (sphinxsink->arghash); GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (gobject)); }
static gboolean gst_pocketsphinx_start (GstBaseSink * asink) { GstPocketSphinx *sphinxsink = GST_POCKETSPHINX (asink); GstSphinxSinkAd *ad = &sphinxsink->ad; ad->self = sphinxsink; ad->sps = 16000; ad->self = sphinxsink; ad->bps = sizeof(int16); ad->calibrated = FALSE; ad->calibrate_started = FALSE; sphinxsink->cont = cont_ad_init ((ad_rec_t *)ad, gst_pocketsphinx_ad_read); return TRUE; }
static GstFlowReturn gst_pocketsphinx_chain(GstPad * pad, GstBuffer * buffer) { GstPocketSphinx *ps; ps = GST_POCKETSPHINX(GST_OBJECT_PARENT(pad)); /* Start an utterance for the first buffer we get (i.e. we assume * that the VADER is "leaky") */ if (!ps->listening) { ps->listening = TRUE; ps_start_utt(ps->ps, NULL); } ps_process_raw(ps->ps, (short *)GST_BUFFER_DATA(buffer), GST_BUFFER_SIZE(buffer) / sizeof(short), FALSE, FALSE); /* Get a partial result every now and then, see if it is different. */ if (ps->last_result_time == 0 /* Check every 100 milliseconds. */ || (GST_BUFFER_TIMESTAMP(buffer) - ps->last_result_time) > 100*10*1000) { int32 score; char const *hyp; char const *uttid; hyp = ps_get_hyp(ps->ps, &score, &uttid); ps->last_result_time = GST_BUFFER_TIMESTAMP(buffer); if (hyp && strlen(hyp) > 0) { if (ps->last_result == NULL || 0 != strcmp(ps->last_result, hyp)) { g_free(ps->last_result); ps->last_result = g_strdup(hyp); /* Emit a signal for applications. */ g_signal_emit(ps, gst_pocketsphinx_signals[SIGNAL_PARTIAL_RESULT], 0, hyp, uttid); } } } gst_buffer_unref(buffer); return GST_FLOW_OK; }
static void gst_pocketsphinx_get_property(GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstPocketSphinx *ps = GST_POCKETSPHINX(object); switch (prop_id) { case PROP_DECODER: g_value_set_boxed(value, ps->ps); break; case PROP_CONFIGURED: g_value_set_boolean(value, ps->ps != NULL); break; case PROP_HMM_DIR: g_value_set_string(value, cmd_ln_str_r(ps->config, "-hmm")); break; case PROP_LM_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-lm")); break; case PROP_LMCTL_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-lmctl")); break; case PROP_LM_NAME: g_value_set_string(value, cmd_ln_str_r(ps->config, "-lmname")); break; case PROP_DICT_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-dict")); break; case PROP_MLLR_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-mllr")); break; case PROP_FSG_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-fsg")); break; case PROP_FWDFLAT: g_value_set_boolean(value, cmd_ln_boolean_r(ps->config, "-fwdflat")); break; case PROP_BESTPATH: g_value_set_boolean(value, cmd_ln_boolean_r(ps->config, "-bestpath")); break; case PROP_LATDIR: g_value_set_string(value, ps->latdir); break; case PROP_MAXHMMPF: g_value_set_int(value, cmd_ln_int32_r(ps->config, "-maxhmmpf")); break; case PROP_MAXWPF: g_value_set_int(value, cmd_ln_int32_r(ps->config, "-maxwpf")); break; case PROP_BEAM: g_value_set_double(value, cmd_ln_float_r(ps->config, "-beam")); break; case PROP_PBEAM: g_value_set_double(value, cmd_ln_float_r(ps->config, "-pbeam")); break; case PROP_WBEAM: g_value_set_double(value, cmd_ln_float_r(ps->config, "-wbeam")); break; case PROP_DSRATIO: g_value_set_int(value, cmd_ln_int32_r(ps->config, "-ds")); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } }
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; } }
static gboolean gst_pocketsphinx_event(GstPad *pad, GstEvent *event) { GstPocketSphinx *ps; ps = GST_POCKETSPHINX(GST_OBJECT_PARENT(pad)); /* Pick out VAD events. */ switch (event->type) { case GST_EVENT_NEWSEGMENT: /* Initialize the decoder once the audio starts, if it's not * there yet. */ if (ps->ps == NULL) { ps->ps = ps_init(ps->config); if (ps->ps == NULL) { GST_ELEMENT_ERROR(GST_ELEMENT(ps), LIBRARY, INIT, ("Failed to initialize PocketSphinx"), ("Failed to initialize PocketSphinx")); return FALSE; } } return gst_pad_event_default(pad, event); case GST_EVENT_VADER_START: ps->listening = TRUE; ps_start_utt(ps->ps, NULL); /* Forward this event. */ return gst_pad_event_default(pad, event); case GST_EVENT_EOS: case GST_EVENT_VADER_STOP: { GstBuffer *buffer; int32 score; char const *hyp; char const *uttid; hyp = NULL; if (ps->listening) { ps->listening = FALSE; ps_end_utt(ps->ps); hyp = ps_get_hyp(ps->ps, &score, &uttid); /* Dump the lattice if requested. */ if (ps->latdir) { char *latfile = string_join(ps->latdir, "/", uttid, ".lat", NULL); ps_lattice_t *dag; if ((dag = ps_get_lattice(ps->ps))) ps_lattice_write(dag, latfile); ckd_free(latfile); } } if (hyp) { /* Emit a signal for applications. */ g_signal_emit(ps, gst_pocketsphinx_signals[SIGNAL_RESULT], 0, hyp, uttid); /* Forward this result in a buffer. */ buffer = gst_buffer_new_and_alloc(strlen(hyp) + 2); strcpy((char *)GST_BUFFER_DATA(buffer), hyp); GST_BUFFER_DATA(buffer)[strlen(hyp)] = '\n'; GST_BUFFER_DATA(buffer)[strlen(hyp)+1] = '\0'; GST_BUFFER_TIMESTAMP(buffer) = GST_EVENT_TIMESTAMP(event); gst_buffer_set_caps(buffer, GST_PAD_CAPS(ps->srcpad)); gst_pad_push(ps->srcpad, buffer); } /* Forward this event. */ return gst_pad_event_default(pad, event); } default: /* Don't bother with other events. */ return gst_pad_event_default(pad, event); } }
static void gst_pocketsphinx_get_property(GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstPocketSphinx *ps = GST_POCKETSPHINX(object); switch (prop_id) { case PROP_DECODER: g_value_set_boxed(value, ps->ps); break; case PROP_CONFIGURED: g_value_set_boolean(value, ps->ps != NULL); break; case PROP_HMM_DIR: g_value_set_string(value, cmd_ln_str_r(ps->config, "-hmm")); break; case PROP_LM_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-lm")); break; case PROP_LMCTL_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-lmctl")); break; case PROP_LM_NAME: g_value_set_string(value, cmd_ln_str_r(ps->config, "-lmname")); break; case PROP_DICT_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-dict")); break; case PROP_MLLR_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-mllr")); break; case PROP_FSG_FILE: g_value_set_string(value, cmd_ln_str_r(ps->config, "-fsg")); break; case PROP_FWDFLAT: g_value_set_boolean(value, cmd_ln_boolean_r(ps->config, "-fwdflat")); break; case PROP_BESTPATH: g_value_set_boolean(value, cmd_ln_boolean_r(ps->config, "-bestpath")); break; case PROP_LATDIR: g_value_set_string(value, ps->latdir); break; case PROP_LATTICE: { ps_lattice_t *dag; if (ps->ps && (dag = ps_get_lattice(ps->ps))) g_value_set_boxed(value, dag); else g_value_set_boxed(value, NULL); break; } case PROP_MAXHMMPF: g_value_set_int(value, cmd_ln_int32_r(ps->config, "-maxhmmpf")); break; case PROP_MAXWPF: g_value_set_int(value, cmd_ln_int32_r(ps->config, "-maxwpf")); break; case PROP_BEAM: g_value_set_double(value, cmd_ln_float_r(ps->config, "-beam")); break; case PROP_PBEAM: g_value_set_double(value, cmd_ln_float_r(ps->config, "-pbeam")); break; case PROP_WBEAM: g_value_set_double(value, cmd_ln_float_r(ps->config, "-wbeam")); break; case PROP_DSRATIO: g_value_set_int(value, cmd_ln_int32_r(ps->config, "-ds")); break; case PROP_NBEST_SIZE: g_value_set_int(value, ps->n_best_size); break; case PROP_NBEST: { int i = 0, out_score = 0; GValueArray *arr; if (!ps->ps) { break; } arr = g_value_array_new(1); ps_nbest_t *ps_nbest_list = ps_nbest(ps->ps, 0, -1, NULL, NULL); if (ps_nbest_list) { ps_nbest_list = ps_nbest_next(ps_nbest_list); while ((i < ps->n_best_size) && (ps_nbest_list != NULL)) { GValue value1 = { 0 }; g_value_init (&value1, G_TYPE_STRING); const char* hyp = ps_nbest_hyp(ps_nbest_list, &out_score); g_value_set_string(&value1, hyp); g_value_array_append(arr, &value1); ps_nbest_list = ps_nbest_next(ps_nbest_list); i++; } if (ps_nbest_list) { ps_nbest_free(ps_nbest_list); } } g_value_set_boxed (value, arr); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } }
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; } }
static void gst_pocketsphinx_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstPocketSphinx *sink = GST_POCKETSPHINX(object); switch (prop_id) { case PROP_HMM_DIR: gst_pocketsphinx_set_string(sink, "-hmm", value); break; case PROP_LM_FILE: /* FSG and LM are mutually exclusive. */ gst_pocketsphinx_set_string(sink, "-fsg", NULL); gst_pocketsphinx_set_string(sink, "-lm", value); /* Switch to this new LM if the decoder is active. */ if (sink->ad.initialized) { lm_read(g_value_get_string(value), g_value_get_string(value), cmd_ln_float32("-lw"), cmd_ln_float32("-uw"), cmd_ln_float32("-wip")); uttproc_set_lm(g_value_get_string(value)); } break; case PROP_DICT_FILE: gst_pocketsphinx_set_string(sink, "-dict", value); break; case PROP_FSG_FILE: /* FSG and LM are mutually exclusive */ gst_pocketsphinx_set_string(sink, "-lm", NULL); gst_pocketsphinx_set_string(sink, "-fsg", value); /* Switch to this new FSG if the decoder is active. */ if (sink->ad.initialized) { char *fsgname; fsgname = uttproc_load_fsgfile((char *) g_value_get_string(value)); if (fsgname) uttproc_set_fsg(fsgname); } break; case PROP_S2_FSG: { s2_fsg_t *fsg = g_value_get_pointer(value); uttproc_del_fsg(fsg->name); uttproc_load_fsg(g_value_get_pointer(value), cmd_ln_boolean("-fsgusealtpron"), cmd_ln_boolean("-fsgusefiller"), cmd_ln_float32("-silpen"), cmd_ln_float32("-fillpen"), cmd_ln_float32("-lw")); uttproc_set_fsg(fsg->name); break; } case PROP_FWDFLAT: gst_pocketsphinx_set_boolean(sink, "-fwdflat", value); break; case PROP_BESTPATH: gst_pocketsphinx_set_boolean(sink, "-bestpath", value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); return; } }