Speech-Recognizer-SPX

 view release on metacpan or  search on metacpan

FE/MFCC.xs  view on Meta::CPAN

fe_init(class, param)
	SV *		class
	SV *		param
	PREINIT:
		param_t par;
		HV * hparm;
		SV ** helm;
	CODE:
		if (!(SvROK(param) && SvTYPE(SvRV(param)) == SVt_PVHV))
			croak("expected a hash reference");
		memset(&par, 0, sizeof(par));
		hparm = (HV *)SvRV(param);
		if ((helm = hv_fetch(hparm, "sampling_rate",
				     sizeof("sampling_rate"), 0)))
     			par.SAMPLING_RATE = SvIV(*helm);
		if ((helm = hv_fetch(hparm, "frame_rate",
				     sizeof("frame_rate"), 0)))
     			par.FRAME_RATE = SvIV(*helm);
		if ((helm = hv_fetch(hparm, "window_length",
				     sizeof("window_length"), 0)))
     			par.WINDOW_LENGTH = SvIV(*helm);
		if ((helm = hv_fetch(hparm, "fb_type",
				     sizeof("fb_type"), 0)))
     			par.FB_TYPE = SvIV(*helm);
		if ((helm = hv_fetch(hparm, "num_cepstra",
				     sizeof("num_cepstra"), 0)))
     			par.NUM_CEPSTRA = SvIV(*helm);
		if ((helm = hv_fetch(hparm, "num_filters",
				     sizeof("num_filters"), 0)))
     			par.NUM_FILTERS = SvIV(*helm);
		if ((helm = hv_fetch(hparm, "fft_size",
				     sizeof("fft_size"), 0)))
     			par.FFT_SIZE = SvIV(*helm);
		if ((helm = hv_fetch(hparm, "lower_filt_freq",
				     sizeof("lower_filt_freq"), 0)))
     			par.LOWER_FILT_FREQ = SvIV(*helm);
		if ((helm = hv_fetch(hparm, "upper_filt_freq",
				     sizeof("upper_filt_freq"), 0)))
     			par.UPPER_FILT_FREQ = SvIV(*helm);
		if ((helm = hv_fetch(hparm, "pre_emphasis_alpha",
				     sizeof("pre_emphasis_alpha"), 0)))
     			par.PRE_EMPHASIS_ALPHA = SvIV(*helm);
		RETVAL = fe_init(&par);
	OUTPUT:
		RETVAL

MODULE = Audio::MFCC	PACKAGE = fe_tPtr	PREFIX = fe_

SYSRET
fe_start_utt(fe)
	fe_t *		fe

void
fe_process_utt(fe, spch, nsamps)
	fe_t *		fe
	int16 *		spch
	int32		nsamps
	PREINIT:
		float32 **cep;
		int32 i, frame_count, output_frames;
	PPCODE:
		if (fe_process_utt(fe, spch, nsamps, &cep, &output_frames) < 0)
			goto out; /* empty list */
		assert(output_frames <= frame_count);
		if (output_frames <= 0)
			goto out; /* empty list */

		EXTEND(sp, output_frames);
		for (i = 0; i < output_frames; ++i) {
			SV ** svs;
			AV * vec;
			int j;

			New(0xdeadbeef, svs, fe->NUM_CEPSTRA, SV *);
			for (j = 0; j < fe->NUM_CEPSTRA; ++j)
				svs[j] = newSVnv(cep[i][j]);

			vec = av_make(fe->NUM_CEPSTRA, svs);

			for (j = 0; j < fe->NUM_CEPSTRA; ++j)
				SvREFCNT_dec(svs[j]);
			Safefree(svs);
			PUSHs(sv_2mortal(newRV_noinc((SV *) vec)));
		}
	    out:
		fe_free_2d(cep);


SV *
fe_end_utt(fe)
	fe_t *		fe
	PREINIT:
	int32 output_frames;
	float32 *cepv;
	CODE:
		New(0xc0debabe, cepv, fe->NUM_CEPSTRA, float32);
		if (fe_end_utt(fe, cepv, &output_frames) < 0)
			output_frames = -1;

		if (output_frames > 0) { /* 1 is the only possible value */
			SV ** svs;
			AV * vec;
			int i;

			New(0xdeadbeef, svs, fe->NUM_CEPSTRA, SV *);
			for (i = 0; i < fe->NUM_CEPSTRA; ++i)
				svs[i] = newSVnv(cepv[i]);

			vec = av_make(fe->NUM_CEPSTRA, svs);

			for (i = 0; i < fe->NUM_CEPSTRA; ++i)
				SvREFCNT_dec(svs[i]);
			Safefree(svs);

			/* Will be mortalized by XS, so don't do it here */
			RETVAL = newRV_noinc((SV *) vec);
		} else if (output_frames == 0) { /* success */
			RETVAL = newSVpv("", PL_na);
		} else {
			RETVAL = &PL_sv_undef;
		}



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