⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hmm_lookup.c

📁 julius version 4.12.about sound recognition.
💻 C
字号:
/** * @file   hmm_lookup.c *  * <JA> * @brief  %HMM の叹涟から悸挛を浮瑚する * * "g-u+i" などの %HMM 侠妄叹から·滦炳する %HMM の年盗を浮瑚しますˉ *  * 浮瑚冯蔡は侠妄%HMM HMM_Logical へのポインタで手されますˉHMM_Logical は· * 悸狠に年盗されている %HMM へのポインタか·あるいはバイフォンˇモノフォン * の侠妄%HMM叹でかつそれらが%HMM年盗ファイルやHMMListで年盗されていない眷圭· * 滦炳する pseudo %HMM set へのポインタのどちらかを瘦积していますˉ *  * また·侠妄叹から年盗叹へのマッピング簇眶への悸%HMM叹と pseudo %HMM叹の * 纳裁判峡もここで乖ないますˉ * </JA> *  * <EN> * @brief  Look up logical %HMM entry from phone name * * These function is for searching %HMM definition from phone name * like "g-u+i". * * The result is pointer to the corresponding logical %HMM (HMM_Logical). * The logical %HMM holds either pointer to an actual %HMM data defined in * HTK %HMM definition, or pointer to a pseudo %HMM set when the query name * is biphone or monophone and they are not defined in either HTK %HMM * definition or HMMList mapping file. * * Adding physical %HMM defined in HTK %HMM definitions and pseudo phones * to the logical %HMM mapping function is also done here. * </EN> *  * @author Akinobu LEE * @date   Tue Feb 15 22:34:30 2005 * * $Revision: 1.4 $ *  *//* * Copyright (c) 1991-2007 Kawahara Lab., Kyoto University * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology * Copyright (c) 2005-2007 Julius project team, Nagoya Institute of Technology * All rights reserved *//* physical HMMs ... already indexed when reading in hmmdefs *//* logical HMMs  ... already indexed when reading in HMMList */#include <sent/stddefs.h>#include <sent/htk_hmm.h>#include <sent/ptree.h>/**  * Look up physical (defined in HTK %HMM definition file) %HMM by its name. *  * @param hmminfo [in] HMM definition data * @param keyname [in] key string of %HMM name *  * @return pointer to the found physical %HMM, NULL if not found. */HTK_HMM_Data *htk_hmmdata_lookup_physical(HTK_HMM_INFO *hmminfo, char *keyname){  HTK_HMM_Data *tmp;  tmp = aptree_search_data(keyname, hmminfo->physical_root);  if (tmp != NULL && strmatch(tmp->name, keyname)) {    return tmp;  } else {    return NULL;  }}/**  * Look up logical %HMM by its name. *  * @param hmminfo [in] HMM definition data * @param keyname [in] key string of %HMM name *  * @return pointer to the found logical %HMM, NULL if not found. */HMM_Logical *htk_hmmdata_lookup_logical(HTK_HMM_INFO *hmminfo, char *keyname){  HMM_Logical *tmp;  tmp = aptree_search_data(keyname, hmminfo->logical_root);  if (tmp != NULL && strmatch(tmp->name, keyname)) {    return tmp;  } else {    return NULL;  }}/**  * Count the number of logical %HMM and store it. *  * @param hmminfo [in] %HMM definition data. */static voidhmm_count_logical_num(HTK_HMM_INFO *hmminfo){  HMM_Logical *lg;  int n;  n = 0;  for (lg = hmminfo->lgstart; lg; lg = lg->next) n++;  hmminfo->totallogicalnum = n;}/**  * @brief  Add all physical %HMM to logical %HMM. * * This function should be called only if HMMList is not specified. * Julius assumes all the triphones should be explicitly mapped * using HMMList file. *  * @param hmminfo [in] %HMM definition data. */voidhmm_add_physical_to_logical(HTK_HMM_INFO *hmminfo){  HMM_Logical *new, *match = NULL;  HTK_HMM_Data *ph;  for (ph = hmminfo->start; ph; ph = ph->next) {    /* check if same name already exist */    if (hmminfo->logical_root != NULL) {      match = aptree_search_data(ph->name, hmminfo->logical_root);      if (match != NULL && strmatch(match->name, ph->name)) {	/* the physcal name was already mapped to other HMMs in HMMList */	jlog("Warning: hmm_lookup: \"%s\" is defined in hmmdefs, but \"%s\" will be used instead\n", ph->name, (match->body.defined)->name);	continue;      }    }    /* create new HMM_Logical */    /* body refers to the physical HMM */    new = (HMM_Logical *)mybmalloc2(sizeof(HMM_Logical), &(hmminfo->lroot));    new->name = (char *)mybmalloc2(strlen(ph->name) + 1, &(hmminfo->lroot));    strcpy(new->name, ph->name);    new->is_pseudo = FALSE;    new->body.defined = ph;    new->next = hmminfo->lgstart;    hmminfo->lgstart = new;    if (hmminfo->logical_root == NULL) {      hmminfo->logical_root = aptree_make_root_node(new, &(hmminfo->lroot));    } else {      aptree_add_entry(new->name, new, match->name, &(hmminfo->logical_root), &(hmminfo->lroot));    }  }  /* re-count total number */  hmm_count_logical_num(hmminfo);}/**  * @brief  Add a pseudo monophone and pseudo biphone to logical %HMM. * * Logical %HMM specified in HMMlist precedes * pseudo %HMM: if some monophones or biphones are already * defined in HMMList, pseudo %HMM will not be added. *  * @param hmminfo [in] %HMM definition data. * @param name [in] name of the pseudo phone to add. */static booleanhmm_add_pseudo_phones_sub(HTK_HMM_INFO *hmminfo, char *name){  HMM_Logical *new, *match;  /* check if already exist */  match = aptree_search_data(name, hmminfo->logical_root);  if (match != NULL && strmatch(match->name, name)) {    /* already exist in list */    /*    if (! match->is_pseudo) {*/      /* this pseudo-HMM is already defined as real HMM in hmmdefs or in HMMList */    /*designated_count++;      }*/  } else {    /* create new HMM_Logical with pseudo body */    new = (HMM_Logical *)mybmalloc2(sizeof(HMM_Logical), &(hmminfo->lroot));    new->name = (char *)mybmalloc2(strlen(name) + 1, &(hmminfo->lroot));    strcpy(new->name, name);    new->is_pseudo = TRUE;    new->body.pseudo = cdset_lookup(hmminfo, name);    if (new->body.pseudo == NULL) {	/* should never happen */      jlog("Error: hmm_lookup: tried to add pseudo phone \"%s\" to logical HMM, but no corresponding CD_Set found.  Why??\n");      return FALSE;    }    new->next = hmminfo->lgstart;    hmminfo->lgstart = new;    if (hmminfo->logical_root == NULL) {      hmminfo->logical_root = aptree_make_root_node(new, &(hmminfo->lroot));    } else {      aptree_add_entry(new->name, new, match->name, &(hmminfo->logical_root), &(hmminfo->lroot));    }    hmminfo->totalpseudonum++;  }  return TRUE;}    /**  * Update logical %HMM list by adding all the possible pseudo monophone * and biphone to the list. *  * @param hmminfo [in] %HMM definition data. */voidhmm_add_pseudo_phones(HTK_HMM_INFO *hmminfo){  HMM_Logical *lg;  char buf[MAX_HMMNAME_LEN];  boolean ok_p = TRUE;  hmminfo->totalpseudonum = 0;  /* add pseudo monophone */  for (lg = hmminfo->lgstart; lg; lg = lg->next) {    if (lg->is_pseudo) continue;    if (hmm_add_pseudo_phones_sub(hmminfo, center_name(lg->name, buf)) == FALSE) {      jlog("Error: hmm_lookup: failed to add \"%s\" as logical\n", center_name(lg->name, buf));      ok_p = FALSE;    }  }  /* add pseudo biphone, i.e. "a-k" etc. */  for (lg = hmminfo->lgstart; lg; lg = lg->next) {    if (lg->is_pseudo) continue;    if (hmm_add_pseudo_phones_sub(hmminfo, leftcenter_name(lg->name, buf)) == FALSE) {      jlog("Error: hmm_lookup: failed to add \"%s\" as logical\n", leftcenter_name(lg->name, buf));      ok_p = FALSE;    }  }  /* add pseudo biphone, i.e. "k+e" etc. */  for (lg = hmminfo->lgstart; lg; lg = lg->next) {    if (lg->is_pseudo) continue;    if (hmm_add_pseudo_phones_sub(hmminfo, rightcenter_name(lg->name, buf)) == FALSE) {      jlog("Error: hmm_lookup: failed to add \"%s\" as logical\n", rightcenter_name(lg->name, buf));      ok_p = FALSE;    }  }  jlog("Stat: hmm_lookup: %d pseudo phones are added to logical HMM list\n", hmminfo->totalpseudonum);  /* re-count total number */  hmm_count_logical_num(hmminfo);}/**  * Generic function to get the number of states in a logical %HMM. *  * @param lg [in] logical %HMM *  * @return the number of states in the logical %HMM. */inthmm_logical_state_num(HMM_Logical *lg){  int len;  if (lg->is_pseudo) len = lg->body.pseudo->state_num;  else len = lg->body.defined->state_num;  return(len);}/**  * Generic function to get transition matrix of a logical %HMM. *  * @param lg [in] logical %HMM *  * @return pointer to the transition matrix of the logical %HMM. */HTK_HMM_Trans *hmm_logical_trans(HMM_Logical *lg){  HTK_HMM_Trans *tr;  if (lg->is_pseudo) tr = lg->body.pseudo->tr;  else tr = lg->body.defined->tr;  return(tr);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -