o
    )Îj8  ã                   @   sæ   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 dZdd„ Zdd„ 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					ddd„ZdS )é    Né   )ÚHEADER_BLOCK_SIZEÚActivationTypeÚ	LayerTypeÚf32ToI32ÚprintNeonMatrixÚprintNeonVectorFc                 C   s:   t jt jt jd t| ƒ}| dd¡}| dd¡}d| S )z˜ function that transform as str numpy mat to standard kaldi str matrix

        Args:
            np_mat:          numpy mat

        Returns:  str
    )Ú	thresholdZ	linewidthú[Ú ú]z[ %s ]
)ÚnpZset_printoptionsÚinfÚnanÚstrÚreplace)Znp_matZout_str© r   új/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/audio/kws/farfield/fsmn.pyÚto_kaldi_matrix   s
   r   c                 C   s4   d}|   ¡  ¡  ¡ }|t|ƒ7 }|d7 }t|ƒ dS )zV print torch tensor for debug

    Args:
        torch_tensor:           a tensor
    r   ú<!EndOfComponent>
N)ÚdetachÚsqueezeÚnumpyr   Úprint)Ztorch_tensorÚre_strÚxr   r   r   Úprint_tensor   s
   r   c                       ó4   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	ÚLinearTransformc                    s<   t t| ƒ ¡  || _|| _tj||dd| _d| _d | _	d S )NF)Úbias)
Úsuperr   Ú__init__Ú	input_dimÚ
output_dimÚnnÚLinearÚlinearÚdebugÚdataout©Úselfr"   r#   ©Ú	__class__r   r   r!   ,   s   
zLinearTransform.__init__c                 C   ó   |   |¡}| jr|| _|S ©N©r&   r'   r(   ©r*   ÚinputÚoutputr   r   r   Úforward5   ó   
zLinearTransform.forwardc                 C   s   t | jjƒ d S r.   )r   r&   Úweight©r*   r   r   r   Úprint_model=   s   zLinearTransform.print_modelc                 C   sP   d}|d| j | jf 7 }|d7 }|  ¡ d }| ¡  ¡ }|t|ƒ7 }|d7 }|S )Nr   z<LinearTransform> %d %d
z<LearnRateCoef> 1
úlinear.weightr   ©r#   r"   Ú
state_dictr   r   r   )r*   r   Úlinear_weightsr   r   r   r   Úto_kaldi_nnet@   s   ÿzLinearTransform.to_kaldi_nnet©Ú__name__Ú
__module__Ú__qualname__r!   r3   r7   r<   Ú__classcell__r   r   r+   r   r   *   s
    	r   c                       r   )	ÚAffineTransformc                    s8   t t| ƒ ¡  || _|| _t ||¡| _d| _d | _	d S )NF)
r    rB   r!   r"   r#   r$   r%   r&   r'   r(   r)   r+   r   r   r!   P   s   
zAffineTransform.__init__c                 C   r-   r.   r/   r0   r   r   r   r3   Z   r4   zAffineTransform.forwardc                 C   s   t | jjƒ t| jjƒ d S r.   )r   r&   r5   r   r   r6   r   r   r   r7   b   s   zAffineTransform.print_modelc                 C   st   d}|d| j | jf 7 }|d7 }|  ¡ d }| ¡  ¡ }|t|ƒ7 }|  ¡ d }| ¡  ¡ }|t|ƒ7 }|d7 }|S )Nr   z<AffineTransform> %d %d
z4<LearnRateCoef> 1 <BiasLearnRateCoef> 1 <MaxNorm> 0
r8   zlinear.biasr   r9   )r*   r   r;   r   Zlinear_biasr   r   r   r<   f   s   ÿzAffineTransform.to_kaldi_nnetr=   r   r   r+   r   rB   N   s
    
rB   c                       sB   e Zd ZdZ				d‡ fdd„	Zdd„ Zdd„ Zd	d
„ Z‡  ZS )ÚFsmnz
    FSMN implementation.
    Nc                    s¤   t t| ƒ ¡  || _|d u rd S || _|| _|| _|| _tj	| j| j|df|df| jdd| _
|dkrGtj	| j| j|df|df| jdd| _nd | _d| _d | _d S )Nr   F©ZdilationÚgroupsr   r   )r    rC   r!   ÚdimÚlorderÚrorderÚlstrideÚrstrider$   ÚConv2dÚ	conv_leftÚ
conv_rightr'   r(   )r*   r"   r#   rG   rH   rI   rJ   r+   r   r   r!   }   s4   
û

