Julius 4.2
libsent/src/hmminfo/read_binhmmlist.c
00001 
00047 /*
00048  * Copyright (c) 1991-2011 Kawahara Lab., Kyoto University
00049  * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
00050  * Copyright (c) 2005-2011 Julius project team, Nagoya Institute of Technology
00051  * All rights reserved
00052  */
00053 
00054 #include <sent/stddefs.h>
00055 #include <sent/htk_hmm.h>
00056 #include <sent/ptree.h>
00057 
00067 static boolean
00068 load_hmmlist_callback(void **data_p, void *data, FILE *fp)
00069 {
00070   HTK_HMM_INFO *hmminfo = data;
00071   HMM_Logical *new;
00072   int len;
00073   char buf[MAX_HMMNAME_LEN];
00074   HTK_HMM_Data *d;
00075 
00076   new = (HMM_Logical *)mybmalloc2(sizeof(HMM_Logical), &(hmminfo->lroot));
00077   if (myfread(&(new->is_pseudo), sizeof(boolean), 1, fp) < 1) return FALSE;
00078   if (myfread(&len, sizeof(int), 1, fp) < 1) return FALSE;
00079   new->name = (char *)mybmalloc2(len, &(hmminfo->lroot));
00080   if (myfread(new->name, len, 1, fp) < 1) return FALSE;
00081   if (myfread(&len, sizeof(int), 1, fp) < 1) return FALSE;
00082   if (myfread(buf, len, 1, fp) < 1) return FALSE;
00083   if (new->is_pseudo) {
00084     jlog("Error: sorry, pseudo logical phone saving not implemented yet\n");
00085     return FALSE;
00086   } else {
00087     d = htk_hmmdata_lookup_physical(hmminfo, buf);
00088     if (d == NULL) {
00089       jlog("Error: load_hmmlist_callback: no name \"%s\" in hmmdefs!\n", buf);
00090       return FALSE;
00091     }
00092     new->body.defined = d;
00093   }
00094   new->next = hmminfo->lgstart;
00095   hmminfo->lgstart = new;
00096 
00097   *data_p = new;
00098   
00099   return TRUE;
00100 }
00101 
00102 typedef struct {
00103   HTK_HMM_Trans **tr;
00104   HTK_HMM_State **st;
00105 } ListData;
00106 
00116 static boolean
00117 load_cdset_callback(void **data_p, void *data, FILE *fp)
00118 {
00119   HTK_HMM_INFO *hmminfo = data;
00120   ListData *ld = (ListData *)hmminfo->hook;
00121   CD_Set *new;
00122   int len;
00123   int id;
00124   int i, j;
00125   HTK_HMM_Trans *ttmp;
00126 
00127   new = (CD_Set *)mybmalloc2(sizeof(CD_Set), &(hmminfo->cdset_root));
00128   if (myfread(&len, sizeof(int), 1, fp) < 1) return FALSE;
00129   new->name = (char *)mybmalloc2(len, &(hmminfo->cdset_root));
00130   if (myfread(new->name, len, 1, fp) < 1) return FALSE;
00131   if (myfread(&id, sizeof(int), 1, fp) < 1) return FALSE;
00132   new->tr = ld->tr[id];
00133   if (myfread(&(new->state_num), sizeof(unsigned short), 1, fp) < 1) return FALSE;
00134   new->stateset = (CD_State_Set *)mybmalloc2(sizeof(CD_State_Set) * new->state_num, &(hmminfo->cdset_root));
00135   for(i=0;i<new->state_num;i++) {
00136     if (myfread(&(new->stateset[i].num), sizeof(unsigned short), 1, fp) < 1) return FALSE;
00137     new->stateset[i].maxnum = new->stateset[i].num;
00138     new->stateset[i].s = (HTK_HMM_State **)mybmalloc2(sizeof(HTK_HMM_State *) * new->stateset[i].num, &(hmminfo->cdset_root));
00139     for(j=0;j<new->stateset[i].num;j++) {
00140       if (myfread(&id, sizeof(int), 1, fp) < 1) return FALSE;
00141       new->stateset[i].s[j] = ld->st[id];
00142     }
00143   }  
00144 
00145   *data_p = new;
00146   
00147   return TRUE;
00148 }
00149 
00158 boolean
00159 load_hmmlist_bin(FILE *fp, HTK_HMM_INFO *hmminfo)
00160 {
00161   HMM_Logical *l;
00162   int n;
00163   HTK_HMM_Trans *t;
00164   HTK_HMM_State *s;
00165   ListData ld;
00166 
00167   /* build id->entity list */
00168   ld.tr = (HTK_HMM_Trans **)mymalloc(sizeof(HTK_HMM_Trans *) * hmminfo->totaltransnum);
00169   n = 0;
00170   for (t = hmminfo->trstart; t; t = t->next) {
00171     ld.tr[n++] = t;
00172   }
00173   ld.st = (HTK_HMM_State **)mymalloc(sizeof(HTK_HMM_State *) * hmminfo->totalstatenum);
00174   n = 0;
00175   for (s = hmminfo->ststart; s; s = s->next) {
00176     ld.st[n++] = s;
00177   }
00178   /* set it to hook */
00179   hmminfo->hook = &ld;
00180 
00181   /* load hmmlist */
00182   jlog("Stat: load_hmmlist_bin: reading hmmlist\n");
00183   if (aptree_read(fp, &(hmminfo->logical_root), &(hmminfo->lroot), hmminfo, load_hmmlist_callback) == FALSE) {
00184     jlog("Error: load_hmmlist_bin: failed to read hmmlist from binary file\n");
00185     return FALSE;
00186   }
00187   /* load cdset */
00188   jlog("Stat: load_hmmlist_bin: reading pseudo phone set\n");
00189   if (aptree_read(fp, &(hmminfo->cdset_info.cdtree), &(hmminfo->cdset_root), hmminfo, load_cdset_callback) == FALSE) {
00190     jlog("Warning: load_hmmlist_bin: cdset not in binary file, skip reading\n");
00191   } else {
00192     hmminfo->cdset_info.binary_malloc = TRUE;
00193   }
00194 
00195   /* remove data */
00196   free(ld.st);
00197   free(ld.tr);
00198   hmminfo->hook = NULL;
00199 
00200   /* form other data */
00201   n = 0;
00202   for(l=hmminfo->lgstart;l;l=l->next) n++;
00203   hmminfo->totallogicalnum = n;
00204 
00205   return TRUE;
00206 }