
    ]i0                         S SK JrJ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  S SKJrJrJrJr  SSKJr  SSKJrJr   " S S	\R*                  5      r " S
 S\R*                  5      rg)    )OptionalMappingN)Tensor)LSTMBatchNorm1dLinear	Parameter   )wiener)make_filterbanksComplexNormc                      ^  \ rS rSrSr        SS\S\S\S\S\S\\R                     S	\\R                     S
\\   4U 4S jjjr
S rS\S\4S jrSrU =r$ )	OpenUnmix   a(  OpenUnmix Core spectrogram based separation module.

Args:
    nb_bins (int): Number of input time-frequency bins (Default: `4096`).
    nb_channels (int): Number of input audio channels (Default: `2`).
    hidden_size (int): Size for bottleneck layers (Default: `512`).
    nb_layers (int): Number of Bi-LSTM layers (Default: `3`).
    unidirectional (bool): Use causal model useful for realtime purpose.
        (Default `False`)
    input_mean (ndarray or None): global data mean of shape `(nb_bins, )`.
        Defaults to zeros(nb_bins)
    input_scale (ndarray or None): global data mean of shape `(nb_bins, )`.
        Defaults to ones(nb_bins)
    max_bin (int or None): Internal frequency bin threshold to
        reduce high frequency content. Defaults to `None` which results
        in `nb_bins`
nb_binsnb_channelshidden_size	nb_layersunidirectional
input_meaninput_scalemax_binc	           	        > [         [        U ]  5         Xl        U(       a  Xl        OU R                  U l        X0l        [        U R                  U-  USS9U l        [        U5      U l	        U(       a  Un	OUS-  n	[        UU	UU(       + SUS:  a  SOSS9U l        US-  n
[        XSS9U l        [        U5      U l        [        UU R                  U-  SS9U l        [        U R                  U-  5      U l        Ub3  [         R"                  " US U R                   * 5      R%                  5       nO [         R&                  " U R                  5      nUb5  [         R"                  " S	US U R                   -  5      R%                  5       nO [         R(                  " U R                  5      n[+        U5      U l        [+        U5      U l        [+        [         R(                  " U R                  5      R%                  5       5      U l        [+        [         R(                  " U R                  5      R%                  5       5      U l        g )
NF)bias   r
   g?r   )
input_sizer   
num_layersbidirectionalbatch_firstdropout)in_featuresout_featuresr   g      ?)superr   __init__nb_output_binsr   r   r   fc1r   bn1r   lstmfc2bn2fc3bn3torch
from_numpyfloatzerosonesr	   r   r   output_scaleoutput_mean)selfr   r   r   r   r   r   r   r   lstm_hidden_sizefc2_hiddensize	__class__s              L/mnt/rpi/tmp/demucs-venv-sys/lib/python3.13/site-packages/openunmix/model.pyr$   OpenUnmix.__init__    s    	i')%"L..DL&$,,4kN{+**a/"( ,,$q=Ca
	 %qnUZ[{+#,,{:
 t22[@A!)):n+E*EFLLNJT\\2J"**3^t||1L+LMSSUK**T\\2K#J/$[1%ejj1D1D&E&K&K&MN$UZZ0C0C%D%J%J%LM    c                 `    U R                  5        H
  nSUl        M     U R                  5         g NF
parametersrequires_gradevalr4   ps     r8   freezeOpenUnmix.freezed   %     "A#AO #		r:   xreturnc                    UR                  SSSS5      nUR                  R                  u  p#pEUR                  5       R	                  5       nUSSU R
                  24   nXR                  -   nXR                  -  nU R                  UR                  SX@R
                  -  5      5      nU R                  U5      nUR                  X#U R                  5      n[        R                  " U5      nU R                  U5      n[        R                  " XS   /S5      nU R!                  UR                  SUR                  S   5      5      nU R#                  U5      n[$        R&                  " U5      nU R)                  U5      nU R+                  U5      nUR                  X#X@R,                  5      nXR.                  -  nXR0                  -  n[$        R&                  " U5      U-  nUR                  SSSS5      $ )z
Args:
    x: input spectrogram of shape
        `(nb_samples, nb_channels, nb_bins, nb_frames)`

Returns:
    Tensor: filtered spectrogram of shape
        `(nb_samples, nb_channels, nb_bins, nb_frames)`
   r   r
   r   .N)permutedatashapedetachcloner   r   r   r&   reshaper'   r   r-   tanhr(   catr)   r*   Frelur+   r,   r%   r2   r3   )r4   rF   	nb_frames
nb_samplesr   r   mixlstm_outs           r8   forwardOpenUnmix.forwardk   s    IIaAq!67ffll3	{hhj  c>T\\>!"    HHQYYr;#=>?HHQKIIiT-=-=>JJqM 99Q< IIq1+&+ HHQYYr1772;/0HHQKFF1I HHQKHHQK IIi[:M:MN 	
	 FF1IOyyAq!$$r:   )r'   r*   r,   r&   r)   r+   r   r   r   r(   r   r%   r3   r2   )   r   i   rI   FNNN)__name__
__module____qualname____firstlineno____doc__intboolr   npndarrayr$   rC   r   rY   __static_attributes____classcell__r7   s   @r8   r   r      s    ( $+/,0!%BNBN BN 	BN
 BN BN RZZ(BN bjj)BN #BN BNH;% ;%F ;% ;%r:   r   c                      ^  \ rS rSrSr         SS\\\R                  4   S\	S\
S\
S\S\	S	\	S
\	S\\	   S\4U 4S jjjrS rS\S\4S jrSS\S\\   S\4S jjrSrU =r$ )	Separator   a  
Separator class to encapsulate all the stereo filtering
as a torch Module, to enable end-to-end learning.

Args:
    targets (dict of str: nn.Module): dictionary of target models
        the spectrogram models to be used by the Separator.
    niter (int): Number of EM steps for refining initial estimates in a
        post-processing stage. Zeroed if only one target is estimated.
        defaults to `1`.
    residual (bool): adds an additional residual target, obtained by
        subtracting the other estimated targets from the mixture,
        before any potential EM post-processing.
        Defaults to `False`.
    wiener_win_len (int or None): The size of the excerpts
        (number of frames) on which to apply filtering
        independently. This means assuming time varying stereo models and
        localization of sources.
        None means not batching but using the whole signal. It comes at the
        price of a much larger memory usage.
    filterbank (str): filterbank implementation method.
        Supported are `['torch', 'asteroid']`. `torch` is about 30% faster
        compared to `asteroid` on large FFT sizes such as 4096. However,
        asteroids stft can be exported to onnx, which makes is practical
        for deployment.
target_modelsnitersoftmaskresidualsample_raten_fftn_hopr   wiener_win_len
filterbankc                 f  > [         [        U ]  5         X l        X@l        X0l        Xl        [        UUSU
US9u  U l        U l	        [        US:H  S9U l        [        R                  " U5      U l        [        U R                  5      U l        U R#                  S[$        R&                  " U5      5        g )NT)rp   rq   centermethodro   r
   )monoro   )r#   ri   r$   rl   rn   rm   rr   r   stftistftr   complexnormnn
ModuleDictrk   len
nb_targetsregister_bufferr-   	as_tensor)r4   rk   rl   rm   rn   ro   rp   rq   r   rr   rs   r7   s              r8   r$   Separator.__init__   s     	i') 
  , 0#!
	4: 'K1,<=  ]]=9d001 	]EOOK,HIr:   c                 `    U R                  5        H
  nSUl        M     U R                  5         g r<   r=   rA   s     r8   rC   Separator.freeze   rE   r:   audiorG   c           	         U R                   nUR                  S   nU R                  U5      nU R                  U5      n[        R
                  " UR                  U4-   UR                  UR                  S9n[        U R                  R                  5       5       H2  u  nu  pU	" UR                  5       R                  5       5      n
XSU4'   M4     UR                  SSSSS5      nUR                  SSSSS5      nU R                  (       a  US-  nUS:X  a  U R                  S:  a  [!        S5      eUR                  S   n[        R
                  " UR                  U4-   UR                  UR                  S9n[#        U5       H  nSnU R$                  (       a  U R$                  nOUnX:  d  M,  [        R&                  " U[)        XU-   5      5      n[+        US	   5      S-   n[-        XmU4   XMU4   U R                  U R.                  U R                  S
9XU4'   X:  a  Mr  M     UR                  SSSSSS5      R1                  5       nU R3                  XR                  S   S9nU$ )a  Performing the separation on audio input

Args:
    audio (Tensor): [shape=(nb_samples, nb_channels, nb_timesteps)]
        mixture audio waveform

Returns:
    Tensor: stacked tensor of separated waveforms
        shape `(nb_samples, nb_targets, nb_channels, nb_timesteps)`
r   )dtypedevice.rI   r   r
      zoCannot use EM if only one target is estimated.Provide two targets or create an additional one with `--residual`rJ   )rm   rn      )length)r~   rM   rx   rz   r-   r0   r   r   	enumeraterk   itemsrN   rO   rK   rn   rl   	Exceptionrangerr   arangeminra   r   rm   
contiguousry   )r4   r   
nb_sourcesrV   mix_stftXspectrogramsjtarget_nametarget_moduletarget_spectrogramrU   targets_stftsampleposrr   	cur_frame	estimatess                     r8   rY   Separator.forward   s<    __
[[^
 99U#X& {{177j]#:%++VWV^V^_/89K9K9Q9Q9S/T+A+!.qxxz/?/?/A!B#5a  0U $++Aq!Q:
 ##Aq!Q2 ==!OJ?tzzA~(  !&&q)	{{8>>ZM#A]e]l]lmJ'FC""!%!4!4!*/!LLc)>=Q.RS	)B-(1,28 !23Y./JJ!]]!]]3Y./	 / (& $++Aq!Q1=HHJ JJ|KKNJC	r:   r   aggregate_dictc                    0 n[        U R                  5       H  u  pEUSS2US4   X5'   M     U R                  (       a  USS2SS4   US'   Ub;  0 nU H1  n[        R                  " S5      Xg'   X'    H  nXg   X5   -   Xg'   M     M3     UnU$ )zConvert estimates as stacked tensor to dictionary

Args:
    estimates (Tensor): separated targets of shape
        (nb_samples, nb_targets, nb_channels, nb_timesteps)
    aggregate_dict (dict or None)

Returns:
    (dict of str: Tensor):
N.rJ   rn   g        )r   rk   rn   r-   tensor)r4   r   r   estimates_dictktargetnew_estimateskeys           r8   to_dictSeparator.to_dict?  s     "4#5#56IA%.q!Sy%9N" 7 ==)21b#:)>N:&%M%%*\\#%6",1F)6);n>T)TM& 2 & +Nr:   )	rz   ry   r~   rl   rn   rm   rx   rk   rr   )	r   FFg    @r[   i   r   i,  r-   )N)r\   r]   r^   r_   r`   r   strr{   Modulera   rb   r/   r   r$   rC   r   rY   dictr   re   rf   rg   s   @r8   ri   ri      s    < $(+!$JsBII~.$J $J 	$J
 $J $J $J $J $J !$J $J $JLKV K KZ $ SW  r:   ri   )typingr   r   numpyrc   r-   torch.nnr{   torch.nn.functional
functionalrS   r   r   r   r   r	   	filteringr   
transformsr   r   r   r   ri    r:   r8   <module>r      sK    $       9 9  5Y%		 Y%xp		 pr:   