package edu.cmu.sphinx.linguist.allphone; import java.util.ArrayList; import edu.cmu.sphinx.linguist.SearchStateArc; import edu.cmu.sphinx.linguist.WordSearchState; import edu.cmu.sphinx.linguist.acoustic.HMM; import edu.cmu.sphinx.linguist.acoustic.LeftRightContext; import edu.cmu.sphinx.linguist.acoustic.Unit; import edu.cmu.sphinx.linguist.acoustic.UnitManager; import edu.cmu.sphinx.linguist.dictionary.Pronunciation; import edu.cmu.sphinx.linguist.dictionary.Word; import edu.cmu.sphinx.util.LogMath; public class PhoneWordSearchState extends PhoneNonEmittingSearchState implements WordSearchState { public PhoneWordSearchState(Unit unit, AllphoneLinguist linguist, float insertionProb, float languageProb) { super(unit, linguist, insertionProb, languageProb); } public SearchStateArc[] getSuccessors() { ArrayList<SearchStateArc> result = new ArrayList<SearchStateArc>(); Unit rc = UnitManager.SILENCE; Unit base = unit.getBaseUnit(); if (unit.isContextDependent()) rc = ((LeftRightContext)unit.getContext()).getRightContext()[0]; ArrayList<HMM> successors = linguist.useContextDependentPhones() ? linguist.getCDSuccessors(base, rc) : linguist.getCISuccessors(); for (HMM successor : successors) result.add(new PhoneHmmSearchState(successor.getInitialState(), linguist, linguist.getPhoneInsertionProb(), LogMath.LOG_ONE)); return result.toArray(new SearchStateArc[result.size()]); } public boolean isFinal() { return true; } public Pronunciation getPronunciation() { Unit[] pronUnits = new Unit[1]; pronUnits[0] = unit; Pronunciation p = new Pronunciation(pronUnits, "", 1.0f); p.setWord(new Word(unit.getName(), null, false)); return p; } public boolean isWordStart() { return false; } public int getOrder() { return 1; } @Override public boolean equals(Object obj) { if (!(obj instanceof PhoneWordSearchState)) return false; boolean haveSameBaseId = ((PhoneWordSearchState)obj).unit.getBaseID() == unit.getBaseID(); boolean haveSameContex = ((PhoneWordSearchState)obj).unit.getContext().equals(unit.getContext()); return haveSameBaseId && haveSameContex; } @Override public int hashCode() { return unit.getContext().hashCode() * 91 + unit.getBaseID(); } }