⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plugin.c

📁 julius version 4.12.about sound recognition.
💻 C
字号:
/** * @file   plugin.c *  * <EN> * @brief  Load plugin * </EN> *  * <JA> * @brief  プラグイン粕み哈み * </JA> *  * @author Akinobu Lee * @date   Sat Aug  2 09:46:09 2008 *  * $Revision: 1.1 $ *  *//* * Copyright (c) 1991-2007 Kawahara Lab., Kyoto University * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology * Copyright (c) 2005-2007 Julius project team, Nagoya Institute of Technology * All rights reserved */#include <julius/julius.h>#ifdef ENABLE_PLUGIN#include <dirent.h>#include <stdarg.h>/** * Plugin file path suffix *  */static char *plugin_suffix = PLUGIN_SUFFIX;/** * Function names to be loaded *  */static char *plugin_function_namelist[] = PLUGIN_FUNCTION_NAMELIST;/**************************************************************/#if defined(_WIN32) && !defined(__CYGWIN32__)/**  * Return error string. *  * @return the error string. */static const char* dlerror(){  static char szMsgBuf[256];  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,		NULL,		GetLastError(),		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),		szMsgBuf,		sizeof szMsgBuf,		NULL);  return szMsgBuf;}#endif/**************************************************************/static intplugin_namelist_num(){  return(sizeof(plugin_function_namelist) / sizeof(char *));}static voidplugin_free_all(){  PLUGIN_ENTRY *p, *ptmp;  int i, num;  num = plugin_namelist_num();  for(i=0;i<num;i++) {    p = global_plugin_list[i];    while(p) {      ptmp = p->next;      free(p);      p = ptmp;    }  }  free(global_plugin_list);}    intplugin_get_id(char *name){  int i, num;  num = plugin_namelist_num();  for(i=0;i<num;i++) {    if (strmatch(plugin_function_namelist[i], name)) {      return i;    }  }  jlog("InternalError: no plugin entry named %s\n", name);  return -1;}voidplugin_init(){  int i, num;  if (global_plugin_list != NULL) {    plugin_free_all();  }  num = plugin_namelist_num();  global_plugin_list = (PLUGIN_ENTRY **)mymalloc(sizeof(PLUGIN_ENTRY *) * num);  for(i=0;i<num;i++) {    global_plugin_list[i] = NULL;  }  global_plugin_loaded_file_num = 0;}/**************************************************************//**  * Guess if it is a file name of julius plugin *  * @param filename [in] file name *  * @return TRUE if it has suffix of julius plugin, else return FALSE. */static booleanis_plugin_obj(char *filename){  char *p, *x;  x = plugin_suffix + strlen(plugin_suffix) - 1;  p = filename + strlen(filename) - 1;  while (x >= plugin_suffix && p >= filename && *x == *p) {    x--; p--;  }  if (x < plugin_suffix) {    return TRUE;  }  return FALSE;}/**  * Load a plugin file. *  * @param file [in] plugin file path * * @return TRUE on success, FALSE on failure. */booleanplugin_load_file(char *file){  PLUGIN_MODULE handle;  FUNC_INT func;  FUNC_VOID entfunc;  int ret, number, num;  char buf[256];  int buflen = 256;  PLUGIN_ENTRY *p;  int i;  if (global_plugin_list == NULL) plugin_init();  /* open file */  handle = dlopen(file, RTLD_LAZY);  if (!handle) {    jlog("ERROR: plugin_load: failed to open: %s\n", dlerror());    return(FALSE);  }  /* call initialization function */  func = dlsym(handle, "initialize");  if (func) {    ret = (*func)();    if (ret == -1) {      jlog("WARNING: plugin_load: %s: initialize() returns no, skip this file\n", file);      dlclose(handle);      return(FALSE);    }  }  /* call information function */  func = dlsym(handle, "get_plugin_info");  if (func == NULL) {    jlog("ERROR: plugin_load: %s: get_plugin_info(): %s\n", file, dlerror());    dlclose(handle);    return(FALSE);  }  number = 0;  ret = (*func)(number, buf, buflen);  if (ret == -1) {    jlog("ERROR: plugin_load: %s: get_plugin_info(0) returns error\n", file);    dlclose(handle);    return(FALSE);  }  buf[buflen-1] = '\0';  jlog("#%d [%s]\n", global_plugin_loaded_file_num, buf);    /* register plugin functions */  num = plugin_namelist_num();  for(i=0;i<num;i++) {    entfunc = dlsym(handle, plugin_function_namelist[i]);    if (entfunc) {      if (debug2_flag) {	jlog("     (%s)\n", plugin_function_namelist[i]);      }      p = (PLUGIN_ENTRY *)mymalloc(sizeof(PLUGIN_ENTRY));      p->id = i;      p->source_id = global_plugin_loaded_file_num;      p->func = entfunc;      p->next = global_plugin_list[i];      global_plugin_list[i] = p;    }  }  /* increment file counter */  global_plugin_loaded_file_num++;  return(TRUE);}/**  * Search for plugin file in a directory and load them. *  * @param dir [in] directory * * @return TRUE on success, FALSE on failure */booleanplugin_load_dir(char *dir){  DIR *d;  struct dirent *f;  static char buf[512];  int cnt;  if ((d = opendir(dir)) == NULL) {    jlog("ERROR: plugin_load: cannot open plugins dir \"%s\"\n", dir);    return FALSE;  }  cnt = 0;  while((f = readdir(d)) != NULL) {    if (is_plugin_obj(f->d_name)) {      snprintf(buf, 512, "%s/%s", dir, f->d_name);      jlog("STAT: file: %-23s ", f->d_name);      if (plugin_load_file(buf)) cnt++;    }  }  closedir(d);  jlog("STAT: %d files loaded\n", cnt);  return TRUE;}/**  * read in plugins in multiple directories *  * @param dirent [i/o] directory entry in form of * "dir1:dir2:dir3:...". * */voidplugin_load_dirs(char *dirent){  char *p, *s;  char c;  if (dirent == NULL) return;  if (debug2_flag) {    jlog("DEBUG: loading dirs: %s\n", dirent);  }  p = dirent;  do {    s = p;    while(*p != '\0' && *p != ':') p++;    c = *p;    *p = '\0';    jlog("STAT: loading plugins at \"%s\":\n", dirent);    plugin_load_dir(s);    if (c != '\0') {      *p = c;      p++;    }  } while (*p != '\0');}/************************************************************************/intplugin_find_optname(char *optfuncname, char *str){  char buf[64];  int id;  PLUGIN_ENTRY *p;  FUNC_VOID func;  if ((id = plugin_get_id(optfuncname)) < 0) return -1;  for(p=global_plugin_list[id];p;p=p->next) {    func = (FUNC_VOID) p->func;    (*func)(buf, (int)64);    if (strmatch(buf, str)) {      return p->source_id;    }  }  return -1;}FUNC_VOIDplugin_get_func(int sid, char *name){  int id;  PLUGIN_ENTRY *p;  FUNC_VOID func;  if ((id = plugin_get_id(name)) < 0) return NULL;  for(p=global_plugin_list[id];p;p=p->next) {    if (p->source_id == sid) return p->func;  }  return NULL;}/************************************************************************/booleanplugin_exec_engine_startup(Recog *recog){  int id;  PLUGIN_ENTRY *p;  FUNC_INT func;  boolean ok_p;  if (global_plugin_list == NULL) return TRUE;  if ((id = plugin_get_id("startup")) < 0) return FALSE;  ok_p = TRUE;  for(p=global_plugin_list[id];p;p=p->next) {    func = (FUNC_INT) p->func;    if ((*func)(recog) != 0) {      jlog("WARNING: plugin #%d: failed in startup()\n", p->source_id);      ok_p = FALSE;    }  }  return ok_p;}/************************************************************************/voidplugin_exec_adin_captured(short *buf, int len){  int id;  PLUGIN_ENTRY *p;  FUNC_VOID adfunc;  if (global_plugin_list == NULL) return;  if ((id = plugin_get_id("adin_postprocess")) < 0) return;  for(p=global_plugin_list[id];p;p=p->next) {    adfunc = (FUNC_VOID) p->func;    (*adfunc)(buf, len);  }}voidplugin_exec_adin_triggered(short *buf, int len){  int id;  PLUGIN_ENTRY *p;  FUNC_VOID adfunc;  if (global_plugin_list == NULL) return;  if ((id = plugin_get_id("adin_postprocess_triggered")) < 0) return;  for(p=global_plugin_list[id];p;p=p->next) {    adfunc = (FUNC_VOID) p->func;    (*adfunc)(buf, len);  }}voidplugin_exec_vector_postprocess(VECT *vecbuf, int veclen, int nframe){  int id;  PLUGIN_ENTRY *p;  FUNC_INT func;  if (global_plugin_list == NULL) return;  if ((id = plugin_get_id("fvin_postprocess")) < 0) return;  for(p=global_plugin_list[id];p;p=p->next) {    func = (FUNC_INT) p->func;    (*func)(vecbuf, veclen, nframe);  }}voidplugin_exec_vector_postprocess_all(HTK_Param *param){  int id;  PLUGIN_ENTRY *p;  FUNC_INT func;  int t;  if (global_plugin_list == NULL) return;  if ((id = plugin_get_id("fvin_postprocess")) < 0) return;  for(t=0;t<param->samplenum;t++) {    for(p=global_plugin_list[id];p;p=p->next) {      func = (FUNC_INT) p->func;      (*func)(param->parvec[t], param->veclen, t);    }  }}voidplugin_exec_process_result(Recog *recog){  int id;  PLUGIN_ENTRY *p;  FUNC_VOID func;  RecogProcess *rtmp, *r;  Sentence *s;  int i;  int len;  char *str;  if (global_plugin_list == NULL) return;  /* for result_str(), return the best sentence string among processes */  s = NULL;  for(rtmp=recog->process_list;rtmp;rtmp=rtmp->next) {    if (! rtmp->live) continue;    if (rtmp->result.status >= 0 && rtmp->result.sentnum > 0) { /* recognition succeeded */      if (s == NULL || rtmp->result.sent[0].score > s->score) {	r = rtmp;	s = &(r->result.sent[0]);      }    }  }  if (s == NULL) {    str = NULL;  } else {    len = 0;    for(i=0;i<s->word_num;i++) len += strlen(r->lm->winfo->woutput[s->word[i]]) + 1;    str = (char *)mymalloc(len);    str[0]='\0';    for(i=0;i<s->word_num;i++) {      if (strlen(r->lm->winfo->woutput[s->word[i]]) == 0) continue;      if (strlen(str) > 0) strcat(str, " ");      strcat(str, r->lm->winfo->woutput[s->word[i]]);    }  }  if ((id = plugin_get_id("result_best_str")) < 0) return;  for(p=global_plugin_list[id];p;p=p->next) {    func = (FUNC_VOID) p->func;    (*func)(str);  }  if (str != NULL) free(str);}/************************************************************************//* assume only one MFCC module! *//************************************************************************/booleanmfc_module_init(MFCCCalc *mfcc, Recog *recog){  mfcc->plugin_source = recog->jconf->input.plugin_source;  if (mfcc->plugin_source < 0) {    jlog("ERROR: SP_MDCMODULE selected but plugin is missing?\n");    return FALSE;  }  mfcc->func.fv_standby  = (boolean (*)()) plugin_get_func(mfcc->plugin_source, "fvin_standby");  mfcc->func.fv_begin    = (boolean (*)()) plugin_get_func(mfcc->plugin_source, "fvin_open");  mfcc->func.fv_read 	   = (int (*)(VECT *, int)) plugin_get_func(mfcc->plugin_source, "fvin_read");  mfcc->func.fv_end 	   = (boolean (*)()) plugin_get_func(mfcc->plugin_source, "fvin_close");  mfcc->func.fv_resume   = (boolean (*)()) plugin_get_func(mfcc->plugin_source, "fvin_resume");  mfcc->func.fv_pause    = (boolean (*)()) plugin_get_func(mfcc->plugin_source, "fvin_pause");  mfcc->func.fv_terminate= (boolean (*)()) plugin_get_func(mfcc->plugin_source, "fvin_terminate");  if (mfcc->func.fv_read == NULL) {    jlog("ERROR: FEATURE_INPUT plugin: fvin_read() not found!\n");    return FALSE;  }  return TRUE;}booleanmfc_module_set_header(MFCCCalc *mfcc, Recog *recog){  FUNC_INT func;  unsigned int ret;  func = (FUNC_INT) plugin_get_func(mfcc->plugin_source, "fvin_get_configuration");  if (func == NULL) {    jlog("ERROR: feature vector input plugin: fvin_get_configuration() not found\n");    return FALSE;  }  /* vector length in unit */  mfcc->param->veclen = (*func)(0);  mfcc->param->header.sampsize = mfcc->param->veclen * sizeof(VECT);  /* frame shift in msec */  mfcc->param->header.wshift = (*func)(1) * 10000.0;  /* parameter type for checking (return 0xffff to disable the check) */  ret = (*func)(2);  if (ret == 0xffff) {    /* disable type checking */    recog->jconf->input.paramtype_check_flag = FALSE;  } else {    mfcc->param->header.samptype = ret;  }  return TRUE;}booleanmfc_module_standby(MFCCCalc *mfcc){  FUNC_INT func;  int ret;  if (mfcc->func.fv_standby) ret = mfcc->func.fv_standby();  else ret = TRUE;  mfcc->segmented_by_input = FALSE;  return ret;}booleanmfc_module_begin(MFCCCalc *mfcc){  FUNC_INT func;  int ret;  if (mfcc->segmented_by_input) return TRUE; /* do nothing if last was segmented */  if (mfcc->func.fv_begin) ret = mfcc->func.fv_begin();  else ret = TRUE;  return ret;}booleanmfc_module_end(MFCCCalc *mfcc){  FUNC_INT func;  int ret;  if (mfcc->segmented_by_input) return TRUE; /* do nothing if last was segmented */  if (mfcc->func.fv_end) ret = mfcc->func.fv_end();  else ret = TRUE;  return ret;}intmfc_module_read(MFCCCalc *mfcc, int *new_t){  FUNC_INT func;  int ret;  /* expand area if needed */  if (param_alloc(mfcc->param, mfcc->f + 1, mfcc->param->veclen) == FALSE) {    jlog("ERROR: FEATURE_INPUT plugin: failed to allocate memory\n");    return -2;  }  /* get data */  ret = mfcc->func.fv_read(mfcc->param->parvec[mfcc->f], mfcc->param->veclen);  if (ret == -3) {    /* function requests segmentation of the current recognition */    mfcc->segmented_by_input = TRUE;    *new_t = mfcc->f;    return -3;  } else if (ret == -1) {    /* end of input */    mfcc->segmented_by_input = FALSE;    *new_t = mfcc->f;    return -1;  } else if (ret == -2) {    /* error */    jlog("ERROR: FEATURE_INPUT plugin: fvin_read() returns error (-2)\n");    return -2;  }      *new_t = mfcc->f + 1;  return 0;}  #endif /* ENABLE_PLUGIN *//* end of file */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -