📄 kb.c
字号:
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 + -