docstr: Temporal Convolution Separator
  
  Args:
      input_dim: input feature dimension
      num_spk: number of speakers
      predict_noise: whether to output the estimated noise signal
      layer: int, number of layers in each stack.
      stack: int, number of stacks
      bottleneck_dim: bottleneck dimension
      hidden_dim: number of convolution channel
      kernel: int, kernel size.
      causal: bool, defalut False.
      norm_type: str, choose from 'BN', 'gLN', 'cLN'
      nonlinear: the nonlinear function for mask estimation,
                 select from 'relu', 'tanh', 'sigmoid'
docstr_tok: ["Temporal","Convolution","Separator","Args",":","input_dim",":","input","feature","dimension","num_spk",":","number","of","speakers","predict_noise",":","whether","to","output","the","estimated","noise","signal","layer",":","int",",","number","of","layers","in","each","stack",".","stack",":","int",",","number","of","stacks","bottleneck_dim",":","bottleneck","dimension","hidden_dim",":","number","of","convolution","channel","kernel",":","int",",","kernel","size",".","causal",":","bool",",","defalut","False",".","norm_type",":","str",",","choose","from","'BN","'",",","'gLN","'",",","'cLN'","nonlinear",":","the","nonlinear","function","for","mask","estimation",",","select","from","'relu","'",",","'tanh","'",",","'sigmoid","'"]
code: def __init__(
      self,
      input_dim: int,
      num_spk: int = 2,
      predict_noise: bool = False,
      layer: int = 8,
      stack: int = 3,
      bottleneck_dim: int = 128,
      hidden_dim: int = 512,
      kernel: int = 3,
      causal: bool = False,
      norm_type: str = "gLN",
      nonlinear: str = "relu",
  ):
      """Temporal Convolution Separator
  
      Args:
          input_dim: input feature dimension
          num_spk: number of speakers
          predict_noise: whether to output the estimated noise signal
          layer: int, number of layers in each stack.
          stack: int, number of stacks
          bottleneck_dim: bottleneck dimension
          hidden_dim: number of convolution channel
          kernel: int, kernel size.
          causal: bool, defalut False.
          norm_type: str, choose from 'BN', 'gLN', 'cLN'
          nonlinear: the nonlinear function for mask estimation,
                     select from 'relu', 'tanh', 'sigmoid'
      """
      super().__init__()
  
      self._num_spk = num_spk
      self.predict_noise = predict_noise
  
      if nonlinear not in ("sigmoid", "relu", "tanh"):
          raise ValueError(
              "Not supporting nonlinear={}".format(nonlinear)
          )
  
      self.tcn = TemporalConvNet(
          N=input_dim,
          B=bottleneck_dim,
          H=hidden_dim,
          P=kernel,
          X=layer,
          R=stack,
          C=num_spk + 1 if predict_noise else num_spk,
          norm_type=norm_type,
          causal=causal,
          mask_nonlinear=nonlinear,
      )
  
file_path: espnet/espnet2/enh/separator/tcn_separator.py
imports: from collections import OrderedDict
  from typing import Dict, List, Optional, Tuple, Union
  import torch
  from packaging.version import parse
  from torch_complex.tensor import ComplexTensor
  from espnet2.enh.layers.complex_utils import is_complex
  from espnet2.enh.layers.tcn import TemporalConvNet
  from espnet2.enh.separator.abs_separator import AbsSeparator
label_desc: Use image node_id 1 to create a new TCNSeparator object from inherited base classes: AbsSeparator with example: obj = TCNSeparator(input_dim, num_spk, predict_noise, layer, stack, bottleneck_dim, hidden_dim, kernel, causal, norm_type, nonlinear)