o
    4ѹgO                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlm  mZ	 d dl
mZmZ d dlmZmZmZmZ d dlmZmZmZ d dlmZmZ G dd deZdS )	    N)partial)CallableDict)	LayerNormSamePadTransposeLastConvFeatureExtractionModel)ModalityBlockEncoder	Decoder1d)ModalitySpecificEncoderget_alibi_biasc                
       s^   e Zd Zdedeegejf deegejf de	de
f
 fddZdd	 Z fd
dZ  ZS )AudioEncoder	embed_dim
make_block
norm_layerlayer_norm_firstalibi_biasesc                    s@  t j| _| jd d }t| jdjdd}tt t|t	|}	j
}
tdj|
 tjt gfddt|
D t R  }jrTtt|}tjjj tt fd	d
tjD |st|nd |jj}jd urtjnd }tt|d}t j||	d ||||d	 d S )Nr   g        F)Zconv_layersZdropoutmodeZ	conv_bias   c                    sJ   g | ]!}t t j  d  jdtt t ddt t  qS )   )kernel_sizepaddinggroupsF)Zelementwise_affine)nn
SequentialZConv1dZconv_pos_groupsr   r   r   ZGELU).0_)r   kmodality_cfg c/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/funasr/models/emotion2vec/audio.py
<listcomp>8   s"    
z)AudioEncoder.__init__.<locals>.<listcomp>c                 3   s    | ]	} | V  qd S Nr!   )r   i)dprr   r!   r"   	<genexpr>U   s    z(AudioEncoder.__init__.<locals>.<genexpr>)r   )	r    r   local_encoderproject_featuresZfixed_positional_encoderZrelative_positional_encodercontext_encoderdecoderr   )evalZfeature_encoder_specfeature_enc_layersr   Zextractor_moder   r   r   r   LinearZconv_pos_depthmaxZconv_pos_widthrangeZconv_pos_pre_lnnpZlinspaceZstart_drop_path_rateZend_drop_path_rateZprenet_depthr
   
ModuleListZprenet_layerdropZprenet_dropoutr+   r   r   r   super__init__)selfr    r   r   r   r   r   Zfeature_embed_dimr(   r)   Znum_pos_layersZpositional_encoderr*   r+   Zalibi_bias_fn	__class__)r&   r   r   r   r    r"   r4      sh   

	
zAudioEncoder.__init__c                    s   dt jf fdd}|d urad|  d}||}| rRt j|jd d |j|jd}d|t j	|jd |jd	|d f< d|
dgd
dg  }|S t j|jd d t j|jd}|S )
Ninput_lengthsc                    sH   dd }t t jD ]}||  j| d  j| d } q| tjS )zP
            Computes the output length of the convolutional layers
            c                 S   s   t | | | d S )N   )torchfloor)Zinput_lengthr   Zstrider!   r!   r"   _conv_out_lengtht   s   zdAudioEncoder.convert_padding_mask.<locals>.get_feat_extract_output_lengths.<locals>._conv_out_lengthr9   r   N)r0   lenr-   tor:   long)r8   r<   r%   r5   r!   r"   get_feat_extract_output_lengthso   s   zJAudioEncoder.convert_padding_mask.<locals>.get_feat_extract_output_lengthsr9   r   r   )dtypedevicer   )rC   )r:   Z
LongTensorr?   sumanyzerosshaperB   rC   ZarangeZflipZcumsumbool)r5   xZpadding_maskrA   r8   Zoutput_lengthsr!   r@   r"   convert_padding_maskn   s    	"z!AudioEncoder.convert_padding_maskc                    sJ   t    | j D ]}t|tjr|  q
| jd ur#| j  d S d S r$   )r3   reset_parametersr)   children
isinstancer   r.   r+   )r5   modr6   r!   r"   rK      s   

zAudioEncoder.reset_parameters)__name__
__module____qualname__intr   floatr   r2   r   rH   r   r4   rJ   rK   __classcell__r!   r!   r6   r"   r      s    U(r   )r:   Znumpyr1   Ztorch.nnr   	functoolsr   Ztorch.nn.functionalZ
functionalFtypingr   r   Z)funasr.models.emotion2vec.fairseq_modulesr   r   r   r   Z!funasr.models.emotion2vec.modulesr	   r
   r   Zfunasr.models.emotion2vec.baser   r   r   r!   r!   r!   r"   <module>   s   