00001
00025
00026
00027
00028
00029
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
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
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
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
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]) {
00119 dfa->is_sp[t] = TRUE;
00120 if (dfa->sp_id == WORD_INVALID) dfa->sp_id = w;
00121 break;
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
00139
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) {
00154 dst->sp_id = src->sp_id;
00155 }
00156 }
00157 }