
    iF                        d Z ddlmZ ddlZddlZddlmZ ddl	m
Z
 ddlmZmZmZmZmZ ddlmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZ  G d dee
j8                        Zy)z2
MLX implementation of HTDemucs (inference-only).
    )annotationsN   )	HDecLayer	HEncLayer	MultiWrapScaledEmbeddingpad1d)	Conv1dNCL)CrossTransformerEncoder)MLXStateDictMixincenter_trim)CachedSpectralPair)wienerc            >           e Zd Zddddddddddddd	d
ddddddddddddddddddddddddddddddddddg ddddddddddddddf> fd	Zd&dZd'd(d Zd)d!Zd*d"Zd+d#Zd,d$Z	d-d%Z
 xZS ).HTDemucsMLX   0   Ni   r   FT      g?
      r   gMbP?   sing      @g        i'  g     @      ?)g     @r   gffffff?diag*   i  d   gffffff?g?iD  c@                B	   t         U|           g t        dpi d|d|d|d|d|d|d|d|d	|	d
|
d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d | d!|!d"|"d#|#d$|$d%|%d&|&d'|'d(|(d)|)d*|*d+|+d,|,d-|-d.|.d/|/d0|0d1|1d2|2d3|3d4|4d5|5d6|6d7|7d8|8d9|9d:|:d;|;d<|<d=|=d>|>d?|?f| _        |3s|4rt	        d@      |
| _        |	| _        || _        || _        || _	        || _
        || _        || _        || _        |=| _        |>| _        |?| _        || _        |dAz  | _        t'        ||dAz  B      | _        || _        || _        d | _        ||k7  rt1        dC      g | _        g | _        g | _        g | _        |}@|@}A| j
                  rAdDz  }A|xs |}B|}C|dDz  }Dt;        |      D ]  }E|E|k\  }FDdEkD  }G|}H|}I|Gs|dDz  }I|}HdF}JdG}KGrD|k  rD}IdG}JdF}KIHGJF|||||dFdHdI}Lt        |L      }MdG|MdJ<   ||Md<   ||Md<   dF|MdK<   t        |L      }NdG}O|rE|k  rdF}OdGNdL<   Krt=        BC      }C|C}Bt?        ACf|dEz  |dML}PGr/t?        @Bf|dEz  |KdNM}Q| j6                  jA                  |Q       OrtC        P|      }P| j2                  jA                  P       EdOk(  r5| j                  tE        | j                        z  }@|@| j
                  rdDndEz  }AtG        CAf|dDz  EdOk(  |dPN}ROrtC        R|      }RGr4tG        B@f|dDz  KEdOk(  |dQM}S| j8                  jI                  dO|S       | j4                  jI                  dOR       B}@C}AtK        ||Bz        }BtK        ||Cz        }CGrD|k  rdE}DnD|z  }DEdOk(  s|stM        DA||R      | _        || _'         |||dEz
  z  z  }T|| _(        |rJtS        T|dE      | _*        tS        ||TdE      | _+        tS        |T|dE      | _,        tS        ||TdE      | _-        |}T|dOkD  rft]        dpi dSTdT|dU| dV|!dW|dX|;dY|"dZ|#d[|$d\|%d]|&d^|'d_|(d`|)da|.db|,dc|-dd|/de|0df|1dg|2dh|3di|4dj|5dk|6dl|7dm|8dn|9do|:| _/        y d | _/        y )qNsourcesaudio_channelschannelschannels_timegrowthnfftwiener_iters	end_iterswiener_residualcacdepthrewritemulti_freqsmulti_freqs_depthfreq_emb	emb_scale
