/** * @file m_options.c * * * @brief オプション処理 * * ここにある関数は,jconfファイルおよびコマンドラインからのオプション指定を * 順に読み込み,値を格納する. * * * * @brief Option parsing. * * These functions read option strings from jconf file or command line * and set values to the configuration structure. * * * @author Akinobu Lee * @date Thu May 12 18:52:07 2005 * * $Revision: 1.27 $ * */ /* * 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 /** * * @brief 相対パスをフルパスに変換する. * * ファイルのパス名が相対パスであれば,カレントディレクトリをつけた * フルパスに変換して返す. 絶対パスであれば,そのまま返す. * * @param filename [in] ファイルのパス名 * @param dirname [in] カレントディレクトリのパス名 * * @return 絶対パス名の入った,新たに割り付けられたバッファ * * * @brief Change relative path to full path. * * If the file path is given as relative, prepend the dirname to it. * If the file path is full, just copy it to new buffer and return. * * @param filename [in] file path name * @param dirname [in] full path of current directory * * @return newly malloced buffer holding the full path name. * */ char * filepath(char *filename, char *dirname) { char *p; if (dirname != NULL && filename[0] != '/' #if defined(_WIN32) && filename[0] != '\\' && !(strlen(filename) >= 3 && filename[1] == ':') #endif ) { p = (char *)mymalloc(strlen(filename) + strlen(dirname) + 1); strcpy(p, dirname); strcat(p, filename); } else { p = strcpy((char *)mymalloc(strlen(filename)+1), filename); } return p; } /** * * Returns next argument string. * * * 次の引数の文字列を返す. * * * @param cur [i/o] pointer to current point of the argment array * @param argc [in] total number of argments * @param argv [in] argment array * * @return pointer to the next argument, or NULL if no more argument vailable. * */ static char * next_arg(int *cur, int argc, char *argv[]) { (*cur)++; if (*cur >= argc) { jlog("ERROR: m_options: option requires argument -- %s\n", argv[*cur-1]); return NULL; } return(argv[*cur]); } static boolean check_section(Jconf *jconf, char *optname, short sec) { if (! jconf->optsectioning) return TRUE; if (jconf->optsection == sec) return TRUE; if (jconf->optsection == JCONF_OPT_DEFAULT) return TRUE; switch(sec) { case JCONF_OPT_GLOBAL: jlog("ERROR: \"%s\" is global option (should be before any instance declaration)", optname); break; case JCONF_OPT_AM: jlog("ERROR: \"%s\" is AM option", optname); break; case JCONF_OPT_LM: jlog("ERROR: \"%s\" is LM option", optname); break; case JCONF_OPT_SR: jlog("ERROR: \"%s\" is SR (search) option", optname); break; } switch(jconf->optsection) { case JCONF_OPT_GLOBAL: jlog(", but exists at global section (-GLOBAL)\n"); break; case JCONF_OPT_AM: jlog(", but exists at AM section (-AM \"%s\")\n", jconf->amnow->name); break; case JCONF_OPT_LM: jlog(", but exists at LM section (-LM \"%s\")\n", jconf->lmnow->name); break; case JCONF_OPT_SR: jlog(", but exists at recognizer section (-SR \"%s\")\n", jconf->searchnow->name); break; } jlog("ERROR: fix it, or you can disable this check by \"-nosectioncheck\"\n"); return FALSE; } /** * * メモリ領域を解放し NULL で埋める. * @param p [i/o] メモリ領域の先頭を指すポインタ変数へのポインタ * @note @a p が NULL の場合は何も起こらない。 * * * Free memory and fill it with NULL. * @param p [i/o] pointer to pointer that holds allocated address * @note Nothing will happen if @a p equals to NULL. * */ #define FREE_MEMORY(p) \ {if (p) {free(p); p = NULL;}} /** * * オプション解析. * * @param argc [in] @a argv に含まれる引数の数 * @param argv [in] 引数値(文字列)の配列 * @param cwd [in] カレントディレクトリ * @param jconf [out] 値を格納するjconf構造体 * * * * Option parsing. * * @param argc [in] number of elements in @a argv * @param argv [in] array of argument strings * @param cwd [in] current directory * @param jconf [out] jconf structure to store data * * * @return TRUE on success, or FALSE on error. * * @callgraph * @callergraph */ boolean opt_parse(int argc, char *argv[], char *cwd, Jconf *jconf) { char *tmparg; int i; boolean unknown_opt; JCONF_AM *amconf, *atmp; JCONF_LM *lmconf, *ltmp; JCONF_SEARCH *sconf; char sname[JCONF_MODULENAME_MAXLEN]; #ifdef ENABLE_PLUGIN int sid; FUNC_INT func; #endif #define GET_TMPARG if ((tmparg = next_arg(&i, argc, argv)) == NULL) return FALSE for (i=1;i= '0' && tmparg[0] <= '9') { jlog("ERROR: m_options: AM name \"%s\" not acceptable: first character should not be a digit\n", tmparg); return FALSE; } /* if not first time, create new module instance and switch to it */ /* and switch current to this */ amconf = j_jconf_am_new(); if (j_jconf_am_regist(jconf, amconf, tmparg) == FALSE) { jlog("ERROR: failed to add new amconf as \"%s\"\n", tmparg); jlog("ERROR: m_options: failed to create amconf\n"); j_jconf_am_free(amconf); return FALSE; } jconf->amnow = amconf; jconf->optsection = JCONF_OPT_AM; continue; } else if (strmatch(argv[i],"-AM_GMM") || strmatch(argv[i], "[AM_GMM]")) { /* switch current to GMM */ if (jconf->gmm == NULL) { /* if new, allocate jconf for GMM */ jconf->gmm = j_jconf_am_new(); } jconf->amnow = jconf->gmm; jconf->optsection = JCONF_OPT_AM; continue; } else if (strmatch(argv[i],"-LM") || strmatch(argv[i], "[LM]")) { GET_TMPARG; if (tmparg[0] == '-') { jlog("ERROR: m_options: -LM needs an argument as module name\n"); return FALSE; } if (tmparg[0] >= '0' && tmparg[0] <= '9') { jlog("ERROR: m_options: LM name \"%s\" not acceptable: first character should not be a digit\n", tmparg); return FALSE; } /* create new module instance and switch to it */ /* and switch current to this */ lmconf = j_jconf_lm_new(); if (j_jconf_lm_regist(jconf, lmconf, tmparg) == FALSE) { jlog("ERROR: failed to add new lmconf as \"%s\"\n", tmparg); jlog("ERROR: m_options: failed to create lmconf\n"); j_jconf_lm_free(lmconf); return FALSE; } jconf->lmnow = lmconf; jconf->optsection = JCONF_OPT_LM; continue; } else if (strmatch(argv[i],"-SR") || strmatch(argv[i], "[SR]")) { GET_TMPARG; if (tmparg[0] == '-') { jlog("ERROR: m_options: -SR needs three arguments: module name, AM name and LM name\n"); return FALSE; } if (tmparg[0] >= '0' && tmparg[0] <= '9') { jlog("ERROR: m_options: SR name \"%s\" not acceptable: first character should not be a digit\n", tmparg); return FALSE; } /* store name temporarly */ strncpy(sname, tmparg, JCONF_MODULENAME_MAXLEN); /* get link to jconf_am and jconf_lm */ GET_TMPARG; if (tmparg[0] == '-') { jlog("ERROR: m_options: -SR needs three arguments: module name, AM name and LM name\n"); return FALSE; } if (tmparg[0] >= '0' && tmparg[0] <= '9') { /* arg is number */ if ((amconf = j_get_amconf_by_id(jconf, atoi(tmparg))) == NULL) return FALSE; } else { /* name string */ if ((amconf = j_get_amconf_by_name(jconf, tmparg)) == NULL) return FALSE; } GET_TMPARG; if (tmparg[0] == '-') { jlog("ERROR: m_options: -SR needs three arguments: module name, AM name and LM name\n"); return FALSE; } if (tmparg[0] >= '0' && tmparg[0] <= '9') { /* arg is number */ if ((lmconf = j_get_lmconf_by_id(jconf, atoi(tmparg))) == NULL) return FALSE; } else { /* name string */ if ((lmconf = j_get_lmconf_by_name(jconf, tmparg)) == NULL) return FALSE; } /* check to avoid assigning an LM for multiple SR */ for(sconf=jconf->search_root;sconf;sconf=sconf->next) { if (sconf->lmconf == lmconf) { jlog("ERROR: you are going to share LM \"%s\" among multiple SRs\n"); jlog("ERROR: current Julius cannot share LM among SRs\n"); jlog("ERROR: you should define LM for each SR\n"); return FALSE; } } /* if not first time, create new module instance and switch to it */ sconf = j_jconf_search_new(); sconf->amconf = amconf; sconf->lmconf = lmconf; if (j_jconf_search_regist(jconf, sconf, sname) == FALSE) { jlog("ERROR: failed to add new amconf as \"%s\"\n", sname); jlog("ERROR: m_options: failed to create search conf\n"); j_jconf_search_free(sconf); return FALSE; } jconf->searchnow = sconf; jconf->optsection = JCONF_OPT_SR; continue; } else if (strmatch(argv[i],"-GLOBAL")) { jconf->optsection = JCONF_OPT_GLOBAL; continue; } else if (strmatch(argv[i],"-sectioncheck")) { /* enable section check */ jconf->optsectioning = TRUE; continue; } else if (strmatch(argv[i],"-nosectioncheck")) { /* disable section check */ jconf->optsectioning = FALSE; continue; } else if (strmatch(argv[i],"-input")) { /* speech input */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; jconf->input.plugin_source = -1; if (strmatch(tmparg,"file") || strmatch(tmparg,"rawfile")) { jconf->input.type = INPUT_WAVEFORM; jconf->input.speech_input = SP_RAWFILE; jconf->decodeopt.realtime_flag = FALSE; } else if (strmatch(tmparg,"htkparam") || strmatch(tmparg,"mfcfile") || strmatch(tmparg,"mfc")) { jconf->input.type = INPUT_VECTOR; jconf->input.speech_input = SP_MFCFILE; jconf->decodeopt.realtime_flag = FALSE; } else if (strmatch(tmparg,"stdin")) { jconf->input.type = INPUT_WAVEFORM; jconf->input.speech_input = SP_STDIN; jconf->decodeopt.realtime_flag = FALSE; } else if (strmatch(tmparg,"adinnet")) { jconf->input.type = INPUT_WAVEFORM; jconf->input.speech_input = SP_ADINNET; jconf->decodeopt.realtime_flag = TRUE; #ifdef USE_NETAUDIO } else if (strmatch(tmparg,"netaudio")) { jconf->input.type = INPUT_WAVEFORM; jconf->input.speech_input = SP_NETAUDIO; jconf->decodeopt.realtime_flag = TRUE; #endif #ifdef USE_MIC } else if (strmatch(tmparg,"mic")) { jconf->input.type = INPUT_WAVEFORM; jconf->input.speech_input = SP_MIC; jconf->input.device = SP_INPUT_DEFAULT; jconf->decodeopt.realtime_flag = TRUE; } else if (strmatch(tmparg,"alsa")) { #ifdef HAS_ALSA jconf->input.type = INPUT_WAVEFORM; jconf->input.speech_input = SP_MIC; jconf->input.device = SP_INPUT_ALSA; jconf->decodeopt.realtime_flag = TRUE; #else jlog("ERROR: m_options: \"-input alsa\": ALSA support is not built-in\n"); return FALSE; #endif } else if (strmatch(tmparg,"oss")) { #ifdef HAS_OSS jconf->input.type = INPUT_WAVEFORM; jconf->input.speech_input = SP_MIC; jconf->input.device = SP_INPUT_OSS; jconf->decodeopt.realtime_flag = TRUE; #else jlog("ERROR: m_options: \"-input oss\": OSS support is not built-in\n"); return FALSE; #endif } else if (strmatch(tmparg,"esd")) { #ifdef HAS_ESD jconf->input.type = INPUT_WAVEFORM; jconf->input.speech_input = SP_MIC; jconf->input.device = SP_INPUT_ESD; jconf->decodeopt.realtime_flag = TRUE; #else jlog("ERROR: m_options: \"-input esd\": ESounD support is not built-in\n"); return FALSE; #endif } else if (strmatch(tmparg,"pulseaudio")) { #ifdef HAS_PULSEAUDIO jconf->input.type = INPUT_WAVEFORM; jconf->input.speech_input = SP_MIC; jconf->input.device = SP_INPUT_PULSEAUDIO; jconf->decodeopt.realtime_flag = TRUE; #else jlog("ERROR: m_options: \"-input pulseaudio\": PulseAudio support is not built-in\n"); return FALSE; #endif #endif #ifdef ENABLE_PLUGIN } else if ((sid = plugin_find_optname("adin_get_optname", tmparg)) != -1) { /* adin plugin */ jconf->input.plugin_source = sid; jconf->input.type = INPUT_WAVEFORM; jconf->input.speech_input = SP_MIC; func = (FUNC_INT) plugin_get_func(sid, "adin_get_configuration"); if (func == NULL) { jlog("ERROR: invalid plugin: adin_get_configuration() not exist\n"); jlog("ERROR: skip option \"-input %s\"\n", tmparg); continue; } jconf->decodeopt.realtime_flag = (*func)(0); } else if ((sid = plugin_find_optname("fvin_get_optname", tmparg)) != -1) { /* vector input plugin */ jconf->input.plugin_source = sid; jconf->input.type = INPUT_VECTOR; jconf->input.speech_input = SP_MFCMODULE; jconf->decodeopt.realtime_flag = FALSE; #endif } else { jlog("ERROR: m_options: unknown speech input source \"%s\"\n", tmparg); return FALSE; } continue; } else if (strmatch(argv[i],"-filelist")) { /* input file list */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; FREE_MEMORY(jconf->input.inputlist_filename); //jconf->input.inputlist_filename = strcpy((char*)mymalloc(strlen(tmparg)+1),tmparg); jconf->input.inputlist_filename = filepath(tmparg, cwd); continue; } else if (strmatch(argv[i],"-rejectshort")) { /* short input rejection */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; jconf->reject.rejectshortlen = atoi(tmparg); continue; #ifdef POWER_REJECT } else if (strmatch(argv[i],"-powerthres")) { /* short input rejection */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; jconf->reject.powerthres = atoi(tmparg); continue; #endif } else if (strmatch(argv[i],"-force_realtime")) { /* force realtime */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; if (strmatch(tmparg, "on")) { jconf->decodeopt.forced_realtime = TRUE; } else if (strmatch(tmparg, "off")) { jconf->decodeopt.forced_realtime = FALSE; } else { jlog("ERROR: m_options: \"-force_realtime\" should be either \"on\" or \"off\"\n"); return FALSE; } jconf->decodeopt.force_realtime_flag = TRUE; continue; } else if (strmatch(argv[i],"-realtime")) { /* equal to "-force_realtime on" */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; jconf->decodeopt.forced_realtime = TRUE; jconf->decodeopt.force_realtime_flag = TRUE; continue; } else if (strmatch(argv[i], "-norealtime")) { /* equal to "-force_realtime off" */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; jconf->decodeopt.forced_realtime = FALSE; jconf->decodeopt.force_realtime_flag = TRUE; continue; } else if (strmatch(argv[i],"-forcedict")) { /* skip dict error */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; jconf->lmnow->forcedict_flag = TRUE; continue; } else if (strmatch(argv[i],"-check")) { /* interactive model check mode */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; if (strmatch(tmparg, "wchmm")) { jconf->searchnow->sw.wchmm_check_flag = TRUE; } else if (strmatch(tmparg, "trellis")) { jconf->searchnow->sw.trellis_check_flag = TRUE; } else if (strmatch(tmparg, "triphone")) { jconf->searchnow->sw.triphone_check_flag = TRUE; } else { jlog("ERROR: m_options: invalid argument for \"-check\": %s\n", tmparg); return FALSE; } continue; } else if (strmatch(argv[i],"-notypecheck")) { /* don't check param type */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; jconf->input.paramtype_check_flag = FALSE; continue; } else if (strmatch(argv[i],"-nlimit")) { /* limit N token in a node */ #ifdef WPAIR_KEEP_NLIMIT if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->pass1.wpair_keep_nlimit = atoi(tmparg); #else jlog("WARNING: m_options: WPAIR_KEEP_NLIMIT disabled, \"-nlimit\" ignored\n"); #endif continue; } else if (strmatch(argv[i],"-lookuprange")) { /* trellis neighbor range */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->pass2.lookup_range = atoi(tmparg); continue; } else if (strmatch(argv[i],"-graphout")) { /* enable graph output */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->graph.enabled = TRUE; jconf->searchnow->graph.lattice = TRUE; jconf->searchnow->graph.confnet = FALSE; continue; } else if (strmatch(argv[i],"-lattice")) { /* enable graph output */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->graph.enabled = TRUE; jconf->searchnow->graph.lattice = TRUE; continue; } else if (strmatch(argv[i],"-nolattice")) { /* disable graph output */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->graph.enabled = FALSE; jconf->searchnow->graph.lattice = FALSE; continue; } else if (strmatch(argv[i],"-confnet")) { /* enable confusion network */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->graph.enabled = TRUE; jconf->searchnow->graph.confnet = TRUE; continue; } else if (strmatch(argv[i],"-noconfnet")) { /* disable graph output */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->graph.enabled = FALSE; jconf->searchnow->graph.confnet = FALSE; continue; } else if (strmatch(argv[i],"-graphrange")) { /* neighbor merge range frame */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->graph.graph_merge_neighbor_range = atoi(tmparg); continue; #ifdef GRAPHOUT_DEPTHCUT } else if (strmatch(argv[i],"-graphcut")) { /* cut graph word by depth */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->graph.graphout_cut_depth = atoi(tmparg); continue; #endif #ifdef GRAPHOUT_LIMIT_BOUNDARY_LOOP } else if (strmatch(argv[i],"-graphboundloop")) { /* neighbor merge range frame */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->graph.graphout_limit_boundary_loop_num = atoi(tmparg); continue; #endif #ifdef GRAPHOUT_SEARCH_DELAY_TERMINATION } else if (strmatch(argv[i],"-graphsearchdelay")) { /* not do graph search termination before the 1st sentence is found */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->graph.graphout_search_delay = TRUE; continue; } else if (strmatch(argv[i],"-nographsearchdelay")) { /* not do graph search termination before the 1st sentence is found */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->graph.graphout_search_delay = FALSE; continue; #endif } else if (strmatch(argv[i],"-looktrellis")) { /* activate loopuprange */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->pass2.looktrellis_flag = TRUE; continue; } else if (strmatch(argv[i],"-multigramout")) { /* enable per-grammar decoding on 2nd pass */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->output.multigramout_flag = TRUE; continue; } else if (strmatch(argv[i],"-nomultigramout")) { /* disable per-grammar decoding on 2nd pass */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->output.multigramout_flag = FALSE; continue; } else if (strmatch(argv[i],"-oldtree")) { /* use old tree function */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->pass1.old_tree_function_flag = TRUE; continue; } else if (strmatch(argv[i],"-sb")) { /* score envelope width in 2nd pass */ #ifdef SCAN_BEAM if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->pass2.scan_beam_thres = atof(tmparg); #else jlog("WARNING: m_options: SCAN_BEAM disabled, \"-sb\" ignored\n"); #endif continue; #ifdef SCORE_PRUNING } else if (strmatch(argv[i],"-bs")) { /* score beam width for 1st pass */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->pass1.score_pruning_width = atof(tmparg); continue; #endif } else if (strmatch(argv[i],"-discount")) { /* (bogus) */ jlog("WARNING: m_options: option \"-discount\" is now bogus, ignored\n"); continue; } else if (strmatch(argv[i],"-cutsilence")) { /* force (long) silence detection on */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; jconf->detect.silence_cut = 1; continue; } else if (strmatch(argv[i],"-nocutsilence")) { /* force (long) silence detection off */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; jconf->detect.silence_cut = 0; continue; } else if (strmatch(argv[i],"-pausesegment")) { /* force (long) silence detection on (for backward compatibility) */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; jconf->detect.silence_cut = 1; continue; } else if (strmatch(argv[i],"-nopausesegment")) { /* force (long) silence detection off (for backward comatibility) */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; jconf->detect.silence_cut = 0; continue; } else if (strmatch(argv[i],"-lv")) { /* silence detection threshold level */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; jconf->detect.level_thres = atoi(tmparg); continue; } else if (strmatch(argv[i],"-zc")) { /* silence detection zero cross num */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; jconf->detect.zero_cross_num = atoi(tmparg); continue; } else if (strmatch(argv[i],"-headmargin")) { /* head silence length */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; jconf->detect.head_margin_msec = atoi(tmparg); continue; } else if (strmatch(argv[i],"-tailmargin")) { /* tail silence length */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; jconf->detect.tail_margin_msec = atoi(tmparg); continue; } else if (strmatch(argv[i],"-chunksize")) { /* chunk size for detection */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; jconf->detect.chunk_size = atoi(tmparg); continue; } else if (strmatch(argv[i],"-hipass")||strmatch(argv[i],"-hifreq")) { /* frequency of upper band limit */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->analysis.para.hipass = atoi(tmparg); continue; } else if (strmatch(argv[i],"-lopass")||strmatch(argv[i],"-lofreq")) { /* frequency of lower band limit */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->analysis.para.lopass = atoi(tmparg); continue; } else if (strmatch(argv[i],"-smpPeriod")) { /* sample period (ns) */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->analysis.para.smp_period = atoi(tmparg); jconf->amnow->analysis.para.smp_freq = period2freq(jconf->amnow->analysis.para.smp_period); continue; } else if (strmatch(argv[i],"-smpFreq")) { /* sample frequency (Hz) */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->analysis.para.smp_freq = atoi(tmparg); jconf->amnow->analysis.para.smp_period = freq2period(jconf->amnow->analysis.para.smp_freq); continue; } else if (strmatch(argv[i],"-fsize")) { /* Window size */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->analysis.para.framesize = atoi(tmparg); continue; } else if (strmatch(argv[i],"-fshift")) { /* Frame shiht */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->analysis.para.frameshift = atoi(tmparg); continue; } else if (strmatch(argv[i],"-preemph")) { if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->analysis.para.preEmph = atof(tmparg); continue; } else if (strmatch(argv[i],"-fbank")) { if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->analysis.para.fbank_num = atoi(tmparg); continue; } else if (strmatch(argv[i],"-ceplif")) { if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->analysis.para.lifter = atoi(tmparg); continue; } else if (strmatch(argv[i],"-rawe")) { if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; jconf->amnow->analysis.para.raw_e = TRUE; continue; } else if (strmatch(argv[i],"-norawe")) { if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; jconf->amnow->analysis.para.raw_e = FALSE; continue; } else if (strmatch(argv[i],"-enormal")) { if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; jconf->amnow->analysis.para.enormal = TRUE; continue; } else if (strmatch(argv[i],"-noenormal")) { if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; jconf->amnow->analysis.para.enormal = FALSE; continue; } else if (strmatch(argv[i],"-escale")) { if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->analysis.para.escale = atof(tmparg); continue; } else if (strmatch(argv[i],"-silfloor")) { if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->analysis.para.silFloor = atof(tmparg); continue; } else if (strmatch(argv[i],"-delwin")) { /* Delta window length */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->analysis.para.delWin = atoi(tmparg); continue; } else if (strmatch(argv[i],"-accwin")) { /* Acceleration window length */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->analysis.para.accWin = atoi(tmparg); continue; } else if (strmatch(argv[i],"-ssalpha")) { /* alpha coef. for SS */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->frontend.ss_alpha = atof(tmparg); continue; } else if (strmatch(argv[i],"-ssfloor")) { /* spectral floor for SS */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->frontend.ss_floor = atof(tmparg); continue; } else if (strmatch(argv[i],"-cvn")) { if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; jconf->amnow->analysis.para.cvn = 1; continue; } else if (strmatch(argv[i],"-nocvn")) { if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; jconf->amnow->analysis.para.cvn = 0; continue; } else if (strmatch(argv[i],"-vtln")) { /* VTLN */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->analysis.para.vtln_alpha = (float)atof(tmparg); GET_TMPARG; jconf->amnow->analysis.para.vtln_lower = (float)atof(tmparg); GET_TMPARG; jconf->amnow->analysis.para.vtln_upper = (float)atof(tmparg); continue; } else if (strmatch(argv[i],"-novtln")) { /* disable VTLN */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; jconf->amnow->analysis.para.vtln_alpha = 1.0; continue; } else if (strmatch(argv[i],"-48")) { /* use 48kHz input and down to 16kHz */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; jconf->input.use_ds48to16 = TRUE; continue; } else if (strmatch(argv[i],"-version") || strmatch(argv[i], "--version") || strmatch(argv[i], "-setting") || strmatch(argv[i], "--setting")) { /* print version and exit */ j_put_header(stderr); j_put_compile_defs(stderr); fprintf(stderr, "\n"); j_put_library_defs(stderr); return FALSE; } else if (strmatch(argv[i],"-quiet")) { /* minimum output */ debug2_flag = verbose_flag = FALSE; continue; } else if (strmatch(argv[i],"-debug")) { /* debug mode: output huge log */ debug2_flag = verbose_flag = TRUE; continue; } else if (strmatch(argv[i],"-callbackdebug")) { /* output callback debug message */ callback_debug_flag = TRUE; continue; } else if (strmatch(argv[i],"-progout")) { /* enable progressive output */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->output.progout_flag = TRUE; continue; } else if (strmatch(argv[i],"-proginterval")) { /* interval for -progout */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->output.progout_interval = atoi(tmparg); continue; } else if (strmatch(argv[i],"-demo")) { /* quiet + progout */ debug2_flag = verbose_flag = FALSE; jconf->searchnow->output.progout_flag = TRUE; continue; } else if (strmatch(argv[i],"-walign")) { /* do forced alignment by word */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->annotate.align_result_word_flag = TRUE; continue; } else if (strmatch(argv[i],"-palign")) { /* do forced alignment by phoneme */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->annotate.align_result_phoneme_flag = TRUE; continue; } else if (strmatch(argv[i],"-salign")) { /* do forced alignment by state */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->annotate.align_result_state_flag = TRUE; continue; } else if (strmatch(argv[i],"-output")) { /* output up to N candidate */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->output.output_hypo_maxnum = atoi(tmparg); continue; } else if (strmatch(argv[i],"-1pass")) { /* do only 1st pass */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->compute_only_1pass = TRUE; continue; } else if (strmatch(argv[i],"-hlist")) { /* HMM list file */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; FREE_MEMORY(jconf->amnow->mapfilename); GET_TMPARG; jconf->amnow->mapfilename = filepath(tmparg, cwd); continue; } else if (strmatch(argv[i],"-nlr")) { /* word LR n-gram (ARPA) */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; FREE_MEMORY(jconf->lmnow->ngram_filename_lr_arpa); GET_TMPARG; jconf->lmnow->ngram_filename_lr_arpa = filepath(tmparg, cwd); FREE_MEMORY(jconf->lmnow->ngram_filename); continue; } else if (strmatch(argv[i],"-nrl")) { /* word RL n-gram (ARPA) */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; FREE_MEMORY(jconf->lmnow->ngram_filename_rl_arpa); GET_TMPARG; jconf->lmnow->ngram_filename_rl_arpa = filepath(tmparg, cwd); FREE_MEMORY(jconf->lmnow->ngram_filename); continue; } else if (strmatch(argv[i],"-lmp")) { /* LM weight and penalty (pass1) */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->lmp.lm_weight = (LOGPROB)atof(tmparg); GET_TMPARG; jconf->searchnow->lmp.lm_penalty = (LOGPROB)atof(tmparg); jconf->searchnow->lmp.lmp_specified = TRUE; continue; } else if (strmatch(argv[i],"-lmp2")) { /* LM weight and penalty (pass2) */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->lmp.lm_weight2 = (LOGPROB)atof(tmparg); GET_TMPARG; jconf->searchnow->lmp.lm_penalty2 = (LOGPROB)atof(tmparg); jconf->searchnow->lmp.lmp2_specified = TRUE; continue; } else if (strmatch(argv[i],"-transp")) { /* penalty for transparent word */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->lmp.lm_penalty_trans = (LOGPROB)atof(tmparg); continue; } else if (strmatch(argv[i],"-gram")) { /* comma-separatedlist of grammar prefix */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; GET_TMPARG; if (multigram_add_prefix_list(tmparg, cwd, jconf->lmnow, LM_DFA_GRAMMAR) == FALSE) { jlog("ERROR: m_options: failed to read some grammars\n"); return FALSE; } continue; } else if (strmatch(argv[i],"-gramlist")) { /* file of grammar prefix list */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; GET_TMPARG; tmparg = filepath(tmparg, cwd); if (multigram_add_prefix_filelist(tmparg, jconf->lmnow, LM_DFA_GRAMMAR) == FALSE) { jlog("ERROR: m_options: failed to read some grammars\n"); free(tmparg); return FALSE; } free(tmparg); continue; } else if (strmatch(argv[i],"-userlm")) { if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; /* just set lm flags here */ if (jconf->lmnow->lmtype != LM_PROB && jconf->lmnow->lmtype != LM_UNDEF) { jlog("ERROR: m_options: LM type conflicts: multiple LM specified?\n"); return FALSE; } jconf->lmnow->lmtype = LM_PROB; if (jconf->lmnow->lmvar != LM_UNDEF && jconf->lmnow->lmvar != LM_NGRAM_USER) { jlog("ERROR: m_options: statistical model conflict\n"); return FALSE; } jconf->lmnow->lmvar = LM_NGRAM_USER; continue; } else if (strmatch(argv[i],"-nogram")) { /* remove grammar list */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; multigram_remove_gramlist(jconf->lmnow); FREE_MEMORY(jconf->lmnow->dfa_filename); FREE_MEMORY(jconf->lmnow->dictfilename); if (jconf->lmnow->lmtype == LM_UNDEF) { jconf->lmnow->lmtype = LM_DFA; jconf->lmnow->lmvar = LM_DFA_GRAMMAR; } continue; } else if (strmatch(argv[i],"-dfa")) { /* DFA filename */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; FREE_MEMORY(jconf->lmnow->dfa_filename); GET_TMPARG; jconf->lmnow->dfa_filename = filepath(tmparg, cwd); continue; } else if (strmatch(argv[i],"-penalty1")) { /* word insertion penalty (pass1) */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->lmp.penalty1 = (LOGPROB)atof(tmparg); continue; } else if (strmatch(argv[i],"-penalty2")) { /* word insertion penalty (pass2) */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->lmp.penalty2 = (LOGPROB)atof(tmparg); continue; } else if (strmatch(argv[i],"-spmodel") || strmatch(argv[i], "-sp")) { /* name of short pause word */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; FREE_MEMORY(jconf->amnow->spmodel_name); GET_TMPARG; jconf->amnow->spmodel_name = strcpy((char*)mymalloc(strlen(tmparg)+1),tmparg); continue; } else if (strmatch(argv[i],"-multipath")) { /* force multipath mode */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; jconf->amnow->force_multipath = TRUE; continue; } else if (strmatch(argv[i],"-iwsp")) { /* enable inter-word short pause handing (for multipath) */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; jconf->lmnow->enable_iwsp = TRUE; continue; } else if (strmatch(argv[i],"-iwsppenalty")) { /* set inter-word short pause transition penalty (for multipath) */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->iwsp_penalty = atof(tmparg); continue; } else if (strmatch(argv[i],"-silhead")) { /* head silence word name */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; FREE_MEMORY(jconf->lmnow->head_silname); GET_TMPARG; jconf->lmnow->head_silname = strcpy((char*)mymalloc(strlen(tmparg)+1),tmparg); continue; } else if (strmatch(argv[i],"-siltail")) { /* tail silence word name */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; FREE_MEMORY(jconf->lmnow->tail_silname); GET_TMPARG; jconf->lmnow->tail_silname = strcpy((char*)mymalloc(strlen(tmparg)+1),tmparg); continue; } else if (strmatch(argv[i],"-mapunk")) { /* unknown word */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; GET_TMPARG; strncpy(jconf->lmnow->unknown_name, tmparg, UNK_WORD_MAXLEN); continue; } else if (strmatch(argv[i],"-iwspword")) { /* add short pause word */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; jconf->lmnow->enable_iwspword = TRUE; continue; } else if (strmatch(argv[i],"-iwspentry")) { /* content of the iwspword */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; FREE_MEMORY(jconf->lmnow->iwspentry); GET_TMPARG; jconf->lmnow->iwspentry = strcpy((char*)mymalloc(strlen(tmparg)+1),tmparg); continue; } else if (strmatch(argv[i],"-iwcache")) { /* control cross-word LM cache */ #ifdef HASH_CACHE_IW if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->pass1.iw_cache_rate = atof(tmparg); if (jconf->searchnow->pass1.iw_cache_rate > 100) jconf->searchnow->pass1.iw_cache_rate = 100; if (jconf->searchnow->pass1.iw_cache_rate < 1) jconf->searchnow->pass1.iw_cache_rate = 1; #else jlog("WARNING: m_options: HASH_CACHE_IW disabled, \"-iwcache\" ignored\n"); #endif continue; } else if (strmatch(argv[i],"-sepnum")) { /* N-best frequent word will be separated from tree */ #ifdef SEPARATE_BY_UNIGRAM if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; GET_TMPARG; jconf->lmnow->separate_wnum = atoi(tmparg); #else jlog("WARNING: m_options: SEPARATE_BY_UNIGRAM disabled, \"-sepnum\" ignored\n"); i++; #endif continue; #ifdef USE_NETAUDIO } else if (strmatch(argv[i],"-NA")) { /* netautio device name */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; FREE_MEMORY(jconf->input.netaudio_devname); GET_TMPARG; jconf->input.netaudio_devname = strcpy((char*)mymalloc(strlen(tmparg)+1),tmparg); continue; #endif } else if (strmatch(argv[i],"-adport")) { /* adinnet port num */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; jconf->input.adinnet_port = atoi(tmparg); continue; } else if (strmatch(argv[i],"-nostrip")) { /* do not strip zero samples */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; jconf->preprocess.strip_zero_sample = FALSE; continue; } else if (strmatch(argv[i],"-zmean")) { /* enable DC offset by zero mean */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; jconf->preprocess.use_zmean = TRUE; continue; } else if (strmatch(argv[i],"-nozmean")) { /* disable DC offset by zero mean */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; jconf->preprocess.use_zmean = FALSE; continue; } else if (strmatch(argv[i],"-lvscale")) { /* input level scaling factor */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; jconf->preprocess.level_coef = (float)atof(tmparg); continue; } else if (strmatch(argv[i],"-zmeanframe")) { /* enable frame-wise DC offset by zero mean */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; jconf->amnow->analysis.para.zmeanframe = TRUE; continue; } else if (strmatch(argv[i],"-nozmeanframe")) { /* disable frame-wise DC offset by zero mean */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; jconf->amnow->analysis.para.zmeanframe = FALSE; continue; } else if (strmatch(argv[i],"-usepower")) { /* use power instead of magnitude in filterbank analysis */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; jconf->amnow->analysis.para.usepower = TRUE; continue; } else if (strmatch(argv[i],"-nousepower")) { /* use magnitude in fbank analysis (default) */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; jconf->amnow->analysis.para.usepower = FALSE; continue; } else if (strmatch(argv[i],"-spsegment")) { /* enable short-pause segmentation */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->successive.enabled = TRUE; continue; } else if (strmatch(argv[i],"-spdur")) { /* speech down-trigger duration threshold in frame */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->successive.sp_frame_duration = atoi(tmparg); continue; #ifdef SPSEGMENT_NAIST } else if (strmatch(argv[i],"-spmargin")) { /* speech up-trigger backstep margin in frame */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->successive.sp_margin = atoi(tmparg); continue; } else if (strmatch(argv[i],"-spdelay")) { /* speech up-trigger delay frame */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->successive.sp_delay = atoi(tmparg); continue; #endif } else if (strmatch(argv[i],"-pausemodels")) { /* short-pause duration threshold */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; FREE_MEMORY(jconf->searchnow->successive.pausemodelname); GET_TMPARG; jconf->searchnow->successive.pausemodelname = strcpy((char*)mymalloc(strlen(tmparg)+1),tmparg); continue; } else if (strmatch(argv[i],"-gprune")) { /* select Gaussian pruning method */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; if (strmatch(tmparg,"safe")) { /* safest, slowest */ jconf->amnow->gprune_method = GPRUNE_SEL_SAFE; } else if (strmatch(tmparg,"heuristic")) { jconf->amnow->gprune_method = GPRUNE_SEL_HEURISTIC; } else if (strmatch(tmparg,"beam")) { /* fastest */ jconf->amnow->gprune_method = GPRUNE_SEL_BEAM; } else if (strmatch(tmparg,"none")) { /* no prune: compute all Gaussian */ jconf->amnow->gprune_method = GPRUNE_SEL_NONE; } else if (strmatch(tmparg,"default")) { jconf->amnow->gprune_method = GPRUNE_SEL_UNDEF; #ifdef ENABLE_PLUGIN } else if ((sid = plugin_find_optname("calcmix_get_optname", tmparg)) != -1) { /* mixture calculation plugin */ jconf->amnow->gprune_method = GPRUNE_SEL_USER; jconf->amnow->gprune_plugin_source = sid; #endif } else { jlog("ERROR: m_options: no such pruning method \"%s\"\n", argv[0], tmparg); return FALSE; } continue; /* * } else if (strmatch(argv[i],"-reorder")) { * result_reorder_flag = TRUE; * continue; */ } else if (strmatch(argv[i],"-no_ccd")) { /* force triphone handling = OFF */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->ccd_handling = FALSE; jconf->searchnow->force_ccd_handling = TRUE; continue; } else if (strmatch(argv[i],"-force_ccd")) { /* force triphone handling = ON */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->ccd_handling = TRUE; jconf->searchnow->force_ccd_handling = TRUE; continue; } else if (strmatch(argv[i],"-iwcd1")) { /* select cross-word triphone computation method */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; if (strmatch(tmparg, "max")) { /* use maximum score in triphone variants */ jconf->amnow->iwcdmethod = IWCD_MAX; } else if (strmatch(tmparg, "avg")) { /* use average in variants */ jconf->amnow->iwcdmethod = IWCD_AVG; } else if (strmatch(tmparg, "best")) { /* use average in variants */ jconf->amnow->iwcdmethod = IWCD_NBEST; GET_TMPARG; jconf->amnow->iwcdmaxn = atoi(tmparg); } else { jlog("ERROR: m_options: -iwcd1: wrong argument (max|avg|best N): %s\n", argv[0], tmparg); return FALSE; } continue; } else if (strmatch(argv[i],"-tmix")) { /* num of mixture to select */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; if (i + 1 < argc && isdigit(argv[i+1][0])) { jconf->amnow->mixnum_thres = atoi(argv[++i]); } continue; } else if (strmatch(argv[i],"-b2") || strmatch(argv[i],"-bw") || strmatch(argv[i],"-wb")) { /* word beam width in 2nd pass */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->pass2.enveloped_bestfirst_width = atoi(tmparg); continue; } else if (strmatch(argv[i],"-hgs")) { /* Gaussian selection model file */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; FREE_MEMORY(jconf->amnow->hmm_gs_filename); GET_TMPARG; jconf->amnow->hmm_gs_filename = filepath(tmparg, cwd); continue; } else if (strmatch(argv[i],"-booknum")) { /* num of state to select in GS */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->gs_statenum = atoi(tmparg); continue; } else if (strmatch(argv[i],"-gshmm")) { /* same as "-hgs" */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; FREE_MEMORY(jconf->amnow->hmm_gs_filename); GET_TMPARG; jconf->amnow->hmm_gs_filename = filepath(tmparg, cwd); continue; } else if (strmatch(argv[i],"-gsnum")) { /* same as "-booknum" */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->gs_statenum = atoi(tmparg); continue; } else if (strmatch(argv[i],"-cmnload")) { /* load CMN parameter from file */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; FREE_MEMORY(jconf->amnow->analysis.cmnload_filename); GET_TMPARG; jconf->amnow->analysis.cmnload_filename = filepath(tmparg, cwd); continue; } else if (strmatch(argv[i],"-cmnsave")) { /* save CMN parameter to file */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; FREE_MEMORY(jconf->amnow->analysis.cmnsave_filename); GET_TMPARG; jconf->amnow->analysis.cmnsave_filename = filepath(tmparg, cwd); continue; } else if (strmatch(argv[i],"-cmnupdate")) { /* update CMN parameter */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; jconf->amnow->analysis.cmn_update = TRUE; continue; } else if (strmatch(argv[i],"-cmnnoupdate")) { /* not update CMN parameter */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; jconf->amnow->analysis.cmn_update = FALSE; continue; } else if (strmatch(argv[i],"-cmnmapweight")) { /* CMN weight for MAP */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->analysis.cmn_map_weight = (float)atof(tmparg); continue; } else if (strmatch(argv[i],"-sscalc")) { /* do spectral subtraction (SS) for raw file input */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; jconf->amnow->frontend.sscalc = TRUE; FREE_MEMORY(jconf->amnow->frontend.ssload_filename); continue; } else if (strmatch(argv[i],"-sscalclen")) { /* head silence length used to compute SS (in msec) */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; jconf->amnow->frontend.sscalc_len = atoi(tmparg); continue; } else if (strmatch(argv[i],"-ssload")) { /* load SS parameter from file */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; FREE_MEMORY(jconf->amnow->frontend.ssload_filename); GET_TMPARG; jconf->amnow->frontend.ssload_filename = filepath(tmparg, cwd); jconf->amnow->frontend.sscalc = FALSE; continue; #ifdef CONFIDENCE_MEASURE } else if (strmatch(argv[i],"-cmalpha")) { /* CM log score scaling factor */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; #ifdef CM_MULTIPLE_ALPHA GET_TMPARG; jconf->searchnow->annotate.cm_alpha_bgn = (LOGPROB)atof(tmparg); GET_TMPARG; jconf->searchnow->annotate.cm_alpha_end = (LOGPROB)atof(tmparg); GET_TMPARG; jconf->searchnow->annotate.cm_alpha_step = (LOGPROB)atof(tmparg); jconf->searchnow->annotate.cm_alpha_num = (int)((jconf->searchnow->annotate.cm_alpha_end - jconf->searchnow->annotate.cm_alpha_bgn) / jconf->searchnow->annotate.cm_alpha_step) + 1; if (jconf->searchnow->annotate.cm_alpha_num > 100) { jlog("ERROR: m_option: cm_alpha step num exceeds limit (100)\n"); return FALSE; } #else GET_TMPARG; jconf->searchnow->annotate.cm_alpha = (LOGPROB)atof(tmparg); #endif continue; #ifdef CM_SEARCH_LIMIT } else if (strmatch(argv[i],"-cmthres")) { /* CM cut threshold for CM decoding */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->annotate.cm_cut_thres = (LOGPROB)atof(tmparg); continue; #endif #ifdef CM_SEARCH_LIMIT_POP } else if (strmatch(argv[i],"-cmthres2")) { /* CM cut threshold for CM decoding */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->annotate.cm_cut_thres_pop = (LOGPROB)atof(tmparg); continue; #endif #endif /* CONFIDENCE_MEASURE */ } else if (strmatch(argv[i],"-gmm")) { /* load SS parameter from file */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; FREE_MEMORY(jconf->reject.gmm_filename); GET_TMPARG; jconf->reject.gmm_filename = filepath(tmparg, cwd); continue; } else if (strmatch(argv[i],"-gmmnum")) { /* num of Gaussian pruning for GMM */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; jconf->reject.gmm_gprune_num = atoi(tmparg); continue; } else if (strmatch(argv[i],"-gmmreject")) { if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; FREE_MEMORY(jconf->reject.gmm_reject_cmn_string); jconf->reject.gmm_reject_cmn_string = strcpy((char *)mymalloc(strlen(tmparg)+1), tmparg); continue; #ifdef GMM_VAD } else if (strmatch(argv[i],"-gmmmargin")) { /* backstep margin */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; jconf->detect.gmm_margin = atoi(tmparg); continue; } else if (strmatch(argv[i],"-gmmup")) { /* uptrigger threshold */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; jconf->detect.gmm_uptrigger_thres = atof(tmparg); continue; } else if (strmatch(argv[i],"-gmmdown")) { /* uptrigger threshold */ if (!check_section(jconf, argv[i], JCONF_OPT_GLOBAL)) return FALSE; GET_TMPARG; jconf->detect.gmm_downtrigger_thres = atof(tmparg); continue; #endif } else if (strmatch(argv[i],"-htkconf")) { if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; GET_TMPARG; tmparg = filepath(tmparg, cwd); if (htk_config_file_parse(tmparg, &(jconf->amnow->analysis.para_htk)) == FALSE) { jlog("ERROR: m_options: failed to read %s\n", tmparg); free(tmparg); return FALSE; } free(tmparg); continue; } else if (strmatch(argv[i], "-wlist")) { if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; GET_TMPARG; tmparg = filepath(tmparg, cwd); if (multigram_add_prefix_filelist(tmparg, jconf->lmnow, LM_DFA_WORD) == FALSE) { jlog("ERROR: m_options: failed to read some word lists\n"); free(tmparg); return FALSE; } free(tmparg); continue; } else if (strmatch(argv[i], "-wsil")) { /* * if (jconf->lmnow->lmvar != LM_UNDEF && jconf->lmnow->lmvar != LM_DFA_WORD) { * jlog("ERROR: \"-wsil\" only valid for isolated word recognition mode\n"); * return FALSE; * } */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; GET_TMPARG; strncpy(jconf->lmnow->wordrecog_head_silence_model_name, tmparg, MAX_HMMNAME_LEN); GET_TMPARG; strncpy(jconf->lmnow->wordrecog_tail_silence_model_name, tmparg, MAX_HMMNAME_LEN); GET_TMPARG; if (strmatch(tmparg, "NULL")) { jconf->lmnow->wordrecog_silence_context_name[0] = '\0'; } else { strncpy(jconf->lmnow->wordrecog_silence_context_name, tmparg, MAX_HMMNAME_LEN); } continue; #ifdef DETERMINE } else if (strmatch(argv[i], "-wed")) { //if (jconf->lmnow->lmvar != LM_UNDEF && jconf->lmnow->lmvar != LM_DFA_WORD) { //jlog("ERROR: \"-wed\" only valid for isolated word recognition mode\n"); //return FALSE; //} if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->pass1.determine_score_thres = atof(tmparg); GET_TMPARG; jconf->searchnow->pass1.determine_duration_thres = atoi(tmparg); continue; #endif } else if (strmatch(argv[i], "-inactive")) { /* start inactive */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->sw.start_inactive = TRUE; continue; } else if (strmatch(argv[i], "-active")) { /* start active (default) */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->sw.start_inactive = FALSE; continue; } else if (strmatch(argv[i],"-fallback1pass")) { /* use 1st pass result on search failure */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; jconf->searchnow->sw.fallback_pass1_flag = TRUE; continue; #ifdef ENABLE_PLUGIN } else if (strmatch(argv[i],"-plugindir")) { GET_TMPARG; plugin_load_dirs(tmparg); continue; #endif } else if (strmatch(argv[i],"-adddict")) { if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; GET_TMPARG; tmparg = filepath(tmparg, cwd); j_add_dict(jconf->lmnow, tmparg); free(tmparg); continue; } else if (strmatch(argv[i],"-addentry")) { if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; GET_TMPARG; j_add_word(jconf->lmnow, tmparg); continue; } if (argv[i][0] == '-' && strlen(argv[i]) == 2) { /* 1-letter options */ switch(argv[i][1]) { case 'h': /* hmmdefs */ if (!check_section(jconf, argv[i], JCONF_OPT_AM)) return FALSE; FREE_MEMORY(jconf->amnow->hmmfilename); GET_TMPARG; jconf->amnow->hmmfilename = filepath(tmparg, cwd); break; case 'v': /* dictionary */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; FREE_MEMORY(jconf->lmnow->dictfilename); GET_TMPARG; jconf->lmnow->dictfilename = filepath(tmparg, cwd); break; case 'w': /* word list (isolated word recognition) */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; GET_TMPARG; if (multigram_add_prefix_list(tmparg, cwd, jconf->lmnow, LM_DFA_WORD) == FALSE) { jlog("ERROR: m_options: failed to read some word list\n"); return FALSE; } break; case 'd': /* binary N-gram */ /* lmvar should be overriden by the content of the binary N-gram */ if (!check_section(jconf, argv[i], JCONF_OPT_LM)) return FALSE; FREE_MEMORY(jconf->lmnow->ngram_filename); FREE_MEMORY(jconf->lmnow->ngram_filename_lr_arpa); FREE_MEMORY(jconf->lmnow->ngram_filename_rl_arpa); GET_TMPARG; jconf->lmnow->ngram_filename = filepath(tmparg, cwd); break; case 'b': /* beam width in 1st pass */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->pass1.specified_trellis_beam_width = atoi(tmparg); break; case 's': /* stack size in 2nd pass */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->pass2.stack_size = atoi(tmparg); break; case 'n': /* N-best search */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->pass2.nbest = atoi(tmparg); break; case 'm': /* upper limit of hypothesis generation */ if (!check_section(jconf, argv[i], JCONF_OPT_SR)) return FALSE; GET_TMPARG; jconf->searchnow->pass2.hypo_overflow = atoi(tmparg); break; default: //jlog("ERROR: m_options: wrong argument: %s\n", argv[0], argv[i]); //return FALSE; unknown_opt = TRUE; } } else { /* error */ //jlog("ERROR: m_options: wrong argument: %s\n", argv[0], argv[i]); //return FALSE; unknown_opt = TRUE; } if (unknown_opt) { /* call user-side option processing */ switch(useropt_exec(jconf, argv, argc, &i)) { case 0: /* does not match user-side options */ jlog("ERROR: m_options: wrong argument: \"%s\"\n", argv[i]); return FALSE; case -1: /* Error in user-side function */ jlog("ERROR: m_options: error in processing \"%s\"\n", argv[i]); return FALSE; } } } /* set default values if not specified yet */ for(atmp=jconf->am_root;atmp;atmp=atmp->next) { if (!atmp->spmodel_name) { atmp->spmodel_name = strcpy((char*)mymalloc(strlen(SPMODEL_NAME_DEFAULT)+1), SPMODEL_NAME_DEFAULT); } } for(ltmp=jconf->lm_root;ltmp;ltmp=ltmp->next) { if (!ltmp->head_silname) { ltmp->head_silname = strcpy((char*)mymalloc(strlen(BEGIN_WORD_DEFAULT)+1), BEGIN_WORD_DEFAULT); } if (!ltmp->tail_silname) { ltmp->tail_silname = strcpy((char*)mymalloc(strlen(END_WORD_DEFAULT)+1), END_WORD_DEFAULT); } if (!ltmp->iwspentry) { ltmp->iwspentry = strcpy((char*)mymalloc(strlen(IWSPENTRY_DEFAULT)+1), IWSPENTRY_DEFAULT); } } #ifdef USE_NETAUDIO if (!jconf->input.netaudio_devname) { jconf->input.netaudio_devname = strcpy((char*)mymalloc(strlen(NETAUDIO_DEVNAME)+1), NETAUDIO_DEVNAME); } #endif /* USE_NETAUDIO */ return TRUE; } /** * * オプション関連のメモリ領域を解放する. * * * Free memories of variables allocated by option arguments. * * * @param jconf [i/o] jconf configuration data * * @callgraph * @callergraph */ void opt_release(Jconf *jconf) { JCONF_AM *am; JCONF_LM *lm; JCONF_SEARCH *s; FREE_MEMORY(jconf->input.inputlist_filename); #ifdef USE_NETAUDIO FREE_MEMORY(jconf->input.netaudio_devname); #endif /* USE_NETAUDIO */ FREE_MEMORY(jconf->reject.gmm_filename); FREE_MEMORY(jconf->reject.gmm_reject_cmn_string); for(am=jconf->am_root;am;am=am->next) { FREE_MEMORY(am->hmmfilename); FREE_MEMORY(am->mapfilename); FREE_MEMORY(am->spmodel_name); FREE_MEMORY(am->hmm_gs_filename); FREE_MEMORY(am->analysis.cmnload_filename); FREE_MEMORY(am->analysis.cmnsave_filename); FREE_MEMORY(am->frontend.ssload_filename); } for(lm=jconf->lm_root;lm;lm=lm->next) { FREE_MEMORY(lm->ngram_filename); FREE_MEMORY(lm->ngram_filename_lr_arpa); FREE_MEMORY(lm->ngram_filename_rl_arpa); FREE_MEMORY(lm->dfa_filename); FREE_MEMORY(lm->head_silname); FREE_MEMORY(lm->tail_silname); FREE_MEMORY(lm->iwspentry); FREE_MEMORY(lm->dictfilename); multigram_remove_gramlist(lm); } for(s=jconf->search_root;s;s=s->next) { FREE_MEMORY(s->successive.pausemodelname); } } /* end of file */