public class SimpleBreadthFirstSearchManager extends TokenSearchManager
提供深度优先搜索。为了进行识别处理,应用程序在进行识别处理前需调用initialize即进行初始化,然后重复的调用recognize方法,直到Result.isFinal()返回为true为止。一旦得到了一个最终的结果,terminate 方法将被调用。 所有的得分和概率都是log域的。深度优先搜索的有关信息请看X. Huang, PTR的"Spoken Language Processing"。在collectSuccessorTokens方法中实现了深度优先搜索。
本类的属性:
@S4Component(type = Linguist.class)
public final static String PROP_LINGUIST = "linguist";属性定义了在搜索管理中使用的语音学家的名字。
@S4Component(type = Pruner.class)
public final static String PROP_PRUNER = "pruner";属性定义了剪枝方法的名字。
@S4Component(type = AcousticScorer.class)
public final static String PROP_SCORER = "scorer";属性定义了在搜索管理中的计分器的名字。
@S4Component(type = LogMath.class)
public final static String PROP_LOG_MATH = "logMath";属性定义了在搜索管理中的logmath的名字。
@S4Component(type = ActiveListFactory.class)
public final static String PROP_ACTIVE_LIST_FACTORY = "activeListFactory";属性定义了再搜索管理中的使用的活动列表工厂的名字。
@S4Boolean(defaultValue = false)
public final static String PROP_SHOW_TOKEN_COUNT = "showTokenCount";当此属性设置为true时,识别器将会计算所有在活动列表中的标记的总数当每一帧过后。
@S4Double(defaultValue = 0.0)
public final static String PROP_RELATIVE_WORD_BEAM_WIDTH = "relativeWordBeamWidth";属性设置了在字列表中为剪枝的相对于最大得分的最小得分。得分小于relativeBeamWidth * maximumScore的字在剪枝的过程中将会被剪枝掉。
@S4Boolean(defaultValue = false)
public final static String PROP_WANT_ENTRY_PRUNING = "wantEntryPruning";属性用来控制相对于beam的剪枝将会对状态的entry进行剪枝。
@S4Integer(defaultValue = 0)
public final static String PROP_GROW_SKIP_INTERVAL = "growSkipInterval";属性用于在解码器每一次跳跃增长步长时处理的帧的数量。设置此属性为0会导致解码器不能进行跳跃。设置此数字为一个很小的整数,将会导致解码器的解码的速度增加,但是会减少其准确率。此数字越高,通常会使更小的the grow code(增长代码)被跳跃。
protected Linguist linguist; 提供语言或语法信息。
private Pruner pruner; 用于对活动列表进行剪枝。
private AcousticScorer scorer; 用于对活动列表进行打分
protected int currentFrameNumber; 当前的帧的数量。
protected ActiveList activeList; 标记的活动列表此存储的token为是搜索状态为发射状态的token,即声学模型hmm,即hmmstatestate 搜索状态,此状态是可以根据特征帧进行打分的搜索特征,即此token是可以获得声学得分,通过对搜索状态打分来获得它的声学得分。为当前的帧所在
protected List<Token> resultList; 当前的结果集此存储的token为是final即终止搜索状态的token,此一般为句的结尾处的搜索状态一般为</sil>所表示的搜索状态。为当前位置所在。
protected LogMath logMath;
private Logger logger;
private String name;
private Timer scoreTimer; 得分计时器
private Timer growTimer;
private StatisticsVariable totalTokensScored;
private StatisticsVariable tokensPerSecond;
private StatisticsVariable curTokensScored;
private StatisticsVariable tokensCreated;
private StatisticsVariable viterbiPruned;
private StatisticsVariable beamPruned;
protected boolean showTokenCount;
private boolean wantEntryPruning;
private Map<SearchState, Token> bestTokenMap;
private float logRelativeWordBeamWidth;
private int totalHmms;
private double startTime;
private float threshold;
private float wordThreshold;
private int growSkipInterval;
private ActiveListFactory activeListFactory;
protected boolean streamEnd;
本类的构造方法:
public SimpleBreadthFirstSearchManager();空的构造方法。
public SimpleBreadthFirstSearchManager(LogMath logMath,Linguist linguist, Pruner pruner,AcousticScorerscorer, ActiveListFactory activeListFactory, boolean showTokenCount, doublerelativeWordBeamWidth, int growSkipInterval, boolean wantEntryPruning);非空构造方法:通过给定参数创建对象。
本类的方法:
public void newProperties(PropertySheet ps); 对属性进行设置。与非空构造方法进行属性的设置一样。
public void startRecognition();进行识别之前进行调用,进行相应的准备工作。调用了计分器,语言学家,剪枝的startRecognition方法,和本类的localStart()方法。
protected void localStart();受保护的方法。从语言学家处获得初始化的语法节点并创建了语法节点标记。主要是从语言学家获得搜索图和初始化状态。即搜索状态,在根据此状态创建标记,并把标记加入活动列表中,并且调用了growBranches()创建了分支。
public Result recognize(int nFrames);对给定的数量的帧进行识别处理。nFrames为将进行识别处理的帧数。返回的为当前的结果,如果因为缺少要识别的数据,那么没有结果result,则返回为null。在此方法执行过程中是对每一帧的数据进行识别处理,即调用了下面recognize();方法。
protected boolean recognize();保护的方法,对一帧数据进行识别处理,如果识别处理完成后返回为true。对活动列表中tokens进行了打分处理。
protected boolean scoreTokens();为活动列表计算其声学得分。活动列表仅包含发射状态标记。如果有更多的帧要被打分则返回为true,否则返回为false。在本方法主要是对列表中的标记打分。
protected void pruneBranches();从活动列表中移除没有希望(不想要)的分支。当活动列表中token大于指定的数,则按得分排序,选取指定数量的得分高那些token。
protected void growBranches();用于扩展以保留的分支。扩展活动列表中的每一个标记,查找每一标记的后续标记,直到每一个标记的后续标记都为发射状态标记为止。
protected ActiveList undoLastGrowStep();上一语音帧后没有可用的数据被留下,growBranches()被调用,活动列表中的标记的顺序仅依赖于转移概率和补偿得分。因此我们需要取消最终状态或最后的发射状态的增长步长为了确定列表。
protected void collectSuccessorTokens(Token token);收集一个标记的后续的为发射状态的标记,并把这些标记存入活动列表或结果列表中。token表示收集的是其后续的标记。(如果输入标记为一最终标记,就把它加入结果列表中。对于输入标记的状态的每一个直接后续标记根据其一标记得分和转移概率来计算它的每一项的得分(语言,声学)。如果得分好于搜索状态和帧的最好得分,则会创建一个新的标记,并把此标记加入网格和搜索状态。如果状态为发射状态则把它加入列表中,否则的话迭代收集一个新的标记后续。我们实际上是乘以此变量,但是由于在log域的原因,乘变成了加。如果状态为非发射状态,检查我们是否已经访问个这个状态在帧中。只有在我们没有访问它时才扩展此标记。这将会防止搜索陷入循环中,这是有能够发生的在糟糕的jsgf语法中如((foo*)*)*)
protected void localStop()为搜索管理进行本地清除。
protected Token getBestToken(SearchState state);为输入状态获得其最好(最高得分)标记。即从bestTokenMap中获得与此状态相关的最好标记。
protected Token setBestToken(Token token, SearchState state);为给定状态设置最好(最高得分)标记。Token为最好标记。State为状态。如果以前在bestTokenMap中存在着此状态与相应的标记,则返回的是此标记(以前的最好标记),如果存在此状态但是不存在相应标记或者不存此状态,则返回为null。
public ActiveList getActiveList();返回(得到)活动列表。
private double getTotalTime();返回的是从startRecognize()方法开始到现在的总的时间。
private boolean isVisited(Token t);t为将会被检查的标记。本方是查看输入标记t的前一标记(包括其前一标记的前一标记)中是否存在着与输入标记t的相同的搜索状态。如果存在则返回为true,否则返回为false。决定了我们在以前的帧中是否存在着与此标记的搜索状态相同的状态,也就是我们能否访问到以前帧的与此标记搜索状态相同的搜索状态。
protected void showTokenCount();把活动列表属性中的不同标记的个数(数量)和结果列表属性中的标记的个数(数量)输入到信息日志。对在活动列表中的所有标记进行计数,此方法需要发费较大。本法是通过把标记放入set集合中来求长度实现的。
protected Map<SearchState, Token> getBestTokenMap();返回bestTokenMap;即最好标记和状态对的map属性。
protected void setBestTokenMap(Map<SearchState, Token>bestTokenMap);设置bestTokenMap。即把一个新的bestTokenMap赋值给bestTokenMap属性。
public List<Token> getResultList();返回结果列表,即resultList属性。
public int getCurrentFrameNumber();得到当前输入的帧的数量。即当前帧数。为CurrentFrameNumber属性。
public Timer getGrowTimer();获得扩展分支所需的计时器。即growTimer计时器。
public StatisticsVariable getTokensCreated();返回为tokensCreated统计变量。
public void allocate();分配搜索所需的各种资源。包括一些统计变量以及linguist.allocate();
pruner.allocate();scorer.allocate();scoreTimer,pruneTimer,growTimer等。其中包括各种计时器。语言学家,剪枝,计分器的所需的资源分配。
public void deallocate();语言学家,剪枝,计分器的分配的资源分配进行释放处理,即释放相应的资源。scorer.deallocate();
pruner.deallocate();linguist.deallocate();
public String toString();得到的是本类的类名,也就是name属性。