根据前面的分析,语音识别调用的接口是Recognizer的recognizer方法,咱们看下recognize方法:
ide
recognize只是调用了decoder的decode方法,转到decode方法:ui
在decode方法中,先调用searchManager的startRecognition开始识别,而后在一个while循环中调用searchManager的recognize方法,recognize返回一个result对象,若是result为null,或code
result.isFinal()为true,则退出循环,再调用searchManager的stopRecognition方法中止识别。对象
看来主要仍是SearchManager在工做,所以须要详细分析一下SearchManager。咱们能够看到SearchManager其实是一个接口,只是定义了startRecognition,stopRecognition,recognize等抽象方法而已,这样咱们就不得不找到具体的子类了。blog
仍是以HelloWorld这个Demo为切入点,查看它的配置文件:继承
从配置文件能够看到,HelloWorld使用的是SimpleBreadthFirstSearchManager这个类,固然SearchManager的子类确定不止这一个,在edu.cmu.sphinx.decoder.search这个包中还能够看到其余的SearchManager,如SkewPruningSearchManager,TokenHeapSearchManager等。接口
咱们看下SimpleBreadthFirstSearchManager的具体实现:get
显然它是从TokenSearchManager继承而来,这样又要去分析TokenSearchManager类了。可是通过对TokenSearchManager的分析发现,它并无实现接口中的那几个方法,TokenSearchManager只是一个抽象来,因此咱们再转回对SimpleBreadthFirstSearchManager的分析。it
SimpleBreadthFirstSearchManager有3个很是重要的成员变量:io
下面对这3个变量简单解释一下。
Linguist主要是提供语言,语法相关信息。
Pruner对Active List进行裁剪。
AcousticScorer对Active List进行评分。
咱们先来看下SimpleBreadthFirstSearchManager的startRecognition方法:
显然在这个方法中,分别调用了这3个成员的startRecognition方法。而stopRecognition也差很少:
好了,今天暂时先分析到这里,开始和中止识别主要是调用了Linguist,Pruner,AcousticScorer这3个类中的方法,而最重要的recognize方法尚未分析。后面将会对这两个模块进行详细的分析。