Julius 4.2
plugin/calcmix.c
説明を見る。
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 */