o
    ´‹
jÖ4  ã                   @   s4  d dl 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 dl
m  m  m  mZ d dl
mZmZ d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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G dd„ dejƒZG dd„ dejƒZG dd„ dejƒZdS )é    N)Únn)ÚConv1d)Ú
functional)Úweight_norm)Úremove_parametrizations)Úget_paddingÚinit_weightsgš™™™™™¹?c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú	LayerNormçñhãˆµøä>c                    s>   t ƒ  ¡  || _|| _t t |¡¡| _t t 	|¡¡| _
d S ©N)ÚsuperÚ__init__ÚchannelsÚepsr   Ú	ParameterÚtorchÚonesÚgammaÚzerosÚbeta)Úselfr   r   ©Ú	__class__© úP/home/kuhnn/.local/lib/python3.10/site-packages/TTS/vc/modules/freevc/modules.pyr      s
   
zLayerNorm.__init__c                 C   s4   |  dd¡}t || jf| j| j| j¡}|  dd¡S )Né   éÿÿÿÿ)Ú	transposeÚFÚ
layer_normr   r   r   r   )r   Úxr   r   r   Úforward   s   zLayerNorm.forward)r
   ©Ú__name__Ú
__module__Ú__qualname__r   r!   Ú__classcell__r   r   r   r   r	      s    r	   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚConvReluNormc              	      s  t ƒ  ¡  || _|| _|| _|| _|| _|| _|dksJ dƒ‚t 	¡ | _
t 	¡ | _| j
 tj||||d d¡ | j t|ƒ¡ t t ¡ t |¡¡| _t|d ƒD ]}| j
 tj||||d d¡ | j t|ƒ¡ qRt ||d¡| _| jjj ¡  | jjj ¡  d S )Nr   z)Number of layers should be larger than 0.é   )Úpadding)r   r   Úin_channelsÚhidden_channelsÚout_channelsÚkernel_sizeÚn_layersÚ	p_dropoutr   Ú
ModuleListÚconv_layersÚnorm_layersÚappendr   r	   Ú
SequentialÚReLUÚDropoutÚ	relu_dropÚrangeÚprojÚweightÚdataÚzero_Úbias)r   r*   r+   r,   r-   r.   r/   Ú_r   r   r   r      s&   


zConvReluNorm.__init__c                 C   sT   |}t | jƒD ]}| j| || ƒ}| j| |ƒ}|  |¡}q||  |¡ }|| S r   )r8   r.   r1   r2   r7   r9   )r   r    Úx_maskÚx_orgÚir   r   r   r!   4   s   zConvReluNorm.forwardr"   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 )
ÚDDSConvz1
    Dialted and Depth-Separable Convolution
    ç        c                    sÔ   t ƒ  ¡  || _|| _|| _|| _t |¡| _t 	¡ | _
t 	¡ | _t 	¡ | _t 	¡ | _t|ƒD ]8}|| }|| | d }| j
 tj||||||d¡ | j t ||d¡¡ | j t|ƒ¡ | j t|ƒ¡ q/d S )Nr(   )ÚgroupsÚdilationr)   r   )r   r   r   r-   r.   r/   r   r6   Údropr0   Ú	convs_sepÚ	convs_1x1Únorms_1Únorms_2r8   r3   r   r	   )r   r   r-   r.   r/   rA   rE   r)   r   r   r   r   C   s(   




ÿøzDDSConv.__init__Nc                 C   sŠ   |d ur|| }t | jƒD ]3}| j| || ƒ}| j| |ƒ}t |¡}| j| |ƒ}| j| |ƒ}t |¡}|  |¡}|| }q|| S r   )	r8   r.   rG   rI   r   ÚgelurH   rJ   rF   )r   r    r?   ÚgrA   Úyr   r   r   r!   Y   s   



zDDSConv.forward)rC   r   )r#   r$   r%   Ú__doc__r   r!   r&   r   r   r   r   rB   >   s    rB   c                       s0   e Zd Zd	‡ fdd„	Zd
dd„Zdd„ Z‡  ZS )ÚWNr   c                    sP  t t| ƒ ¡  |d dksJ ‚|| _|f| _|| _|| _|| _|| _t	j
 ¡ | _t	j
 ¡ | _t
 |¡| _|dkrOt	j
 |d| | d¡}t	j
