00001
00018
00019
00020
00021
00022
00023
00024
00025 #include <sent/stddefs.h>
00026 #include <sent/htk_hmm.h>
00027 #include <sent/htk_param.h>
00028 #include <sent/hmm.h>
00029 #include <sent/hmm_calc.h>
00030
00031
00038 void
00039 put_htk_trans(FILE *fp, HTK_HMM_Trans *t)
00040 {
00041 int i,j;
00042
00043 if (fp == NULL) return;
00044 if (t == NULL) {
00045 fprintf(fp, "no transition\n");
00046 } else {
00047 for (i=0;i<t->statenum;i++) {
00048 for (j=0;j<t->statenum;j++) {
00049 fprintf(fp, " %e", t->a[i][j]);
00050 }
00051 fprintf(fp, "\n");
00052 }
00053 }
00054 }
00055
00062 void
00063 put_htk_var(FILE *fp, HTK_HMM_Var *v)
00064 {
00065 int i;
00066
00067 if (fp == NULL) return;
00068 if (v == NULL) {
00069 fprintf(fp, "no covariance\n");
00070 } else {
00071 fprintf(fp, "variance(%d): (may be inversed)", v->len);
00072 for (i=0;i<v->len;i++) {
00073 fprintf(fp, " %e", v->vec[i]);
00074 }
00075 fprintf(fp, "\n");
00076 }
00077 }
00078
00085 void
00086 put_htk_dens(FILE *fp, HTK_HMM_Dens *d)
00087 {
00088 int i;
00089
00090 if (fp == NULL) return;
00091 if (d == NULL) {
00092 fprintf(fp, "no dens\n");
00093 } else {
00094 fprintf(fp, "mean(%d):", d->meanlen);
00095 for (i=0;i<d->meanlen;i++) {
00096 fprintf(fp, " %e", d->mean[i]);
00097 }
00098 fprintf(fp, "\n");
00099 put_htk_var(fp, d->var);
00100 fprintf(fp, "gconst: %e\n", d->gconst);
00101 }
00102 }
00103
00110 void
00111 put_htk_mpdf(FILE *fp, HTK_HMM_PDF *m)
00112 {
00113 int i;
00114 GCODEBOOK *book;
00115
00116 if (m == NULL) {
00117 fprintf(fp, "no mixture pdf\n");
00118 return;
00119 }
00120 if (m->name != NULL) fprintf(fp, " [~p \"%s\"] (stream %d)\n", m->name, m->stream_id + 1);
00121 if (m->tmix) {
00122 book = (GCODEBOOK *)m->b;
00123 fprintf(fp, " tmix codebook = \"%s\" (size=%d)\n", book->name, book->num);
00124 for (i=0;i<m->mix_num;i++) {
00125 fprintf(fp, " weight%d = %f\n", i, exp(m->bweight[i]));
00126 }
00127 } else {
00128 for (i=0;i<m->mix_num;i++) {
00129 fprintf(fp, "-- d%d (weight=%f)--\n",i+1,exp(m->bweight[i]));
00130 put_htk_dens(fp, m->b[i]);
00131 }
00132 }
00133 }
00134
00141 void
00142 put_htk_state(FILE *fp, HTK_HMM_State *s)
00143 {
00144 int st;
00145
00146 if (fp == NULL) return;
00147 if (s == NULL) {
00148 fprintf(fp, "no output state\n");
00149 } else {
00150 if (s->name != NULL) fprintf(fp, "[~s \"%s\"]\n", s->name);
00151 for (st=0;st<s->nstream;st++) {
00152 fprintf(fp, "stream %d:", st + 1);
00153 if (s->w != NULL) {
00154 fprintf(fp, " (weight=%f", s->w->weight[st]);
00155 if (s->w->name != NULL) {
00156 fprintf(fp, " <- ~w \"%s\"", s->w->name);
00157 }
00158 fprintf(fp, ")");
00159 }
00160 fprintf(fp, "\n");
00161 put_htk_mpdf(fp, s->pdf[st]);
00162 }
00163 }
00164 }
00165
00172 void
00173 put_htk_hmm(FILE *fp, HTK_HMM_Data *h)
00174 {
00175 int i;
00176
00177 if (fp == NULL) return;
00178 fprintf(fp, "name: %s\n", h->name);
00179 fprintf(fp, "state num: %d\n", h->state_num);
00180 for (i=0;i<h->state_num;i++) {
00181 fprintf(fp, "**** state %d ****\n",i+1);
00182 put_htk_state(fp, h->s[i]);
00183 }
00184 put_htk_trans(fp, h->tr);
00185 }
00186
00193 void
00194 put_logical_hmm(FILE *fp, HMM_Logical *logical)
00195 {
00196 if (fp == NULL) return;
00197 fprintf(fp, "name: %s\n", logical->name);
00198 if (logical->is_pseudo) {
00199 fprintf(fp, "mapped to: %s (pseudo)\n", logical->body.pseudo->name);
00200 } else {
00201 fprintf(fp, "mapped to: %s\n", logical->body.defined->name);
00202 }
00203 }
00204
00211 void
00212 put_hmm_arc(FILE *fp, HMM *d)
00213 {
00214 A_CELL *ac;
00215 int i;
00216
00217 if (fp == NULL) return;
00218 fprintf(fp, "total len: %d\n", d->len);
00219 for (i=0;i<d->len;i++) {
00220 fprintf(fp, "node-%d\n", i);
00221 for (ac=d->state[i].ac;ac;ac=ac->next) {
00222 fprintf(fp, " arc: %d %f (%f)\n",ac->arc, ac->a, pow(10.0, ac->a));
00223 }
00224 }
00225 if (d->accept_ac_a != LOG_ZERO) {
00226 fprintf(fp, "last arc to accept state: %f\n", d->accept_ac_a);
00227 }
00228 }
00229
00236 void
00237 put_hmm_outprob(FILE *fp, HMM *d)
00238 {
00239 int i;
00240
00241 if (fp == NULL) return;
00242 fprintf(fp, "total len: %d\n", d->len);
00243 for (i=0;i<d->len;i++) {
00244 fprintf(fp, "n%d\n", i);
00245 if (d->state[i].is_pseudo_state) {
00246 fprintf(fp, "[[[pseudo state cluster with %d states]]]\n", d->state[i].out.cdset->num);
00247 } else {
00248 put_htk_state(fp, d->state[i].out.state);
00249 }
00250 }
00251 }
00252
00259 void
00260 put_hmm(FILE *fp, HMM *d)
00261 {
00262 if (fp == NULL) return;
00263 put_hmm_arc(fp, d);
00264 put_hmm_outprob(fp, d);
00265 }
00266
00273 void
00274 put_param_head(FILE *fp, HTK_Param_Header *h)
00275 {
00276 char buf[128];
00277
00278 if (fp == NULL) return;
00279 fprintf(fp, "num of samples: %d\n", h->samplenum);
00280 fprintf(fp, "window shift: %d ms\n", h->wshift / 10000);
00281 fprintf(fp, "bytes per sample: %d\n", h->sampsize);
00282 fprintf(fp, "parameter type: %s\n", param_code2str(buf, h->samptype, FALSE));
00283 }
00284
00293 void
00294 put_vec(FILE *fp, VECT **p, int num, short veclen)
00295 {
00296 int t,v;
00297
00298 if (fp == NULL) return;
00299 for (t=0;t<num;t++) {
00300 fprintf(fp, "%d:\t%8.3f",t,p[t][0]);
00301 for (v=1;v<veclen;v++) {
00302 if ((v % 10) ==0) fprintf(fp, "\n\t");
00303 fprintf(fp, "%8.3f", p[t][v]);
00304 }
00305 fprintf(fp, "\n");
00306 }
00307 }
00308
00315 void
00316 put_param(FILE *fp, HTK_Param *pinfo)
00317 {
00318 if (fp == NULL) return;
00319 put_param_head(fp, &(pinfo->header));
00320 put_vec(fp, pinfo->parvec, pinfo->samplenum, pinfo->veclen);
00321 }
00322
00329 void
00330 put_param_info(FILE *fp, HTK_Param *pinfo)
00331 {
00332 HTK_Param_Header *h;
00333 float sec;
00334
00335 if (fp == NULL) return;
00336 h = &(pinfo->header);
00337 sec = (float)h->samplenum * (float)h->wshift / 10000000;
00338 fprintf(fp, "length: %d frames (%.2f sec.)\n", h->samplenum, sec);
00339 }
00340
00347 void
00348 print_hmmdef_info(FILE *fp, HTK_HMM_INFO *hmminfo)
00349 {
00350 char buf[128];
00351 int i, d;
00352
00353 if (fp == NULL) return;
00354 fprintf(fp, " HMM Info:\n");
00355 fprintf(fp, " %d models, %d states, %d mpdfs, %d Gaussians are defined\n", hmminfo->totalhmmnum, hmminfo->totalstatenum, hmminfo->totalpdfnum, hmminfo->totalmixnum);
00356 fprintf(fp, "\t model type = ");
00357 if (hmminfo->is_tied_mixture) fprintf(fp, "has tied-mixture, ");
00358 if (hmminfo->opt.stream_info.num > 1) fprintf(fp, "multi-stream, ");
00359 #ifdef ENABLE_MSD
00360 if (hmminfo->has_msd) fprintf(fp, "MSD-HMM, ");
00361 #endif
00362 fprintf(fp, "context dependency handling %s\n",
00363 (hmminfo->is_triphone) ? "ON" : "OFF");
00364
00365 fprintf(fp, " training parameter = %s\n",param_code2str(buf, hmminfo->opt.param_type, FALSE));
00366 fprintf(fp, "\t vector length = %d\n", hmminfo->opt.vec_size);
00367 fprintf(fp, "\tnumber of stream = %d\n", hmminfo->opt.stream_info.num);
00368 fprintf(fp, "\t stream info =");
00369 for(d=0,i=0;i<hmminfo->opt.stream_info.num;i++) {
00370 if (hmminfo->opt.stream_info.vsize[i] == 1) {
00371 fprintf(fp, " [%d]", d);
00372 } else {
00373 fprintf(fp, " [%d-%d]", d, d + hmminfo->opt.stream_info.vsize[i] - 1);
00374 }
00375 d += hmminfo->opt.stream_info.vsize[i];
00376 }
00377 fprintf(fp, "\n");
00378 fprintf(fp, "\tcov. matrix type = %s\n", get_cov_str(hmminfo->opt.cov_type));
00379 fprintf(fp, "\t duration type = %s\n", get_dur_str(hmminfo->opt.dur_type));
00380
00381 if (hmminfo->is_tied_mixture) {
00382 fprintf(fp, "\t codebook num = %d\n", hmminfo->codebooknum);
00383 fprintf(fp, " max codebook size = %d\n", hmminfo->maxcodebooksize);
00384 }
00385 fprintf(fp, "\tmax mixture size = %d Gaussians\n", hmminfo->maxmixturenum);
00386 fprintf(fp, " max length of model = %d states\n", hmminfo->maxstatenum);
00387
00388 fprintf(fp, " logical base phones = %d\n", hmminfo->basephone.num);
00389
00390 fprintf(fp, " model skip trans. = ");
00391 if (hmminfo->need_multipath) {
00392 fprintf(fp, "exist, require multi-path handling\n");
00393 } else {
00394 fprintf(fp, "not exist, no multi-path handling\n");
00395 }
00396
00397 if (hmminfo->need_multipath) {
00398 fprintf(fp, " skippable models =");
00399 {
00400 HTK_HMM_Data *dtmp;
00401 int n = 0;
00402 for (dtmp = hmminfo->start; dtmp; dtmp = dtmp->next) {
00403 if (is_skippable_model(dtmp)) {
00404 fprintf(fp, " %s", dtmp->name);
00405 n++;
00406 }
00407 }
00408 if (n == 0) {
00409 fprintf(fp, " none\n");
00410 } else {
00411 fprintf(fp, " (%d model(s))\n", n);
00412 }
00413 }
00414 }
00415 }