Speech-Recognizer-SPX
view release on metacpan or search on metacpan
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 )