/* CombineModels: load models and combine with the one in memory */ BackOffLM *CombineModels(MemHeap *heap,LMInfo *lmi,int nLModel,int nSize,WordMap *wl) { int i,j,nw; float x; LMInfo *li; BackOffLM *tgtLM; WordMap wordList; LabId lab; NameId *na; /* normalise weights */ for (x=0.0, i=1; i<nLModel; i++) x += lmInfo[i].weight; lmInfo[0].weight = 1.0-x; /* load all models except the first one*/ for (li=lmInfo+1, i=1; i<nLModel; i++, li++) { if (trace&T_TOP) printf("Loading language model from %s\n",li->fn); li->lm = LoadLangModel(li->fn,wl,1.0,LMP_FLOAT,heap); } if (wl==NULL) { wl = &wordList; /* derive word list from LMs */ for (li=lmInfo, i=0; i<nLModel; i++, li++) { na = li->lm->binMap; for (j=0; j<li->lm->vocSize; j++) { lab = GetLabId(na[j+1]->name,TRUE); lab->aux=NULL; } } for (nw=0,li=lmInfo, i=0; i<nLModel; i++, li++) { na = li->lm->binMap; for (j=0; j<li->lm->vocSize; j++) { lab = GetLabId(na[j+1]->name,FALSE); if (lab->aux==NULL) { nw++; lab->aux = (Ptr) wl; } } } CreateWordList(NULL,wl,nw+10); for (nw=0,li=lmInfo, i=0; i<nLModel; i++, li++) { na = li->lm->binMap; for (j=0; j<li->lm->vocSize; j++) { lab = GetLabId(na[j+1]->name,FALSE); if (lab->aux==(Ptr) wl) { wl->id[nw++]=lab; lab->aux = NULL; } } } wl->used = nw; } if (trace&T_TOP) { printf("Using language model(s): \n"); for (li=lmInfo,i=0; i<nLModel; i++,li++) printf(" %d-gram %s, weight %.2f\n",li->lm->nSize,li->fn,li->weight); } if (trace&T_TOP) { printf("Generating %d-gram model %s\n",nSize,outFN); fflush(stdout); } tgtLM = MergeModels(heap,lmInfo,nLModel,nSize,wl); #ifdef HTK_CRYPT if (tgtLM->encrypt && binfo.saveFmt==LMF_TEXT) binfo.saveFmt = LMF_BINARY; #endif for (i=1; i<=nSize; i++) { tgtLM->gInfo[i].fmt = (i==1) ? LMF_TEXT : binfo.saveFmt; } return tgtLM; }
static int nSize = 0; /* output ngram size */ static WordMap wList; /* the word list */ static int nLModel; /* number of loaded LMs */ static LMInfo lmInfo[MAX_LMODEL]; /* array of loaded LMs */ static BackOffLM *tgtLM; /* target lm */ static char *tgtFN; /* output model name */ static MemHeap langHeap; /* Stores global stats */ static LMFileFmt saveFmt = DEF_SAVEFMT; /* LM file format */ /* ---------------- Configuration Parameters --------------------- */ static ConfParam *cParm[MAXGLOBS]; static int nParm = 0; /* total num params */ /* ---------------- Function prototypes -------------------------- */ void Initialise(void); /* ---------------- Process Command Line ------------------------- */ /* SetConfParms: set conf parms relevant to this tool */ void SetConfParms(void) { int i; nParm = GetConfig("LMERGE", TRUE, cParm, MAXGLOBS); if (nParm>0){ if (GetConfInt(cParm,nParm,"TRACE",&i)) trace = i; } } char *ReturnLMName(int fmt) { switch(fmt) { case LMF_TEXT: return LM_TXT_TEXT; case LMF_BINARY: return LM_TXT_BINARY; case LMF_ULTRA: return LM_TXT_ULTRA; default: return LM_TXT_OTHER;