o
    iC                     @   sV   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
 G dd dejZdS )    )DefaultFrontend)S3prlFrontendN)Tuplec                       sR   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    | _| _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tj rd}ntj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   J/home/ubuntu/.local/lib/python3.10/site-packages/funasr/frontends/fused.py
<listcomp>M   s    z+FusedFrontends.__init__.<locals>.<listcomp>c                    s   g | ]}|j  j qS r   )r   gcdr    selfr   r#   r$   N   s    cudaxpumps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$   X   s    )super__init__align_methodr3   	frontends	enumerategetappendr   r   NotImplementedErrorr.   r/   
ModuleListnpr%   reducer2   r(   is_availabler)   backendsr*   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   b   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 rI   r   rO   mr   r#   r$      s   & )dimrM   )featsr8   r.   no_gradforwardr;   r7   
feats_projr9   rB   feats_reshapedrN   reshaper2   minfeats_finalcat	ones_liker<   )r'   rK   rL   r"   input_feats
feats_lensr4   input_feats_projbsnfrT   input_feats_reshapedr   rQ   r#   rW   e   s6   



zFusedFrontends.forward)Nr   r   r   )__name__
__module____qualname__r6   intr1   r.   Tensorr   rW   __classcell__r   r   rF   r#   r   	   s    Xr   )funasr.frontends.defaultr   funasr.frontends.s3prlr   numpyr>   r.   torch.nnr/   typingr   Moduler   r   r   r   r#   <module>   s    