emb_smoothkernel_sizetime_stridestridecontextcontext_encnorm_startsnorm_groups
dconv_modedconv_depth
dconv_comp
dconv_initbottom_channelst_layerst_embt_hidden_scalet_heads	t_dropoutt_max_positions	t_norm_int_norm_in_groupt_group_normt_norm_first
t_norm_outt_max_periodt_weight_decayt_lrt_layer_scalet_gelut_weight_pos_embedt_sin_random_shiftt_cape_mean_normalizet_cape_augmentt_cape_glob_loc_scalet_sparse_self_attnt_sparse_cross_attnt_mask_typet_mask_random_seedt_sparse_attn_windowt_global_window
t_sparsityt_auto_sparsityt_cross_firstrescale
sampleratesegmentuse_train_segmentz1Sparse attention is not supported in MLX backend.r   )n_fft
hop_lengthz+HTDemucs requires wiener_iters == end_itersr   r   TF)r)   compressinitgelu_act)r0   r2   freqpadnormr*   r6   dconv_kwrc   rd   context_freq)dconvr3   )rh   r3   emptyr   )rh   lastr3   )rh   ri   rj   r3   )smoothscaledimembhidden_scale	num_heads
num_layerscross_firstdropoutmax_positionsnorm_innorm_in_group
group_norm
norm_firstnorm_out
max_periodweight_pos_embedlayer_scalegelusin_random_shiftcape_mean_normalizecape_augmentcape_glob_loc_scalesparse_self_attnsparse_cross_attn	mask_typemask_random_seedsparse_attn_windowglobal_windowsparsityauto_sparsity )0super__init__dict_init_args_kwargsRuntimeErrorr(   r'   r    r   r0   r3   r2   r)   r!   r[   r\   r]   r$   r_   r   	_spectralr%   r&   r-   
ValueErrorencoderdecodertencodertdecoderrangemaxr   appendr   lenr   insertintr   freq_emb_scaler;   r
   channel_upsamplerchannel_downsamplerchannel_upsampler_tchannel_downsampler_tr   crosstransformer)Vselfr   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   chinchin_zchoutchout_zfreqsindexre   rc   strikerrd   	last_freqkwkwtkw_decmultienctencdectdectransformer_channels	__class__sV                                                                                        l/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/demucs_mlx/mlx_htdemucs.pyr   zHTDemucsMLX.__init__   s   D 	"$d @'
@'
)@'
 @'
 (	@'

 @'
 @'
 &@'
  @'
 ,@'
 @'
 @'
 @'
 $@'
 0@'
 @'
   !@'
" "#@'
$ $%@'
& $'@'
( )@'
* +@'
, $-@'
. $/@'
0 $1@'
2 "3@'
4 $5@'
6 "7@'
8 "9@'
: ,;@'
< =@'
> ?@'
@ *A@'
B C@'
D  E@'
F ,G@'
H  I@'
J ,K@'
L &M@'
N &O@'
P "Q@'
R &S@'
T *U@'
V W@'
X (Y@'
Z [@'
\  2]@'
^  2_@'
` #8a@'
b *c@'
d #8e@'
f  2g@'
h !4i@'
j $k@'
l  2m@'
n "6o@'
p ,q@'
r "s@'
t ,u@'
v (w@'
x y@'
z "{@'
| }@'
~ 0@'
 @"B !4RSS.,&
 $!2	!)+$419M("9$JKK88aKF)	5\EK'D19DDC!Ao"CI, 	  #"*( *& $	B r(CCK!,C"CMCJ"XFEu'88).~&eW-FG]:>;]Z\]C %A'1A~'yA<?A $$T*[1LL$z**S->>dhhA6<'1A~aZ<4:<C [1 4,'1A~#%1*#, (+, $$Q-LL3'DF'E&7*+GK'Ef$Ezh /vjXa b&.#g "j  (6eai+@A.%./C_VW%XD"'0BVXY'ZD$'01EXY'ZD$)2?DXZ[)\D&#2 a<$; %(%% ,% "	%
 $% *% "% .% "% .% (% (% $% (% "4%  *!%" #%$ "4%%& %:'%( ,)%* %:+%, "4-%. #6/%0 &1%2 "43%4 $85%6 .7%8 $9%: .;%D!@ %)D!    c                8   | j                   }t        t        j                  |j                  d   |z              }|dz  dz  }t        |||||z  z   |j                  d   z
  fd      }| j                  j                  |      dd dd d f   }|ddd|z   f   }|S )Nr   r   reflect)mode.)r_   r   mathceilshaper	   r   stft)r   xhllerd   zs         r   _speczHTDemucsMLX._spec?  s    __1772;+,-Agk!c3b=1772;67iHNN"3Q;/c1a"f9nr   c                `   | j                   d|z  z  }|j                  dk(  rt        j                  |g d      }nt        j                  |g d      }|dz  dz  }|t	        t        j                  ||z              z  d|z  z   }| j                  j                  ||      }|d|||z   f   }|S )	Nr   r   )r   r   r   r   r   r   r   r   )r   r   r   r   r   r   )length.)	r_   ndimmxrd   r   r   r   r   istft)r   r   r   rl   r   rd   r   r   s           r   _ispeczHTDemucsMLX._ispecH  s    __e,66Q;qBCAq:;AAgk#dii,--C7NN  2 .c3f$$%r   c                   | j                   rg|j                  \  }}}}t        j                  t        j                  |      t        j
                  |      gd      j                  ||dz  ||      }|S t        j                  |      }|S )Nr   axis)r(   r   r   stackrealimagreshapeabs)r   r   BCFrTms          r   
