libsent/src/hmminfo/hmm_lookup.c

Go to the documentation of this file.
00001 
00040 /*
00041  * Copyright (c) 1991-2007 Kawahara Lab., Kyoto University
00042  * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
00043  * Copyright (c) 2005-2007 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);
00147     } else {
00148       aptree_add_entry(new->name, new, match->name, &(hmminfo->logical_root));
00149     }
00150   }
00151 
00152   /* re-count total number */
00153   hmm_count_logical_num(hmminfo);
00154 }
00155 
00156 
00157 static int add_count;           
00158 
00169 static boolean
00170 hmm_add_pseudo_phones_sub(HTK_HMM_INFO *hmminfo, char *name)
00171 {
00172   HMM_Logical *new, *match;
00173 
00174   /* check if already exist */
00175   match = aptree_search_data(name, hmminfo->logical_root);
00176   if (match != NULL && strmatch(match->name, name)) {
00177     /* already exist in list */
00178     /*    if (! match->is_pseudo) {*/
00179       /* this pseudo-HMM is already defined as real HMM in hmmdefs or in HMMList */
00180     /*designated_count++;
00181       }*/
00182   } else {
00183     /* create new HMM_Logical with pseudo body */
00184     new = (HMM_Logical *)mybmalloc2(sizeof(HMM_Logical), &(hmminfo->lroot));
00185     new->name = (char *)mybmalloc2(strlen(name) + 1, &(hmminfo->lroot));
00186     strcpy(new->name, name);
00187     new->is_pseudo = TRUE;
00188     new->body.pseudo = cdset_lookup(hmminfo, name);
00189     if (new->body.pseudo == NULL) {     /* should never happen */
00190       jlog("Error: hmm_lookup: tried to add pseudo phone \"%s\" to logical HMM, but no corresponding CD_Set found.  Why??\n");
00191       return FALSE;
00192     }
00193     new->next = hmminfo->lgstart;
00194     hmminfo->lgstart = new;
00195     if (hmminfo->logical_root == NULL) {
00196       hmminfo->logical_root = aptree_make_root_node(new);
00197     } else {
00198       aptree_add_entry(new->name, new, match->name, &(hmminfo->logical_root));
00199     }
00200     add_count++;
00201   }
00202   return TRUE;
00203 }
00204     
00211 void
00212 hmm_add_pseudo_phones(HTK_HMM_INFO *hmminfo)
00213 {
00214   HMM_Logical *lg;
00215   static char buf[MAX_HMMNAME_LEN];
00216   boolean ok_p = TRUE;
00217 
00218   add_count = 0;
00219   /* add pseudo monophone */
00220   for (lg = hmminfo->lgstart; lg; lg = lg->next) {
00221     if (lg->is_pseudo) continue;
00222     if (hmm_add_pseudo_phones_sub(hmminfo, center_name(lg->name, buf)) == FALSE) {
00223       jlog("Error: hmm_lookup: failed to add \"%s\" as logical\n", center_name(lg->name, buf));
00224       ok_p = FALSE;
00225     }
00226   }
00227   /* add pseudo biphone, i.e. "a-k" etc. */
00228   for (lg = hmminfo->lgstart; lg; lg = lg->next) {
00229     if (lg->is_pseudo) continue;
00230     if (hmm_add_pseudo_phones_sub(hmminfo, leftcenter_name(lg->name, buf)) == FALSE) {
00231       jlog("Error: hmm_lookup: failed to add \"%s\" as logical\n", leftcenter_name(lg->name, buf));
00232       ok_p = FALSE;
00233     }
00234   }
00235   /* add pseudo biphone, i.e. "k+e" etc. */
00236   for (lg = hmminfo->lgstart; lg; lg = lg->next) {
00237     if (lg->is_pseudo) continue;
00238     if (hmm_add_pseudo_phones_sub(hmminfo, rightcenter_name(lg->name, buf)) == FALSE) {
00239       jlog("Error: hmm_lookup: failed to add \"%s\" as logical\n", rightcenter_name(lg->name, buf));
00240       ok_p = FALSE;
00241     }
00242   }
00243   jlog("Stat: hmm_lookup: %d pseudo phones are added to logical HMM list\n", add_count);
00244   hmminfo->totalpseudonum = add_count;
00245   /* re-count total number */
00246   hmm_count_logical_num(hmminfo);
00247 }
00248 
00256 int
00257 hmm_logical_state_num(HMM_Logical *lg)
00258 {
00259   int len;
00260   if (lg->is_pseudo) len = lg->body.pseudo->state_num;
00261   else len = lg->body.defined->state_num;
00262   return(len);
00263 }
00264 
00272 HTK_HMM_Trans *
00273 hmm_logical_trans(HMM_Logical *lg)
00274 {
00275   HTK_HMM_Trans *tr;
00276   if (lg->is_pseudo) tr = lg->body.pseudo->tr;
00277   else tr = lg->body.defined->tr;
00278   return(tr);
00279 }

Generated on Tue Dec 18 15:59:55 2007 for Julius by  doxygen 1.5.4