00001
00017
00018
00019
00020
00021
00022
00023
00024 #include <julius.h>
00025
00026 #define PHSTEP 10
00027
00028
00079 static HMM_Logical **
00080 new_str2phseq(char *str, HTK_HMM_INFO *hmminfo, int *len_ret)
00081 {
00082 char **tokens;
00083 boolean *word_end;
00084 int phnum;
00085 boolean word_mode = FALSE;
00086 HMM_Logical **new;
00087 static char buf[MAX_HMMNAME_LEN];
00088
00089
00090 {
00091 char *p;
00092 int tokenmax;
00093 tokenmax = PHSTEP;
00094 tokens = (char **)mymalloc(sizeof(char *) * tokenmax);
00095 word_end = (boolean *)mymalloc(sizeof(boolean) * tokenmax);
00096 phnum = 0;
00097 for(p = first_token(str); p; p = next_token_if_any()) {
00098 if (strmatch(p, "|")) {
00099 word_mode = TRUE;
00100 if (phnum > 0) word_end[phnum-1] = TRUE;
00101 continue;
00102 }
00103 if (phnum >= tokenmax) {
00104 tokenmax += PHSTEP;
00105 tokens = (char **)myrealloc(tokens, sizeof(char *) * tokenmax);
00106 word_end = (boolean *)myrealloc(word_end, sizeof(boolean) * tokenmax);
00107 }
00108 tokens[phnum] = strcpy((char *)mymalloc(strlen(p)+1), p);
00109 word_end[phnum] = FALSE;
00110 phnum++;
00111 }
00112 if (phnum == 0) {
00113 j_printf("failed: no phone specified\n");
00114 new = NULL;
00115 goto spend;
00116 }
00117 word_end[phnum-1] = TRUE;
00118 }
00119
00120 {
00121 BASEPHONE *ph;
00122 int i;
00123 boolean ok_flag = TRUE;
00124 for (i=0;i<phnum;i++) {
00125 ph = aptree_search_data(tokens[i], hmminfo->basephone.root);
00126 if (! strmatch(ph->name, tokens[i])) {
00127 j_printf(" %2d: unknown phone \"%s\"\n", i+1, tokens[i]);
00128 ok_flag = FALSE;
00129 continue;
00130 }
00131 }
00132 if (! ok_flag) {
00133 j_printf("failed\n");
00134 new = NULL;
00135 goto spend;
00136 }
00137 }
00138
00139
00140 {
00141 int i;
00142 char *hmmstr;
00143 HMM_Logical *lg;
00144 boolean ok_flag = TRUE;
00145
00146 new = (HMM_Logical **)mymalloc(sizeof(HMM_Logical *) * phnum);
00147
00148
00149
00150 j_printf("\n id original logical physical/pseudo\n");
00151 j_printf(" -------------------------------------------------\n");
00152
00153
00154 if (hmminfo->is_triphone) {
00155 cycle_triphone(NULL);
00156 cycle_triphone(tokens[0]);
00157 for (i = 0; i < phnum; i++) {
00158 if (i < phnum - 1) {
00159 hmmstr = cycle_triphone(tokens[i+1]);
00160 } else {
00161 hmmstr = cycle_triphone_flush();
00162 }
00163 lg = htk_hmmdata_lookup_logical(hmminfo, hmmstr);
00164 if (lg == NULL) {
00165 if (word_mode) {
00166 if (i > 0 && word_end[i-1]) {
00167 if (word_end[i]) {
00168 center_name(hmmstr, buf);
00169 } else {
00170 rightcenter_name(hmmstr, buf);
00171 }
00172 } else if (word_end[i]) {
00173 leftcenter_name(hmmstr, buf);
00174 }
00175 lg = htk_hmmdata_lookup_logical(hmminfo, buf);
00176 if (lg == NULL) {
00177 j_printf("InternalError: no defined/pseudo HMM for \"%s\"??\n", buf);
00178 ok_flag = FALSE;
00179 continue;
00180 }
00181 if (lg->is_pseudo) {
00182 j_printf(" %2d: %11s -> (pseudo) -> {%s}\n", i+1, hmmstr, lg->body.pseudo->name);
00183 } else {
00184 j_printf(" %2d: %11s -> %8s -> [%s]\n", i+1, hmmstr, lg->name, lg->body.defined->name);
00185 }
00186 } else {
00187 j_printf(" UNKNOWN %2d: (%s)\n", i+1, hmmstr);
00188 ok_flag = FALSE;
00189 continue;
00190 }
00191 } else {
00192 if (lg->is_pseudo) {
00193 j_printf(" %2d: %11s -> (pseudo) -> {%s}\n", i+1, hmmstr, lg->body.pseudo->name);
00194 } else {
00195 j_printf(" %2d: %11s -> %8s -> [%s]\n", i+1, hmmstr, " ", lg->body.defined->name);
00196 }
00197 }
00198 new[i] = lg;
00199 }
00200 } else {
00201 for (i = 0; i < phnum; i++) {
00202 lg = htk_hmmdata_lookup_logical(hmminfo, tokens[i]);
00203 if (lg == NULL) {
00204 j_printf("%2d: unknown logical HMM \"%s\"\n", i+1, tokens[i]);
00205 ok_flag = FALSE;
00206 continue;
00207 }
00208 new[i] = lg;
00209 }
00210 }
00211 if (ok_flag) {
00212 j_printf("succeeded\n");
00213 } else {
00214 j_printf("failed\n");
00215 free(new);
00216 new = NULL;
00217 goto spend;
00218 }
00219
00220 }
00221
00222 spend:
00223 {
00224 int i;
00225 for(i=0;i<phnum;i++) {
00226 free(tokens[i]);
00227 }
00228 free(tokens);
00229 free(word_end);
00230 }
00231
00232 *len_ret = phnum;
00233
00234 return new;
00235 }
00236
00251 static void
00252 test_expand_triphone(HTK_HMM_INFO *hmminfo)
00253 {
00254 char *buf;
00255 int newline;
00256 HMM_Logical **phseq;
00257 int phlen;
00258
00259 buf = (char *)mymalloc(4096);
00260 for(;;) {
00261
00262 j_printf(">>> input phone sequence (word delimiter is `|', blank to return)\n");
00263 if (fgets(buf, 4096, stdin) == NULL) break;
00264 newline = strlen(buf)-1;
00265 if (buf[newline] == '\n') buf[newline] = '\0';
00266 if (buf[0] == '\0') break;
00267
00268 phseq = new_str2phseq(buf, hmminfo, &phlen);
00269 if (phseq == NULL) continue;
00270 }
00271 free(buf);
00272 }
00273
00288 void
00289 hmm_check(HTK_HMM_INFO *hmminfo, WORD_INFO *winfo)
00290 {
00291 boolean endflag;
00292 static char cmd[MAX_HMMNAME_LEN];
00293 int newline;
00294
00295 j_printf("\n\n");
00296 j_printf("*************************************************\n");
00297 j_printf("******** TRIPHONE COHERENCE CHECK MODE ********\n");
00298 j_printf("*************************************************\n");
00299 j_printf("\n");
00300
00301 j_printf("hmmdefs=%s\n", hmmfilename);
00302 if (mapfilename != NULL) {
00303 j_printf("hmmlist=%s\n", mapfilename);
00304 }
00305 j_printf("dict=%s\n", dictfilename);
00306 j_printf("headsil = "); put_voca(winfo, winfo->head_silwid);
00307 j_printf("tailsil = "); put_voca(winfo, winfo->tail_silwid);
00308
00309 make_base_phone(hmminfo, winfo);
00310 print_phone_info(hmminfo);
00311
00312 for(endflag = FALSE; endflag == FALSE;) {
00313 j_printf("===== command (\"H\" for help) > ");
00314 if (fgets(cmd, MAX_HMMNAME_LEN, stdin) == NULL) continue;
00315 newline = strlen(cmd)-1;
00316 if (cmd[newline] == '\n') cmd[newline] = '\0';
00317 if (cmd[0] == '\0') continue;
00318
00319 switch(cmd[0]) {
00320 case 'a':
00321
00322 test_interword_triphone(hmminfo, winfo);
00323 break;
00324 case 'c':
00325
00326 test_expand_triphone(hmminfo);
00327 break;
00328 case 'i':
00329
00330 j_printf("hmmdefs=%s\n", hmmfilename);
00331 if (mapfilename != NULL) {
00332 j_printf("hmmlist=%s\n", mapfilename);
00333 }
00334 j_printf("dict=%s\n", dictfilename);
00335 j_printf("headsil = "); put_voca(winfo, winfo->head_silwid);
00336 j_printf("tailsil = "); put_voca(winfo, winfo->tail_silwid);
00337 print_phone_info(hmminfo);
00338 break;
00339 case 'p':
00340
00341 print_all_basephone_name(&(hmminfo->basephone));
00342 break;
00343 case 'd':
00344
00345 print_all_basephone_detail(&(hmminfo->basephone));
00346 break;
00347 case 'H':
00348 j_printf("COMMANDS:\n");
00349 j_printf("info --- output HMM information\n");
00350 j_printf("conv --- try HMM conversion for given phone sequence\n");
00351 j_printf("phonelist --- print base phone list\n");
00352 j_printf("all --- check if all possible IW-triphone is covered\n");
00353 j_printf("quit --- quit\n");
00354 break;
00355 case 'q':
00356
00357 endflag = TRUE;
00358 break;
00359 }
00360 }
00361 j_printf("\n");
00362 j_printf("*************************************************\n");
00363 j_printf("***** END OF TRIPHONE COHERENCE CHECK MODE ****\n");
00364 j_printf("*************************************************\n");
00365 j_printf("\n");
00366 }