o
    i(                     @   s  d dl mZmZ d dlZd dlZd dlZd dlZd dlm	Z	 d dl
m	  mZ d dlmZ G dd de	jZG dd de	jZG dd	 d	e	jZG d
d de	jZG dd de	jZG dd de	jZG dd de	jZ	 eddG dd de	jZeddG dd de	jZdS )    )TupleDictN)tablesc                       $   e Zd Z fddZdd Z  ZS )LinearTransformc                    s0   t t|   || _|| _tj||dd| _d S )NF)bias)superr   __init__	input_dim
output_dimnnLinearlinearselfr
   r   	__class__ \/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/fsmn_vad_streaming/encoder.pyr	      s   zLinearTransform.__init__c                 C      |  |}|S Nr   r   inputoutputr   r   r   forward      
zLinearTransform.forward__name__
__module____qualname__r	   r   __classcell__r   r   r   r   r          r   c                       r   )AffineTransformc                    s,   t t|   || _|| _t||| _d S r   )r   r#   r	   r
   r   r   r   r   r   r   r   r   r	      s   zAffineTransform.__init__c                 C   r   r   r   r   r   r   r   r   #   r   zAffineTransform.forwardr   r   r   r   r   r#      r"   r#   c                       r   )RectifiedLinearc                    s.   t t|   || _t | _td| _d S )Ng?)	r   r$   r	   dimr   ReLUreluDropoutdropoutr   r   r   r   r	   +   s   
zRectifiedLinear.__init__c                 C   r   r   )r'   )r   r   outr   r   r   r   1   s   
zRectifiedLinear.forwardr   r   r   r   r   r$   )   r"   r$   c                       sH   e Zd Z				ddedef fddZddejdejfd	d
Z  ZS )	FSMNBlockN   r
   r   c                    s   t t|   || _|d u rd S || _|| _|| _|| _tj	| j| j|dg|dg| jdd| _
| jdkrItj	| j| j|dg|dg| jdd| _d S d | _d S )Nr,   F)dilationgroupsr   r   )r   r+   r	   r%   lorderrorderlstriderstrider   Conv2d	conv_left
conv_right)r   r
   r   r/   r0   r1   r2   r   r   r   r	   8   s    	

zFSMNBlock.__init__r   cachec           
      C   s   t |d}|dddd}|d ur9||j}t j||fdd}|d d d d | jd  | j d d d f }nt	|dd| jd | j dg}| 
|}|| }| jd urt	|ddd| j| j g}|d d d d | jd d d f }| |}||7 }|dddd}|d}	|	|fS )Nr,   r         r%   )torch	unsqueezepermutetodevicecatr/   r1   Fpadr4   r5   r0   r2   squeeze)
r   r   r6   xx_pery_leftr*   y_rightout_perr   r   r   r   r   X   s"   0 

"

zFSMNBlock.forward)NNr,   r,   r   )	r   r   r    intr	   r:   Tensorr   r!   r   r   r   r   r+   6   s      r+   c                       sZ   e Zd Zdededededededef fdd	Zddejdeeejf fddZ	  Z
S )
BasicBlock
linear_dimproj_dimr/   r0   r1   r2   stack_layerc                    sh   t t|   || _|| _|| _|| _|| _t||| _	t
||||||| _t||| _t||| _d S r   )r   rJ   r	   r/   r0   r1   r2   rM   r   r   r+   
fsmn_blockr#   affiner$   r'   )r   rK   rL   r/   r0   r1   r2   rM   r   r   r   r	   t   s   
zBasicBlock.__init__Nr   r6   c           	      C   s   |  |}|d ur6d| j}||vr)t|jd |jd | jd | j d||< | ||| \}||< n| |d \}}| 	|}| 
|}|S )Nzcache_layer_{}r   r,   )r   formatrM   r:   zerosshaper/   r1   rN   rO   r'   )	r   r   r6   x1cache_layer_namex2_x3x4r   r   r   r      s   
 

zBasicBlock.forwardr   )r   r   r    rH   r	   r:   rI   r   strr   r!   r   r   r   r   rJ   s   s"    (rJ   c                       s2   e Zd Z fddZdejdejfddZ  ZS )BasicBlock_exportc                    s2   t t|   |j| _|j| _|j| _|j| _d S r   )r   r[   r	   r   rN   rO   r'   )r   modelr   r   r   r	      s
   zBasicBlock_export.__init__r   in_cachec                 C   s6   |  |}| ||\}}| |}| |}||fS r   )r   rN   rO   r'   )r   r   r]   rC   	out_cacher   r   r   r      s
   


