class_docstr: Glow Affine Coupling block as in GlowTTS paper.
  https://arxiv.org/pdf/1811.00002.pdf
  
   x --> x0 -> conv1d -> wavenet -> conv1d --> t, s -> concat(s*x1 + t, x0) -> o
     '-> x1 - - - - - - - - - - - - - - - - - - - - - - - - - ^
  
   Args:
       in_channels (int): number of input tensor channels.
       hidden_channels (int): number of hidden channels.
       kernel_size (int): WaveNet filter kernel size.
       dilation_rate (int): rate to increase dilation by each layer in a decoder block.
       num_layers (int): number of WaveNet layers.
       c_in_channels (int): number of conditioning input channels.
       dropout_p (int): wavenet dropout rate.
       sigmoid_scale (bool): enable/disable sigmoid scaling for output scale.
  
   Note:
       It does not use conditional inputs differently from WaveGlow.
   
class_docstr_tok: ["Glow","Affine","Coupling","block","as","in","GlowTTS","paper",".","https",":","\/\/arxiv.org\/pdf\/1811.00002.pdf","x","--",">","x0","-",">","conv1d","-",">","wavenet","-",">","conv1d","--",">","t",",","s","-",">","concat","(","s","*","x1","+","t",",","x0",")","-",">","o","'-",">","x1","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","^","Args",":","in_channels","(","int",")",":","number","of","input","tensor","channels",".","hidden_channels","(","int",")",":","number","of","hidden","channels",".","kernel_size","(","int",")",":","WaveNet","filter","kernel","size",".","dilation_rate","(","int",")",":","rate","to","increase","dilation","by","each","layer","in","a","decoder","block",".","num_layers","(","int",")",":","number","of","WaveNet","layers",".","c_in_channels","(","int",")",":","number","of","conditioning","input","channels",".","dropout_p","(","int",")",":","wavenet","dropout","rate",".","sigmoid_scale","(","bool",")",":","enable\/disable","sigmoid","scaling","for","output","scale",".","Note",":","It","does","not","use","conditional","inputs","differently","from","WaveGlow","."]
code: def __init__(
      self,
      in_channels,
      hidden_channels,
      kernel_size,
      dilation_rate,
      num_layers,
      c_in_channels=0,
      dropout_p=0,
      sigmoid_scale=False,
  ):
      super().__init__()
      self.in_channels = in_channels
      self.hidden_channels = hidden_channels
      self.kernel_size = kernel_size
      self.dilation_rate = dilation_rate
      self.num_layers = num_layers
      self.c_in_channels = c_in_channels
      self.dropout_p = dropout_p
      self.sigmoid_scale = sigmoid_scale
      # input layer
      start = torch.nn.Conv1d(in_channels // 2, hidden_channels, 1)
      start = torch.nn.utils.weight_norm(start)
      self.start = start
      # output layer
      # Initializing last layer to 0 makes the affine coupling layers
      # do nothing at first.  This helps with training stability
      end = torch.nn.Conv1d(hidden_channels, in_channels, 1)
      end.weight.data.zero_()
      end.bias.data.zero_()
      self.end = end
      # coupling layers
      self.wn = WN(
          in_channels,
          hidden_channels,
          kernel_size,
          dilation_rate,
          num_layers,
          c_in_channels,
          dropout_p,
      )
  
file_path: TTS/TTS/tts/layers/glow_tts/glow.py
imports: import torch
  from torch import nn
  from torch.nn import functional
  from TTS.tts.layers.generic.wavenet import WN
  from ..generic.normalization import LayerNorm
label_desc: Use image node_id 1 to create a new CouplingBlock object from inherited base classes: nn with example: obj = CouplingBlock(in_channels, hidden_channels, kernel_size, dilation_rate, num_layers, c_in_channels, dropout_p, sigmoid_scale)