o
    i{                     @   s`   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lmZ G dd deZdS )	    )TupleN)check_argument_types)AbsFrontend)DefaultFrontend)S3prlFrontendc                       sT   e Zd Z	d f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	  Z
S )FusedFrontendsNlinear_projectiond   >  c                    s  t  sJ t   | _| _g  _t|D ]\}}|d }|dkr|dd||dd|d|dd	f\}}}	}
}|d
d|dd|dd|ddf\}}}}|dd |dd |dd|ddf\}}}} jt	||	||
|||||||||d q|dkr|d|d|d}}} jt
||||d qttj j _tjdd  jD  _ fdd jD  _tj rd}nd} jd kr fd!dt jD  _tj j _ jt| _d S d S )"Nfrontend_typedefaultn_melsP   n_ffti   
win_length
hop_length   windowhanncenterT
normalizedFonesidedfminfmaxhtk
apply_stft)r   r   fsr   r   r   r   r   r   r   r   r   r   s3prlfrontend_confdownload_dirmultilayer_feature)r   r   r   r    c                 S   s   g | ]}|j qS  )r   .0frontendr!   r!   N/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/asr/frontend/fused.py
<listcomp>U   s    z+FusedFrontends.__init__.<locals>.<listcomp>c                    s   g | ]}|j  j qS r!   )r   gcdr"   selfr!   r%   r&   V   s    cudacpur   c                    s0   g | ]\}}t jj|  j|  j d qS ))in_featuresout_features)torchnnLinearoutput_sizefactorsproj_dim)r#   ir$   r(   r!   r%   r&   \   s    )r   super__init__align_methodr3   	frontends	enumerategetappendr   r   NotImplementedErrorr.   r/   
ModuleListnpr'   reducer2   r*   is_availableprojection_layerstodevice)r)   r8   r7   r3   r   r4   r$   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    dev	__class__r(   r%   r6      s   

















zFusedFrontends.__init__returnc                 C   s   t | j| j S N)lenr8   r3   r(   r!   r!   r%   r1   f   s   zFusedFrontends.output_sizeinputinput_lengthsc              	      sb  g | _ | jD ]&}t  |||\}}W d    n1 sw   Y  | j ||g q| jdkrg | _t| jD ]\}}| j | d }| j| j	| | q:g | _
t| jD ](\}}| j| }|j\}}	}
t|||	| j|  |
| j|  f}| j
| qYtdd | j
D   fdd| j
D | _tj| jdd}t| j d d   }||fS t)	Nr   r   c                 S   s   g | ]}|j d  qS )   )shaper#   xr!   r!   r%   r&      s    z*FusedFrontends.forward.<locals>.<listcomp>c                    s&   g | ]}|d d d  d d f qS rH   r!   rN   mr!   r%   r&      s   & )dimrL   )featsr8   r.   no_gradforwardr;   r7   
feats_projr9   rA   feats_reshapedrM   reshaper2   minfeats_finalcat	ones_liker<   )r)   rJ   rK   r$   input_feats
feats_lensr4   input_feats_projbsnfrS   input_feats_reshapedr!   rP   r%   rV   i   s6   



zFusedFrontends.forward)Nr   r	   r
   )__name__
__module____qualname__r6   intr1   r.   Tensorr   rV   __classcell__r!   r!   rE   r%   r      s    Yr   )typingr   numpyr>   r.   	typeguardr   !espnet2.asr.frontend.abs_frontendr   espnet2.asr.frontend.defaultr   espnet2.asr.frontend.s3prlr   r   r!   r!   r!   r%   <module>   s    