o
    i                     @   s   d Z ddlZddlZddlZddlZddlmZmZ 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 G d	d
 d
eZdd ZdS )zEncoder definition.    N)OptionalTuple)FileLock)check_argument_types)
AbsEncoder)make_pad_mask)	LayerNormc                       s   e Zd ZdZ				ddededed	ed
edef fddZdefddZ	dde	j
de	j
de	j
dee	j
e	j
ee	j
 f fddZdd Z  ZS )FairSeqWav2Vec2Encodera  FairSeq Wav2Vec2 encoder module.

    Args:
        input_size: input dim
        output_size: dimension of attention
        w2v_url: url to Wav2Vec2.0 pretrained model
        w2v_dir_path: directory to download the Wav2Vec2.0 pretrained model.
        normalize_before: whether to use layer_norm before the first block
        finetune_last_n_layers: last n layers to be finetuned in Wav2Vec2.0
                                0 means to finetune every layer if freeze_w2v=False.
    ./   Fr   
input_sizew2v_urlw2v_dir_pathoutput_sizenormalize_beforefreeze_finetune_updatesc              
      sP  t  sJ t   |dkr1zdd l}ddlm} W n ty0 }	 z
td td |	d }	~	ww t||| _	|| _
|jj| j	gd|id\}
}}|
d }t||skz|jj}W n tyj }	 ztd |	d }	~	ww || _t| | _|| _| jrt|| _|jj|krtjtj|jj|| _nd | _|| _|  d	t!dg d S )
N r   )Wav2Vec2Modelz)Error: FairSeq is not properly installed.zBPlease install FairSeq: cd ${MAIN_ROOT}/tools && make fairseq.donedata)arg_overrideszTError: pretrained models should be within: 'Wav2Vec2Model, Wav2VecCTC' classes, etc.num_updates)"r   super__init__fairseqfairseq.models.wav2vec.wav2vec2r   	Exceptionprintdownload_w2vw2v_model_path_output_sizecheckpoint_utilsload_model_ensemble_and_task
isinstancew2v_encoder	w2v_modelencoderscopydeepcopy
state_dictpretrained_paramsr   r   
after_normcfgencoder_embed_dimtorchnn
SequentialLinearoutput_layerr   register_buffer
LongTensor)selfr   r   r   r   r   r   r   r   emodels_model	__class__ X/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/asr/encoder/wav2vec2_encoder.pyr   !   sV   
	


zFairSeqWav2Vec2Encoder.__init__returnc                 C   s   | j S N)r   r4   r;   r;   r<   r   _   s   z"FairSeqWav2Vec2Encoder.output_sizeNxs_padilensprev_statesc           	      C   s,  t ||j}| j| jk}| j| jkr|  jd7  _n|r2| j| jd kr2|  jd7  _td |s8t nt	
  | j||dd}W d   n1 sOw   Y  |d }|jd }|d duro|d }| jdd	}nt|jd g||j}| jdur| |}| jr| |}||dfS )
zForward FairSeqWav2Vec2 Encoder.

        Args:
            xs_pad: input tensor (B, L, D)
            ilens: input length (B)
            prev_states: Not to be used now.
        Returns:
            position embedded tensor and mask
           z%Start fine-tuning wav2vec parameters!T)features_onlyNxr   padding_mask)dim)r   todevicer   r   logginginfor-   no_grad
contextlibnullcontextr%   shapesum	IntTensorrepeatr1   r   r*   )	r4   r@   rA   rB   masksftenc_outputsbsolensr;   r;   r<   forwardb   s2   

 



zFairSeqWav2Vec2Encoder.forwardc                 C   s   | j | j td d S )Nz-Pretrained Wav2Vec model parameters reloaded!)r%   load_state_dictr)   rJ   rK   r?   r;   r;   r<   reload_pretrained_parameters   s   z3FairSeqWav2Vec2Encoder.reload_pretrained_parameters)r
   r   Fr   r>   )__name__
__module____qualname____doc__intstrboolr   r   r-   Tensorr   r   rX   rZ   __classcell__r;   r;   r9   r<   r	      s>    >
/r	   c                 C   s   t j|dd | dd }t j||}d}t j||dd }t|d 7 t j|sGtj	| | tj	|| t
d|  nt
d| d	 W d    |S W d    |S 1 scw   Y  |S )
NT)exist_ok/z;https://dl.fbaipublicfiles.com/fairseq/wav2vec/dict.ltr.txtz.lockzWav2Vec model downloaded zWav2Vec model z already exists.)osmakedirssplitpathjoinr   existsr-   hubdownload_url_to_filerJ   rK   )	model_urldir_path
model_name
model_pathdict_url	dict_pathr;   r;   r<   r      s$   

r   )r^   rM   r&   rJ   rg   typingr   r   r-   filelockr   	typeguardr   espnet2.asr.encoder.abs_encoderr   &espnet.nets.pytorch_backend.nets_utilsr   2espnet.nets.pytorch_backend.transformer.layer_normr   r	   r   r;   r;   r;   r<   <module>   s    