
    _iXD                        S r SSKJr  SSKrSSKrSSKJr  SSKJs  J	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\S\S\S\S\4
S jjr " S S\R                  5      r\S:X  a  \" SSSSSSSSSSS5      r\" \5        \" S  \R3                  5        5       5      r\" S!R7                  \5      5        \R8                  " SS"S5      r\" \5      u  rr\" S#R7                  \R@                  5      5        \" S$R7                  \R@                  5      5        \" \RC                  5       5        gg)&z8
FSMN implementation.

Copyright: 2022-03-09 yueyue.nyy
    )TupleNc                     [         R                  " [         R                  [         R                  S9  [	        U 5      nUR                  SS5      nUR                  SS5      nSU-  $ )N)	threshold	linewidth[ ]z[ %s ]
)npset_printoptionsinfnanstrreplace)np_matout_strs     f/var/www/html/land-ocr/venv/lib/python3.13/site-packages/modelscope/models/audio/kws/nearfield/fsmn.pytoKaldiMatrixr      sN    "&&BFF;&kGooc2&Gooc2&G    c                     SnU R                  5       R                  5       R                  5       nU[        U5      -  n[	        U5        g )Nr   )detachsqueezenumpyr   print)torch_tensorre_strxs      r   printTensorr      s=    F%%'--/A
mA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        [        R                  R                  5       U l        [        R                  R                  5       U l        g )NF)bias)superr   __init__	input_dim
output_dimnnLinearlineartorchquantization	QuantStubquantDeQuantStubdequantselfr%   r&   	__class__s      r   r$   LinearTransform.__init__!   sX    ot-/"$ii	EB''113
))557r   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ Nr-   r)   r/   r1   inputoutputs      r   forwardLinearTransform.forward)   1    E"V$f%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$ )Nr   z<LinearTransform> %d %d
z<LearnRateCoef> 1
linear.weightr&   r%   
state_dictr   r   r   )r1   r   linear_weightsr   s       r   to_kaldi_netLinearTransform.to_kaldi_net0   sw    -151A A 	A''*?;""$**,-"" r   c           	         UR                  5       nUR                  5       R                  5       n[        U5      S:X  d   eUS   S:X  d   e[	        US   5      U l        [	        US   5      U l        UR                  5       nUR                  S5      S:w  d   eU R                  R                  5         [        R                  " U R
                  U R                  4[        R                  S9n[        U R
                  5       H  nUR                  5       nUR                  5       R                  S	5      R                  5       R                  5       n[        U5      U R                  :X  d   e[        R                  " U V	s/ s H  n	[        U	5      PM     sn	[        R                  S9n
XUS S 24'   M     XPR                  R                   l        g s  sn	f )
N   r   z<LinearTransform>      LearnRateCoefdtype[])readlinestripsplitlenintr&   r%   findr)   reset_parametersr*   zerosfloat32rangetensorfloatweightdata)r1   freadlinear_linelinear_splitlearn_rate_linenew_weightsilinesplitsitemcolss              r   to_pytorch_netLinearTransform.to_pytorch_net=   sq   nn&"((*002< A%%%A"5555l1o.\!_-..*##O4:::$$& kk4??DNN"C(-7t'A>>#DZZ\''-335;;=Fv;$..000<< @t @&+mm5D $1 ( #.	 !As   =G
r/   r%   r)   r&   r-   
__name__
__module____qualname____firstlineno__r$   r:   rB   re   __static_attributes____classcell__r2   s   @r   r   r      s    8. .r   r   c                   :   ^  \ rS rSrU 4S jrS rS rS rSrU =r	$ )AffineTransformY   c                   > [         [        U ]  5         Xl        X l        [
        R                  " X5      U l        [        R                  R                  5       U l        [        R                  R                  5       U l        g r5   )r#   rq   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   s      r   r$   AffineTransform.__init__[   sV    ot-/"$ii	6''113
))557r   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ r5   r6   r7   s      r   r:   AffineTransform.forwardd   r<   r   c                 L   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$ )Nr   z<AffineTransform> %d %d
z4<LearnRateCoef> 1 <BiasLearnRateCoef> 1 <MaxNorm> 0
r>   zlinear.biasr?   )r1   r   rA   r   linear_biass        r   rB   AffineTransform.to_kaldi_netk   s    -151A A 	AII*?;""$**,-""oo'6!'')-"" r   c           	      p   UR                  5       nUR                  5       R                  5       n[        U5      S:X  d   eUS   S:X  d   e[	        US   5      U l        [	        US   5      U l        [        SU R
                  U R                  4-  5        UR                  5       nUR                  S5      S:w  d   eU R                  R                  5         [        R                  " U R
                  U R                  4[        R                  S	9n[        U R
                  5       H  nUR                  5       nUR                  5       R                  S
5      R                  5       R                  5       n[        U5      U R                  :X  d   e[        R                  " U V	s/ s H  n	[!        U	5      PM     sn	[        R                  S	9n
XUS S 24'   M     XPR                  R"                  l        UR                  5       nUR                  5       R                  S
5      R                  5       R                  5       n[        U5      U R
                  :X  d   e[        R                  " U V	s/ s H  n	[!        U	5      PM     sn	[        R                  S	9nXR                  R&                  l        g s  sn	f s  sn	f )NrE   r   z<AffineTransform>rF   rG   z'AffineTransform output/input dim: %d %drH   rI   rJ   rL   )rM   rN   rO   rP   rQ   r&   r%   r   rR   r)   rS   r*   rT   rU   rV   rW   rX   rY   rZ   r"   )r1   r[   affine_lineaffine_splitr^   r_   r`   ra   rb   rc   rd   	bias_linenew_biass                r   re   AffineTransform.to_pytorch_net|   s"   nn&"((*002< A%%%A"5555l1o.\!_-7/0 	1  ..*##O4::: 	$$&kk4??DNN"C(-7t'A>>#DZZ\''-335;;=Fv;$..000<< @t @&+mm5D $1 ( #. NN$	"((.446<<>6{doo---<< @t @&+mm5 !) !A !As   !J.
*J3rg   rh   ro   s   @r   rq   rq   Y   s    8"%) %)r   rq   c                   R   ^  \ rS rSr    S	S\S\4U 4S jjjrS rS rS rSr	U =r
$ )
	FSMNBlock   r%   r&   c           	        > [         [        U ]  5         Xl        Uc  g X0l        X@l        XPl        X`l        [        R                  " U R                  U R                  US/US/U R                  SS9U l
        US:  aA  [        R                  " U R                  U R                  US/US/U R                  SS9U l        OS U l        [        R                  R                  5       U l        [        R                  R!                  5       U l        g )NrF   F)dilationgroupsr"   r   )r#   r   r$   dimlorderrorderlstriderstrider'   Conv2d	conv_left
conv_rightr*   r+   r,   r-   r.   r/   )r1   r%   r&   r   r   r   r   r2   s          r   r$   FSMNBlock.__init__   s     	i')>HHHHvqkq\88 A: ii61+!1xxDO #DO''113
))557r   c                    [         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                  U5      nU R                  U5      nU R                  U5      nX4-   nU R                  b  [        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U R                  U5      nU R                  U5      nU R                  U5      nXV-  nUR                  SSSS5      nUR                  S5      nU$ )NrF   r   rE   rG   )r*   	unsqueezepermuteFpadr   r   r-   r   r/   r   r   r   r   )	r1   r8   r   x_pery_leftouty_rightout_perr9   s	            r   r:   FSMNBlock.forward   s"   OOE1%		!Q1%uq!dkkAo%EqIJF#'f%n??&eeEAq!dkkT\\-I#JKGaDLLM145Gjj)Goog.Gll7+GNC++aAq)#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                  bI  U R                  5       S   nUR                  5       R                  5       R                  nU[        U5      -  nU$ )Nr   z<Fsmn> %d %d
zQ<LearnRateCoef> %d <LOrder> %d <ROrder> %d <LStride> %d <RStride> %d <MaxNorm> 0
rF   zconv_left.weightzconv_right.weight)r   r   r   r   r   r@   r
   flipudr   r   Tr   r   )r1   r   lfitersr   rfiterss        r   rB   FSMNBlock.to_kaldi_net   s    "dhh%999ft{{DKKt||jE E 	E //#$67IIgoo'--/112-""??&oo'(;<G"((*,,AmA&&F r   c           	         UR                  5       nUR                  5       R                  5       n[        U5      S:X  d   eUS   S:X  d   e[	        US   5      U l        UR                  5       nUR                  5       R                  S5      R                  5       R                  5       n[        U5      S:X  d   eUS   S:X  d   eUS   S	:X  d   e[	        US   5      U l        US
   S:X  d   e[	        US   5      U l        US   S:X  d   e[	        US   5      U l        US   S:X  d   e[	        US   5      U l	        US   S:X  d   e[        S5        [        R                  " U R                  SU R
                  S4[        R                  S9n[        U R                  5       H  n[        SU-  5        UR                  5       nUR                  5       R                  S5      R                  5       R                  5       n	[        U	5      U R
                  :X  d   e[        R                  " U	 V
s/ s H  n
[!        U
5      PM     sn
[        R                  S9nXU R                  S-
  U-
  SS S 2S4'   M     [        R"                  " USS5      nU R$                  R'                  5         X`R$                  R(                  l        U R                  S:  Gaz  [        S5        [        R                  " U R                  SU R
                  S4[        R                  S9nUR                  5       n[        U R                  5       H  n[        SU-  5        UR                  5       nUR                  5       R                  S5      R                  5       R                  5       n	[        U	5      U R
                  :X  d   e[        R                  " U	 V
s/ s H  n
[!        U
5      PM     sn
[        R                  S9nXUSS S 2S4'   M     [        R"                  " USS5      nU R,                  R'                  5         XR,                  R(                  l        g g s  sn
f s  sn
f )NrE   r   z<Fsmn>rF   rL      z<LearnRateCoef>rG   z<LOrder>   z<ROrder>      z	<LStride>      z	<RStride>	   
   z	<MaxNorm>zread conv_left weightrJ   zread conv_left weight -- %dzread conv_right weightzread conv_right weight -- %d)rM   rN   rO   rP   rQ   r   r   r   r   r   r   r*   rT   rU   rV   rW   rX   	transposer   rS   rY   rZ   r   )r1   r[   	fsmn_line
fsmn_splitparams_lineparams_splitnew_lfiltersr`   ra   rb   rc   rd   new_rfilterss                r   re   FSMNBlock.to_pytorch_net   s   NN$	__&,,.
:!###!}(((z!}%nn&"((*006<<>DDF< B&&&A"3333A*,,,,q/*A*,,,,q/*A+---<?+A+---<?+B;... 	%&{{DKKDHHa#@).8t{{#A/!34>>#DZZ\''-335;;=Fv;$((***<< @t @&+mm5D9=q1,aA56 $ |Q: 	'')%1" ;;? *+ ;;Q!'D-2]]<L>>#D4;;'4q89~~'++D1779??A6{dhh...||V$DVTU4[V$D*/--9+/Q1aZ( ( !??<A>LOO,,.*6OO""''  !A. %Es   .Q
Q
)	r   r   r/   r   r   r   r-   r   r   )NNrF   rF   )ri   rj   rk   rl   rQ   r$   r:   rB   re   rm   rn   ro   s   @r   r   r      sB     '8'8 '8 '8R.&=7 =7r   r   c                   :   ^  \ rS rSrU 4S jrS rS rS rSrU =r	$ )RectifiedLineari:  c                    > [         [        U ]  5         Xl        [        R
                  " 5       U l        [        R                  " S5      U l        g )Ng?)	r#   r   r$   r   r'   ReLUreluDropoutdropoutr0   s      r   r$   RectifiedLinear.__init__<  s1    ot-/GGI	zz#r   c                 (    U R                  U5      nU$ r5   )r   )r1   r8   r   s      r   r:   RectifiedLinear.forwardB  s    ii
r   c                 F    SnUSU R                   U R                   4-  -  nU$ )Nr   z<RectifiedLinear> %d %d
)r   )r1   r   s     r   rB   RectifiedLinear.to_kaldi_netG  s)    -4880DDDr   c                 :   UR                  5       nUR                  5       R                  5       n[        U5      S:X  d   eUS   S:X  d   e[	        US   5      [	        US   5      :X  d   e[	        US   5      U R
                  :X  d   e[	        US   5      U l        g )NrE   r   z<RectifiedLinear>rF   rG   )rM   rN   rO   rP   rQ   r   )r1   r[   ra   rb   s       r   re   RectifiedLinear.to_pytorch_netU  s    ~~##%6{aay////6!9~VAY///6!9~)))vay>r   )r   r   r   rh   ro   s   @r   r   r   :  s    '
" "r   r   rF   fsmn_layers
linear_dimproj_dimr   r   c                     [        U 5       Vs/ s HC  n[        R                  " [        X5      [	        X"X4SS5      [        X!5      [        X5      5      PME     nn[        R                  " U6 $ s  snf )NrF   )rV   r'   
Sequentialr   r   rq   r   )	r   r   r   r   r   r   r   r`   repeatss	            r   _build_repeatsr   _  sr     {# $A 	J1h&!Q?H1J3		5
 $   =='""s   A
A-c                     ^  \ rS rSrS\S\S\S\S\S\S\S	\S
\S\S\4U 4S jjrS r\R                  " SSS\R                  S94S\R                  S\R                  S\\R                  \R                  4   4S jjrS rS rSrU =r$ )FSMNit  r%   input_affine_dimr   r   r   r   r   r   r   output_affine_dimr&   c           	      t  > [         [        U ]  5         Xl        X l        X0l        X@l        XPl        X`l        Xpl	        Xl
        Xl        Xl        Xl        [        X5      U l        [        X$5      U l        [#        XD5      U l        ['        X4XVXxU	5      U l        [        XJ5      U l        [        X5      U l        g)a  
Args:
    input_dim:              input dimension
    input_affine_dim:       input affine layer dimension
    fsmn_layers:            no. of fsmn units
    linear_dim:             fsmn input dimension
    proj_dim:               fsmn projection dimension
    lorder:                 fsmn left order
    rorder:                 fsmn right order
    lstride:                fsmn left stride
    rstride:                fsmn right stride
    output_affine_dim:      output affine layer dimension
    output_dim:             output dimension
N)r#   r   r$   r%   r   r   r   r   r   r   r   r   r   r&   rq   
in_linear1
in_linear2r   r   r   fsmnout_linear1out_linear2)r1   r%   r   r   r   r   r   r   r   r   r   r&   r2   s               r   r$   FSMN.__init__v  s    8 	dD"$" 0&$ !2$))F)*:G#J;	";H#)G=	 +:I*+<Ir   c                     g r5    )r1   s    r   fuse_modulesFSMN.fuse_modules  s    r   r   rJ   r8   in_cachereturnc                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      nX4$ )z
Args:
    input (torch.Tensor): Input tensor (B, T, D)
    in_cache(torch.Tensor): (B, D, C), C is the accumulated cache size
)r   r   r   r   r   r   )	r1   r8   r   x1x2x3x4x5x6s	            r   r:   FSMN.forward  sd    " __U#__R YYr]YYr]b!b! |r   c                 @   SnUS-  nXR                   R                  5       -  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XR                  R                  5       -  nUSU R                  U R                  4-  -  nUS-  nU$ )	Nr   z<Nnet>
r   rF   rG   rE   z<Softmax> %d %d
z</Nnet>
)r   rB   r   r   r   r   r   r&   )r1   r   r   s      r   rB   FSMN.to_kaldi_net  s   *//..00//..00))((**IID1g**,,F1g**,,F1g**,,F1g**,,F	  	""//11""//11%$//(JJJ+r   c                    [        USSS9 n[        US5      nUR                  5       nUR                  5       S:X  d   eU R                  R	                  U5        U R
                  R	                  U5        U R                  R	                  U5        U R                   HS  nUS   R	                  U5        US   R	                  U5        US   R	                  U5        US   R	                  U5        MU     U R                  R	                  U5        U R                  R	                  U5        UR                  5       nUR                  5       R                  5       nUS   R                  5       S	:X  d   e[        US   5      U R                  :X  d   e[        US   5      U R                  :X  d   eUR                  5       nUR                  5       S
:X  d   e S S S 5        WR                  5         g ! , (       d  f       N= f)Nrutf8)encodingz<Nnet>r   rF   rG   rE   z	<Softmax>z</Nnet>)openrM   rN   r   re   r   r   r   r   r   rO   rQ   r&   close)r1   
kaldi_filer[   nnet_start_liner   softmax_linesoftmax_splitnnet_end_lines           r   re   FSMN.to_pytorch_net  s   *cF3uS)E#nn.O"((*h666OO**51OO**51II$$U+		Q&&u-Q&&u-Q&&u-Q&&u-	 " ++E2++E2 >>+L(..0668M #))+{:::}Q'(DOO;;;}Q'(DOO;;; "NN,M &&(I5555 46 	7 43s   GG,,
G:)r   r   r   r   r   r%   r   r   r   r   r   r   r&   r   r   r   r   )ri   rj   rk   rl   rQ   r$   r   r*   rT   rX   Tensorr   r:   rB   re   rm   rn   ro   s   @r   r   r   t  s    2J2J 2J 	2J
 2J 2J 2J 2J 2J 2J 2J 2Jj "'Q1EKK!H|| ,, 
u||U\\)	*	8* r   r   __main__i     r         r   rG   i'
  c              #   @   #    U  H  oR                  5       v   M     g 7fr5   )numel).0ps     r   	<genexpr>r     s     :(91WWYY(9s   zthe number of model params: {}   zinput shape: {}zoutput shape: {})rF   rF   )"__doc__typingr   r   r
   r*   torch.nnr'   torch.nn.functional
functionalr   r   r   Moduler   rq   r   r   rQ   r   r   ri   r   r   sum
parameters
num_paramsformatrT   r   y_shaperB   r   r   r   <module>r     s}         7.bii 7.tH)bii H)VR7		 R7l""bii ""V ### # 	#
 #*G299 GT zS!S#r1aC>D	$K:(9::J	
*
1
1*
=>Cc"A7DAq	

"
"177
+,	

#
#AGG
,-	$


 r   