û
zFsmn.__init__c           	      C   sÖ   t  |d¡}| dddd¡}t |dd| jd | j dg¡}| jd urOt |ddd| j| j	 g¡}|d d …d d …| j	d …d d …f }||  
|¡ |  |¡ }n||  
|¡ }| dddd¡}| d¡}| jri|| _|S ©Nr   r   é   é   )ÚtorchÚ	unsqueezeÚpermuteÚFÚpadrG   rI   rM   rH   rJ   rL   r   r'   r(   )	r*   r1   r   Úx_perÚy_leftÚy_rightÚoutÚout1r2   r   r   r   r3   ¤   s    
"
zFsmn.forwardc                 C   sÊ   | j j}t |jd |jd ¡}t|jd ƒD ]}||dd d …df |d d …|f< qt|ƒ | jd urc| jj}t |jd |jd ¡}t|jd ƒD ]}||dd d …df |d d …|f< qJt|ƒ d S d S ©NrP   r   )rL   r5   rQ   ÚzerosÚshapeÚranger   rM   ©r*   ZtmpwZtmpwmÚjr   r   r   r7   ¹   s   "
"úzFsmn.print_modelc                 C   sž   d}|d| j | j f 7 }|dd| j| j| j| jf 7 }|  ¡ d }t | ¡  	¡ j
¡}|t|ƒ7 }| jd urM|  ¡ d }| ¡  	¡ j
}|t|ƒ7 }|d7 }|S )Nr   z<Fsmn> %d %d
zQ<LearnRateCoef> %d <LOrder> %d <ROrder> %d <LStride> %d <RStride> %d <MaxNorm> 0
r   zconv_left.weightzconv_right.weightr   )rF   rG   rH   rI   rJ   r:   r   Zflipudr   r   ÚTr   rM   )r*   r   Zlfitersr   Zrfitersr   r   r   r<   É   s   ÿ
zFsmn.to_kaldi_nnet)NNNN)	r>   r?   r@   Ú__doc__r!   r3   r7   r<   rA   r   r   r+   r   rC   x   s    ú'rC   c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚRectifiedLinearc                    s"   t t| ƒ ¡  || _t ¡ | _d S r.   )r    rc   r!   rF   r$   ZReLUÚrelur)   r+   r   r   r!   Þ   s   zRectifiedLinear.__init__c                 C   s
   |   |¡S r.   )rd   )r*   r1   r   r   r   r3   ã   s   
zRectifiedLinear.forwardc                 C   s$   d}|d| j | j f 7 }|d7 }|S )Nr   z<RectifiedLinear> %d %d
r   )rF   )r*   r   r   r   r   r<   æ   s   zRectifiedLinear.to_kaldi_nnet)r>   r?   r@   r!   r3   r<   rA   r   r   r+   r   rc   Ü   s    rc   c                       sh   e Zd ZdZ							d‡ fdd	„	Ze	
				ddd„ƒZdd„ Zdd„ Zdd„ Z	dd„ Z
‡  ZS )ÚFSMNNetz'
    FSMN net for keyword spotting
    éÈ   é€   é
   r   é   é   c                    st   t t| ƒ ¡  || _|| _|| _|| _|| _|| _|| _	t
||ƒ| _t||ƒ| _|  |||||¡| _t
||ƒ| _dS )a¢  
        Args:
            input_dim:              input dimension
            linear_dim:             fsmn input dimension
            proj_dim:               fsmn projection dimension
            lorder:                 fsmn left order
            rorder:                 fsmn right order
            num_syn:                output dimension
            fsmn_layers:            no. of sequential fsmn layers
        N)r    re   r!   r"   Ú
linear_dimÚproj_dimrG   rH   Únum_synÚfsmn_layersrB   Úlinear1rc   rd   Ú_build_repeatsÚfsmnÚlinear2)r*   r"   rk   rl   rG   rH   rm   rn   r+   r   r   r!   ò   s   ÿzFSMNNet.__init__éˆ   éD   rO   rP   c                    ó&   ‡ ‡‡‡fdd„t |ƒD ƒ}tj|Ž S )Nc                    s<   g | ]}t  tˆ ˆƒtˆˆˆˆd d ƒtˆˆ ƒtˆ ˆ ƒ¡‘qS ©r   )r$   Ú
Sequentialr   rC   rB   rc   ©Ú.0Úi©rk   rG   rl   rH   r   r   Ú
<listcomp>  s    ûüÿz*FSMNNet._build_repeats.<locals>.<listcomp>©r^   r$   rw   ©rk   rl   rG   rH   rn   Zrepeatsr   r{   r   rp     s   ú
	zFSMNNet._build_repeatsc                 C   s,   |   |¡}|  |¡}|  |¡}|  |¡}|S r.   )ro   rd   rq   rr   )r*   r1   Úx1Zx2Zx3Zx4r   r   r   r3   '  s
   



zFSMNNet.forwardc                 C   sH   | j  ¡  | jD ]}|d  ¡  |d  ¡  |d  ¡  q| j ¡  d S )Nr   r   rP   )ro   r7   rq   rr   )r*   Úlayerr   r   r   r7   .  s   

