class_docstr: Wavenet blocks.
  
  Note: After each block dilation resets to 1 and it increases in each block
      along the dilation rate.
  
  Args:
      in_channels (int): number of input channels.
      hidden_channes (int): number of hidden channels.
      kernel_size (int): filter kernel size for the first conv layer.
      dilation_rate (int): dilations rate to increase dilation per layer.
          If it is 2, dilations are 1, 2, 4, 8 for the next 4 layers.
      num_blocks (int): number of wavenet blocks.
      num_layers (int): number of wavenet layers.
      c_in_channels (int): number of channels of conditioning input.
      dropout_p (float): dropout rate.
      weight_norm (bool): enable/disable weight norm for convolution layers.
code: def __init__(
      self,
      in_channels,
      hidden_channels,
      kernel_size,
      dilation_rate,
      num_blocks,
      num_layers,
      c_in_channels=0,
      dropout_p=0,
      weight_norm=True,
  ):
      super().__init__()
      self.wn_blocks = nn.ModuleList()
      for idx in range(num_blocks):
          layer = WN(
              in_channels=in_channels if idx == 0 else hidden_channels,
              hidden_channels=hidden_channels,
              kernel_size=kernel_size,
              dilation_rate=dilation_rate,
              num_layers=num_layers,
              c_in_channels=c_in_channels,
              dropout_p=dropout_p,
              weight_norm=weight_norm,
          )
          self.wn_blocks.append(layer)
  
file_path: TTS/TTS/tts/layers/generic/wavenet.py
imports: import torch
  from torch import nn
label_desc: Use image node_id 1 to create a new WNBlocks object from inherited base classes: nn with example: obj = WNBlocks(in_channels, hidden_channels, kernel_size, dilation_rate, num_blocks, num_layers, c_in_channels, dropout_p, weight_norm)