00001 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 #include <julius/julius.h>
00032 
00057 char *
00058 filepath(char *filename, char *dirname)
00059 {
00060   char *p;
00061   if (dirname != NULL && filename[0] != '/'
00062 #if defined(_WIN32)
00063       && filename[0] != '\\' && !(strlen(filename) >= 3 && filename[1] == ':')
00064 #endif
00065       ) {
00066     p = (char *)mymalloc(strlen(filename) + strlen(dirname) + 1);
00067     strcpy(p, dirname);
00068     strcat(p, filename);
00069   } else {
00070     p = strcpy((char *)mymalloc(strlen(filename)+1), filename);
00071   }
00072   return p;
00073 }
00074 
00090 static char *
00091 next_arg(int *cur, int argc, char *argv[])
00092 {
00093   (*cur)++;
00094   if (*cur >= argc) {
00095     jlog("ERROR: m_options: option requires argument -- %s\n", argv[*cur-1]);
00096     return NULL;
00097   }
00098   return(argv[*cur]);
00099 }
00100 
00113 #define FREE_MEMORY(p) \
00114   {if (p) {free(p); p = NULL;}}
00115 
00140 boolean
00141 opt_parse(int argc, char *argv[], char *cwd, Jconf *jconf)
00142 {
00143   char *tmparg;
00144   int i;
00145   boolean unknown_opt;
00146   JCONF_AM *amconf, *atmp;
00147   JCONF_LM *lmconf, *ltmp;
00148   JCONF_SEARCH *sconf, *stmp;
00149   static char sname[JCONF_MODULENAME_MAXLEN];
00150 #define GET_TMPARG  if ((tmparg = next_arg(&i, argc, argv)) == NULL) return FALSE
00151 
00152   for (i=1;i<argc;i++) {
00153     unknown_opt = FALSE;
00154     if (strmatch(argv[i],"-C")) { 
00155       GET_TMPARG;
00156       tmparg = filepath(tmparg, cwd);
00157       if (config_file_parse(tmparg, jconf) == FALSE) {
00158         return FALSE;
00159       }
00160       free(tmparg);
00161       continue;
00162     } else if (strmatch(argv[i],"-AM") || strmatch(argv[i], "[AM]")) {
00163       GET_TMPARG;
00164       if (tmparg[0] == '-') {
00165         jlog("ERROR: m_options: -AM needs an argument as module name\n");
00166         return FALSE;
00167       }
00168       if (tmparg[0] >= '0' && tmparg[0] <= '9') {
00169         jlog("ERROR: m_options: AM name \"%s\" not acceptable: first character should not be a digit\n", tmparg);
00170         return FALSE;
00171       }
00172       
00173       
00174       amconf = j_jconf_am_new();
00175       if (j_jconf_am_regist(jconf, amconf, tmparg) == FALSE) {
00176         jlog("ERROR: failed to add new amconf as \"%s\"\n", tmparg);
00177         jlog("ERROR: m_options: failed to create amconf\n");
00178         j_jconf_am_free(amconf);
00179         return FALSE;
00180       }
00181       jconf->amnow = amconf;
00182       continue;
00183     } else if (strmatch(argv[i],"-AM_GMM") || strmatch(argv[i], "[AM_GMM]")) {
00184       
00185       jconf->amnow = jconf->gmm;
00186       continue;
00187     } else if (strmatch(argv[i],"-LM") || strmatch(argv[i], "[LM]")) {
00188       GET_TMPARG;
00189       if (tmparg[0] == '-') {
00190         jlog("ERROR: m_options: -LM needs an argument as module name\n");
00191         return FALSE;
00192       }
00193       if (tmparg[0] >= '0' && tmparg[0] <= '9') {
00194         jlog("ERROR: m_options: LM name \"%s\" not acceptable: first character should not be a digit\n", tmparg);
00195         return FALSE;
00196       }
00197       
00198       
00199       lmconf = j_jconf_lm_new();
00200       if (j_jconf_lm_regist(jconf, lmconf, tmparg) == FALSE) {
00201         jlog("ERROR: failed to add new lmconf as \"%s\"\n", tmparg);
00202         jlog("ERROR: m_options: failed to create lmconf\n");
00203         j_jconf_lm_free(lmconf);
00204         return FALSE;
00205       }
00206       jconf->lmnow = lmconf;
00207       continue;
00208     } else if (strmatch(argv[i],"-SR") || strmatch(argv[i], "[SR]")) {
00209       GET_TMPARG;
00210       if (tmparg[0] == '-') {
00211         jlog("ERROR: m_options: -SR needs three arguments: module name, AM name and LM name\n");
00212         return FALSE;
00213       }
00214       if (tmparg[0] >= '0' && tmparg[0] <= '9') {
00215         jlog("ERROR: m_options: SR name \"%s\" not acceptable: first character should not be a digit\n", tmparg);
00216         return FALSE;
00217       }
00218       
00219       strncpy(sname, tmparg, JCONF_MODULENAME_MAXLEN);
00220       
00221       GET_TMPARG;
00222       if (tmparg[0] == '-') {
00223         jlog("ERROR: m_options: -SR needs three arguments: module name, AM name and LM name\n");
00224         return FALSE;
00225       }
00226       if (tmparg[0] >= '0' && tmparg[0] <= '9') { 
00227         if ((amconf = j_get_amconf_by_id(jconf, atoi(tmparg))) == NULL) return FALSE;
00228       } else {                  
00229         if ((amconf = j_get_amconf_by_name(jconf, tmparg)) == NULL) return FALSE;
00230       }
00231       GET_TMPARG;
00232       if (tmparg[0] == '-') {
00233         jlog("ERROR: m_options: -SR needs three arguments: module name, AM name and LM name\n");
00234         return FALSE;
00235       }
00236       if (tmparg[0] >= '0' && tmparg[0] <= '9') { 
00237         if ((lmconf = j_get_lmconf_by_id(jconf, atoi(tmparg))) == NULL) return FALSE;
00238       } else {                  
00239         if ((lmconf = j_get_lmconf_by_name(jconf, tmparg)) == NULL) return FALSE;
00240       }
00241 
00242       
00243       sconf = j_jconf_search_new();
00244       sconf->amconf = amconf;
00245       sconf->lmconf = lmconf;
00246       if (j_jconf_search_regist(jconf, sconf, sname) == FALSE) {
00247         jlog("ERROR: failed to add new amconf as \"%s\"\n", sname);
00248         jlog("ERROR: m_options: failed to create search conf\n");
00249         j_jconf_search_free(sconf);
00250         return FALSE;
00251       }
00252       jconf->searchnow = sconf;
00253       continue;
00254     } else if (strmatch(argv[i],"-input")) { 
00255       GET_TMPARG;
00256       if (strmatch(tmparg,"file")) {
00257         jconf->input.speech_input = SP_RAWFILE;
00258         jconf->decodeopt.realtime_flag = FALSE;
00259       } else if (strmatch(tmparg,"rawfile")) {
00260         jconf->input.speech_input = SP_RAWFILE;
00261         jconf->decodeopt.realtime_flag = FALSE;
00262       } else if (strmatch(tmparg,"htkparam")) {
00263         jconf->input.speech_input = SP_MFCFILE;
00264         jconf->decodeopt.realtime_flag = FALSE;
00265       } else if (strmatch(tmparg,"mfcfile")) {
00266         jconf->input.speech_input = SP_MFCFILE;
00267         jconf->decodeopt.realtime_flag = FALSE;
00268       } else if (strmatch(tmparg,"stdin")) {
00269         jconf->input.speech_input = SP_STDIN;
00270         jconf->decodeopt.realtime_flag = FALSE;
00271       } else if (strmatch(tmparg,"adinnet")) {
00272         jconf->input.speech_input = SP_ADINNET;
00273         jconf->decodeopt.realtime_flag = TRUE;
00274 #ifdef USE_NETAUDIO
00275       } else if (strmatch(tmparg,"netaudio")) {
00276         jconf->input.speech_input = SP_NETAUDIO;
00277         jconf->decodeopt.realtime_flag = TRUE;
00278 #endif
00279 #ifdef USE_MIC
00280       } else if (strmatch(tmparg,"mic")) {
00281         jconf->input.speech_input = SP_MIC;
00282         jconf->decodeopt.realtime_flag = TRUE;
00283 #endif
00284       } else if (strmatch(tmparg,"file")) { 
00285         jconf->input.speech_input = SP_RAWFILE;
00286         jconf->decodeopt.realtime_flag = FALSE;
00287       } else if (strmatch(tmparg,"mfc")) { 
00288         jconf->input.speech_input = SP_MFCFILE;
00289         jconf->decodeopt.realtime_flag = FALSE;
00290       } else {
00291         jlog("ERROR: m_options: unknown speech input source \"%s\"\n", tmparg);
00292         return FALSE;
00293       }
00294       continue;
00295     } else if (strmatch(argv[i],"-filelist")) { 
00296       FREE_MEMORY(jconf->input.inputlist_filename);
00297       GET_TMPARG;
00298       
00299       jconf->input.inputlist_filename = filepath(tmparg, cwd);
00300       continue;
00301     } else if (strmatch(argv[i],"-rejectshort")) { 
00302       GET_TMPARG;
00303       jconf->reject.rejectshortlen = atoi(tmparg);
00304       continue;
00305 #ifdef POWER_REJECT
00306     } else if (strmatch(argv[i],"-powerthres")) { 
00307       GET_TMPARG;
00308       jconf->reject.powerthres = atoi(tmparg);
00309       continue;
00310 #endif
00311     } else if (strmatch(argv[i],"-force_realtime")) { 
00312       GET_TMPARG;
00313       if (strmatch(tmparg, "on")) {
00314         jconf->decodeopt.forced_realtime = TRUE;
00315       } else if (strmatch(tmparg, "off")) {
00316         jconf->decodeopt.forced_realtime = FALSE;
00317       } else {
00318         jlog("ERROR: m_options: \"-force_realtime\" should be either \"on\" or \"off\"\n");
00319         return FALSE;
00320       }
00321       jconf->decodeopt.force_realtime_flag = TRUE;
00322       continue;
00323     } else if (strmatch(argv[i],"-realtime")) { 
00324       jconf->decodeopt.forced_realtime = TRUE;
00325       jconf->decodeopt.force_realtime_flag = TRUE;
00326       continue;
00327     } else if (strmatch(argv[i], "-norealtime")) { 
00328       jconf->decodeopt.forced_realtime = FALSE;
00329       jconf->decodeopt.force_realtime_flag = TRUE;
00330       continue;
00331     } else if (strmatch(argv[i],"-forcedict")) { 
00332       jconf->lmnow->forcedict_flag = TRUE;
00333       continue;
00334     } else if (strmatch(argv[i],"-check")) { 
00335       GET_TMPARG;
00336       if (strmatch(tmparg, "wchmm")) {
00337         jconf->searchnow->sw.wchmm_check_flag = TRUE;
00338       } else if (strmatch(tmparg, "trellis")) {
00339         jconf->searchnow->sw.trellis_check_flag = TRUE;
00340       } else if (strmatch(tmparg, "triphone")) {
00341         jconf->searchnow->sw.triphone_check_flag = TRUE;
00342       } else {
00343         jlog("ERROR: m_options: invalid argument for \"-check\": %s\n", tmparg);
00344         return FALSE;
00345       }
00346       continue;
00347     } else if (strmatch(argv[i],"-notypecheck")) { 
00348       jconf->input.paramtype_check_flag = FALSE;
00349       continue;
00350     } else if (strmatch(argv[i],"-nlimit")) { 
00351 #ifdef WPAIR_KEEP_NLIMIT
00352       GET_TMPARG;
00353       jconf->searchnow->pass1.wpair_keep_nlimit = atoi(tmparg);
00354 #else
00355       jlog("WARNING: m_options: WPAIR_KEEP_NLIMIT disabled, \"-nlimit\" ignored\n");
00356 #endif
00357       continue;
00358     } else if (strmatch(argv[i],"-lookuprange")) { 
00359       GET_TMPARG;
00360       jconf->searchnow->pass2.lookup_range = atoi(tmparg);
00361       continue;
00362     } else if (strmatch(argv[i],"-graphout")) { 
00363       jconf->searchnow->graph.enabled = TRUE;
00364       jconf->searchnow->graph.lattice = TRUE;
00365       jconf->searchnow->graph.confnet = FALSE;
00366       continue;
00367     } else if (strmatch(argv[i],"-lattice")) { 
00368       jconf->searchnow->graph.enabled = TRUE;
00369       jconf->searchnow->graph.lattice = TRUE;
00370       continue;
00371     } else if (strmatch(argv[i],"-nolattice")) { 
00372       jconf->searchnow->graph.enabled = FALSE;
00373       jconf->searchnow->graph.lattice = FALSE;
00374       continue;
00375     } else if (strmatch(argv[i],"-confnet")) { 
00376       jconf->searchnow->graph.enabled = TRUE;
00377       jconf->searchnow->graph.confnet = TRUE;
00378       continue;
00379     } else if (strmatch(argv[i],"-noconfnet")) { 
00380       jconf->searchnow->graph.enabled = FALSE;
00381       jconf->searchnow->graph.confnet = FALSE;
00382       continue;
00383     } else if (strmatch(argv[i],"-graphrange")) { 
00384       GET_TMPARG;
00385       jconf->searchnow->graph.graph_merge_neighbor_range = atoi(tmparg);
00386       continue;
00387 #ifdef GRAPHOUT_DEPTHCUT
00388     } else if (strmatch(argv[i],"-graphcut")) { 
00389       GET_TMPARG;
00390       jconf->searchnow->graph.graphout_cut_depth = atoi(tmparg);
00391       continue;
00392 #endif
00393 #ifdef GRAPHOUT_LIMIT_BOUNDARY_LOOP
00394     } else if (strmatch(argv[i],"-graphboundloop")) { 
00395       GET_TMPARG;
00396       jconf->searchnow->graph.graphout_limit_boundary_loop_num = atoi(tmparg);
00397       continue;
00398 #endif
00399 #ifdef GRAPHOUT_SEARCH_DELAY_TERMINATION
00400     } else if (strmatch(argv[i],"-graphsearchdelay")) { 
00401       jconf->searchnow->graph.graphout_search_delay = TRUE;
00402       continue;
00403     } else if (strmatch(argv[i],"-nographsearchdelay")) { 
00404       jconf->searchnow->graph.graphout_search_delay = FALSE;
00405       continue;
00406 #endif
00407     } else if (strmatch(argv[i],"-looktrellis")) { 
00408       jconf->searchnow->pass2.looktrellis_flag = TRUE;
00409       continue;
00410     } else if (strmatch(argv[i],"-multigramout")) { 
00411       jconf->searchnow->output.multigramout_flag = TRUE;
00412       continue;
00413     } else if (strmatch(argv[i],"-nomultigramout")) { 
00414       jconf->searchnow->output.multigramout_flag = FALSE;
00415       continue;
00416     } else if (strmatch(argv[i],"-oldtree")) { 
00417       jconf->searchnow->pass1.old_tree_function_flag = TRUE;
00418       continue;
00419     } else if (strmatch(argv[i],"-sb")) { 
00420 #ifdef SCAN_BEAM
00421       GET_TMPARG;
00422       jconf->searchnow->pass2.scan_beam_thres = atof(tmparg);
00423 #else
00424       jlog("WARNING: m_options: SCAN_BEAM disabled, \"-sb\" ignored\n");
00425 #endif
00426       continue;
00427     } else if (strmatch(argv[i],"-discount")) { 
00428       jlog("WARNING: m_options: option \"-discount\" is now bogus, ignored\n");
00429       continue;
00430     } else if (strmatch(argv[i],"-cutsilence")) { 
00431       jconf->detect.silence_cut = 1;
00432       continue;
00433     } else if (strmatch(argv[i],"-nocutsilence")) { 
00434       jconf->detect.silence_cut = 0;
00435       continue;
00436     } else if (strmatch(argv[i],"-pausesegment")) { 
00437       jconf->detect.silence_cut = 1;
00438       continue;
00439     } else if (strmatch(argv[i],"-nopausesegment")) { 
00440       jconf->detect.silence_cut = 0;
00441       continue;
00442     } else if (strmatch(argv[i],"-lv")) { 
00443       GET_TMPARG;
00444       jconf->detect.level_thres = atoi(tmparg);
00445       continue;
00446     } else if (strmatch(argv[i],"-zc")) { 
00447       GET_TMPARG;
00448       jconf->detect.zero_cross_num = atoi(tmparg);
00449       continue;
00450     } else if (strmatch(argv[i],"-headmargin")) { 
00451       GET_TMPARG;
00452       jconf->detect.head_margin_msec = atoi(tmparg);
00453       continue;
00454     } else if (strmatch(argv[i],"-tailmargin")) { 
00455       GET_TMPARG;
00456       jconf->detect.tail_margin_msec = atoi(tmparg);
00457       continue;
00458     } else if (strmatch(argv[i],"-hipass")||strmatch(argv[i],"-hifreq")) { 
00459       GET_TMPARG;
00460       jconf->amnow->analysis.para.hipass = atoi(tmparg);
00461       continue;
00462     } else if (strmatch(argv[i],"-lopass")||strmatch(argv[i],"-lofreq")) { 
00463       GET_TMPARG;
00464       jconf->amnow->analysis.para.lopass = atoi(tmparg);
00465       continue;
00466     } else if (strmatch(argv[i],"-smpPeriod")) { 
00467       GET_TMPARG;
00468       jconf->amnow->analysis.para.smp_period = atoi(tmparg);
00469       jconf->amnow->analysis.para.smp_freq = period2freq(jconf->amnow->analysis.para.smp_period);
00470       continue;
00471     } else if (strmatch(argv[i],"-smpFreq")) { 
00472       GET_TMPARG;
00473       jconf->amnow->analysis.para.smp_freq = atoi(tmparg);
00474       jconf->amnow->analysis.para.smp_period = freq2period(jconf->amnow->analysis.para.smp_freq);
00475       continue;
00476     } else if (strmatch(argv[i],"-fsize")) { 
00477       GET_TMPARG;
00478       jconf->amnow->analysis.para.framesize = atoi(tmparg);
00479       continue;
00480     } else if (strmatch(argv[i],"-fshift")) { 
00481       GET_TMPARG;
00482       jconf->amnow->analysis.para.frameshift = atoi(tmparg);
00483       continue;
00484     } else if (strmatch(argv[i],"-preemph")) {
00485       GET_TMPARG;
00486       jconf->amnow->analysis.para.preEmph = atof(tmparg);
00487       continue;
00488     } else if (strmatch(argv[i],"-fbank")) {
00489       GET_TMPARG;
00490       jconf->amnow->analysis.para.fbank_num = atoi(tmparg);
00491       continue;
00492     } else if (strmatch(argv[i],"-ceplif")) {
00493       GET_TMPARG;
00494       jconf->amnow->analysis.para.lifter = atoi(tmparg);
00495       continue;
00496     } else if (strmatch(argv[i],"-rawe")) {
00497       jconf->amnow->analysis.para.raw_e = TRUE;
00498       continue;
00499     } else if (strmatch(argv[i],"-norawe")) {
00500       jconf->amnow->analysis.para.raw_e = FALSE;
00501       continue;
00502     } else if (strmatch(argv[i],"-enormal")) {
00503       jconf->amnow->analysis.para.enormal = TRUE;
00504       continue;
00505     } else if (strmatch(argv[i],"-noenormal")) {
00506       jconf->amnow->analysis.para.enormal = FALSE;
00507       continue;
00508     } else if (strmatch(argv[i],"-escale")) {
00509       GET_TMPARG;
00510       jconf->amnow->analysis.para.escale = atof(tmparg);
00511       continue;
00512     } else if (strmatch(argv[i],"-silfloor")) {
00513       GET_TMPARG;
00514       jconf->amnow->analysis.para.silFloor = atof(tmparg);
00515       continue;
00516     } else if (strmatch(argv[i],"-delwin")) { 
00517       GET_TMPARG;
00518       jconf->amnow->analysis.para.delWin = atoi(tmparg);
00519       continue;
00520     } else if (strmatch(argv[i],"-accwin")) { 
00521       GET_TMPARG;
00522       jconf->amnow->analysis.para.accWin = atoi(tmparg);
00523       continue;
00524     } else if (strmatch(argv[i],"-ssalpha")) { 
00525       GET_TMPARG;
00526       jconf->amnow->frontend.ss_alpha = atof(tmparg);
00527       continue;
00528     } else if (strmatch(argv[i],"-ssfloor")) { 
00529       GET_TMPARG;
00530       jconf->amnow->frontend.ss_floor = atof(tmparg);
00531       continue;
00532     } else if (strmatch(argv[i],"-48")) { 
00533       jconf->input.use_ds48to16 = TRUE;
00534       continue;
00535     } else if (strmatch(argv[i],"-version") || strmatch(argv[i], "--version") || strmatch(argv[i], "-setting") || strmatch(argv[i], "--setting")) { 
00536       j_put_header(stderr);
00537       j_put_compile_defs(stderr);
00538       fprintf(stderr, "\n");
00539       j_put_library_defs(stderr);
00540       return FALSE;
00541     } else if (strmatch(argv[i],"-quiet")) { 
00542       debug2_flag = verbose_flag = FALSE;
00543       continue;
00544     } else if (strmatch(argv[i],"-debug")) { 
00545       debug2_flag = verbose_flag = TRUE;
00546       continue;
00547     } else if (strmatch(argv[i],"-progout")) { 
00548       jconf->searchnow->output.progout_flag = TRUE;
00549       continue;
00550     } else if (strmatch(argv[i],"-proginterval")) { 
00551       GET_TMPARG;
00552       jconf->searchnow->output.progout_interval = atoi(tmparg);
00553       continue;
00554     } else if (strmatch(argv[i],"-demo")) { 
00555       debug2_flag = verbose_flag = FALSE;
00556       jconf->searchnow->output.progout_flag = TRUE;
00557       continue;
00558     } else if (strmatch(argv[i],"-walign")) { 
00559       jconf->searchnow->annotate.align_result_word_flag = TRUE;
00560       continue;
00561     } else if (strmatch(argv[i],"-palign")) { 
00562       jconf->searchnow->annotate.align_result_phoneme_flag = TRUE;
00563       continue;
00564     } else if (strmatch(argv[i],"-salign")) { 
00565       jconf->searchnow->annotate.align_result_state_flag = TRUE;
00566       continue;
00567     } else if (strmatch(argv[i],"-output")) { 
00568       GET_TMPARG;
00569       jconf->searchnow->output.output_hypo_maxnum = atoi(tmparg);
00570       continue;
00571     } else if (strmatch(argv[i],"-1pass")) { 
00572       jconf->searchnow->compute_only_1pass = TRUE;
00573       continue;
00574     } else if (strmatch(argv[i],"-hlist")) { 
00575       FREE_MEMORY(jconf->amnow->mapfilename);
00576       GET_TMPARG;
00577       jconf->amnow->mapfilename = filepath(tmparg, cwd);
00578       continue;
00579     } else if (strmatch(argv[i],"-nlr")) { 
00580       FREE_MEMORY(jconf->lmnow->ngram_filename_lr_arpa);
00581       GET_TMPARG;
00582       jconf->lmnow->ngram_filename_lr_arpa = filepath(tmparg, cwd);
00583       FREE_MEMORY(jconf->lmnow->ngram_filename);
00584       continue;
00585     } else if (strmatch(argv[i],"-nrl")) { 
00586       FREE_MEMORY(jconf->lmnow->ngram_filename_rl_arpa);
00587       GET_TMPARG;
00588       jconf->lmnow->ngram_filename_rl_arpa = filepath(tmparg, cwd);
00589       FREE_MEMORY(jconf->lmnow->ngram_filename);
00590       continue;
00591     } else if (strmatch(argv[i],"-lmp")) { 
00592       GET_TMPARG;
00593       jconf->searchnow->lmp.lm_weight = (LOGPROB)atof(tmparg);
00594       GET_TMPARG;
00595       jconf->searchnow->lmp.lm_penalty = (LOGPROB)atof(tmparg);
00596       jconf->searchnow->lmp.lmp_specified = TRUE;
00597       continue;
00598     } else if (strmatch(argv[i],"-lmp2")) { 
00599       GET_TMPARG;
00600       jconf->searchnow->lmp.lm_weight2 = (LOGPROB)atof(tmparg);
00601       GET_TMPARG;
00602       jconf->searchnow->lmp.lm_penalty2 = (LOGPROB)atof(tmparg);
00603       jconf->searchnow->lmp.lmp2_specified = TRUE;
00604       continue;
00605     } else if (strmatch(argv[i],"-transp")) { 
00606       GET_TMPARG;
00607       jconf->searchnow->lmp.lm_penalty_trans = (LOGPROB)atof(tmparg);
00608       continue;
00609     } else if (strmatch(argv[i],"-gram")) { 
00610       GET_TMPARG;
00611       if (multigram_add_prefix_list(tmparg, cwd, jconf->lmnow, LM_DFA_GRAMMAR) == FALSE) {
00612         jlog("ERROR: m_options: failed to read some grammars\n");
00613         return FALSE;
00614       }
00615       continue;
00616     } else if (strmatch(argv[i],"-gramlist")) { 
00617       GET_TMPARG;
00618       tmparg = filepath(tmparg, cwd);
00619       if (multigram_add_prefix_filelist(tmparg, jconf->lmnow, LM_DFA_GRAMMAR) == FALSE) {
00620         jlog("ERROR: m_options: failed to read some grammars\n");
00621         free(tmparg);
00622         return FALSE;
00623       }
00624       free(tmparg);
00625       continue;
00626     } else if (strmatch(argv[i],"-userlm")) {
00627       
00628       if (jconf->lmnow->lmtype != LM_PROB && jconf->lmnow->lmtype != LM_UNDEF) {
00629         jlog("ERROR: m_options: LM type conflicts: multiple LM specified?\n");
00630         return FALSE;
00631       }
00632       jconf->lmnow->lmtype = LM_PROB;
00633       if (jconf->lmnow->lmvar != LM_UNDEF && jconf->lmnow->lmvar != LM_NGRAM_USER) {
00634         jlog("ERROR: m_options: statistical model conflict\n");
00635         return FALSE;
00636       }
00637       jconf->lmnow->lmvar  = LM_NGRAM_USER;
00638       continue;
00639     } else if (strmatch(argv[i],"-nogram")) { 
00640       multigram_remove_gramlist(jconf->lmnow);
00641       FREE_MEMORY(jconf->lmnow->dfa_filename);
00642       FREE_MEMORY(jconf->lmnow->dictfilename);
00643       continue;
00644     } else if (strmatch(argv[i],"-dfa")) { 
00645       FREE_MEMORY(jconf->lmnow->dfa_filename);
00646       GET_TMPARG;
00647       jconf->lmnow->dfa_filename = filepath(tmparg, cwd);
00648       continue;
00649     } else if (strmatch(argv[i],"-penalty1")) { 
00650       GET_TMPARG;
00651       jconf->searchnow->lmp.penalty1 = (LOGPROB)atof(tmparg);
00652       continue;
00653     } else if (strmatch(argv[i],"-penalty2")) { 
00654       GET_TMPARG;
00655       jconf->searchnow->lmp.penalty2 = (LOGPROB)atof(tmparg);
00656       continue;
00657     } else if (strmatch(argv[i],"-spmodel") || strmatch(argv[i], "-sp")) { 
00658       FREE_MEMORY(jconf->amnow->spmodel_name);
00659       GET_TMPARG;
00660       jconf->amnow->spmodel_name = strcpy((char*)mymalloc(strlen(tmparg)+1),tmparg);
00661       continue;
00662     } else if (strmatch(argv[i],"-multipath")) { 
00663       jconf->amnow->force_multipath = TRUE;
00664       continue;
00665     } else if (strmatch(argv[i],"-iwsp")) { 
00666       jconf->lmnow->enable_iwsp = TRUE;
00667       continue;
00668     } else if (strmatch(argv[i],"-iwsppenalty")) { 
00669       GET_TMPARG;
00670       jconf->amnow->iwsp_penalty = atof(tmparg);
00671       continue;
00672     } else if (strmatch(argv[i],"-silhead")) { 
00673       FREE_MEMORY(jconf->lmnow->head_silname);
00674       GET_TMPARG;
00675       jconf->lmnow->head_silname = strcpy((char*)mymalloc(strlen(tmparg)+1),tmparg);
00676       continue;
00677     } else if (strmatch(argv[i],"-siltail")) { 
00678       FREE_MEMORY(jconf->lmnow->tail_silname);
00679       GET_TMPARG;
00680       jconf->lmnow->tail_silname = strcpy((char*)mymalloc(strlen(tmparg)+1),tmparg);
00681       continue;
00682     } else if (strmatch(argv[i],"-iwspword")) { 
00683       jconf->lmnow->enable_iwspword = TRUE;
00684       continue;
00685     } else if (strmatch(argv[i],"-iwspentry")) { 
00686       FREE_MEMORY(jconf->lmnow->iwspentry);
00687       GET_TMPARG;
00688       jconf->lmnow->iwspentry = strcpy((char*)mymalloc(strlen(tmparg)+1),tmparg);
00689       continue;
00690     } else if (strmatch(argv[i],"-iwcache")) { 
00691 #ifdef HASH_CACHE_IW
00692       GET_TMPARG;
00693       jconf->searchnow->pass1.iw_cache_rate = atof(tmparg);
00694       if (jconf->searchnow->pass1.iw_cache_rate > 100) jconf->searchnow->pass1.iw_cache_rate = 100;
00695       if (jconf->searchnow->pass1.iw_cache_rate < 1) jconf->searchnow->pass1.iw_cache_rate = 1;
00696 #else
00697       jlog("WARNING: m_options: HASH_CACHE_IW disabled, \"-iwcache\" ignored\n");
00698 #endif
00699       continue;
00700     } else if (strmatch(argv[i],"-sepnum")) { 
00701 #ifdef SEPARATE_BY_UNIGRAM
00702       GET_TMPARG;
00703       jconf->lmnow->separate_wnum = atoi(tmparg);
00704 #else
00705       jlog("WARNING: m_options: SEPARATE_BY_UNIGRAM disabled, \"-sepnum\" ignored\n");
00706       i++;
00707 #endif
00708       continue;
00709 #ifdef USE_NETAUDIO
00710     } else if (strmatch(argv[i],"-NA")) { 
00711       FREE_MEMORY(jconf->input.netaudio_devname);
00712       GET_TMPARG;
00713       jconf->input.netaudio_devname = strcpy((char*)mymalloc(strlen(tmparg)+1),tmparg);
00714       continue;
00715 #endif
00716     } else if (strmatch(argv[i],"-adport")) { 
00717       GET_TMPARG;
00718       jconf->input.adinnet_port = atoi(tmparg);
00719       continue;
00720     } else if (strmatch(argv[i],"-nostrip")) { 
00721       jconf->preprocess.strip_zero_sample = FALSE;
00722       continue;
00723     } else if (strmatch(argv[i],"-zmean")) { 
00724       jconf->preprocess.use_zmean = TRUE;
00725       continue;
00726     } else if (strmatch(argv[i],"-nozmean")) { 
00727       jconf->preprocess.use_zmean = FALSE;
00728       continue;
00729     } else if (strmatch(argv[i],"-zmeanframe")) { 
00730       jconf->amnow->analysis.para.zmeanframe = TRUE;
00731       continue;
00732     } else if (strmatch(argv[i],"-nozmeanframe")) { 
00733       jconf->amnow->analysis.para.zmeanframe = FALSE;
00734       continue;
00735     } else if (strmatch(argv[i],"-spsegment")) { 
00736       jconf->searchnow->successive.enabled = TRUE;
00737       continue;
00738     } else if (strmatch(argv[i],"-spdur")) { 
00739       GET_TMPARG;
00740       jconf->searchnow->successive.sp_frame_duration = atoi(tmparg);
00741       continue;
00742 #ifdef SPSEGMENT_NAIST
00743     } else if (strmatch(argv[i],"-spmargin")) { 
00744       GET_TMPARG;
00745       jconf->searchnow->successive.sp_margin = atoi(tmparg);
00746       continue;
00747     } else if (strmatch(argv[i],"-spdelay")) { 
00748       GET_TMPARG;
00749       jconf->searchnow->successive.sp_delay = atoi(tmparg);
00750       continue;
00751 #endif
00752     } else if (strmatch(argv[i],"-pausemodels")) { 
00753       FREE_MEMORY(jconf->searchnow->successive.pausemodelname);
00754       GET_TMPARG;
00755       jconf->searchnow->successive.pausemodelname = strcpy((char*)mymalloc(strlen(tmparg)+1),tmparg);
00756       continue;
00757     } else if (strmatch(argv[i],"-gprune")) { 
00758       GET_TMPARG;
00759       if (strmatch(tmparg,"safe")) { 
00760         jconf->amnow->gprune_method = GPRUNE_SEL_SAFE;
00761       } else if (strmatch(tmparg,"heuristic")) {
00762         jconf->amnow->gprune_method = GPRUNE_SEL_HEURISTIC;
00763       } else if (strmatch(tmparg,"beam")) { 
00764         jconf->amnow->gprune_method = GPRUNE_SEL_BEAM;
00765       } else if (strmatch(tmparg,"none")) { 
00766         jconf->amnow->gprune_method = GPRUNE_SEL_NONE;
00767       } else if (strmatch(tmparg,"default")) {
00768         jconf->amnow->gprune_method = GPRUNE_SEL_UNDEF;
00769       } else {
00770         jlog("ERROR: m_options: no such pruning method \"%s\"\n", argv[0], tmparg);
00771         return FALSE;
00772       }
00773       continue;
00774 
00775 
00776 
00777 
00778 
00779     } else if (strmatch(argv[i],"-no_ccd")) { 
00780       jconf->searchnow->ccd_handling = FALSE;
00781       jconf->searchnow->force_ccd_handling = TRUE;
00782       continue;
00783     } else if (strmatch(argv[i],"-force_ccd")) { 
00784       jconf->searchnow->ccd_handling = TRUE;
00785       jconf->searchnow->force_ccd_handling = TRUE;
00786       continue;
00787     } else if (strmatch(argv[i],"-iwcd1")) { 
00788       GET_TMPARG;
00789       if (strmatch(tmparg, "max")) { 
00790         jconf->amnow->iwcdmethod = IWCD_MAX;
00791       } else if (strmatch(tmparg, "avg")) { 
00792         jconf->amnow->iwcdmethod = IWCD_AVG;
00793       } else if (strmatch(tmparg, "best")) { 
00794         jconf->amnow->iwcdmethod = IWCD_NBEST;
00795         GET_TMPARG;
00796         jconf->amnow->iwcdmaxn = atoi(tmparg);
00797       } else {
00798         jlog("ERROR: m_options: -iwcd1: wrong argument (max|avg|best N): %s\n", argv[0], tmparg);
00799         return FALSE;
00800       }
00801       continue;
00802     } else if (strmatch(argv[i],"-tmix")) { 
00803       if (i + 1 < argc && isdigit(argv[i+1][0])) {
00804         jconf->amnow->mixnum_thres = atoi(argv[++i]);
00805       }
00806       continue;
00807     } else if (strmatch(argv[i],"-b2") || strmatch(argv[i],"-bw") || strmatch(argv[i],"-wb")) { 
00808       GET_TMPARG;
00809       jconf->searchnow->pass2.enveloped_bestfirst_width = atoi(tmparg);
00810       continue;
00811     } else if (strmatch(argv[i],"-hgs")) { 
00812       FREE_MEMORY(jconf->amnow->hmm_gs_filename);
00813       GET_TMPARG;
00814       jconf->amnow->hmm_gs_filename = filepath(tmparg, cwd);
00815       continue;
00816     } else if (strmatch(argv[i],"-booknum")) { 
00817       GET_TMPARG;
00818       jconf->amnow->gs_statenum = atoi(tmparg);
00819       continue;
00820     } else if (strmatch(argv[i],"-gshmm")) { 
00821       FREE_MEMORY(jconf->amnow->hmm_gs_filename);
00822       GET_TMPARG;
00823       jconf->amnow->hmm_gs_filename = filepath(tmparg, cwd);
00824       continue;
00825     } else if (strmatch(argv[i],"-gsnum")) { 
00826       GET_TMPARG;
00827       jconf->amnow->gs_statenum = atoi(tmparg);
00828       continue;
00829     } else if (strmatch(argv[i],"-cmnload")) { 
00830       FREE_MEMORY(jconf->amnow->analysis.cmnload_filename);
00831       GET_TMPARG;
00832       jconf->amnow->analysis.cmnload_filename = filepath(tmparg, cwd);
00833       continue;
00834     } else if (strmatch(argv[i],"-cmnsave")) { 
00835       FREE_MEMORY(jconf->amnow->analysis.cmnsave_filename);
00836       GET_TMPARG;
00837       jconf->amnow->analysis.cmnsave_filename = filepath(tmparg, cwd);
00838       continue;
00839     } else if (strmatch(argv[i],"-cmnupdate")) { 
00840       jconf->amnow->analysis.cmn_update = TRUE;
00841       continue;
00842     } else if (strmatch(argv[i],"-cmnnoupdate")) { 
00843       jconf->amnow->analysis.cmn_update = FALSE;
00844       continue;
00845     } else if (strmatch(argv[i],"-cmnmapweight")) { 
00846       GET_TMPARG;
00847       jconf->amnow->analysis.cmn_map_weight = (float)atof(tmparg);
00848       continue;
00849     } else if (strmatch(argv[i],"-sscalc")) { 
00850       jconf->amnow->frontend.sscalc = TRUE;
00851       FREE_MEMORY(jconf->amnow->frontend.ssload_filename);
00852       continue;
00853     } else if (strmatch(argv[i],"-sscalclen")) { 
00854       GET_TMPARG;
00855       jconf->amnow->frontend.sscalc_len = atoi(tmparg);
00856       continue;
00857     } else if (strmatch(argv[i],"-ssload")) { 
00858       FREE_MEMORY(jconf->amnow->frontend.ssload_filename);
00859       GET_TMPARG;
00860       jconf->amnow->frontend.ssload_filename = filepath(tmparg, cwd);
00861       jconf->amnow->frontend.sscalc = FALSE;
00862       continue;
00863 #ifdef CONFIDENCE_MEASURE
00864     } else if (strmatch(argv[i],"-cmalpha")) { 
00865 #ifdef CM_MULTIPLE_ALPHA
00866       GET_TMPARG;
00867       jconf->searchnow->annotate.cm_alpha_bgn = (LOGPROB)atof(tmparg);
00868       GET_TMPARG;
00869       jconf->searchnow->annotate.cm_alpha_end = (LOGPROB)atof(tmparg);
00870       GET_TMPARG;
00871       jconf->searchnow->annotate.cm_alpha_step = (LOGPROB)atof(tmparg);
00872       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;
00873       if (jconf->searchnow->annotate.cm_alpha_num > 100) {
00874         jlog("ERROR: m_option: cm_alpha step num exceeds limit (100)\n");
00875         return FALSE;
00876       }
00877 #else
00878       GET_TMPARG;
00879       jconf->searchnow->annotate.cm_alpha = (LOGPROB)atof(tmparg);
00880 #endif
00881       continue;
00882 #ifdef CM_SEARCH_LIMIT
00883     } else if (strmatch(argv[i],"-cmthres")) { 
00884       GET_TMPARG;
00885       jconf->searchnow->annotate.cm_cut_thres = (LOGPROB)atof(tmparg);
00886       continue;
00887 #endif
00888 #ifdef CM_SEARCH_LIMIT_POP
00889     } else if (strmatch(argv[i],"-cmthres2")) { 
00890       GET_TMPARG;
00891       jconf->searchnow->annotate.cm_cut_thres_pop = (LOGPROB)atof(tmparg);
00892       continue;
00893 #endif
00894 #endif 
00895     } else if (strmatch(argv[i],"-gmm")) { 
00896       FREE_MEMORY(jconf->reject.gmm_filename);
00897       GET_TMPARG;
00898       jconf->reject.gmm_filename = filepath(tmparg, cwd);
00899       continue;
00900     } else if (strmatch(argv[i],"-gmmnum")) { 
00901       GET_TMPARG;
00902       jconf->reject.gmm_gprune_num = atoi(tmparg);
00903       continue;
00904     } else if (strmatch(argv[i],"-gmmreject")) {
00905       GET_TMPARG;
00906       FREE_MEMORY(jconf->reject.gmm_reject_cmn_string);
00907       jconf->reject.gmm_reject_cmn_string = strcpy((char *)mymalloc(strlen(tmparg)+1), tmparg);
00908       continue;
00909 #ifdef GMM_VAD
00910     } else if (strmatch(argv[i],"-gmmmargin")) { 
00911       GET_TMPARG;
00912       jconf->detect.gmm_margin = atoi(tmparg);
00913       continue;
00914 #endif
00915     } else if (strmatch(argv[i],"-htkconf")) {
00916       GET_TMPARG;
00917       if (htk_config_file_parse(tmparg, &(jconf->amnow->analysis.para_htk)) == FALSE) {
00918         jlog("ERROR: m_options: failed to read %s\n", tmparg);
00919         return FALSE;
00920       }
00921       continue;
00922     } else if (strmatch(argv[i], "-wlist")) {
00923       GET_TMPARG;
00924       tmparg = filepath(tmparg, cwd);
00925       if (multigram_add_prefix_filelist(tmparg, jconf->lmnow, LM_DFA_WORD) == FALSE) {
00926         jlog("ERROR: m_options: failed to read some word lists\n");
00927         free(tmparg);
00928         return FALSE;
00929       }
00930       free(tmparg);
00931       continue;
00932     } else if (strmatch(argv[i], "-wsil")) {
00933       
00934 
00935 
00936 
00937 
00938 
00939       GET_TMPARG;
00940       strncpy(jconf->lmnow->wordrecog_head_silence_model_name, tmparg, MAX_HMMNAME_LEN);
00941       GET_TMPARG;
00942       strncpy(jconf->lmnow->wordrecog_tail_silence_model_name, tmparg, MAX_HMMNAME_LEN);
00943       GET_TMPARG;
00944       if (strmatch(tmparg, "NULL")) {
00945         jconf->lmnow->wordrecog_silence_context_name[0] = '\0';
00946       } else {
00947         strncpy(jconf->lmnow->wordrecog_silence_context_name, tmparg, MAX_HMMNAME_LEN);
00948       }
00949       continue;
00950 #ifdef DETERMINE
00951     } else if (strmatch(argv[i], "-wed")) {
00952       
00953       
00954       
00955       
00956       GET_TMPARG;
00957       jconf->searchnow->pass1.determine_score_thres = atof(tmparg);
00958       GET_TMPARG;
00959       jconf->searchnow->pass1.determine_duration_thres = atoi(tmparg);
00960       continue;
00961 #endif
00962     } else if (strmatch(argv[i], "-inactive")) { 
00963       jconf->searchnow->sw.start_inactive = TRUE;
00964       continue;
00965     } else if (strmatch(argv[i], "-active")) { 
00966       jconf->searchnow->sw.start_inactive = FALSE;
00967       continue;
00968     }
00969     if (argv[i][0] == '-' && strlen(argv[i]) == 2) {
00970       
00971       switch(argv[i][1]) {
00972       case 'h':                 
00973         FREE_MEMORY(jconf->amnow->hmmfilename);
00974         GET_TMPARG;
00975         jconf->amnow->hmmfilename = filepath(tmparg, cwd);
00976         break;
00977       case 'v':                 
00978         FREE_MEMORY(jconf->lmnow->dictfilename);
00979         GET_TMPARG;
00980         jconf->lmnow->dictfilename = filepath(tmparg, cwd);
00981         break;
00982       case 'w':                 
00983         GET_TMPARG;
00984         if (multigram_add_prefix_list(tmparg, cwd, jconf->lmnow, LM_DFA_WORD) == FALSE) {
00985           jlog("ERROR: m_options: failed to read some word list\n");
00986           return FALSE;
00987         }
00988         break;
00989       case 'd':                 
00990         
00991         FREE_MEMORY(jconf->lmnow->ngram_filename);
00992         FREE_MEMORY(jconf->lmnow->ngram_filename_lr_arpa);
00993         FREE_MEMORY(jconf->lmnow->ngram_filename_rl_arpa);
00994         GET_TMPARG;
00995         jconf->lmnow->ngram_filename = filepath(tmparg, cwd);
00996         break;
00997       case 'b':                 
00998         GET_TMPARG;
00999         jconf->searchnow->pass1.specified_trellis_beam_width = atoi(tmparg);
01000         break;
01001       case 's':                 
01002         GET_TMPARG;
01003         jconf->searchnow->pass2.stack_size = atoi(tmparg);
01004         break;
01005       case 'n':                 
01006         GET_TMPARG;
01007         jconf->searchnow->pass2.nbest = atoi(tmparg);
01008         break;
01009       case 'm':                 
01010         GET_TMPARG;
01011         jconf->searchnow->pass2.hypo_overflow = atoi(tmparg);
01012         break;
01013       default:
01014         
01015         
01016         unknown_opt = TRUE;
01017       }
01018     } else {                    
01019       
01020       
01021       unknown_opt = TRUE;
01022     }
01023     if (unknown_opt) {
01024       
01025       switch(useropt_exec(jconf, argv, argc, &i)) {
01026       case 0:                   
01027         jlog("ERROR: m_options: wrong argument: \"%s\"\n", argv[i]);
01028         return FALSE;
01029       case -1:                  
01030         jlog("ERROR: m_options: error in processing \"%s\"\n", argv[i]);
01031         return FALSE;
01032       }
01033     }
01034   }
01035   
01036   
01037   for(atmp=jconf->am_root;atmp;atmp=atmp->next) {
01038     if (!atmp->spmodel_name) {
01039       atmp->spmodel_name = strcpy((char*)mymalloc(strlen(SPMODEL_NAME_DEFAULT)+1),
01040                           SPMODEL_NAME_DEFAULT);
01041     }
01042   }
01043   for(ltmp=jconf->lm_root;ltmp;ltmp=ltmp->next) {
01044     if (!ltmp->head_silname) {
01045       ltmp->head_silname = strcpy((char*)mymalloc(strlen(BEGIN_WORD_DEFAULT)+1),
01046                                   BEGIN_WORD_DEFAULT);
01047     }
01048     if (!ltmp->tail_silname) {
01049       ltmp->tail_silname = strcpy((char*)mymalloc(strlen(END_WORD_DEFAULT)+1),
01050                                   END_WORD_DEFAULT);
01051     }
01052     if (!ltmp->iwspentry) {
01053       ltmp->iwspentry = strcpy((char*)mymalloc(strlen(IWSPENTRY_DEFAULT)+1),
01054                                IWSPENTRY_DEFAULT);
01055     }
01056   }
01057 #ifdef USE_NETAUDIO
01058   if (!jconf->input.netaudio_devname) {
01059     jconf->input.netaudio_devname = strcpy((char*)mymalloc(strlen(NETAUDIO_DEVNAME)+1),
01060                               NETAUDIO_DEVNAME);
01061   }
01062 #endif  
01063 
01064   return TRUE;
01065 }
01066 
01080 void
01081 opt_release(Jconf *jconf)
01082 {
01083   JCONF_AM *am;
01084   JCONF_LM *lm;
01085   JCONF_SEARCH *s;
01086 
01087   FREE_MEMORY(jconf->input.inputlist_filename);
01088 #ifdef USE_NETAUDIO
01089   FREE_MEMORY(jconf->input.netaudio_devname);
01090 #endif  
01091   FREE_MEMORY(jconf->reject.gmm_filename);
01092   FREE_MEMORY(jconf->reject.gmm_reject_cmn_string);
01093 
01094   for(am=jconf->am_root;am;am=am->next) {
01095     FREE_MEMORY(am->hmmfilename);
01096     FREE_MEMORY(am->mapfilename);
01097     FREE_MEMORY(am->spmodel_name);
01098     FREE_MEMORY(am->hmm_gs_filename);
01099     FREE_MEMORY(am->analysis.cmnload_filename);
01100     FREE_MEMORY(am->analysis.cmnsave_filename);
01101     FREE_MEMORY(am->frontend.ssload_filename);
01102   }
01103   for(lm=jconf->lm_root;lm;lm=lm->next) {
01104     FREE_MEMORY(lm->ngram_filename);
01105     FREE_MEMORY(lm->ngram_filename_lr_arpa);
01106     FREE_MEMORY(lm->ngram_filename_rl_arpa);
01107     FREE_MEMORY(lm->dfa_filename);
01108     FREE_MEMORY(lm->head_silname);
01109     FREE_MEMORY(lm->tail_silname);
01110     FREE_MEMORY(lm->iwspentry);
01111     FREE_MEMORY(lm->dictfilename);
01112     multigram_remove_gramlist(lm);
01113   }
01114   for(s=jconf->search_root;s;s=s->next) {
01115     FREE_MEMORY(s->successive.pausemodelname);
01116   }
01117 }
01118 
01119