Как я могу редактировать веса GrammarFst? - PullRequest
0 голосов
/ 18 февраля 2020

Если у вас есть стандартный fst, вы можете загрузить его как MutableFst и сделать что-то вроде:

MutableArcIterator<StdMutableFst> aiter(graph, state_id);
aiter.Seek(position)

auto arc = aiter.Value();
arc.weight = fst::TropicalWeight(NEW_WEIGHT);

aiter.SetValue(arc);

Это изменит значения дуг в памяти.

Однако, когда У меня есть ConstFst, который я получаю из вектора GrammarFst.instances_ с чем-то похожим на это:

GrammarFst &fst = const_cast<GrammarFst&>(fst_in);
int32 instance_id = s >> 32;
BaseStateId base_state = static_cast<int32>(s);
const GrammarFst::FstInstance &instance = fst.instances_[instance_id];
const ConstFst<StdArc> *base_fst = instance.fst; // const fst::ConstFst<fst::ArcTpl<fst::TropicalWeightTpl<float> > >* const

У меня нет способа индексировать в base_fst с MutableArcIterator, так как это ConstFst. Возможно ли это даже без серьезных модификаций Kaldi / Openfst?

Когда я пытаюсь сделать:

MutableArcIterator<StdConstFst > aiter(base_fst, base_state);

Я получаю:

test.cpp:91:72: error: invalid conversion from ‘const fst::ConstFst<fst::ArcTpl<fst::TropicalWeightTpl<float> > >*’ to ‘fst::ConstFst<fst::ArcTpl<fst::TropicalWeightTpl<float> > >*’ [-fpermissive]
             MutableArcIterator<StdConstFst > aiter(base_fst, base_state);

Мой вопрос:

Мне нужен доступ к instances_ объекта GrammarFst и изменение весов ar c во время выполнения. В настоящее время я не могу этого сделать, потому что GrammarFst.instance_ являются ConstFsts.

Решения, которые могут работать:

  • преобразование GrammarFst.instances_ в StdFst во время выполнения
  • преобразование GrammarFst.instances_ в StdFst при загрузке с диска
  • сохранение GrammarFst.instances_ в качестве StdFst при сохранении GrammarFst

Решения, которые не будут работать:

  • сохранение всего GrammarFst как StdFst (поэтому разыменование instances_ и копировать их в каждое место в главном каталоге, где они появляются. Это значительно увеличивает размер файла (~ 10X) и не будет работать для меня
...