main_cepview.c

来自「CMU大名鼎鼎的SPHINX-3大词汇量连续语音识别系统」· C语言 代码 · 共 253 行

C
253
字号
/* ==================================================================== * Copyright (c) 1994-2001 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. * * ==================================================================== * *  * HISTORY *  * circa 1994	P J Moreno at Carnegie Mellon * 		Created. * * For history information, please use 'cvs log' */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <s3types.h>#include "bio.h"/** \file main_cepview.c    \brief Main driver of cepview */#define IO_ERR  (-1)#define IO_SUCCESS  (0)#define SHOW_ALL "-1"/* Default cepstral vector size */#define NUM_COEFF  "13"/* Default display size, i.e., number of coefficients displayed, less * than the vector size so we display one frame per line. */#define DISPLAY_SIZE "10"#define STR_MAX_INT "2147483647"static arg_t arg[] = {  { "-i",    ARG_INT32,    NUM_COEFF,    "Number of coefficients in the feature vector."},  { "-d",    ARG_INT32,    DISPLAY_SIZE,    "Number of displayed coefficients."},  { "-header",    ARG_INT32,    "0",    "Whether header is shown."},  { "-describe",    ARG_INT32,    "0",    "Whether description will be shown."},  { "-b",    ARG_INT32,    "0",    "The beginning frame 0-based."},  { "-e",    ARG_INT32,    "2147483647",    "The ending frame."},  { "-f",    ARG_STRING,    NULL,    "Input feature file."},  { "-logfn",    ARG_STRING,    NULL,    "Log file (default stdout/stderr)." },  { NULL, ARG_INT32,  NULL, NULL }};int read_cep(char *file, float ***cep, int *nframes, int numcep);int main(int argc, char *argv[]){  int i, j, offset;  int32 noframe, vsize, dsize, column;  int32 frm_begin, frm_end;  int is_header, is_describe;  float *z, **cep;  char* cepfile;    print_appl_info(argv[0]);  cmd_ln_appl_enter(argc, argv, "default.arg", arg);  vsize = cmd_ln_int32("-i");  dsize = cmd_ln_int32("-d");  frm_begin = cmd_ln_int32("-b");    frm_end = cmd_ln_int32("-e");    is_header = cmd_ln_int32("-header");  is_describe = cmd_ln_int32("-describe");  if (vsize < 0) E_FATAL("-i : Input vector size should be larger than 0.\n");  if (dsize < 0) E_FATAL("-d : Column size should be larger than 0\n");  if (frm_begin < 0) E_FATAL("-b : Beginning frame should be larger than 0\n");  /* The following condition is redundant   * if (frm_end < 0) E_FATAL("-e : Ending frame should be larger than 0\n");   */  if (frm_begin >= frm_end) E_FATAL("Ending frame (-e) should be larger than beginning frame (-b).\n");    if ((cepfile = cmd_ln_str("-f")) == NULL){    E_FATAL("Input file was not specified with (-f)\n");  }  if (read_cep(cepfile, &cep, &noframe, vsize) == IO_ERR)    E_FATAL("ERROR opening %s for reading\n", cepfile);        z = cep[0];  offset = 0;  column = (vsize > dsize) ? dsize : vsize;  frm_end = (frm_end> noframe) ? noframe : frm_end;  /* This part should be moved to a special library if this file is     longer than 300 lines. */  if (is_header) {    if (is_describe) {      printf("%d frames\n", noframe);      printf("\n%6s", "frame#:");    }          for (j = 0; j < column; ++j) {      printf("%3s%3d%s ", "c[", j, "]");    }    printf("\n");  }  offset += frm_begin * vsize;  for (i = frm_begin; i < frm_end; ++i) {    if (is_describe) {      printf("%6d:", i);    }    for (j = 0; j < column; ++j)      printf("%7.3f ", z[offset + j]);    printf("\n");          offset += vsize;  }  fflush(stdout);  cmd_ln_appl_exit();  return(IO_SUCCESS);}int read_cep(char *file, float***cep, int *numframes, int cepsize){    FILE *fp;    int n_float;    struct stat statbuf;    int i, n, byterev, sf, ef;    float32 **mfcbuf;    if (stat(file, &statbuf) < 0) {        printf("stat(%s) failed\n", file);        return IO_ERR;    }    if ((fp = fopen(file, "rb")) == NULL) {	printf("fopen(%s, rb) failed\n", file);	return IO_ERR;    }        /* Read #floats in header */    if (fread(&n_float, sizeof(int), 1, fp) != 1) {	fclose (fp);	return IO_ERR;    }        /* Check if n_float matches file size */    byterev = FALSE;    if ((int)(n_float*sizeof(float) + 4) != statbuf.st_size) {	n = n_float;	SWAP_INT32(&n);	if ((int)(n*sizeof(float) + 4) != statbuf.st_size) {	    printf("Header size field: %d(%08x); filesize: %d(%08x)\n",		    n_float, n_float, (int)statbuf.st_size, (int)statbuf.st_size);	    fclose (fp);	    return IO_ERR;	}	n_float = n;	byterev = TRUE;    }    if (n_float <= 0) {	printf("Header size field: %d\n",  n_float);	fclose (fp);	return IO_ERR;    }        /* n = #frames of input */    n = n_float/cepsize;    if (n * cepsize != n_float) {	printf("Header size field: %d; not multiple of %d\n", n_float, cepsize);	fclose (fp);	return IO_ERR;    }    sf = 0;    ef = n;    mfcbuf = (float **) ckd_calloc_2d (n, cepsize, sizeof(float32));        /* Read mfc data and byteswap if necessary */    n_float = n * cepsize;    if ((int)fread (mfcbuf[0], sizeof(float), n_float, fp) != n_float) {	printf("Error reading mfc data\n");	fclose (fp);	return IO_ERR;    }    if (byterev) {      for (i = 0; i < n_float; i++)	SWAP_FLOAT32(&(mfcbuf[0][i]));    }    fclose (fp);    *numframes = n;    *cep = mfcbuf;    return IO_SUCCESS;}

⌨️ 快捷键说明

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