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

📄 hcompv.c

📁 该压缩包为最新版htk的源代码,htk是现在比较流行的语音处理软件,请有兴趣的朋友下载使用
💻 C
📖 第 1 页 / 共 3 页
字号:
}/* TriDiag2Vector: Copy diagonal from m into v */void TriDiag2Vector(TriMat m, Vector v){   int i,size;   if (TriMatSize(m) != (size=VectorSize(v)))      HError(2090,"TriDiag2Vector: Covariance sizes differ %d vs %d",             TriMatSize(m),VectorSize(v));   for (i=1; i<=size; i++)      v[i] = m[i][i];}/* SetCovs: set covariance values in hmm */void SetCovs(void){   int i,s,m;   StateElem *se;   StreamElem *ste;   MixtureElem *me;   MixPDF *mp;   CalcCovs();   if (trace&T_TOP) {      printf("Updating HMM ");      if (meanUpdate) printf("Means and ");      printf("Covariances\n");   }   for (i=2,se=hmmLink->svec+2; i < hmmLink->numStates; i++,se++)      for (s=1,ste=se->info->pdf+1; s <= hset.swidth[0]; s++,ste++)         for (m=1,me = ste->spdf.cpdf+1; m<=ste->nMix; m++, me++) {            mp = me->mpdf;            if (meanUpdate && !IsSeenV(mp->mean)){      /* meanSum now holds mean */               CopyVector(accs[s].meanSum,mp->mean);                TouchV(mp->mean);            }            if (!IsSeenV(mp->cov.var)){               if (mp->ckind==FULLC)                  CopyMatrix(accs[s].fixed.inv,mp->cov.inv);               else if (fullcNeeded[s])  /* dont need full cov, but its all we have */                                  TriDiag2Vector(accs[s].fixed.inv,mp->cov.var);               else                  CopyVector(accs[s].fixed.var,mp->cov.var);               TouchV(mp->cov.var);            }         }   ClearSeenFlags(&hset,CLR_ALL);}/* PutVFloor: output variance floor vectors */void PutVFloor(void){   int i,s;   char outfn[MAXSTRLEN],vName[32],num[10];   FILE *f;   Vector v;      MakeFN("vFloors",outDir,NULL,outfn);   if ((f = fopen(outfn,"w")) == NULL)      HError(2011,"PutVFloor: cannot create %s",outfn);   for (s=1; s <= hset.swidth[0]; s++) {      v = CreateVector(&gstack,hset.swidth[s]);      sprintf(num,"%d",s);       strcpy(vName,"varFloor"); strcat(vName,num);      fprintf(f,"~v %s\n",vName);      if (fullcNeeded[s])                       TriDiag2Vector(accs[s].squareSum.inv,v);      else         CopyVector(accs[s].fixed.var,v);      for (i=1; i<=hset.swidth[s]; i++)         v[i] *= vFloorScale;      fprintf(f,"<Variance> %d\n",hset.swidth[s]);      WriteVector(f,v,FALSE);      FreeVector(&gstack,v);   }   fclose(f);   if (trace&T_TOP)      printf("Var floor macros output to file %s\n",outfn);}/* ---------------- Load Data and Accumulate Stats --------------- *//* AccVar:  update global accumulators with given observation */void AccVar(Observation obs){   int x,y,s,V;   float val;   Vector v;   totalCount++;   for (s=1; s<=hset.swidth[0]; s++){      v = obs.fv[s]; V = hset.swidth[s];      for (x=1;x<=V;x++) {          val=v[x];                     accs[s].meanSum[x] += val;     /* accumulate mean */                                      if (fullcNeeded[s]) {          /* accumulate covar */             accs[s].squareSum.inv[x][x] += val*val;            for (y=1;y<x;y++)                accs[s].squareSum.inv[x][y] += val*v[y];         } else                         /* accumulate var */            accs[s].squareSum.var[x] += val*val;      }   }}/* CheckData: check data file consistent with HMM definition */void CheckData(char *fn, BufferInfo info) {   if (info.tgtVecSize!=hset.vecSize)      HError(2050,"CheckData: Vector size in %s[%d] is incompatible with hmm %s[%d]",             fn,info.tgtVecSize,hmmfn,hset.vecSize);   if (info.tgtPK != hset.pkind)      HError(2050,"CheckData: Parameterisation in %s is incompatible with hmm %s",             fn,hmmfn);}/* LoadFile: load whole file or segments and accumulate variance */void LoadFile(char *fn){   ParmBuf pbuf;   BufferInfo info;   char labfn[80];   Transcription *trans;   long segStIdx,segEnIdx;     int i,j,ncas,nObs;   LLink p;      if (segId == NULL)  {   /* load whole parameter file */      if((pbuf=OpenBuffer(&iStack, fn, 0, dff, FALSE_dup, FALSE_dup))==NULL)         HError(2050,"LoadFile: Config parameters invalid");      GetBufferInfo(pbuf,&info);      CheckData(fn,info);      nObs = ObsInBuffer(pbuf);      for (i=0; i<nObs; i++){         ReadAsTable(pbuf,i,&obs);         AccVar(obs);        }      if (trace&T_LOAD) {         printf(" %d observations loaded from %s\n",nObs,fn);         fflush(stdout);      }              CloseBuffer(pbuf);   }   else {                  /* load segment of parameter file */      MakeFN(fn,labDir,labExt,labfn);      trans = LOpen(&iStack,labfn,lff);      ncas = NumCases(trans->head,segId);      if ( ncas > 0) {         if((pbuf=OpenBuffer(&iStack, fn, 0, dff, FALSE_dup, FALSE_dup))==NULL)            HError(2050,"LoadFile: Config parameters invalid");         GetBufferInfo(pbuf,&info);         CheckData(fn,info);         for (i=1,nObs=0; i<=ncas; i++) {            p = GetCase(trans->head,segId,i);            segStIdx= (long) (p->start/info.tgtSampRate);            segEnIdx  = (long) (p->end/info.tgtSampRate);            if (trace&T_SEGS)               printf(" loading seg %s [%ld->%ld]\n",                      segId->name,segStIdx,segEnIdx);            if (segEnIdx >= ObsInBuffer(pbuf))               segEnIdx = ObsInBuffer(pbuf)-1;            if (segEnIdx >= segStIdx) {               for (j=segStIdx;j<=segEnIdx;j++) {                  ReadAsTable(pbuf,j,&obs);                  AccVar(obs); ++nObs;               }            }         }                 CloseBuffer(pbuf);         if (trace&T_LOAD)            printf(" %d observations loaded from %s\n",nObs,fn);      }     }   ResetHeap(&iStack);}/* ------------------------- Save Model ----------------------- *//* SaveModel: save HMMSet containing one model */void SaveModel(char *outfn){   if (outfn != NULL)      macroLink->id = GetLabId(outfn,TRUE);   if(SaveHMMSet(&hset,outDir,NULL,NULL,saveBinary)<SUCCESS)      HError(2011,"SaveModel: SaveHMMSet failed");}/* ------------- Cepstral Mean Substraction & Variance Normalisation ------------ *//* initialise and return an instance of SpkrAcc */  SpkrAcc *InitSpkrAcc(void){   SpkrAcc *sa;   sa = New(&gstack,sizeof(SpkrAcc));   sa->meanSum = CreateVector(&gstack,vSize);   ZeroVector(sa->meanSum);   sa->squareSum = CreateVector(&gstack,vSize);   ZeroVector(sa->squareSum);   sa->NumFrame = 0;   return sa;}/* reset an instance of SpkrAcc type */ void ClrSpkrAcc(SpkrAcc *sa){   ZeroVector(sa->meanSum);   ZeroVector(sa->squareSum);   sa->NumFrame = 0;}  /* Accumulate stats from an utterance file */SpkrAcc *AccGenUtt(char *SpkrPattern, char *UttFileName, SpkrAcc *sa){   char SpkrName[MAXSTRLEN];   ParmBuf pbuf;   BufferInfo info;   short swidth[SMAX];   Boolean eSep;   Vector tempV;   int i;   if (MaskMatch(SpkrPattern,SpkrName,UttFileName)==TRUE){      /* open buffer and construct observation */      pbuf = OpenBuffer(&iStack,UttFileName,0,dff,FALSE_dup,FALSE_dup);      GetBufferInfo(pbuf,&info);      if ((info.tgtPK & HASZEROM) && strchr(oflags,'m')) {         HError(-2021,"HCompV: AccGenUtt: qualifier _Z not appropriate when calculating means!\n");      }      /* treat as single stream system though a bit weird */      ZeroStreamWidths(1,swidth);      SetStreamWidths(info.tgtPK,info.tgtVecSize,swidth,&eSep);      obs = MakeObservation(&gstack,swidth,info.tgtPK,FALSE,eSep);      if (info.tgtVecSize != vSize){         vSize = info.tgtVecSize;         /* if needed init a SpkrAcc */         sa = InitSpkrAcc();         fprintf(stdout,"Target observation vector size set to %d ......\n",info.tgtVecSize);         fflush(stdout);      }      ParmKind2Str(info.tgtPK,TargetPKStr);      /* accumulate stats for current utterance file */      StartBuffer(pbuf);      while (BufferStatus(pbuf) != PB_CLEARED)          {            /* copy current observation and set vector ptr to first stream */            ReadAsBuffer(pbuf,&obs);            tempV = obs.fv[1];            for (i=1;i<=vSize;i++){               sa->meanSum[i] += tempV[i];               sa->squareSum[i] += tempV[i]*tempV[i];            }            sa->NumFrame += 1;         }      CloseBuffer(pbuf);      strcpy(sa->SpkrName,SpkrName);      if (trace&T_CMV){         fprintf(stdout,"Utterance %s accumulate generated for speaker %s\n",UttFileName,sa->SpkrName);         fflush(stdout);      }      ResetHeap(&iStack);      return sa;   }   else {      HError(2039,"HCompV: AccGenUtt: speaker pattern matching failure on file: %s\n",UttFileName);      return NULL;   }}/* Append speaker accumulate structure list */SpkrAccListItem *AppendSpkrAccList(SpkrAccListItem *sal, SpkrAcc *sa){   SpkrAccListItem *temp;   int i;   temp = New(&gstack,sizeof(SpkrAccListItem));   temp->sa = InitSpkrAcc();   for (i=1;i<=vSize;i++){      temp->sa->meanSum[i] = sa->meanSum[i];      temp->sa->squareSum[i] = sa->squareSum[i];   }   temp->sa->NumFrame = sa->NumFrame;   strcpy(temp->sa->SpkrName,sa->SpkrName);   temp->nextSpkr = sal;   sal = temp;     if (trace&T_CMV){      fprintf(stdout,"Creating entry for speaker %s ......\n",sa->SpkrName);      fflush(stdout);   }   return sal;}/*    search the speaker accumulate list and if there is an entry for the   current speaker given in sa, then update the entry in the list; otherwise   insert sa into the list as a new speaker entry*/SpkrAccListItem *UpdateSpkrAccList(SpkrAccListItem *sal, SpkrAcc *sa){    SpkrAccListItem *p;   int i;

⌨️ 快捷键说明

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