示例#1
0
void CA_UnloadAcoustic(CA_Acoustic *hAcoust)
{
  TRY_CA_EXCEPT
  ASSERT(hAcoust);
  
  if (hAcoust->is_loaded == False)
    SERVICE_ERROR(ACOUSTIC_NOT_LOADED);
  if (hAcoust->swimodel)
  {
    free_swimodel(hAcoust->swimodel);
    hAcoust->swimodel = 0;
    hAcoust->is_loaded = False;
    return;
  }
	else
		SERVICE_ERROR(ACOUSTIC_NOT_LOADED);
  return;
  
  BEG_CATCH_CA_EXCEPT
  END_CATCH_CA_EXCEPT(hAcoust)
}
示例#2
0
const SWIModel* load_swimodel(const char *filename)
{
  int i;
  SWIModel *swimodel = NULL;
  const void* file = NULL;

#ifdef SREC_ENGINE_VERBOSE_LOGGING
  PLogMessage("load_swimodel: loaded %s", filename);
#endif
  swimodel = (SWIModel*) CALLOC(1, sizeof(SWIModel), "clib.models.base");

  if (mmap_zip(filename, &swimodel->mmap_zip_data, &swimodel->mmap_zip_size)) {
      PLogError("load_swimodel: mmap_zip failed for %s\n", filename);
      goto CLEANUP;
  }
  file = swimodel->mmap_zip_data;

  swimodel->num_hmmstates = *(const short*)file;
  file += sizeof(short);
  swimodel->num_dims = *(const short*)file;
  file += sizeof(short);
  swimodel->num_pdfs = *(const short*)file;
  file += sizeof(short);

  SWIhmmState* hmmstates = (SWIhmmState*) CALLOC(swimodel->num_hmmstates, sizeof(SWIhmmState), "clib.models.states");
  swimodel->hmmstates = hmmstates;

  const short* num_pdfs_in_model = (const short*)file;
  file += sizeof(short) * swimodel->num_hmmstates;

  swimodel->allmeans = (const featdata*)file;
  file += sizeof(featdata) * swimodel->num_pdfs * swimodel->num_dims;

  swimodel->allweights = (const wtdata*)file;
  file += sizeof(wtdata) * swimodel->num_pdfs;

  swimodel->avg_state_durations = (const featdata*)file;
  file += sizeof(featdata) * swimodel->num_hmmstates;

  if (file > swimodel->mmap_zip_data + swimodel->mmap_zip_size) {
      PLogError("load_swimodel: not enough data in %s", filename);
      goto CLEANUP;
  }

#ifdef SREC_ENGINE_VERBOSE_LOGGING
  PLogMessage("loaded models %s num_hmmstates %d num_dims %d num_pdfs %d weights[0] %d\n",
              filename, swimodel->num_hmmstates, swimodel->num_dims, swimodel->num_pdfs,
              *swimodel->allweights);
#endif

  const featdata* mean_ptr = swimodel->allmeans;
  const wtdata* weight_ptr = swimodel->allweights;

  for (i = 0;i < swimodel->num_hmmstates;i++)
  {
    hmmstates[i].num_pdfs = num_pdfs_in_model[i];
    hmmstates[i].means = mean_ptr;
    hmmstates[i].weights = weight_ptr;
    mean_ptr += swimodel->num_dims * num_pdfs_in_model[i];
    weight_ptr += num_pdfs_in_model[i];
  }

  return swimodel;

CLEANUP:
  free_swimodel(swimodel);
  return NULL;
}