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

📄 write_binhmm.c

📁 julius version 4.12.about sound recognition.
💻 C
📖 第 1 页 / 共 2 页
字号:
/** * @file   write_binhmm.c *  * <JA> * @brief  %HMM 年盗をバイナリ妨及のファイルへ今き叫す * * Julius は迫极のバイナリ妨及の %HMM 年盗ファイルをサポ〖トしていますˉ * HTKのアスキ〖妨及の %HMM 年盗ファイルからバイナリ妨及への恃垂は· * 身掳のツ〖ル mkbinhmm で乖ないますˉこのバイナリ妨及は·HTK の * バイナリ妨及とは润高垂ですので庙罢して布さいˉ * </JA> *  * <EN> * @brief  Write a binary %HMM definition to a file * * Julius supports a binary format of %HMM definition file. * The tool "mkbinhmm" can convert the ascii format HTK %HMM definition * file to this format.  Please note that this binary format is  * not compatible with the HTK binary format. * </EN> *  * @author Akinobu LEE * @date   Wed Feb 16 06:03:36 2005 * * $Revision: 1.4 $ *  *//* * Copyright (c) 2003-2005 Shikano Lab., Nara Institute of Science and Technology * Copyright (c) 2005-2007 Julius project team, Nagoya Institute of Technology * All rights reserved *//* $Id: write_binhmm.c,v 1.4 2008/07/07 05:50:11 sumomo Exp $ */#include <sent/stddefs.h>#include <sent/htk_param.h>#include <sent/htk_hmm.h>#include <sent/mfcc.h>#define wrt(A,B,C,D) if (wrtfunc(A,B,C,D) == FALSE) return FALSE#define wrt_str(A,B) if (wrt_strfunc(A,B) == FALSE) return FALSE/**  * Binary write function with byte swap (assume file is BIG ENDIAN) *  * @param fp [in] file pointer * @param buf [in] data to write * @param unitbyte [in] size of a unit in bytes * @param unitnum [in] number of unit to write */static booleanwrtfunc(FILE *fp, void *buf, size_t unitbyte, size_t unitnum){  if (unitnum == 0) return TRUE;#ifndef WORDS_BIGENDIAN  if (unitbyte != 1) {    swap_bytes((char *)buf, unitbyte, unitnum);  }#endif  if (myfwrite(buf, unitbyte, unitnum, fp) < unitnum) {    jlog("Error: write_binhmm: failed to write %d bytes", unitbyte * unitnum);    return FALSE;  }#ifndef WORDS_BIGENDIAN  if (unitbyte != 1) {    swap_bytes((char *)buf, unitbyte, unitnum);  }#endif  return TRUE;}/**  * Write a string, teminating at NULL. *  * @param fp [in] file pointer * @param str [in] string to write */static booleanwrt_strfunc(FILE *fp, char *str){  static char noname = '\0';  boolean ret;    if (str) {    ret = wrtfunc(fp, str, sizeof(char), strlen(str)+1);  } else {    ret = wrtfunc(fp, &noname, sizeof(char), 1);  }  return ret;}static char *binhmm_header_v2 = BINHMM_HEADER_V2; ///< Header string for V2/**  * Write header string as binary HMM file (ver. 2) *  * @param fp [in] file pointer * @param emp [in] TRUE if parameter embedded * @param inv [in] TRUE if variances are inversed * @param mpdfmacro [in] TRUE if some mixture pdfs are defined as macro */static booleanwt_header(FILE *fp, boolean emp, boolean inv, boolean mpdfmacro){  char buf[50];  char *p;  wrt_str(fp, binhmm_header_v2);  p = &(buf[0]);  if (emp) {    *p++ = '_';    *p++ = BINHMM_HEADER_V2_EMBEDPARA;  }  if (inv) {    *p++ = '_';    *p++ = BINHMM_HEADER_V2_VARINV;  }  if (mpdfmacro) {    *p++ = '_';    *p++ = BINHMM_HEADER_V2_MPDFMACRO;  }  *p = '\0';  wrt_str(fp, buf);  jlog("Stat: write_binhmm: written header: \"%s%s\"\n", binhmm_header_v2, buf);  return TRUE;}/**  * Write acoustic analysis configration parameters into header of binary HMM. *  * @param fp [in] file pointer * @param para [in] acoustic analysis configration parameters */static booleanwt_para(FILE *fp, Value *para){  short version;  version = VALUE_VERSION;  wrt(fp, &version, sizeof(short), 1);  wrt(fp, &(para->smp_period), sizeof(long), 1);        wrt(fp, &(para->smp_freq), sizeof(long), 1);	  wrt(fp, &(para->framesize), sizeof(int), 1);          wrt(fp, &(para->frameshift), sizeof(int), 1);         wrt(fp, &(para->preEmph), sizeof(float), 1);          wrt(fp, &(para->lifter), sizeof(int), 1);             wrt(fp, &(para->fbank_num), sizeof(int), 1);          wrt(fp, &(para->delWin), sizeof(int), 1);             wrt(fp, &(para->accWin), sizeof(int), 1);             wrt(fp, &(para->silFloor), sizeof(float), 1);         wrt(fp, &(para->escale), sizeof(float), 1);           wrt(fp, &(para->hipass), sizeof(int), 1);		  wrt(fp, &(para->lopass), sizeof(int), 1);		  wrt(fp, &(para->enormal), sizeof(int), 1);            wrt(fp, &(para->raw_e), sizeof(int), 1);              wrt(fp, &(para->zmeanframe), sizeof(int), 1);	  wrt(fp, &(para->usepower), sizeof(int), 1);  return TRUE;}/**  * Write %HMM option specifications *  * @param fp [in] file pointer * @param opt [out] pointer to the %HMM option structure that holds the values. */static booleanwt_opt(FILE *fp, HTK_HMM_Options *opt){  wrt(fp, &(opt->stream_info.num), sizeof(short), 1);  wrt(fp, opt->stream_info.vsize, sizeof(short), MAXSTREAMNUM);  wrt(fp, &(opt->vec_size), sizeof(short), 1);  wrt(fp, &(opt->cov_type), sizeof(short), 1);  wrt(fp, &(opt->dur_type), sizeof(short), 1);  wrt(fp, &(opt->param_type), sizeof(short), 1);  return TRUE;}/**  * Write %HMM type of mixture tying. *  * @param fp [in] file pointer * @param hmm [out] pointer to the writing %HMM definition data */static booleanwt_type(FILE *fp, HTK_HMM_INFO *hmm){  wrt(fp, &(hmm->is_tied_mixture), sizeof(boolean), 1);  wrt(fp, &(hmm->maxmixturenum), sizeof(int), 1);  return TRUE;}/* write transition data */static HTK_HMM_Trans **tr_index; ///< Sorted data pointers for mapping from pointer to idstatic unsigned int tr_num;	///< Length of above/**  * qsort callback function to sort transition pointers by their * address for indexing. *  * @param t1 [in] data 1 * @param t2 [in] data 2 *  * @return value required for qsort. */static intqsort_tr_index(HTK_HMM_Trans **t1, HTK_HMM_Trans **t2){  if (*t1 > *t2) return 1;  else if (*t1 < *t2) return -1;  else return 0;}/**  * @brief  Write all transition matrix data. * * The pointers of all transition matrixes are first gathered, * sorted by the address.  Then the transition matrix data are written * by the sorted order.  The index will be used later to convert any pointer * reference to a transition matrix into scholar id. *  * @param fp [in] file pointer * @param hmm [in] writing %HMM definition data  */static booleanwt_trans(FILE *fp, HTK_HMM_INFO *hmm){  HTK_HMM_Trans *t;  unsigned int idx;  int i;  tr_num = 0;  for(t = hmm->trstart; t; t = t->next) tr_num++;  tr_index = (HTK_HMM_Trans **)mymalloc(sizeof(HTK_HMM_Trans *) * tr_num);  idx = 0;  for(t = hmm->trstart; t; t = t->next) tr_index[idx++] = t;  qsort(tr_index, tr_num, sizeof(HTK_HMM_Trans *), (int (*)(const void *, const void *))qsort_tr_index);    wrt(fp, &tr_num, sizeof(unsigned int), 1);  for (idx = 0; idx < tr_num; idx++) {    t = tr_index[idx];    wrt_str(fp, t->name);    wrt(fp, &(t->statenum), sizeof(short), 1);    for(i=0;i<t->statenum;i++) {      wrt(fp, t->a[i], sizeof(PROB), t->statenum);    }  }  jlog("Stat: write_binhmm: %d transition maxtix written\n", tr_num);  return TRUE;}/**  * Binary search function to convert transition matrix pointer to a scholar ID. *  * @param t [in] pointer to a transition matrix *  * @return the corresponding scholar ID. */static unsigned intsearch_trid(HTK_HMM_Trans *t){  unsigned int left = 0;  unsigned int right = tr_num - 1;  unsigned int mid;  while (left < right) {    mid = (left + right) / 2;    if (tr_index[mid] < t) {      left = mid + 1;    } else {      right = mid;    }  }  return(left);}/* write variance data */static HTK_HMM_Var **vr_index;	///< Sorted data pointers for mapping from pointer to idstatic unsigned int vr_num;	///< Length of above/**  * qsort callback function to sort variance pointers by their * address for indexing. *  * @param v1 [in] data 1 * @param v2 [in] data 2 *  * @return value required for qsort. */static intqsort_vr_index(HTK_HMM_Var **v1, HTK_HMM_Var **v2){  if (*v1 > *v2) return 1;  else if (*v1 < *v2) return -1;  else return 0;}/**  * @brief  Write all variance data. * * The pointers of all variance vectors are first gathered, * sorted by the address.  Then the variance vectors are written * by the sorted order.  The index will be used later to convert any pointer * reference to a variance vector into scholar id. *  * @param fp [in] file pointer * @param hmm [in] writing %HMM definition data  */static booleanwt_var(FILE *fp, HTK_HMM_INFO *hmm){  HTK_HMM_Var *v;  unsigned int idx;  vr_num = 0;  for(v = hmm->vrstart; v; v = v->next) vr_num++;  vr_index = (HTK_HMM_Var **)mymalloc(sizeof(HTK_HMM_Var *) * vr_num);  idx = 0;  for(v = hmm->vrstart; v; v = v->next) vr_index[idx++] = v;  qsort(vr_index, vr_num, sizeof(HTK_HMM_Var *), (int (*)(const void *, const void *))qsort_vr_index);    wrt(fp, &vr_num, sizeof(unsigned int), 1);  for (idx = 0; idx < vr_num; idx++) {    v = vr_index[idx];    wrt_str(fp, v->name);    wrt(fp, &(v->len), sizeof(short), 1);    wrt(fp, v->vec, sizeof(VECT), v->len);  }  jlog("Stat: write_binhmm: %d variance written\n", vr_num);  return TRUE;}/**  * Binary search function to convert variance pointer to a scholar ID. *  * @param v [in] pointer to a variance data *  * @return the corresponding scholar ID. */static unsigned intsearch_vid(HTK_HMM_Var *v){  unsigned int left = 0;  unsigned int right = vr_num - 1;  unsigned int mid;  while (left < right) {    mid = (left + right) / 2;    if (vr_index[mid] < v) {      left = mid + 1;    } else {      right = mid;    }  }  return(left);}/* write density data */static HTK_HMM_Dens **dens_index; ///< Sorted data pointers for mapping from pointer to idstatic unsigned int dens_num;	///< Length of above/**  * qsort callback function to sort density pointers by their * address for indexing. *  * @param d1 [in] data 1 * @param d2 [in] data 2 *  * @return value required for qsort. */static intqsort_dens_index(HTK_HMM_Dens **d1, HTK_HMM_Dens **d2){  if (*d1 > *d2) return 1;  else if (*d1 < *d2) return -1;  else return 0;}/**  * @brief  Write all mixture density data. * * The pointers of all mixture densities are first gathered, * sorted by the address.  Then the densities are written * by the sorted order.  The pointers to the lower structure (variance etc.) * in the data are written in a corresponding scholar id. * The pointer index of this data will be used later to convert any pointer * reference to a density data into scholar id. *  * @param fp [in] file pointer * @param hmm [in] writing %HMM definition data  */static booleanwt_dens(FILE *fp, HTK_HMM_INFO *hmm){  HTK_HMM_Dens *d;  unsigned int idx;  unsigned int vid;  dens_num = hmm->totalmixnum;  dens_index = (HTK_HMM_Dens **)mymalloc(sizeof(HTK_HMM_Dens *) * dens_num);  idx = 0;  for(d = hmm->dnstart; d; d = d->next) dens_index[idx++] = d;  qsort(dens_index, dens_num, sizeof(HTK_HMM_Dens *), (int (*)(const void *, const void *))qsort_dens_index);    wrt(fp, &dens_num, sizeof(unsigned int), 1);  for (idx = 0; idx < dens_num; idx++) {    d = dens_index[idx];    wrt_str(fp, d->name);    wrt(fp, &(d->meanlen), sizeof(short), 1);    wrt(fp, d->mean, sizeof(VECT), d->meanlen);    vid = search_vid(d->var);    /* for debug */    if (d->var != vr_index[vid]) {      jlog("Error: write_binhmm: index not match!!!\n");      return FALSE;    }    wrt(fp, &vid, sizeof(unsigned int), 1);    wrt(fp, &(d->gconst), sizeof(LOGPROB), 1);  }  jlog("Stat: write_binhmm: %d gaussian densities written\n", dens_num);  return TRUE;}/**  * Binary search function to convert density pointer to a scholar ID. *  * @param d [in] pointer to a mixture density *  * @return the corresponding scholar ID. */static unsigned intsearch_did(HTK_HMM_Dens *d){  unsigned int left = 0;  unsigned int right = dens_num - 1;  unsigned int mid;  while (left < right) {    mid = (left + right) / 2;    if (dens_index[mid] < d) {      left = mid + 1;    } else {      right = mid;    }  }  return(left);}/* write stream weight data */static HTK_HMM_StreamWeight **streamweight_index; ///< Sorted data pointers for mapping from pointer to idstatic unsigned int streamweight_num;	///< Length of above/**  * qsort callback function to sort stream weight pointers by their * address for indexing. *  * @param d1 [in] data 1 * @param d2 [in] data 2 *  * @return value required for qsort. */static intqsort_streamweight_index(HTK_HMM_StreamWeight **d1, HTK_HMM_StreamWeight **d2){  if (*d1 > *d2) return 1;  else if (*d1 < *d2) return -1;  else return 0;}/**  * @brief  Write all stream weight data. * * The pointers of all stream weights are first gathered, * sorted by the address.  Then the stream weights are written * by the sorted order.  The pointers to the lower structure (variance etc.) * in the data are written in a corresponding scholar id. * The pointer index of this data will be used later to convert any pointer * reference to a data into scholar id. *  * @param fp [in] file pointer * @param hmm [in] writing %HMM definition data  */static booleanwt_streamweight(FILE *fp, HTK_HMM_INFO *hmm){  HTK_HMM_StreamWeight *sw;  unsigned int idx;  streamweight_num = 0;  for(sw=hmm->swstart;sw;sw=sw->next) streamweight_num++;  streamweight_index = (HTK_HMM_StreamWeight **)mymalloc(sizeof(HTK_HMM_StreamWeight *) * streamweight_num);  idx = 0;  for(sw = hmm->swstart; sw; sw = sw->next) streamweight_index[idx++] = sw;  qsort(streamweight_index, streamweight_num, sizeof(HTK_HMM_StreamWeight *), (int (*)(const void *, const void *))qsort_streamweight_index);    wrt(fp, &streamweight_num, sizeof(unsigned int), 1);  for (idx = 0; idx < streamweight_num; idx++) {    sw = streamweight_index[idx];    wrt_str(fp, sw->name);    wrt(fp, &(sw->len), sizeof(short), 1);    wrt(fp, sw->weight, sizeof(VECT), sw->len);  }  jlog("Stat: write_binhmm: %d stream weights written\n", streamweight_num);  return TRUE;}/**  * Binary search function to convert stream weight pointer to a scholar ID. *  * @param d [in] pointer to a mixture density *  * @return the corresponding scholar ID. */static unsigned intsearch_swid(HTK_HMM_StreamWeight *sw){  unsigned int left = 0;  unsigned int right = streamweight_num - 1;  unsigned int mid;  while (left < right) {    mid = (left + right) / 2;    if (streamweight_index[mid] < sw) {      left = mid + 1;    } else {      right = mid;    }  }  return(left);}

⌨️ 快捷键说明

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