libsent/src/dfa/init_dfa.c

Go to the documentation of this file.
00001 
00025 /*
00026  * Copyright (c) 1991-2006 Kawahara Lab., Kyoto University
00027  * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
00028  * Copyright (c) 2005-2006 Julius project team, Nagoya Institute of Technology
00029  * All rights reserved
00030  */
00031 
00032 #include <sent/stddefs.h>
00033 #include <sent/dfa.h>
00034 #include <sent/vocabulary.h>
00035 #include <sent/htk_hmm.h>
00036 
00037 /* read in dfa info from file */
00044 void
00045 init_dfa(DFA_INFO *dinfo, char *filename)
00046 {
00047   FILE *fd;
00048   
00049   j_printerr("Reading in DFA grammar...");
00050   if ((fd = fopen_readfile(filename)) == NULL) {
00051     j_error("failed to open %s\n",filename);
00052   }
00053   if (!rddfa(fd, dinfo)) {
00054     j_error("error in reading %s\n",filename);
00055   }
00056   if (fclose_readfile(fd) == -1) {
00057     j_error("close error\n");
00058   }
00059 
00060   j_printerr("done\n");
00061 }
00062 
00070 void
00071 make_dfa_voca_ref(DFA_INFO *dinfo, WORD_INFO *winfo)
00072 {
00073   WORD_ID i;
00074   boolean okflag = TRUE;
00075 
00076   j_printerr("Mapping dict item <-> DFA terminal (category)...");
00077   /* word -> terminal symbol */
00078   for (i = 0; i < winfo->num; i++) {
00079     winfo->wton[i] = dfa_symbol_lookup(dinfo, winfo->wname[i]);
00080     if (winfo->wton[i] == WORD_INVALID) {
00081       /* error: not found */
00082       j_printerr("Error: no such terminal symbol \"%s\" in DFA grammar:\n",
00083              winfo->wname[i]);
00084       put_voca(winfo, i);
00085       okflag = FALSE;
00086     }
00087   }
00088   if (!okflag) j_error("Error in dict <-> DFA mapping\n");
00089 
00090   /* terminal symbol -> word */
00091   make_terminfo(&(dinfo->term), dinfo, winfo);
00092   
00093   j_printerr("done\n");
00094 }
00095 
00103 void
00104 dfa_find_pause_word(DFA_INFO *dfa, WORD_INFO *winfo, HTK_HMM_INFO *hmminfo)
00105 {
00106   int i, t,p;
00107   WORD_ID w;
00108 
00109   dfa->sp_id = WORD_INVALID;
00110   dfa->is_sp = (boolean *)mymalloc(sizeof(boolean) * dfa->term_num);
00111   for(t=0;t<dfa->term_num;t++) dfa->is_sp[t] = FALSE;
00112   
00113   for(t=0;t<dfa->term_num;t++) {
00114     for(i=0;i<dfa->term.wnum[t]; i++) {
00115       w = dfa->term.tw[t][i];
00116       p = 0;
00117       while(p < winfo->wlen[w] && winfo->wseq[w][p] == hmminfo->sp) p++;
00118       if (p >= winfo->wlen[w]) {        /* w consists of only hmminfo->sp model */
00119         dfa->is_sp[t] = TRUE;
00120         if (dfa->sp_id == WORD_INVALID) dfa->sp_id = w;
00121         break;                  /* mark this category if at least 1 sp_word was found */
00122       }
00123     }
00124   }
00125 }
00126 
00134 void
00135 dfa_pause_word_append(DFA_INFO *dst, DFA_INFO *src, int coffset)
00136 {
00137   int i;
00138   /* dst info must be already appended */
00139   /* [coffset..dst->term_num-1] is the new categories */
00140   if (dst->term_num - coffset != src->term_num) {
00141     j_error("InternalError: appended term num not match!\n");
00142   }
00143   
00144   if (dst->is_sp == NULL) {
00145     dst->is_sp = (boolean *)mymalloc(sizeof(boolean) * dst->term_num);
00146   } else {
00147     dst->is_sp = (boolean *)myrealloc(dst->is_sp, sizeof(boolean) * dst->term_num);
00148   }
00149   for(i=0;i<src->term_num;i++) {
00150     dst->is_sp[coffset+i] = src->is_sp[i];
00151   }
00152   if (dst->sp_id == WORD_INVALID) {
00153     if (src->sp_id != WORD_INVALID) {/* src has pause word */
00154       dst->sp_id = src->sp_id;
00155     }
00156   }
00157 }

Generated on Tue Dec 26 16:16:33 2006 for Julius by  doxygen 1.5.0