⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dict2pid.c

📁 CMU大名鼎鼎的SPHINX-3大词汇量连续语音识别系统
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -