📄 dict2pid.c
字号:
pronlen = dict_pronlen(dict, w); if (pronlen < 0) E_FATAL("Pronunciation-length(%s)= %d\n", dict_wordstr(dict, w), pronlen); n += pronlen; } internal = (s3ssid_t *) ckd_calloc (n, sizeof(s3ssid_t)); /* Temporary */ ldiph = (s3ssid_t **) ckd_calloc_2d (mdef->n_ciphone, mdef->n_ciphone, sizeof(s3ssid_t)); rdiph = (s3ssid_t **) ckd_calloc_2d (mdef->n_ciphone, mdef->n_ciphone, sizeof(s3ssid_t)); single = (s3ssid_t *) ckd_calloc (mdef->n_ciphone, sizeof(s3ssid_t)); for (b = 0; b < mdef->n_ciphone; b++) { for (l = 0; l < mdef->n_ciphone; l++) { for (r = 0; r < mdef->n_ciphone; r++) dict2pid->ldiph_lc[b][r][l] = BAD_S3SSID; dict2pid->single_lc[b][l] = BAD_S3SSID; ldiph[b][l] = BAD_S3SSID; rdiph[b][l] = BAD_S3SSID; } single[b] = BAD_S3SSID; } for (w = 0; w < dict_size(dict); w++) { dict2pid->internal[w] = internal; pronlen = dict_pronlen(dict,w); if (pronlen >= 2) { b = dict_pron(dict, w, 0); r = dict_pron(dict, w, 1); if (NOT_S3SSID(ldiph[b][r])) { g = ldiph_comsseq(mdef, b, r); ldiph[b][r] = ssidlist2comsseq (g, mdef, dict2pid, hs, hp); glist_free (g); for (l = 0; l < mdef_n_ciphone(mdef); l++) { p = mdef_phone_id_nearest (mdef, (s3cipid_t)b, (s3cipid_t)l, (s3cipid_t)r, WORD_POSN_BEGIN); dict2pid->ldiph_lc[b][r][l] = mdef_pid2ssid(mdef, p); } } internal[0] = ldiph[b][r]; for (i = 1; i < pronlen-1; i++) { l = b; b = r; r = dict_pron(dict, w, i+1); p = mdef_phone_id_nearest(mdef, (s3cipid_t)b, (s3cipid_t)l, (s3cipid_t)r, WORD_POSN_INTERNAL); internal[i] = mdef_pid2ssid(mdef, p); } l = b; b = r; if (NOT_S3SSID(rdiph[b][l])) { g = rdiph_comsseq(mdef, b, l); rdiph[b][l] = ssidlist2comsseq (g, mdef, dict2pid, hs, hp); glist_free (g); } internal[pronlen-1] = rdiph[b][l]; } else if (pronlen == 1) { b = dict_pron(dict, w, 0); if (NOT_S3SSID(single[b])) { g = single_comsseq(mdef, b); single[b] = ssidlist2comsseq (g, mdef, dict2pid, hs, hp); glist_free (g); for (l = 0; l < mdef_n_ciphone(mdef); l++) { g = single_lc_comsseq(mdef, b, l); dict2pid->single_lc[b][l] = ssidlist2comsseq (g, mdef, dict2pid, hs, hp); glist_free (g); } } internal[0] = single[b]; } internal += pronlen; } ckd_free_2d ((void **) ldiph); ckd_free_2d ((void **) rdiph); ckd_free ((void *) single); /* Allocate space for composite state table */ cslen = (int32 *) ckd_calloc (dict2pid->n_comstate, sizeof(int32)); g = hash_tolist(hs, &n); assert (n == dict2pid->n_comstate); n = 0; for (gn = g; gn; gn = gnode_next(gn)) { he = (hash_entry_t *) gnode_ptr (gn); sen = (s3senid_t *) hash_entry_key(he); for (i = 0; IS_S3SENID(sen[i]); i++); cslen[hash_entry_val(he)] = i+1; /* +1 for terminating sentinel */ n += (i+1); } dict2pid->comstate = (s3senid_t **) ckd_calloc (dict2pid->n_comstate, sizeof(s3senid_t *)); sen = (s3senid_t *) ckd_calloc (n, sizeof(s3senid_t)); for (i = 0; i < dict2pid->n_comstate; i++) { dict2pid->comstate[i] = sen; sen += cslen[i]; } /* Build composite state table from hash table hs */ for (gn = g; gn; gn = gnode_next(gn)) { he = (hash_entry_t *) gnode_ptr (gn); sen = (s3senid_t *) hash_entry_key(he); i = hash_entry_val(he); for (j = 0; j < cslen[i]; j++) dict2pid->comstate[i][j] = sen[j]; assert (sen[j-1] == BAD_S3SENID); ckd_free ((void *)sen); } ckd_free (cslen); glist_free (g); hash_free (hs); /* Allocate space for composite sseq table */ dict2pid->comsseq = (s3senid_t **) ckd_calloc (dict2pid->n_comsseq, sizeof(s3senid_t *)); g = hash_tolist (hp, &n); assert (n == dict2pid->n_comsseq); /* Build composite sseq table */ for (gn = g; gn; gn = gnode_next(gn)) { he = (hash_entry_t *) gnode_ptr (gn); i = hash_entry_val(he); dict2pid->comsseq[i] = (s3senid_t *) hash_entry_key(he); } glist_free (g); hash_free (hp); /* Weight for each composite state */ dict2pid->comwt = (int32 *) ckd_calloc (dict2pid->n_comstate, sizeof(int32)); for (i = 0; i < dict2pid->n_comstate; i++) { sen = dict2pid->comstate[i]; for (j = 0; IS_S3SENID(sen[j]); j++);#if 0 /* if comstate i has N states, its weight= (1/N^2) (Major Hack!!) */ dict2pid->comwt[i] = - (logs3 ((float64)j) << 1);#else /* if comstate i has N states, its weight= 1/N */ dict2pid->comwt[i] = - logs3 ((float64)j);#endif } E_INFO("%d composite states; %d composite sseq\n", dict2pid->n_comstate, dict2pid->n_comsseq); return dict2pid;}void dict2pid_comsenscr (dict2pid_t *d2p, int32 *senscr, int32 *comsenscr){ int32 i, j; int32 best; s3senid_t *comstate, k; for (i = 0; i < d2p->n_comstate; i++) { comstate = d2p->comstate[i]; best = senscr[comstate[0]]; for (j = 1;; j++) { k = comstate[j]; if (NOT_S3SENID(k)) break; if (best < senscr[k]) best = senscr[k]; } comsenscr[i] = best + d2p->comwt[i]; }}void dict2pid_comsseq2sen_active (dict2pid_t *d2p, mdef_t *mdef, int32 *comssid, int32 *sen){ int32 ss, cs, i, j; s3senid_t *csp, *sp; /* Composite state pointer */ for (ss = 0; ss < d2p->n_comsseq; ss++) { if (comssid[ss]) { csp = d2p->comsseq[ss]; for (i = 0; i < mdef_n_emit_state(mdef); i++) { cs = csp[i]; sp = d2p->comstate[cs]; for (j = 0; IS_S3SENID(sp[j]); j++) sen[sp[j]] = 1; } } }}void dict2pid_dump (FILE *fp, dict2pid_t *d2p, mdef_t *mdef, dict_t *dict){ int32 w, p, pronlen; int32 i, j, b, l, r; fprintf (fp, "# INTERNAL (wd comssid ssid ssid ... ssid comssid)\n"); for (w = 0; w < dict_size(dict); w++) { fprintf (fp, "%30s ", dict_wordstr(dict, w)); pronlen = dict_pronlen(dict, w); for (p = 0; p < pronlen; p++) fprintf (fp, " %5d", d2p->internal[w][p]); fprintf (fp, "\n"); } fprintf (fp, "#\n"); fprintf (fp, "# LDIPH_LC (b r l ssid)\n"); for (b = 0; b < mdef_n_ciphone(mdef); b++) { for (r = 0; r < mdef_n_ciphone(mdef); r++) { for (l = 0; l < mdef_n_ciphone(mdef); l++) { if (IS_S3SSID(d2p->ldiph_lc[b][r][l])) fprintf (fp, "%6s %6s %6s %5d\n", mdef_ciphone_str (mdef, (s3cipid_t)b), mdef_ciphone_str (mdef, (s3cipid_t)r), mdef_ciphone_str (mdef, (s3cipid_t)l), d2p->ldiph_lc[b][r][l]); /* RAH, ldiph_lc is returning an int32, %d expects an int16 */ } } } fprintf (fp, "#\n"); fprintf (fp, "# SINGLE_LC (b l comssid)\n"); for (b = 0; b < mdef_n_ciphone(mdef); b++) { for (l = 0; l < mdef_n_ciphone(mdef); l++) { if (IS_S3SSID(d2p->single_lc[b][l])) fprintf (fp, "%6s %6s %5d\n", mdef_ciphone_str (mdef, (s3cipid_t)b), mdef_ciphone_str (mdef, (s3cipid_t)l), d2p->single_lc[b][l]); /* RAH, single_lc is returning an int32, %d expects an int16 */ } } fprintf (fp, "#\n"); fprintf (fp, "# SSEQ %d (senid senid ...)\n", mdef->n_sseq); for (i = 0; i < mdef->n_sseq; i++) { fprintf (fp, "%5d ", i); for (j = 0; j < mdef_n_emit_state(mdef); j++) fprintf (fp, " %5d", mdef->sseq[i][j]); fprintf (fp, "\n"); } fprintf (fp, "#\n"); fprintf (fp, "# COMSSEQ %d (comstate comstate ...)\n", d2p->n_comsseq); for (i = 0; i < d2p->n_comsseq; i++) { fprintf (fp, "%5d ", i); for (j = 0; j < mdef_n_emit_state(mdef); j++) fprintf (fp, " %5d", d2p->comsseq[i][j]); fprintf (fp, "\n"); } fprintf (fp, "#\n"); fprintf (fp, "# COMSTATE %d (senid senid ...)\n", d2p->n_comstate); for (i = 0; i < d2p->n_comstate; i++) { fprintf (fp, "%5d ", i); for (j = 0; IS_S3SENID(d2p->comstate[i][j]); j++) fprintf (fp, " %5d", d2p->comstate[i][j]); fprintf (fp, "\n"); } fprintf (fp, "#\n"); fprintf (fp, "# END\n"); fflush (fp);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -