class_docstr: SVoice model for speech separation.
  
  Reference:
      Voice Separation with an Unknown Number of Multiple Speakers;
      E. Nachmani et al., 2020;
      https://arxiv.org/abs/2003.01531
  
  Args:
      enc_dim: int, dimension of the encoder module's output. (Default: 128)
      kernel_size: int, the kernel size of Conv1D layer in both encoder and
          decoder modules. (Default: 8)
      hidden_size: int, dimension of the hidden state in RNN layers. (Default: 128)
      num_spk: int, the number of speakers in the output. (Default: 2)
      num_layers: int, number of stacked MulCat blocks. (Default: 4)
      segment_size: dual-path segment size. (Default: 20)
      bidirectional: bool, whether the RNN layers are bidirectional. (Default: True)
      input_normalize: bool, whether to apply GroupNorm on the input Tensor.
          (Default: False)
docstr: Forward.
  
  Args:
      input (torch.Tensor or ComplexTensor): Encoded feature [B, T, N]
      ilens (torch.Tensor): input lengths [Batch]
      additional (Dict or None): other data included in model
          NOTE: not used in this model
  
  Returns:
      masked (List[Union(torch.Tensor, ComplexTensor)]): [(B, T, N), ...]
      ilens (torch.Tensor): (B,)
      others predicted data, e.g. masks: OrderedDict[
          'mask_spk1': torch.Tensor(Batch, Frames, Freq),
          'mask_spk2': torch.Tensor(Batch, Frames, Freq),
          ...
          'mask_spkn': torch.Tensor(Batch, Frames, Freq),
      ]
docstr_tok: ["Forward",".","Args",":","input","(","torch.Tensor","or","ComplexTensor",")",":","Encoded","feature","[","B",",","T",",","N","]","ilens","(","torch.Tensor",")",":","input","lengths","[","Batch","]","additional","(","Dict","or","None",")",":","other","data","included","in","model","NOTE",":","not","used","in","this","model","Returns",":","masked","(","List","[","Union","(","torch.Tensor",",","ComplexTensor",")","]",")",":","[","(","B",",","T",",","N",")",",","...","]","ilens","(","torch.Tensor",")",":","(","B",",",")","others","predicted","data",",","e.g",".","masks",":","OrderedDict","[","'mask_spk1","'",":","torch.Tensor","(","Batch",",","Frames",",","Freq",")",",","'mask_spk2","'",":","torch.Tensor","(","Batch",",","Frames",",","Freq",")",",","...","'mask_spkn","'",":","torch.Tensor","(","Batch",",","Frames",",","Freq",")",",","]"]
code: def forward(
      self,
      input: torch.Tensor,
      ilens: torch.Tensor,
      additional: Optional[Dict] = None,
  ) -> Tuple[List[torch.Tensor], torch.Tensor, OrderedDict]:
      """Forward.
  
      Args:
          input (torch.Tensor or ComplexTensor): Encoded feature [B, T, N]
          ilens (torch.Tensor): input lengths [Batch]
          additional (Dict or None): other data included in model
              NOTE: not used in this model
  
      Returns:
          masked (List[Union(torch.Tensor, ComplexTensor)]): [(B, T, N), ...]
          ilens (torch.Tensor): (B,)
          others predicted data, e.g. masks: OrderedDict[
              'mask_spk1': torch.Tensor(Batch, Frames, Freq),
              'mask_spk2': torch.Tensor(Batch, Frames, Freq),
              ...
              'mask_spkn': torch.Tensor(Batch, Frames, Freq),
          ]
      """
      # fix time dimension, might change due to convolution operations
      T_mix = input.size(-1)
  
      mixture_w = self.encoder(input)
  
      enc_segments, enc_rest = split_feature(
          mixture_w, self.segment_size
      )
      # separate
      output_all = self.rnn_model(enc_segments)
  
      # generate wav after each RNN block and optimize the loss
      outputs = []
      for ii in range(len(output_all)):
          output_ii = merge_feature(output_all[ii], enc_rest)
          output_ii = output_ii.view(
              input.shape[0],
              self._num_spk,
              self.enc_dim,
              mixture_w.shape[2],
          )
          output_ii = self.decoder(output_ii)
          T_est = output_ii.size(-1)
          output_ii = F.pad(output_ii, (0, T_mix - T_est))
          output_ii = list(output_ii.unbind(dim=1))
          if self.training:
              outputs.append(output_ii)
          else:
              outputs = output_ii
  
      others = {}
      return outputs, ilens, others
  
imports: import math
  from collections import OrderedDict
  from typing import Dict, List, Optional, Tuple
  import torch
  import torch.nn
  import torch.nn.functional
  from espnet2.enh.layers.dpmulcat import DPMulCat
  from espnet2.enh.layers.dprnn import merge_feature, split_feature
  from espnet2.enh.separator.abs_separator import AbsSeparator
label_desc: Use image node_id 2 for calling the SVoiceSeparator obj's underlying member method code with example usage: obj.forward(input, ilens, additional) and returns: outputs,  ilens,  others