std::vector DecoderFactory::result2Words()

in recipes/streaming_convnets/inference/inference/decoder/Decoder.cpp [113:164]


std::vector<WordUnit> DecoderFactory::result2Words(
    const fl::lib::text::DecodeResult& result) const {
  int seqLength = result.tokens.size();
  if (seqLength == 0) {
    return std::vector<WordUnit>{};
  }

  std::vector<WordUnit> wordPrediction;
  // If result.words is meaningful
  if (trie_) {
    int beginTime;
    bool tracking = false;
    for (int i = 0; i < seqLength; i++) {
      // We are not seeing meanful words yet
      if (!tracking && result.tokens[i] != silence_ &&
          result.tokens[i] != blank_) {
        beginTime = i;
        tracking = true;
      }
      // We are tracking a valid word
      if (tracking && result.words[i] > 0) {
        wordPrediction.emplace_back(
            wordMap_.getEntry(result.words[i]), beginTime, i);
        tracking = false;
      }
    }
  }
  // Else, parse from the token sequence
  else {
    int beginTime;
    std::string curWord = "";
    bool prevBlank = false;
    for (int i = 0; i < seqLength; i++) {
      bool curBlank = result.tokens[i] == blank_;
      if (result.tokens[i] != silence_ && !curBlank) {
        beginTime = curWord.empty() ? i : beginTime;
        if (prevBlank || i == 0 || result.tokens[i - 1] != result.tokens[i]) {
          curWord += letterMap_.getEntry(result.tokens[i]);
        }
      }
      if (result.tokens[i] == silence_ || i == seqLength - 1) {
        if (!curWord.empty()) {
          wordPrediction.emplace_back(unpackReplabels(curWord), beginTime, i);
          curWord = "";
        }
      }
      prevBlank = curBlank;
    }
  }

  return wordPrediction;
}