jjj|dd| _t|ƒD ]R}|| }	t||	 |	 d ƒ}
t	j
j|d| ||	|
d}t	j
jjj|dd}| j |¡ ||d k r‹d| }n|}t	j
 ||d¡}t	j
jjj|dd}| j |¡ qSd S )Nr(   r   r   r:   )Úname©rE   r)   )r   rO   r   r+   r-   Údilation_rater.   Úgin_channelsr/   r   r   r0   Ú	in_layersÚres_skip_layersr6   rF   r   ÚutilsÚparametrizationsr   Ú
cond_layerr8   Úintr3   )r   r+   r-   rR   r.   rS   r/   rX   rA   rE   r)   Úin_layerÚres_skip_channelsÚres_skip_layerr   r   r   r   i   s:   ÿ
ïzWN.__init__Nc                 K   s  t  |¡}t  | jg¡}|d ur|  |¡}t| jƒD ]o}| j| |ƒ}|d urA|d | j }	|d d …|	|	d| j  …d d …f }
nt  |¡}
t 	||
|¡}|  
|¡}| j| |ƒ}|| jd k r…|d d …d | j…d d …f }|| | }||d d …| jd …d d …f  }q|| }q|| S )Nr(   r   )r   Ú
zeros_likeÚ	IntTensorr+   rX   r8   r.   rT   ÚcommonsÚfused_add_tanh_sigmoid_multiplyrF   rU   )r   r    r?   rL   ÚkwargsÚoutputÚn_channels_tensorrA   Úx_inÚcond_offsetÚg_lÚactsÚres_skip_actsÚres_actsr   r   r   r!   Ž   s&   

&

"
z
WN.forwardc                 C   sF   | j dkrt| jdƒ | jD ]}t|dƒ q| jD ]}t|dƒ qd S )Nr   r:   )rS   r   rX   rT   rU   ©r   Úlr   r   r   Úremove_weight_norm©   s   


