Julius 4.2
|
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 }