zFSMNNet.print_modelc                 C   sâ  dgt  d }d|d< d|d< | j|d< | j|d< d|d< d}ttjjƒ|t | d < d|t | d < | j|t | d < | j|t | d < d|t | d < ttj	jƒ|t | d < |d7 }ttj
jƒ|t | d < d|t | d < | j|t | d < | j|t | d < | j|t | d < | j|t | d < | j|t | d	 < d
|t | d < |d7 }ttjjƒ|t | d < d|t | d < | j|t | d < | j|t | d < d|t | d < ttjjƒ|t | d < |D ]}tt|ƒƒ qæd S )Ng        rj   r   r   rP   rO   g      ð?ri   é   g      ð¿é   )r   r"   rm   Úfloatr   ZLAYER_DENSEÚvaluerk   r   ZACTIVATION_RELUZLAYER_SEQUENTIAL_FSMNrl   rG   rH   rn   ZACTIVATION_SOFTMAXr   r   )r*   ÚheaderZhidxÚhr   r   r   Úprint_header8  sT   

ÿÿÿÿÿÿzFSMNNet.print_headerc                 C   sª   d}|d7 }|| j  ¡ 7 }|| j ¡ 7 }| jD ]"}||d  ¡ 7 }||d  ¡ 7 }||d  ¡ 7 }||d  ¡ 7 }q|| j ¡ 7 }|d| j| jf 7 }|d7 }|d	7 }|S )
Nr   z<Nnet>
r   r   rP   rO   z<Softmax> %d %d
r   z</Nnet>
)ro   r<   rd   rq   rr   rm   )r*   r   rq   r   r   r   r<   n  s   
zFSMNNet.to_kaldi_nnet)rf   rg   rg   rh   r   ri   rj   )rs   rt   rO   rP   ri   )r>   r?   r@   rb   r!   Ústaticmethodrp   r3   r7   r‡   r<   rA   r   r   r+   r   re   í   s*    ù$ü
6re   c                       s>   e Zd ZdZ						d‡ fdd„	Zdd	„ Zd
d„ Z‡  ZS )ÚDFSMNz
    One deep fsmn layer
    é@   rg   é   r   c                    s”   t t| ƒ ¡  || _|| _|| _|| _t||ƒ| _t	||ƒ| _
tj|||df|df|dd| _|dkrEtj|||df|df|dd| _dS d| _dS )a|  
        Args:
            dimproj:                projection dimension, input and output dimension of memory blocks
            dimlinear:              dimension of mapping layer
            lorder:                 left order
            rorder:                 right order
            lstride:                left stride
            rstride:                right stride
        r   FrD   r   N)r    r‰   r!   rG   rH   rI   rJ   rB   Úexpandr   Úshrinkr$   rK   rL   rM   )r*   ZdimprojZ	dimlinearrG   rH   rI   rJ   r+   r   r   r!   ‡  s.   ûû
zDFSMN.__init__c                 C   sè   t  |  |¡¡}|  |¡}t |d¡}| dddd¡}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 }||  |¡ |  
|¡ }n||  |¡ }| dddd¡}	||	 d¡ }
|
S rN   )rT   rd   rŒ   r   rQ   rR   rS   rU   rG   rI   rM   rH   rJ   rL   r   )r*   r1   Úf1Úp1r   rV   rW   rX   rY   rZ   r2   r   r   r   r3   ²  s   
 
"zDFSMN.forwardc                 C   sÞ   | j  ¡  | j ¡  | jj}t |jd |jd ¡}t|jd ƒD ]}||dd d …df |d d …|f< q!t	|ƒ | j
d urm| j
j}t |jd |jd ¡}t|jd ƒD ]}||dd d …df |d d …|f< qTt	|ƒ d S d S r[   )rŒ   r7   r   rL   r5   rQ   r\   r]   r^   r   rM   r_   r   r   r   r7   Ç  s   

"
"úzDFSMN.print_model)rŠ   rg   r‹   r   r   r   )r>   r?   r@   rb   r!   r3   r7   rA   r   r   r+   r   r‰   ‚  s    ú+r‰   rg   rŠ   r‹   r   c                    ru   )z˜
    build stacked dfsmn layers
    Args:
        linear_dim:
        proj_dim:
        lorder:
        rorder:
        fsmn_layers:

    Returns:

    c                    s$   g | ]}t  tˆˆ ˆˆd d ƒ¡‘qS rv   )r$   rw   r‰   rx   r{   r   r   r|   ì  s    ÿÿz'build_dfsmn_repeats.<locals>.<listcomp>r}   r~   r   r{   r   Úbuild_dfsmn_repeatsÛ  s   þ
r   )rg   rŠ   r‹   r   r   )r   r   rQ   Ztorch.nnr$   Ztorch.nn.functionalZ
functionalrT   Z	model_defr   r   r   r   r   r   ÚDEBUGr   r   ÚModuler   rB   rC   rc   re   r‰   r   r   r   r   r   Ú<module>   s*    $*d Yü