00001
00026
00027
00028
00029
00030
00031
00032
00033 #include <julius/julius.h>
00034
00048 boolean
00049 checkpath(char *filename)
00050 {
00051 if (access(filename, R_OK) == -1) {
00052 jlog("ERROR: m_chkparam: cannot access %s\n", filename);
00053 return FALSE;
00054 }
00055 return TRUE;
00056 }
00057
00094 boolean
00095 j_jconf_finalize(Jconf *jconf)
00096 {
00097 boolean ok_p;
00098 JCONF_LM *lm;
00099 JCONF_AM *am;
00100 JCONF_SEARCH *s, *hs;
00101
00102 ok_p = TRUE;
00103
00104
00105
00106 hs = NULL;
00107 for(s=jconf->search_root;s;s=s->next) {
00108 if (s->output.progout_flag) {
00109 hs = s;
00110 break;
00111 }
00112 }
00113 if (hs != NULL) {
00114 for(s=jconf->search_root;s;s=s->next) {
00115 s->output.progout_flag = hs->output.progout_flag;
00116 s->output.progout_interval = hs->output.progout_interval;
00117 }
00118 }
00119
00120
00121
00122
00123
00124
00125 for(s=jconf->search_root;s;s=s->next) {
00126 if (s->successive.enabled) {
00127 jconf->decodeopt.segment = TRUE;
00128 break;
00129 }
00130 }
00131 #ifdef GMM_VAD
00132
00133 if (jconf->reject.gmm_filename) {
00134 jconf->decodeopt.segment = TRUE;
00135 }
00136 #endif
00137
00138 for(lm = jconf->lm_root; lm; lm = lm->next) {
00139 if (lm->lmtype == LM_UNDEF) {
00140
00141 if (lm->ngram_filename_lr_arpa || lm->ngram_filename_rl_arpa || lm->ngram_filename) {
00142
00143 lm->lmtype = LM_PROB;
00144 lm->lmvar = LM_NGRAM;
00145 }
00146 if (lm->gramlist_root) {
00147
00148 if (lm->lmtype != LM_UNDEF) {
00149 jlog("ERROR: m_chkparam: LM conflicts: several LM of different type specified?\n");
00150 return FALSE;
00151 }
00152 lm->lmtype = LM_DFA;
00153 lm->lmvar = LM_DFA_GRAMMAR;
00154 }
00155 if (lm->dfa_filename) {
00156
00157 if (lm->lmtype != LM_UNDEF && lm->lmvar != LM_DFA_GRAMMAR) {
00158 jlog("ERROR: m_chkparam: LM conflicts: several LM of different type specified?\n");
00159 return FALSE;
00160 }
00161 lm->lmtype = LM_DFA;
00162 lm->lmvar = LM_DFA_GRAMMAR;
00163 }
00164 if (lm->wordlist_root) {
00165
00166 if (lm->lmtype != LM_UNDEF) {
00167 jlog("ERROR: m_chkparam: LM conflicts: several LM of different type specified?\n");
00168 return FALSE;
00169 }
00170 lm->lmtype = LM_DFA;
00171 lm->lmvar = LM_DFA_WORD;
00172 }
00173 }
00174 if (lm->lmtype == LM_UNDEF) {
00175 jlog("ERROR: m_chkparam: you should specify at least one LM to run Julius!\n");
00176 return FALSE;
00177 }
00178 if (lm->lmtype == LM_PROB) {
00179 if (lm->dictfilename == NULL) {
00180 jlog("ERROR: m_chkparam: needs dictionary file (-v dict_file)\n");
00181 ok_p = FALSE;
00182 }
00183 }
00184
00185 if (lm->dictfilename != NULL)
00186 if (!checkpath(lm->dictfilename)) ok_p = FALSE;
00187 if (lm->ngram_filename != NULL)
00188 if (!checkpath(lm->ngram_filename)) ok_p = FALSE;
00189 if (lm->ngram_filename_lr_arpa != NULL)
00190 if (!checkpath(lm->ngram_filename_lr_arpa)) ok_p = FALSE;
00191 if (lm->ngram_filename_rl_arpa != NULL)
00192 if (!checkpath(lm->ngram_filename_rl_arpa)) ok_p = FALSE;
00193 if (lm->dfa_filename != NULL)
00194 if (!checkpath(lm->dfa_filename)) ok_p = FALSE;
00195 }
00196
00197 for(am = jconf->am_root; am; am = am->next) {
00198
00199 if (am->hmmfilename == NULL) {
00200 jlog("ERROR: m_chkparam: needs HMM definition file (-h hmmdef_file)\n");
00201 ok_p = FALSE;
00202 }
00203
00204 if (am->hmmfilename != NULL)
00205 if (!checkpath(am->hmmfilename)) ok_p = FALSE;
00206 if (am->mapfilename != NULL)
00207 if (!checkpath(am->mapfilename)) ok_p = FALSE;
00208 if (am->hmm_gs_filename != NULL)
00209 if (!checkpath(am->hmm_gs_filename)) ok_p = FALSE;
00210
00211 if (am->frontend.ssload_filename != NULL)
00212 if (!checkpath(am->frontend.ssload_filename)) ok_p = FALSE;
00213 }
00214 if (jconf->reject.gmm_filename != NULL)
00215 if (!checkpath(jconf->reject.gmm_filename)) ok_p = FALSE;
00216 if (jconf->input.inputlist_filename != NULL) {
00217 if (jconf->input.speech_input != SP_RAWFILE && jconf->input.speech_input != SP_MFCFILE) {
00218 jlog("WARNING: m_chkparam: not file input, \"-filelist %s\" ignored\n", jconf->input.inputlist_filename);
00219 } else {
00220 if (!checkpath(jconf->input.inputlist_filename)) ok_p = FALSE;
00221 }
00222 }
00223
00224
00225 if (jconf->decodeopt.force_realtime_flag) {
00226 if (jconf->input.type == INPUT_VECTOR) {
00227 jlog("WARNING: m_chkparam: real-time concurrent processing is not needed on feature vector input\n");
00228 jlog("WARNING: m_chkparam: real-time flag has turned off\n");
00229 jconf->decodeopt.realtime_flag = FALSE;
00230 } else {
00231 jconf->decodeopt.realtime_flag = jconf->decodeopt.forced_realtime;
00232 }
00233 }
00234
00235
00236 if (jconf->decodeopt.realtime_flag) {
00237 for(am = jconf->am_root; am; am = am->next) {
00238 if (am->analysis.cmn_update == FALSE && am->analysis.cmnload_filename == NULL) {
00239 jlog("ERROR: m_chkparam: when \"-cmnnoupdate\", initial cepstral normalisation data should be given by \"-cmnload\"\n");
00240 ok_p = FALSE;
00241 }
00242 }
00243 }
00244
00245
00246 for(s=jconf->search_root;s;s=s->next) {
00247 lm = s->lmconf;
00248 am = s->amconf;
00249
00250
00251 if (lm->lmtype == LM_DFA && lm->lmvar == LM_DFA_WORD) {
00252
00253 s->ccd_handling = FALSE;
00254 s->force_ccd_handling = TRUE;
00255
00256 s->compute_only_1pass = TRUE;
00257 }
00258
00259
00260
00261
00262 if (am->iwcdmethod == IWCD_UNDEF) {
00263 switch(lm->lmtype) {
00264 case LM_PROB:
00265 am->iwcdmethod = IWCD_NBEST; break;
00266 case LM_DFA:
00267 am->iwcdmethod = IWCD_AVG; break;
00268 }
00269 }
00270
00271 }
00272
00273
00274
00275 for(s=jconf->search_root;s;s=s->next) {
00276 lm = s->lmconf;
00277 am = s->amconf;
00278 if (lm->lmtype != LM_PROB) {
00279
00280 if (s->lmp.lmp_specified) {
00281 jlog("WARNING: m_chkparam: \"-lmp\" only for N-gram, ignored\n");
00282 }
00283 if (s->lmp.lmp2_specified) {
00284 jlog("WARNING: m_chkparam: \"-lmp2\" only for N-gram, ignored\n");
00285 }
00286 if (s->lmp.lm_penalty_trans != 0.0) {
00287 jlog("WARNING: m_chkparam: \"-transp\" only for N-gram, ignored\n");
00288 }
00289 if (lm->head_silname && !strmatch(lm->head_silname, BEGIN_WORD_DEFAULT)) {
00290 jlog("WARNING: m_chkparam: \"-silhead\" only for N-gram, ignored\n");
00291 }
00292 if (lm->tail_silname && !strmatch(lm->tail_silname, END_WORD_DEFAULT)) {
00293 jlog("WARNING: m_chkparam: \"-siltail\" only for N-gram, ignored\n");
00294 }
00295 if (lm->enable_iwspword) {
00296 jlog("WARNING: m_chkparam: \"-iwspword\" only for N-gram, ignored\n");
00297 }
00298 if (lm->iwspentry && !strmatch(lm->iwspentry, IWSPENTRY_DEFAULT)) {
00299 jlog("WARNING: m_chkparam: \"-iwspentry\" only for N-gram, ignored\n");
00300 }
00301 #ifdef HASH_CACHE_IW
00302 if (s->pass1.iw_cache_rate != 10) {
00303 jlog("WARNING: m_chkparam: \"-iwcache\" only for N-gram, ignored\n");
00304 }
00305 #endif
00306 #ifdef SEPARATE_BY_UNIGRAM
00307 if (lm->separate_wnum != 150) {
00308 jlog("WARNING: m_chkparam: \"-sepnum\" only for N-gram, ignored\n");
00309 }
00310 #endif
00311 }
00312 if (lm->lmtype != LM_DFA) {
00313
00314 if (s->pass2.looktrellis_flag) {
00315 jlog("WARNING: m_chkparam: \"-looktrellis\" only for grammar, ignored\n");
00316 }
00317 if (s->output.multigramout_flag) {
00318 jlog("WARNING: m_chkparam: \"-multigramout\" only for grammar, ignored\n");
00319 }
00320 if (s->lmp.penalty1 != 0.0) {
00321 jlog("WARNING: m_chkparam: \"-penalty1\" only for grammar, ignored\n");
00322 }
00323 if (s->lmp.penalty2 != 0.0) {
00324 jlog("WARNING: m_chkparam: \"-penalty2\" only for grammar, ignored\n");
00325 }
00326 }
00327 }
00328
00329
00330
00331 if (!ok_p) {
00332 jlog("ERROR: m_chkparam: could not pass parameter check\n");
00333 } else {
00334 jlog("STAT: jconf successfully finalized\n");
00335 }
00336
00337 if (debug2_flag) {
00338 print_jconf_overview(jconf);
00339 }
00340
00341 return ok_p;
00342 }
00343
00368 static int
00369 default_width(HTK_HMM_INFO *hmminfo)
00370 {
00371 if (strmatch(JULIUS_SETUP, "fast")) {
00372 if (hmminfo->is_triphone) {
00373 if (hmminfo->is_tied_mixture) {
00374
00375 return(600);
00376 } else {
00377
00378 #ifdef PASS1_IWCD
00379 return(800);
00380 #else
00381
00382 return(1000);
00383 #endif
00384 }
00385 } else {
00386
00387 return(400);
00388 }
00389 } else {
00390 if (hmminfo->is_triphone) {
00391 if (hmminfo->is_tied_mixture) {
00392
00393 return(800);
00394 } else {
00395
00396 #ifdef PASS1_IWCD
00397 return(1500);
00398 #else
00399 return(1500);
00400 #endif
00401 }
00402 } else {
00403
00404 return(700);
00405 }
00406 }
00407 }
00408
00436 int
00437 set_beam_width(WCHMM_INFO *wchmm, int specified)
00438 {
00439 int width;
00440 int standard_width;
00441
00442 if (specified == 0) {
00443 jlog("WARNING: doing full search (can be extremely slow)\n");
00444 width = wchmm->n;
00445 } else if (specified == -1) {
00446 standard_width = default_width(wchmm->hmminfo);
00447 width = (int)(sqrt(wchmm->winfo->num) * 15.0);
00448 if (width > standard_width) width = standard_width;
00449
00450 if (width < MINIMAL_BEAM_WIDTH) {
00451 width = MINIMAL_BEAM_WIDTH;
00452 }
00453
00454 } else {
00455 width = specified;
00456 }
00457 if (width > wchmm->n) width = wchmm->n;
00458
00459 return(width);
00460 }
00461
00462