00001
00040
00041
00042
00043
00044
00045
00046
00047
00048
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
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
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
00137
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
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
00174 match = aptree_search_data(name, hmminfo->logical_root);
00175 if (match != NULL && strmatch(match->name, name)) {
00176
00177
00178
00179
00180
00181 } else {
00182
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) {
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
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
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
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
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 }