00001
00045
00046
00047
00048
00049
00050
00051
00052 #include <julius.h>
00053
00054 #include <sys/stat.h>
00055
00056
00057
00058
00071 void
00072 init_para(Value *para)
00073 {
00074 para->smp_period = smpPeriod;
00075 para->framesize = fsize;
00076 para->frameshift = fshift;
00077 para->preEmph = preemph;
00078 para->mfcc_dim = model_mfcc_dim;
00079 para->lifter = ceplifter;
00080 para->delWin = delwin;
00081 para->accWin = accwin;
00082 para->hipass = hipass;
00083 para->lopass = lopass;
00084 para->c0 = c0_required;
00085 para->fbank_num = fbank_num;
00086 para->ss_alpha = ssalpha;
00087 para->ss_floor = ssfloor;
00088 para->cmn = cmn_required;
00089 para->raw_e = rawe_required;
00090 para->zmeanframe = zmean_frame;
00091 para->enormal = enormal_required;
00092
00093 para->escale = enormal_escale;
00094 para->silFloor = enormal_silfloor;
00095
00096 para->delta = delta_required;
00097 para->acc = acc_required;
00098 para->energy = energy_required;
00099 para->absesup = abs_energy_suppress;
00100
00101
00102 para->baselen = para->mfcc_dim + (para->c0 ? 1 : 0) + (para->energy ? 1 : 0);
00103
00104 para->vecbuflen = para->baselen * (1 + (para->delta ? 1 : 0) + (para->acc ? 1 : 0));
00105
00106 para->veclen = para->vecbuflen - (para->absesup ? 1 : 0);
00107 }
00108
00129 HTK_Param *new_wav2mfcc(SP16 speech[], int speechlen)
00130 {
00131 HTK_Param *param;
00132 Value para;
00133 int framenum;
00134 int i;
00135 int len;
00136
00137
00138 init_para(¶);
00139
00140 if (ssload_filename && ssbuf == NULL) {
00141
00142 if ((ssbuf = new_SS_load_from_file(ssload_filename, &sslen)) == NULL) {
00143 j_error("Error: failed to read \"%s\"\n", ssload_filename);
00144 }
00145 }
00146
00147 if (sscalc) {
00148
00149 len = sscalc_len * smpFreq / 1000;
00150 if (len > speechlen) len = speechlen;
00151 #ifdef SSDEBUG
00152 printf("[%d]\n", len);
00153 #endif
00154 ssbuf = new_SS_calculate(speech, len, para, &sslen);
00155 }
00156 #ifdef SSDEBUG
00157 {
00158 int i;
00159 for(i=0;i<sslen;i++) {
00160 printf("%d: %f\n", i, ssbuf[i]);
00161 }
00162 }
00163 #endif
00164
00165
00166 framenum = (int)((speechlen - para.framesize) / para.frameshift) + 1;
00167 if (framenum < 1) {
00168 j_printerr("input too short (%d samples), ignored\n", speechlen);
00169 return NULL;
00170 }
00171
00172
00173 param = new_param();
00174 param->parvec = (VECT **)mymalloc(sizeof(VECT *) * framenum);
00175 for(i=0;i<framenum;i++) {
00176 param->parvec[i] = (VECT *)mymalloc(sizeof(VECT) * para.veclen);
00177 }
00178
00179
00180 Wav2MFCC(speech, param->parvec, para, speechlen, ssbuf, sslen);
00181
00182
00183 param->header.samplenum = framenum;
00184 param->header.wshift = para.smp_period * para.frameshift;
00185 param->header.sampsize = para.veclen * sizeof(VECT);
00186 param->header.samptype = F_MFCC;
00187 if (para.delta) param->header.samptype |= F_DELTA;
00188 if (para.acc) param->header.samptype |= F_ACCL;
00189 if (para.energy) param->header.samptype |= F_ENERGY;
00190 if (para.c0) param->header.samptype |= F_ZEROTH;
00191 if (para.absesup) param->header.samptype |= F_ENERGY_SUP;
00192 if (para.cmn) param->header.samptype |= F_CEPNORM;
00193 param->veclen = para.veclen;
00194 param->samplenum = framenum;
00195
00196 return param;
00197 }
00198