Julius 4.2
|
00001 00040 /* 00041 * Copyright (c) 1991-2011 Kawahara Lab., Kyoto University 00042 * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology 00043 * Copyright (c) 2005-2011 Julius project team, Nagoya Institute of Technology 00044 * All rights reserved 00045 */ 00046 00047 /* physical HMMs ... already indexed when reading in hmmdefs */ 00048 /* logical HMMs ... already indexed when reading in HMMList */ 00049 00050 #include <sent/stddefs.h> 00051 #include <sent/htk_hmm.h> 00052 #include <sent/ptree.h> 00053 00062 HTK_HMM_Data * 00063 htk_hmmdata_lookup_physical(HTK_HMM_INFO *hmminfo, char *keyname) 00064 { 00065 HTK_HMM_Data *tmp; 00066 tmp = aptree_search_data(keyname, hmminfo->physical_root); 00067 if (tmp != NULL && strmatch(tmp->name, keyname)) { 00068 return tmp; 00069 } else { 00070 return NULL; 00071 } 00072 } 00073 00082 HMM_Logical * 00083 htk_hmmdata_lookup_logical(HTK_HMM_INFO *hmminfo, char *keyname) 00084 { 00085 HMM_Logical *tmp; 00086 tmp = aptree_search_data(keyname, hmminfo->logical_root); 00087 if (tmp != NULL && strmatch(tmp->name, keyname)) { 00088 return tmp; 00089 } else { 00090 return NULL; 00091 } 00092 } 00093 00099 static void 00100 hmm_count_logical_num(HTK_HMM_INFO *hmminfo) 00101 { 00102 HMM_Logical *lg; 00103 int n; 00104 00105 n = 0; 00106 for (lg = hmminfo->lgstart; lg; lg = lg->next) n++; 00107 hmminfo->totallogicalnum = n; 00108 } 00109 00119 void 00120 hmm_add_physical_to_logical(HTK_HMM_INFO *hmminfo) 00121 { 00122 HMM_Logical *new, *match = NULL; 00123 HTK_HMM_Data *ph; 00124 00125 for (ph = hmminfo->start; ph; ph = ph->next) { 00126 00127 /* check if same name already exist */ 00128 if (hmminfo->logical_root != NULL) { 00129 match = aptree_search_data(ph->name, hmminfo->logical_root); 00130 if (match != NULL && strmatch(match->name, ph->name)) { 00131 /* the physcal name was already mapped to other HMMs in HMMList */ 00132 jlog("Warning: hmm_lookup: \"%s\" is defined in hmmdefs, but \"%s\" will be used instead\n", ph->name, (match->body.defined)->name); 00133 continue; 00134 } 00135 } 00136 /* create new HMM_Logical */ 00137 /* body refers to the physical HMM */ 00138 new = (HMM_Logical *)mybmalloc2(sizeof(HMM_Logical), &(hmminfo->lroot)); 00139 new->name = (char *)mybmalloc2(strlen(ph->name) + 1, &(hmminfo->lroot)); 00140 strcpy(new->name, ph->name); 00141 new->is_pseudo = FALSE; 00142 new->body.defined = ph; 00143 new->next = hmminfo->lgstart; 00144 hmminfo->lgstart = new; 00145 if (hmminfo->logical_root == NULL) { 00146 hmminfo->logical_root = aptree_make_root_node(new, &(hmminfo->lroot)); 00147 } else { 00148 aptree_add_entry(new->name, new, match->name, &(hmminfo->logical_root), &(hmminfo->lroot)); 00149 } 00150 } 00151 00152 /* re-count total number */ 00153 hmm_count_logical_num(hmminfo); 00154 } 00155 00156 00157 00168 static boolean 00169 hmm_add_pseudo_phones_sub(HTK_HMM_INFO *hmminfo, char *name) 00170 { 00171 HMM_Logical *new, *match; 00172 00173 /* check if already exist */ 00174 match = aptree_search_data(name, hmminfo->logical_root); 00175 if (match != NULL && strmatch(match->name, name)) { 00176 /* already exist in list */ 00177 /* if (! match->is_pseudo) {*/ 00178 /* this pseudo-HMM is already defined as real HMM in hmmdefs or in HMMList */ 00179 /*designated_count++; 00180 }*/ 00181 } else { 00182 /* create new HMM_Logical with pseudo body */ 00183 new = (HMM_Logical *)mybmalloc2(sizeof(HMM_Logical), &(hmminfo->lroot)); 00184 new->name = (char *)mybmalloc2(strlen(name) + 1, &(hmminfo->lroot)); 00185 strcpy(new->name, name); 00186 new->is_pseudo = TRUE; 00187 new->body.pseudo = cdset_lookup(hmminfo, name); 00188 if (new->body.pseudo == NULL) { /* should never happen */ 00189 jlog("Error: hmm_lookup: tried to add pseudo phone \"%s\" to logical HMM, but no corresponding CD_Set found. Why??\n"); 00190 return FALSE; 00191 } 00192 new->next = hmminfo->lgstart; 00193 hmminfo->lgstart = new; 00194 if (hmminfo->logical_root == NULL) { 00195 hmminfo->logical_root = aptree_make_root_node(new, &(hmminfo->lroot)); 00196 } else { 00197 aptree_add_entry(new->name, new, match->name, &(hmminfo->logical_root), &(hmminfo->lroot)); 00198 } 00199 hmminfo->totalpseudonum++; 00200 } 00201 return TRUE; 00202 } 00203 00210 void 00211 hmm_add_pseudo_phones(HTK_HMM_INFO *hmminfo) 00212 { 00213 HMM_Logical *lg; 00214 char buf[MAX_HMMNAME_LEN]; 00215 boolean ok_p = TRUE; 00216 00217 hmminfo->totalpseudonum = 0; 00218 /* add pseudo monophone */ 00219 for (lg = hmminfo->lgstart; lg; lg = lg->next) { 00220 if (lg->is_pseudo) continue; 00221 if (hmm_add_pseudo_phones_sub(hmminfo, center_name(lg->name, buf)) == FALSE) { 00222 jlog("Error: hmm_lookup: failed to add \"%s\" as logical\n", center_name(lg->name, buf)); 00223 ok_p = FALSE; 00224 } 00225 } 00226 /* add pseudo biphone, i.e. "a-k" etc. */ 00227 for (lg = hmminfo->lgstart; lg; lg = lg->next) { 00228 if (lg->is_pseudo) continue; 00229 if (hmm_add_pseudo_phones_sub(hmminfo, leftcenter_name(lg->name, buf)) == FALSE) { 00230 jlog("Error: hmm_lookup: failed to add \"%s\" as logical\n", leftcenter_name(lg->name, buf)); 00231 ok_p = FALSE; 00232 } 00233 } 00234 /* add pseudo biphone, i.e. "k+e" etc. */ 00235 for (lg = hmminfo->lgstart; lg; lg = lg->next) { 00236 if (lg->is_pseudo) continue; 00237 if (hmm_add_pseudo_phones_sub(hmminfo, rightcenter_name(lg->name, buf)) == FALSE) { 00238 jlog("Error: hmm_lookup: failed to add \"%s\" as logical\n", rightcenter_name(lg->name, buf)); 00239 ok_p = FALSE; 00240 } 00241 } 00242 jlog("Stat: hmm_lookup: %d pseudo phones are added to logical HMM list\n", hmminfo->totalpseudonum); 00243 /* re-count total number */ 00244 hmm_count_logical_num(hmminfo); 00245 } 00246 00254 int 00255 hmm_logical_state_num(HMM_Logical *lg) 00256 { 00257 int len; 00258 if (lg->is_pseudo) len = lg->body.pseudo->state_num; 00259 else len = lg->body.defined->state_num; 00260 return(len); 00261 } 00262 00270 HTK_HMM_Trans * 00271 hmm_logical_trans(HMM_Logical *lg) 00272 { 00273 HTK_HMM_Trans *tr; 00274 if (lg->is_pseudo) tr = lg->body.pseudo->tr; 00275 else tr = lg->body.defined->tr; 00276 return(tr); 00277 }