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

📄 misc.c

📁 CMU大名鼎鼎的SPHINX-3大词汇量连续语音识别系统
💻 C
字号:
/* ==================================================================== * Copyright (c) 1995-2004 Carnegie Mellon University.  All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * This work was supported in part by funding from the Defense Advanced  * Research Projects Agency and the National Science Foundation of the  * United States of America, and the CMU Sphinx Speech Consortium. * * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ==================================================================== * *//* * misc.c -- Misc. routines (especially I/O) needed by many S3 applications. *  * ********************************************** * CMU ARPA Speech Project * * Copyright (c) 1996 Carnegie Mellon University. * ALL RIGHTS RESERVED. * ********************************************** *  * HISTORY *  * 11-Nov-96	M K Ravishankar (rkm@cs.cmu.edu) at Carnegie Mellon University * 		Created. */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include "misc.h"FILE *ctlfile_open (char *file){    FILE *fp;        if (! file)	E_FATAL("NULL file argument to ctlfile_open()\n");    if ((fp = fopen (file, "r")) == NULL)	E_FATAL("fopen(%s,r) failed\n", file);        return fp;}void ctlfile_close (FILE *ctlfp){    fclose (ctlfp);}int32 ctlfile_next (FILE *fp, char *ctlspec, int32 *sf, int32 *ef, char *uttid){    char line[1024];    int32 k;    char base[1024];        *sf = 0;    *ef = (int32)0x7ffffff0;    /* Read next non-comment or non-empty line */    for (;;) {	if (fgets (line, sizeof(line), fp) == NULL)	    return -1;		if ((line[0] != '#') &&	    ((k = sscanf (line, "%s %d %d %s", ctlspec, sf, ef, uttid)) > 0))	    break;    }        switch (k) {    case 1:	path2basename (ctlspec,base);	strcpy (uttid, base);	break;	    case 2:	E_FATAL("Bad control file line: %s\n", line);	break;	    case 3:	if ((*sf >= *ef) || (*sf < 0))	    E_FATAL("Bad control file line: %s\n", line);	path2basename (ctlspec,base);	sprintf (uttid, "%s_%d_%d", base, *sf, *ef);	break;	    case 4:	if ((*sf >= *ef) || (*sf < 0))	    E_FATAL("Bad control file line: %s\n", line);	break;	    default:	E_FATAL("Panic: How did I get here?\n");	break;    }        return 0;}int32 argfile_load (char *file, char *pgm, char ***argvout){    FILE *fp;    char line[1024], word[1024], *lp, **argv;    int32 len, n;    E_INFO("Reading arguments from %s\n", file);    if ((fp = fopen (file, "r")) == NULL) {	E_ERROR("fopen(%s,r) failed\n", file);	return -1;    }    /* Count #arguments */    n = 1;	/* Including pgm */    while (fgets (line, sizeof(line), fp) != NULL) {	if (line[0] == '#')	    continue;	lp = line;	while (sscanf (lp, "%s%n", word, &len) == 1) {	    lp += len;	    n++;	}    }        /* Allocate space for arguments */    argv = (char **) ckd_calloc (n+1, sizeof(char *));        /* Create argv list */    rewind (fp);    argv[0] = pgm;    n = 1;    while (fgets (line, sizeof(line), fp) != NULL) {	if (line[0] == '#')	    continue;	lp = line;	while (sscanf (lp, "%s%n", word, &len) == 1) {	    lp += len;	    argv[n] = ckd_salloc (word);	    n++;	}    }    argv[n] = NULL;    *argvout = argv;    fclose (fp);    return n;}static void hyp_free (srch_hyp_t *list){    srch_hyp_t *h;        while (list) {	h = list->next;	listelem_free ((char *)list, sizeof(srch_hyp_t));	list = h;    }}static srch_hyp_t *nbestfile_parseline (char *sent){    char *lp;    srch_hyp_t *head, *tail, *hyp;    char word[1024];    int32 k, sf, len, lscr;        head = tail = NULL;        lp = sent;    /* Parse T <score> */    if ((sscanf (lp, "%s%d%n", word, &k, &len) != 2) || (strcmp (word, "T") != 0)) {	E_ERROR("Bad sentence: %s\n", sent);	return NULL;    }    lp += len;        /* Parse A <score> */    if ((sscanf (lp, "%s%d%n", word, &k, &len) != 2) || (strcmp (word, "A") != 0)) {	E_ERROR("Bad sentence: %s\n", sent);	return NULL;    }    lp += len;        /* Parse L <score> */    if ((sscanf (lp, "%s%d%n", word, &lscr, &len) != 2) || (strcmp (word, "L") != 0)) {	E_ERROR("Bad sentence: %s\n", sent);	return NULL;    }    lp += len;        /* Parse each hyp word */    while ((k = sscanf (lp, "%d%s%n", &sf, word, &len)) == 2) {	lp += len;	hyp = (srch_hyp_t *) listelem_alloc (sizeof(srch_hyp_t));	hyp->word = (char *) ckd_salloc (word);	hyp->sf = sf;	hyp->lscr = lscr;	/* HACK!! Every entry has the TOTAL LM score */	hyp->next = NULL;	if (! head)	    head = hyp;	else	    tail->next = hyp;	tail = hyp;    }        if ((k > 0) || (sscanf (lp, "%s", word) > 0)) {	E_ERROR("Bad sentence: %s\n", sent);	hyp_free (head);	return NULL;    }        return head;}void nbestlist_free (srch_hyp_t **hyplist, int32 nhyp){    int32 i;        for (i = 0; i < nhyp; i++)	hyp_free (hyplist[i]);    ckd_free (hyplist);}#define NBEST_HYP_MAX		4092/* * Read an Nbest file and create an array of hypotheses (array of hyp_t lists). * Return value: #hypotheses read, -1 if unsuccessful. */int32 nbestfile_load (char *dir, char *uttid, srch_hyp_t ***hyplist_out){    char filename[1024];    FILE *fp;    srch_hyp_t **hyplist, *h, *nexth;    char line[65535], *lp, word[1024];    int32 k, nhyp, nfrm;    *hyplist_out = NULL;	/* Initialize to illegal value */        if ((! dir) || (! uttid) || (! hyplist_out)) {	E_ERROR("nbestfile_load: NULL argument\n");	return -1;    }        sprintf (filename, "%s/%s.nbest", dir, uttid);    if ((fp = fopen (filename, "r")) == NULL) {	E_ERROR("fopen(%s,r) failed\n", filename);	return -1;    }    E_INFO("Reading nbest file %s\n", filename);        hyplist = (srch_hyp_t **) ckd_calloc (NBEST_HYP_MAX, sizeof(srch_hyp_t *));    nhyp = 0;        /* Skip header comments in the file */    nfrm = -1;    while ((lp = fgets (line, sizeof(line), fp)) != NULL) {	k = strlen(line) - 1;	if (line[k] != '\n') {	    E_FATAL("Line does not end with newline (increase sizeof(line)?):\n%s\n",		    line);	}	if (line[0] != '#')	    break;	if ((sscanf (line+1, "%s%d", word, &k) == 2) && (strcmp (word, "frames") == 0))	    nfrm = k;    }    if (nfrm < 0) {	E_ERROR("frames parameter missing in header in %s\n", filename);	goto load_error;    }    if (! lp) {	E_ERROR("Premature EOF(%s)\n", filename);	goto load_error;    }        while ((line[0] == 'T') && (line[1] == ' ')) {	if (nhyp >= NBEST_HYP_MAX)	    E_FATAL("Increase NBEST_HYP_MAX\n");		if ((hyplist[nhyp] = nbestfile_parseline (line)) == NULL)	    goto load_error;		nhyp++;		/* Fill in end frame information in hyp */	for (h = hyplist[nhyp]; h; h = nexth) {	    nexth = h->next;	    h->ef = nexth ? nexth->sf - 1 : nfrm-1;	    if (h->ef >= nfrm) {		E_ERROR("%s: Start frame value (%d) >= #frames in header (%d)\n",			filename, h->ef+1, nfrm);		goto load_error;	    }	}		if ((lp = fgets (line, sizeof(line), fp)) == NULL)	    break;	k = strlen(line) - 1;	if (line[k] != '\n') {	    E_FATAL("Line does not end with newline (increase sizeof(line)?):\n%s\n",		    line);	}    }    if ((! lp) || (strncmp (line, "End", 3) != 0)) {	E_ERROR("No End marker in %s\n", filename);	goto load_error;    }    fclose (fp);    *hyplist_out = hyplist;    return nhyp;load_error:    fclose (fp);    nbestlist_free (hyplist, nhyp);    return -1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -