
    _i8                     r   S SK rS SKrS SKJr  S SKJs  Jr  SSKJ	r	J
r
JrJrJrJr  SrS rS r " S S\R$                  5      r " S	 S
\R$                  5      r " S S\R$                  5      r " S S\R$                  5      r " S S\R$                  5      r " S S\R$                  5      r     SS jrg)    N   )HEADER_BLOCK_SIZEActivationType	LayerTypef32ToI32printNeonMatrixprintNeonVectorFc                     [         R                  " [         R                  [         R                  S9  [	        U 5      nUR                  SS5      nUR                  SS5      nSU-  $ )z{function that transform as str numpy mat to standard kaldi str matrix

Args:
    np_mat:          numpy mat

Returns:  str
)	threshold	linewidth[ ]z[ %s ]
)npset_printoptionsinfnanstrreplace)np_matout_strs     e/var/www/html/land-ocr/venv/lib/python3.13/site-packages/modelscope/models/audio/kws/farfield/fsmn.pyto_kaldi_matrixr      sP     "&&BFF;&kGooc2&Gooc2&G    c                     SnU R                  5       R                  5       R                  5       nU[        U5      -  nUS-  n[	        U5        g)zIprint torch tensor for debug

Args:
    torch_tensor:           a tensor
r   <!EndOfComponent>
N)detachsqueezenumpyr   print)torch_tensorre_strxs      r   print_tensorr$      sJ     F%%'--/A
oa  F
##F	&Mr   c                   :   ^  \ rS rSrU 4S jrS rS rS rSrU =r	$ )LinearTransform*   c                    > [         [        U ]  5         Xl        X l        [
        R                  " XSS9U l        SU l        S U l	        g )NF)bias)
superr&   __init__	input_dim
output_dimnnLinearlineardebugdataoutselfr,   r-   	__class__s      r   r+   LinearTransform.__init__,   s:    ot-/"$ii	EB
r   c                 V    U R                  U5      nU R                  (       a  X l        U$ Nr0   r1   r2   r4   inputoutputs      r   forwardLinearTransform.forward5   !    U#::!Lr   c                 B    [        U R                  R                  5        g r8   )r   r0   weightr4   s    r   print_modelLinearTransform.print_model=   s    **+r   c                     SnUSU R                   U R                  4-  -  nUS-  nU R                  5       S   nUR                  5       R	                  5       nU[        U5      -  nUS-  nU$ )Nr   z<LinearTransform> %d %d
z<LearnRateCoef> 1
linear.weightr   r-   r,   
state_dictr   r   r   )r4   r"   linear_weightsr#   s       r   to_kaldi_nnetLinearTransform.to_kaldi_nnet@   s    -151A A 	A''*?;""$**,/!$$''r   r2   r1   r,   r0   r-   
__name__
__module____qualname____firstlineno__r+   r=   rC   rJ   __static_attributes____classcell__r5   s   @r   r&   r&   *   s    , r   r&   c                   :   ^  \ rS rSrU 4S jrS rS rS rSrU =r	$ )AffineTransformN   c                    > [         [        U ]  5         Xl        X l        [
        R                  " X5      U l        SU l        S U l	        g )NF)
r*   rV   r+   r,   r-   r.   r/   r0   r1   r2   r3   s      r   r+   AffineTransform.__init__P   s8    ot-/"$ii	6
r   c                 V    U R                  U5      nU R                  (       a  X l        U$ r8   r9   r:   s      r   r=   AffineTransform.forwardZ   r?   r   c                     [        U R                  R                  5        [        U R                  R                  5        g r8   )r   r0   rA   r	   r)   rB   s    r   rC   AffineTransform.print_modelb   s&    **+(()r   c                 V   SnUSU R                   U R                  4-  -  nUS-  nU R                  5       S   nUR                  5       R	                  5       nU[        U5      -  nU R                  5       S   nUR                  5       R	                  5       nU[        U5      -  nUS-  nU$ )Nr   z<AffineTransform> %d %d
z4<LearnRateCoef> 1 <BiasLearnRateCoef> 1 <MaxNorm> 0
rF   zlinear.biasr   rG   )r4   r"   rI   r#   linear_biass        r   rJ   AffineTransform.to_kaldi_nnetf   s    -151A A 	AII*?;""$**,/!$$oo'6!'')/!$$''r   rL   rM   rT   s   @r   rV   rV   N   s    * r   rV   c                   J   ^  \ rS rSrSr    SU 4S jjrS rS rS rSr	U =r
$ )	Fsmnx   z
FSMN implementation.
c           	        > [         [        U ]  5         Xl        Uc  g X0l        X@l        XPl        X`l        [        R                  " U R                  U R                  US4US4U R                  SS9U l
        US:  aA  [        R                  " U R                  U R                  US4US4U R                  SS9U l        OS U l        SU l        S U l        g )Nr   Fdilationgroupsr)   r   )r*   rb   r+   dimlorderrorderlstriderstrider.   Conv2d	conv_left
conv_rightr1   r2   )r4   r,   r-   ri   rj   rk   rl   r5   s          r   r+   Fsmn.__init__}   s     	dD"$>HHHHvqkq\88 A: ii61+!1xxDO #DO
r   c                 d   [         R                  " US5      nUR                  SSSS5      n[        R                  " USSU R
                  S-
  U R                  -  S/5      nU R                  bs  [        R                  " USSSU R                  U R                  -  /5      nUS S 2S S 2U R                  S 2S S 24   nX0R                  U5      -   U R                  U5      -   nOX0R                  U5      -   nUR                  SSSS5      nUR                  S5      nU R                  (       a  Xl        U$ Nr   r         )torch	unsqueezepermuteFpadri   rk   ro   rj   rl   rn   r   r1   r2   )	r4   r;   r#   x_pery_lefty_rightoutout1r<   s	            r   r=   Fsmn.forward   s    OOE1%		!Q1%uq!dkkAo%EqIJ??&eeEAq!dkkT\\-I#JKGaDLLM145G..004??73KKC..00C{{1aA&a::!Lr   c                 (   U R                   R                  n[        R                  " UR                  S   UR                  S   5      n[        UR                  S   5       H  nXSS S 2S4   US S 2U4'   M     [        U5        U R                  b  U R                  R                  n[        R                  " UR                  S   UR                  S   5      n[        UR                  S   5       H  nXSS S 2S4   US S 2U4'   M     [        U5        g g Nrt   r   )rn   rA   ru   zerosshaperanger   ro   r4   tmpwtmpwmjs       r   rC   Fsmn.print_model   s    ~~$$DJJqM4::a=9tzz!}%A!Qz*E!Q$K & 	??&??))DKK

1tzz!}=E4::a=)"aA:.ad * E" 'r   c                     SnUSU R                   U R                   4-  -  nUSSU R                  U R                  U R                  U R                  4-  -  nU R                  5       S   n[        R                  " UR                  5       R                  5       R                  5      nU[        U5      -  nU R                  bN  U R                  5       S   nUR                  5       R                  5       R                  nU[        U5      -  nUS-  nU$ )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   )rh   ri   rj   rk   rl   rH   r   flipudr   r   Tr   ro   )r4   r"   lfitersr#   rfiterss        r   rJ   Fsmn.to_kaldi_nnet   s    "dhh%999ft{{DKKt||jE E 	E //#$67IIgoo'--/112/!$$??&oo'(;<G"((*,,Aoa((F++Fr   )	rn   ro   r2   r1   rh   ri   rk   rj   rl   )NNNN)rN   rO   rP   rQ   __doc__r+   r=   rC   rJ   rR   rS   rT   s   @r   rb   rb   x   s0     %N*#  r   rb   c                   4   ^  \ rS rSrU 4S jrS rS rSrU =r$ )RectifiedLinear   c                 j   > [         [        U ]  5         Xl        [        R
                  " 5       U l        g r8   )r*   r   r+   rh   r.   ReLUrelur3   s      r   r+   RectifiedLinear.__init__   s"    ot-/GGI	r   c                 $    U R                  U5      $ r8   )r   )r4   r;   s     r   r=   RectifiedLinear.forward   s    yyr   c                 P    SnUSU R                   U R                   4-  -  nUS-  nU$ )Nr   z<RectifiedLinear> %d %d
r   )rh   )r4   r"   s     r   rJ   RectifiedLinear.to_kaldi_nnet   s4    -4880DDD''r   )rh   r   )	rN   rO   rP   rQ   r+   r=   rJ   rR   rS   rT   s   @r   r   r      s    
  r   r   c                   t   ^  \ rS rSrSr       S
U 4S jjr\     SS j5       rS rS r	S r
S rS	rU =r$ )FSMNNet   z
FSMN net for keyword spotting
c                   > [         [        U ]  5         Xl        X l        X0l        X@l        XPl        X`l        Xpl	        [        X5      U l        [        X"5      U l        U R                  X#XEU5      U l        [        X&5      U l        g)aZ  
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*   r   r+   r,   
linear_dimproj_dimri   rj   num_synfsmn_layersrV   linear1r   r   _build_repeatsfsmnlinear2)	r4   r,   r   r   ri   rj   r   r   r5   s	           r   r+   FSMNNet.__init__   su    $ 	gt%'"$ &&y=#J;	''
f(35	 'z;r   c                     [        U5       Vs/ s HC  n[        R                  " [        X5      [	        XX#SS5      [        X5      [        X 5      5      PME     nn[        R                  " U6 $ s  snf )Nr   )r   r.   
Sequentialr&   rb   rV   r   r   r   ri   rj   r   irepeatss          r   r   FSMNNet._build_repeats  sr     ;'
 ( MM
5XA>5
7	9
 ( 	 
 }}g&&
s   A
A-c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU$ r8   )r   r   r   r   )r4   r;   x1x2x3x4s         r   r=   FSMNNet.forward'  s=    \\% YYr]YYr]\\"	r   c                    U R                   R                  5         U R                   H<  nUS   R                  5         US   R                  5         US   R                  5         M>     U R                  R                  5         g )Nr   r   rt   )r   rC   r   r   )r4   layers     r   rC   FSMNNet.print_model.  sb      "YYE!H  "!H  "!H  " 
 	  "r   c                     S/[         -  S-  nSUS'   SUS'   U R                  US'   U R                  US'   SUS'   Sn[        [        R
                  R                  5      U[         U-  S-   '   SU[         U-  S-   '   U R                  U[         U-  S-   '   U R                  U[         U-  S-   '   SU[         U-  S-   '   [        [        R                  R                  5      U[         U-  S-   '   US-  n[        [        R                  R                  5      U[         U-  S-   '   SU[         U-  S-   '   U R                  U[         U-  S-   '   U R                  U[         U-  S-   '   U R                  U[         U-  S-   '   U R                  U[         U-  S-   '   U R                  U[         U-  S	-   '   S
U[         U-  S-   '   US-  n[        [        R
                  R                  5      U[         U-  S-   '   SU[         U-  S-   '   U R                  U[         U-  S-   '   U R                  U[         U-  S-   '   SU[         U-  S-   '   [        [        R                  R                  5      U[         U-  S-   '   U H  n[!        [#        U5      5        M     g )Ng           r   r   rt   rs   g      ?      g         )r   r,   r   floatr   LAYER_DENSEvaluer   r   ACTIVATION_RELULAYER_SEQUENTIAL_FSMNr   ri   rj   r   ACTIVATION_SOFTMAXr    r   )r4   headerhidxhs       r   print_headerFSMNNet.print_header8  s    **Q.q	q	NNq	LLq	q	
 /4!!''0) 4'!+,/2 4'!+,/3~~ 4'!+,/3 4'!+,/2 4'!+,/4**0002 4'!+,	/4++1103 4'!+,/2 4'!+,/3 4'!+,/3}} 4'!+,/3{{ 4'!+,/3{{ 4'!+,/3/?/? 4'!+,/3 4'!+,	/4!!''0) 4'!+,/2 4'!+,/3 4'!+,/3|| 4'!+,/2 4'!+,/4--3305 4'!+, A(1+ r   c                    SnUS-  nXR                   R                  5       -  nXR                  R                  5       -  nU R                   HW  nXS   R                  5       -  nXS   R                  5       -  nXS   R                  5       -  nXS   R                  5       -  nMY     XR                  R                  5       -  nUSU R
                  U R
                  4-  -  nUS-  nUS	-  nU$ )
Nr   z<Nnet>
r   r   rt   rs   z<Softmax> %d %d
r   z</Nnet>
)r   rJ   r   r   r   r   )r4   r"   r   s      r   rJ   FSMNNet.to_kaldi_nnetn  s    *,,,,..))))++IID1g++--F1g++--F1g++--F1g++--F	  	,,,,..%t||(DDD''+r   )r   r   r,   r   r   r   ri   r   r   r   rj   )      r   
   r   r   r   )   D   rs   rt   r   )rN   rO   rP   rQ   r   r+   staticmethodr   r=   rC   r   rJ   rR   rS   rT   s   @r   r   r      sb    
 "<H "% "#$	' ' #4l r   r   c                   H   ^  \ rS rSrSr      SU 4S jjrS rS rSrU =r	$ )DFSMNi  z
One deep fsmn layer
c           	      :  > [         [        U ]  5         X0l        X@l        XPl        X`l        [        X5      U l        [        X!5      U l
        [        R                  " UXS4US4USS9U l        US:  a"  [        R                  " UXS4US4USS9U l        gSU l        g)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   Fre   r   N)r*   r   r+   ri   rj   rk   rl   rV   expandr&   shrinkr.   rm   rn   ro   )r4   dimproj	dimlinearri   rj   rk   rl   r5   s          r   r+   DFSMN.__init__  s      	eT#%%g9%i9a[q\ A: ii!!1DO #DOr   c                    [         R                  " U R                  U5      5      nU R                  U5      n[        R
                  " US5      nUR                  SSSS5      n[         R                  " USSU R                  S-
  U R                  -  S/5      nU R                  bs  [         R                  " USSSU R                  U R                  -  /5      nUS S 2S S 2U R                  S 2S S 24   nXPR                  U5      -   U R                  U5      -   nOXPR                  U5      -   nUR                  SSSS5      n	XR                  S5      -   n
U
$ rr   )rx   r   r   r   ru   rv   rw   ry   ri   rk   ro   rj   rl   rn   r   )r4   r;   f1p1r#   rz   r{   r|   r}   r~   r<   s              r   r=   DFSMN.forward  s   VVDKK&'[[_OOB"		!Q1%uq!dkkAo%EqIJ??&eeEAq!dkkT\\-I#JKGaDLLM145G..004??73KKC..00C{{1aA&a(r   c                    U R                   R                  5         U R                  R                  5         U R                  R                  n[
        R                  " UR                  S   UR                  S   5      n[        UR                  S   5       H  nXSS S 2S4   US S 2U4'   M     [        U5        U R                  b  U R                  R                  n[
        R                  " UR                  S   UR                  S   5      n[        UR                  S   5       H  nXSS S 2S4   US S 2U4'   M     [        U5        g g r   )r   rC   r   rn   rA   ru   r   r   r   r   ro   r   s       r   rC   DFSMN.print_model  s   !!~~$$DJJqM4::a=9tzz!}%A!Qz*E!Q$K & 	??&??))DKK

1tzz!}=E4::a=)"aA:.ad * E" 'r   )rn   ro   r   ri   rk   rj   rl   r   )@   r      r   r   r   )
rN   rO   rP   rQ   r   r+   r=   rC   rR   rS   rT   s   @r   r   r     s1    
 )#V*# #r   r   c                     [        U5       Vs/ s H%  n[        R                  " [        XX#SS5      5      PM'     nn[        R                  " U6 $ s  snf )zt
build stacked dfsmn layers
Args:
    linear_dim:
    proj_dim:
    lorder:
    rorder:
    fsmn_layers:

Returns:

r   )r   r.   r   r   r   s          r   build_dfsmn_repeatsr     sS    & {##A 	eH&!QGH#  
 =='""s   ,A)r   r   r   r   r   )r   r   ru   torch.nnr.   torch.nn.functional
functionalrx   	model_defr   r   r   r   r   r	   DEBUGr   r$   Moduler&   rV   rb   r   r   r   r    r   r   <module>r      s        : : 	 
!bii !H'bii 'Ta299 aHbii "Rbii RjV#BII V#r $'!#! $%	#r   