⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kb.c

📁 CMU大名鼎鼎的SPHINX-3大词汇量连续语音识别系统
💻 C
📖 第 1 页 / 共 2 页
字号:
			  cmd_ln_float64("-pbeam"),			  cmd_ln_float64("-wbeam"),			  cmd_ln_float64("-wend_beam"),			  cmd_ln_int32("-ptranskip")			  );    E_INFO("Parameters used in Beam Pruning of Viterbi Search: Beam= %d, PBeam= %d, WBeam= %d (Skip=%d), WEndBeam=%d\n", kb->beam->hmm, kb->beam->ptrans, kb->beam->word, kb->beam->ptranskip, kb->beam->wordend);    kb->histprune = histprune_init(cmd_ln_int32("-maxhmmpf"),				   cmd_ln_int32("-maxhistpf"),				   cmd_ln_int32("-maxwpf"));    E_INFO("Parameters used in histogram pruning: Max. HMM per frame=%d, Max. History per frame=%d, Max. Word per frame=%d\n", kb->histprune->maxhmmpf,kb->histprune->maxhistpf,kb->histprune->maxwpf);    /*Sections of fast GMM computation parameters*/    kb->fastgmm = fast_gmm_init(cmd_ln_int32("-ds"),			        cmd_ln_int32("-cond_ds"),				cmd_ln_int32("-dist_ds"),				cmd_ln_int32("-gs4gs"),				cmd_ln_int32("-svq4svq"),				cmd_ln_float64("-subvqbeam"),				cmd_ln_float64("-ci_pbeam"),				cmd_ln_int32("-maxcdsenpf"),				kb->kbcore->mdef->n_ci_sen				);    E_INFO("Parameters used in Fast GMM computation:\n");    E_INFO("   Frame-level: Down Sampling Ratio %d, Conditional Down Sampling? %d, Distance-based Down Sampling? %d\n",kb->fastgmm->downs->ds_ratio,kb->fastgmm->downs->cond_ds,kb->fastgmm->downs->dist_ds);    E_INFO("     GMM-level: CI phone beam %d\n",kb->fastgmm->gmms->ci_pbeam);    E_INFO("Gaussian-level: GS map would be used for Gaussian Selection? =%d, SVQ would be used as Gaussian Score? =%d SubVQ Beam %d\n",kb->fastgmm->gs4gs,kb->fastgmm->svq4svq,kb->fastgmm->gaus->subvqbeam);        /* Not really nice to check it here. Later when we move gs and svq       out of core. Things will be better. */    if(kb->fastgmm->downs->cond_ds>0&&kb->kbcore->gs==NULL)       E_FATAL("Conditional Down Sampling require the use of Gaussian Selection map\n");    kb->pl_win=cmd_ln_int32("-pl_window");    E_INFO("Phoneme look-ahead window size = %d\n",kb->pl_win);    kb->pl_win_strt=0;    kb->pl_beam=logs3(cmd_ln_float64("-pl_beam"));    E_INFO("Phoneme look-ahead beam = %d\n",kb->pl_beam);    for(cisencnt=0;cisencnt==mdef->cd2cisen[cisencnt];cisencnt++) ;    kb->cache_ci_senscr=(int32**)ckd_calloc_2d(kb->pl_win,cisencnt,sizeof(int32));    kb->cache_best_list=(int32*)ckd_calloc(kb->pl_win,sizeof(int32));    kb->phn_heur_list=(int32*)ckd_calloc(mdef_n_ciphone (mdef),sizeof(int32));    kb->wordbestscore=(int32*)ckd_calloc(mdef_n_ciphone (mdef),sizeof(int32));    kb->wordbestexit=(int32*)ckd_calloc(mdef_n_ciphone (mdef),sizeof(int32));    kb->epl = cmd_ln_int32 ("-epl");    if ((kb->feat = feat_array_alloc(kbcore_fcb(kbcore),S3_MAX_FRAMES)) == NULL)	E_FATAL("feat_array_alloc() failed\n");        kb->vithist = vithist_init(kbcore, kb->beam->word, cmd_ln_int32("-bghist"));        ptmr_init (&(kb->tm_sen));    ptmr_init (&(kb->tm_srch));    ptmr_init (&(kb->tm_ovrhd));    kb->tot_fr = 0;    kb->tot_sen_eval = 0.0;    kb->tot_gau_eval = 0.0;    kb->tot_hmm_eval = 0.0;    kb->tot_wd_exit = 0.0;        kb->hmm_hist_binsize = cmd_ln_int32("-hmmhistbinsize");    if(lmset)      n = ((kb->ugtreeMulti[0]->n_node) + (kb->fillertree[0]->n_node)) * kb->n_lextree;    else      n = ((kb->ugtree[0]->n_node) + (kb->fillertree[0]->n_node)) * kb->n_lextree;    n /= kb->hmm_hist_binsize;    kb->hmm_hist_bins = n+1;    kb->hmm_hist = (int32 *) ckd_calloc (n+1, sizeof(int32));	/* Really no need for +1 */        /* Open hypseg file if specified */    str = cmd_ln_str("-hypseg");    kb->matchsegfp = NULL;    if (str) {#ifdef WIN32	if ((kb->matchsegfp = fopen(str, "wt")) == NULL)#else	if ((kb->matchsegfp = fopen(str, "w")) == NULL)#endif	    E_ERROR("fopen(%s,w) failed; use FWDXCT: from std logfile\n", str);    }    str = cmd_ln_str("-hyp");    kb->matchfp = NULL;    if (str) {#ifdef WIN32	if ((kb->matchfp = fopen(str, "wt")) == NULL)#else	if ((kb->matchfp = fopen(str, "w")) == NULL)#endif	    E_ERROR("fopen(%s,w) failed; use FWDXCT: from std logfile\n", str);    }        /* Setting for MLLR matrix */    kb->prevmllrfn=(char*)ckd_calloc(1024,sizeof(char));    kb->prevmllrfn[0]='\0';    }void kb_set_uttid(char *_uttid,kb_t* _kb){  assert(_kb != NULL);  assert(_uttid!=NULL);  if (_kb->uttid != NULL) {    ckd_free(_kb->uttid);    _kb->uttid = NULL;  }  if ((_kb->uttid = ckd_malloc(strlen(_uttid) + 1)) == NULL) {    E_FATAL("Failed to allocate space for utterance id.\n");  }  strcpy(_kb->uttid,_uttid);}void kb_setlm(char* lmname,kb_t* kb){  lmset_t* lms;  kbcore_t* kbc=NULL;  int i = 0;  int j;  int n;  /*  s3wid_t dictid;*/  kbc=kb->kbcore;  lms=kbc->lmset;  kbc->lm=NULL;  for(j=0;j<kb->n_lextree;j++){    kb->ugtree[j]=NULL;  }  if(lms!=NULL || cmd_ln_str("-lmctlfn")){    for(i=0;i<kbc->n_lm;i++){      if(!strcmp(lmname,lms[i].name)){	/* Point the current lm to a particular lm */	kbc->lm=lms[i].lm;	for(j=0;j<kb->n_lextree;j++){	  kb->ugtree[j]=kb->ugtreeMulti[i*kb->n_lextree+j];	}	break;      }    }    if(kbc->lm==NULL){      E_ERROR("LM name %s cannot be found in the preloaded lm ctl file (spefied by -lmctlfile)! Fall back to use base LM model\n",lmname);      kbc->lm=lms[0].lm;      /* Also, don't forget to reset 'i', since if the code reaches       * this point, i has a value of 'n_lm + 1'       */      i = 0;      for(j=0;j<kb->n_lextree;j++){	kb->ugtree[j]=kb->ugtreeMulti[j];      }    }  }  /*  Just to make sure we're not trying to point beyond the limit of   *  array lms.   */  assert (i < kbc->n_lm);  if((kb->vithist->lms2vh_root=     (vh_lms2vh_t**)ckd_realloc(kb->vithist->lms2vh_root,				lm_n_ug(kbc->lm)*sizeof(vh_lms2vh_t *)				))==NULL)     {      E_FATAL("failed to allocate memory for vithist\n");    }  n = ((kb->ugtree[0]->n_node) + (kb->fillertree[0]->n_node)) * kb->n_lextree;  n /= kb->hmm_hist_binsize;  kb->hmm_hist_bins = n+1;  kb->hmm_hist = (int32 *) ckd_realloc (kb->hmm_hist,(n+1)*sizeof(int32));	/* Really no need for +1 */  E_INFO("Current LM name %s\n",lms[i].name);  E_INFO("LM ug size %d\n",kbc->lm->n_ug);  E_INFO("LM bg size %d\n",kbc->lm->n_bg);  E_INFO("LM tg size %d\n",kbc->lm->n_tg);  E_INFO("HMM history bin size %d\n", n+1);  for(j=0;j<kb->n_lextree;j++){    E_INFO("Lextrees(%d), %d nodes(ug)\n",	   kb->n_lextree, lextree_n_node(kb->ugtree[j]));  }}void kb_setmllr(char* mllrname,kb_t* kb){/*  int32 veclen;*/  E_INFO("Using MLLR matrix %s\n", mllrname);    if(strcmp(kb->prevmllrfn,mllrname)!=0){ /* If there is a change of mllr file name */    /* Reread the gaussian mean from the file again */    E_INFO("Reloading mean\n");    mgau_mean_reload(kbcore_mgau(kb->kbcore),cmd_ln_str("-mean"));    /* Read in the mllr matrix */#if MLLR_DEBUG    /*This generates huge amount of information */    /*    mgau_dump(kbcore_mgau(kb->kbcore),1);*/#endif    mllr_read_regmat(mllrname,		     &(kb->regA),		     &(kb->regB),		     mgau_veclen(kbcore_mgau(kb->kbcore)));    /* Transform all the mean vectors */    mllr_norm_mgau(kbcore_mgau(kb->kbcore),kb->regA,kb->regB,kbcore_mdef(kb->kbcore));#if MLLR_DEBUG    /*#if 1*/    mllr_dump(kb->regA,kb->regB,mgau_veclen(kbcore_mgau(kb->kbcore)));    /*This generates huge amount of information */    /*mgau_dump(kbcore_mgau(kb->kbcore),1);*/#endif     /* allocate memory for the prevmllrfn if it is too short*/    if(strlen(mllrname)*sizeof(char) > 1024){      kb->prevmllrfn=(char*)ckd_calloc(strlen(mllrname), sizeof(char));    }    strcpy(kb->prevmllrfn,mllrname);  }else{    /* No need to change anything for now */  }}/* * Make the next_active information within all lextrees be the current one, after blowing * away the latter; in preparation for moving on to the next frame. */void kb_lextree_active_swap (kb_t *kb){    int32 i;        for (i = 0; i < kb->n_lextree; i++) {	lextree_active_swap (kb->ugtree[i]);	lextree_active_swap (kb->fillertree[i]);    }}/* RAH 4.15.01 Lots of memory is allocated, but never freed, this function will clean up. * First pass will get the low hanging fruit.*/void kb_free (kb_t *kb){  vithist_t *vithist = kb->vithist;  if (kb->sen_active)    ckd_free ((void *)kb->sen_active);  if (kb->ssid_active)     ckd_free ((void *)kb->ssid_active);  if (kb->comssid_active)    ckd_free ((void *)kb->comssid_active);  if (kb->fillertree)     ckd_free ((void *)kb->fillertree);  if (kb->hmm_hist)     ckd_free ((void *)kb->hmm_hist);    /* vithist */  if (vithist) {    ckd_free ((void *) vithist->entry);    ckd_free ((void *) vithist->frame_start);    ckd_free ((void *) vithist->bestscore);    ckd_free ((void *) vithist->bestvh);    ckd_free ((void *) vithist->lms2vh_root);        ckd_free ((void *) kb->vithist);  }  kbcore_free (kb->kbcore);  if (kb->feat) {    ckd_free ((void *)kb->feat[0][0]);    ckd_free_2d ((void **)kb->feat);  }  if (kb->cache_ci_senscr) {    ckd_free_2d ((void **)kb->cache_ci_senscr);  }  if( kb->cache_best_list) {    ckd_free((void*) kb->cache_best_list);  }  if(kb->phn_heur_list) {    ckd_free((void*) kb->phn_heur_list);  }  if (kb->matchsegfp) fclose(kb->matchsegfp);  if (kb->matchfp) fclose(kb->matchfp);  if(kb->prevmllrfn) ckd_free((char*) kb->prevmllrfn);  if(kb->regA && kb->regB) mllr_free_regmat(kb->regA, kb->regB);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -