Пример #1
0
/* CreateMonoList: set nPhones and create list of monophones */
void CreateMonoList(void)
{
   int i,j;
   Boolean found;
   LabId list[MAXMONOPHONES], id;
   char buf[255];
   MLink q;

   nPhones = 0;
   for (i=0; i<MACHASHSIZE; i++)
      for (q=hset.mtab[i]; q!=NULL; q=q->next)
         if (q->type=='l'){      
            strcpy(buf,q->id->name);
            TriStrip(buf);
            id = GetLabId(buf,TRUE);
            found = FALSE;
            for (j=0; j<nPhones; j++)
               if (list[j] == id) {
                  found = TRUE; break;
               }
            if (!found){
               if (nPhones>=MAXMONOPHONES)
                  HError(2422,"CreateMonoList: Too many monophones");
               list[nPhones++] = id;
            }
         }
   
   monophones = (LabId *)New(&labIdStack, nPhones*sizeof(LabId));
   for (i=0; i<nPhones; i++)
      monophones[i] = list[i];
   --monophones;
}
Пример #2
0
void CheckLAlign (DecoderInst *dec, Lattice *lat)
{
   int i, j;
   LArc *la;
   float dur, laDur;
   Pron pron;

   for (i = 0, la = lat->larcs; i < lat->na; ++i, ++la) {
      if (la->nAlign == 0 || !la->lAlign) {
         if (forceLatOut) {
            /* Faking sentence end arc model alignment */
            FakeSEModelAlign(lat, la);
         }
         else {
            HError (9999, "CheckLAlign: empty model alignment for arc %d", i);
         }
      }

      for (pron = la->end->word->pron; pron; pron = pron->next)
         if (pron->pnum == la->end->v)
            break;
      assert (pron);

      laDur = (la->end->time - la->start->time);
      dur = 0.0;
      for (j = 0; j < la->nAlign; ++j) {
         dur += la->lAlign[j].dur;

#if 0   /* sanity checking -- does not work for non-sildicts */
         strcpy (buf, la->lAlign[j].label->name);
         TriStrip (buf);
         monolab = GetLabId (buf, FALSE);
         assert (pron->phones[j] == monolab);
#endif
      }
#if 0
      assert (la->nAlign == pron->nphones);
#endif

      if (fabs (dur - laDur) > dec->frameDur/2)
         printf ("CheckLAlign: MODALIGN Sanity check failed! %d laDur %.2f  dur %.2f\n", i, laDur, dur);
   }
}
Пример #3
0
void InitPhonePost (DecoderInst *dec)
{
   HMMScanState hss;
   HLink hmm;
   MLink m;
   char buf[100];
   LabId phoneId;

   NewHMMScan (dec->hset, &hss);
   do {
      hmm = hss.hmm;
      assert (!hmm->hook);
      m = FindMacroStruct (dec->hset, 'h', hmm);
      assert (strlen (m->id->name) < 100);
      strcpy (buf, m->id->name);
      TriStrip (buf);
      phoneId = GetLabId (buf, TRUE);
      phoneId->aux = (Ptr) 0;
      hmm->hook = (Ptr) phoneId;
   } while(GoNextHMM(&hss));
   EndHMMScan(&hss);

   dec->nPhone = 0;
   /* count monophones -- #### make this more efficent! */
   NewHMMScan (dec->hset, &hss);
   do {
      hmm = hss.hmm;
      phoneId = (LabId) hmm->hook;
      if (!phoneId->aux) {
         ++dec->nPhone;
         phoneId->aux = (Ptr) dec->nPhone;

         assert (dec->nPhone < 100);
         dec->monoPhone[dec->nPhone] = phoneId;
      }
   } while(GoNextHMM(&hss));
   EndHMMScan(&hss);

   printf ("found %d monophones\n", dec->nPhone);

   dec->phonePost = (LogDouble *) New (&gcheap, (dec->nPhone+1) * sizeof (LogDouble));
   dec->phoneFreq = (int *) New (&gcheap, (dec->nPhone+1) * sizeof (int));
}
Пример #4
0
/* LoadASet: set aSize, load the allophone set of x and return the
             number of states in each model (all allophones must have
             the same number of states) */
int LoadASet(LabId x)
{
   int i,N=0;
   HLink hmm;
   MLink q;
   LabId id;
   char *aid,buf[255];
   
   aSize = 0;
   for (i=0; i<MACHASHSIZE; i++)
      for (q=hset.mtab[i]; q!=NULL; q=q->next)
         if (q->type=='l'){       
            aid = q->id->name;
            strcpy(buf,aid);
            TriStrip(buf);
            id = GetLabId(buf,FALSE);
            if (id==x){
               if (trace&T_OPT)
                  printf("    loading allophone %s\n",aid);
               hmm = (HLink)q->structure;
               if (hmm->numStates>0) {
                  if (N==0) 
                     N = hmm->numStates;
                  else
                     if (N != hmm->numStates)
                        HError(2423,"LoadASet: allophones must have same num states %d vs %d",
                               N, hmm->numStates);
                  hmm->numStates = -N;
                  aSet[++aSize] = hmm;
               }
            }
         }
   for (i=1; i<=aSize; i++)
      aSet[i]->numStates = N;
   return N;
}
Пример #5
0
/* GetTrSym: get next symbol from f, remember that f might be an MLF
             in which case EOF is a period on its own line   */
static void GetTrSym(Source *src, Boolean htk)
{
   int nxtch;
   Boolean trSOL;

   trNum = 0.0; trStr[0]='\0'; 
   if (trSym==TRNULL) curch = GetCh(src);
   if (trSym==TREOL || trSym==TRNULL)
      trSOL=TRUE;
   else
      trSOL=FALSE;
   while (curch == ' ' || curch == '\t') {
      trSOL=FALSE;
      curch = GetCh(src);
   }
   if (!htk && curch == COMMCHAR)
      SkipLine(src);
   
   switch (curch) {
   case EOF:
      trSym = TREOF;
      break;
   case LFEED:
      curch = GetCh(src);
      trSym = TREOL;
      break;
   case CRETURN:
      curch = GetCh(src);
      if (curch == LFEED) curch = GetCh(src);
      trSym = TREOL;
      break;
   case ',':
      if (!htk) {
         curch = GetCh(src); trSym = TRCOMMA;
         break;
      }
   case '.':
      if (curch=='.' && trSOL==TRUE && mlfUsed>0 && htk) {
         nxtch = GetCh(src);
         if (nxtch == LFEED  || nxtch == CRETURN) {
            trSym = TREOF;
            break;
         }
         UnGetCh(nxtch,src);  /*  Requires more than one character pushback */
      }
   default:
      if (htk) {
         UnGetCh(curch,src);
         if (!ReadString(src,trStr)) {
            trSym=TREOF;
            break;
         }
         curch=GetCh(src);
         if (trSOL && strcmp(LEVELSEP,trStr)==0) {
            if (curch == LFEED  || curch == CRETURN) {
               trSym = TRLEV;
               break;
            }
         }
      }
      else {
         nxtch=0;
         do {
            if (nxtch>=255) break;
            trStr[nxtch++]=curch; curch=GetCh(src);
         }
         while (!isspace(curch) && curch != ',' && curch != EOF);
         trStr[nxtch]='\0';
         src->wasQuoted=FALSE;
      }
      if (!src->wasQuoted && IsNumeric(trStr)){
         sscanf(trStr,"%lf",&trNum);
         trSym = TRNUM;
         break;
      }
      if (htk && compatMode && 
          (strcmp(LEVELSEP,trStr)==0 || strcmp(".",trStr)==0)) {
         src->wasNewline=FALSE;
         SkipWhiteSpace(src);
         if (src->wasNewline) {
            curch = CRETURN;
            trSym=(strcmp(LEVELSEP,trStr)==0?TRLEV:TREOF);
            break;
         }
         curch = GetCh(src);
      }
      if (stripTriPhones) TriStrip(trStr);
      trSym = TRSTR;
      break;
   }
}
Пример #6
0
Файл: HLVRec.c Проект: didw/HTS
/* EXPORT->FormatTranscription: Format transcription prior to output */
void ReFormatTranscription(Transcription *trans,HTime frameDur,
                         Boolean states,Boolean models,Boolean triStrip,
                         Boolean normScores,Boolean killScores,
                         Boolean centreTimes,Boolean killTimes,
                         Boolean killWords,Boolean killModels)
{
   LabList *ll;
   LLink lab;
   HTime end;
   char buf[MAXSTRLEN],*p,tail[64];
   int lev,j,frames;
   
   if (killScores) {
      for (lev=1;lev<=trans->numLists;lev++) {
         ll=GetLabelList(trans,lev);
         for(lab=ll->head->succ;lab->succ!=NULL;lab=lab->succ) {
            lab->score=0.0;
            for (j=1;j<=ll->maxAuxLab;j++)
               lab->auxScore[j]=0.0;
         }
      }
   }
   if (triStrip) {
      for (lev=1;lev<=trans->numLists;lev++) {
         ll=GetLabelList(trans,lev);
         for(lab=ll->head->succ;lab->succ!=NULL;lab=lab->succ) {
            if (states && !models) {
               strcpy(buf,lab->labid->name);
               if ((p=strrchr(buf,'['))!=NULL) {
                  strcpy(tail,p);
                  *p=0;
               }
               else
                  *tail=0;
               TriStrip(buf); strcat(buf,tail);
               lab->labid=GetLabId(buf,TRUE);
            }
            else {
               strcpy(buf,lab->labid->name);
               TriStrip(buf); lab->labid=GetLabId(buf,TRUE);
            }
            for (j=1;j<=ll->maxAuxLab;j++) {
               if (lab->auxLab[j]==NULL) continue;
               strcpy(buf,lab->auxLab[j]->name);
               TriStrip(buf); lab->auxLab[j]=GetLabId(buf,TRUE);
            }
         }
      }
   }
   if (normScores) {
      for (lev=1;lev<=trans->numLists;lev++) {
         ll=GetLabelList(trans,lev);
         for(lab=ll->head->succ;lab->succ!=NULL;lab=lab->succ) {
            frames=(int)floor((lab->end-lab->start)/frameDur + 0.4);
            if (frames==0) lab->score=0.0;
            else lab->score=lab->score/frames;
            if (states && models && ll->maxAuxLab>0 && lab->auxLab[1]!=NULL) {
               end=AuxLabEndTime(lab,1);
               frames=(int)floor((end-lab->start)/frameDur + 0.4);
               if (frames==0) lab->auxScore[1]=0.0;
               else lab->auxScore[1]=lab->auxScore[1]/frames;
            }
         }
      }
   }
   if (killTimes) {
      for (lev=1;lev<=trans->numLists;lev++) {
         ll=GetLabelList(trans,lev);
         for(lab=ll->head->succ;lab->succ!=NULL;lab=lab->succ) {
            lab->start=lab->end=-1.0;
         }
      }
   }
   if (centreTimes) {
      for (lev=1;lev<=trans->numLists;lev++) {
         ll=GetLabelList(trans,lev);
         for(lab=ll->head->succ;lab->succ!=NULL;lab=lab->succ) {
            lab->start+=frameDur/2;
            lab->end-=frameDur/2;
         }
      }
   }
   if (killWords) {
      for (lev=1;lev<=trans->numLists;lev++) {
         ll=GetLabelList(trans,lev);
         if (ll->maxAuxLab>0)
            for(lab=ll->head->succ;lab->succ!=NULL;lab=lab->succ)
               lab->auxLab[ll->maxAuxLab]=NULL;
      }
   }
   if (killModels && models && states) {
      for (lev=1;lev<=trans->numLists;lev++) {
         ll=GetLabelList(trans,lev);
         if (ll->maxAuxLab==2)
            for(lab=ll->head->succ;lab->succ!=NULL;lab=lab->succ) {
               lab->auxLab[1]=lab->auxLab[2];
               lab->auxScore[1]=lab->auxScore[2];
               lab->auxLab[2]=NULL;
            }
      }
   }
}