o
    i5                     @   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mZmZmZmZmZmZ d dlm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)toKaldiMatrixLinearTransformAffineTransformRectifiedLinear	FSMNBlock	FsmnStack
BasicBlock)tablesencoder_classesFSMNMTc                       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def fddZdef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 )r   T	input_diminput_affine_dimfsmn_layers
linear_dimproj_dimlorderrorderlstriderstrideoutput_affine_dim
output_dimoutput_dim2use_softmaxc                       t    || _|| _|| _ | _| _|
| _|| _|| _	t
||| _t
| | _t  | _t fddt|D  | _t
 |
| _t
 |
| _t
|
|| _t
|
|| _|| _| jritjdd| _d S d S )Nc              
          g | ]}t  |qS  r
   .0ir   r   r   r   r   r   r   U/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/fsmn_kws_mt/encoder.py
<listcomp>;        z#FSMNMT.__init__.<locals>.<listcomp>dimsuper__init__r   r   r   r   r   r   r   r   r   
in_linear1
in_linear2r   relur	   rangefsmnout_linear1out_linear1_2out_linear2out_linear2_2r   nnSoftmaxsoftmaxselfr   r   r   r   r   r   r   r   r   r   r   r   r   	__class__r"   r#   r+      .   

zFSMNMT.__init__returnc                 C      | j S Nr   r9   r   r   r#   output_sizeF      zFSMNMT.output_sizec                 C   r>   r?   r   rA   r   r   r#   output_size2I   rC   zFSMNMT.output_size2Ninputcachec                 C   s|   |  |}| |}| |}| ||}| |}| |}| |}	| |	}
| jr:| 	|}| 	|
}||fS ||
f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
        )
r,   r-   r.   r0   r1   r3   r2   r4   r   r7   )r9   rF   rG   x1x2x3x4x5x6x5_2x6_2x7x7_2r   r   r#   forwardL   s   








zFSMNMT.forwardTr?   )__name__
__module____qualname__intboolr+   rB   rE   torchTensorr   strr   rR   __classcell__r   r   r:   r#   r      sN    	
)FSMNMTConvertc                       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def fddZdefddZdefddZdd Zdd Z	dd Z
  ZS )r]   Tr   r   r   r   r   r   r   r   r   r   r   r   r   c                    r   )Nc              
      r   r   r   r   r"   r   r#   r$      r%   z*FSMNMTConvert.__init__.<locals>.<listcomp>r&   r'   r)   r8   r:   r"   r#   r+   l   r<   zFSMNMTConvert.__init__r=   c                 C   r>   r?   r@   rA   r   r   r#   rB      rC   zFSMNMTConvert.output_sizec                 C   r>   r?   rD   rA   r   r   r#   rE      rC   zFSMNMTConvert.output_size2c                 C      d}|d7 }|| j  7 }|| j 7 }|| j 7 }| jD ]}|| 7 }q|| j 7 }|| j 7 }|d| j| jf 7 }|d7 }|S N z<Nnet>
z<Softmax> %d %d
z</Nnet>
)r,   to_kaldi_netr-   r.   r0   r1   r3   r   r9   re_strr0   r   r   r#   ra         
zFSMNMTConvert.to_kaldi_netc                 C   r^   r_   )r,   ra   r-   r.   r0   r2   r4   r   rb   r   r   r#   to_kaldi_net2   rd   zFSMNMTConvert.to_kaldi_net2c                 C   s  t |dddx}t |d}| }| dksJ | j| | j| | j| | jD ]}|| q.| j| | j	| | }| 
 }|d  dksVJ t|d | jksaJ t|d | jkslJ | }| d	ksxJ W d    n1 sw   Y  |  d S )
Nrutf8)encodingz<Nnet>r   z	<Softmax>      z</Nnet>)openreadlinestripr,   to_pytorch_netr-   r.   r0   r1   r3   splitrW   r   close)r9   
kaldi_filefreadnnet_start_liner0   softmax_linesoftmax_splitnnet_end_liner   r   r#   rn      s(   

zFSMNMTConvert.to_pytorch_netrS   )rT   rU   rV   rW   rX   r+   rB   rE   ra   re   rn   r\   r   r   r:   r#   r]   j   sD    	
))typingr   r   copyosnumpynprY   torch.nnr5   torch.nn.functional
functionalFfunasr.models.fsmn_kws.encoderr   r   r   r   r   r	   r
   funasr.registerr   registerModuler   r]   r   r   r   r#   <module>   s    $

N