o
    
jH                     @   s   d dl Z d dl mZ d dlmZ dZG dd de jjZG dd de jjZG d	d
 d
e jjZ	G dd de jjZ
G dd dejZdS )    N)nn)
functionalg?c                       s*   e Zd ZdZd	 fdd	Zdd Z  ZS )
DiscriminatorPa  HiFiGAN Periodic Discriminator

    Takes every Pth value from the input waveform and applied a stack of convoluations.

    Note:
        if `period` is 2
        `waveform = [1, 2, 3, 4, 5, 6 ...] --> [1, 3, 5 ... ] --> convs -> score, feat`

    Args:
        x (Tensor): input waveform.

    Returns:
        [Tensor]: discriminator scores per sample in the batch.
        [List[Tensor]]: list of features from each convolutional layer.

    Shapes:
        x: [B, 1, T]
          Fc                    s  t    || _dd }|rtjjntjjj}t|tj	dd|df|df||ddfd|tj	dd|df|df||ddfd|tj	dd|df|df||ddfd|tj	dd	|df|df||ddfd|tj	d	d	|dfdd
dg| _
|tj	d	ddddd| _d S )Nc                 S   s   t | | | d S )N   )int)kd r   [/home/kuhnn/.local/lib/python3.10/site-packages/TTS/vocoder/models/hifigan_discriminator.py<lambda>    s    z)DiscriminatorP.__init__.<locals>.<lambda>       r   padding         )r   r   )r   r   )r   r   )super__init__periodr   utilsspectral_normparametrizationsweight_norm
ModuleListConv2dconvs	conv_post)selfr   kernel_sizestrideuse_spectral_normget_paddingnorm_f	__class__r   r   r      s   
((((	zDiscriminatorP.__init__c                 C   s   g }|j \}}}|| j dkr$| j|| j  }t|d|fd}|| }||||| j | j}| jD ]}||}t|t}|| q3| 	|}|| t
|dd}||fS )a  
        Args:
            x (Tensor): input waveform.

        Returns:
            [Tensor]: discriminator scores per sample in the batch.
            [List[Tensor]]: list of features from each convolutional layer.

        Shapes:
            x: [B, 1, T]
        r   reflectr   )shaper   Fpadviewr   
leaky_reluLRELU_SLOPEappendr   torchflatten)r    xfeatbctn_padlr   r   r   forward-   s   


zDiscriminatorP.forward)r   r   F__name__
__module____qualname____doc__r   r:   __classcell__r   r   r&   r   r   	   s    r   c                       *   e Zd ZdZd fdd	Zdd Z  ZS )MultiPeriodDiscriminatorzHiFiGAN Multi-Period Discriminator (MPD)
    Wrapper for the `PeriodDiscriminator` to apply it in different periods.
    Periods are suggested to be prime numbers to reduce the overlap between each discriminator.
    Fc              
      sL   t    ttd|dtd|dtd|dtd|dtd|dg| _d S )Nr   r#   r   r         )r   r   r   r   r   discriminators)r    r#   r&   r   r   r   T   s   






z!MultiPeriodDiscriminator.__init__c                 C   sD   g }g }t | jD ]\}}||\}}|| || q	||fS )a*  
        Args:
            x (Tensor): input waveform.

        Returns:
        [List[Tensor]]: list of scores from each discriminator.
            [List[List[Tensor]]]: list of list of features from each discriminator's each convolutional layer.

        Shapes:
            x: [B, 1, T]
        )	enumeraterF   r0   )r    r3   scoresfeats_r
   scorer4   r   r   r   r:   `   s   
z MultiPeriodDiscriminator.forwardFr;   r   r   r&   r   rB   N   s    rB   c                       rA   )DiscriminatorSzHiFiGAN Scale Discriminator.
    It is similar to `MelganDiscriminator` but with a specific architecture explained in the paper.

    Args:
        use_spectral_norm (bool): if `True` swith to spectral norm instead of weight norm.

    Fc                    s   t    |rtjjntjjj}t|tjdddddd|tjdddddd	d
|tjdddddd	d
|tjdddddd	d
|tjdddddd	d
|tjdddddd	d
|tjddddddg| _	|tjdddddd| _
d S )Nr   r      rD   r   )   r         )groupsr         r   r   r   r   )r   r   r   r   r   r   r   r   Conv1dr   r   )r    r#   r%   r&   r   r   r   ~   s   
zDiscriminatorS.__init__c                 C   sX   g }| j D ]}||}t|t}|| q| |}|| t|dd}||fS )z
        Args:
            x (Tensor): input waveform.

        Returns:
            Tensor: discriminator scores.
            List[Tensor]: list of features from the convolutiona layers.
        r   r)   )r   r+   r.   r/   r0   r   r1   r2   )r    r3   r4   r9   r   r   r   r:      s   	


zDiscriminatorS.forwardrL   r;   r   r   r&   r   rM   u   s    rM   c                       (   e Zd ZdZ fddZdd Z  ZS )MultiScaleDiscriminatorzHiFiGAN Multi-Scale Discriminator.
    It is similar to `MultiScaleMelganDiscriminator` but specially tailored for HiFiGAN as in the paper.
    c                    sR   t    ttddt t g| _ttjddddtjddddg| _d S )NTrC   rP   r   r   )r   r   r   r   rM   rF   	AvgPool1d	meanpoolsr    r&   r   r   r      s   
,z MultiScaleDiscriminator.__init__c                 C   s^   g }g }t | jD ]!\}}|dkr| j|d  |}||\}}|| || q	||fS )
        Args:
            x (Tensor): input waveform.

        Returns:
            List[Tensor]: discriminator scores.
            List[List[Tensor]]: list of list of features from each layers of each discriminator.
        r   r   )rG   rF   rY   r0   )r    r3   rH   rI   ir
   rK   r4   r   r   r   r:      s   	
zMultiScaleDiscriminator.forwardr;   r   r   r&   r   rW      s    rW   c                       rV   )HifiganDiscriminatorz+HiFiGAN discriminator wrapping MPD and MSD.c                    s   t    t | _t | _d S )N)r   r   rB   mpdrW   msdrZ   r&   r   r   r      s   
zHifiganDiscriminator.__init__c                 C   s,   |  |\}}| |\}}|| || fS )r[   )r^   r_   )r    r3   rH   rI   scores_feats_r   r   r   r:      s   	zHifiganDiscriminator.forwardr;   r   r   r&   r   r]      s    r]   )r1   r   torch.nnr   r+   r/   Moduler   rB   rM   rW   r]   r   r   r   r   <module>   s   E'-$