/* Audio_Thread::startLipsync: start lipsync if HTK label file is existing */ bool Audio_Thread::startLipsync(const char *file) { bool result = false; int i; char *label; size_t len; FILE *fp; char buff[MMDAGENT_MAXBUFLEN]; char message[MMDAGENT_MAXBUFLEN]; int startLen, startTime, endLen, endTime, phonemeLen; bool first = true; PMDObject *objs; len = MMDAgent_strlen(file); if(len > 4) { label = MMDAgent_strdup(file); label[len - 4] = '.'; label[len - 3] = 'l'; label[len - 2] = 'a'; label[len - 1] = 'b'; fp = MMDAgent_fopen(label, "r"); if(fp != NULL) { /* load HTK label */ strcpy(message, ""); while(1) { startLen = MMDAgent_fgettoken(fp, buff); startTime = MMDAgent_str2int(buff); endLen = MMDAgent_fgettoken(fp, buff); endTime = MMDAgent_str2int(buff); phonemeLen = MMDAgent_fgettoken(fp, buff); if(startLen > 0 && endLen > 0 && phonemeLen > 0 && startTime < endTime) { if(first) sprintf(message, "%s,%d", buff, (int) ((double) (endTime - startTime) * 1.0E-04 + 0.5)); else sprintf(message, "%s,%s,%d", message, buff, (int) ((double) (endTime - startTime) * 1.0E-04 + 0.5)); first = false; } else { break; } } fclose(fp); /* send lipsync message */ if(first == false) { objs = m_mmdagent->getModelList(); for (i = 0; i < m_mmdagent->getNumModel(); i++) { if (objs[i].isEnable() == true && objs[i].allowMotionFileDrop() == true) { m_mmdagent->sendMessage(MMDAGENT_COMMAND_LIPSYNCSTART, "%s|%s", objs[i].getAlias(), message); result = true; } } } } free(label); } return result; }
/* VIManager::load: load FST */ int VIManager::load(const char *file) { FILE *fp; char buff[MMDAGENT_MAXBUFLEN]; int len; int idx; char buff_s1[MMDAGENT_MAXBUFLEN]; char buff_s2[MMDAGENT_MAXBUFLEN]; char buff_is[MMDAGENT_MAXBUFLEN]; char buff_os[MMDAGENT_MAXBUFLEN]; char buff_er[MMDAGENT_MAXBUFLEN]; int size_s1; int size_s2; int size_is; int size_os; int size_er; char *err_s1; char *err_s2; unsigned int index_s1; unsigned int index_s2; /* open */ fp = MMDAgent_fopen(file, "r"); if (fp == NULL) return 0; /* unload */ VIManager_SList_clear(&m_stateList); VIManager_SList_initialize(&m_stateList); while (fgets(buff, MMDAGENT_MAXBUFLEN - 3, fp) != NULL) { /* string + \r + \n + \0 */ /* remove final \n and \r */ len = MMDAgent_strlen(buff); while (len > 0 && (buff[len-1] == '\n' || buff[len-1] == '\r')) buff[--len] = '\0'; /* check and load arc */ if (len > 0) { idx = 0; size_s1 = getTokenFromString(buff, &idx, buff_s1); size_s2 = getTokenFromString(buff, &idx, buff_s2); size_is = getTokenFromString(buff, &idx, buff_is); size_os = getTokenFromString(buff, &idx, buff_os); size_er = getTokenFromString(buff, &idx, buff_er); if (size_s1 > 0 && size_s2 > 0 && size_is > 0 && size_os > 0 && size_er == 0 && buff_s1[0] != VIMANAGER_COMMENT) { index_s1 = (unsigned int) strtoul(buff_s1, &err_s1, 10); index_s2 = (unsigned int) strtoul(buff_s2, &err_s2, 10); if (buff_s1 + size_s1 == err_s1 && buff_s2 + size_s2 == err_s2) VIManager_SList_addArc(&m_stateList, index_s1, index_s2, buff_is, buff_os); } } if (feof(fp) || ferror(fp)) break; } fclose(fp); /* set current state to zero */ m_currentState = VIManager_SList_searchState(&m_stateList, VIMANAGER_STARTSTATE); return 1; }
/* LipSync::load: initialize and load lip setting */ bool LipSync::load(const char *file) { int i, j; FILE *fp; int len; char buff[LIPSYNC_MAXBUFLEN]; bool err = false; fp = MMDAgent_fopen(file, "r"); if(fp == NULL) return false; /* number of expression */ len = MMDAgent_fgettoken(fp, buff); if(len <= 0) { fclose(fp); return false; } m_numMotion = MMDAgent_str2int(buff); if(m_numMotion <= 0) { fclose(fp); clear(); return false; } /* motion name */ m_motion = (char **) malloc(sizeof(char *) * m_numMotion); for(i = 0; i < m_numMotion; i++) { len = MMDAgent_fgettoken(fp, buff); if(len <= 0) err = true; m_motion[i] = MMDAgent_strdup(buff); } if(err == true) { fclose(fp); clear(); return false; } /* number of phone */ len = MMDAgent_fgettoken(fp, buff); if(len <= 0) { fclose(fp); clear(); return false; } m_numPhone = MMDAgent_str2int(buff); if(m_numPhone <= 0) { fclose(fp); clear(); return false; } /* phone name, type, and blend rate */ m_phone = (char **) malloc(sizeof(char *) * m_numPhone); m_blendRate = (float **) malloc(sizeof(float *) * m_numPhone); for(i = 0; i < m_numPhone; i++) { len = MMDAgent_fgettoken(fp, buff); if(len <= 0) err = true; m_phone[i] = MMDAgent_strdup(buff); m_blendRate[i] = (float *) malloc(sizeof(float) * m_numMotion); for(j = 0; j < m_numMotion; j++) { len = MMDAgent_fgettoken(fp, buff); if(len <= 0) err = true; m_blendRate[i][j] = MMDAgent_str2float(buff); if(m_blendRate[i][j] < 0.0f) err = true; } } if(err == true) { fclose(fp); clear(); return false; } fclose(fp); return true; }
/* Option::load: load options from config file */ bool Option::load(const char *file) { FILE *fp; char buf[OPTION_MAXBUFLEN]; int len; char *p1; int ivec2[2]; float fvec3[3]; float fvec4[4]; fp = MMDAgent_fopen(file, "r"); if (fp == NULL) return false; while (fgets(buf, OPTION_MAXBUFLEN, fp)) { len = MMDAgent_strlen(buf); if(len <= 0) continue; p1 = &(buf[len - 1]); while (p1 >= &(buf[0]) && (*p1 == '\n' || *p1 == '\r' || *p1 == '\t' || *p1 == ' ')) { *p1 = L'\0'; p1--; } p1 = &(buf[0]); if (*p1 == '#') continue; while (*p1 != L'=' && *p1 != L'\0') p1++; if (*p1 == L'\0') continue; *p1 = L'\0'; p1++; /* overwrite option values */ if(MMDAgent_strequal(buf, OPTION_USECARTOONRENDERING_STR)) { setUseCartoonRendering(MMDAgent_str2bool(p1)); } else if(MMDAgent_strequal(buf, OPTION_USEMMDLIKECARTOON_STR)) { setUseMMDLikeCartoon(MMDAgent_str2bool(p1)); } else if(MMDAgent_strequal(buf, OPTION_CARTOONEDGEWIDTH_STR)) { setCartoonEdgeWidth(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_CARTOONEDGESTEP_STR)) { setCartoonEdgeStep(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_CARTOONEDGESELECTEDCOLOR_STR)) { if(MMDAgent_str2fvec(p1, fvec4, 4)) setCartoonEdgeSelectedColor(fvec4); } else if(MMDAgent_strequal(buf, OPTION_CAMERAROTATION_STR)) { if(MMDAgent_str2fvec(p1, fvec3, 3)) setCameraRotation(fvec3); } else if(MMDAgent_strequal(buf, OPTION_CAMERATRANSITION_STR)) { if(MMDAgent_str2fvec(p1, fvec3, 3)) setCameraTransition(fvec3); } else if(MMDAgent_strequal(buf, OPTION_CAMERADISTANCE_STR)) { setCameraDistance(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_CAMERAFOVY_STR)) { setCameraFovy(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_STAGESIZE_STR)) { if(MMDAgent_str2fvec(p1, fvec3, 3)) setStageSize(fvec3); } else if(MMDAgent_strequal(buf, OPTION_SHOWFPS_STR)) { setShowFps(MMDAgent_str2bool(p1)); } else if(MMDAgent_strequal(buf, OPTION_FPSPOSITION_STR)) { if(MMDAgent_str2fvec(p1, fvec3, 3)) setFpsPosition(fvec3); } else if(MMDAgent_strequal(buf, OPTION_WINDOWSIZE_STR)) { if(MMDAgent_str2ivec(p1, ivec2, 2)) setWindowSize(ivec2); } else if(MMDAgent_strequal(buf, OPTION_FULLSCREEN_STR)) { setFullScreen(MMDAgent_str2bool(p1)); } else if(MMDAgent_strequal(buf, OPTION_LOGSIZE_STR)) { if(MMDAgent_str2ivec(p1, ivec2, 2)) setLogSize(ivec2); } else if(MMDAgent_strequal(buf, OPTION_LOGPOSITION_STR)) { if(MMDAgent_str2fvec(p1, fvec3, 3)) setLogPosition(fvec3); } else if(MMDAgent_strequal(buf, OPTION_LOGSCALE_STR)) { setLogScale(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_LIGHTDIRECTION_STR)) { if(MMDAgent_str2fvec(p1, fvec4, 4)) setLightDirection(fvec4); } else if(MMDAgent_strequal(buf, OPTION_LIGHTINTENSITY_STR)) { setLightIntensity(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_LIGHTCOLOR_STR)) { if(MMDAgent_str2fvec(p1, fvec3, 3)) setLightColor(fvec3); } else if(MMDAgent_strequal(buf, OPTION_CAMPUSCOLOR_STR)) { if(MMDAgent_str2fvec(p1, fvec3, 3)) setCampusColor(fvec3); } else if(MMDAgent_strequal(buf, OPTION_MAXMULTISAMPLING_STR)) { setMaxMultiSampling(MMDAgent_str2int(p1)); } else if(MMDAgent_strequal(buf, OPTION_MOTIONADJUSTTIME_STR)) { setMotionAdjustTime(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_LIPSYNCPRIORITY_STR)) { setLipsyncPriority(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_BULLETFPS_STR)) { setBulletFps(MMDAgent_str2int(p1)); } else if(MMDAgent_strequal(buf, OPTION_GRAVITYFACTOR_STR)) { setGravityFactor(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_ROTATESTEP_STR)) { setRotateStep(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_TRANSLATESTEP_STR)) { setTranslateStep(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_DISTANCESTEP_STR)) { setDistanceStep(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_FOVYSTEP_STR)) { setFovyStep(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_USESHADOWMAPPING_STR)) { setUseShadowMapping(MMDAgent_str2bool(p1)); } else if(MMDAgent_strequal(buf, OPTION_SHADOWMAPPINGTEXTURESIZE_STR)) { setShadowMappingTextureSize(MMDAgent_str2int(p1)); } else if(MMDAgent_strequal(buf, OPTION_SHADOWMAPPINGSELFDENSITY_STR)) { setShadowMappingSelfDensity(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_SHADOWMAPPINGFLOORDENSITY_STR)) { setShadowMappingFloorDensity(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_SHADOWMAPPINGLIGHTFIRST_STR)) { setShadowMappingLightFirst(MMDAgent_str2bool(p1)); } else if(MMDAgent_strequal(buf, OPTION_DISPLAYCOMMENTTIME_STR)) { setDisplayCommentTime(MMDAgent_str2float(p1)); } else if(MMDAgent_strequal(buf, OPTION_MAXNUMMODEL_STR)) { setMaxNumModel(MMDAgent_str2int(p1)); } } fclose(fp); return true; }
/* extProcEvent: process event message */ EXPORT void extProcEvent(MMDAgent *mmdagent, const char *type, const char *args) { int i; FILE *fp; char *buf, *p, *q; PMDObject *objs; MotionPlayer *motionPlayer; if(enable == true) { if(MMDAgent_strequal(type, MMDAGENT_EVENT_DRAGANDDROP)) { buf = MMDAgent_strdup(args); p = MMDAgent_strtok(buf, "|", &q); if(MMDAgent_strtailmatch(p, ".mp3") || MMDAgent_strtailmatch(p, ".MP3")) { /* if there is a motion file which have the same name, store it */ if(drop_motion != NULL) free(drop_motion); drop_motion = MMDAgent_strdup(p); i = MMDAgent_strlen(drop_motion); drop_motion[i-4] = '.'; drop_motion[i-3] = 'v'; drop_motion[i-2] = 'm'; drop_motion[i-1] = 'd'; fp = MMDAgent_fopen(drop_motion, "rb"); if(fp != NULL) { fclose(fp); } else { free(drop_motion); drop_motion = NULL; } /* start mp3 */ audio_manager.stop(PLUGINAUDIO_DEFAULTALIAS); q = (char *) malloc(sizeof(char) * (strlen(PLUGINAUDIO_DEFAULTALIAS) + 1 + strlen(p) + 1)); sprintf(q, "%s|%s", PLUGINAUDIO_DEFAULTALIAS, p); audio_manager.play(q); free(q); } if(buf) free(buf); } else if(MMDAgent_strequal(type, AUDIOTHREAD_EVENTSTART)) { if(drop_motion != NULL) { if(MMDAgent_strequal(args, PLUGINAUDIO_DEFAULTALIAS) == true) { objs = mmdagent->getModelList(); for (i = 0; i < mmdagent->getNumModel(); i++) { if (objs[i].isEnable() == true && objs[i].allowMotionFileDrop() == true) { for (motionPlayer = objs[i].getMotionManager()->getMotionPlayerList(); motionPlayer; motionPlayer = motionPlayer->next) { if (motionPlayer->active == true && MMDAgent_strequal(motionPlayer->name, "base") == true) { mmdagent->sendCommandMessage(MMDAGENT_COMMAND_MOTIONCHANGE, "%s|%s|%s", objs[i].getAlias(), "base", drop_motion); break; } } if (!motionPlayer) mmdagent->sendCommandMessage(MMDAGENT_COMMAND_MOTIONADD, "%s|%s|%s|FULL|ONCE|ON|ON", objs[i].getAlias(), "base", drop_motion); } } mmdagent->resetAdjustmentTimer(); } free(drop_motion); drop_motion = NULL; } } } }
/* Julius_Thread::run: main loop */ void Julius_Thread::run() { char *tmp; char buff[MMDAGENT_MAXBUFLEN]; FILE *fp; if(m_jconf != NULL || m_recog != NULL || m_mmdagent == NULL || m_thread < 0 || m_languageModel == 0 || m_dictionary == 0 || m_acousticModel == 0 || m_triphoneList == 0 || m_configFile == 0) return; /* set latency */ sprintf(buff, "PA_MIN_LATENCY_MSEC=%d", JULIUSTHREAD_LATENCY); putenv(buff); sprintf(buff, "LATENCY_MSEC=%d", JULIUSTHREAD_LATENCY); putenv(buff); /* turn off log */ jlog_set_output(NULL); /* load models */ tmp = MMDAgent_pathdup(m_languageModel); sprintf(buff, "-d \"%s\"", tmp); free(tmp); m_jconf = j_config_load_string_new(buff); if (m_jconf == NULL) { return; } tmp = MMDAgent_pathdup(m_dictionary); sprintf(buff, "-v \"%s\"", tmp); free(tmp); if(j_config_load_string(m_jconf, buff) < 0) { return; } tmp = MMDAgent_pathdup(m_acousticModel); sprintf(buff, "-h \"%s\"", tmp); free(tmp); if(j_config_load_string(m_jconf, buff) < 0) { return; } tmp = MMDAgent_pathdup(m_triphoneList); sprintf(buff, "-hlist \"%s\"", tmp); free(tmp); if(j_config_load_string(m_jconf, buff) < 0) { return; } /* load config file */ tmp = MMDAgent_pathdup(m_configFile); if(j_config_load_file(m_jconf, tmp) < 0) { free(tmp); return; } free(tmp); /* load user dictionary */ fp = MMDAgent_fopen(m_userDictionary, "r"); if(fp != NULL) { fclose(fp); tmp = MMDAgent_pathdup(m_userDictionary); j_add_dict(m_jconf->lm_root, tmp); free(tmp); } /* create instance */ m_recog = j_create_instance_from_jconf(m_jconf); if (m_recog == NULL) { return; } /* register callback functions */ callback_add(m_recog, CALLBACK_EVENT_RECOGNITION_BEGIN, callbackRecogBegin, this); callback_add(m_recog, CALLBACK_RESULT, callbackRecogResult, this); if (!j_adin_init(m_recog)) { return; } if (j_open_stream(m_recog, NULL) != 0) { return; } /* setup logger */ m_logger.setup(m_recog); /* start logger */ m_logger.setActiveFlag(true); /* start recognize */ j_recognize_stream(m_recog); }