Julius 4.2
|
00001 00041 /***************************************************************************/ 00042 00043 /* we refer to Julius libsent header */ 00044 #include <sent/stddefs.h> 00045 #include <sent/hmm_calc.h> 00046 00047 //#include "plugin_defs.h" 00048 00049 #define PLUGIN_TITLE "Gaussian calculation plugin for Julius" 00050 #define GPRUNE_OPT "mycalc" 00051 00074 int 00075 initialize() 00076 { 00077 return 0; 00078 } 00079 00116 int 00117 get_plugin_info(int opcode, char *buf, int buflen) 00118 { 00119 switch(opcode) { 00120 case 0: 00121 /* plugin description string */ 00122 strncpy(buf, PLUGIN_TITLE, buflen); 00123 break; 00124 } 00125 00126 return 0; 00127 } 00128 00129 /************************************************************************/ 00130 /************************************************************************/ 00131 00161 void 00162 calcmix_get_optname(char *buf, int buflen) 00163 { 00164 strncpy(buf, GPRUNE_OPT, buflen); 00165 } 00166 00226 void 00227 calcmix(HMMWork *wrk, HTK_HMM_Dens **g, int num, int *last_id, int lnum) 00228 { 00229 int i; 00230 HTK_HMM_Dens *dens; 00231 LOGPROB *prob = wrk->OP_calced_score; 00232 int *id = wrk->OP_calced_id; 00233 VECT tmp, x; 00234 VECT *mean; 00235 VECT *var; 00236 VECT *vec; 00237 short veclen; 00238 00239 for(i=0; i<num; i++) { 00240 /* store ID */ 00241 *(id++) = i; 00242 /* get Gaussian to compute */ 00243 dens = *(g++); 00244 if (dens == NULL) { 00245 /* no Gaussian, set LOG_ZERO as result */ 00246 *(prob++) = LOG_ZERO; 00247 continue; 00248 } 00249 /* compute log outprob probability */ 00250 mean = dens->mean; 00251 var = dens->var->vec; 00252 tmp = dens->gconst; 00253 vec = wrk->OP_vec; 00254 veclen = wrk->OP_veclen; 00255 for (; veclen > 0; veclen--) { 00256 x = *(vec++) - *(mean++); 00257 tmp += x * x * *(var++); 00258 } 00259 tmp *= -0.5; 00260 /* store it */ 00261 *(prob++) = tmp; 00262 } 00263 wrk->OP_calced_num = num; 00264 } 00265 00280 void 00281 calcmix_free(HMMWork *wrk) 00282 { 00283 free(wrk->OP_calced_score); 00284 free(wrk->OP_calced_id); 00285 } 00286 00313 boolean 00314 calcmix_init(HMMWork *wrk) 00315 { 00316 /* maximum Gaussian set size = maximum mixture size * nstream */ 00317 wrk->OP_calced_maxnum = wrk->OP_hmminfo->maxmixturenum * wrk->OP_nstream; 00318 wrk->OP_calced_score = (LOGPROB *)malloc(sizeof(LOGPROB) * wrk->OP_calced_maxnum); 00319 wrk->OP_calced_id = (int *)malloc(sizeof(int) * wrk->OP_calced_maxnum); 00320 /* force gprune_num to the max number */ 00321 wrk->OP_gprune_num = wrk->OP_calced_maxnum; 00322 return TRUE; 00323 } 00324 00325 /* end of file */