kbcore.c

来自「CMU大名鼎鼎的SPHINX-3大词汇量连续语音识别系统」· C语言 代码 · 共 312 行

C
312
字号
/* ==================================================================== * Copyright (c) 1999-2004 Carnegie Mellon University.  All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * This work was supported in part by funding from the Defense Advanced  * Research Projects Agency and the National Science Foundation of the  * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * *//* * kbcore.c -- Structures for maintain the main models. *  * ********************************************** * CMU ARPA Speech Project * * Copyright (c) 1999 Carnegie Mellon University. * ALL RIGHTS RESERVED. * ********************************************** *  * HISTORY *  * 11-Feb-2000	M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University * 		Removed svqpp stuff.  It doesn't work too well anyway. *  * 06-Dec-1999	M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University * 		Added kb_t.svqpp_t and related handling. *  * 10-May-1999	M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University * 		Started. */#include "kbcore.h"#include "logs3.h"kbcore_t *kbcore_init (float64 logbase,		       char *feattype,		       char *cmn,		       char *varnorm,		       char *agc,		       char *mdeffile,		       char *dictfile,		       char *fdictfile,		       char *compsep,		       char *lmfile,		       char *lmctlfile,		       char *lmdumpdir,		       char *fillpenfile,		       char *senmgau,		       float64 silprob,		       float64 fillprob,		       float64 langwt,		       float64 inspen,		       float64 uw,		       char *meanfile,		       char *varfile,		       float64 varfloor,		       char *mixwfile,		       float64 mixwfloor,		       char *subvqfile,		       char *gsfile,		       char *tmatfile,		       float64 tmatfloor){    kbcore_t *kb;    int i;        E_INFO("Initializing core models:\n");        kb = (kbcore_t *) ckd_calloc (1, sizeof(kbcore_t));    kb->fcb = NULL;    kb->mdef = NULL;    kb->dict = NULL;    kb->dict2pid = NULL;    kb->lm = NULL;    kb->fillpen = NULL;    kb->dict2lmwid = NULL;    kb->mgau = NULL;    kb->svq = NULL;    kb->tmat = NULL;    kb->n_lm =0;    kb->n_alloclm=0;        logs3_init (logbase);        if (!feattype){      E_FATAL("Please specified the feature type\n");    }    if (feattype) {	if ((kb->fcb = feat_init (feattype, cmn, varnorm, agc)) == NULL)	    E_FATAL("feat_init(%s) failed\n", feattype);		if(strcmp(senmgau,".cont.") == 0) {	  if (feat_n_stream(kb->fcb) != 1)	    E_FATAL("#Feature streams(%d) in the feature for continuous HMM!= 1\n", feat_n_stream(kb->fcb));	}else if(strcmp(senmgau,".semi.") == 0){	  if (feat_n_stream(kb->fcb) != 4)	    E_FATAL("#Feature streams(%d) in the feature for semi-continuous HMM!= 4\n", feat_n_stream(kb->fcb));	}else{	  E_FATAL("Feature should be either .semi. or .cont.");	}    }        if (mdeffile) {	if ((kb->mdef = mdef_init (mdeffile)) == NULL)	    E_FATAL("mdef_init(%s) failed\n", mdeffile);    }        if (dictfile) {	if (! compsep)	    compsep = "";	else if ((compsep[0] != '\0') && (compsep[1] != '\0')) {	    E_FATAL("Compound word separator(%s) must be empty or single character string\n",		    compsep);	}	if ((kb->dict = dict_init (kb->mdef, dictfile, fdictfile, compsep[0])) == NULL)	    E_FATAL("dict_init(%s,%s,%s) failed\n", dictfile,		    fdictfile ? fdictfile : "", compsep);    }        /* Make option lmfile and lmcftfile to be mutually exclusive */    if(lmfile && lmctlfile)      E_FATAL("Please only specify either -lmfile or -lmctlfile\n");       if(!lmfile && !lmctlfile)      E_FATAL("Please specify either one of -lmfile or -lmctlfile\n");    if (lmfile) {	if ((kb->lm = lm_read (lmfile, langwt, inspen, uw)) == NULL)	    E_FATAL("lm_read(%s, %e, %e, %e) failed\n", lmfile, langwt, inspen, uw);    }    if (lmctlfile) {      E_INFO("Reading LM ctl file\n");      kb->lmset=lm_read_ctl(lmctlfile,kb->dict,langwt,uw,inspen,lmdumpdir,&(kb->n_lm),&(kb->n_alloclm),dict_size(kb->dict));      E_INFO("kb->lmset[0].name %s\n",kb->lmset[0].name);      if(kb->lmset==NULL)	E_FATAL("lm_read_ctl(%s,%e,%e,%e) failed\n:",lmctlfile,langwt,inspen,uw);    }        if (fillpenfile || (lmfile && kb->dict) || (lmctlfile && kb->dict)) {	if (! kb->dict)		/* Sic */	    E_FATAL("No dictionary for associating filler penalty file(%s)\n", fillpenfile);		if ((kb->fillpen = fillpen_init (kb->dict, fillpenfile, silprob, fillprob,					 langwt, inspen)) == NULL)	    E_FATAL("fillpen_init(%s) failed\n", fillpenfile);    }    if (kb->dict && kb->lm) {	/* Initialize dict2lmwid */	if ((kb->dict2lmwid = wid_dict_lm_map (kb->dict, kb->lm,langwt)) == NULL)	    E_FATAL("Dict/LM word-id mapping failed\n");    }    if(kb->dict && kb->lmset) {      for(i=0;i<kb->n_lm;i++)	if ((kb->lmset[i].lm->dict2lmwid = wid_dict_lm_map (kb->dict, kb->lmset[i].lm,langwt)) == NULL)	    E_FATAL("Dict/LM word-id mapping failed for LM index %d, named %s\n",i,kb->lmset[i].name);    }        if (meanfile) {	if ((! varfile) || (! mixwfile))	    E_FATAL("Varfile or mixwfile not specified along with meanfile(%s)\n", meanfile);	kb->mgau = mgau_init (meanfile, 			      varfile, varfloor, 			      mixwfile, mixwfloor, 			      TRUE,  /* Do precomputation*/			      senmgau,			      MIX_INT_FLOAT_COMP); /*Use hybrid integer and float routine */	if (kb->mgau == NULL)	    E_FATAL("gauden_init(%s, %s, %e) failed\n", meanfile, varfile, varfloor);	if(subvqfile && gsfile){	  E_FATAL("Currently there is no combination scheme of gs and svq in Gaussian Selection\n");	}	if (subvqfile) {	    if ((kb->svq = subvq_init (subvqfile, varfloor, -1, kb->mgau)) == NULL)		E_FATAL("subvq_init (%s, %e, -1) failed\n", subvqfile, varfloor);	}		if(gsfile) {	    if((kb->gs=gs_read(gsfile))==NULL)	      E_FATAL("gs_read(%s) failed\n",gsfile);	    E_INFO("After reading the number of senones: %d\n",kb->gs->n_mgau);	}      }        if (tmatfile) {	if ((kb->tmat = tmat_init (tmatfile, tmatfloor)) == NULL)	    E_FATAL("tmat_init (%s, %e) failed\n", tmatfile, tmatfloor);    }            if (kb->mdef && kb->dict) {	/* Initialize dict2pid */	kb->dict2pid = dict2pid_build (kb->mdef, kb->dict);    }        /* ***************** Verifications ***************** */    E_INFO("Verifying models consistency:\n");        if (kb->fcb && kb->mgau) {	/* Verify feature streams against gauden codebooks */	if (feat_stream_len(kb->fcb, 0) != mgau_veclen(kb->mgau))	    E_FATAL("Feature streamlen(%d) != mgau streamlen(%d)\n",		    feat_stream_len(kb->fcb, 0), mgau_veclen(kb->mgau));    }        if (kb->mdef && kb->mgau) {	/* Verify senone parameters against model definition parameters */	if (kb->mdef->n_sen != mgau_n_mgau(kb->mgau))	    E_FATAL("Mdef #senones(%d) != mgau #senones(%d)\n",		    kb->mdef->n_sen, mgau_n_mgau(kb->mgau));    }        if (kb->mdef && kb->tmat) {	/* Verify transition matrices parameters against model definition parameters */	if (kb->mdef->n_tmat != kb->tmat->n_tmat)	    E_FATAL("Mdef #tmat(%d) != tmatfile(%d)\n", kb->mdef->n_tmat, kb->tmat->n_tmat);	if (kb->mdef->n_emit_state != kb->tmat->n_state)	    E_FATAL("Mdef #states(%d) != tmat #states(%d)\n",		    kb->mdef->n_emit_state, kb->tmat->n_state);    }    return kb;}/* RAH 4.19.01 free memory allocated within this module */void kbcore_free (kbcore_t *kbcore){  feat_t *fcb = kbcore_fcb (kbcore); /*  */  mdef_t *mdef = kbcore_mdef(kbcore);  dict_t *dict = kbcore_dict (kbcore);  dict2pid_t *dict2pid = kbcore_dict2pid (kbcore);		/*  */  /*dictword_t *word;   */  lm_t *lm = kbcore_lm (kbcore); /*  */  lm_free (lm);    /* Clean up the dictionary stuff*/  dict_free (dict);  /* dict2pid */  ckd_free ((void *) dict2pid->comwt );  ckd_free ((void *) dict2pid->comsseq );  ckd_free ((void *) dict2pid->comstate );  ckd_free_2d ((void *) dict2pid->single_lc );  ckd_free_3d ((void ***) dict2pid->ldiph_lc );    /* RAH, this bombs         for (i=0;i<dict_size(dict);i++)      ckd_free ((void *) dict2pid->internal[i]);   */  ckd_free ((void *) dict2pid->internal);  /* Clean up the mdef stuff */    mdef_free (mdef);  fillpen_free (kbcore->fillpen);  tmat_free (kbcore->tmat);  subvq_free (kbcore->svq);  mgau_free (kbcore->mgau);  /* memory allocated in kbcore*/  if (fcb) {    ckd_free ((void *)fcb->name);    ckd_free ((void *)fcb->stream_len);    ckd_free ((void *)fcb);  }  /* Free the memory allocated by this module*/  logs_free();    feat_free (kbcore->fcb);  /* Free the object */  ckd_free ((void *) kbcore);}

⌨️ 快捷键说明

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