/** * Detect RIFF file and parse its header if detected. * * @return TRUE if it's a RIFF file, FALSE if not, -1 if an error occurred. */ static int detect_riff(sphinx_wave2feat_t *wtf) { FILE *fh; MSWAV_hdr hdr; if ((fh = fopen(wtf->infile, "rb")) == NULL) { E_ERROR_SYSTEM("Failed to open %s", wtf->infile); return -1; } if (fread(&hdr, sizeof(hdr), 1, fh) != 1) { E_ERROR_SYSTEM("Failed to read RIFF header"); fclose(fh); return -1; } /* Make sure it is actually a RIFF file. */ if (0 != memcmp(hdr.rifftag, "RIFF", 4)) { fclose(fh); return FALSE; } /* Get relevant information. */ cmd_ln_set_int32_r(wtf->config, "-nchans", hdr.numchannels); cmd_ln_set_float32_r(wtf->config, "-samprate", hdr.SamplingFreq); wtf->infh = fh; return TRUE; }
static int open_nist_file(sphinx_wave2feat_t *wtf, char const *infile, FILE **out_fh, int detect_endian) { char nist[7]; lineiter_t *li; FILE *fh; if ((fh = fopen(infile, "rb")) == NULL) { E_ERROR_SYSTEM("Failed to open %s", infile); return -1; } if (fread(&nist, 1, 7, fh) != 7) { E_ERROR_SYSTEM("Failed to read NIST header"); fclose(fh); return -1; } /* Is this actually a NIST file? */ if (0 != strncmp(nist, "NIST_1A", 7)) { fclose(fh); return FALSE; } /* Rewind, parse lines. */ fseek(fh, 0, SEEK_SET); for (li = lineiter_start(fh); li; li = lineiter_next(li)) { char **words; int nword; string_trim(li->buf, STRING_BOTH); if (strlen(li->buf) == 0) { lineiter_free(li); break; } nword = str2words(li->buf, NULL, 0); if (nword != 3) continue; words = (char **)ckd_calloc(nword, sizeof(*words)); str2words(li->buf, words, nword); if (0 == strcmp(words[0], "sample_rate")) { cmd_ln_set_float32_r(wtf->config, "-samprate", atof_c(words[2])); } if (0 == strcmp(words[0], "channel_count")) { cmd_ln_set_int32_r(wtf->config, "-nchans", atoi(words[2])); } if (detect_endian && 0 == strcmp(words[0], "sample_byte_format")) { cmd_ln_set_str_r(wtf->config, "-input_endian", (0 == strcmp(words[2], "10")) ? "big" : "little"); } ckd_free(words); } fseek(fh, 1024, SEEK_SET); if (out_fh) *out_fh = fh; else fclose(fh); return TRUE; }
/** * Detect a file supported by libsndfile and parse its header if detected. * * @return TRUE if it's a supported file, FALSE if not, -1 if an error occurred. */ static int detect_sndfile(sphinx_wave2feat_t *wtf) { SNDFILE *sf; SF_INFO sfinfo; memset(&sfinfo, 0, sizeof(sfinfo)); /* We let other detectors catch I/O errors, since there is no way to tell them from format errors when opening :( */ if ((sf = sf_open(wtf->infile, SFM_READ, &sfinfo)) == NULL) { return FALSE; } /* Get relevant information. */ cmd_ln_set_int32_r(wtf->config, "-nchans", sfinfo.channels); cmd_ln_set_float32_r(wtf->config, "-samprate", sfinfo.samplerate); wtf->insfh = sf; wtf->infh = NULL; return TRUE; }
static void gst_pocketsphinx_set_int(GstPocketSphinx *ps, const gchar *key, const GValue *value) { cmd_ln_set_int32_r(ps->config, key, g_value_get_int(value)); }
int sphinx_wave2feat_convert_file(sphinx_wave2feat_t *wtf, char const *infile, char const *outfile) { int nchans, minfft, nfft, nfloat, veclen; audio_type_t const *atype; int fshift, fsize; if (cmd_ln_boolean_r(wtf->config, "-verbose")) E_INFO("Converting %s to %s\n", infile, outfile); wtf->infile = ckd_salloc(infile); /* Detect input file type. */ if ((atype = detect_audio_type(wtf)) == NULL) return -1; /* Determine whether to byteswap input. */ wtf->byteswap = strcmp(cmd_ln_str_r(wtf->config, "-mach_endian"), cmd_ln_str_r(wtf->config, "-input_endian")); /* Make sure the FFT size is sufficiently large. */ minfft = (int)(cmd_ln_float32_r(wtf->config, "-samprate") * cmd_ln_float32_r(wtf->config, "-wlen") + 0.5); for (nfft = 1; nfft < minfft; nfft <<= 1) ; if (nfft > cmd_ln_int32_r(wtf->config, "-nfft")) { E_WARN("Value of -nfft = %d is too small, increasing to %d\n", cmd_ln_int32_r(wtf->config, "-nfft"), nfft); cmd_ln_set_int32_r(wtf->config, "-nfft", nfft); fe_free(wtf->fe); wtf->fe = fe_init_auto_r(wtf->config); } /* Get the output frame size (if not already set). */ if (wtf->veclen == 0) wtf->veclen = fe_get_output_size(wtf->fe); /* Set up the input and output buffers. */ fe_get_input_size(wtf->fe, &fshift, &fsize); /* Want to get at least a whole frame plus shift in here. Also we will either pick or mix multiple channels so we need to read them all at once. */ nchans = cmd_ln_int32_r(wtf->config, "-nchans"); wtf->blocksize = cmd_ln_int32_r(wtf->config, "-blocksize") * nchans; if (wtf->blocksize < (fsize + fshift) * nchans) { E_INFO("Block size of %d too small, increasing to %d\n", wtf->blocksize, (fsize + fshift) * nchans); wtf->blocksize = (fsize + fshift) * nchans; } wtf->audio = (short *)ckd_calloc(wtf->blocksize, sizeof(*wtf->audio)); wtf->featsize = (wtf->blocksize / nchans - fsize) / fshift; /* Use the maximum of the input and output frame sizes to allocate this. */ veclen = wtf->veclen; if (wtf->in_veclen > veclen) veclen = wtf->in_veclen; wtf->feat = (mfcc_t**)ckd_calloc_2d(wtf->featsize, veclen, sizeof(**wtf->feat)); /* Let's go! */ if ((wtf->outfh = fopen(outfile, "wb")) == NULL) { E_ERROR_SYSTEM("Failed to open %s for writing", outfile); return -1; } /* Write an empty header, which we'll fill in later. */ if (wtf->ot->output_header && (*wtf->ot->output_header)(wtf, 0) < 0) { E_ERROR_SYSTEM("Failed to write empty header to %s\n", outfile); goto error_out; } wtf->outfile = ckd_salloc(outfile); if ((nfloat = (*atype->decode)(wtf)) < 0) { E_ERROR("Failed to convert"); goto error_out; } if (wtf->ot->output_header) { if (fseek(wtf->outfh, 0, SEEK_SET) < 0) { E_ERROR_SYSTEM("Failed to seek to beginning of %s\n", outfile); goto error_out; } if ((*wtf->ot->output_header)(wtf, nfloat) < 0) { E_ERROR_SYSTEM("Failed to write header to %s\n", outfile); goto error_out; } } if (wtf->audio) ckd_free(wtf->audio); if (wtf->feat) ckd_free_2d(wtf->feat); if (wtf->infile) ckd_free(wtf->infile); if (wtf->outfile) ckd_free(wtf->outfile); wtf->audio = NULL; wtf->infile = NULL; wtf->feat = NULL; wtf->outfile = NULL; if (wtf->outfh) if (fclose(wtf->outfh) == EOF) E_ERROR_SYSTEM("Failed to close output file"); wtf->outfh = NULL; return 0; error_out: if (wtf->audio) ckd_free(wtf->audio); if (wtf->feat) ckd_free_2d(wtf->feat); if (wtf->infile) ckd_free(wtf->infile); if (wtf->outfile) ckd_free(wtf->outfile); wtf->audio = NULL; wtf->infile = NULL; wtf->feat = NULL; wtf->outfile = NULL; if (wtf->outfh) if (fclose(wtf->outfh) == EOF) E_ERROR_SYSTEM("Failed to close output file"); wtf->outfh = NULL; return -1; }