o
    4ѹg                     @   s   d dl 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 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	 ZG d
d dejZdS )    N)	Namespace)Optional)Tuple)Union)Frontend)pad_listc                 C   sf   t | dd | _t | dd | _t | dd| _t | dd | _t | dd | _t | dd| _t | dd	| _| S )
Nupstream_feature_selectionupstream_model_configupstream_refreshFupstream_ckpt	init_ckptverbosetile_factor   )getattrr   r	   r
   r   r   r   r   )args r   Z/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/funasr/frontends/s3prl.pybase_s3prl_setup   s   r   c                	       s   e Zd ZdZ				ddeeef dee dede	f fd	d
Z
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                    s~   t    t|trt|}|d urtj| || _	| 
|\| _| _t| j | _| jj| _d| _| jd| _d S )Ns3prlkey)super__init__
isinstancestrhumanfriendlyZ
parse_sizetorchhubZset_dirr   _get_upstreamupstream
featurizercopydeepcopyZ
state_dictpretrained_params
output_dimZfrontend_typeZget_downsample_ratesZ
hop_length)selfr   r   r   r   	__class__r   r   r      s   



zS3prlFrontend.__init__c           
      C   s   t tdi |ddi}|| _d}tjddd}|D ]}|dr)|} q*q|dus0J tj	j
||j|j|j|jdd	d}t|d
ddurW|jjjdv rWd|jj_ddlm} | jdu red}nd}|||dd}	||	fS )zGet S3PRL upstream model.ZdevicecpuN
PYTHONPATHz(None):r   local)ZckptZmodel_configZrefreshsourcemodel)ZWav2Vec2ModelZHubertModel        r   )
FeaturizerZlast_hidden_stateZhidden_states)r%   feature_selectionZupstream_devicer   )r   r   r   osenvirongetsplitendswithr"   r#   loadr%   r   r	   r
   tor   r3   r-   __name__encoderZ	layerdropZs3prl.upstream.interfacesr5   r   )
r+   r   Z
s3prl_argsZ
s3prl_pathZpython_path_listpZs3prl_upstreamr5   r6   Zs3prl_featurizerr   r   r   r$   4   sP   
	

zS3prlFrontend._get_upstreamc                 C   s\   t |jdksJ d|j|dd| jj}||d|d| j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      N)lenshapeformatrepeatr   r   Zreshapesize)r+   featureZtiled_featurer   r   r   _tile_representationsb   s    z#S3prlFrontend._tile_representationsreturnc                 C   s   | j S N)r*   r+   r   r   r   output_sizer   s   zS3prlFrontend.output_sizeinputinput_lengthsc                    s    fddt |D }| j  t  | |}W d    n1 s$w   Y  | ||}| jjdkr:| |}t	|d}tj
dd |D tjd}~||fS )Nc                    s    g | ]\}}|d  |  qS rK   r   ).0iZwavrO   r   r   
<listcomp>x   s     z)S3prlFrontend.forward.<locals>.<listcomp>r   r4   c                 S   s   g | ]}|j d  qS )r   )rD   )rP   fr   r   r   rS      s    )Zdtype)	enumerater%   evalr"   Zno_gradr&   r   r   rI   r   Ztensorlong)r+   rN   rO   ZwavsZfeatsZinput_featsZ
feats_lensr   rR   r   forwardu   s   



zS3prlFrontend.forwardc                 C   s   | j | j td d S )Nz4Pretrained S3PRL frontend model parameters reloaded!)r%   Zload_state_dictr)   logginginforL   r   r   r   reload_pretrained_parameters   s   z*S3prlFrontend.reload_pretrained_parameters)r   NNF)r>   
__module____qualname____doc__r   intr    r   dictboolr   r$   rI   rM   r"   ZTensorr   rX   r[   __classcell__r   r   r,   r   r      s4    
.
r   )r'   rY   r7   argparser   typingr   r   r   r!   r"   Ztorch.nnnnZfunasr.frontends.utils.frontendr   Z*funasr.models.transformer.utils.nets_utilsr   r   Moduler   r   r   r   r   <module>   s    