la->end = lat->lnodes+2+i; la->lmlike = log(1.0/(float) (voc->nwords)); la++; } for (i = 0; i < voc->nwords; i++) { la->start = lat->lnodes+2+i; la->end = lat->lnodes+nNode-2; la->lmlike = 0.0; la++; } /* finally overwrite start/end !NULL words if sil at start/end */ if (bStartId != NULL) { wd = GetWord(voc,bStartId,TRUE); ln = lat->lnodes; ln->word = wd; wd = GetWord(voc,bEndId,TRUE); ln = lat->lnodes+nNode-1; ln->word = wd; } return lat; } /*ProcessBoBiGram: Convert back-off bigram in nLM into lattice */ Lattice *ProcessBoBiGram(MemHeap *latHeap, Vocab *voc, NGramLM *nLM) { int nNode,nArc; NEntry *ne; SEntry *se; Word wd,fromWd,toWd; LNode *ln,*fromNode,*toNode;
bigramLm = ReadLModel(&gstack, ipFn); if (bigramLm->type != boNGram) HError(3030,"HBuild: File specified is not a back-off bigram"); lat = ProcessBiGram(&gstack,&voc,bigramLm); SaveLattice(lat,latFn,format); break; case multiLat: if (trace & T_TOP) printf("Reading input lattice from file %s\n",ipFn); ipLat = LoadLattice(&buildStack,ipFn,&voc,FALSE); if (ipLat->subList!=NULL) { if (trace & T_TOP) printf("Expanding multi-level lattice\n"); lat = ExpandMultiLevelLattice(&buildStack,ipLat,&voc); } else lat = ipLat; SaveLattice(lat,latFn,format); break; case wordLoop: if (trace & T_TOP) printf("Building word loop\n"); lat = ProcessWordLoop(&gstack,&voc); SaveLattice(lat,latFn,format); break; case wordPair: lat = ProcessWordPair(&gstack,&voc,ipFn); SaveLattice(lat,latFn,format);
if (NextArg()!=STRINGARG) HError(3019,"HBuild: Matrix Bigram file name expected"); ipFn = GetStrArg(); break; case 'n': if (bType != unknown) HError(3019,"HBuild: Can only specifiy one of -m, -n, -w, -x"); bType = boBiGram; if (NextArg()!=STRINGARG) HError(3019,"HBuild: Back-off Bigram file name expected"); ipFn = GetStrArg(); break; case 's': if (NextArg() != STRINGARG) HError(3019,"HBuild: Bigram ENTER label name expected"); enterId=GetLabId(GetStrArg(),TRUE); if (NextArg() != STRINGARG) HError(3019,"HBuild: Bigram EXIT label name expected"); exitId=GetLabId(GetStrArg(),TRUE); break; case 't': if (NextArg() != STRINGARG) HError(3019,"HBuild: Bracket start label name expected"); bStartId=GetLabId(GetStrArg(),TRUE); if (NextArg() != STRINGARG) HError(3019,"HBuild: Bracket end label name expected"); bEndId=GetLabId(GetStrArg(),TRUE); break; case 'u': if (NextArg() != STRINGARG) HError(3019,"HBuild: Unknown label name expected"); unknownId=GetLabId(GetStrArg(),TRUE); break;
HError(3019,"HBuild: Can only specifiy one of -m, -n, -w, -x"); bType = wordPair; if (NextArg()!=STRINGARG) HError(3019,"HBuild: Word pair grammar file name expected"); ipFn = GetStrArg(); break; case 'x': if (bType != unknown) HError(3019,"HBuild: Can only specifiy one of -m, -n, -w, -x"); bType = multiLat; if (NextArg()!=STRINGARG) HError(3019,"HBuild: Multi-level lattice file name expected"); ipFn = GetStrArg(); break; case 'z': zapUnknown = TRUE; break; case 'T': trace = GetChkedInt(0,511,s); break; default: HError(3019,"HBuild: Unknown switch %s",s); } } if (NextArg()!=STRINGARG) HError(3019,"HBuild: Word List file name expected"); wordListFn = GetStrArg(); if (NextArg()!=STRINGARG) HError(3019,"HBuild: output lattice file name expected"); latFn = GetStrArg(); if (bType == unknown) bType = wordLoop; if (saveLatBin) format |= HLAT_LBIN; /* Read the word-list into a Vocab data structure */ InitVocab(&voc); if(ReadDict(wordListFn, &voc)<SUCCESS) HError(3013,"HBuild: ReadDict failed"); switch (bType) { case matBiGram: if (trace & T_TOP) printf("Reading bigram from file %s\n",ipFn); bigramLm = ReadLModel(&gstack, ipFn); if (bigramLm->type != matBigram) HError(3030,"HBuild: File specified is not a matrix bigram"); lat = ProcessBiGram(&gstack,&voc,bigramLm); SaveLattice(lat,latFn,format); break; case boBiGram: if (trace & T_TOP)
/* LatTraceBack produce Lattice from the wordEnd hypotheses recoded in dec */ Lattice *LatTraceBack (MemHeap *heap, DecoderInst *dec) { Lattice *lat; int i, nnodes = 0, nlinks = 0; WordendHyp *sentEndWE; if (!dec->net->end->inst) HError (-9999, "LatTraceBack: end node not active"); else printf ("found %d tokens in end state\n", dec->net->end->inst->ts->n); if (buildLatSE && dec->net->end->inst && dec->net->end->inst->ts->n == 1) sentEndWE = dec->net->end->inst->ts->relTok[0].path; else { if (buildLatSE) HError (-9999, "no tokens in sentend -- falling back to BUILDLATSENTEND = F"); sentEndWE = BuildLattice (dec); } if (!sentEndWE) { HError (-9999, "LatTraceBack: no active sil wordend nodes"); if (forceLatOut) { HError (-9999, "LatTraceBack: forcing lattice output"); #ifdef MODALIGN if (dec->modAlign) /* HError (-9999, "LatTraceBack: forced lattice output not supported with model-alignment"); */ sentEndWE = BuildForceLat (dec); else #endif sentEndWE = BuildForceLat (dec); } } if (!sentEndWE) return NULL; /* recursively number weHyps (nodes), count weHyp + altweHyp (links) */ LatTraceBackCount (dec, sentEndWE, &nnodes, &nlinks); ++nnodes; /* !NULL lattice start node */ printf ("nnodes %d nlinks %d\n", nnodes, nlinks); /*# create lattice */ lat = NewLattice (heap, nnodes, nlinks); /* #### fill in info (e.g. lmscale, inspen, models) */ lat->voc = dec->net->voc; lat->utterance = dec->utterFN; lat->vocab = dec->net->vocabFN; lat->hmms = dec->hset->mmfNames ? dec->hset->mmfNames->fName : NULL; lat->net = dec->lm->name; lat->lmscale = dec->lmScale; lat->wdpenalty = dec->insPen; lat->prscale = dec->pronScale; lat->framedur = 1.0; for (i = 0; i < nnodes; ++i) lat->lnodes[i].hook = NULL; { int na; na = 0; /* create lattice nodes & arcs */ Paths2Lat (dec, lat, sentEndWE, &na); } #ifdef MODALIGN if (dec->modAlign) CheckLAlign (dec, lat); #endif return lat; }