o
    4ѹg                     @   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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   windowZhanncenterT
normalizedFonesidedfminfmaxhtk
apply_stft)r   r   fsr   r   r   r   r   r   r   r   r   r   Zs3prlfrontend_confdownload_dirmultilayer_feature)r   r   r   r   c                 S   s   g | ]}|j qS  )r   .0frontendr   r   Z/Users/admin/.pyenv/versions/3.10.0/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cpur   c                    s0   g | ]\}}t jj|  j|  j d qS ))Zin_featuresZout_features)torchnnZLinearoutput_sizefactorsproj_dim)r   ir    r$   r   r!   r"   T   s    )super__init__align_methodr,   	frontends	enumerategetappendr   r   NotImplementedErrorr(   r)   Z
ModuleListnpr#   reducer+   r&   Zis_availableprojection_layerstoZdevice)r%   r1   r0   r,   r   r-   r    r	   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   dev	__class__r$   r!   r/   
   s   
















zFusedFrontends.__init__returnc                 C   s   t | j| j S N)lenr1   r,   r$   r   r   r!   r*   ^   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 r>   r   rD   mr   r!   r"      s   & )dimrB   )Zfeatsr1   r(   Zno_gradforwardr4   r0   Z
feats_projr2   r8   Zfeats_reshapedrC   Zreshaper+   minZfeats_finalcatZ	ones_liker5   )r%   r@   rA   r    Zinput_featsZ
feats_lensr-   Zinput_feats_projbsnfrI   Zinput_feats_reshapedr   rF   r!   rJ   a   s6   



zFusedFrontends.forward)Nr   r   r   )__name__
__module____qualname__r/   intr*   r(   ZTensorr   rJ   __classcell__r   r   r;   r!   r   	   s    Tr   )Zfunasr.frontends.defaultr   Zfunasr.frontends.s3prlr   Znumpyr6   r(   Ztorch.nnr)   typingr   Moduler   r   r   r   r!   <module>   s    