Sphinx3Loader API

public class Sphinx3Loader implements Loader
此类主要用来装载声学模型的中的各种文件。
装载由sphinx3训练所产生的一个绑定状态的声学模型。
声学模型是存储在确定url的目录下的。即以确定url目录的形式被存储。字典和语言模型文件并没有被要求存储在包中。你能够单独确定它们的存储位置。
配置文件应该设置组件的代理属性:
Location属性确定了声学模型数据文件存储的路径(目录)。你能够使用resource属性用来确定在jar包中的文件或其它URL方案(计划)的前缀。
实际的声学模型数据文件被命名为”mdef”,”means”,”variances”,”transition_matrices”,”mixture_weights”.
如果模型的一些布局(文件的管理)是与SphinxTrain训练机所产生的默认的模型文件布局不同,则你需要确定一些额外的属性:如dataLocation属性用来设置二进制文件的路径,mdef属性用来设置模型定义文件的路径。以下为事例:
让我们查看the Wall Street Journal acoustic model的jar文件,它位于sphinx4/lib目录下,当你运行"jar tf lib/WSJ_8gau_13dCep_16k_40mel_130Hz_6800Hz.jar"后,你将会发现其内部结构如下:
* WSJ_8gau_13dCep_16k_40mel_130Hz_6800Hz.jar
 *   |
 *   +- license.terms
 *   +- cd_continuous_8gau
 *   |   |
 *   |   +- means
 *   |   +- variances
 *   |   +- mixture_weights
 *   |   +- transition_matrices
 *   |
 *   +- dict
 *   |   |
 *   |   +- alpha.dict
 *   |   +- cmudict.0.6d
 *   |   +- digits.dict
 *   |   +- fillerdict
 *   |
 *   +- etc
 *       |
 *       +- WSJ_clean_13dCep_16k_40mel_130Hz_6800Hz.4000.mdef
 *       +- WSJ_clean_13dCep_16k_40mel_130Hz_6800Hz.ci.mdef
 *       +- variables.def
所以装载此模型文件的的配置如下:
component name="wsjLoader" type="edu.cmu.sphinx.linguist.acoustic.tiedstate.Sphinx3Loader" 
property name="logMath" value="logMath"/ 
property name="unitManager" value="unitManager"/ 
property name="location" value="resource:/WSJ_8gau_13dCep_16k_40mel_130Hz_6800Hz"/ 
property name="modelDefinition" value="etc/WSJ_clean_13dCep_16k_40mel_130Hz_6800Hz.4000.mdef"/ 
property name="dataLocation" value="cd_continuous_8gau/" 
 /component
使用SphinxTrain 模型的更多详细的信息,请看../../../../../../../doc/UsingSphinxTrainModels.html文件。
本类的属性:
@S4Component(type = LogMath.class)
public final static String PROP_LOG_MATH = "logMath";系统的logmath组件。
@S4Component(type = UnitManager.class)
public final static String PROP_UNIT_MANAGER = "unitManager";单元管理(器)。
@S4String(mandatory = true)
public final static String PROP_LOCATION = "location";用来确定模型目录结构的根目录(根位置)。
@S4String(mandatory = false, defaultValue = "mdef")
 public final static String PROP_MODEL = "modelDefinition";模型定义文件名字(包括HMM数据)
@S4String(mandatory = false, defaultValue = "")
public final static String PROP_DATA_LOCATION = "dataLocation";声学模型中的子文件夹。
@S4Boolean(defaultValue = true)
public final static String PROP_USE_CD_UNITS = "useCDUnits";属性用于确定是否使用场景依赖的单元。
@S4Double(defaultValue = 0.0f)
public final static String PROP_MC_FLOOR = "MixtureComponentScoreFloor";混合组件得分基底。
@S4Double(defaultValue = 0.0001f)
public final static String PROP_VARIANCE_FLOOR = "varianceFloor";方差基底。
@S4Double(defaultValue = 1e-7f)
public final static String PROP_MW_FLOOR = "mixtureWeightFloor";混合权重基底。
protected final static String FILLER = "filler";
protected final static String SILENCE_CIPHONE = "SIL";
protected final static int BYTE_ORDER_MAGIC = 0x11223344;
public final static String MODEL_VERSION = "0.3";
    private final static int CONTEXT_SIZE = 1;此了场景(左右场景的长度是一样的,都为此值)的长度。单元的场景包括左右场景。
    protected Pool meansPool;均值池
    protected Pool variancePool;方差池
    protected Pool transitionsPool;状态转移矩阵池
    protected Pool mixtureWeightsPool;混合权重池  
    private Pool meanTransformationMatrixPool;均值转换矩阵池
    private Pool meanTransformationVectorPool;均值转换矢量池
    private Pool varianceTransformationMatrixPool;方差转换矩阵池
    private Pool varianceTransformationVectorPool;方差转换矢量池
       protected float[][] transformMatrix;转移矩阵
    protected Pool senonePool;此池存储的senone为GaussianMixture即混合高斯。
    private Map contextIndependentUnits;场景独立单元map
    private HMMManager hmmManager;hmm管理器
    protected LogMath logMath;
    private UnitManager unitManager;单元管理器
    private boolean swap;用来确定是否需进行大端字节与小端字节(内存中的存储方式)的转换。高位存储的是高字节还是低字节的方式。
    private final static String DENSITY_FILE_VERSION = "1.0";
    private final static String MIXW_FILE_VERSION = "1.0";
    private final static String TMAT_FILE_VERSION = "1.0";
    private final static String TRANSFORM_FILE_VERSION = "0.1";
    
  配置属性
    protected Logger logger;
    private URL location;
    protected String model;
    protected String dataLocation;
    protected float distFloor;
    protected float mixtureWeightFloor;最小权重值
    protected float varianceFloor;最小方差值
    protected boolean useCDUnits;
    private boolean loaded;
    本类的构造方法:
public Sphinx3Loader(URL location, String model, String dataLocation,LogMath logMath, UnitManager unitManager,float distFloor,float mixtureWeightFloor, float varianceFloor, boolean useCDUnits);给定属性来创建对象。
public Sphinx3Loader(String location, String model, String dataLocation,
LogMath logMath, UnitManager unitManager,float distFloor,float mixtureWeightFloor, float varianceFloor, boolean useCDUnits);给定属性参数创建对象。只是与上一个构造方法给的参数不同。
public Sphinx3Loader();空的构造方法。
本类的方法:
protected void init(URL location, String model, String dataLocatoin, LogMath logMath, UnitManager unitManager,float distFloor, float mixtureWeightFloor, float varianceFloor,boolean useCDUnits, Logger logger);通过给定参数进行属性赋值处理。
public void newProperties(PropertySheet ps);用于在获得对象的情况下,进行属性的设置或调整改变。
protected HMMManager getHmmManager();返回HMM管理器。
protected InputStream getDataStream(String path);为了兼容此方法跟ConfigurationManagerUtils.getResource是有点不同的,默认情况下它所查看的是资源,而非文件。此方法是通过url来实现的。返回的是输入流。为InputStream。通过调用url的openstream方法实现。
String readWord(DataInputStream dis);从输入流中一个字(此字为空格所分割的文本),dis为输入流。范围的为字的字符串表示。即字符串。即空格之间的字符串(为一个字)。
protected DataInputStream readS3BinaryHeader(String path, Properties props);通过给定的location + path(根目录加子路径(可以为文件名))即文件的路径来读取S3二进制文件的文件头,并把文件头信息添加入给定的Properties对象中,此对象用于存储文件头的属性即文件头信息。参数path为文件名,props为Properties对象,返回的是文件头后的输入流即DataInputStream。在此方法中对文件头进行了相关的检测,检测其是否为正确的文件头。不是正确的,则会抛出异常。
protected int readInt(DataInputStream dis);从输入流中读取四个字节即一个int型数据。输出此int数据。在此方法中考虑了数据在内存中的存储方式。及计算了校验和。
protected float readFloat(DataInputStream dis);从输入流中读取一个浮点数,必要时进行字节交换。返回的为一浮点数。此方法的实现是同readInt方法来实现的,即本方法仍然只会连续读取4个字节,但是是以浮点数的形式输出这4个字节的。
protected float[] readFloatArray(DataInputStream dis, int size);从输入流中读取指定数量的浮点数。返回的是浮点数数组。Size为要读取的浮点数的个数。本方法是通过readFloat方法来实现的。
private char readChar(DataInputStream dis);从输入流中读取一个字节,以字符的形式输出此字节。
protected Pool loadDensityFile(String path, float floor);装载sphinx3密度文件即方差和均值文件,均值和方差数据被创建,并存入给定的池中。输入参数path为数据的名字即文件名,floor是所允许的最小的均值或方差。即最小密度值。返回的是一个存储均值或方差数组的池。注意均值文件和方差文件的文件头中的NUM_SENONES( numStates)为总的状态数即多维混合高斯的个数。NUM_STREAMS(numStreams)为多维混合高斯中的多维高斯的维度,即输入特征矢量的维度即长度。"Number of gaussians per state " ( numGaussiansPerState)为每个状态所有的多维高斯的个数。注意一个状态只有一个多维的混合高斯函数,此混合高斯由多个多维的高斯函数组成。此方法返回的pool中存储的基本单元是一个多维高斯函数的均值或方差。即float[]数组。
  protected Pool loadMixtureWeights(String path, float floor);装载混合权重的二进制文件。输入参数path为混合权重文件的路径。Floor为所允许的最低的即最小的权重值。返回的pool中的基本单元是一个状态的所有权重值即float[],一状态表示一个多维的混合高斯,混合高斯由多个多维的高斯函数组成,权重值就在组成中的多维高斯的乘积因子。在一个状态中的多维高斯的数量是与权重值的数量是一样的。
