Configuring the Sphinx-4 Front End |
The main design goal of the Sphinx-4 front end is flexibility.
The front end should be modeled as a pipeline of data processors,
and the entire composition of the pipeline should be configurable
from the configuration file. Other design requirements include
allowing multiple instances of the same data processor in the same front end,
where each can be configured differently. Moreover, the possibility of
multiple front ends should be allowed.
To enable all these capabilities, the following scheme is devised to specify the front end in the configuration file. Lets work with the example of a standard Mel Frequency Cepstral Coefficients (MFCC) front end, followed by an explanation:
<component name="mfcFrontEnd" type="edu.cmu.sphinx.frontend.FrontEnd"> <propertylist name="pipeline"> <item>preemphasizer</item> <item>windower</item> <item>dft</item> <item>melFilterBank</item> <item>dct</item> <item>batchCMN</item> <item>featureExtractor</item> </propertylist> </component> <component name="preemphasizer" type="edu.cmu.sphinx.frontend.filter.Preemphasizer"/> <component name="windower" type="edu.cmu.sphinx.frontend.window.RaisedCosineWindower"/> <component name="dft" type="edu.cmu.sphinx.frontend.transform.DiscreteFourierTransform"> <property name="numberFftPoints" value="512"/> </component> <component name="melFilterBank" type="edu.cmu.sphinx.frontend.frequencywarp.MelFrequencyFilterBank"/> <component name="dct" type="edu.cmu.sphinx.frontend.transform.DiscreteCosineTransform"/> <component name="batchCMN" type="edu.cmu.sphinx.frontend.feature.BatchCMN"/> <component name="featureExtractor" type="edu.cmu.sphinx.frontend.feature.DeltasFeatureExtractor"/>Example 1: Specifying a standard MFCC front end.
The first component specifies all the front end proceessors. "mfcFrontEnd"
is the name of our MFCC front end pipeline, followed by the Java class type
of the front end. It is then followed by a list of the data processors,
using a propertylist
called pipeline
, which
you will see is a property of the
FrontEnd class.
The rest of the components specify each of the data processors in turn.
They mainly specify the Java class type of the processor, but it can also
specify the properties of the data processor. For example, in the
case of the DFT data processor, the number of FFT points is specified
as 512. If you look at the DiscreteFourierTransform class, you will notice that
numberFftPoints
is a property of the class.
The name of a component is also useful if we have multiple instances of the same data processor class. For example, suppose that we perform Discrete Fourier Transform two times in a row, but each with a different number of FFT points, we would specify the following:
<component name="mfcFrontEnd" type="edu.cmu.sphinx.frontend.FrontEnd"> <propertylist name="pipeline"> <item>preemphasizer</item> <item>windower</item> <item>dft_1</item> <item>dft_2</item> <item>melFilterBank</item> <item>dct</item> <item>batchCMN</item> <item>featureExtractor</item> </propertylist> </component> <component name="dft_1" type="edu.cmu.sphinx.frontend.transform.DiscreteFourierTransform"> <property name="numberFftPoints" value="128"/> </component> <component name="dft_2" type="edu.cmu.sphinx.frontend.transform.DiscreteFourierTransform"> <property name="numberFftPoints" value="256"/> </component>Example 2: Specifying a front-end pipeline with two DataProcessors of the same class, but different properties.
When the first DiscreteFourierTransform class is initialized in the
'initialize()' method, the 'name' argument will be 'dft_1'. Calling
DiscreteFourierTransform.getName() on it will return 'dft_1'.
<component name="mfcFrontEnd" type="edu.cmu.sphinx.frontend.FrontEnd"> <propertylist name="pipeline"> <item>preemphasizer</item> <item>windower</item> <item>dft</item> <item>melFilterBank</item> <item>dct</item> <item>batchCMN</item> <item>featureExtractor</item> </propertylist> </component> <component name="plpFrontEnd" type="edu.cmu.sphinx.frontend.FrontEnd"> <propertylist name="pipeline"> <item>preemphasizer</item> <item>windower</item> <item>dft</item> <item>plpFilterBank</item> <item>plpCepstrumProducer</item> <item>batchCMN</item> <item>featureExtractor</item> </propertylist> </component> ... // define the components of both front endsExample 3: Specifying multiple front-end pipelines.
That is, you specify the different pipelines, and then just specify each pipeline as you would individually.