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;
}