class_docstr: the Segment-LSTM of SkiM
  Note: This is taken from the SkiM implementation in ESPNet toolkit and modified for compatibility with SpeechBrain.
  
  Arguments:
  ----------
  input_size: int,
      dimension of the input feature.
      The input should have shape (batch, seq_len, input_size).
  hidden_size: int,
      dimension of the hidden state.
  dropout: float,
      dropout ratio. Default is 0.
  bidirectional: bool,
      whether the LSTM layers are bidirectional.
      Default is False.
  norm_type: gln, cln.
      This selects the type of normalization
      cln is for causal implementation.
  
  Example
  ---------
  >>> x = torch.randn(3, 20, 64)
  >>> hc = None
  >>> seglstm = SegLSTM(64, 64)
  >>> y = seglstm(x, hc)
  >>> y[0].shape
  torch.Size([3, 20, 64])
docstr: The forward function of the Segment LSTM
  
  Arguments
  ---------
  input : torch.Tensor of size [B*S, T, H]
      where B is the batchsize
            S is the number of chunks
            T is the chunks size
            H is the latent dimensionality
  
      (h, c), tuple of hidden and cell states from SegLSTM
  
      shape of h and c: (d, B*S, H)
          where d is the number of directions
                B is the batchsize
                S is the number chunks
                H is the latent dimensionality
docstr_tok: ["The","forward","function","of","the","Segment","LSTM","Arguments","--","--","--","--","-","input",":","torch.Tensor","of","size","[","B","*","S",",","T",",","H","]","where","B","is","the","batchsize","S","is","the","number","of","chunks","T","is","the","chunks","size","H","is","the","latent","dimensionality","(","h",",","c",")",",","tuple","of","hidden","and","cell","states","from","SegLSTM","shape","of","h","and","c",":","(","d",",","B","*","S",",","H",")","where","d","is","the","number","of","directions","B","is","the","batchsize","S","is","the","number","chunks","H","is","the","latent","dimensionality"]
code: def forward(self, input, hc):
      """The forward function of the Segment LSTM
  
      Arguments
      ---------
      input : torch.Tensor of size [B*S, T, H]
          where B is the batchsize
                S is the number of chunks
                T is the chunks size
                H is the latent dimensionality
  
          (h, c), tuple of hidden and cell states from SegLSTM
  
          shape of h and c: (d, B*S, H)
              where d is the number of directions
                    B is the batchsize
                    S is the number chunks
                    H is the latent dimensionality
      """
      B, T, H = input.shape
  
      if hc is None:
          # In fist input SkiM block, h and c are not available
          d = self.num_direction
          h = torch.zeros(d, B, self.hidden_size).to(input.device)
          c = torch.zeros(d, B, self.hidden_size).to(input.device)
      else:
          h, c = hc
  
      output, (h, c) = self.lstm(input, (h, c))
      output = self.dropout(output)
      output = self.proj(
          output.contiguous().view(-1, output.shape[2])
      ).view(input.shape)
      output_norm = self.norm(output.permute(0, 2, 1)).permute(0, 2, 1)
  
      output = input + output_norm
      return output, (h, c)
  
imports: import torch
  import torch.nn
  from speechbrain.lobes.models.dual_path import select_norm
  from speechbrain.lobes.models.transformer.Transformer import TransformerEncoder, PositionalEncoding, get_lookahead_mask
  import speechbrain.nnet.RNN
  import copy
label_desc: Use image node_id 2 for calling the SegLSTM obj's underlying member method code with example usage: obj.forward(input, hc) and returns: output,  h,  c