📄 hcompv.c
字号:
Boolean tag = FALSE; p = sal; while (p != NULL){ if (strcmp(p->sa->SpkrName,sa->SpkrName)==0){ for (i=1;i<=vSize;i++){ p->sa->meanSum[i] += sa->meanSum[i]; p->sa->squareSum[i] += sa->squareSum[i]; } p->sa->NumFrame += sa->NumFrame; tag = TRUE; break; } p = p->nextSpkr; } if (tag == FALSE){ sal = AppendSpkrAccList(sal,sa); } return sal;}/* Compute Mean and Var */void UpdateMeanVar(SpkrAccListItem *sal){ int i; SpkrAccListItem *p; p = sal; while (p != NULL){ for (i=1;i<=vSize;i++){ p->sa->meanSum[i] /= ((float)(p->sa->NumFrame)); } for (i=1;i<=vSize;i++){ p->sa->squareSum[i] /= ((float)(p->sa->NumFrame)); p->sa->squareSum[i] -= (p->sa->meanSum[i])*(p->sa->meanSum[i]); } p = p->nextSpkr; } }/* Report output type NumFrame/cms/cvn */void ReportOutput(){ if (strcmp(oflags,"m")==0){ fprintf(stdout,"\n HCompV: Comptuting side based cepstral mean ......\n\n"); } else if (strcmp(oflags,"v")==0){ fprintf(stdout,"\n HCompV: Computing side based cepstral variance normaliser ......\n\n"); } else if (strcmp(oflags,"mv")==0){ fprintf(stdout,"\n HCompV: Comptuting side based cepstral mean & variance normaliser ......\n\n"); } else if (strcmp(oflags,"nv")==0){ fprintf(stdout,"\n HCompV: Comptuting side based frame number & variance normaliser ......\n\n"); } else if (strcmp(oflags,"nmv")==0){ fprintf(stdout,"\n HCompV: Comptuting side based frame number & cepstral mean & variance normaliser ......\n\n"); } else { fprintf(stdout,"\n HCompV: ReportOutput: Unrecognisable output flag setting: %s\n",oflags); fflush(stdout); HError(2019,"HCompV: ReportOutput: Unrecognisable output flag setting: %s\n",oflags); } fflush(stdout);}/* Export number of frames, mean, var to a given directory */void ExportNMV(SpkrAccListItem *sal, char *OutDirName, char *tgtPKStr) { FILE *oFile; Boolean isPipe; char oFileName[MAXSTRLEN]; char pathBuffer1[MAXSTRLEN]; char pathBuffer2[MAXSTRLEN]; SpkrAccListItem *p; int i; p = sal; while(p != NULL){ /* create output file name for current spkr index */ if ( pathPattern[0] != '\0'){ if ( MaskMatch(pathPattern,pathBuffer1,p->sa->SpkrName) != TRUE ){ HError(2039,"HCompV: ExportNMV: path pattern matching failure on speaker: %s\n",p->sa->SpkrName); } MakeFN(pathBuffer1,OutDirName,NULL,pathBuffer2); MakeFN(p->sa->SpkrName,pathBuffer2,NULL,oFileName); } else MakeFN(p->sa->SpkrName,OutDirName,NULL,oFileName); /* open and write */ oFile = FOpen(oFileName,NoOFilter,&isPipe); if (oFile == NULL){ HError(2011,"HCompV: ExportNMV: output file creation error %s",oFileName); } /* write header */ fprintf(oFile,"<CEPSNORM> <%s>",tgtPKStr); /* write number frames */ if (strchr(oflags,'n')){ fprintf(oFile,"\n<NFRAMES> %d",p->sa->NumFrame); } /* write mean */ if (strchr(oflags,'m')){ fprintf(oFile,"\n<MEAN> %d\n",vSize); for (i=1;i<=vSize;i++){ fprintf(oFile," %e",(p->sa->meanSum[i])); } } /* write variance */ if (strchr(oflags,'v')){ fprintf(oFile,"\n<VARIANCE> %d\n",vSize); for (i=1;i<=vSize;i++){ fprintf(oFile," %e",(p->sa->squareSum[i])); } } fprintf(oFile,"\n"); FClose(oFile,isPipe); p = p->nextSpkr; }}/* main func */int main(int argc, char *argv[]){ char *datafn, *s; void Initialise(void); void LoadFile(char *fn); void SetCovs(void); void PutVFloor(void); void SaveModel(char *outfn); SpkrAcc *sa = NULL; if(InitShell(argc,argv,hcompv_version,hcompv_vc_id)<SUCCESS) HError(2000,"HCompV: InitShell failed"); InitMem(); InitLabel(); InitMath(); InitSigP(); InitWave(); InitAudio(); InitVQ(); InitModel(); if(InitParm()<SUCCESS) HError(2000,"HCompV: InitParm failed"); if (!InfoPrinted() && NumArgs() == 0) ReportUsage(); if (NumArgs() == 0) Exit(0); SetConfParms(); CreateHMMSet(&hset,&gstack,FALSE); pathPattern[0]='\0'; while (NextArg() == SWITCHARG) { s = GetSwtArg(); if (strlen(s)!=1) HError(2019,"HCompV: Bad switch %s; must be single letter",s); switch(s[0]){ case 'f': if (NextArg() != FLOATARG) HError(2019,"HCompV: Variance floor scale expected"); vFloorScale = GetChkedFlt(0.0,100.0,s); break; case 'l': if (NextArg() != STRINGARG) HError(2019,"HCompV: Segment label expected"); segLab = GetStrArg(); break; case 'm': meanUpdate = TRUE; break; case 'o': outfn = GetStrArg(); break; case 'v': if (NextArg() != FLOATARG) HError(2019,"HCompV: Minimum variance level expected"); minVar = GetChkedFlt(0.0,100.0,s); break; case 'k': if (NextArg() != STRINGARG) HError(2019,"HCompV: speaker pattern expected"); strcpy(spPattern,GetStrArg()); if (strchr(spPattern,'%')==NULL) HError(2019,"HCompV: Speaker mask invalid"); break; case 'c': if (NextArg() != STRINGARG) HError(2019,"HCompV: CMV output dir expected"); strcpy(cmDir,GetStrArg()); DoCMV = TRUE; break; case 'p': if (NextArg() != STRINGARG) HError(2019,"HCompV: path pattern expected"); strcpy(pathPattern,GetStrArg()); if (strchr(pathPattern,'%')==NULL) HError(2019,"HCompV: Path mask invalid"); break; case 'q': if (NextArg() != STRINGARG) HError(2019,"HCompV: output flags (nmv)"); strcpy(oflags,GetStrArg()); break; case 'B': saveBinary = TRUE; break; case 'F': if (NextArg() != STRINGARG) HError(2019,"HCompV: Data File format expected"); if((dff = Str2Format(GetStrArg())) == ALIEN) HError(-2089,"HCompV: Warning ALIEN Data file format set"); break; case 'G': if (NextArg() != STRINGARG) HError(2019,"HCompV: Label File format expected"); if((lff = Str2Format(GetStrArg())) == ALIEN) HError(-2089,"HCompV: Warning ALIEN Label file format set"); break; case 'H': if (NextArg() != STRINGARG) HError(2019,"HCompV: HMM macro file name expected"); AddMMF(&hset,GetStrArg()); break; case 'I': if (NextArg() != STRINGARG) HError(2019,"HCompV: MLF file name expected"); LoadMasterFile(GetStrArg()); break; case 'L': if (NextArg()!=STRINGARG) HError(2019,"HCompV: Label file directory expected"); labDir = GetStrArg(); break; case 'M': if (NextArg()!=STRINGARG) HError(2019,"HCompV: Output macro file directory expected"); outDir = GetStrArg(); break; case 'T': if (NextArg() != INTARG) HError(2019,"HCompV: Trace value expected"); trace = GetChkedInt(0,077,s); break; case 'X': if (NextArg()!=STRINGARG) HError(2019,"HCompV: Label file extension expected"); labExt = GetStrArg(); break; default: HError(2019,"HCompV: Unknown switch %s",s); } } /* if not doing CMV, do standard HCompV */ if (DoCMV == FALSE){ if (NextArg()!=STRINGARG) HError(2019,"HCompV: Source HMM file name expected"); hmmfn = GetStrArg(); Initialise(); do { if (NextArg()!=STRINGARG) HError(2019,"HCompV: Training data file name expected"); datafn = GetStrArg(); LoadFile(datafn); } while (NumArgs()>0); SetCovs(); FixGConsts(hmmLink); SaveModel(outfn); if (trace&T_TOP) printf("Output written to directory %s\n",(outDir==NULL)?"./":outDir); if (vFloorScale>0.0) PutVFloor(); } else { /* report export data type */ ReportOutput(); /* init input buffer mem heap */ CreateHeap(&iStack,"BufferIn",MSTAK,1,0.5,100000,5000000); do { if (NextArg()!=STRINGARG){ HError(2019,"HCompV: Training data file name expected"); } datafn = GetStrArg(); /* accumulate stats for current utterance file and update speaker list */ sa = AccGenUtt(spPattern,datafn,sa); salist = UpdateSpkrAccList(salist,sa); /* reset for next utterance */ ClrSpkrAcc(sa); } while (NumArgs()>0); /* compute the means and variances for each speaker */ UpdateMeanVar(salist); /* export NMV for each speaker */ ExportNMV(salist,cmDir,TargetPKStr); } Exit(0); return (0); /* never reached -- make compiler happy */}/* ----------------------------------------------------------- *//* END: HCompV.c *//* ----------------------------------------------------------- */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -