TiedStateAcousticModel API 声学模型
2015-06-09 21:05
330 查看
<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中存储的是CompositeSenone public 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>
相关文章推荐
- 使用Sphinx对索引进行搜索
- 关于Sphinx创建全文检索的索引介绍
- sphinx增量索引的一个问题
- C#中调用SAPI实现语音识别的2种方法
- mysql中使用sphinx搜索子域名需注意的问题
- Sphinx/MySQL 协议支持与SphinxQL应用实例
- 深入解析php之sphinx
- php启用sphinx全文搜索的实现方法
- sphinx使用及其简单配置方法
- Android实现语音识别代码
- 测试sphinx/coreseek xmlpipe2 support NOT compiled
- sphinx服务器安装及配置详解
- 如何给Sphinx做增量索引更新
- 模式识别
- 谷歌眼镜GDK开发指南之语音输入
- CoreSeek快速安装 sphinx
- coreseek 利用python作数据源建立索引
- sphinx/coreseek如何及时删除索引里的数据呢?
- PHP sphinx 全文检索
- MEMO:Sphinx学习笔记——安装与使用入门(+在ROS中的使用)