o
    §µif,  ã                   @   s¾   d dl Z d dlZd dlmZ d dlm  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G dd„ dejƒZ						ddd„ZdS )é    Nc                       s*   e Zd ZdZd
‡ fdd„	Zdd	„ Z‡  ZS )ÚRes2Conv1dReluBnz1
    in_channels == out_channels == channels
    é   r   Té   c           	         sÀ   t ƒ  ¡  || dksJ d ||¡ƒ‚|| _|| | _|dkr!|n|d | _g | _g | _t| jƒD ]}| j 	t
j| j| j|||||d¡ | j 	t
 | j¡¡ q1t
 | j¡| _t
 | j¡| _d S )Nr   z{} % {} != 0r   ©Úbias)ÚsuperÚ__init__ÚformatÚscaleÚwidthÚnumsÚconvsÚbnsÚrangeÚappendÚnnÚConv1dÚBatchNorm1dÚ
ModuleList)	ÚselfÚchannelsÚkernel_sizeÚstrideÚpaddingÚdilationr   r
   Úi©Ú	__class__© úJ/home/ubuntu/.local/lib/python3.10/site-packages/f5_tts/eval/ecapa_tdnn.pyr      s   

$zRes2Conv1dReluBn.__init__c                 C   sš   g }t  || jd¡}t| jƒD ]'}|dkr|| }n|||  }| j| |ƒ}| j| t |¡ƒ}| 	|¡ q| j
dkrD| 	|| j ¡ t j|dd}|S )Nr   r   ©Údim)ÚtorchÚsplitr   r   r   r   r   ÚFÚrelur   r
   Úcat)r   ÚxÚoutÚspxr   Úspr   r   r   Úforward%   s   

zRes2Conv1dReluBn.forward)r   r   r   r   Tr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r+   Ú__classcell__r   r   r   r   r      s    r   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )	ÚConv1dReluBnr   r   Tc              	      s4   t ƒ  ¡  tj|||||||d| _t |¡| _d S )Nr   )r   r   r   r   Úconvr   Úbn)r   Úin_channelsÚout_channelsr   r   r   r   r   r   r   r   r   =   s   
zConv1dReluBn.__init__c                 C   s   |   t |  |¡¡¡S ©N)r3   r$   r%   r2   )r   r'   r   r   r   r+   B   s   zConv1dReluBn.forward)r   r   r   r   T©r,   r-   r.   r   r+   r0   r   r   r   r   r1   <   ó    r1   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú
SE_Connecté€   c                    s*   t ƒ  ¡  t ||¡| _t ||¡| _d S r6   )r   r   r   ÚLinearÚlinear1Úlinear2)r   r   Úse_bottleneck_dimr   r   r   r   K   s   
zSE_Connect.__init__c                 C   s>   |j dd}t |  |¡¡}t |  |¡¡}|| d¡ }|S )Né   r    )Úmeanr$   r%   r<   r"   Úsigmoidr=   Ú	unsqueeze)r   r'   r(   r   r   r   r+   P   s
   zSE_Connect.forward)r:   r7   r   r   r   r   r9   J   r8   r9   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚSE_Res2Blockc	           	         s|   t ƒ  ¡  t||dddd| _t||||||d| _t||dddd| _t||ƒ| _d | _||kr<tj	||dd| _d S d S )Nr   r   )r   r   r   )r
   )r4   r5   r   )
r   r   r1   ÚConv1dReluBn1r   ÚConv1dReluBn2r9   Úshortcutr   r   )	r   r4   r5   r   r   r   r   r
   r>   r   r   r   r   f   s   
ýÿzSE_Res2Block.__init__c                 C   sD   |}| j r
|   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|| S r6   )rF   rD   r   rE   r9   )r   r'   Úresidualr   r   r   r+   u   s   




zSE_Res2Block.forwardr7   r   r   r   r   rC   e   s    rC   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚAttentiveStatsPoolr:   Fc                    sT   t ƒ  ¡  || _|rtj|d |dd| _n	tj||dd| _tj||dd| _d S )Né   r   ©r   )r   r   Úglobal_context_attr   r   r<   r=   )r   Úin_dimÚattention_channelsrK   r   r   r   r   ‡   s   
zAttentiveStatsPool.__init__c           	      C   sÎ   | j r)tj|ddd |¡}t tj|dddd ¡ |¡}tj|||fdd}n|}t |  |¡¡}tj	|  
|¡dd}tj|| dd}tj||d  dd|d  }t |jdd	¡}tj||gddS )
NéÿÿÿÿT)r!   Úkeepdimg»½×Ùß|Û=r   r    r?   g•Ö&è.>)Úmin)rK   r"   r@   Ú	expand_asÚsqrtÚvarr&   Útanhr<   Úsoftmaxr=   ÚsumÚclamp)	r   r'   Úcontext_meanÚcontext_stdÚx_inÚalphar@   Ú	residualsÚstdr   r   r   r+   ’   s    zAttentiveStatsPool.forward)r:   Fr7   r   r   r   r   rH   †   s    rH   c                       sH   e Zd Z									d‡ fd	d
„	Zdd„ Zdd„ Zdd„ Z‡  ZS )Ú
ECAPA_TDNNéP   é   éÀ   FÚwavlm_largeé€>  Úhidden_statesNc
              
      s€  t ƒ  ¡  || _|| _|| _|| _dd„ tj_zt	j
 d¡}