_magnitudezHTDemucsMLX._magnitudeU  sp    88''KAq"a"''!*bggaj1:BB1a!eRQRSA  q	Ar   c                L   | j                   }| j                  rN|j                  \  }}}}}|j                  ||dd||      j	                  dddddd      }	|	d   }
|	d	   }|
d
|z  z   S |dk  r'|d d d f   }|dt        j                  |      z   z  |z  S | j                  |||      S )Nr   r   r   r   r   r   r   .r   .r                 ?g:0yE>)r%   r(   r   r   	transposer   r   _wiener)r   r   r   nitersr   Sr   r   r   outr   r   s               r   _maskzHTDemucsMLX._mask]  s    ""88WWNAq!R))Aq"aQ/99!Q1aKCv;Dv;D"t)##A:!T'
Arvvay()A--||Aq&))r   c                   |j                   }d| j                  |j                  \  }}}}|j                  ddddd      }	t	        j
                  t	        j                  |      t	        j                  |      gd      }
|
j                  ddddd      }fd	} t	        j                  |      |	|      }r|d
d dd d f   }|j                  dddddd      }|d   d|d   z  z   }|j                  |      S )Ni,  r   r   r   r   r   r   r   c           
         g }t        d	      D ]J  }t        ||	z         }t        | |   ||         }|j                  |j	                  ddddd             L t        j                  |d      S )Nr   )residualr   r   r   r   r   )r   slicer   r   r   r   concatenate)

mag_sample
mix_sample
out_chunksposframez_outr   r   r   wiener_win_lens
         r   _process_one_samplez0HTDemucsMLX._wiener.<locals>._process_one_samplew  s    JQ>2c3#78u%u%%	 !!%//!Q1a"@A 3 >>*155r   .r   r   r   r   )
