/* CreateMonoList: set nPhones and create list of monophones */ void CreateMonoList(void) { int i,j; Boolean found; LabId list[MAXMONOPHONES], id; char buf[255]; MLink q; nPhones = 0; for (i=0; i<MACHASHSIZE; i++) for (q=hset.mtab[i]; q!=NULL; q=q->next) if (q->type=='l'){ strcpy(buf,q->id->name); TriStrip(buf); id = GetLabId(buf,TRUE); found = FALSE; for (j=0; j<nPhones; j++) if (list[j] == id) { found = TRUE; break; } if (!found){ if (nPhones>=MAXMONOPHONES) HError(2422,"CreateMonoList: Too many monophones"); list[nPhones++] = id; } } monophones = (LabId *)New(&labIdStack, nPhones*sizeof(LabId)); for (i=0; i<nPhones; i++) monophones[i] = list[i]; --monophones; }
void CheckLAlign (DecoderInst *dec, Lattice *lat) { int i, j; LArc *la; float dur, laDur; Pron pron; for (i = 0, la = lat->larcs; i < lat->na; ++i, ++la) { if (la->nAlign == 0 || !la->lAlign) { if (forceLatOut) { /* Faking sentence end arc model alignment */ FakeSEModelAlign(lat, la); } else { HError (9999, "CheckLAlign: empty model alignment for arc %d", i); } } for (pron = la->end->word->pron; pron; pron = pron->next) if (pron->pnum == la->end->v) break; assert (pron); laDur = (la->end->time - la->start->time); dur = 0.0; for (j = 0; j < la->nAlign; ++j) { dur += la->lAlign[j].dur; #if 0 /* sanity checking -- does not work for non-sildicts */ strcpy (buf, la->lAlign[j].label->name); TriStrip (buf); monolab = GetLabId (buf, FALSE); assert (pron->phones[j] == monolab); #endif } #if 0 assert (la->nAlign == pron->nphones); #endif if (fabs (dur - laDur) > dec->frameDur/2) printf ("CheckLAlign: MODALIGN Sanity check failed! %d laDur %.2f dur %.2f\n", i, laDur, dur); } }
void InitPhonePost (DecoderInst *dec) { HMMScanState hss; HLink hmm; MLink m; char buf[100]; LabId phoneId; NewHMMScan (dec->hset, &hss); do { hmm = hss.hmm; assert (!hmm->hook); m = FindMacroStruct (dec->hset, 'h', hmm); assert (strlen (m->id->name) < 100); strcpy (buf, m->id->name); TriStrip (buf); phoneId = GetLabId (buf, TRUE); phoneId->aux = (Ptr) 0; hmm->hook = (Ptr) phoneId; } while(GoNextHMM(&hss)); EndHMMScan(&hss); dec->nPhone = 0; /* count monophones -- #### make this more efficent! */ NewHMMScan (dec->hset, &hss); do { hmm = hss.hmm; phoneId = (LabId) hmm->hook; if (!phoneId->aux) { ++dec->nPhone; phoneId->aux = (Ptr) dec->nPhone; assert (dec->nPhone < 100); dec->monoPhone[dec->nPhone] = phoneId; } } while(GoNextHMM(&hss)); EndHMMScan(&hss); printf ("found %d monophones\n", dec->nPhone); dec->phonePost = (LogDouble *) New (&gcheap, (dec->nPhone+1) * sizeof (LogDouble)); dec->phoneFreq = (int *) New (&gcheap, (dec->nPhone+1) * sizeof (int)); }
/* LoadASet: set aSize, load the allophone set of x and return the number of states in each model (all allophones must have the same number of states) */ int LoadASet(LabId x) { int i,N=0; HLink hmm; MLink q; LabId id; char *aid,buf[255]; aSize = 0; for (i=0; i<MACHASHSIZE; i++) for (q=hset.mtab[i]; q!=NULL; q=q->next) if (q->type=='l'){ aid = q->id->name; strcpy(buf,aid); TriStrip(buf); id = GetLabId(buf,FALSE); if (id==x){ if (trace&T_OPT) printf(" loading allophone %s\n",aid); hmm = (HLink)q->structure; if (hmm->numStates>0) { if (N==0) N = hmm->numStates; else if (N != hmm->numStates) HError(2423,"LoadASet: allophones must have same num states %d vs %d", N, hmm->numStates); hmm->numStates = -N; aSet[++aSize] = hmm; } } } for (i=1; i<=aSize; i++) aSet[i]->numStates = N; return N; }
/* GetTrSym: get next symbol from f, remember that f might be an MLF in which case EOF is a period on its own line */ static void GetTrSym(Source *src, Boolean htk) { int nxtch; Boolean trSOL; trNum = 0.0; trStr[0]='\0'; if (trSym==TRNULL) curch = GetCh(src); if (trSym==TREOL || trSym==TRNULL) trSOL=TRUE; else trSOL=FALSE; while (curch == ' ' || curch == '\t') { trSOL=FALSE; curch = GetCh(src); } if (!htk && curch == COMMCHAR) SkipLine(src); switch (curch) { case EOF: trSym = TREOF; break; case LFEED: curch = GetCh(src); trSym = TREOL; break; case CRETURN: curch = GetCh(src); if (curch == LFEED) curch = GetCh(src); trSym = TREOL; break; case ',': if (!htk) { curch = GetCh(src); trSym = TRCOMMA; break; } case '.': if (curch=='.' && trSOL==TRUE && mlfUsed>0 && htk) { nxtch = GetCh(src); if (nxtch == LFEED || nxtch == CRETURN) { trSym = TREOF; break; } UnGetCh(nxtch,src); /* Requires more than one character pushback */ } default: if (htk) { UnGetCh(curch,src); if (!ReadString(src,trStr)) { trSym=TREOF; break; } curch=GetCh(src); if (trSOL && strcmp(LEVELSEP,trStr)==0) { if (curch == LFEED || curch == CRETURN) { trSym = TRLEV; break; } } } else { nxtch=0; do { if (nxtch>=255) break; trStr[nxtch++]=curch; curch=GetCh(src); } while (!isspace(curch) && curch != ',' && curch != EOF); trStr[nxtch]='\0'; src->wasQuoted=FALSE; } if (!src->wasQuoted && IsNumeric(trStr)){ sscanf(trStr,"%lf",&trNum); trSym = TRNUM; break; } if (htk && compatMode && (strcmp(LEVELSEP,trStr)==0 || strcmp(".",trStr)==0)) { src->wasNewline=FALSE; SkipWhiteSpace(src); if (src->wasNewline) { curch = CRETURN; trSym=(strcmp(LEVELSEP,trStr)==0?TRLEV:TREOF); break; } curch = GetCh(src); } if (stripTriPhones) TriStrip(trStr); trSym = TRSTR; break; } }
/* EXPORT->FormatTranscription: Format transcription prior to output */ void ReFormatTranscription(Transcription *trans,HTime frameDur, Boolean states,Boolean models,Boolean triStrip, Boolean normScores,Boolean killScores, Boolean centreTimes,Boolean killTimes, Boolean killWords,Boolean killModels) { LabList *ll; LLink lab; HTime end; char buf[MAXSTRLEN],*p,tail[64]; int lev,j,frames; if (killScores) { for (lev=1;lev<=trans->numLists;lev++) { ll=GetLabelList(trans,lev); for(lab=ll->head->succ;lab->succ!=NULL;lab=lab->succ) { lab->score=0.0; for (j=1;j<=ll->maxAuxLab;j++) lab->auxScore[j]=0.0; } } } if (triStrip) { for (lev=1;lev<=trans->numLists;lev++) { ll=GetLabelList(trans,lev); for(lab=ll->head->succ;lab->succ!=NULL;lab=lab->succ) { if (states && !models) { strcpy(buf,lab->labid->name); if ((p=strrchr(buf,'['))!=NULL) { strcpy(tail,p); *p=0; } else *tail=0; TriStrip(buf); strcat(buf,tail); lab->labid=GetLabId(buf,TRUE); } else { strcpy(buf,lab->labid->name); TriStrip(buf); lab->labid=GetLabId(buf,TRUE); } for (j=1;j<=ll->maxAuxLab;j++) { if (lab->auxLab[j]==NULL) continue; strcpy(buf,lab->auxLab[j]->name); TriStrip(buf); lab->auxLab[j]=GetLabId(buf,TRUE); } } } } if (normScores) { for (lev=1;lev<=trans->numLists;lev++) { ll=GetLabelList(trans,lev); for(lab=ll->head->succ;lab->succ!=NULL;lab=lab->succ) { frames=(int)floor((lab->end-lab->start)/frameDur + 0.4); if (frames==0) lab->score=0.0; else lab->score=lab->score/frames; if (states && models && ll->maxAuxLab>0 && lab->auxLab[1]!=NULL) { end=AuxLabEndTime(lab,1); frames=(int)floor((end-lab->start)/frameDur + 0.4); if (frames==0) lab->auxScore[1]=0.0; else lab->auxScore[1]=lab->auxScore[1]/frames; } } } } if (killTimes) { for (lev=1;lev<=trans->numLists;lev++) { ll=GetLabelList(trans,lev); for(lab=ll->head->succ;lab->succ!=NULL;lab=lab->succ) { lab->start=lab->end=-1.0; } } } if (centreTimes) { for (lev=1;lev<=trans->numLists;lev++) { ll=GetLabelList(trans,lev); for(lab=ll->head->succ;lab->succ!=NULL;lab=lab->succ) { lab->start+=frameDur/2; lab->end-=frameDur/2; } } } if (killWords) { for (lev=1;lev<=trans->numLists;lev++) { ll=GetLabelList(trans,lev); if (ll->maxAuxLab>0) for(lab=ll->head->succ;lab->succ!=NULL;lab=lab->succ) lab->auxLab[ll->maxAuxLab]=NULL; } } if (killModels && models && states) { for (lev=1;lev<=trans->numLists;lev++) { ll=GetLabelList(trans,lev); if (ll->maxAuxLab==2) for(lab=ll->head->succ;lab->succ!=NULL;lab=lab->succ) { lab->auxLab[1]=lab->auxLab[2]; lab->auxScore[1]=lab->auxScore[2]; lab->auxLab[2]=NULL; } } } }