tjj|
|d|	d| _W n   tj d|¡| _Y t| jjjjƒdkrWt| jjjjd jd	ƒrWd
| jjjjd j_t| jjjjƒdkrwt| jjjjd jd	ƒrwd
| jjjjd j_|  ¡ | _t t | j¡¡| _|dkrª|dkrªg d¢}| j ¡ D ]\}}|D ]}||v r¨d
|_ nqq—| js¸| j ¡ D ]}d
|_q²t |¡| _|gd dg | _ t!|| j d ddd| _"t#| j d | j d ddddddd| _$t#| j d | j d ddddddd| _%t#| j d | j d ddddddd| _&|d }tj'|| j d dd| _(t)| j d d|d| _*t +| j d d ¡| _,t -| j d d |¡| _.d S )Nc                 S   s   dS )NTr   )ÚaÚbÚcr   r   r   Ú<lambda>¸   s    z%ECAPA_TDNN.__init__.<locals>.<lambda>z#~/.cache/torch/hub/s3prl_s3prl_mainÚlocal)ÚsourceÚconfig_pathzs3prl/s3prlé   é   Úfp32_attentionFé   ÚfbankÚmfcc)Ú
final_projÚlabel_embs_concatÚmask_embÚ	project_qÚ	quantizerr   i   r   é   r?   )r   r   r   rI   é   r:   )r   r   r   r   r
   r>   rN   rJ   )rM   rK   )/r   r   Ú	feat_typeÚfeature_selectionÚupdate_extractÚsrr"   ÚhubÚ_validate_not_a_forked_repoÚosÚpathÚ
expanduserÚloadÚfeature_extractÚlenÚmodelÚencoderÚlayersÚhasattrÚ	self_attnrn   Úget_feat_numÚfeat_numr   Ú	ParameterÚzerosÚfeature_weightÚnamed_parametersÚrequires_gradÚ
parametersÚInstanceNorm1dÚinstance_normr   r1   Úlayer1rC   Úlayer2Úlayer3Úlayer4r   r2   rH   Úpoolingr   r3   r;   Úlinear)r   Úfeat_dimr   Úemb_dimrK   ry   r|   rz   r{   rk   Úlocal_s3prl_pathÚfreeze_listÚnameÚparamÚ
freeze_valÚcat_channelsr   r   r   r   ¥   s’   
ÿÿ
þ€ø
ø
øÿzECAPA_TDNN.__init__c                 C   s€   | j  ¡  t | j¡ t| j  ¡ ƒj¡g}t 	¡  |   |¡}W d   ƒ n1 s)w   Y  || j
 }t|ttfƒr>t|ƒS dS )Nr   )rƒ   Úevalr"   Úrandnr|   ÚtoÚnextr‘   ÚdeviceÚno_gradrz   Ú
isinstanceÚlistÚtupler„   )r   ÚwavÚfeaturesÚselect_featurer   r   r   rŠ     s   
 
ÿ
zECAPA_TDNN.get_feat_numc                 C   s&  | j r|  dd„ |D ƒ¡}n0t ¡ $ | jdks| jdkr%|  |¡d }n
|  dd„ |D ƒ¡}W d   ƒ n1 s9w   Y  | jdkrG| ¡ }| jdkrŒ| jdkrŒ|| j }t|tt	fƒretj
|dd}n| d¡}tj| jd	d d	¡ d	¡ d	¡}|| jdd}t |d
d¡d }|  |¡}|S )Nc                 S   ó   g | ]}|‘qS r   r   ©Ú.0Úsampler   r   r   Ú
<listcomp>  ó    z'ECAPA_TDNN.get_feat.<locals>.<listcomp>rp   rq   gíµ ÷Æ°>c                 S   r®   r   r   r¯   r   r   r   r²     r³   r   r    rN   r   r?   )r{   rƒ   r"   r§   ry   Úlogrz   r¨   r©   rª   ÚstackrB   r$   rU   rŽ   rV   Ú	transposer“   )r   r'   Únorm_weightsr   r   r   Úget_feat  s(   
€ü


"
zECAPA_TDNN.get_featc                 C   st   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}tj|||gdd}t |  	|¡¡}|  
|  |¡¡}|  |¡}|S )Nr   r    )r¸   r”   r•   r–   r—   r"   r&   r$   r%   r2   r3   r˜   r™   )r   r'   Úout1Úout2Úout3Úout4r(   r   r   r   r+   )  s   





zECAPA_TDNN.forward)	r_   r`   ra   Frb   rc   rd   FN)r,   r-   r.   r   rŠ   r¸   r+   r0   r   r   r   r   r^   ¤   s    ö_r^   é   rb   rc   rd   Fc              
   C   s   t | d||||||dS )Nr`   )rš   r   r›   ry   r|   rz   r{   rk   )r^   )rš   r›   ry   r|   rz   r{   rk   r   r   r   ÚECAPA_TDNN_SMALL9  s   	ør¾   )r½   rb   rc   rd   FN)r   r"   Útorch.nnr   Útorch.nn.functionalÚ
functionalr$   ÚModuler   r1   r9   rC   rH   r^   r¾   r   r   r   r   Ú<module>   s.   '
 ù