//================================= // Initialize, with argument array //================================= bool cJulius::initialize( int argnum, char *argarray[]) { bool ret; release(); m_jconf = j_config_load_args_new( argnum, argarray ); if (m_jconf == NULL) { /* error */ return false; } ret = createEngine(); return ret; }
int main(int argc, char* argv[]) { // Jconf: configuration parameters // load configurations from command arguments Jconf *jconf = j_config_load_args_new(argc, argv); if (jconf == NULL) { std::cout << "Error @ j_config_load_args_new" << std::endl; return -1; } // Recog: Top level instance for the whole recognition process // create recognition instance according to the jconf Recog *recog = j_create_instance_from_jconf(jconf); if (recog == NULL) { std::cout << "Error @ j_create_instance_from_jconf" << std::endl; return -1; } // Regster callback callback_add(recog, CALLBACK_EVENT_SPEECH_READY, [](Recog *recog, void*) { std::cout << "<<< PLEASE SPEAK! >>>" << std::endl; }, NULL); callback_add(recog, CALLBACK_EVENT_SPEECH_START, [](Recog *recog, void*) { std::cout << "...SPEECH START..." << std::endl; }, NULL); callback_add(recog, CALLBACK_RESULT, [](Recog *recog, void*) { for (const RecogProcess *r = recog->process_list; r; r = r->next) { WORD_INFO *winfo = r->lm->winfo; for (int n = 0; n < r->result.sentnum; ++n) { Sentence *s = &(r->result.sent[n]); WORD_ID *seq = s->word; int seqnum = s->word_num; for (int i = 0; i < seqnum; ++i) { std::cout << winfo->woutput[seq[i]]; } } } }, NULL); // Initialize audio input if (j_adin_init(recog) == FALSE) { return -1; } // output system information to log j_recog_info(recog); // Open input stream and recognize switch (j_open_stream(recog, NULL)) { case 0: break; // success case -1: std::cout << "Error in input stream" << std::endl; return -1; case -2: std::cout << "Failed to begin input stream" << std::endl; return -1; } // Recognition loop int ret = j_recognize_stream(recog); if (ret == -1) return -1; // exit j_close_stream(recog); j_recog_free(recog); return 0; }
xreturn::r<bool> JuliusPlus::JuliusFileStart() { assert(this->recogFile == NULL); assert(this->jconfFile == NULL); const char* argv[]={ "juliusplus" ,"-C" ,"testfile.jconf" }; int argc = sizeof(argv)/sizeof(argv[0]); //julius は C関数だから、const外して char** にするしかない。 this->jconfFile = j_config_load_args_new(argc, (char**)argv); /* else, you can load configurations from a jconf file */ //jconf = j_config_load_file_new(jconf_filename); if (this->jconfFile == NULL) { return xreturn::error("Try `-help' for more information.\n"); } /* 2. create recognition instance according to the jconf */ /* it loads models, setup final parameters, build lexicon and set up work area for recognition */ this->recogFile = j_create_instance_from_jconf(this->jconfFile); if (this->recogFile == NULL) { return xreturn::error("Error in startup(j_create_instance_from_jconf)\n"); } struct _ref{ static void output_result(Recog *recog, void *_this) { ((JuliusPlus*)_this)->OnOutputResultFile(recog); } }; callback_add(this->recogFile, CALLBACK_RESULT, _ref::output_result, this); // Initialize audio input if (j_adin_init(this->recogFile) == FALSE) { return xreturn::error("Error in startup(j_adin_init)\n"); } //以上、準備だけしておいて、 //認識ルーチンは、後から呼びます。 /* int ret = j_open_stream(recogFile, "nano.wav"); if(ret < 0) { return xreturn::error("Error in startup(j_open_stream)\n"); } j_recognize_stream(recogFile); ret = j_open_stream(recogFile, "nano.wav"); if(ret < 0) { return xreturn::error("Error in startup(j_open_stream)\n"); } j_recognize_stream(recogFile); */ return true; }
xreturn::r<bool> JuliusPlus::JuliusStart() { assert(this->recog == NULL); assert(this->jconf == NULL); assert(this->Thread == NULL); const char* argv[]={ "juliusplus" ,"-C" ,"testmic.jconf" }; int argc = sizeof(argv)/sizeof(argv[0]); int ret; //julusはC関数なので、const外して char** にするしかない・・・ this->jconf = j_config_load_args_new(argc, (char**)argv); /* else, you can load configurations from a jconf file */ //jconf = j_config_load_file_new(jconf_filename); if (this->jconf == NULL) { return xreturn::error("Try `-help' for more information.\n"); } /* 2. create recognition instance according to the jconf */ /* it loads models, setup final parameters, build lexicon and set up work area for recognition */ this->recog = j_create_instance_from_jconf(this->jconf); if (this->recog == NULL) { return xreturn::error("Error in startup(j_create_instance_from_jconf)\n"); } struct _ref{ static void status_recready(Recog *recog, void *_this) { ((JuliusPlus*)_this)->OnStatusRecready(recog); } static void status_recstart(Recog *recog, void *_this) { ((JuliusPlus*)_this)->OnStatusRecstart(recog); } static void output_result(Recog *recog, void *_this) { ((JuliusPlus*)_this)->OnOutputResult(recog); } static void record_adin_trigger(Recog *recog, SP16 *speech, int samplenum, void *_this) { ((JuliusPlus*)_this)->OnRecordAdinTrigger(recog,speech,samplenum); } }; callback_add(this->recog, CALLBACK_EVENT_SPEECH_READY, _ref::status_recready, this); callback_add(this->recog, CALLBACK_EVENT_SPEECH_START, _ref::status_recstart, this); callback_add(this->recog, CALLBACK_RESULT, _ref::output_result, this); callback_add_adin(this->recog, CALLBACK_ADIN_TRIGGERED, _ref::record_adin_trigger, this); // Initialize audio input if (j_adin_init(this->recog) == FALSE) { return xreturn::error("Error in startup(j_adin_init)\n"); } //output system information to log //j_recog_info(this->recog); ret = j_open_stream(recog, NULL); if(ret < 0) { return xreturn::error("Error in startup(j_open_stream)\n"); } this->Thread = new boost::thread( [&]() { j_recognize_stream(recog); } ); return true; }