o
    
j0                     @   sr   d dl Zd dlmZ G dd dejZG dd dejZG dd dejZG d	d
 d
ejZG dd dejZ	dS )    N)nnc                       $   e Zd Z fddZdd Z  ZS )GBlockc              
      s   t    || _|| _|| _ttj||dt tj	||d ddd| _
tj	||d dd| _tt tj	|d |d dddd| _ttj	||d ddtj||d| _d S )Nstride         kernel_sizepaddingr   r   dilationr   )super__init__in_channelscond_channelsdownsample_factorr   
Sequential	AvgPool1dReLUConv1dstart	lc_conv1dendresidual)selfr   r   r   	__class__ a/home/kuhnn/.local/lib/python3.10/site-packages/TTS/vocoder/models/random_window_discriminator.pyr      s"   
 
zGBlock.__init__c                 C   s4   |  || | }| |}| |}|| }|S )N)r   r   r   r   )r   inputs
conditionsoutputsresidual_outputsr    r    r!   forward   s
   

zGBlock.forward__name__
__module____qualname__r   r&   __classcell__r    r    r   r!   r      s    r   c                       r   )DBlockc                    s   t    || _|| _|| _tj||d| _tt	 tj
||dddt	 tj
||dddd| _ttj
||dd| _d S )Nr   r   r	   r
   r   r   r   )r   r   r   r   out_channelsr   r   donwsample_layerr   r   r   layersr   )r   r   r-   r   r   r    r!   r   %   s   

zDBlock.__init__c                 C   sF   | j dkr| | || | | }|S | || | }|S )Nr	   )r   r/   r.   r   )r   r"   r$   r    r    r!   r&   7   s
   
 zDBlock.forwardr'   r    r    r   r!   r,   $   s    r,   c                       s&   e Zd Zd fdd	Zdd Z  ZS )ConditionalDiscriminatorr   r   r         c              
      s   t    t|t|d ksJ || _|| _|| _|| _t | _	t | _
|  j	t|ddg7  _	d}t|D ]\}}| j	t||||  |}q9t|||d | _|  j
t|d |d dt|d |d dtdtj|d dddg7  _
d S )Nr	   @   r   r   )r   r   lenr   r   downsample_factorsr-   r   
ModuleListpre_cond_layerspost_cond_layersr,   	enumerateappendr   
cond_blockAdaptiveAvgPool1dr   )r   r   r   r8   r-   ichannelr   r    r!   r   @   s(   


z!ConditionalDiscriminator.__init__c                 C   sT   |  d }||| jd}| jD ]}||}q| ||}| jD ]}||}q!|S Nr   r6   )sizeviewr   r:   r>   r;   )r   r"   r#   
batch_sizer$   layerr    r    r!   r&   _   s   



z ConditionalDiscriminator.forward)r1   r2   r'   r    r    r   r!   r0   ?   s    r0   c                       s&   e Zd Zd fdd	Zdd Z  ZS )	UnconditionalDiscriminatorr5         r2   c              
      s   t    || _|| _|| _|| _t | _|  jt| j|dg7  _|}t	|D ]\}}| j
t||| | |d9 }q)|  jt||dt||dtdtj|dddg7  _d S )Nr	   r   r   )r   r   r8   r   r-   r   r9   r/   r,   r<   r=   r?   r   )r   r   base_channelsr8   r-   r@   factorr   r    r!   r   l   s"   




z#UnconditionalDiscriminator.__init__c                 C   s4   |  d }||| jd}| jD ]}||}q|S rB   )rC   rD   r   r/   )r   r"   rE   r$   rF   r    r    r!   r&      s
   

z"UnconditionalDiscriminator.forward)r5   rH   r2   r'   r    r    r   r!   rG   k   s    rG   c                       s2   e Zd ZdZ				d
 fdd	Zdd	 Z  ZS )RandomWindowDiscriminatorzORandom Window Discriminator as described in
    http://arxiv.org/abs/1909.11646rH   )rI   rJ   r   r   r   )rI   rJ   r   r   )rI   rJ   r   rH   )rJ   r   r   )r3   r3   r4   r4   )r3   r4   r4   r2   )r4   r2   i   i   i   i   i    c                    s&  t    | _| _| _ jd  _ fdd|D  _t|t|  kr/t|ks2J  J |D ]
}|| dks>J q4t|D ]\}}	t	
|	| j|  ksUJ qCtg  _ jD ]}
t|
d|d} j| q_tg  _t jD ]\}}
t|
||| || d} j| qzd S )Nr   c                    s   g | ]}| j  qS r    )base_window_size).0wsr   r    r!   
<listcomp>   s    z6RandomWindowDiscriminator.__init__.<locals>.<listcomp>r   r5   )r   rK   r8   )r   r   r8   r-   )r   r   r   window_sizes
hop_lengthrQ   ksr7   r<   npprodr   r9   unconditional_discriminatorsrG   r=   conditional_discriminatorsr0   )r   r   rW   uncond_disc_donwsample_factorscond_disc_downsample_factorscond_disc_out_channelsrV   rS   idxcfkrF   r   rT   r!   r      s6   
	(
z"RandomWindowDiscriminator.__init__c                 C   s  g }g }t | j| jD ]%\}}tj|jd | }||d d d d ||| f }|| qt | j| jD ]D\}}|| j	 }	tj|jd |	 }
|
| j	 }|d d d d ||
|	 | j	 f }|d d d d |
|
|	 f }|||}|| q8||fS )Nr6   )
ziprV   r[   rY   randomrandintshaper=   r\   rW   )r   xcscoresfeatswindow_sizerF   indexscore
frame_sizelc_indexsample_indexx_subc_subr    r    r!   r&      s   "

$
z!RandomWindowDiscriminator.forward)rH   rN   rO   rP   )r(   r)   r*   __doc__r   r&   r+   r    r    r   r!   rM      s    *rM   )
numpyrY   torchr   Moduler   r,   r0   rG   rM   r    r    r    r!   <module>   s    ,