grammarpoint.java
来自「It is the Speech recognition software. 」· Java 代码 · 共 358 行
JAVA
358 行
/* * Copyright 1999-2002 Carnegie Mellon University. * Portions Copyright 2002 Sun Microsystems, Inc. * Portions Copyright 2002 Mitsubishi Electric Research Laboratories. * All Rights Reserved. Use is subject to license terms. * * See the file "license.terms" for information on usage and * redistribution of this file, and for a DISCLAIMER OF ALL * WARRANTIES. * */package edu.cmu.sphinx.linguist.flat;import java.util.ArrayList;import java.util.Iterator;import java.util.List;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.linguist.language.grammar.GrammarArc;import edu.cmu.sphinx.linguist.language.grammar.GrammarNode;/** * Manages a particular point in a grammar. The GrammarPoint is used * to manage the look-ahead for generating right-contexts. Since we * haven't built the HMM tree yet, looking ahead can be difficult. The * GrammarPoint class points to a particular unit within a * pronunciation/word/grammar. From a particular grammar point, it is * possible to get the set of next grammar points. */public class GrammarPoint { private GrammarNode node; // the grammar node private int alternativeIndex; // which alternative in the grammar private int wordIndex; // which word in the alternative private int pronunciationIndex; // which pronunciation in the word private int unitIndex; // which unit in the pronunciation private static boolean bounded = false; /** * Creates a grammar point that points to the given unit of the * given pronunciation state. * * @param state the pronunciation of interest */ public GrammarPoint(SentenceHMMState state) { while (state != null) { if (state instanceof UnitState) { unitIndex = state.getWhich(); } else if (state instanceof PronunciationState) { pronunciationIndex = state.getWhich(); } else if (state instanceof WordState) { wordIndex = state.getWhich(); } else if (state instanceof AlternativeState) { alternativeIndex = state.getWhich(); } else if (state instanceof GrammarState) { node = ((GrammarState)state).getGrammarNode(); } state = state.getParent(); } assert node != null; } /** * Creates a grammar node that points to the first unit of the * first pronunciation of the first word of the given grammar * node * * @param node the grammar node of interest */ public GrammarPoint(GrammarNode node) { this(node, -1, 0, 0, 0); } /** * Creates a GrammarPoint that corresponds to the given unit of * the given pronunciation * * @param state the pronunciation state * @param which the index of the unit */ public GrammarPoint(PronunciationState state, int which ) { this(state); unitIndex = which; } /** * Creates a GrammarPoint that points to a fully specified unit * * @param node the grammar node * @param wordIndex the index of the word in the node * @param pronunciationIndex the index of the pronunciation in * the word. * @param unitIndex the index of the unit in the pronunciation */ public GrammarPoint(GrammarNode node, int alternativeIndex, int wordIndex, int pronunciationIndex, int unitIndex) { assert node != null; this.node = node; this.alternativeIndex = alternativeIndex; this.wordIndex = wordIndex; this.pronunciationIndex = pronunciationIndex; this.unitIndex = unitIndex; } /** * Gets the unit associated with this point in the grammar * * @return the unit, or null if there is no unit associated with * this point in the grammar */ private Unit getUnit() { Unit unit = null; Word[][] alternatives = node.getAlternatives(); if (alternativeIndex != -1 && alternativeIndex < alternatives.length) { Word[] words = alternatives[alternativeIndex]; if (wordIndex < words.length) { Pronunciation[] pronunciations = words[wordIndex].getPronunciations(null); if (pronunciationIndex < pronunciations.length) { Unit[] units = pronunciations[pronunciationIndex].getUnits(); if (unitIndex < units.length) { unit = units[unitIndex]; } } } } return unit; } /** * Gets the unit associated with this point in the grammar. If * there is no unit, return filler * * @return the unit for this grammar node or a filler unit */ private Unit getUnitOrFill() { Unit unit = getUnit(); if (unit == null) { unit = UnitManager.SILENCE; } return unit; } /** * Gets all of the right contexts for this grammar point. The * contexts returned are guaranteed to be 'size' units in length, * The number of contexts * returned depends upon the perplexity of the grammar downstream * from this GrammarPoint * * @param size the size of each context returned * @param startWithCurrent include the current state in the * context * * @param maxContexts the maxium number of right contexts to return * * @return a list of containing Unit[] contexts. */ public List getRightContexts(int size, boolean startWithCurrent, int maxContexts) { List contexts = new ArrayList(); List nextPoints = getNextGrammarPoints(startWithCurrent); if (nextPoints.size() == 0) { Unit[] units = Unit.getEmptyContext(size); addContext(contexts, units); } else { for (Iterator i = nextPoints.iterator(); i.hasNext();) { GrammarPoint gp = (GrammarPoint) i.next(); if (size == 1) { Unit[] units = new Unit[size]; units[0] = gp.getUnitOrFill(); addContext(contexts, units); } else { List rc = gp.getRightContexts(size - 1, false, maxContexts - contexts.size()); for (Iterator j = rc.iterator(); j.hasNext(); ) { Unit[] rcUnits = (Unit[]) j.next(); Unit[] units =Unit.getEmptyContext(rcUnits.length + 1); units[0] = gp.getUnitOrFill(); for (int k = 0; k < rcUnits.length; k++) { units[k + 1] = rcUnits[k]; } addContext(contexts, units); } } if (contexts.size() >= maxContexts) { break; } } } return contexts; } /** * Add a context to a list of contexts after ensuring * that no identical contexts exist on the list. When a right * context is collected it may contain duplicates in certain * cases (when this unit is the last unit in a grammar node, and * there is a branch to multiple words in subsequent nodes, for * instance) * * @param contexts the list of contexts to add the new units to * @param units the units to add to the context * */ private void addContext(List contexts, Unit[] units) { for (Iterator i = contexts.iterator(); i.hasNext(); ) { Unit[] onList = (Unit[]) i.next(); if (Unit.isContextMatch(onList, units)) { return; // found on list so bailout } } contexts.add(units); } /** * Returns a list of next GrammarPoints for this GrammarPoint. If * there are no more downstream grammar points with words, an * empty list is returned. * * @param startWithCurrent include the current state in the * context * * @return the (possibly empty) list of next GrammarPoint objects */ private List getNextGrammarPoints(boolean startWithCurrent) { List nextPoints = new ArrayList(); int unitsLength = 0; // if this GrammarPoint is associated with a grammar node // and the grannar node has alternatives, add points for each // alternative if (alternativeIndex == -1 && node.getAlternatives().length > 0) { for (int i = 0; i < node.getAlternatives().length; i++) { GrammarPoint gp = new GrammarPoint(node, i, 0, 0, 0); nextPoints.add(gp); } } // If we don't have any alternatives, (i.e. this grammar node // has no words at all associated with it, then just go and // find the set of next grammar nodes with words, collect // them up, expand them and return that set. else if (node.getAlternatives().length == 0) { addNextGrammarPointsWithWords(node, nextPoints); } else { // At this point we are at a node with a set of alternatives GrammarPoint next; if (startWithCurrent) { next = this; } else { next = new GrammarPoint(node, alternativeIndex, wordIndex, pronunciationIndex, unitIndex + 1); } Pronunciation[] pronunciations = node. getAlternatives()[alternativeIndex][wordIndex]. getPronunciations(null); unitsLength = pronunciations[pronunciationIndex].getUnits().length; if (next.unitIndex < unitsLength) { nextPoints.add(next); } else { next.unitIndex = 0; Word[] alternative = next.node.getAlternatives()[alternativeIndex]; if (++next.wordIndex < alternative.length) { Word word = alternative[next.wordIndex]; for (int i = 0; i < word.getPronunciations(null).length; i++) { GrammarPoint newGP = new GrammarPoint(next.node, next.alternativeIndex, next.wordIndex, i, 0); nextPoints.add(newGP); } } else if (!bounded) { addNextGrammarPointsWithWords(next.node, nextPoints); } } } return nextPoints; } /** * Given a GrammarNode return a list of successors GrammarNodes * that contain words * * @param node successors are gathered from this node * * @return list the list of grammar nodes */ private static List getNextGrammarNodesWithWords(GrammarNode node) { List list = new ArrayList(); GrammarArc[] arcs = node.getSuccessors(); for (int i = 0; i < arcs.length; i++) { GrammarNode gnode = arcs[i].getGrammarNode(); if (gnode.getAlternatives().length == 0) { if (gnode.isFinalNode()) { list.add(gnode); } else { list.addAll(getNextGrammarNodesWithWords(gnode)); } } else { list.add(gnode); } } return list; } /** * Adds the next set of grammar points that contain words to the * given list * * @param node the grammar node * @param nextPoints where the grammar points should be added */ private static void addNextGrammarPointsWithWords(GrammarNode node, List nextPoints) { for (Iterator i = getNextGrammarNodesWithWords(node).iterator(); i.hasNext(); ) { GrammarNode nextNode = (GrammarNode) i.next(); for (int j = 0; j < nextNode.getAlternatives().length; j++) { GrammarPoint gp = new GrammarPoint(nextNode, j, 0, 0, 0); nextPoints.add(gp); } } } /** * Sets the state of the bounded configuration flag * * @param state if true searches for context will not cross * grammar nodes. */ static void setBounded(boolean state) { bounded = state; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?