o
    
j                     @   s   d dl Z d dlm  mZ d dl mZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ dZG dd	 d	ejZG d
d de jjZG dd dejZdS )    N)nn)spectral_norm)weight_norm)	TorchSTFT)MultiPeriodDiscriminatorg?c                       s*   e Zd ZdZd
 fdd	Zdd	 Z  ZS )SpecDiscriminatorzdocstring for Discriminator.   x   X  Fc                    s   t    |du rtnt}|| _|| _|| _t|||| _t	
|t	jddddd|t	jdddddd|t	jdddddd|t	jdddddd|t	jddd	d
d
dg| _|t	ddddd| _d S )NF       )   	   )r      )kernel_sizepadding)r      )r   strider   )r   r   )r   r   r   )super__init__r   r   fft_size
hop_length
win_lengthr   stftr   
ModuleListConv2ddiscriminatorsout)selfr   r   r   use_spectral_normnorm_f	__class__ [/home/kuhnn/.local/lib/python3.10/site-packages/TTS/vocoder/models/univnet_discriminator.pyr      s   

zSpecDiscriminator.__init__c                 C   s   g }t   |d}| |}W d    n1 sw   Y  |d}t| jD ]\}}||}t|t	}|
| q*| |}|
| t |dd|fS )Nr   )torchno_gradsqueezer   	unsqueeze	enumerater   F
leaky_reluLRELU_SLOPEappendr   flatten)r   yfmap_dr#   r#   r$   forward#   s   




zSpecDiscriminator.forward)r   r	   r
   F__name__
__module____qualname____doc__r   r4   __classcell__r#   r#   r!   r$   r      s    r   c                       s:   e Zd Zg dg dg ddf fdd	Zdd Z  ZS )	MultiResSpecDiscriminator)r   i   i   )r	      2   )r
   i  r<   hann_windowc              	      sb   t    tt|d |d |d |t|d |d |d |t|d |d |d |g| _d S )Nr   r   r   )r   r   r   r   r   r   )r   	fft_sizes	hop_sizeswin_lengthswindowr!   r#   r$   r   5   s   

z"MultiResSpecDiscriminator.__init__c                 C   s<   g }g }| j D ]}||\}}|| || q||fS N)r   r.   )r   xscoresfeatsr3   scorefeatr#   r#   r$   r4   A   s   

z!MultiResSpecDiscriminator.forward)r6   r7   r8   r   r4   r:   r#   r#   r!   r$   r;   4   s    r;   c                       s(   e Zd ZdZ fddZdd Z  ZS )UnivnetDiscriminatorz+Univnet discriminator wrapping MPD and MSD.c                    s   t    t | _t | _d S rC   )r   r   r   mpdr;   msd)r   r!   r#   r$   r   O   s   
zUnivnetDiscriminator.__init__c                 C   s,   |  |\}}| |\}}|| || fS )z
        Args:
            x (Tensor): input waveform.

        Returns:
            List[Tensor]: discriminator scores.
            List[List[Tensor]]: list of list of features from each layers of each discriminator.
        )rJ   rK   )r   rD   rE   rF   scores_feats_r#   r#   r$   r4   T   s   	zUnivnetDiscriminator.forwardr5   r#   r#   r!   r$   rI   L   s    rI   )r&   torch.nn.functionalr   
functionalr+   torch.nn.utilsr   torch.nn.utils.parametrizationsr    TTS.utils.audio.torch_transformsr   (TTS.vocoder.models.hifigan_discriminatorr   r-   Moduler   r;   rI   r#   r#   r#   r$   <module>   s    '