protected Pool loadTransitionMatrices(String path);装载转移矩阵的二进制文件。输入参数path为文件的路径。返回的是pool池。此返回pool此中的基本单元是一个HMM的转移矩阵即float[][],在此方法中的numMatrices为文件中的矩阵的个数即HMM的个数。numStates为一个HMM中的状态数,numRows为状态的有可能的转移状态。
protected float[][] loadTransformMatrix(String path);path为转移矩阵的二进制文件的路径。返回的是float[][]即把所有的转移矩阵都存入此二维数组中。此数组中的第一维为状态,第二维为所有可能转移到的状态。在本方法中的numRows即开始的状态数,numValues为所有可能转移到的状态数。
protected void loadHMMPool(boolean useCDUnits, InputStream inputStream,String path);装载HMM定义的二进制文件,装载基本音素,装载场景依赖音素,如果useCDUnits为false,则场景依赖音素将不会被创建,但是其值仍然需要从文件中被读。useCDUnits属性如果为true,将会装载场景依赖的单元。inputStream为输入流。path为文件路径。在创建方法中会创建SenoneHMM对象,并把创建的SenoneHMM对象都存入hmmManager中。
protected Pool createSenonePool(float distFloor, float varianceFloor);创建Senone池。distFloor为所允许的最低最小得分。varianceFloor为所允许的最低最小方差值。在返回的Pool的senone为GaussianMixture对象,GaussianMixture对象代表了一个状态即多维的混合高斯。此处主要是根据均值和方差来创建GaussianMixture对象,并存储在池中。
protected void loadModelFiles(String modelDef);从文件系统的一个目录下装载声学模型。modelDef为声学模型定义的名字,如果为null我们将从默认位置装载。此方法是装载声学模型所需的所有文件。Hmm定义文件,均值文件,方差文件,转移文件。
public void load();装载声学模型,在其中进行了必要的初始化,并调用loadModelFiles方法来进行装载。即包装了loadModelFiles方法。
protected HMMManager getHmmManager();获得hmm管理器。
  protected Pool getMatrixPool();获得转移矩阵池。
protected Pool getMixtureWeightsPool();获得混合权重池。
public Map getContextIndependentUnits();获得存储场景独立单元的map。即获得场景独立单元。
protected boolean sameSenoneSequence(int[] ssid1, int[] ssid2);如果给定senone序列的id都相等则返回为true,否则为false。
protected SenoneSequence getSenoneSequence(int[] stateid);获得给定senone的senone序列。Stateid为senone的状态id数组。返回的是与此状态相关的senone序列。
public Pool getMeansPool();获得均值池。
public int getRightContextSize();获得右场景的长度即CONTEXT_SIZE。
public int getLeftContextSize();获得左场景的长度。即CONTEXT_SIZE。
public Pool getSenonePool();获得senone池。

你可能感兴趣的:(Sphinx-4,API,sphinx,语音识别)