00001
00041
00042
00043
00044 #include <sent/stddefs.h>
00045 #include <sent/hmm_calc.h>
00046
00047
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
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
00241 *(id++) = i;
00242
00243 dens = *(g++);
00244 if (dens == NULL) {
00245
00246 *(prob++) = LOG_ZERO;
00247 continue;
00248 }
00249
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
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
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
00321 wrk->OP_gprune_num = wrk->OP_calced_maxnum;
00322 return TRUE;
00323 }
00324
00325