o
    
j4                     @   s\   d dl Z d dlZd dlmZ d dlmZ d dlmZ G dd dejZG dd dejZ	dS )	    N)nn)remove_parametrizations)ResidualBlockc                	       sP   e Zd ZdZdddddddddid	f	 fd
d	Zdd Zdd Zdd Z  ZS )ParallelWaveganDiscriminatorzPWGAN discriminator as in https://arxiv.org/abs/1910.11480.
    It classifies each audio window real/fake and returns a sequence
    of predictions.
        It is a stack of convolutional blocks with dilation.
          
   @   	LeakyReLUnegative_slope皙?Tc
              	      s   t    |d d dksJ d|dksJ dt | _|}
t|d D ];}|dkr/d}n|dkr5|n|| }|}
|d d | }tj|
|||||	dtt|d
ddi|g}|  j|7  _q&|d d }tj|
||||	d	}|  j|g7  _|   d S )Nr      r   z. [!] does not support even number kernel size.z! [!] dilation factor must be > 0.kernel_sizepaddingdilationbiasinplaceT)r   r   r    )	super__init__r   
ModuleListconv_layersrangeConv1dgetattrapply_weight_norm)selfin_channelsout_channelsr   
num_layersconv_channelsdilation_factornonlinear_activationnonlinear_activation_paramsr   conv_in_channelsir   r   
conv_layerlast_conv_layer	__class__r   d/home/kuhnn/.local/lib/python3.10/site-packages/TTS/vocoder/models/parallel_wavegan_discriminator.pyr      s4   

z%ParallelWaveganDiscriminator.__init__c                 C   s   | j D ]}||}q|S )zS
            x : (B, 1, T).
        Returns:
            Tensor: (B, 1, T)
        )r   )r   xfr   r   r+   forward;   s   

z$ParallelWaveganDiscriminator.forwardc                 C      dd }|  | d S )Nc                 S   .   t | tjjtjjfrtjjj|  d S d S N
isinstancetorchr   r   Conv2dutilsparametrizationsweight_normmr   r   r+   _apply_weight_normF      zJParallelWaveganDiscriminator.apply_weight_norm.<locals>._apply_weight_normapplyr   r;   r   r   r+   r   E      z.ParallelWaveganDiscriminator.apply_weight_normc                 C   r/   )Nc                 S   s&   zt | d W d S  ty   Y d S w )Nweight)r   
ValueErrorr9   r   r   r+   _remove_weight_normM   s
   zLParallelWaveganDiscriminator.remove_weight_norm.<locals>._remove_weight_normr=   r   rC   r   r   r+   remove_weight_normL      z/ParallelWaveganDiscriminator.remove_weight_norm)	__name__
__module____qualname____doc__r   r.   r   rE   __classcell__r   r   r)   r+   r   
   s    	)
r   c                       sR   e Zd Zdddddddddddd	d
if fdd	Zdd Zdd Zdd Z  ZS )$ResidualParallelWaveganDiscriminatorr   r      r	      g        Tr
   r   r   c                    sV  t    |d d dksJ d|| _|| _|| _|| _|| _td| | _	|| dks0J || }t
t
j||dddddtt
|dddi|| _t
 | _t|D ]}d||  }t||||d	||	|
d
d	}|  j|g7  _qWt
tt
|dddi|t
j||dddddtt
|dddi|t
j||dddddg| _|   d S )Nr   r   r   z$Not support even number kernel size.g      ?Tr   r   F)	r   res_channelsgate_channelsskip_channelsaux_channelsr   dropoutr   use_causal_convr   )r   r   r   r   r    stacksr   mathsqrt
res_factorr   
Sequentialr   r   
first_convr   r   r   r   last_conv_layersr   )r   r   r   r   r    rV   rP   rQ   rR   rT   r   r#   r$   layers_per_stacklayerr   convr)   r   r+   r   Y   sJ   


z-ResidualParallelWaveganDiscriminator.__init__c                 C   sV   |  |}d}| jD ]}||d\}}||7 }q
|| j9 }|}| jD ]}||}q"|S )z
        x: (B, 1, T).
        r   N)r[   r   rY   r\   )r   r,   skipsr-   hr   r   r+   r.      s   





z,ResidualParallelWaveganDiscriminator.forwardc                 C   r/   )Nc                 S   r0   r1   r2   r9   r   r   r+   r;      r<   zRResidualParallelWaveganDiscriminator.apply_weight_norm.<locals>._apply_weight_normr=   r?   r   r   r+   r      r@   z6ResidualParallelWaveganDiscriminator.apply_weight_normc                 C   r/   )Nc                 S   s6   zt d|  d t| d W d S  ty   Y d S w )NzWeight norm is removed from .rA   )printr   rB   r9   r   r   r+   rC      s   zTResidualParallelWaveganDiscriminator.remove_weight_norm.<locals>._remove_weight_normr=   rD   r   r   r+   rE      rF   z7ResidualParallelWaveganDiscriminator.remove_weight_norm)rG   rH   rI   r   r.   r   rE   rK   r   r   r)   r+   rL   W   s"    ArL   )
rW   r4   r   torch.nn.utils.parametrizer   #TTS.vocoder.layers.parallel_waveganr   Moduler   rL   r   r   r   r+   <module>   s    M