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

📄 hlabel.c

📁 实现HMM算法
💻 C
📖 第 1 页 / 共 4 页
字号:
      HError(6551,"LoadMasterFile: MLF file header is missing");    incSpaces=FALSE;   while (fgets(buf,1024,f) != NULL){      if (!inEntry && FindMLFStr(buf,&pst,&pen)) {         e = (MLFEntry *)New(&mlfHeap,sizeof(MLFEntry));         e->type = FindMLFType(pen+1,&men);         if (e->type == MLF_IMMEDIATE) {            e->def.immed.fidx = numMLFs;            e->def.immed.offset = ftell(f);//若成功,返回当前文件指针位置;若出错,返回-1L            if (e->def.immed.offset < 0)               HError(6521,"LoadMasterFile: cant ftell on MLF file");            inEntry = TRUE; /* ignore ".." within an entry */         } else {            if (!FindMLFStr(men+1,&dst,&den))               HError(6551,"LoadMasterFile: Missing subdir in MLF\n(%s)",buf);            *den = '\0';            e->def.subdir = NewString(&mlfHeap,den-dst-1);            strcpy(e->def.subdir,dst+1);         }         *pen = '\0';         /* overwrite trailing pattern quote */         ++pst;               /* skipover leading pattern quote */         e->patType = ClassifyMLFPattern(pst);         if (e->patType == PAT_ANYPATH)             pst += 2;         /* skipover leading "* /" */         e->pattern = NewString(&mlfHeap,pen-pst);         strcpy(e->pattern,pst);         e->patHash = (e->patType==PAT_GENERAL)?0:MLFHash(e->pattern);         StoreMLFEntry(e);//1207 将e加入到linked list of MLFEntry       } else         if (inEntry && IsDotLine(buf)) inEntry = FALSE;   }   if (compatMode && incSpaces)      HError(-6551,"LoadMasterFile: . or %s on line with spaces in %s",             LEVELSEP,fname);   mlfile[numMLFs++] = f;}/* EXPORT->NumMLFFiles: return number of loaded MLF files */int NumMLFFiles(void){   return numMLFs;}/* EXPORT->NumMLFEntries: return number of entries in the MLFTab */int NumMLFEntries(void){   return mlfUsed;}/* EXPORT->GetMLFFile: return fidx'th MLF file pointer */FILE *GetMLFFile(int fidx){   if (fidx<0 || fidx>=numMLFs)      HError(6520,"GetMLFFile: fidx out of range[%d]",fidx);   return mlfile[fidx];}/*EXPORT->IsMLFFile: return true if fn is an MLF */Boolean IsMLFFile(char *fn){   FILE *f;   char buf[1024];      if ((f = fopen(fn,"rb")) == NULL) return FALSE;   if (fgets(buf,1024,f) == NULL) {      fclose(f); return FALSE;   }   if (NoMLFHeader(buf)) {      fclose(f); return FALSE;   }   fclose(f); return TRUE;}/* EXPORT->GetMLFEntry: Return the first entry in the MLF table */MLFEntry *GetMLFTable(void){   return mlfHead;}/* SplitPath: last name in path is removed and prefixed to name, then              this new name is suffixed to subdir and stored in tryspec */            static void SplitPath(char *path, char *name, char *subdir, char *tryspec){   char buf1[1024],buf2[1024],*p;   char pch[2] = " ";      pch[0] = PATHCHAR;   PathOf(path,buf1); NameOf(path,buf2);   if (strlen(name)>0 ) strcat(buf2,pch);    /* new name */   strcat(buf2,name); strcpy(name,buf2);   p = buf1+strlen(buf1)-1;                  /* new path */   if (*p == PATHCHAR) *p = '\0';   strcpy(path,buf1);      strcpy(buf1,subdir);                      /* tryspec */   p = buf1+strlen(buf1)-1;   if (*p != PATHCHAR) strcat(buf1,pch);   strcat(buf1,name);   strcpy(tryspec,buf1);}/* OpenLabFile: opens a file corresponding to given fname, the file                returned may be a real file or simply the MLF seek'ed                to the start of an immediate file definition, isMLF                tells you which it is.  Returns NULL if nothing found  */static FILE * OpenLabFile(char *fname, Boolean *isMLF){   FILE *f;   MLFEntry *e;   char path[1024],name[256],tryspec[1024];   Boolean isMatch = FALSE;   unsigned fixedHash;     /* hash value for PAT_FIXED */   unsigned anypathHash;   /* hash value for PAT_ANYPATH */    char *fnStart;          /* start of actual file name */   static MLFEntry *q=NULL;/* entry after last one accessed - checked first */      *isMLF = FALSE;    fixedHash = anypathHash = MLFHash(fname);   fnStart = strrchr(fname,PATHCHAR);   if (fnStart != NULL) {      ++fnStart;      anypathHash = MLFHash(fnStart);   } else       fnStart = fname;   if (trace&T_MLF)      printf("HLabel: Searching for label file %s\n",fname);   if (trace&T_MHASH)       printf("HLabel:  anypath hash = %d;  fixed hash = %d\n",anypathHash,fixedHash);   for (e=(q==NULL?mlfHead:q); e != NULL; e = (e==NULL?mlfHead:e->next)) {      switch (e->patType){      case PAT_GENERAL:         if (trace&T_MAT)             printf("HLabel:  general match against %s\n",e->pattern);         isMatch = DoMatch(fname,e->pattern);         break;      case PAT_ANYPATH:         if (trace&T_MAT)             printf("HLabel:  anypath match against %s[%d]\n",e->pattern,e->patHash);         if (e->patHash == anypathHash)            isMatch = strcmp(e->pattern,fnStart) == 0;         else            isMatch = FALSE;         break;      case PAT_FIXED:         if (trace&T_MAT)             printf("HLabel:  fixed match against %s[%d]\n",e->pattern,e->patHash);         if (e->patHash == fixedHash)            isMatch = strcmp(e->pattern,fname) == 0;         else            isMatch = FALSE;         break;      }      if ( isMatch ) {         if (e->type == MLF_IMMEDIATE) {            f = mlfile[e->def.immed.fidx];            if (fseek(f,e->def.immed.offset,SEEK_SET) != 0)               HError(6521,"OpenLabFile: cant seek to label def in MLF");            *isMLF=TRUE;            if (trace&T_MLF)               printf("HLabel: Loading Immediate Def [Pattern %s]\n",                      e->pattern);            q=e->next;            return f;         } else {            name[0] = '\0'; strcpy(path,fname);            SplitPath(path,name,e->def.subdir,tryspec);            if (trace&T_SUBD)               printf("HLabel: trying %s\n",tryspec);            f = fopen(tryspec,"rb");            while (f==NULL && e->type == MLF_FULL && strlen(path)>0) {               SplitPath(path,name,e->def.subdir,tryspec);               if (trace&T_SUBD)                  printf("HLabel: trying %s\n",tryspec);               f = fopen(tryspec,"rb");            }            if (f != NULL) {               if (trace&T_MLF)                  printf("HLabel: Loading Label File %s [Pattern %s]\n",                         tryspec,e->pattern);               return f;            }         }      }      if (q!=NULL) e=NULL;      q = NULL;   }   /* No MLF Match so try direct open */     if (trace&T_SUBD)      printf("HLabel: trying actual file %s\n",fname);   f = fopen(fname,"rb");   if (f !=NULL && trace&T_MLF)      printf("HLabel: Loading Actual Label File %s\n", fname);   return f;}/* ------------------ Label File Opening/Closing -------------------- *//* EXPORT->LOpen: Load transcription in fname and return it */Transcription *LOpen(MemHeap *x, char * fname, FileFormat fmt){   FILE *f;   Source source;   char buf[MAXSTRLEN];   Transcription *t;   Boolean isMLF;   if (fmt == UNDEFF){      if (GetConfStr(cParm,numParm,"SOURCELABEL",buf))         fmt = Str2Format(buf);      else         fmt = HTK;   }   if ((f=OpenLabFile(fname, &isMLF)) == NULL)      HError(6510,"LOpen: Unable to open label file %s",fname);   AttachSource(f,&source);   strcpy(source.name,fname);   t = CreateTranscription(x);   switch (fmt) {   case TIMIT:    LoadTIMITLabels(x,t,&source); break;   case HTK:      LoadHTKLabels(x,t,&source); break;/*当前执行此分支*/   case SCRIBE:   LoadSCRIBELabels(x,t,&source); break;   case ESPS:     LoadESPSLabels(x,t,&source); break;   default:      HError(6572,"LOpen: Illegal label file format [%d]",fmt);   }   if (!isMLF) fclose(f);   if (transLev > 0) FilterLevel(t,transLev-1);   return t;}   /* EXPORT->SaveToMasterfile: make all subsequent LSaves go to fname */ReturnStatus SaveToMasterfile(char *fname){   int i;   LabId nid;   OutMLFEntry *omlf;   char buf[MAXSTRLEN];   if (fname==NULL || *fname=='\0') {      outMLF=NULL;       return (FAIL);   }   sprintf(buf,"#!MLF-%s!#",fname);   if ((nid=GetLabId(buf,FALSE))!=NULL) {      for (omlf=outMLFSet, i=0; i<numOutMLF; i++, omlf++)         if (omlf->name==nid) break;      if (i<numOutMLF) {         if ((outMLF = omlf->file)==NULL){            HRError(6511,"SaveToMasterfile: MLF file %s already closed",fname);            return(FAIL);         }         return(SUCCESS);      }   }   if (numOutMLF==MAXMLFS-1){      HRError(6511,"SaveToMasterfile: Unable to create MLF file %s",fname);      return(FAIL);   }   if ((outMLF=fopen(fname,"w")) == NULL){      HRError(6511,"SaveToMasterfile: Unable to create MLF file %s",fname);      return(FAIL);   }   fprintf(outMLF,"#!MLF!#\n");   nid = GetLabId(buf,TRUE);   outMLFSet[numOutMLF].file = outMLF;   outMLFSet[numOutMLF].name = nid;   numOutMLF++;   return(SUCCESS);}/* EXPORT->CloseMLFSaveFile: Close the MLF output file */void CloseMLFSaveFile(void){   int i;   OutMLFEntry *omlf;   if (outMLF != NULL) {      fclose(outMLF);      for (omlf=outMLFSet,i=0; i<numOutMLF; i++,omlf++)         if (omlf->file==outMLF) {            omlf->file = NULL;            break;         }      outMLF = NULL;   }}/* SaveESPSLabels: Save transcription in f using ESPSwaves format */static void SaveESPSLabels( FILE *f, Transcription *t){   LabList *ll;   LLink p;      if ( t->numLists > 1 )      HError(6572,"SaveESPSLabels: can't save multiple level transcription.");   fprintf(f,"#\n");    /* Write waves label header */   ll = t->head;   for (p=ll->head->succ; p->succ != NULL; p=p->succ)      fprintf(f,"%f 121 %s\n", (p->end+0.5)*1E-7, p->labid->name);}/* SaveHTKLabels: Save transcription in f using HTK format */static void SaveHTKLabels( FILE *f, Transcription *t) {   int i,j;   LabList *ll;   LLink p,hd;   LabId id;   Boolean hasScores[100];   ll = t->head;   for (i=1; i<=t->numLists; i++,ll=ll->next){      hd = ll->head;      /* See which columns have scores */      for (j=0; j<=ll->maxAuxLab; j++)         hasScores[j] = FALSE;      for (p = hd->succ; p->succ != NULL; p = p->succ){         if (p->score != 0.0)            hasScores[0] = TRUE;         for (j=1; j<=ll->maxAuxLab; j++)            if (p->auxScore[j] != 0.0)               hasScores[j] = TRUE;      }      for (p = hd->succ; p->succ != NULL; p = p->succ) {         if (p->start>=0.0) {            fprintf(f,"%.0f ",p->start / htkLabelTimeScale);            if (p->end>=0.0)                fprintf(f,"%.0f ",p->end / htkLabelTimeScale);         }         WriteString(f,p->labid->name,labelQuote);         if (hasScores[0])            fprintf(f," %f",p->score);         for (j=1; j<=ll->maxAuxLab; j++) {            id = p->auxLab[j];            if (id !=NULL){               fputc(' ',f);               WriteString(f,id->name,labelQuote);               if (hasScores[j])                  fprintf(f," %f",p->auxScore[j]);            }         }         fprintf(f,"\n");      }      if (i<t->numLists)         fprintf(f,"%s\n",LEVELSEP);   }}/* EXPORT->LSave: Save transcription in fname */ReturnStatus LSave(char *fname, Transcription *t, FileFormat fmt){   FILE *f;   char buf[MAXSTRLEN];   if (fmt == UNDEFF){      if (GetConfStr(cParm,numParm,"TARGETLABEL",buf))         fmt = Str2Format(buf);      else         fmt = HTK;   }   if (outMLF != NULL) {      if (fmt != HTK){         HRError(6572,"LSave: cant save to MLF in %s format",Format2Str(fmt));         return(FAIL);      }      f = outMLF;                      /* save to MLF file */      fprintf(f,"\"%s\"\n",fname);   } else                              /* else open new one */      if ((f=fopen(fname,"wb")) == NULL){         HRError(6511,"LSave: Unable to create label file %s",fname);         return(FAIL);      }   if (trace&T_SAV)      printf("HLabel: Saving transcription to %s in format %s\n",             fname,Format2Str(fmt));   switch (fmt) {   case HTK:    SaveHTKLabels( f, t);   break;   case ESPS:   SaveESPSLabels(f, t);   break;   default: HRError(6572,"LSave: Illegal label file format.");       fclose(f);      return(FAIL);      break;   }   if (outMLF != NULL && fmt==HTK){      fprintf(f,".\n");  fflush(f);   }else      fclose(f);   return(SUCCESS);}/* ------------------------ End of HLabel.c ------------------------- */

⌨️ 快捷键说明

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