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)
其中p1
和p2
(可能是真实音素或#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