int32 model_def_write(model_def_t *mdef, const char *fn) { FILE *fp; uint32 n_ci; uint32 n_acmod; acmod_set_t *acmod_set; const char **attrib; acmod_id_t b; acmod_id_t l; acmod_id_t r; word_posn_t wp; uint32 p; char *wp2c = WORD_POSN_CHAR_MAP; uint32 i; fp = fopen(fn, "w"); if (fp == NULL) { E_ERROR_SYSTEM("Unable to open %s for writing", fn); return S3_ERROR; } acmod_set = mdef->acmod_set; fprintf(fp, "%s\n", MODEL_DEF_VERSION); n_ci = acmod_set_n_ci(acmod_set); fprintf(fp, "%u n_base\n", n_ci); fprintf(fp, "%u n_tri\n", acmod_set_n_multi(acmod_set)); fprintf(fp, "%u n_state_map\n", mdef->n_total_state); fprintf(fp, "%u n_tied_state\n", mdef->n_tied_state); fprintf(fp, "%u n_tied_ci_state\n", mdef->n_tied_ci_state); fprintf(fp, "%u n_tied_tmat\n", mdef->n_tied_tmat); fprintf(fp, "#\n# Columns definitions\n"); fprintf(fp, "#%4s %3s %3s %1s %6s %4s %s\n", "base", "lft", "rt", "p", "attrib", "tmat", " ... state id's ..."); n_acmod = acmod_set_n_acmod(acmod_set); for (p = 0; p < n_ci; p++) { fprintf(fp, "%5s %3s %3s %1s", acmod_set_id2name(acmod_set, p), "-", "-", "-"); attrib = acmod_set_attrib(acmod_set, p); if ((attrib == NULL) || (attrib[0] == NULL)) { fprintf(fp, " %6s", "n/a"); } else { fprintf(fp, " %6s", attrib[0]); for (i = 1; attrib[i]; i++) { fprintf(fp, ",%s", attrib[i]); } } fprintf(fp, " %4d", mdef->defn[p].tmat); for (i = 0; i < mdef->defn[p].n_state; i++) { if (mdef->defn[p].state[i] == NO_ID) { fprintf(fp, " N"); } else { fprintf(fp, " %6u", mdef->defn[p].state[i]); } } fprintf(fp, "\n"); } for (; p < n_acmod; p++) { acmod_set_id2tri(acmod_set, &b, &l, &r, &wp, p); fprintf(fp, "%5s %3s %3s %c", acmod_set_id2name(acmod_set, b), acmod_set_id2name(acmod_set, l), acmod_set_id2name(acmod_set, r), wp2c[(uint32)wp]); attrib = acmod_set_attrib(acmod_set, p); if ((attrib == NULL) || (attrib[0] == NULL)) { fprintf(fp, " %6s", "n/a"); } else { fprintf(fp, " %6s", attrib[0]); for (i = 1; attrib[i]; i++) { fprintf(fp, ",%s", attrib[i]); } } fprintf(fp, " %4d", mdef->defn[p].tmat); for (i = 0; i < mdef->defn[p].n_state; i++) { if (mdef->defn[p].state[i] == NO_ID) { fprintf(fp, " N"); } else { fprintf(fp, " %6u", mdef->defn[p].state[i]); } } fprintf(fp, "\n"); } fclose(fp); return S3_SUCCESS; }
int main(int argc, char *argv[]) { model_def_t *imdef; model_def_t *omdef; pset_t *pset; uint32 n_pset; dtree_t ***tree; uint32 n_seno; uint32 n_ci; uint32 n_acmod; uint32 p; uint32 s; model_def_entry_t *idefn, *odefn; acmod_id_t b, l, r; word_posn_t wp; int allphones; parse_cmd_ln(argc, argv); if (init(&imdef, &pset, &n_pset, &tree, &n_seno) != S3_SUCCESS) return 1; omdef = (model_def_t *)ckd_calloc(1, sizeof(model_def_t)); omdef->acmod_set = imdef->acmod_set; /* same set of acoustic models */ omdef->n_total_state = imdef->n_total_state; omdef->n_tied_ci_state = imdef->n_tied_ci_state; omdef->n_tied_state = imdef->n_tied_ci_state + n_seno; omdef->n_tied_tmat = imdef->n_tied_tmat; omdef->defn = (model_def_entry_t *)ckd_calloc(imdef->n_defn, sizeof(model_def_entry_t)); /* * Define the context-independent models */ n_ci = acmod_set_n_ci(imdef->acmod_set); for (p = 0; p < n_ci; p++) { idefn = &imdef->defn[p]; odefn = &omdef->defn[p]; odefn->p = idefn->p; odefn->tmat = idefn->tmat; odefn->state = ckd_calloc(idefn->n_state, sizeof(uint32)); odefn->n_state = idefn->n_state; for (s = 0; s < idefn->n_state; s++) { if (idefn->state[s] == NO_ID) odefn->state[s] = NO_ID; else { odefn->state[s] = idefn->state[s]; } } } /* * Define the rest of the models */ allphones = cmd_ln_int32("-allphones"); n_acmod = acmod_set_n_acmod(omdef->acmod_set); for (; p < n_acmod; p++) { b = acmod_set_base_phone(omdef->acmod_set, p); assert(p != b); idefn = &imdef->defn[p]; odefn = &omdef->defn[p]; odefn->p = idefn->p; odefn->tmat = idefn->tmat; odefn->state = ckd_calloc(idefn->n_state, sizeof(uint32)); odefn->n_state = idefn->n_state; for (s = 0; s < idefn->n_state; s++) { if (idefn->state[s] == NO_ID) /* Non-emitting state */ odefn->state[s] = NO_ID; else { uint32 bb; /* emitting state: find the tied state */ acmod_set_id2tri(omdef->acmod_set, &b, &l, &r, &wp, p); #ifdef HORRIBLY_VERBOSE fprintf(stderr, "%s %u ", acmod_set_id2name(omdef->acmod_set, p), s); #endif bb = allphones ? 0 : b; odefn->state[s] = tied_state(&tree[bb][s]->node[0], b, l, r, wp, pset); #ifdef HORRIBLY_VERBOSE fprintf(stderr, "\t-> %u\n", odefn->state[s]); fprintf(stderr, "\n"); #endif } } } if (model_def_write(omdef, cmd_ln_str("-omoddeffn")) != S3_SUCCESS) { return 1; } return 0; }