📄 hcopy.c
字号:
HError(-1031,"SetLabSeg: label lists 2 to %d will be ignored", tr->numLists); if (labName != NULL) { /* extract labName */ if (auxLab==0) { p = GetCase(ll,labName,labRep); st = p->start; en = p->end; } else { p = GetAuxCase(ll,labName,labRep,auxLab); st = p->start; en = AuxLabEndTime(p,auxLab); } } else { /* extract labstidx to labenidx */ if (auxLab==0){ FixLabIdxs(CountLabs(ll)); p = GetLabN(ll,curstidx); q = GetLabN(ll,curenidx); st = p->start; en = q->end; }else{ FixLabIdxs(CountAuxLabs(ll,auxLab)); p = GetAuxLabN(ll,curstidx,auxLab); q = GetAuxLabN(ll,curenidx,auxLab); st = p->start; en = AuxLabEndTime(q,auxLab); } } if(trace & T_SEGMENT) printf("Extracting %8.0f to %8.0f\n",st,en);}/* LoadTransLabs: Load transcription from file */Transcription *LoadTransLabs(char *src){ Transcription *t; MakeFN(src,labDir,labExt,labFile); if(trace & T_SEGMENT) printf("Loading label file %s\n",labFile); t = LOpen(&lStack,labFile,srcLabFF); if(chopF && ! stenSet) SetLabSeg(t); return t;}/* SaveLabs: save trans t to label file corresponding to tgt */void SaveLabs(char *tgt, Transcription *t){ MakeFN(tgt,outLabDir,labExt,labFile); if(trace & T_SEGMENT) printf("Saving label file %s\n",labFile); if (CountLabs(trans->head) == 0) HError(-1031,"SaveLabs: No labels in transcription %s", labFile); if(LSave(labFile,t,tgtLabFF)<SUCCESS) HError(1014,"SaveLabs: Could not save label file %s", labFile);}/* AppendLabs: append label file corresponding to src to trans, len is time length of this file; accumulate to find offset for concatenated files */void AppendLabs(Transcription *t, HTime len){ LabList *ll,*transll; LLink p,q; int maxAux; if(trace & T_SEGMENT) printf("Adding labels, len: %.0f off: %.0f\n",len,off); if(trans == NULL) trans = CopyTranscription(&lStack, t); else for (ll = t->head,transll = trans->head; ll != NULL; ll = ll->next,transll = transll->next){ if (transll == NULL) HError(1031,"AppendLabs: lablist has no target to append to"); maxAux = ll->maxAuxLab; if (maxAux > transll->maxAuxLab){ HError(-1031,"AppendLabs: truncating num aux labs from %d down to %d", maxAux, transll->maxAuxLab); maxAux = transll->maxAuxLab; } for (p=ll->head->succ; p->succ!= NULL; p=p->succ){ q = AddLabel(&lStack,transll, p->labid,p->start + off,p->end + off,p->score); if (maxAux>0) AddAuxLab(q,maxAux,p->auxLab,p->auxScore); } } /* accumulate length of this file for total offset */ off += len;}/* ChopLabs: Chop trans around stime to etime. end = 0 means to end of file */void ChopLabs(Transcription *t, HTime start, HTime end){ LabList *ll; LLink p; HTime del = tgtSampRate; /* assume ClampStEn has already been called, so start and end are OK */ if(trace & T_SEGMENT) printf("ChopLab: extracting labels %.0f to %.0f\n",start,end); for (ll = t->head; ll != NULL; ll = ll->next){ for (p=ll->head->succ; p->succ!= NULL; p=p->succ){ if((p->start < start-del) || ((end > 0.0 ) && (p->end > end+del))) { DeleteLabel(p); } else { p->start -= start; p->end -= start; } } }}/* ----------------------- Wave File Handling ------------------------ *//* ChopWave: return wave chopped to st and end. end = 0 means all */Wave ChopWave(Wave srcW, HTime start, HTime end, HTime sampRate){ Wave tgtW; HTime length; /* HTime length of file */ long stSamp, endSamp, nSamps; short *data; data = GetWaveDirect(srcW,&nSamps); length = nSamps * sampRate; if(start >= length) HError(1030,"ChopWave: Source too short to get data from %.0f",start); ClampStEn(length,&start,&end); if(trace & T_SEGMENT) printf("ChopWave: Extracting data %.0f to %.0f\n",start,end); stSamp = (long) (start/sampRate); endSamp = (long) (end/sampRate); nSamps = endSamp - stSamp; if(nSamps <= 0) HError(1030,"ChopWave: Truncation options result in zero-length file"); tgtW = OpenWaveOutput(&cStack,&sampRate,nSamps); PutWaveSample(tgtW,nSamps,data + stSamp); CloseWaveInput(srcW); if(chopF && labF) ChopLabs(tr,start,end); return(tgtW);}/* IsWave: check config parms to see if target is a waveform */Boolean IsWave(char *srcFile){ FILE *f; long nSamp,sampP, hdrS; short sampS,kind; Boolean isPipe,bSwap,isWave; isWave = tgtPK == WAVEFORM; if (tgtPK == ANON){ if ((srcFF == HTK || srcFF == ESIG) && srcFile != NULL){ if ((f=FOpen(srcFile,WaveFilter,&isPipe)) == NULL) HError(1011,"IsWave: cannot open File %s",srcFile); switch (srcFF) { case HTK: if (!ReadHTKHeader(f,&nSamp,&sampP,&sampS,&kind,&bSwap)) HError(1013, "IsWave: cannot read HTK Header in File %s", srcFile); break; case ESIG: if (!ReadEsignalHeader(f, &nSamp, &sampP, &sampS, &kind, &bSwap, &hdrS, isPipe)) HError(1013, "IsWave: cannot read Esignal Header in File %s", srcFile); break; } isWave = kind == WAVEFORM; FClose(f,isPipe); } else isWave = TRUE; } return isWave;}/* OpenWaveFile: open source wave file and extract portion if indicated */HTime OpenWaveFile(char *src){ Wave w, cw; long nSamps; short *data; if((w = OpenWaveInput(&iStack,src,srcFF,0,0,&srcSampRate))==NULL) HError(1013,"OpenWaveFile: OpenWaveInput failed"); srcPK = WAVEFORM; tgtSampRate = srcSampRate; cw = (chopF)?ChopWave(w,st,en,srcSampRate) : w; data = GetWaveDirect(cw,&nSamps); wv = OpenWaveOutput(&oStack, &srcSampRate, nSamps); PutWaveSample(wv,nSamps,data); CloseWaveInput(cw); return(nSamps*srcSampRate);}/* AppendWave: append the src file to global wave wv */HTime AppendWave(char *src){ Wave w, cw; HTime period=0.0; long nSamps; short *data; if((w = OpenWaveInput(&iStack,src, srcFF, 0, 0, &period))==NULL) HError(1013,"AppendWave: OpenWaveInput failed"); if(trace & T_KINDS ) printf("Appending file %s format: %s [WAVEFORM]\n",src, Format2Str(WaveFormat(w))); if(period != srcSampRate) HError(1032,"AppendWave: Input file %s has inconsistent sampling rate",src); cw = (chopF)? ChopWave(w,st,en,srcSampRate) : w; data = GetWaveDirect(cw,&nSamps); PutWaveSample(wv,nSamps,data); CloseWaveInput(cw); return(nSamps*period);}/* ----------------------- Parm File Handling ------------------------ *//* 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);}/* 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);}/* 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);}/* --------------------- Speech File Handling ---------------------- *//* OpenSpeechFile: open waveform or parm file */void OpenSpeechFile(char *s){ HTime len; char buf[MAXSTRLEN]; if (labF) tr = LoadTransLabs(s); if(IsWave(s)) len = OpenWaveFile(s); else len = OpenParmFile(s); if(labF) AppendLabs(tr,len); if (trace & T_TOP) AppendTrace(s); if (tgtPK == ANON) tgtPK = srcPK; if(trace & T_KINDS){ printf("Source file format: %s [%s]\n", Format2Str(srcFF), ParmKind2Str(srcPK,buf)); printf("Target file format: %s [%s]\n", Format2Str(tgtFF), ParmKind2Str(tgtPK,buf)); printf("Source rate: %.0f Target rate: %.0f \n", srcSampRate,tgtSampRate); }}/* AppendSpeechFile: open waveform or parm file */void AppendSpeechFile(char *s){ HTime len; if (labF) tr = LoadTransLabs(s); if(tgtPK == WAVEFORM) len = AppendWave(s); else len = AppendParm(s); if(labF){ AppendLabs(tr,len); } if (trace & T_TOP) { AppendTrace("+"); AppendTrace(s); }}/* PutTargetFile: close and store waveform or parm file */void PutTargetFile(char *s){ if(tgtPK == WAVEFORM) { if(CloseWaveOutput(wv,tgtFF,s)<SUCCESS) HError(1014,"PutTargetFile: Could not save waveform file %s", s); } else { if(SaveBuffer(pb,s,tgtFF)<SUCCESS) HError(1014,"PutTargetFile: Could not save parm file %s", s ); CloseBuffer(pb); } if (trace & T_TOP){ AppendTrace("->"); AppendTrace(s); PrintTrace(); ResetHeap(&tStack); trList.str = NULL; } if(trans != NULL) SaveLabs(s,trans);}/* ----------------------------------------------------------- *//* END: HCopy.c *//* ----------------------------------------------------------- */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -