📄 hcompv.c
字号:
}/* 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 + -