/** * @file rdhmmdef_options.c * * * @brief HTK %HMM 定義ファイルの読み込み:グローバルオプション * * * * @brief Read HTK %HMM definition file: global options * * * @author Akinobu LEE * @date Wed Feb 16 01:53:45 2005 * * $Revision: 1.5 $ * */ /* * Copyright (c) 1991-2012 Kawahara Lab., Kyoto University * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology * Copyright (c) 2005-2012 Julius project team, Nagoya Institute of Technology * All rights reserved */ #include #include #include /// Strings to make mapping between %HMM covariance option strings and code definitions. static OptionStr optcov[] = { /* covariance matrix type */ {"DIAGC", C_DIAG_C, "Diag", TRUE}, {"INVDIAGC", C_INV_DIAG, "InvDiag", FALSE}, {"FULLC", C_FULL, "Full", FALSE}, {"LLTC", C_LLT, "LLT", FALSE}, /* not used in HTK V2.0 */ {"XFORMC", C_XFORM, "Xform", FALSE}, /* not used in HTK V2.0 */ {NULL,0,NULL,FALSE} }; /// Strings to make mapping between %HMM duration option strings and code definitions. static OptionStr optdur[] = { /* duration types */ {"NULLD", D_NULL, "Null", TRUE}, {"POISSOND", D_POISSON, "Poisson", FALSE}, {"GAMMAD", D_GAMMA, "Gamma", FALSE}, {"GEND", D_GEN, "Gen", FALSE}, {NULL,0,NULL,FALSE} }; extern char *rdhmmdef_token; ///< Current token /** * Read in global options. * * @param fp [in] file pointer * @param op [out] pointer to store the global options */ static void read_global_opt(FILE *fp, HTK_HMM_Options *op) { int i; short tmptype; int num; for (;;) { if (rdhmmdef_token == NULL) break; if (currentis("HMMSETID")) { /* */ read_token(fp); NoTokErr("missing HMMSETID argument"); } else if (currentis("STREAMINFO")) { /* */ read_token(fp); NoTokErr("missing STREAMINFO num"); op->stream_info.num = atoi(rdhmmdef_token); /*DM("%d STREAMs:", op->stream_info.num);*/ if (op->stream_info.num > MAXSTREAMNUM) { jlog("Error: rdhmmdef_options: stream num exceeded %d\n", MAXSTREAMNUM); rderr(NULL); } for (i=0;istream_info.num;i++) { read_token(fp); NoTokErr("missing STREAMINFO vector size"); op->stream_info.vsize[i] = atoi(rdhmmdef_token); /*DM(" %d",op->stream_info.vsize[i]);*/ } /*DM("\n");*/ } else if (currentis("VECSIZE")) { /* */ read_token(fp); NoTokErr("missing VECSIZE value"); op->vec_size = atoi(rdhmmdef_token); /*DM("vector size: %d\n", op->vec_size);*/ } else if (currentis("MSDINFO")) { /* by HTS */ /* Julius can auto-detect MSD-HMM, so just skip this */ read_token(fp); NoTokErr("missing MSDINFO num"); num = atoi(rdhmmdef_token); for (i=0;icov_type = optcov[i].type; /*DM("covariance matrix type: %s\n", optcov[i].desc);*/ goto optloop; } } /* duration type */ for (i=0;optdur[i].name!=NULL;i++) { if (currentis(optdur[i].name)) { op->dur_type = optdur[i].type; /*DM("duration type: %s\n", optdur[i].desc);*/ goto optloop; } } /* parameter type */ tmptype = param_str2code(rdhmmdef_token); if (tmptype != F_ERR_INVALID) { /* conv success */ op->param_type = tmptype; /*DM("param type: %s", param_code2str(buf, op->param_type, FALSE));*/ goto optloop; } else { /* nothing of above --- not option */ if(rdhmmdef_token[0] != '~') { jlog("Error: rdhmmdef_options: unknown option in header: %s\n", rdhmmdef_token); rderr("unknown option in header"); } return; } } optloop: read_token(fp); } } /** * Set global options starting at the current token to %HMM definition data. * * @param fp [in] file pointer * @param hmm [out] %HMM definition data to store the global options * * @return TRUE on success, FALSE on failure or error. */ boolean set_global_opt(FILE *fp, HTK_HMM_INFO *hmm) { int i,n; read_global_opt(fp,&(hmm->opt)); if (hmm->opt.stream_info.num == 0) { /* no STREAMINFO */ hmm->opt.stream_info.num = 1; hmm->opt.stream_info.vsize[0] = hmm->opt.vec_size; } else { /* vector length check */ n = 0; for(i=0;iopt.stream_info.num;i++) { n += hmm->opt.stream_info.vsize[i]; } if (n != hmm->opt.vec_size) { jlog("Error: rdhmmdef_options: total length in and does not match! (%d, %d)\n", n, hmm->opt.vec_size); return FALSE; } } return TRUE; } /** * Get option name string from its type code. * * @param confdata [in] option description data * @param type [in] type code to search * * @return name string if found, or NULL if not found. */ static char * get_opttype_str(OptionStr *confdata, short type) { int i; for (i = 0; confdata[i].name != NULL; i++) { if (confdata[i].type == type) { return(confdata[i].name); } } rderr("unknown typecode in header!"); return(NULL); } /** * Get covariance option name string from its type code. * * @param covtype [in] type code to search * * @return the name string if found, or NULL if not found. */ char * get_cov_str(short covtype) { return(get_opttype_str(optcov, covtype)); } /** * Get duration option name string from its type code. * * @param durtype [in] type code to search * * @return the name string if found, or NULL if not found. */ char * get_dur_str(short durtype) { return(get_opttype_str(optdur, durtype)); }