根据前面的分析,语音识别调用的接口是Recognizer的recognizer方法,我们看下recognize方法:


recognize只是调用了decoder的decode方法,转到decode方法:


在decode方法中,先调用searchManager的startRecognition开始识别,然后在一个while循环中调用searchManager的recognize方法,recognize返回一个result对象,如果result为null,或

result.isFinal()为true,则退出循环,再调用searchManager的stopRecognition方法停止识别。


看来主要还是SearchManager在工作,因此需要详细分析一下SearchManager。我们可以看到SearchManager实际上是一个接口,只是定义了startRecognition,stopRecognition,recognize等抽象方法而已,这样我们就不得不找到具体的子类了。


还是以HelloWorld这个Demo为切入点,查看它的配置文件:


从配置文件可以看到,HelloWorld使用的是SimpleBreadthFirstSearchManager这个类,当然SearchManager的子类肯定不止这一个,在edu.cmu.sphinx.decoder.search这个包中还可以看到其他的SearchManager,如SkewPruningSearchManager,TokenHeapSearchManager等。


我们看下SimpleBreadthFirstSearchManager的具体实现:


显然它是从TokenSearchManager继承而来,这样又要去分析TokenSearchManager类了。但是经过对TokenSearchManager的分析发现,它并没有实现接口中的那几个方法,TokenSearchManager只是一个抽象来,所以我们再转回对SimpleBreadthFirstSearchManager的分析。


SimpleBreadthFirstSearchManager有3个非常重要的成员变量:


下面对这3个变量简单解释一下。


Linguist主要是提供语言,语法相关信息。

Pruner对Active List进行裁剪。

AcousticScorer对Active List进行评分。


我们先来看下SimpleBreadthFirstSearchManager的startRecognition方法:


显然在这个方法中,分别调用了这3个成员的startRecognition方法。而stopRecognition也差不多:


好了,今天暂时先分析到这里,开始和停止识别主要是调用了Linguist,Pruner,AcousticScorer这3个类中的方法,而最重要的recognize方法还没有分析。后面将会对这两个模块进行详细的分析。