/* LoadMgeTrnHmmFile: */ static void LoadMgeTrnHmmFile(int nIter) { char hext[15], hmmFile[255]; ResetHeap(&hmmStack); CreateHeap(&hmmStack, "Model Stack", MSTAK, 1, 1.0, 80000, 400000); sprintf(hext, "mmf%d", nIter); MakeFN(mmfFn, outDir, hext, hmmFile); CreateHMMSet(&hset, &hmmStack, TRUE); AddMMF(&hset, hmmFile); if (trace & T_TOP) printf("Loading MGE-trained HMM in iteration %d ... ... \n", nIter); if (MakeHMMSet(&hset, hmmListFn) < SUCCESS) HError(2321, "Initialise: MakeHMMSet failed"); if (LoadHMMSet(&hset, hmmDir, hmmExt) < SUCCESS) HError(2321, "Initialise: LoadHMMSet failed"); SetParmHMMSet(&hset); /* variance inversion, MGE training only support INVDIAGC case */ ConvDiagC(&hset, TRUE); if (funcType == MGE_TRAIN) AttachAccToModel(); }
void Initialise(char *hmmListFn) { /* Stacks for global structures requiring memory allocation */ CreateHeap(&aSetStack,"ASetStore", MSTAK, 1, 0.0, 1000, 1000); CreateHeap(&sSetStack,"SSetStore", MSTAK, 1, 0.0, 1000, 1000); CreateHeap(&wsStack,"WsStore", MSTAK, 1, 0.0, 1000, 1000); CreateHeap(&labIdStack,"LabIdStore", MSTAK, 1, 0.0, 1000, 1000); CreateHeap(&wtAccStack,"WtAccStore", MSTAK, 1, 0.0, 1000, 1000); /* Load HMMs and init HMMSet related global variables */ if(MakeHMMSet( &hset, hmmListFn )<SUCCESS) HError(2429,"Initialise: MakeHMMSet failed"); if(LoadHMMSet( &hset,hmmDir,newExt)<SUCCESS) HError(2429,"Initialise: LoadHMMSet failed"); AttachAccs(&hset, &gstack,uFlags); ZeroAccs(&hset,uFlags); nPhyHmms = hset.numPhyHMM; nLogHmms = hset.numLogHMM; vSize = hset.vecSize; nStreams = hset.swidth[0]; maxMixes = MaxMixInSet(&hset); maxStates = MaxStatesInSet(&hset); hsKind = hset.hsKind; /* Store for mix weights accs from each input acc file */ CreateWtStore(&wtAccStack); if ((hsKind != TIEDHS) && (hsKind != DISCRETEHS)) HError(2421,"Initialise: HMM's must be full Tied Mixture or Discrete"); if (trace&T_TOP) { printf("HSmooth Updating: "); if (uFlags&UPTRANS) printf("Transitions "); if (uFlags&UPMEANS) printf("Means "); if (uFlags&UPVARS) printf("Variances "); if (uFlags&UPMIXES && maxMixes>1) printf("MixWeights "); printf("\n "); printf(" Max Steps: %d, Epsilon : %f, Max Mixes: %d\n", maxStep,epsilon,maxMixes); printf("%d Logical/%d Physical Models Loaded, VecSize=%d\n",nLogHmms,nPhyHmms,vSize); fflush(stdout); } SetVFloor( &hset, vFloor, minVar); aSet=(HLink *)New(&aSetStack, nPhyHmms*sizeof(HLink)); --aSet; sSet=(StreamElem **)New(&sSetStack, nPhyHmms*sizeof(StreamElem *)); --sSet; }
/* Initialise: load hmm and initialise global data structures */ void Initialise(void) { LabId hmmId; char base[MAXSTRLEN]; char path[MAXSTRLEN]; char ext[MAXSTRLEN]; int s; /* Stacks for global structures requiring memory allocation */ CreateHeap(&segmentStack,"SegStore", MSTAK, 1, 0.0, 100000, LONG_MAX); CreateHeap(&sequenceStack,"SeqStore", MSTAK, 1, 0.0, 10000, 10000); CreateHeap(&clustSetStack,"ClustSetStore", MSTAK, 1, 0.0, 1000, 1000); CreateHeap(&transStack,"TransStore", MSTAK, 1, 0.0, 1000, 1000); CreateHeap(&traceBackStack,"TraceBackStore", MSTAK, 1, 0.0, 1000, 1000); CreateHeap(&bufferStack,"BufferStore", MSTAK, 1, 0.0, 1000, 1000); CreateHeap(&msdinfoStack,"MSDInfoStore", MSTAK, 1, 0.0, 1000, 1000); /* Load HMM def */ if(MakeOneHMM( &hset, BaseOf(hmmfn,base))<SUCCESS) HError(2128,"Initialise: MakeOneHMM failed"); if(LoadHMMSet( &hset,PathOf(hmmfn,path),ExtnOf(hmmfn,ext))<SUCCESS) HError(2128,"Initialise: LoadHMMSet failed"); SetParmHMMSet(&hset); if ((hset.hsKind==DISCRETEHS)||(hset.hsKind==TIEDHS)) uFlags = (UPDSet) (uFlags & (~(UPMEANS|UPVARS))); AttachAccs(&hset, &gstack, uFlags); /* Get a pointer to the physical HMM and set related globals */ hmmId = GetLabId(base,FALSE); macroLink = FindMacroName(&hset,'h',hmmId); hmmLink = (HLink)macroLink->structure; nStates = hmmLink->numStates; nStreams = hset.swidth[0]; for(s=1; s<=nStreams; s++) maxMixInS[s] = MaxMixInS(hmmLink, s); msdInfo = CreateMSDInfo(&msdinfoStack, hmmLink); SetVFloor( &hset, vFloor, minVar); if(segLab != NULL) segId = GetLabId(segLab,TRUE); if(trace>0) PrintInitialInfo(); thisP = CreateVector(&gstack,nStates); lastP = CreateVector(&gstack,nStates); }
int main(int argc, char *argv[]) { char *s; Initialise(argc,argv); CreateHeap(&modelHeap, "Model heap", MSTAK, 1, 0.0, 100000, 800000 ); CreateHMMSet(&hset,&modelHeap,TRUE); while (NextArg() == SWITCHARG) { s = GetSwtArg(); if (strlen(s)!=1) HError(3219,"HNetTest: Bad switch %s; must be single letter",s); switch(s[0]){ case 'H': if (NextArg() != STRINGARG) HError(3219,"HNetTest: MMF File name expected"); AddMMF(&hset,GetStrArg()); break; default: HError(3219,"HNetTest: Unknown switch %s",s); } } if (NextArg()!=STRINGARG) HError(999,"HNetTest: Dictionary file name expected"); dictFn = GetStrArg(); if (NextArg()!=STRINGARG) HError(999,"HNetTest: Word Net file name expected"); wdNetFn = GetStrArg(); if (NextArg()!=STRINGARG) HError(999,"HNetTest: HMM list file name expected"); hmmListFn = GetStrArg(); if(MakeHMMSet(&hset,hmmListFn)<SUCCESS) HError(999,"HNetTest: MakeHMMSet failed"); if(LoadHMMSet(&hset,NULL,NULL)<SUCCESS) HError(999,"HNetTest: LoadHMMSet failed"); InitVocab(&vocab); if(ReadDict(dictFn,&vocab)<SUCCESS) HError(3213, "HNetTest: ReadDict failed"); LoadNetwork(); }
xf = xfInfo.paXForm; if ((xfInfo.paXForm != NULL) && !(uFlags&UPXFORM)) { while (xf != NULL) { if ((xf->xformSet->xkind != CMLLR) && (xf->xformSet->xkind != SEMIT)) HError(999,"SAT only supported with SEMIT/CMLLR transforms"); xf = xf->parentXForm; } } } int main(int argc, char *argv[]) { char *datafn=NULL; char *datafn2=NULL; char *s; char *scriptFile; char datafn1[MAXSTRLEN]; char newFn[MAXSTRLEN]; FILE *f; UttInfo *utt; /* utterance information storage */ FBInfo *fbInfo; /* forward-backward information storage */ HMMSet hset; /* Set of HMMs to be re-estimated */ Source src; float tmpFlt; int tmpInt; int numUtt,spUtt=0; void Initialise(FBInfo *fbInfo, MemHeap *x, HMMSet *hset, char *hmmListFn); void DoForwardBackward(FBInfo *fbInfo, UttInfo *utt, char *datafn, char *datafn2); void UpdateModels(HMMSet *hset, ParmBuf pbuf2); void StatReport(HMMSet *hset); if(InitShell(argc,argv,herest_version,herest_vc_id)<SUCCESS) HError(2300,"HERest: InitShell failed"); InitMem(); InitMath(); InitSigP(); InitAudio(); InitWave(); InitVQ(); InitLabel(); InitModel(); if(InitParm()<SUCCESS) HError(2300,"HERest: InitParm failed"); InitTrain(); InitUtil(); InitFB(); InitAdapt(&xfInfo); InitMap(); if (!InfoPrinted() && NumArgs() == 0) ReportUsage(); if (NumArgs() == 0) Exit(0); al_hmmDir[0] = '\0'; al_hmmExt[0] = '\0'; al_hmmMMF[0] = '\0'; al_hmmLst[0] = '\0'; up_hmmMMF[0] = '\0'; CreateHeap(&hmmStack,"HmmStore", MSTAK, 1, 1.0, 50000, 500000); SetConfParms(); CreateHMMSet(&hset,&hmmStack,TRUE); CreateHeap(&uttStack, "uttStore", MSTAK, 1, 0.5, 100, 1000); utt = (UttInfo *) New(&uttStack, sizeof(UttInfo)); CreateHeap(&fbInfoStack, "FBInfoStore", MSTAK, 1, 0.5, 100 , 1000 ); fbInfo = (FBInfo *) New(&fbInfoStack, sizeof(FBInfo)); CreateHeap(&accStack, "accStore", MSTAK, 1, 1.0, 50000, 500000); while (NextArg() == SWITCHARG) { s = GetSwtArg(); if (strlen(s)!=1) HError(2319,"HERest: Bad switch %s; must be single letter",s); switch(s[0]){ case 'b': if (NextArg()!=STRINGARG) HError(2319,"HERest: script file expected"); scriptFile = GetStrArg(); break;
/* Initialise: */ static void Initialise() { char macroname[MAXSTRLEN]; AdaptXForm *xform; /* load HMMs and init HMMSet related global variables */ if (trace & T_TOP) printf("Loading HMM for updating ... ... \n"); if (MakeHMMSet(&hset, hmmListFn) < SUCCESS) HError(2321, "Initialise: MakeHMMSet failed"); if (LoadHMMSet(&hset, hmmDir, hmmExt) < SUCCESS) HError(2321, "Initialise: LoadHMMSet failed"); SetParmHMMSet(&hset); /* variance inversion, MGE training only support INVDIAGC case */ if (hset.ckind == DIAGC) ConvDiagC(&hset, TRUE); /* load transform */ if (xformfn != NULL) { xform = LoadOneXForm(&hset, NameOf(xformfn, macroname), xformfn); SetXForm(&hset, &xfInfo, xform); } if (funcType == MGE_TRAIN) AttachAccToModel(); /* reload the HMM for reference in training */ if (mtInfo->bOrigHmmRef) { if (trace & T_TOP) printf("Loading HMM for reference ... ... \n"); if (MakeHMMSet(&orighset, hmmListFn) < SUCCESS) HError(2321, "Initialise: MakeHMMSet failed"); if (LoadHMMSet(&orighset, hmmDir, hmmExt) < SUCCESS) HError(2321, "Initialise: LoadHMMSet failed"); SetParmHMMSet(&orighset); /* variance inversion, MGE training only support INVDIAGC case */ if (hset.ckind == DIAGC) ConvDiagC(&orighset, TRUE); /* load transform */ if (xformfn != NULL) { xform = LoadOneXForm(&orighset, NameOf(xformfn, macroname), xformfn); SetXForm(&orighset, &xfInfo, xform); } } if (trace & T_TOP) { printf("System is "); switch (hset.hsKind) { case PLAINHS: printf("PLAIN\n"); break; case SHAREDHS: printf("SHARED\n"); break; case TIEDHS: printf("TIED\n"); break; case DISCRETEHS: printf("DISCRETE\n"); break; } printf("%d Logical/%d Physical Models Loaded, VecSize=%d\n", hset.numLogHMM, hset.numPhyHMM, hset.vecSize); if (hset.numFiles > 0) printf("%d MMF input files\n", hset.numFiles); if (mmfFn != NULL) printf("Output to MMF file: %s\n", mmfFn); fflush(stdout); } /* initialize a MgeTrnInfo for MGE training of HMM */ InitMgeTrnInfo(); }
void Initialise(void) { /* load HMM mmf */ if (MakeHMMSet(&hmset, GetStrArg()) < SUCCESS) HError(9928, "Initialise: MakeHMMSet failed"); if (LoadHMMSet(&hmset, hmmDir, hmmExt) < SUCCESS) HError(9928, "Initialise: LoadHMMSet failed"); if (hmset.hsKind == DISCRETEHS) HError(9999, "Initialise: Only continuous model is surpported"); ConvDiagC(&hmset, TRUE); if (trace & T_TOP) { PrintrFlags(); printf("HMMSet is "); switch (hmset.hsKind) { case PLAINHS: printf("PLAIN\n"); break; case SHAREDHS: printf("SHARED\n"); break; case TIEDHS: printf("TIED\n"); break; default: HError(9999, "Initialise: Only continuous model is supported"); } printf("%d Logical/%d Physical Models Loaded, VecSize=%d\n", hmset.numLogHMM, hmset.numPhyHMM, hmset.vecSize); if (hmset.numFiles > 0) printf("%d MMF input files\n", hmset.numFiles); fflush(stdout); } /* load duration mmf */ if (!stateAlign) { if (MakeHMMSet(&dmset, GetStrArg()) < SUCCESS) HError(9928, "Initialise: MakeHMMSet failed"); if (LoadHMMSet(&dmset, dmDir, dmExt) < SUCCESS) HError(9928, "Initialise: LoadHMMSet failed"); if (hmset.hsKind == DISCRETEHS) HError(9999, "Initialise: Only continuous duration model mmf is surpported"); ConvDiagC(&dmset, TRUE); if (trace & T_TOP) { printf("DurationModelSet is "); switch (dmset.hsKind) { case PLAINHS: printf("PLAIN\n"); break; case SHAREDHS: printf("SHARED\n"); break; case TIEDHS: printf("TIED\n"); break; default: HError(9999, "Initialise: Only continuous model is supported"); } printf("%d Logical/%d Physical Models Loaded, VecSize=%d\n", dmset.numLogHMM, dmset.numPhyHMM, dmset.vecSize); if (dmset.numFiles > 0) printf("%d MMF input files\n", dmset.numFiles); fflush(stdout); } } /* setup GenInfo */ genInfo->genMem = &genStack; genInfo->hset = &hmset; genInfo->dset = &dmset; genInfo->maxStates = MaxStatesInSet(&hmset); genInfo->maxMixes = MaxMixInSet(&hmset); genInfo->speakRate = speakRate; genInfo->MSDthresh = MSDthresh; genInfo->modelAlign = modelAlign; genInfo->stateAlign = stateAlign; genInfo->frameRate = frameRate; CheckGenSetUp(); /* setup EM-based parameter generation */ AttachAccs(&hmset, &gstack, (UPDSet) 0); ZeroAccs(&hmset, (UPDSet) 0); if (!stateAlign) { AttachAccs(&dmset, &gstack, (UPDSet) 0); ZeroAccs(&dmset, (UPDSet) 0); } if (type != CHOLESKY) InitialiseForBack(fbInfo, &fbInfoStack, &hmset, (UPDSet) 0, ((useHMMFB || stateAlign) ? NULL : &dmset), (UPDSet) 0, pruneInit, pruneInc, pruneLim, minFrwdP, useAlign, FALSE); /* handle input xform */ xfInfo_hmm.inFullC = xfInfo_dur.inFullC = TRUE; /* semi-tied case */ if (hmset.semiTied != NULL) { SetXForm(&hmset, NULL, hmset.semiTied); ApplyHMMSetXForm(&hmset, hmset.semiTied, TRUE); } /* linear weight -> log weight */ ConvLogWt(&hmset); }
/* Initialise: load HMMs and create accumulators */ static void Initialise(void) { int s,V; Boolean eSep; char base[MAXSTRLEN]; char path[MAXSTRLEN]; char ext[MAXSTRLEN]; /* Load HMM defs */ if(MakeOneHMM(&hset,BaseOf(hmmfn,base))<SUCCESS) HError(2028,"Initialise: MakeOneHMM failed"); if(LoadHMMSet(&hset,PathOf(hmmfn,path),ExtnOf(hmmfn,ext))<SUCCESS) HError(2028,"Initialise: LoadHMMSet failed"); SetParmHMMSet(&hset); if (hset.hsKind==DISCRETEHS || hset.hsKind==TIEDHS) HError(2030,"Initialise: HCompV only uses continuous models"); /* Create a heap to store the input data */ /*CreateHeap(&iStack,"InBuf", MSTAK, 1, 0.5, 100000, LONG_MAX);*/ /* Get a pointer to the physical HMM */ hmmId = GetLabId(base,FALSE); macroLink = FindMacroName(&hset,'h',hmmId); if (macroLink==NULL) HError(2020,"Initialise: cannot find hmm %s in hset",hmmfn); hmmLink = (HLink)macroLink->structure; /* Find out for which streams full covariance is needed */ CheckVarianceKind( ); /* Create accumulators for the mean and variance */ for (s=1;s<=hset.swidth[0]; s++){ V = hset.swidth[s]; accs[s].meanSum=CreateVector(&gstack,V); ZeroVector(accs[s].meanSum); if (fullcNeeded[s]) { accs[s].squareSum.inv=CreateSTriMat(&gstack,V); accs[s].fixed.inv=CreateSTriMat(&gstack,V); ZeroTriMat(accs[s].squareSum.inv); } else { accs[s].squareSum.var=CreateSVector(&gstack,V); accs[s].fixed.var=CreateSVector(&gstack,V); ZeroVector(accs[s].squareSum.var); } } /* Create an object to hold the input parameters */ SetStreamWidths(hset.pkind,hset.vecSize,hset.swidth,&eSep); obs=MakeObservation(&gstack,hset.swidth,hset.pkind,FALSE,eSep); if(segLab != NULL) { segId = GetLabId(segLab,TRUE); } if (trace&T_TOP) { printf("Calculating Fixed Variance\n"); printf(" HMM Prototype: %s\n",hmmfn); printf(" Segment Label: %s\n",(segLab==NULL)?"None":segLab); printf(" Num Streams : %d\n",hset.swidth[0]); printf(" UpdatingMeans: %s\n",(meanUpdate)?"Yes":"No"); printf(" Target Direct: %s\n",(outDir==NULL)?"Current":outDir); } }
/* Initialise: set up global data structures */ void Initialise(void) { Boolean eSep; int s; /* Load hmms, convert to inverse DiagC */ if(MakeHMMSet(&hset,hmmListFn)<SUCCESS) HError(3228,"Initialise: MakeHMMSet failed"); if(LoadHMMSet(&hset,hmmDir,hmmExt)<SUCCESS) HError(3228,"Initialise: LoadHMMSet failed"); ConvDiagC(&hset,TRUE); /* Create observation and storage for input buffer */ SetStreamWidths(hset.pkind,hset.vecSize,hset.swidth,&eSep); obs=MakeObservation(&gstack,hset.swidth,hset.pkind, hset.hsKind==DISCRETEHS,eSep); /* sort out masks just in case using adaptation */ if (xfInfo.inSpkrPat == NULL) xfInfo.inSpkrPat = xfInfo.outSpkrPat; if (xfInfo.paSpkrPat == NULL) xfInfo.paSpkrPat = xfInfo.outSpkrPat; if (xfInfo.useOutXForm || (update>0)) { CreateHeap(®Heap, "regClassStore", MSTAK, 1, 0.5, 1000, 8000 ); /* This initialises things - temporary hack - THINK!! */ CreateAdaptXForm(&hset, "tmp"); /* initialise structures for the f-b frame-state alignment pass */ utt = (UttInfo *) New(®Heap, sizeof(UttInfo)); fbInfo = (FBInfo *) New(®Heap, sizeof(FBInfo)); /* initialise a recogniser for frame/state alignment purposes */ alignpsi=InitPSetInfo(&hset); alignvri=InitVRecInfo(alignpsi,1,TRUE,FALSE); SetPruningLevels(alignvri,0,genBeam,-LZERO,0.0,tmBeam); InitUttInfo(utt, FALSE); InitialiseForBack(fbInfo, ®Heap, &hset, (UPDSet) (UPXFORM), genBeam*2.0, genBeam*2.0, genBeam*4.0+1.0, 10.0); utt->twoDataFiles = FALSE; utt->S = hset.swidth[0]; AttachPreComps(&hset,hset.hmem); } CreateHeap(&bufHeap,"Input Buffer heap",MSTAK,1,0.0,50000,50000); CreateHeap(&repHeap,"Replay Buffer heap",MSTAK,1,0.0,50000,50000); maxM = MaxMixInSet(&hset); for (s=1; s<=hset.swidth[0]; s++) maxMixInS[s] = MaxMixInSetS(&hset, s); if (trace&T_TOP) { printf("Read %d physical / %d logical HMMs\n", hset.numPhyHMM,hset.numLogHMM); fflush(stdout); } /* Initialise recogniser */ if (nToks>1) nBeam=genBeam; psi=InitPSetInfo(&hset); vri=InitVRecInfo(psi,nToks,models,states); /* Read dictionary and create storage for lattice */ InitVocab(&vocab); if(ReadDict(dictFn,&vocab)<SUCCESS) HError(3213, "Main: ReadDict failed"); CreateHeap(&ansHeap,"Lattice heap",MSTAK,1,0.0,4000,4000); if (trace & T_MEM){ printf("Memory State After Initialisation\n"); PrintAllHeapStats(); } }