Speech-Recognizer-SPX

 view release on metacpan or  search on metacpan

SPX.xs  view on Meta::CPAN

		av_push(segs_av, new_seg_sv(hyp));
		hyp = hyp->next;
	}
	return segs_av;
}

SV *
new_hyp_sv(search_hyp_t *hyp)
{
	AV *hyp_av, *segs_av;
	search_hyp_t *h;
	SV *sent;

	hyp_av = newAV();

	/* Reconstruct sentence from segs. */
	sent = newSVpv("", 0);
	for (h = hyp; h; h = h->next) {
		if (h->word == NULL)
			continue;
		if (strcmp(h->word, "<s>") == 0)
			continue;
		sv_catpv(sent, h->word);
		sv_catpv(sent, " ");
	}
	av_push(hyp_av, sent); /* Sentence string */
	av_push(hyp_av, newSVpv(uttproc_get_uttid(), 0)); /* Utterance ID */
	av_push(hyp_av, newSViv(0)); /* Scaling factor */
	av_push(hyp_av, newSViv(0)); /* Acoustic score (unknown here) */
	av_push(hyp_av, newSViv(0)); /* Language score (unknown here) */
	segs_av = new_segs_av(hyp); /* List of segments */
	av_push(hyp_av, newRV_noinc((SV *)segs_av));

	return sv_bless(newRV_noinc((SV *)hyp_av),
			gv_stashpv("Speech::Recognizer::SPX::Hypothesis", 1));
}

/* FIXME: These are Sphinx2 "internal" functions that shouldn't be. */
#ifndef _S2_SEARCH_H_
int32 searchFrame();
#endif
#ifndef _KB_EXPORTS_H_
char  *kb_get_word_str(int32 wid);
int32  kb_get_word_id(char const *word);
#endif

MODULE = Speech::Recognizer::SPX		PACKAGE = Speech::Recognizer::SPX		

double
constant(name,arg)
	char *		name
	int		arg

void
fbs_init(argv_ref=&PL_sv_undef)
	SV *		argv_ref
	PREINIT:
		int argc;
		char **argv;
		int rv;
	PPCODE:
		if (fbs_init_done)	
			return;

		if (SvOK(argv_ref)) {
			SV * rargv = ST(0); /* Arr, I'm a pirate! */

			if (!(SvROK(rargv)))
				goto bad_arg;
			switch(SvTYPE(SvRV(rargv))) {
			case SVt_PVAV:
				argv = build_argv_av((AV *) SvRV(rargv), &argc);
				break;
			case SVt_PVHV:
				argv = build_argv_hv((HV *) SvRV(rargv), &argc);
				break;
			bad_arg:
			default:
				croak("fbs_init: expected an array or hash reference\n");
				break;
			}
		} else {
			argv = build_argv_av(perl_get_av("ARGV", 0), &argc);
		}

		rv = fbs_init(argc, argv);
		Safefree(argv);

		if (rv == 0) {
			XPUSHs(sv_2mortal(newSVpv("0 but true", 10)));
		} else {
			XPUSHs(&PL_sv_undef);
		}

SYSRET
fbs_end()

SYSRET
uttproc_begin_utt(...)
	PREINIT:
	char *id;
	STRLEN foo;
	CODE:
		if (items > 0) {
			id = SvPV(ST(0), foo);
		} else {
			id = NULL;
		}
		RETVAL = uttproc_begin_utt(id);
	OUTPUT:
		RETVAL

SYSRET
uttproc_rawdata(raw, block=0)
	SV *		raw
	int32		block
	PREINIT:
		int16 *	buf;
		STRLEN  nsamp;
	CODE:
		buf = (int16 *) SvPV(raw, nsamp);

SPX.xs  view on Meta::CPAN

SYSRET
uttproc_cepdata(cep, block=0)
	AV *		cep
	int32		block
	PREINIT:
		float32  *arr, **arrp;
		int 	 i, num_cepstra, num_frames;
	CODE:
		if (av_len(cep) == 0
			|| SvTYPE(SvRV(*(av_fetch(cep, 0, 0)))) != SVt_PVAV
			|| av_len((AV *)(*(av_fetch(cep, 0, 0)))) == 0) {
			croak("uttproc_cepdata: expected a non-empty array of arrays");
		}
		num_frames = av_len(cep);
		num_cepstra = av_len((AV *)(*(av_fetch(cep, 0, 0))));
		/* Blargh. */
		New(0xf0ad, arr, (num_frames * num_cepstra), float32);
		New(0xdead, arrp, num_frames, float32 *);
		/* ARRRRRGGH */
		for (i = 0; i <= num_frames; ++i) {
			AV *vec;
			int j;

			vec = (AV *)(*(av_fetch(cep, i, 0)));
			arrp[i] = arr;
			/* Don't trust av_len(vec) */
			for (j = 0; j <= num_cepstra; ++j) {
				SV *coeff;

				coeff = *(av_fetch(vec, j, 0));
				if (SvOK(coeff))
					*arr = SvNV(coeff);
				else
					*arr = 0.0;
				++arr;
			}
		}
		RETVAL = uttproc_cepdata(arrp, num_frames, block);
	OUTPUT:
		RETVAL

