TiedStateAcousticModel API 声学模型

来源:互联网 发布:linux shell fork 编辑:程序博客网 时间:2024/06/11 04:53
<span style="font-size:24px;">public class TiedStateAcousticModel implements AcousticModel装载由sphinx3训练机所训练出来的声学模型。此文档并不是为了提供对HMM概念的解释。以下的解释是肤浅的,在某种程度上他仅提供了在声学模型包中那些有意义的文件。一个HMM使用了一系列的状态来模拟一个(处理)过程。这存在与每一个状态相关的概率密度函数。此函数的一般选择为混合高斯函数,也就一系列的高斯函数的和。正如你所知道的,一个单独的高斯函数被一个均值和方差所定义,在多维高斯的情况下,被一个均值矢量和协方差矩阵所定义,在一些简单假设的情况下,由一个方差矢量定义。在”continuous”目录下的”mean”和”variances”文件中包含的是:一张包含相应的均值和方差矢量的表。这些矢量的维度是与输入的数据(特征矢量)的维度是一样的。混合高斯是一系列不同权重的高斯函数的和。"mixture_weights"文件包含的是:每一行是一个混合高中的所有高斯的权重。HMM是一个有一系列状态的模型。在状态间的转移是有一个相关的概率。这些概率组成了转移矩阵被存储在一个"transition_matrices"文件中。在”continuous”目录下的文件为均值,方差,混合权重,转移概率的表或者池。字典是一个把字映射到音素脚本的文件,也就是,它把字映射成一系列的音素。语言模型包含在一个语言中的字的概率信息。这些概率可以说一个字的概率,也可以是两个或者三个字序列的概率。模型定义文件在一定程度上把所有的事物都绑定到了一起。如果识别系统模拟的是音素,则一个HMM代表的是一个音素。在模型定义文件中每一行为一个音素的相关内容。音素可以是场景独立和依赖的。因此每一行定义了一个独特的HMM。此行音素的定义,不是必须的左或右的场景,转移矩阵的索引,每一状态的均值矢量,方差矢量的索引,每一个状态的混合权重集合。本类的属性:@S4Component(type = Loader.class)public final static String PROP_LOADER = "loader"此属性定义了用于装载声学模型文件的组件。@S4Component(type = UnitManager.class)public final static String PROP_UNIT_MANAGER = "unitManager";此属性定义了单元管理器。@S4Boolean(defaultValue = true)public final static String PROP_USE_COMPOSITES = "useComposites";此属性用来控制当在lookup方法中没有给定的场景时,我们是否创建组合或场景独立单元。单元即音素。可配置的变量:protected String name;此声学模型的名字 protected Logger logger;    protected Loader loader;装载声学模型文件的组件    protected UnitManager unitManager;    private boolean useComposites;private Properties properties;声学模型的属性内部变量:final transient private Map<String, SenoneSequence> compositeSenoneSequenceCache = new HashMap<String, SenoneSequence>();此存储的是一个HMM的senone序列和senone序列名字对的map,此map中存储了所有的hmm的senone序列。private boolean allocated;是否已分配资源。本类的构造方法public TiedStateAcousticModel( Loader loader, UnitManager unitManager, boolean useComposites);给定必要的参数来创建对象。public TiedStateAcousticModel();空的构造方法.本类的方法:public void newProperties(PropertySheet ps);在有对象的情况下,对属性进行设置。  public void allocate();用给定的名字和场景来初始化声学模型。在此方法中装载了声学模型文件。即loader的load方法。并设置了allocated为true。public void deallocate();在此方法体重不存在任何的内容,此方法不会做任何事情。public String getName();获得声学模型的名字。public int getLeftContextSize();获得场景依赖单元的左场景的长度。多少个单元。public int getRightContextSize()获得场景依赖单元的右场景的长度。多少个单元。private SenoneHMM lookupHMM(Unit unit, HMMPosition position);通过给定HMM的单元和其位置来获得严格匹配单元的SenoneHMM对象。  public Senone getSenone(long id);通过给定的id来获得GaussianMixture的 senone对象。是通过loader的方法来实现的。private SenoneHMM getHMMAtAnyPosition(Unit unit);获得与此单元相关的一个SenoneHMM,此hmm的位置是任意的,没有限制。也通过loader方法来实现的。private boolean hasNonSilenceFiller(Unit[] units);如果在此单元数组中存在着非静音的填充单元则返回为true,否则为false。Units为要进行检查的单元数组。Private Unit[]replaceNonSilenceFillerWithSilence(Unit[] context);用静音填充单元代替在输入单元数组中的所有的非静音填充单元,返回的是代替后的新的单元数组,数组的长度与原来的一样。  public Properties getProperties();获得的是此声学模型的属性文件即properties,仍然是通过loader的方法来得到。private SenoneHMM getHMMInSilenceContext(Unit unit, HMMPosition position);搜索用静音填充单元场景代替了非静音填充场景的单元的相关的hmm。Unit为感兴趣的单元。Position为hmm位置。private boolean isComposite(Unit unit);决定输入的单元是否是组合单元。此单元的场景存在,其左右场景中的任意一个场景为null则返回为true,其它情况返回为false。private Unit lookupUnit(String name);返回的是给定名字的场景独立的单元。Name为单元的名字。  public Iterator<HMM> getHMMIterator();获得的是HMM的迭代器。用于访问hmm。  public Iterator<Unit> getContextIndependentUnitIterator();获得的是场景独立的单元的迭代器。 public SenoneSequence getCompositeSenoneSequence(Unit unit, HMMPosition position);通过给定单元来获得一个组合senone序列,此单元应该有一个LeftRightContext对象,在LeftRightContext对象中的左或右场景有一个为null则表示匹配任何的场景。本方法分成了两种情况:1,看compositeSenoneSequenceCache属性中是否从在此单元的相关的 SenoneSequence有则返回,没有的话就创建一个新的与此单元相关的SenoneSequence ,并放入compositeSenoneSequenceCache中后返回。注意此SenoneSequence中存储的是CompositeSenonepublic HMM lookupNearestHMM(Unit unit, HMMPosition position,boolean exactMatch);根据给定的单元,返回最匹配此单元的HMM。如果exactMatch为true,则执行严格匹配,如果为false,并且匹配的hmm并没有被发现,则不同字的(hmm)位置被使用,来查找不同位置是此单元的hmm。如果单元的场景有任何的非静音填充的话,则会用静音填充来代替非静音的填充。本方法的处理:1直接从hmm管理器获取,2没有匹配的话,尝试组合的hmm。3,还没有匹配的匹配的话,尝试其他hmm位置即字位置的hmm。4仍然没匹配的话,尝试此单元的不同填充(用静音代替非静音)的hmm。5还没匹配的话,回退到基本因素进行处理。private HMM getCompositeHMM(Unit unit, HMMPosition position);为给定的单元和场景得到一个组合hmm。Unit为hmm的单元,position为hmm在字中的位置。</span> 

0 0