00001
00026
00027
00028
00029
00030
00031
00032
00033 #include <sent/stddefs.h>
00034 #include <sent/dfa.h>
00035 #include <sent/vocabulary.h>
00036 #include <sent/htk_hmm.h>
00037
00038
00045 boolean
00046 init_dfa(DFA_INFO *dinfo, char *filename)
00047 {
00048 FILE *fd;
00049
00050 if ((fd = fopen_readfile(filename)) == NULL) {
00051 jlog("Error: init_dfa: failed to open %s\n",filename);
00052 return FALSE;
00053 }
00054 if (!rddfa(fd, dinfo)) {
00055 jlog("Error; init_dfa: error in reading %s\n",filename);
00056 return FALSE;
00057 }
00058 if (fclose_readfile(fd) == -1) {
00059 jlog("Error: init_dfa: failed to close %s\n", filename);
00060 return FALSE;
00061 }
00062
00063 return TRUE;
00064 }
00065
00073 boolean
00074 make_dfa_voca_ref(DFA_INFO *dinfo, WORD_INFO *winfo)
00075 {
00076 WORD_ID i;
00077 boolean ok_flag = TRUE;
00078
00079
00080 for (i = 0; i < winfo->num; i++) {
00081 winfo->wton[i] = dfa_symbol_lookup(dinfo, winfo->wname[i]);
00082 if (winfo->wton[i] == WORD_INVALID) {
00083
00084 jlog("Error: init_dfa: no such terminal symbol \"%s\" in DFA grammar\n",
00085 winfo->wname[i]);
00086 put_voca(jlog_get_fp(), winfo, i);
00087 ok_flag = FALSE;
00088 }
00089 }
00090
00091 if (ok_flag) {
00092
00093 make_terminfo(&(dinfo->term), dinfo, winfo);
00094 }
00095
00096 return ok_flag;
00097 }
00098
00106 void
00107 dfa_find_pause_word(DFA_INFO *dfa, WORD_INFO *winfo, HTK_HMM_INFO *hmminfo)
00108 {
00109 int i, t,p;
00110 WORD_ID w;
00111
00112 dfa->sp_id = WORD_INVALID;
00113 dfa->is_sp = (boolean *)mymalloc(sizeof(boolean) * dfa->term_num);
00114 for(t=0;t<dfa->term_num;t++) dfa->is_sp[t] = FALSE;
00115
00116 for(t=0;t<dfa->term_num;t++) {
00117 for(i=0;i<dfa->term.wnum[t]; i++) {
00118 w = dfa->term.tw[t][i];
00119 p = 0;
00120 while(p < winfo->wlen[w] && winfo->wseq[w][p] == hmminfo->sp) p++;
00121 if (p >= winfo->wlen[w]) {
00122 dfa->is_sp[t] = TRUE;
00123 if (dfa->sp_id == WORD_INVALID) dfa->sp_id = w;
00124 break;
00125 }
00126 }
00127 }
00128 }
00129
00137 boolean
00138 dfa_pause_word_append(DFA_INFO *dst, DFA_INFO *src, int coffset)
00139 {
00140 int i;
00141
00142
00143 if (dst->term_num - coffset != src->term_num) {
00144 jlog("Error: init_dfa: appended term num not match!\n");
00145 return FALSE;
00146 }
00147
00148 if (dst->is_sp == NULL) {
00149 dst->is_sp = (boolean *)mymalloc(sizeof(boolean) * dst->term_num);
00150 } else {
00151 dst->is_sp = (boolean *)myrealloc(dst->is_sp, sizeof(boolean) * dst->term_num);
00152 }
00153 for(i=0;i<src->term_num;i++) {
00154 dst->is_sp[coffset+i] = src->is_sp[i];
00155 }
00156 if (dst->sp_id == WORD_INVALID) {
00157 if (src->sp_id != WORD_INVALID) {
00158 dst->sp_id = src->sp_id;
00159 }
00160 }
00161
00162 return TRUE;
00163 }
00164
00177 boolean
00178 read_grammar_from_socket(int sd, DFA_INFO **ret_dfa, WORD_INFO **ret_winfo, HTK_HMM_INFO *hmminfo)
00179 {
00180 DFA_INFO *dfa;
00181 WORD_INFO *winfo;
00182
00183
00184 dfa = dfa_info_new();
00185 if (!
00186 #ifdef WINSOCK
00187 rddfa_sd(sd, dfa)
00188 #else
00189 rddfa_fd(sd, dfa)
00190 #endif
00191 ) {
00192 return FALSE;
00193 }
00194 winfo = word_info_new();
00195
00196 if (!
00197 #ifdef WINSOCK
00198 voca_load_htkdict_sd(sd, winfo, hmminfo, FALSE)
00199 #else
00200 voca_load_htkdict_fd(sd, winfo, hmminfo, FALSE)
00201 #endif
00202 ) {
00203 dfa_info_free(dfa);
00204 return FALSE;
00205 }
00206 *ret_dfa = dfa;
00207 *ret_winfo = winfo;
00208 return TRUE;
00209 }