SYSRET
uttproc_end_utt()

SYSRET
uttproc_abort_utt()

SYSRET
uttproc_stop_utt()

SYSRET
uttproc_restart_utt()

void
uttproc_result(block=0)
	int32		block
	PREINIT:
		int32 frm;
		char *hyp = NULL;
		int res;
	PPCODE:
		res = uttproc_result(&frm, &hyp, block);
		if (res < 0)
			return; /* empty list */
		XPUSHs(sv_2mortal(newSViv(frm)));
		if (hyp != NULL) {
			PUSHs(sv_2mortal(newSVpv(hyp, 0)));
		}

void
uttproc_result_seg(block=0)
	int32		block
	PREINIT:
		int32 frm;
		search_hyp_t *hyp;
		int res;
	PPCODE:
		res = uttproc_result_seg(&frm, &hyp, block);
		if (res < 0)
			return; /* empty list */
		XPUSHs(sv_2mortal(newSViv(frm)));
		if (hyp != NULL) {
			PUSHs(sv_2mortal(new_hyp_sv(hyp)));
		}

void
uttproc_partial_result()
	PREINIT:
		int32 frm;
		char *hyp;
		int res;
	PPCODE:
		res = uttproc_partial_result(&frm, &hyp);
		if (res < 0)
			return; /* empty list */
		EXTEND(SP, 2);
		PUSHs(sv_2mortal(newSViv(frm)));
		PUSHs(sv_2mortal(newSVpv(hyp, 0)));

void
uttproc_partial_result_seg()
	PREINIT:
		int32 frm;
		search_hyp_t *hyp;
		int res;
	PPCODE:
		res = uttproc_partial_result_seg(&frm, &hyp);
		if (res < 0)
			return; /* empty list */
		EXTEND(SP, 2);
		PUSHs(sv_2mortal(newSViv(frm)));
		PUSHs(sv_2mortal(new_hyp_sv(hyp)));

char const *
uttproc_get_uttid()

SYSRET
uttproc_set_auto_uttid_prefix(prefix)
	char *		prefix

SYSRET
uttproc_set_lm(lmname)
	char *		lmname

SYSRET
uttproc_lmupdate(lmname)
	char *		lmname

SYSRET
uttproc_set_context(wd1, wd2)
	char *		wd1
	char *		wd2

SYSRET
uttproc_set_rawlogdir(dir)
	char *		dir

SYSRET
uttproc_set_mfclogdir(dir)
	char *		dir

SYSRET
uttproc_set_logfile(file)
	char *		file

SYSRET
lm_read(lmfile, lmname, lw, uw, wip)
	char *		lmfile
	char *		lmname
	double		lw
	double		uw
	double		wip

SYSRET
lm_delete(lmname)
	char *		lmname

void
search_get_alt(n, sf=0, ef=searchFrame(), w1=NULL, w2="<s>")
	int32	  	n
	int32		sf
	int32		ef
	char *		w1
	char *		w2
	PREINIT:
		int32 w1_wid, w2_wid, i;
		search_hyp_t **alt_out;
	PPCODE:
		/* Convert word strings to word-ids. */
		if (w1 != NULL)
			w1_wid = kb_get_word_id(w1);
		else
			w1_wid = -1;
		if (w2 != NULL)
			w2_wid = kb_get_word_id(w2);
		else
			w2_wid = kb_get_word_id("<s>");

		search_save_lattice();
		n = search_get_alt(n, sf, ef, w1_wid, w2_wid,
				   &alt_out);
		if (n == -1)
			return;
		EXTEND(SP, n);
		for (i = 0; i < n; ++i) {
			SV *hyp, **uttid;

			hyp = new_hyp_sv(alt_out[i]);
			uttid = av_fetch((AV *)SvRV(hyp), 1, 0);
			sv_catpvf(*uttid, "[%d]", i);
			PUSHs(sv_2mortal(hyp));
		}



( run in 0.517 second using v1.01-cache-2.11-cpan-5511b514fd6 )