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

📄 rdhmmdef.c

📁 about sound recognition.i want to downlod
💻 C
字号:
/** * @file   rdhmmdef.c * @author Akinobu LEE * @date   Wed Feb 16 00:17:18 2005 *  * <JA> * @brief  HTK %HMM 年盗ファイルの粕み哈み¨メイン * * ここには HTK 妨及の %HMM 年盗ファイルを粕み哈むための簇眶凡を钙び叫す * メイン簇眶が箭められていますˉ * * このファイルはまた·粕み哈み簇眶凡で鼎奶して脱いられるト〖クン帽疤の * ファイル粕み哈み簇眶を捏丁しますˉ * %HMM 年盗ファイルは read_token() によってト〖クン帽疤で界肌粕み哈まれ· * グロ〖バル恃眶 rdhmmdef_token に呈羌されますˉ称簇眶凡はこの * rdhmmdef_token を徊救して附哼のト〖クンを评ますˉ * </JA> *  * <EN> * @brief  Read HTK %HMM definition file: the main * * This file includes the main routine to read the %HMM definition file in * HTK format. * * This file also contains functions and global variables for per-token * reading tailored for reading HTK %HMM definition file.  The read_token() * will read the file per token, and the read token is stored in a global * variable rdhmmdef_token.  The other reading function will refer to this * variable to read the current token. * </EN> *  * $Revision: 1.5 $ *  *//* * Copyright (c) 1991-2006 Kawahara Lab., Kyoto University * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology * Copyright (c) 2005-2006 Julius project team, Nagoya Institute of Technology * All rights reserved */#include <sent/stddefs.h>#include <sent/htk_param.h>#include <sent/htk_hmm.h>#define MAXBUFLEN  4096		///< Maximum length of a line in the inputchar *rdhmmdef_token;		///< Current token string (GLOBAL)static char *buf = NULL;	///< Local work area for token readingstatic int line;		///< Input Line count/* global functions for rdhmmdef_*.c *//**  * Output error message, with current reading status. *  * @param str [in] error string */voidrderr(char *str){  if (rdhmmdef_token == NULL) {	/* end of file */    j_error("\nError: %s on end of file\n", str);  } else {    j_error("\nError at line %d: %s\n", line, (str) ? str : "parse error");  }}/**  * Read next token and ste it to rdhmmdef_token. *  * @param fp [in] file pointer *  * @return the pointer to the read token, or NULL on end of file or error. */char *read_token(FILE *fp){  if (buf != NULL) {    /* already have buffer */    if ((rdhmmdef_token = mystrtok_quote(NULL, HMMDEF_DELM)) != NULL) {      /* return next token */      return rdhmmdef_token;    }  } else {    /* init: allocate buffer for the first time */    buf = (char *)mymalloc(MAXBUFLEN);    line = 1;  }  /* read new 1 line */  if (getl(buf, MAXBUFLEN, fp) == NULL) {    rdhmmdef_token = NULL;  } else {    rdhmmdef_token = mystrtok_quote(buf, HMMDEF_DELM);    line++;  }  return rdhmmdef_token;}/**  * Convert all the transition probabilities to log10 scale. *  * @param hmm [i/o] %HMM definition data to modify. */static voidconv_log_arc(HTK_HMM_INFO *hmm){  HTK_HMM_Trans *tr;  int i,j;  LOGPROB l;  for (tr = hmm->trstart; tr; tr = tr->next) {    for(i=0;i<tr->statenum;i++) {      for(j=0;j<tr->statenum;j++) {	l = tr->a[i][j];	tr->a[i][j] = (l != 0.0) ? (float)log10(l) : LOG_ZERO;      }    }  }}/**  * Invert all the variance values. *  * @param hmm [i/o] %HMM definition data to modify. */voidhtk_hmm_inverse_variances(HTK_HMM_INFO *hmm){  HTK_HMM_Var *v;  int i,j;  LOGPROB l;  for (v = hmm->vrstart; v; v = v->next) {    for(i=0;i<v->len;i++) {      v->vec[i] = 1 / v->vec[i];    }  }}/**  * @brief  Main top routine to read in HTK %HMM definition file. * * A HTK %HMM definition file will be read from @a fp.  After reading, * the parameter type is checked and calculate some statistics. *  * @param fp [in] file pointer * @param hmm [out] pointer to a %HMM definition structure to store data. *  * @return TRUE on success, FALSE on failure. */booleanrdhmmdef(FILE *fp, HTK_HMM_INFO *hmm){  char macrosw;  char *name;  /* variances in htkdefs are not inversed yet */  hmm->variance_inversed = FALSE;  /* read the first token */  read_token(fp);    /* the toplevel loop */  while (rdhmmdef_token != NULL) {/* break on EOF */    if (rdhmmdef_token[0] != '~') { /* toplevel commands are always macro */      return FALSE;    }    macrosw = rdhmmdef_token[1];    read_token(fp);		/* read next token after the "~.."  */    switch(macrosw) {    case 'o':			/* global option */      set_global_opt(fp,hmm);      break;    case 't':			/* transition macro */      name = mybstrdup2(rdhmmdef_token, &(hmm->mroot));      if (strlen(name) >= MAX_HMMNAME_LEN) rderr("Macro name too long");      read_token(fp);      def_trans_macro(name, fp, hmm);      break;    case 's':			/* state macro */      name = mybstrdup2(rdhmmdef_token, &(hmm->mroot));      if (strlen(name) >= MAX_HMMNAME_LEN) rderr("Macro name too long");      read_token(fp);      def_state_macro(name, fp, hmm);      break;    case 'm':			/* density (mixture) macro */      name = mybstrdup2(rdhmmdef_token, &(hmm->mroot));      if (strlen(name) >= MAX_HMMNAME_LEN) rderr("Macro name too long");      read_token(fp);      def_dens_macro(name, fp, hmm);      break;    case 'h':			/* HMM define */      name = mybstrdup2(rdhmmdef_token, &(hmm->mroot));      if (strlen(name) >= MAX_HMMNAME_LEN) rderr("Macro name too long");      read_token(fp);      def_HMM(name, fp, hmm);      break;    case 'v':			/* Variance macro */      name = mybstrdup2(rdhmmdef_token, &(hmm->mroot));      if (strlen(name) >= MAX_HMMNAME_LEN) rderr("Macro name too long");      read_token(fp);      def_var_macro(name, fp, hmm);      break;    case 'r':			/* Regression class macro (ignore) */      name = mybstrdup2(rdhmmdef_token, &(hmm->mroot));      if (strlen(name) >= MAX_HMMNAME_LEN) rderr("Macro name too long");      read_token(fp);      def_regtree_macro(name, fp, hmm);      break;    }  }  j_printerr("(ascii)...");    /* check limitation */  if (check_all_hmm_limit(hmm)) {    j_printerr("limit check passed\n");  } else {    j_error("Error: cannot use this HMM for system limitation.\n");  }  /* convert transition prob to log scale */  conv_log_arc(hmm);  /* inverse all variance values for faster computation */  if (! hmm->variance_inversed) {    htk_hmm_inverse_variances(hmm);    hmm->variance_inversed = TRUE;  }    /* check HMM parameter option type */  if (!check_hmm_options(hmm)) {    j_error("hmm options check failed\n");  }  /* add ID number for all HTK_HMM_State */  /* also calculate the maximum number of mixture */  {    HTK_HMM_State *stmp;    int n, max;    n = 0;    max = 0;    for (stmp = hmm->ststart; stmp; stmp = stmp->next) {      if (max < stmp->mix_num) max = stmp->mix_num;      stmp->id = n++;      if (n >= MAX_STATE_NUM) {	j_error("Error: too much states > %d\n", MAX_STATE_NUM);      }    }    hmm->totalstatenum = n;    hmm->maxmixturenum = max;  }  /* compute total number of HMM models and maximum length */  {    HTK_HMM_Data *dtmp;    int n, maxlen;    n = 0;    maxlen = 0;    for (dtmp = hmm->start; dtmp; dtmp = dtmp->next) {      if (maxlen < dtmp->state_num) maxlen = dtmp->state_num;      n++;    }    hmm->maxstatenum = maxlen;    hmm->totalhmmnum = n;  }  /* compute total number of mixtures */  {    HTK_HMM_Dens *dtmp;    int n = 0;    for (dtmp = hmm->dnstart; dtmp; dtmp = dtmp->next) {      n++;    }    hmm->totalmixnum = n;  }  /* check of HMM name length exceed the maximum */  {    HTK_HMM_Dens *dtmp;    int n = 0;    for (dtmp = hmm->dnstart; dtmp; dtmp = dtmp->next) {      n++;    }    hmm->totalmixnum = n;  }  return(TRUE);			/* success */}

⌨️ 快捷键说明

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