o
    iq
                     @   sp   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 d dlmZ G dd	 d	ejjZdS )
    )TupleN)
functional)ComplexTensor)make_pad_mask)RNN)RNNPc                	       sJ   e Zd Zd
 fdd	Zdedejdeeejdf ejf fdd	Z	  Z
S )MaskEstimator   c           
   	      s   t    tj|d tjd}|dd}	|d dkr*t |||||	d| _nt	 ||||	d| _|| _
|| _tj fddt|D | _d S )	Nr	   )dtypevggp)typc                    s   g | ]	}t j qS  )torchnnLinear).0_idimprojsr   Y/home/ubuntu/.local/lib/python3.10/site-packages/funasr/frontends/utils/mask_estimator.py
<listcomp>   s    z*MaskEstimator.__init__.<locals>.<listcomp>)super__init__nponesint32lstriprstripr   brnnr   typenmaskr   r   
ModuleListrangelinears)
selfr"   r   layersunitsr   dropoutr#   	subsampler   	__class__r   r   r      s   
&zMaskEstimator.__init__xsilensreturn.c           
      C   s\  | d| dksJ | d| df|  \}}}}|dddd}|jd |jd  d }| d| d| d}|dddf d| d}| ||\}}}|d|| d| d}g }| jD ]9}||}	t	
|	}	|	t||	dd	d |	dddd}	|	 d|k rtj|	d||	 d gdd
}	||	 qnt||fS )zThe forward function

        Args:
            xs: (B, F, C, T)
            ilens: (B,)
        Returns:
            hs (torch.Tensor): The hidden vector (B, F, C, T)
            masks: A tuple of the masks. (B, F, C, T)
            ilens: (B,)
        r         r	   g      ?r   N)
length_dim)value)sizepermuterealimag
contiguousviewexpandr!   r&   r   sigmoidmasked_fillr   Fpadappendtuple)
r'   r.   r/   r   Cinput_lengthilens_maskslinearmaskr   r   r   forward   s$   ,"

zMaskEstimator.forward)r	   )__name__
__module____qualname__r   r   r   
LongTensorr   TensorrI   __classcell__r   r   r,   r   r      s    r   )typingr   numpyr   r   torch.nnr   r?   torch_complex.tensorr   *funasr.models.transformer.utils.nets_utilsr   )funasr.models.language_model.rnn.encodersr   r   r   Moduler   r   r   r   r   <module>   s    