/** * <JA> * 音声入力デバイスを初期化し,音入力切出用パラメータをセットアップする. * * @param adin [in] AD-in ワークエリア * @param jconf [in] 全体設定パラメータ * @param arg [in] デバイス依存引数 * </JA> * <EN> * Initialize audio device and set up parameters for sound detection. * * @param adin [in] AD-in work area * @param jconf [in] global configuration parameters * @param arg [in] device-specific argument * </EN> */ static boolean adin_setup_all(ADIn *adin, Jconf *jconf, void *arg) { if (jconf->input.use_ds48to16) { if (jconf->input.use_ds48to16 && jconf->input.sfreq != 16000) { jlog("ERROR: m_adin: in 48kHz input mode, target sampling rate should be 16k!\n"); return FALSE; } /* setup for 1/3 down sampling */ adin->ds = ds48to16_new(); adin->down_sample = TRUE; /* set device sampling rate to 48kHz */ if (adin_standby(adin, 48000, arg) == FALSE) { /* fail */ jlog("ERROR: m_adin: failed to ready input device\n"); return FALSE; } } else { adin->ds = NULL; adin->down_sample = FALSE; if (adin_standby(adin, jconf->input.sfreq, arg) == FALSE) { /* fail */ jlog("ERROR: m_adin: failed to ready input device\n"); return FALSE; } } /* set parameter for recording/silence detection */ if (adin_setup_param(adin, jconf) == FALSE) { jlog("ERROR: m_adin: failed to set parameter for input device\n"); return FALSE; } adin->input_side_segment = FALSE; return TRUE; }
/** * <JA> * メイン関数 * * @param argc [in] 引数列の長さ * @param argv [in] 引数列 * * @return * </JA>エラー時 1,通常終了時 0 を返す. * <EN> * Main function. * * @param argc [in] number of argument. * @param argv [in] array of arguments. * * @return 1 on error, 0 on success. * </EN> */ int main(int argc, char *argv[]) { int silence_cut = 1; /* 0=disabled, 1=enabled, 2=undef */ /* parse option */ opt_parse(argc, argv); /* select microphone input */ if (adin_select(SP_MIC) == FALSE) { j_printerr("Error: microphone input is not supported\n"); return(1); } /* ready the microphone (arg is dummy) */ if (use_48to16) { if (sfreq != 16000) { j_printerr("Error: in 48kHz mode, required rate should be 16kHz!\n"); return(1); } /* setup for down sampling */ adin_setup_48to16(); /* set device sampling rate to 48kHz */ if (adin_standby(48000, NULL) == FALSE) { /* fail */ j_printerr("Error: failed to ready input device to 48kHz\n"); return(1); } } else { if (adin_standby(sfreq, NULL) == FALSE) { j_printerr("Error: failed to standby input\n"); return(1); } } /* set device-independent param */ adin_setup_param(silence_cut, strip_zero_sample, level_thres, zero_cross_num, margin, margin, sfreq, TRUE, use_zmean);/* use same margin for head and tail */ /* file check */ if (!stout) { if (access(filename, F_OK) == 0) { if (access(filename, W_OK) == 0) { fprintf(stderr, "Warning: overwriting file \"%s\"\n", filename); } else { perror("adinrec"); return(1); } } } /* output file will be opened when triggered (not here) */ /* set interrupt signal handler to properly close output file */ if (signal(SIGINT, interrupt_record) == SIG_ERR) { fprintf(stderr, "Warning: signal intterupt may collapse output\n"); } /* do recoding */ speechlen = 0; adin_begin(); j_printerr("<<< please speak >>>"); /* moved from adin-cut.c */ adin_go(adin_callback_file, NULL); adin_end(); /* close file and output status */ close_file(); return 1; }
//======================== // Create engine instance //======================== bool cJulius::createEngine( void ) { #ifdef APP_ADIN ADIn *a; #endif if (!m_jconf) return false; if (m_recog) return false; #ifdef APP_ADIN if (m_appsource != 0) { switch(m_appsource) { case 1: // buffer input, batch m_recog->jconf->input.type = INPUT_WAVEFORM; m_recog->jconf->input.speech_input = SP_RAWFILE; m_recog->jconf->decodeopt.realtime_flag = FALSE; break; case 2: // buffer input, incremental m_recog->jconf->input.type = INPUT_WAVEFORM; m_recog->jconf->input.speech_input = SP_RAWFILE; m_recog->jconf->decodeopt.realtime_flag = TRUE; break; } } #endif // Create engine instance m_recog = j_create_instance_from_jconf(m_jconf); if (m_recog == NULL) { return false; } // Register callbacks callback_add(m_recog, CALLBACK_EVENT_PROCESS_ONLINE, ::callback_engine_active, this); callback_add(m_recog, CALLBACK_EVENT_PROCESS_OFFLINE, ::callback_engine_inactive, this); callback_add(m_recog, CALLBACK_EVENT_SPEECH_READY, ::callback_audio_ready, this); callback_add(m_recog, CALLBACK_EVENT_SPEECH_START, ::callback_audio_begin, this); callback_add(m_recog, CALLBACK_EVENT_SPEECH_STOP, ::callback_audio_end, this); callback_add(m_recog, CALLBACK_EVENT_RECOGNITION_BEGIN, ::callback_recog_begin, this); callback_add(m_recog, CALLBACK_EVENT_RECOGNITION_END, ::callback_recog_end, this); callback_add(m_recog, CALLBACK_EVENT_PASS1_FRAME, ::callback_recog_frame, this); callback_add(m_recog, CALLBACK_EVENT_PAUSE, ::callback_engine_pause, this); callback_add(m_recog, CALLBACK_EVENT_RESUME, ::callback_engine_resume, this); callback_add(m_recog, CALLBACK_RESULT, ::callback_result_final, this); callback_add(m_recog, CALLBACK_PAUSE_FUNCTION, ::callback_wait_for_resume, this); #ifdef APP_ADIN // Initialize application side audio input if (m_appsource != 0) { a = m_recog->adin; switch(m_appsource) { case 1: // buffer input, batch a->ad_standby = NULL; a->ad_begin = NULL; a->ad_end = NULL; a->ad_resume = NULL; a->ad_pause = NULL; a->ad_terminate = NULL; a->ad_read = callback_adin_fetch_input; a->ad_input_name = NULL; a->silence_cut_default = FALSE; a->enable_thread = FALSE; break; case 2: // buffer input, incremental a->ad_standby = NULL; a->ad_begin = NULL; a->ad_end = NULL; a->ad_resume = NULL; a->ad_pause = NULL; a->ad_terminate = NULL; a->ad_read = callback_adin_fetch_input; a->ad_input_name = NULL; a->silence_cut_default = FALSE; a->enable_thread = FALSE; break; } a->ds = NULL; a->down_sample = FALSE; if (adin_standby(a, m_recog->jconf->input.sfreq, NULL) == FALSE) return false; if (adin_setup_param(a, m_recog->jconf) == FALSE) return false; a->input_side_segment = FALSE; } else { // Let JuliusLib get audio input if (! j_adin_init( m_recog ) ) return false; } #else if (! j_adin_init( m_recog ) ) return false; #endif return true; }