/**
* @file recogloop.c
*
*
* @brief メイン認識ループ
*
*
*
* @brief Main recognition loop
*
*
* @author Akinobu Lee
* @date Sun Sep 02 21:12:52 2007
*
* $Revision: 1.5 $
*
*/
/*
* Copyright (c) 1991-2012 Kawahara Lab., Kyoto University
* Copyright (c) 1997-2000 Information-technology Promotion Agency, Japan
* Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
* Copyright (c) 2005-2012 Julius project team, Nagoya Institute of Technology
* All rights reserved
*/
#include "app.h"
extern boolean outfile_enabled;
void
main_recognition_stream_loop(Recog *recog)
{
Jconf *jconf;
int file_counter;
int ret;
FILE *mfclist;
static char speechfilename[MAXPATHLEN]; /* pathname of speech file or MFCC file */
jconf = recog->jconf;
/* reset file count */
file_counter = 0;
if (jconf->input.speech_input == SP_MFCFILE) {
if (jconf->input.inputlist_filename != NULL) {
/* open filelist for mfc input */
if ((mfclist = fopen(jconf->input.inputlist_filename, "r")) == NULL) { /* open error */
fprintf(stderr, "Error: cannot open inputlist \"%s\"\n", jconf->input.inputlist_filename);
return;
}
}
}
/**********************************/
/** Main Recognition Stream Loop **/
/**********************************/
for (;;) {
printf("\n");
if (verbose_flag) printf("------\n");
fflush(stdout);
/*********************/
/* open input stream */
/*********************/
if (jconf->input.speech_input == SP_MFCFILE) {
/* from MFCC parameter file (in HTK format) */
VERMES("### read analyzed parameter\n");
if (jconf->input.inputlist_filename != NULL) { /* has filename list */
do {
if (getl_fp(speechfilename, MAXPATHLEN, mfclist) == NULL) {
fclose(mfclist);
fprintf(stderr, "%d files processed\n", file_counter);
#ifdef REPORT_MEMORY_USAGE
print_mem();
#endif
return;
}
} while (speechfilename[0] == '\0' || speechfilename[0] == '#');
} else {
if (get_line_from_stdin(speechfilename, MAXPATHLEN, "enter MFCC filename->") == NULL) {
fprintf(stderr, "%d files processed\n", file_counter);
#ifdef REPORT_MEMORY_USAGE
print_mem();
#endif
return;
}
}
if (verbose_flag) printf("\ninput MFCC file: %s\n", speechfilename);
if (outfile_enabled) outfile_set_fname(speechfilename);
/* open stream */
ret = j_open_stream(recog, speechfilename);
switch(ret) {
case 0: /* succeeded */
break;
case -1: /* error */
/* go on to the next input */
continue;
case -2: /* end of recognition */
return;
}
/* start recognizing the stream */
do {
ret = j_recognize_stream(recog);
switch(ret) {
case 1: /* paused by callback (stream may continues) */
/* do whatever you want while stopping recognition */
/* after here, recognition will restart */
break;
case 0: /* end of stream */
/* go on to the next input */
break;
case -1: /* error */
return;
}
} while (ret == 1);
/* count number of processed files */
file_counter++;
} else { /* raw speech input */
VERMES("### read waveform input\n");
/* begin A/D input */
ret = j_open_stream(recog, NULL);
switch(ret) {
case 0: /* succeeded */
break;
case -1: /* error */
/* go on to next input */
continue;
case -2: /* end of recognition process */
if (jconf->input.speech_input == SP_RAWFILE) {
fprintf(stderr, "%d files processed\n", file_counter);
} else if (jconf->input.speech_input == SP_STDIN) {
fprintf(stderr, "reached end of input on stdin\n");
} else {
fprintf(stderr, "failed to begin input stream\n");
}
return;
}
if (outfile_enabled) {
outfile_set_fname(j_get_current_filename(recog));
}
/* start recognizing the stream */
ret = j_recognize_stream(recog);
/* how to stop:
add a function to CALLBACK_POLL and call j_request_pause() or
j_request_terminate() in the function.
Julius will them stop search and call CALLBACK_PAUSE_FUNCTION.
after all callbacks in CALLBACK_PAUSE_FUNCTION was processed,
Julius resume the search.
*/
if (ret == -1) { /* error */
return;
}
/* else, end of stream */
/* count number of processed files */
if (jconf->input.speech_input == SP_RAWFILE) {
file_counter++;
}
}
}
}