00001
00017
00018
00019
00020
00021
00022
00023
00024 #include <julius.h>
00025
00034 static void
00035 initialize_HMM()
00036 {
00037
00038
00039
00040
00041 hmminfo = hmminfo_new();
00042
00043 init_hmminfo(hmminfo, hmmfilename, mapfilename, ¶_hmm);
00044
00045
00046
00047 if (speech_input != SP_MFCFILE) {
00048
00049
00050 if ((hmminfo->opt.param_type & F_BASEMASK) != F_MFCC) {
00051 j_error("Error: for direct speech input, only HMM trained by MFCC is supported\n");
00052 }
00053
00054 calc_para_from_header(¶, hmminfo->opt.param_type, hmminfo->opt.vec_size);
00055 }
00056
00057 if (hmminfo->is_tied_mixture && hmminfo->codebooknum <= 0) {
00058 j_error("%s: this tied-mixture model has no codebook!?\n", EXECNAME);
00059 }
00060 #ifdef PASS1_IWCD
00061
00062 if (hmminfo->is_triphone) {
00063 j_printerr("Making pseudo bi/mono-phone for IW-triphone...");
00064 if (make_cdset(hmminfo) == FALSE) {
00065 j_error("\nError: failed to make context-dependent state set\n");
00066 }
00067
00068
00069 hmm_add_pseudo_phones(hmminfo);
00070 j_printerr("done\n");
00071 }
00072 #endif
00073
00074
00075 htk_hmm_set_pause_model(hmminfo, spmodel_name);
00076
00077
00078 if (!ccd_flag_force) {
00079 if (hmminfo->is_triphone) {
00080 ccd_flag = TRUE;
00081 } else {
00082 ccd_flag = FALSE;
00083 }
00084 }
00085
00086 hmminfo->cdset_method = iwcdmethod;
00087 hmminfo->cdmax_num = iwcdmaxn;
00088
00089 #ifdef MULTIPATH_VERSION
00090
00091 if (enable_iwsp) {
00092 if (hmminfo->sp == NULL) {
00093 j_error("cannot find short pause model \"%s\" in hmmdefs\n", spmodel_name);
00094 }
00095 hmminfo->iwsp_penalty = iwsp_penalty;
00096 }
00097 #endif
00098
00099 }
00100
00110 static void
00111 initialize_GSHMM()
00112 {
00113 j_printerr("Reading GS HMMs:\n");
00114 hmm_gs = hmminfo_new();
00115 undef_para(¶_dummy);
00116 init_hmminfo(hmm_gs, hmm_gs_filename, NULL, ¶_dummy);
00117 }
00118
00119
00131 static void
00132 initialize_GMM()
00133 {
00134 j_printerr("Reading GMM:\n");
00135 gmm = hmminfo_new();
00136 undef_para(¶_dummy);
00137 init_hmminfo(gmm, gmm_filename, NULL, ¶_dummy);
00138
00139 gmm_init(gmm, gmm_gprune_num);
00140 }
00141
00142
00153 static void
00154 initialize_dict()
00155 {
00156
00157 winfo = word_info_new();
00158
00159 if ( !
00160 #ifdef MONOTREE
00161
00162 init_voca(winfo, dictfilename, hmminfo, TRUE, forcedict_flag)
00163 #else
00164 init_voca(winfo, dictfilename, hmminfo, FALSE, forcedict_flag)
00165 #endif
00166 ) {
00167 j_error("ERROR: failed to read dictionary, terminated\n");
00168 }
00169
00170 #ifdef USE_NGRAM
00171
00172 if (enable_iwspword) {
00173 if (
00174 #ifdef MONOTREE
00175 voca_append_htkdict(iwspentry, winfo, hmminfo, TRUE)
00176 #else
00177 voca_append_htkdict(iwspentry, winfo, hmminfo, FALSE)
00178 #endif
00179 == FALSE) {
00180 j_error("Error: failed to make IW-sp word entry \"%s\"\n", iwspentry);
00181 } else {
00182 j_printerr("1 IW-sp word entry added\n");
00183 }
00184 }
00185
00186 winfo->head_silwid = voca_lookup_wid(head_silname, winfo);
00187 if (winfo->head_silwid == WORD_INVALID) {
00188 j_error("ERROR: head sil word \"%s\" not exist in voca\n", head_silname);
00189 }
00190 winfo->tail_silwid = voca_lookup_wid(tail_silname, winfo);
00191 if (winfo->tail_silwid == WORD_INVALID) {
00192 j_error("ERROR: tail sil word \"%s\" not exist in voca\n", tail_silname);
00193 }
00194 #endif
00195
00196 #ifdef PASS1_IWCD
00197 if (triphone_check_flag && hmminfo->is_triphone) {
00198
00199 hmm_check(hmminfo, winfo);
00200 }
00201 #endif
00202
00203
00204 }
00205
00206
00207 #ifdef USE_NGRAM
00208
00219 static void
00220 initialize_ngram()
00221 {
00222
00223 ngram = ngram_info_new();
00224
00225 if (ngram_filename != NULL) {
00226 init_ngram_bin(ngram, ngram_filename);
00227 } else {
00228 init_ngram_arpa(ngram, ngram_filename_lr_arpa, ngram_filename_rl_arpa);
00229 }
00230
00231
00232 make_voca_ref(ngram, winfo);
00233 }
00234
00235 #endif
00236
00237
00256 static void
00257 configure_param()
00258 {
00259 #ifdef USE_NGRAM
00260
00261 if (!lmp_specified) set_lm_weight();
00262 if (!lmp2_specified) set_lm_weight2();
00263 if (lmp_specified != lmp2_specified) {
00264 j_printerr("Warning: only -lmp or -lmp2 specified, LM weights may be unbalanced\n");
00265 }
00266 #endif
00267
00268 if (gprune_method == GPRUNE_SEL_UNDEF) {
00269 if (hmminfo->is_tied_mixture) {
00270
00271 #ifdef GPRUNE_DEFAULT_SAFE
00272 gprune_method = GPRUNE_SEL_SAFE;
00273 #elif GPRUNE_DEFAULT_HEURISTIC
00274 gprune_method = GPRUNE_SEL_HEURISTIC;
00275 #elif GPRUNE_DEFAULT_BEAM
00276 gprune_method = GPRUNE_SEL_BEAM;
00277 #endif
00278 } else {
00279
00280 gprune_method = GPRUNE_SEL_NONE;
00281 }
00282 }
00283 }
00284
00295 void
00296 select_result_output()
00297 {
00298 switch(result_output) {
00299 case SP_RESULT_TTY: setup_result_tty(); break;
00300 case SP_RESULT_MSOCK: setup_result_msock(); break;
00301 default:
00302 j_printerr("Internal Error: no such result output device: id = %d\n", result_output);
00303 break;
00304 }
00305
00306 }
00307
00308
00309
00310
00330 void
00331 final_fusion()
00332 {
00333 VERMES("###### build up system\n");
00334
00335
00336 initialize_HMM();
00337 if (hmm_gs_filename != NULL) initialize_GSHMM();
00338 if (gmm_filename != NULL) initialize_GMM();
00339 #ifdef USE_NGRAM
00340 initialize_dict();
00341 initialize_ngram();
00342 #endif
00343
00344
00345
00346 configure_param();
00347
00348
00349
00350
00351
00352 if (para_htk.loaded == 1) apply_para(¶, ¶_htk);
00353 if (para_hmm.loaded == 1) apply_para(¶, ¶_hmm);
00354 apply_para(¶, ¶_default);
00355
00356
00357 #ifdef USE_DFA
00358
00359
00360 if (dfa_filename != NULL && dictfilename != NULL) {
00361 multigram_add_gramlist(dfa_filename, dictfilename);
00362 }
00363 multigram_read_all_gramlist();
00364
00365
00366 multigram_exec();
00367
00368 #else
00369
00370 wchmm = wchmm_new();
00371 wchmm->ngram = ngram;
00372 wchmm->winfo = winfo;
00373 wchmm->hmminfo = hmminfo;
00374 #ifdef CATEGORY_TREE
00375 if (old_tree_function_flag) {
00376 build_wchmm(wchmm);
00377 } else {
00378 build_wchmm2(wchmm);
00379 }
00380 #else
00381 build_wchmm2(wchmm);
00382 #endif
00383
00384
00385 trellis_beam_width = set_beam_width(wchmm, specified_trellis_beam_width);
00386
00387 #endif
00388
00389 #ifdef MONOTREE
00390
00391
00392 if (hmminfo->is_triphone) {
00393 j_printerr("convert monophone dictionary to word-internal triphone...");
00394 if (voca_mono2tri(winfo, hmminfo) == FALSE) {
00395 j_error("failed\n");
00396 }
00397 j_printerr("done\n");
00398 }
00399 #endif
00400
00401
00402 if (hmm_gs_filename != NULL) {
00403 outprob_init(hmminfo, hmm_gs, gs_statenum, gprune_method, mixnum_thres);
00404 } else {
00405 outprob_init(hmminfo, NULL, 0, gprune_method, mixnum_thres);
00406 }
00407
00408
00409 bt_init(&backtrellis);
00410 #ifdef USE_NGRAM
00411 max_successor_cache_init(wchmm);
00412 #endif
00413 if (realtime_flag) {
00414 RealTimeInit();
00415 }
00416
00417 select_result_output();
00418
00419
00420 VERMES("All init successfully done\n\n");
00421 }