int main(int argc,char * argv[]) { double startT = wtime(); if (argc < 3) { printf("Usage: %s <cfgFile> <outputModelFile>\n",argv[0]); printf("The config file format:\n"); printf("UBMRoot=<...>\n"); printf("MfcList=<...>\n"); printf("SplitDepth=<...>\n"); printf("MaxMixNum=<...>\n"); printf("VecSize=<...>\n"); printf("MinOccFloorFact=<...>\n"); printf("WFloor=<...>\n"); printf("VarFloor=<...>\n"); printf("EMIlterNum=<...>\n"); printf("KMeanIterNum=<...>\n"); printf("LastEMIlterNum=<...>\n"); return -1; } char UBMRoot[256]; int NewMixNum=0; int OldMixNum=0; int MaxMixNum=0; int EMIlterNum=0; int LastEMIlterNum=0; int KMeanIterNum=0; char MfcList[256]; char TempMfc[256]; int VecSize=0,VecSize4; float SplitDepth=0.2; float fMinOccFact=0.0,fWFloor=0.0,fVarFloor=0.0; struct Features features; int maxFrameNum; GMMParam gmm_params; /// Read Configurations Config cfg; if(!cfg.SetConfigFile(argv[1])) { printf("Error read config : %s\n",argv[1]); exit(-1); } cfg.ReadConfig("UBMRoot",UBMRoot); /* Output directory */ cfg.ReadConfig("MfcList",MfcList); /* Mfcc File list */ cfg.ReadConfig("SplitDepth",SplitDepth); /* Split Kmean Depth */ cfg.ReadConfig("MaxMixNum",MaxMixNum); cfg.ReadConfig("VecSize",VecSize); cfg.ReadConfig("MinOccFloorFact",fMinOccFact); cfg.ReadConfig("WFloor",fWFloor); cfg.ReadConfig("VarFloor",fVarFloor); cfg.ReadConfig("EMIlterNum",EMIlterNum); cfg.ReadConfig("KMeanIterNum",KMeanIterNum); cfg.ReadConfig("LastEMIlterNum",LastEMIlterNum); //* Read the features into memory */ ReadFeatures(MfcList, features, maxFrameNum, VecSize); VecSize4=ALIGN_4F(VecSize); IniGMM(features, VecSize, MaxMixNum, & gmm_params); pGMMTrain=new GMMTrain(); pGMMMixUp=new GMMMixup(); pKMeanGMM = new KMean(); pGMMTrain->DataPrepare(features, MaxMixNum); pGMMTrain->AllocStaticBuf(1, MaxMixNum, VecSize4, maxFrameNum); pGMMTrain->SetFloor(fMinOccFact,fWFloor,fVarFloor); pKMeanGMM->DataPrepare(features, MaxMixNum); OldMixNum=1; while (OldMixNum < MaxMixNum) { OldMixNum = EMtrain(gmm_params, EMIlterNum); NewMixNum = min(OldMixNum * 2, MaxMixNum); MixUpGMM(gmm_params, NewMixNum,SplitDepth); KMeanGMM(gmm_params, KMeanIterNum); OldMixNum=NewMixNum; printf("*************Split MixNum = %d Finished ******************\n",NewMixNum); } OldMixNum=EMtrain(gmm_params, LastEMIlterNum); printf("all training has been finished\n"); printf("Last Gmm MixtureNum=%d\n",OldMixNum); delete pGMMTrain; delete pGMMMixUp; delete pKMeanGMM; FreeFeatures(features); gmm_params.WriteModel(argv[2]); gmm_params.FreeAll(); double endT = wtime(); printf("Whole runtime : %f\n", endT - startT); }
void IniGMM(struct Features &features,int VecSize, int MaxMixNum, GMMParam * gmm_params) { gmm_params->AllocAll(MaxMixNum, VecSize); gmm_params->InitModel(features, VecSize, ALIGN_4F(VecSize)); }
int main(int argc,char * argv[]) { if (argc!=3) { printf("OldUbm2NewUbm.exe oldubm newubm\n"); exit(0); } GaussMixModel * m_pGmmModel; GMMFileHeaderOld ModelHeaderOld; // Header *header; 模型文件的文件头 GMMFileHeaderNew ModelHeaderNew; FILE *fpModel; ReadOpen(fpModel,argv[1]); fread(&ModelHeaderOld,sizeof(GMMFileHeaderOld),1,fpModel); ASSERT3(ModelHeaderOld.nDim>0, "Error in model file %s : nDim<0!",argv[1]); ASSERT3(ModelHeaderOld.nMixNum>0, "Error in model file %s : nMixNum<0!",argv[1]); ASSERT3(ModelHeaderOld.nModelNum>0, "Error in model file %s : nModelNum<0!",argv[1]); int m_nVecSize = ModelHeaderOld.nDim; int m_nVecSize4 = ALIGN_4F(m_nVecSize); int m_nMixNum = ModelHeaderOld.nMixNum; int m_nModelNum = ModelHeaderOld.nModelNum; ASSERT3(m_nModelNum==1,"m_nModelNum=%d\n",m_nModelNum); m_pGmmModel = (GaussMixModel *)Malloc(m_nModelNum,sizeof(GaussMixModel),false); for(int i=0;i<m_nModelNum;i++) { // 分配 GMM 模型 AllocGaussMixModel(&m_pGmmModel[i],m_nMixNum,m_nVecSize4); m_pGmmModel[i].nMixNum = m_nMixNum; // 读出weight fread(m_pGmmModel[i].pfWeight,sizeof(float),m_nMixNum,fpModel); // 读出均值,斜方差,mat for(int m=0;m<m_nMixNum;m++) { m_pGmmModel[i].pGauss[m].nDim = m_nVecSize; fread(m_pGmmModel[i].pGauss[m].pfMean,sizeof(float),m_nVecSize4,fpModel); fread(m_pGmmModel[i].pGauss[m].pfDiagCov,sizeof(float),m_nVecSize4,fpModel); fread(&m_pGmmModel[i].pGauss[m].dMat,sizeof(double),1,fpModel); // 如果mat值大于零,可能模型有问题,报警 if (m_pGmmModel[i].pGauss[m].dMat>=0.0) printf("Warning : m_pGmmModel[%d].pGauss[%d].dMat=%.3f!\n",i,m,m_pGmmModel[i].pGauss[m].dMat); } } fclose(fpModel); ModelHeaderNew.nMixNum=m_nMixNum; ModelHeaderNew.nVecSize=m_nVecSize; ModelHeaderNew.nVecSizeStore=m_nVecSize4; ModelHeaderNew.nFeatKind=ModelHeaderOld.nMfccKind; ModelHeaderNew.nTotalParamSize=sizeof(float)*m_nMixNum*(m_nVecSize4*2+2); WriteOpen(fpModel,argv[2]); fwrite(&ModelHeaderNew,sizeof(GMMFileHeaderNew),1,fpModel); fseek(fpModel,FILE_HEADER_SIZE,SEEK_SET); int nNumRead; nNumRead=fwrite(m_pGmmModel[0].pfWeight,sizeof(float),m_nMixNum,fpModel); if (nNumRead!=m_nMixNum) { fclose(fpModel); exit(1); } nNumRead=fwrite(m_pGmmModel[0].pfMeanBuf,sizeof(float),m_nVecSize4*m_nMixNum,fpModel); if (nNumRead!=m_nVecSize4*m_nMixNum) { fclose(fpModel); exit(1); } nNumRead=fwrite(m_pGmmModel[0].pfDiagCovBuf,sizeof(float),m_nVecSize4*m_nMixNum,fpModel); if (nNumRead!=m_nVecSize4*m_nMixNum) { fclose(fpModel); exit(1); } float temp; for (int i=0;i<m_nMixNum;i++){ temp=float(m_pGmmModel[0].pGauss[i].dMat); fwrite(&temp,sizeof(float),1,fpModel); } fclose(fpModel); FreeGaussMixModel(m_pGmmModel,1); }