o
    ´‹
j±  ã                   @   sZ   d dl Z d dl mZ d dlmZ d dlmZmZ G dd„ de jjƒZG dd„ dejƒZ	dS )	é    N)Únn)ÚConv1d)ÚDiscriminatorPÚMultiPeriodDiscriminatorc                       s*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )ÚDiscriminatorSz¾HiFiGAN Scale Discriminator. Channel sizes are different from the original HiFiGAN.

    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ddddddƒ|tdddddd	d
ƒ|tdddddd	d
ƒ|tdddddd	d
ƒ|tdddddd	d
ƒ|tddddddƒg¡| _	|tddddddƒ| _
d S )Né   é   é   é   )Úpaddingé@   é)   é   é   )Úgroupsr   é   i   é   é   é   )ÚsuperÚ__init__r   ÚutilsÚspectral_normÚparametrizationsÚweight_normÚ
ModuleListr   ÚconvsÚ	conv_post)ÚselfÚuse_spectral_normÚnorm_f©Ú	__class__© úT/home/kuhnn/.local/lib/python3.10/site-packages/TTS/tts/layers/vits/discriminator.pyr      s   
úÿ
zDiscriminatorS.__init__c                 C   s\   g }| j D ]}||ƒ}tjj |d¡}| |¡ 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.
        gš™™™™™¹?r   éÿÿÿÿ)r   Útorchr   Ú
functionalÚ
leaky_reluÚappendr   Úflatten)r   ÚxÚfeatÚlr#   r#   r$   Úforward   s   	


zDiscriminatorS.forward)F©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r.   Ú__classcell__r#   r#   r!   r$   r      s    r   c                       s,   e Zd ZdZd	‡ fdd„	Zd
dd„Z‡  ZS )ÚVitsDiscriminatoras  VITS discriminator wrapping one Scale Discriminator and a stack of Period Discriminator.

    ::
        waveform -> ScaleDiscriminator() -> scores_sd, feats_sd --> append() -> scores, feats
               |--> MultiPeriodDiscriminator() -> scores_mpd, feats_mpd ^

    Args:
        use_spectral_norm (bool): if `True` swith to spectral norm instead of weight norm.
    ©r   r   r   r
   é   Fc                    sD   t ƒ  ¡  t ¡ | _| j tˆ d¡ | j ‡ fdd„|D ƒ¡ d S )N©r   c                    s   g | ]}t |ˆ d ‘qS )r8   )r   )Ú.0Úir8   r#   r$   Ú
<listcomp>A   s    z.VitsDiscriminator.__init__.<locals>.<listcomp>)r   r   r   r   Únetsr)   r   Úextend)r   Úperiodsr   r!   r8   r$   r   =   s   

zVitsDiscriminator.__init__Nc                 C   sˆ   g }|durg nd}g }|durg nd}| j D ]&}||ƒ\}}	| |¡ | |	¡ |dur=||ƒ\}
}| |
¡ | |¡ q||||fS )a  
        Args:
            x (Tensor): ground truth waveform.
            x_hat (Tensor): predicted waveform.

        Returns:
            List[Tensor]: discriminator scores.
            List[List[Tensor]]: list of list of features from each layers of each discriminator.
        N)r<   r)   )r   r+   Úx_hatÚx_scoresÚx_hat_scoresÚx_featsÚx_hat_featsÚnetÚx_scoreÚx_featÚx_hat_scoreÚ
x_hat_featr#   r#   r$   r.   C   s   





€zVitsDiscriminator.forward)r6   F)Nr/   r#   r#   r!   r$   r5   2   s    
r5   )
r&   r   Útorch.nn.modules.convr   Ú(TTS.vocoder.models.hifigan_discriminatorr   r   ÚModuler   r5   r#   r#   r#   r$   Ú<module>   s    *