dtyper'   r   r   r   r   r   r   vmapastype)r   mag_outmix_stftr   ra   r   r   r   Fq
mag_out_mxmix_stft_rimix_stft_mxr   r   r   r   r   s      `          @@@r   r   zHTDemucsMLX._wienerj  s    ~~'' !1aQ&&q!Q15
hh 127783DEBO!++Aq!Q:	6" +bgg)*:{C c3B3k"CmmAq!Q1-&kBV,,zz$r   c                    | j                   s|S t        | j                  | j                  z        }||k  rt	        d| d|       |S )NzGiven length z  is longer than training length )r]   r   r\   r[   r   )r   r   training_lengths      r   valid_lengthzHTDemucsMLX.valid_length  sV    %%MdllT__<=V#x'GGXY  r   c                
   |j                   d   }d }| j                  rat        | j                  | j                  z        }|j                   d   |k  r-|j                   d   }t        j                  |ddd||z
  fg      }| j                  |      }| j                  |      }|}|j                   \  }}	}
}t        j                  |dd      }t        j                  |dd      }||z
  d|z   z  }|}t        j                  |dd      }t        j                  |dd      }||z
  d|z   z  }g }g }g }g }t        | j                        D ].  \  }}|j                  |j                   d          d }|t        | j                        k  rU|j                  |j                   d          | j                  |   } ||      }|j                   s|j                  |       n|} |||      }|dk(  r|| j"                  pt        j$                  |j                   d	   t
        j&                  
      }| j#                  |      j)                  dd      d d d d d d f   }|| j*                  |z  z   }|j                  |       1 | j,                  r| j.                  rg|j                   \  }}}}|j1                  ||||z        }| j3                  |      }|j1                  || j.                  ||      }| j5                  |      }| j-                  ||      \  }}| j.                  rV|j1                  | j.                  z        }| j7                  |      }|j1                  |||      }| j9                  |      }| j:                  t        | j<                        z
  }t        | j>                        D ]  \  }} |jA                  d      }! | ||!|jA                  d            \  }}"||k\  s9| j<                  ||z
     }#|jA                  d      }$|#j                   r|"d d d d df   }" |#|"d |$      \  }}%|jA                  d      }& |#||&|$      \  }}% t        |      dk7  st        |      dk7  st        |      dk7  rtC        d      t        | jD                        }'|j1                  ||'d|
|      }||d d d f   z  |d d d f   z   }| jG                  ||      }(| j                  r| jI                  |(      }n| jI                  |(|      }|j                   d   })|j1                  ||'d|)      }||d d d f   z  |d d d f   z   }tK        ||      }||z   }| j                  r
|dd f   }n	|dd |f   }|r	|dd |f   }|S )Nr   r   r   )r   r   r   T)r   keepdimsgh㈵>)r   r   )r   r   z#Skip connections not fully consumed.)&r   r]   r   r\   r[   r   rd   r   r   meanstd	enumerater   r   r   r   ri   r-   arangeint32r   r   r   r;   r   r   r   r   r   r)   r   r   popr   r   r   r   r   )*r   mixr   length_pre_padr   r   magr   r   r   r   r   r  r  xtmeantstdtsavedsaved_tlengths	lengths_tidxencodeinjectr   frsrn   bcftoffsetdecodeskipprer   length_t_skip_tr   zoutactual_lengths*                                             r   __call__zHTDemucsMLX.__call__  s"   2!!!$,,"@AOyy}.!$2ffS66A7W3X"YZJJsOooa gg1b!wwqy48ffQY6X$*%$7vvbv55jTD[)	$T\\2KCNN1772;'FS''  ".}}S)"XzzNN2&Fq&!AaxDMM5ii288<mmC(221a8q!T9IJ++c11LLO! 3$   ##WW
1aIIaAE***1-IIa!5!5q!<--b1))!R0EAr##IIa!5!5q1u=,,Q/IIaAq)//3c$--00$T\\2KC99R=DAtW[[_5FAsf}}}S6\2$==,::aAg,C dH5EB$[[_F VX6EB 3 u:?c)n1S\Q5FDEEIIaBA&AtGtAtG},zz!Q!!D/2AD&)A ZZ1b-0$q$w-%4.02F!!#'''(A#ww,A#&'Ar   )r   mx.arrayreturnr$  )Nr   )r   r$  r   ztp.Optional[int]rl   r   r%  r$  )r   r$  r%  r$  )r   r$  r   r$  r%  r$  )r   r$  r   r$  r   r   r%  r$  )r   r   )r  r$  r%  r$  )__name__
__module____qualname__r   r   r   r   r   r   r   r#  __classcell__)r   s   @r   r   r      s     "0 ! Ah)T	*& Pcr   r   )__doc__
__future__r   r   typingtpmlx.corecorer   mlx.nnnnmlx_hdemucsr   r   r   r   r	   
mlx_layersr
   mlx_transformerr   	mlx_utilsr   r   spec_mlxr   
wiener_mlxr   Moduler   r   r   r   <module>r9     sE    #     P P ! 4 5 ( k#RYY kr   