ÿzWN.remove_weight_norm)r   r   r   ©r#   r$   r%   r   r!   rl   r&   r   r   r   r   rO   h   s    
%rO   c                       ó0   e Zd Zd
‡ fdd„	Zddd„Zdd	„ Z‡  ZS )Ú	ResBlock1é   ©r   rp   é   c                    s  t t| ƒ ¡  t tt|||d|d t||d ƒdƒtt|||d|d t||d ƒdƒtt|||d|d t||d ƒdƒg¡| _| j 	t
¡ t tt|||ddt|dƒdƒtt|||ddt|dƒdƒtt|||ddt|dƒdƒg¡| _| j 	t
¡ d S )Nr   r   rQ   r(   )r   ro   r   r   r0   r   r   r   Úconvs1Úapplyr   Úconvs2©r   r   r-   rE   r   r   r   r   ³   s`   úÿ
úÿ
úÿëÿ"ÿÿÿùÿzResBlock1.__init__Nc                 C   s|   t | j| jƒD ],\}}t |t¡}|d ur|| }||ƒ}t |t¡}|d ur+|| }||ƒ}|| }q|d ur<|| }|S r   )Úziprs   ru   r   Ú
leaky_reluÚLRELU_SLOPE)r   r    r?   Úc1Úc2Úxtr   r   r   r!   è   s   
zResBlock1.forwardc                 C   s0   | j D ]}t|dƒ q| jD ]}t|dƒ qd S ©Nr:   )rs   r   ru   rj   r   r   r   rl   ÷   s
   

ÿzResBlock1.remove_weight_norm)rp   rq   r   rm   r   r   r   r   ro   ²   s    
5ro   c                       rn   )Ú	ResBlock2rp   ©r   rp   c                    sr   t t| ƒ ¡  t tt|||d|d t||d ƒdƒtt|||d|d t||d ƒdƒg¡| _| j 	t
¡ d S )Nr   r   rQ   )r   r~   r   r   r0   r   r   r   Úconvsrt   r   rv   r   r   r   r   ÿ   s2   úÿ
úÿõÿzResBlock2.__init__Nc                 C   sL   | j D ]}t |t¡}|d ur|| }||ƒ}|| }q|d ur$|| }|S r   )r€   r   rx   ry   )r   r    r?   Úcr|   r   r   r   r!     s   

zResBlock2.forwardc                 C   s   | j D ]}t|dƒ qd S r}   )r€   r   rj   r   r   r   rl   &  s   
ÿzResBlock2.remove_weight_norm)rp   r   r   rm   r   r   r   r   r~   þ   s    
r~   c                   @   s   e Zd Zddd„ZdS )ÚLogFc                 K   sF   |st  t  |d¡¡| }t  | ddg¡}||fS t  |¡| }|S )Nr
   r   r(   )r   ÚlogÚ	clamp_minÚsumÚexp©r   r    r?   Úreversera   rM   Úlogdetr   r   r   r!   ,  s   zLog.forwardN©F©r#   r$   r%   r!   r   r   r   r   r‚   +  s    r‚   c                   @   s   e Zd Zddœdd„ZdS )ÚFlipF)rˆ   c                O   s<   t  |dg¡}|st  | d¡¡j|j|jd}||fS |S )Nr   r   )ÚdtypeÚdevice)r   Úflipr   ÚsizeÚtor   rŽ   )r   r    rˆ   Úargsra   r‰   r   r   r   r!   7  s
   zFlip.forwardNr‹   r   r   r   r   rŒ   6  s    rŒ   c                       s&   e Zd Z‡ fdd„Zddd„Z‡  ZS )ÚElementwiseAffinec                    s<   t ƒ  ¡  || _t t |d¡¡| _t t |d¡¡| _d S )Nr   )	r   r   r   r   r   r   r   ÚmÚlogs)r   r   r   r   r   r   A  s   
zElementwiseAffine.__init__Fc                 K   s`   |s | j t | j¡|  }|| }t | j| ddg¡}||fS || j  t | j ¡ | }|S )Nr   r(   )r”   r   r†   r•   r…   r‡   r   r   r   r!   G  s   zElementwiseAffine.forwardrŠ   r"   r   r   r   r   r“   @  s    r“   c                       s.   e Zd Z			d‡ fdd„	Zd	dd„Z‡  ZS )
ÚResidualCouplingLayerr   Fc	           	         s®   |d dks
J dƒ‚t ƒ  ¡  || _|| _|| _|| _|| _|d | _|| _t	 
| j|d¡| _t||||||d| _t	 
|| jd|  d¡| _| jjj ¡  | jjj ¡  d S )Nr(   r   z!channels should be divisible by 2r   )r/   rS   )r   r   r   r+   r-   rR   r.   Úhalf_channelsÚ	mean_onlyr   r   ÚprerO   ÚencÚpostr:   r;   r<   r=   )	r   r   r+   r-   rR   r.   r/   rS   r˜   r   r   r   r   S  s    

ÿzResidualCouplingLayer.__init__Nc                 C   sä   t  || jgd d¡\}}|  |¡| }| j|||d}|  |¡| }| js4t  || jgd d¡\}	}
n|}	t  |	¡}
|s\|	|t  |
¡ |  }t  	||gd¡}t  
|
ddg¡}||fS ||	 t  |
 ¡ | }t  	||gd¡}|S )Nr(   r   )rL   )r   Úsplitr—   r™   rš   r›   r˜   r]   r†   Úcatr…   )r   r    r?   rL   rˆ   Úx0Úx1ÚhÚstatsr”   r•   r‰   r   r   r   r!   p  s    
zResidualCouplingLayer.forward)r   r   F)NFr"   r   r   r   r   r–   R  s    ÷r–   )r   r   Útorch.nnr   r   r   Útorch.nn.utils.parametrizationsr   Útorch.nn.utils.parametrizer   ÚTTS.vc.modules.freevc.commonsÚvcÚmodulesÚfreevcr_   r   r   ry   ÚModuler	   r'   rB   rO   ro   r~   r‚   rŒ   r“   r–   r   r   r   r   Ú<module>   s&    !*JL-
