/* AppendParm: append the src file to current Buffer pb. Return appended len */ HTime AppendParm(char *src) { int i; char bf1[MAXSTRLEN]; char bf2[MAXSTRLEN]; short swidth[SMAX]; Boolean eSep; ParmBuf b, cb; Observation o; BufferInfo info; if((b = OpenBuffer(&iStack,src,0,srcFF,TRI_UNDEF,TRI_UNDEF))==NULL) HError(1050,"AppendParm: Config parameters invalid"); GetBufferInfo(b,&info); if(trace & T_KINDS ){ printf("Appending file %s format: %s [%s]->[%s]\n",src, Format2Str(info.srcFF), ParmKind2Str(info.srcPK,bf1), ParmKind2Str(info.tgtPK,bf2)); } if (tgtSampRate != info.tgtSampRate) HError(1032,"AppendParm: Input file %s has inconsistent sample rate",src); if ( BaseParmKind(tgtPK) != BaseParmKind(info.tgtPK)) HError(1032,"AppendParm: Input file %s has inconsistent tgt format",src); cb = (chopF)?ChopParm(b,st,en,info.tgtSampRate) : b; ZeroStreamWidths(swidth0,swidth); SetStreamWidths(info.tgtPK,info.tgtVecSize,swidth,&eSep); o = MakeObservation(&iStack, swidth, info.tgtPK, saveAsVQ, eSep); for (i=0; i < ObsInBuffer(cb); i++){ ReadAsTable(cb, i, &o); AddToBuffer(pb, o); } CloseBuffer(cb); return(i*info.tgtSampRate); }
/* Initialise: set up global data storage */ void Initialise(char *datafn) { ParmBuf pbuf; int s; Boolean eSep; CreateHeap(&iStack,"inBuf", MSTAK, 1, 0.5, 100000, LONG_MAX); CreateHeap(&dStack,"seqStack", MSTAK, 1, 0.5, 100000, LONG_MAX); CreateHeap(&cStack,"clustStack",MSTAK, 1, 0.5, 100000, LONG_MAX); /* Peek at first data file to get observation format */ if((pbuf = OpenBuffer(&iStack, datafn, 0, UNDEFF, FALSE_dup, FALSE_dup))==NULL) HError(2550,"Initialise: Config parameters invalid"); GetBufferInfo(pbuf, &info); CloseBuffer(pbuf); ResetHeap(&iStack); /* set/validate stream widths */ if(swidth[0] > 0) CheckStreamWidths(info); else ZeroStreamWidths(1,swidth); /* Create an observation to hold the input parameters */ SetStreamWidths(info.tgtPK,info.tgtVecSize,swidth,&eSep); obs = MakeObservation(&gstack,swidth,info.tgtPK,FALSE,eSep); if (segLab != NULL) segId = GetLabId(segLab,TRUE); /* Create sequences to hold all data*/ for (s=1;s<=swidth[0];s++) dSeq[s] = CreateSequence(&dStack,4096); }
/* 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; } }
// Create the observation structure from given info AObsData::AObsData(BufferInfo *info, int numStreams) { Vector v; int size,*ip; kind = ObservationPacket; // Set up stream widths ZeroStreamWidths(numStreams,data.swidth); SetStreamWidths(info->tgtPK,info->tgtVecSize,data.swidth,&(data.eSep)); // Make the observation - assume not discrete data.pk = info->tgtPK; data.bk = data.pk&(~HASNULLE); for (int i=1; i<=numStreams; i++){ size = data.swidth[i]; v = (Vector) new float[size+1]; ip = (int *) v; *ip = size; data.fv[i] = v; } }
/* ChopParm: return parm chopped to st and end. end = 0 means all */ ParmBuf ChopParm(ParmBuf b, HTime start, HTime end, HTime sampRate) { int stObs, endObs, nObs, i; HTime length; short swidth[SMAX]; Boolean eSep; ParmBuf cb; Observation o; BufferInfo info; length = ObsInBuffer(b) * sampRate; ClampStEn(length,&start,&end); if(start >= length) HError(1030,"ChopParm: Src file too short to get data from %.0f",start); if(trace & T_SEGMENT) printf("ChopParm: Extracting segment %.0f to %.0f\n",start,end); stObs = (int) (start/sampRate); endObs = (int) (end/sampRate); nObs = endObs -stObs; if(nObs <= 0) HError(1030,"ChopParm: Truncation options result in zero-length file"); GetBufferInfo(b,&info); ZeroStreamWidths(swidth0,swidth); SetStreamWidths(tgtPK,info.tgtVecSize,swidth,&eSep); o = MakeObservation(&cStack, swidth, info.tgtPK, saveAsVQ, eSep); if (saveAsVQ){ if (info.tgtPK&HASNULLE){ info.tgtPK=DISCRETE+HASNULLE; }else{ info.tgtPK=DISCRETE; } } cb = EmptyBuffer(&cStack, nObs, o, info); for (i=stObs; i < endObs; i++){ ReadAsTable(b, i, &o); AddToBuffer(cb, o); } CloseBuffer(b); if(chopF && labF) ChopLabs(tr,start,end); return(cb); }
/* OpenParmFile: open source parm file and return length */ HTime OpenParmFile(char *src) { int i; ParmBuf b, cb; short swidth[SMAX]; Boolean eSep; Observation o; BufferInfo info; if((b = OpenBuffer(&iStack,src,0,srcFF,TRI_UNDEF,TRI_UNDEF))==NULL) HError(1050,"OpenParmFile: Config parameters invalid"); GetBufferInfo(b,&info); srcSampRate = info.srcSampRate; tgtSampRate = info.tgtSampRate; srcPK = info.srcPK; tgtPK = info.tgtPK; cb = chopF?ChopParm(b,st,en,info.tgtSampRate):b; ZeroStreamWidths(swidth0,swidth); SetStreamWidths(info.tgtPK,info.tgtVecSize,swidth,&eSep); o = MakeObservation(&oStack, swidth, info.tgtPK, saveAsVQ, eSep); if (saveAsVQ){ if (info.tgtPK&HASNULLE){ info.tgtPK=DISCRETE+HASNULLE; }else{ info.tgtPK=DISCRETE; } } pb = EmptyBuffer(&oStack, ObsInBuffer(cb), o, info); for(i=0; i < ObsInBuffer(cb); i++){ ReadAsTable(cb, i, &o); AddToBuffer(pb, o); } CloseBuffer(cb); if( info.nSamples > 0 ) return(info.nSamples*srcSampRate); else return(ObsInBuffer(pb)*info.tgtSampRate); }
barwidth = itemWidth*(nItems+1); } /* PrintHeading: print the info in given HeadInfo record */ void PrintHeading(HeadInfo h) { char buf[MAXSTRLEN]; if (h.isSource){ if (h.isAudio) strcpy(buf,"Source: Direct Audio"); else sprintf(buf,"Source: %s", h.name); }else strcpy(buf,"Target"); PrBar(buf); printf(" Sample Bytes: %-7d", h.sampSize); if (barwidth < 60 ) printf("\n"); printf(" Sample Kind: %s\n", ParmKind2Str(h.kind,buf)); printf(" Num Comps: %-7d", h.numComps); if (barwidth < 60 ) printf("\n"); printf(" Sample Period: %.1f us\n", h.period/10.0); if (!h.isAudio) { printf(" Num Samples: %-7ld", h.nSamples); if (barwidth < 60 ) printf("\n"); printf(" File Format: %s\n", Format2Str(h.fmt)); } } /* PrintWaveLine: print line of waveform samples */ void PrintWaveLine(short *data, int nItems, long idx) { int i; if (!rawOut) printf("%5ld: ",idx); for (i=0; i<nItems; i++) printf("%7d",*data++); printf("\n"); } /* PrintRawVec: print vector components */ void PrintRawVec(Vector v) { int i; for (i=1; i<=VectorSize(v); i++) printf("%e ",v[i]); printf("\n");