libsent/src/hmminfo/init_phmm.c

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

Generated on Tue Dec 26 12:53:22 2006 for Julian by  doxygen 1.5.0