class_docstr: AggregateTokenizer, allowing one to combine multiple regular monolongual tokenizers into one tokenizer.
  The intuition is that we can use existing tokenizers "as is", without retraining, and associate each tokenizer with a language id
  during text processing (language id will be used to route the incoming text sample to the right tokenizer)
  as well as a token id range for detokenization (e.g. [0..127] for tokenizer A, [128..255] for tokenizer B) so
  that the orignal text could be reconstructed. Note that we assume that the incoming dict of langs / tokenizers
  is ordered, e.g. the first tokenizer will be assigned a lower interval of token ids
      Args:
      tokenizers: dict of tokenizers, keys are lang ids, values are actual tokenizers
code: def _calculate_offsets(self):
      offsets = {}
      tokenizers = {}
      langs = {}
      cur_num = 0
      tot = len(self.tokenizers_dict)
      for id in range(len(self.vocabulary)):
          off_id = id - list(self.token_id_offset.values())[cur_num]
          if cur_num + 1 < tot:
              if id >= list(self.token_id_offset.values())[cur_num + 1]:
                  cur_num += 1
                  off_id = (
                      id - list(self.token_id_offset.values())[cur_num]
                  )
          offsets[id] = off_id
          tokenizers[id] = list(self.tokenizers_dict.values())[cur_num]
          langs[id] = list(self.tokenizers_dict.keys())[cur_num]
  
      return offsets, tokenizers, langs
  
imports: from typing import Dict, List, Union
  import numpy
  from nemo.collections.common.tokenizers.tokenizer_spec import TokenizerSpec
  from nemo.utils import logging
label_desc: Use image node_id 2 for calling the AggregateTokenizer obj's underlying member method code with example usage: obj._calculate_offsets() and returns: offsets,  tokenizers,  langs