libsent/src/hmminfo/init_phmm.c

Go to the documentation of this file.
00001 
00018 /*
00019  * Copyright (c) 1991-2007 Kawahara Lab., Kyoto University
00020  * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
00021  * Copyright (c) 2005-2007 Julius project team, Nagoya Institute of Technology
00022  * All rights reserved
00023  */
00024 
00025 #include <sent/stddefs.h>
00026 #include <sent/htk_hmm.h>
00027 
00033 HTK_HMM_INFO *
00034 hmminfo_new()
00035 {
00036   HTK_HMM_INFO *new;
00037 
00038   new = (HTK_HMM_INFO *)mymalloc(sizeof(HTK_HMM_INFO));
00039 
00040   new->mroot = NULL;
00041   new->lroot = NULL;
00042 
00043   new->opt.stream_info.num = 1;
00044   new->opt.cov_type = C_DIAG_C;
00045   new->opt.dur_type = D_NULL;
00046 
00047   new->trstart = NULL;
00048   new->vrstart = NULL;
00049   new->ststart = NULL;
00050   new->dnstart = NULL;
00051   new->start   = NULL;
00052   new->lgstart = NULL;
00053   new->physical_root = NULL;
00054   new->logical_root = NULL;
00055   new->tr_root = NULL;
00056   new->vr_root = NULL;
00057   new->dn_root = NULL;
00058   new->st_root = NULL;
00059   new->codebooknum = 0;
00060   new->codebook_root = NULL;
00061   new->maxcodebooksize = 0;
00062   new->totalmixnum = 0;
00063   new->totalstatenum = 0;
00064   new->totalhmmnum = 0;
00065   new->totallogicalnum = 0;
00066   new->is_triphone = FALSE;
00067   new->is_tied_mixture = FALSE;
00068   new->cdset_method = IWCD_NBEST;
00069   new->cdmax_num = 3;
00070   new->totalpseudonum = 0;
00071   new->sp = NULL;
00072   new->basephone.root = NULL;
00073   new->cdset_info.cdtree = NULL;
00074   new->variance_inversed = FALSE;
00075 
00076   return(new);
00077 }
00078 
00086 boolean
00087 hmminfo_free(HTK_HMM_INFO *hmm)
00088 {
00089   /* cdset does not use bmalloc, so free them separately */
00090   free_cdset(&(hmm->cdset_info.cdtree));
00091 
00092   /* free lookup indexes */
00093   free_aptree(hmm->tr_root);
00094   free_aptree(hmm->vr_root);
00095   free_aptree(hmm->dn_root);
00096   free_aptree(hmm->st_root);
00097   free_aptree(hmm->physical_root);
00098   free_aptree(hmm->logical_root);
00099   free_aptree(hmm->codebook_root);
00100   free_aptree(hmm->basephone.root);
00101   
00102   /* free all memory that has been allocated by bmalloc2() */
00103   if (hmm->mroot != NULL) mybfree2(&(hmm->mroot));
00104   if (hmm->lroot != NULL) mybfree2(&(hmm->lroot));
00105 
00106   /* free whole */
00107   free(hmm);
00108 
00109   return(TRUE);
00110 }
00111 
00122 boolean
00123 init_hmminfo(HTK_HMM_INFO *hmminfo, char *hmmfilename, char *namemapfile, Value *para)
00124 {
00125   FILE *fp;
00126   boolean ok_p;
00127 
00128   ok_p = FALSE;
00129 
00130   /* read hmmdef file */
00131   jlog("Stat: init_phmm: Reading in HMM definition\n");
00132   /* first, try ascii format */
00133   if ((fp = fopen_readfile(hmmfilename)) == NULL) {
00134     jlog("Error: init_phmm: failed to open %s\n",hmmfilename);
00135     return FALSE;
00136   }
00137   if (rdhmmdef(fp, hmminfo) == TRUE) {
00138     ok_p = TRUE;
00139   }
00140   if (fclose_readfile(fp) < 0) {
00141     jlog("Error: init_phmm: failed to close %s\n", hmmfilename);
00142     return FALSE;
00143   }
00144   if (ok_p == FALSE) {
00145     /* second, try binary format */
00146     if ((fp = fopen_readfile(hmmfilename)) == NULL) {
00147       jlog("Error: init_phmm: failed to open %s\n",hmmfilename);
00148       return FALSE;
00149     }
00150     if (read_binhmm(fp, hmminfo, TRUE, para) == TRUE) {
00151       ok_p = TRUE;
00152     }
00153     if (fclose_readfile(fp) < 0) {
00154       jlog("Error: init_phmm: failed to close %s\n", hmmfilename);
00155       return FALSE;
00156     }
00157   }
00158   if (ok_p == FALSE) {
00159     jlog("Error: init_phmm: failed to read %s\n", hmmfilename);
00160     return FALSE;
00161   }
00162 
00163   jlog("Stat: init_phmm: defined HMMs: %5d\n", hmminfo->totalhmmnum);
00164 
00165   /* make mapping from logically named HMM to real defined HMM name */
00166   if (namemapfile != NULL) {
00167     /* use HMMList map file */
00168     if ((fp = fopen_readfile(namemapfile)) == NULL) {
00169       jlog("Error: init_phmm: failed to open %s\n",namemapfile);
00170       return FALSE;
00171     }
00172     if (rdhmmlist(fp, hmminfo) == FALSE) {
00173       jlog("Error: init_phmm: HMMList \"%s\" read error\n",namemapfile);
00174       return FALSE;
00175     }
00176     if (fclose_readfile(fp) < 0) {
00177       jlog("Error: init_phmm: failed to close %s\n", namemapfile);
00178       return FALSE;
00179     }
00180     jlog("Stat: init_phmm: logical names: %5d in HMMList\n", hmminfo->totallogicalnum);
00181   } else {
00182     /* add all names of physical HMMs as logical names */
00183     hmm_add_physical_to_logical(hmminfo);
00184     jlog("Stat: init_phmm: logical names: %5d\n", hmminfo->totallogicalnum);
00185   }
00186 
00187   /* extract basephone */
00188   make_hmm_basephone_list(hmminfo);
00189   jlog("Stat: init_phmm: base phones: %5d used in logical\n", hmminfo->basephone.num);
00190 
00191   /* Guess we need to handle context dependency */
00192   /* (word-internal CD is done statically, cross-word CD dynamically */
00193   if (guess_if_cd_hmm(hmminfo)) {
00194     hmminfo->is_triphone = TRUE;
00195   } else {
00196     hmminfo->is_triphone = FALSE;
00197   }
00198 
00199   jlog("Stat: init_phmm: finished reading HMM definitions\n");
00200 
00201   return TRUE;
00202 }
00203 
00210 void
00211 htk_hmm_set_pause_model(HTK_HMM_INFO *hmminfo, char *spmodel_name)
00212 {
00213   HMM_Logical *l;
00214 
00215   l = htk_hmmdata_lookup_logical(hmminfo, spmodel_name);
00216   if (l == NULL) {
00217     jlog("Warning: init_phmm: no model named as \"%s\", no short pause model assigned\n", spmodel_name);
00218   }
00219   hmminfo->sp = l;
00220 }

Generated on Tue Dec 18 15:59:55 2007 for Julius by  doxygen 1.5.4