void vtln_alpha(Recog *recog, RecogProcess *r) { Sentence *s; float alpha, alpha_bgn, alpha_end; float max_alpha; LOGPROB max_score; PROCESS_AM *am; MFCCCalc *mfcc; SentenceAlign *align; s = &(r->result.sent[0]); align = result_align_new(); max_score = LOG_ZERO; printf("------------ begin VTLN -------------\n"); mfcc = r->am->mfcc; alpha_bgn = mfcc->para->vtln_alpha - VTLN_RANGE; alpha_end = mfcc->para->vtln_alpha + VTLN_RANGE; for(alpha = alpha_bgn; alpha <= alpha_end; alpha += VTLN_STEP) { mfcc->para->vtln_alpha = alpha; if (InitFBank(mfcc->wrk, mfcc->para) == FALSE) { jlog("ERROR: VTLN: InitFBank() failed\n"); return; } if (wav2mfcc(recog->speech, recog->speechlen, recog) == FALSE) { jlog("ERROR: VTLN: wav2mfcc() failed\n"); return; } outprob_prepare(&(r->am->hmmwrk), mfcc->param->samplenum); word_align(s->word, s->word_num, mfcc->param, align, r); printf("%f: %f\n", alpha, align->allscore); if (max_score < align->allscore) { max_score = align->allscore; max_alpha = alpha; } } printf("MAX: %f: %f\n", max_alpha, max_score); mfcc->para->vtln_alpha = max_alpha; if (InitFBank(mfcc->wrk, mfcc->para) == FALSE) { jlog("ERROR: VTLN: InitFBank() failed\n"); return; } printf("------------ end VTLN -------------\n"); result_align_free(align); }
/** * Setup work area for parameters, values, buffers, tables to compute * MFCC vectors, with a given parameter configurations * * @param para [in] configuration parameters * * @return pointer to the newly allocated work area. */ MFCCWork * WMP_work_new(Value *para) { MFCCWork *w; /* newly allocated area should be cleared */ w = (MFCCWork *)mymalloc(sizeof(MFCCWork)); memset(w, 0, sizeof(MFCCWork)); /* set filterbank information */ if (InitFBank(w, para) == FALSE) return NULL; #ifdef MFCC_SINCOS_TABLE /* prepare tables */ make_costbl_hamming(w, para->framesize); make_fft_table(w, w->fb.n); if (para->mfcc_dim >= 0) { make_costbl_makemfcc(w, para->fbank_num, para->mfcc_dim); make_sintbl_wcep(w, para->lifter, para->mfcc_dim); } #endif /* prepare some buffers */ w->fbank = (double *)mymalloc((para->fbank_num+1)*sizeof(double)); w->bf = (float *)mymalloc(w->fb.fftN * sizeof(float)); w->bflen = w->fb.fftN; return w; }