zBasicBlock_export.forward)r   r   r    r	   r:   rI   r   r!   r   r   r   r   r[      s    
r[   c                       s:   e Zd Z fddZdejdeeejf fddZ  Z	S )	FsmnStackc                    s   t t| j|  d S r   )r   r_   r	   )r   argsr   r   r   r	      s   zFsmnStack.__init__r   r6   c                 C   s"   |}| j  D ]}|||}q|S r   )_modulesvalues)r   r   r6   rC   moduler   r   r   r      s   zFsmnStack.forward)
r   r   r    r	   r:   rI   r   rZ   r   r!   r   r   r   r   r_      s    &r_   encoder_classesFSMNc                       s   e Zd Z	ddededededededed	ed
edededef fddZdd ZdefddZ	ddej	de
eej	f deej	e
eej	f f fddZ  ZS )re   Tr
   input_affine_dimfsmn_layersrK   rL   r/   r0   r1   r2   output_affine_dimr   use_softmaxc                    s   t    || _|| _|| _ | _| _|
| _|| _t	||| _
t	| | _t  | _t fddt|D  | _t	 |
| _t	|
|| _|| _| jrZtjdd| _d S d S )Nc              
      s    g | ]}t  |qS r   )rJ   ).0irK   r/   r1   rL   r0   r2   r   r   
<listcomp>   s    z!FSMN.__init__.<locals>.<listcomp>rP   r9   )r   r	   r
   rf   rg   rK   rL   rh   r   r#   
in_linear1
in_linear2r$   r'   r_   rangefsmnout_linear1out_linear2ri   r   Softmaxsoftmax)r   r
   rf   rg   rK   rL   r/   r0   r1   r2   rh   r   ri   r   rl   r   r	      s,   
zFSMN.__init__c                 C      d S r   r   r   r   r   r   fuse_modules      zFSMN.fuse_modulesreturnc                 C   s   | j S r   )r   rw   r   r   r   output_size   s   zFSMN.output_sizeNr   r6   c           
      C   sV   |  |}| |}| |}| ||}| |}| |}| jr)| |}	|	S |S )a(  
        Args:
            input (torch.Tensor): Input tensor (B, T, D)
            cache: when cache is not None, the forward is in streaming. The type of cache is a dict, egs,
            {'cache_layer_1': torch.Tensor(B, T1, D)}, T1 is equal to self.lorder. It is {} for the 1st frame
        )rn   ro   r'   rq   rr   rs   ri   ru   )
r   r   r6   rT   rV   rX   rY   x5x6x7r   r   r   r      s   





zFSMN.forward)Tr   )r   r   r    rH   boolr	   rx   r{   r:   rI   r   rZ   r   r   r!   r   r   r   r   re      sJ    	
)
FSMNExportc                       s4   e Zd Z fddZdd ZdejfddZ  ZS )r   c                    sr   t    |j| _|j| _|j| _|j| _|j| _|j| _|j| _t	|jD ]\}}t
|tr6t|| j|< q&d S r   )r   r	   rn   ro   r'   rr   rs   ru   rq   	enumerate
isinstancerJ   r[   )r   r\   kwargsrk   dr   r   r   r	     s   

zFSMNExport.__init__c                 C   rv   r   r   rw   r   r   r   rx   8  ry   zFSMNExport.fuse_modulesr   c           	      G   s~   |  |}| |}| |}t }t| jD ]\}}|| }|||\}}|| q| |}| |}| 	|}||fS )a1  
        Args:
            input (torch.Tensor): Input tensor (B, T, D)
            in_cache: when in_cache is not None, the forward is in streaming. The type of in_cache is a dict, egs,
            {'cache_layer_1': torch.Tensor(B, T1, D)}, T1 is equal to self.lorder. It is {} for the 1st frame
        )
rn   ro   r'   listr   rq   appendrr   rs   ru   )	r   r   r`   rC   
out_cachesrk   r   r]   r^   r   r   r   r   ;  s   





zFSMNExport.forward)	r   r   r    r	   rx   r:   rI   r   r!   r   r   r   r   r     s    $)typingr   r   copyosnumpynpr:   torch.nnr   torch.nn.functional
functionalr@   funasr.registerr   Moduler   r#   r$   r+   rJ   r[   
Sequentialr_   registerre   r   r   r   r   r   <module>   s(    ='

J