Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
	
}