o
    i                     @   sx   d dl Z d dlZd dlmZmZmZ d dl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 G dd deZdS )	    N)OptionalTupleUnion)check_argument_types)AbsFrontend)get_default_kwargs)Frontendc                	       s   e Zd ZdZdeeddfdeeef de	e
 dedef fd	d
Zdd ZdefddZdejdejdeejejf fddZdd Z  ZS )S3prlFrontendz<Speech Pretrained Representation frontend structure for ASR.>  NFfsfrontend_confdownload_dirmultilayer_featurec              
      sL  zdd l }ddlm}m} W n ty$ } z
td td |d }~ww t s*J t   t	|t
r9t|}|dkrBtd |d urM|jj| |dd | v sYJ ||d|dd d	}	|	  t|	d
d d ur~|	jjjdv r~d|	jj_||	}
|| _|	|
| _| _t| j  | _!d| _"| jj#| _$|dd| _%d S )Nr   )
FeaturizerS3PRLUpstreamz'Error: S3PRL is not properly installed.z>Please install S3PRL: cd ${MAIN_ROOT}/tools && make s3prl.doner
   z?All the upstream models in S3PRL now only support 16 kHz audio.upstreampath_or_url)r   model)Wav2Vec2ModelHubertModelg        s3prltile_factor   )&r   s3prl.nnr   r   	Exceptionprintr   super__init__
isinstancestrhumanfriendly
parse_sizeloggingwarningutildownloadset_dirgetavailable_namesevalgetattrr   	__class____name__encoder	layerdropr   r   
featurizercopydeepcopy
state_dictpretrained_paramsfrontend_typedownsample_rate
hop_lengthr   )selfr   r   r   r   r   r   r   er   r/   r+    N/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/asr/frontend/s3prl.pyr      sN   






zS3prlFrontend.__init__c                 C   sX   t |jdksJ d|j|dd| j}||d|d| j |d}|S )a  Tile up the representations by `tile_factor`.

        Input - sequence of representations
                shape: (batch_size, seq_len, feature_dim)

        Output - sequence of tiled representations
                 shape: (batch_size, seq_len * factor, feature_dim)
           z.Input argument `feature` has invalid shape: {}r   r      )lenshapeformatrepeatr   reshapesize)r7   featuretiled_featurer:   r:   r;   _tile_representationsC   s   

z#S3prlFrontend._tile_representationsreturnc                 C   s   | j jS )N)r/   output_sizer7   r:   r:   r;   rH   U   s   zS3prlFrontend.output_sizeinputinput_lengthsc                 C   sd   |  ||\}}| jr| ||\}}n| |dd  |dd  \}}| jdkr.| |}||fS )Nr   )r   r   r/   r   rF   )r7   rJ   rK   feats
feats_lensr:   r:   r;   forwardX   s    

zS3prlFrontend.forwardc                 C   s   | j | j td d S )Nz4Pretrained S3PRL frontend model parameters reloaded!)r   load_state_dictr3   r"   inforI   r:   r:   r;   reload_pretrained_parametersf   s   z*S3prlFrontend.reload_pretrained_parameters)r,   
__module____qualname____doc__r   r   r   intr   r   dictboolr   rF   rH   torchTensorr   rO   rR   __classcell__r:   r:   r9   r;   r	      s2    
2
r	   )r0   r"   typingr   r   r   r    rY   	typeguardr   !espnet2.asr.frontend.abs_frontendr    espnet2.utils.get_default_kwargsr   .espnet.nets.pytorch_backend.frontends.frontendr   r	   r:   r:   r:   r;   <module>   s    