GrammarFst

GrammarFst

GrammarFstTpl

GrammarFst是从多个FST中“缝合”在一起的FST,可以相互递归合并。 这仅限于左双音素语音环境)。此类并非继承自fst::Fst,也不支持其完整接口-仅支持以此类为的模板解码器所需的部分接口。

在GrammarFstTpl中将缝合在一起的基础FST用作模板,从而使您可以从任何类型的FST类中创建GrammarFst。

基础接口受OpenFst的ReplaceFst(请参见其replace.h)的启发,不同之处在于该接口处理的是左biphone语音上下文,从本质上讲,在grammar中有子FST的多个出口点和入口点--表示为非终止符的;和每当我们调用一个非终结符时的多个返回点。有关更多信息,请参见grammar(即../doc/grammar.dox)。

线程安全:您不能从多个线程使用此对象;您应该使用拷贝构造函数创建此对象的轻量级副本,例如new GrammarFst(this_grammar_fst),如果您想使用同一个GrammarFst从多个线程进行解码。

构造函数

这个构造函数非常轻量的。 唯一的直接工作就是在提供的FST的开始状态下的弧上进行迭代,以设置适当的入口点。

nonterm_phones_offset#nonterm_bos的音素id

top_fst:语法的顶级FST,通常会在“ ifsts”中调用fsts。 “ ifsts”中的fsts也可以相互递归调用。 即使左递归也是允许的,尽管它的损失为零,但在解码时可能会爆炸。 当FST调用另一个时,调用点将具有两个特殊符号的序列,这些序列将被解码为:(#nonterm:foo,p1) (#nonterm_reenter,p2) 其中p1p2(可能是真实音素或#nonterm_bos)代表我们分别进入和离开子图的语音左上下文。

ifsts:ifsts是pairs的列表(非终止符,和该符号相对应的HCLG.fst)。非终止符必须是phones.txt中用户指定的那些非终止符,即,在phones.txt中名称如#nonterm:foo#nonterm:bar的内容。 同样,在“ fsts”中,任何非终结符都不能出现多次。 ifsts可能为空,即使那没有多大意义

拷贝构造

拷贝构造函数。 很有用,因为此对象不是线程安全的,因此不能被多个并行解码器线程使用,但是它很轻巧并且可以复制它而不会导致复制存储的FST。

openfst

从C ++访问FST

这是弧边的标准表示:

struct StdArc {
 typedef int Label;
 typedef TropicalWeight Weight;  // see "FST Weights" below 
 typedef int StateId; 
 
 Label ilabel;
 Label olabel;
 Weight weight;
 StateId nextstate;
};

这是FST的一些访问示例:

typedef StdArc::StateId StateId;

# 获取初始权重; if == kNoState => empty FST. 
StateId initial_state = fst.Start();

# 获取状态i的最终权重; if == Weight::Zero() => non-final. 
Weight weight = fst.Final(i);
# Iterates over the FSTs states. 
for (StateIterator siter(fst); !siter.Done(); siter.Next()) 
  StateId state_id = siter.Value();

# 遍历状态i的弧边arcs. 
for (ArcIterator aiter(fst, i); !aiter.Done(); aiter.Next())
  const StdArc &arc = aiter.Value();

# 遍历状态i中输入标签为l的弧边arcs (FST must support this -
# in the simplest cases,  true when the input labels are sorted). 
Matcher matcher(fst, MATCH_INPUT);
matcher.SetState(i);
if (matcher.Find(l)) 
  for (; !matcher.Done(); matcher.Next())
     const StdArc &arc = matcher.Value();

使用Shell打印,绘制和汇总FST

打印

# Print FST using symbol table files. 
$ fstprint --isymbols=isyms.txt --osymbols=osyms.txt binary.fst text.fst

绘制

# Draw FST using symbol table files and Graphviz dot: 
$ fstdraw --isymbols=isyms.txt --osymbols=osyms.txt binary.fst binary.dot
$ dot -Tps:cairo binary.dot >binary.ps #cairo支持中文

汇总

$ fstinfo binary.fst

你可能感兴趣的:(GrammarFst)