
    ]i              
       V   S SK r S SKrS SKJr  S SKJrJrJrJrJ	r	J
r
  S SKrS SKrS SKrS SKrS\S\4S jr   SMS\S\S\\   S	\\   4S
 jjrS\4S jr " S S\5      rSNS\R0                  S\S\S\R0                  4S jjrS\R0                  S\R0                  4S jrS\R0                  S\R0                  4S jr " S S\R8                  R:                  R<                  5      rS\ R@                  S\ RB                  S\\\\ RB                  4   4S jr" " S S\5      r# " S S\5      r$ " S S\5      r% " S  S!\5      r& " S" S#\5      r'\(S$:X  GaU  \ R@                  " S%S&9r)\)RU                  S'\S(/ S)QS*S+9  \)RU                  S,\S-S.9  \)RU                  S/S0S1S29  \)RU                  S3\S4S59  \)RU                  S6\+S7S59  \)RU                  S8\S9S:S;9  \)RU                  S<\S=S>S;9  \)RU                  S?\+S@S59  \)RY                  5       u  r-r.\R^                  " \-R`                  5        \"" \)\-5      u  r1r2r-\3" SA\Rh                  " 5       5        S r5\R                  " \6" \7" \15      5      5       H  r8\1\8   u  r9r:\5\9Rv                  SB   \1Rx                  -  -  r5\-Rz                  (       d  M=  \Rz                  " SC\" \85      -   SD-   \9R|                  \1Rx                  5        \Rz                  " SC\" \85      -   SE-   \:R|                  \1Rx                  5        M     \3" SF\5SG-  5        \3" SH\7" \15      5        \3" SI\7" \25      5        \-R~                  \1l@        \R8                  R:                  R                  \1\-R                  SJSKSL9rC\R                  " \C5       H  u  r9r:\3" \9Rv                  5        M     gg)O    N)Path)OptionalUnionTupleListAnyCallablepathreturnc                    [         R                  " 5       S:X  a  [        S5      e0 n[         R                  " [	        U 5      5      nUR
                  US'   UR                  US'   UR                  US'   US   US   -  US'   U$ )zLoad audio metadata

this is a backend_independent wrapper around torchaudio.info

Args:
    path: Path of filename
Returns:
    Dict: Metadata with
    `samplerate`, `samples` and `duration` in seconds

soxz#Deprecated backend is not supported
sampleratesampleschannelsduration)
torchaudioget_audio_backendRuntimeErrorinfostrsample_rate
num_framesnum_channels)r
   r   sis      K/mnt/rpi/tmp/demucs-venv-sys/lib/python3.13/site-packages/openunmix/data.py	load_infor      s~     ##%.@AAD	T	#BDmmDODIl);;DK    startdurr   c                     Uc  [         R                  " U 5      u  pEXE4$ Uc  [        U 5      n[        X#S   -  5      n[        XS   -  5      n[         R                  " XUS9u  pEXE4$ )a@  Load audio file

Args:
    path: Path of audio file
    start: start position in seconds, defaults on the beginning.
    dur: end position in seconds, defaults to `None` (full file).
    info: metadata object as called from `load_info`.

Returns:
    Tensor: torch tensor waveform of shape `(num_channels, num_samples)`
r   )r   frame_offset)r   loadr   int)r
   r   r   r   sigrater   r!   s           r   
load_audior&   %   so    $ { OOD)	y<T?DL112
5#556OODl[	yr   list_of_function_namesc                 t    U (       a*  [        U  Vs/ s H  n[        5       SU-      PM     sn5      $ S $ s  snf )N	_augment_c                     U $ N audios    r   <lambda>aug_from_str.<locals>.<lambda>I   s    Ur   )Composeglobals)r'   augs     r   aug_from_strr4   E   s:    @VW@V	+"34@VWXX"" Xs   5c                   X    \ rS rSrSrS rS\R                  S\R                  4S jrSr	g)	r1   L   zeComposes several augmentation transforms.
Args:
    augmentations: list of augmentations to compose.
c                     Xl         g r+   
transforms)selfr9   s     r   __init__Compose.__init__R   s    $r   r.   r   c                 <    U R                    H  nU" U5      nM     U$ r+   r8   )r:   r.   ts      r   __call__Compose.__call__U   s    AeHE !r   r8   N)
__name__
__module____qualname____firstlineno____doc__r;   torchTensorr?   __static_attributes__r,   r   r   r1   r1   L   s'    
%ell u|| r   r1   r.   lowhighc                 F    U[         R                  " S5      X!-
  -  -   nX-  $ )z.Applies a random gain between `low` and `high`   )rF   rand)r.   rI   rJ   gs       r   _augment_gainrO   [   s#    ejjmtz**A9r   c                     U R                   S   S:X  a@  [        R                  " S5      R                  5       S:  a  [        R                  " U S/5      $ U $ )z;Swap channels of stereo signals with a probability of p=0.5r      g      ?g      ?)shaperF   tensoruniform_flipr-   s    r   _augment_channelswaprV   a   sC    {{1~u||C099;cAzz%!%%r   c                     U R                   S   S:  a	  U S S2S4   n U R                   S   S:X  a  [        R                  " U SSS9n U $ )Nr   rQ   .rL   dim)rR   rF   repeat_interleaver-   s    r   _augment_force_stereor[   i   sL    {{1~bqb#g{{1~''qa8Lr   c                       \ rS rSrSr  SS\\\4   S\S\	\   S\	\
   SS4
S	 jjrS
\S\4S jrS\4S jrS\4S jrS\4S jrSrg)UnmixDatasetu      Nrootr   seq_durationsource_augmentationsr   c                     [        [        R                  5      R                  5       U l        X l        X0l        X@l        g r+   )r   argsr`   
expanduserr   ra   rb   )r:   r`   r   ra   rb   s        r   r;   UnmixDataset.__init__x   s.     O..0	&($8!r   indexc                     [         er+   NotImplementedError)r:   rg   s     r   __getitem__UnmixDataset.__getitem__       !!r   c                     [         er+   ri   r:   s    r   __len__UnmixDataset.__len__   rm   r   c                 .   SU R                   R                  -   nSR                  U R                  5       5      /nX R	                  5       R                  5       -  nU/U Vs/ s H  nSU R                  -  U-   PM     sn-   nSR                  U5      $ s  snf )NzDataset zNumber of datapoints: {} 
)	__class__rA   formatrp   
extra_repr
splitlines_repr_indentjoin)r:   headbodylineliness        r   __repr__UnmixDataset.__repr__   s    DNN333*11$,,.AB!,,..TJTT# 1 11D8TJJyy Ks    Bc                     g)N r,   ro   s    r   rw   UnmixDataset.extra_repr   s    r   )r`   r   ra   rb   )NN)rA   rB   rC   rD   ry   r   r   r   floatr   r	   r;   r#   r   rk   rp   r   rw   rH   r,   r   r   r]   r]   u   s    L )-37
9D#I
9 
9 uo	
9
 'x0
9 

9" " "" " #  C r   r]   parserrd   c           	      
   UR                   S:X  a  U R                  S[        S9  U R                  S[        S9  U R                  5       n[	        UR
                  5      R                  Ul        [	        UR                  5      UR                  UR                  UR
                  S.n[	        UR
                  5      R                  Ul        [        S:SSS.UD6n[        S:S	S
0UD6nGOnUR                   S:X  Ga6  U R                  S[        SS9  U R                  S[        S9  U R                  S[        SS9  U R                  S[        SS9  U R                  S[        SS9  U R                  S[        SS9  U R                  5       nUR                  Ul        [	        UR                  5      UR                  UR                  UR                  S.n[!        UR"                  5      n[%        S:SUSUR&                  UR                  S.UD6n[%        S:S
SUR                  UR(                  S.UD6nGO'UR                   S:X  a  U R                  S[        S9  U R                  S[        SS9  U R                  SSS S!S"9  U R                  S[        SS9  U R                  5       n[	        UR*                  5      R                  Ul        [	        UR                  5      UR,                  UR*                  S#.n[!        UR"                  5      n[/        S:SUUR0                  SUR                  S$.UD6n[/        S:S
S%S&.UD6nGOUR                   S':X  Ga6  U R                  S[        SS9  U R                  S[        S9  U R                  S[        SS9  U R                  S(SS S)S"9  U R                  S*SS S+S"9  U R                  5       n[	        UR*                  5      R                  Ul        [	        UR                  5      UR*                  UR                  UR2                  S,.n[5        UR"                   Vs/ s H  n[7        5       S-U-      PM     sn5      n[9        S:SUUR:                  SUR                  S..UD6n[9        S:S
S%S&.UD6nOU R                  S/SS S0S"9  U R                  S1[        S2S9  U R                  S[        S3S4/SS59  U R                  5       nUR                  UR<                  SUR                  UR                  S%L UR>                  S6.n[!        UR"                  5      n[A        S:SURB                  UR                  USS7.UD6n[A        S:S
S8S%S9.UD6nX4U4$ s  snf );zgLoads the specified dataset from commandline arguments

Returns:
    train_dataset, validation_dataset
alignedz--input-file)typez--output-file)r`   ra   
input_fileoutput_filetrainT)splitrandom_chunksr   validsourcefolderz--interferer-dirs+)r   nargsz--target-dirz--ext.wavr   defaultz--nb-train-samples  z--nb-valid-samplesd   z--source-augmentations)r`   interferer_dirs
target_dirext)r   rb   r   
nb_samplesra   )r   r   ra   r   trackfolder_fixz--target-filez--interferer-filesz--random-track-mix
store_trueFz&Apply random track mixing augmentation)actionr   help)r`   interferer_filestarget_file)r   rb   random_track_mixr   ra   N)r   ra   trackfolder_varz--random-interferer-mixz+Apply random interferer mixing augmentationz--silence-missingzsilence missing targets)r`   r   r   silence_missing_targetsr)   )r   rb   random_interferer_mixr   ra   z--is-wavzloads wav instead of STEMSz--samples-per-track@   gainchannelswap)r   r   r   )r`   is_wavsubsetstargetdownloadseed)r   samples_per_trackra   rb   r   rL   )r   r   ra   r,   )"datasetadd_argumentr   
parse_argsr   r   stemr   r`   seq_durr   AlignedDatasetr#   r   r   r   r4   rb   SourceFolderDatasetnb_train_samplesnb_valid_samplesr   r   FixedSourcesTrackFolderDatasetr   silence_missingr1   r2   !VariableSourcesTrackFolderDatasetr   r   r   MUSDBDatasetr   )r   rd   dataset_kwargstrain_datasetvalid_datasetrb   r3   s          r   load_datasetsr      s    ||y N5O#6  "4++,11 O LL//++	
 4++,11&[WD[N[&GWGG		'/cEN5G#v>0sDI0sCH43cJ  "oo O#33//88	
  ,D,E,EF+ 
!5,,
 
 , 
,,	

 
 
*	*O#60s#F 9	 	 	
 	43cJ  "4++,11 O $ 5 5++
  ,D,E,EF6 
!5!22
 
 7jWSWj[ij	*	*G#v>O#643cJ%>	 	 	
 	*	 	 	
   "4++,11 O++88'+';';	
  'PTPiPi'jPi	+2C(DPi'jk9 
!5"&"<"<
 
 :mVZm^lm 	-	 	 	
 	1RH43Q^H_gjk  "IIkkkk		T)II
  ,D,E,EF$ 
"44!5!
 
 %m7aVZm^lm--[ (ks   *Uc                   x    \ rS rSr        SS\S\S\S\S\\   S\S	\S
\\   S\	SS4S jjr
S rS rS rSrg)r   i>  Nr`   r   r   r   ra   r   r   rb   r   r   c
                 H   [        U5      R                  5       U l        X l        Xpl        XPl        X`l        X0l        X@l        [        U R                  5       5      U l        U R                  (       d  [        S5      eXl        [        R                  " U R                  5        g)aj  A dataset of that assumes multiple track folders
where each track includes and input and an output file
which directly corresponds to the the input and the
output of the model. This dataset is the most basic of
all datasets provided here, due to the least amount of
preprocessing, it is also the fastest option, however,
it lacks any kind of source augmentations or custum mixing.

Typical use cases:

* Source Separation (Mixture -> Target)
* Denoising (Noisy -> Clean)
* Bandwidth Extension (Low Bandwidth -> High Bandwidth)

Example
=======
data/train/01/mixture.wav --> input
data/train/01/vocals.wav ---> output

z)Dataset is empty, please check parametersN)r   re   r`   r   r   ra   r   r   r   list
_get_pathstuple_pathsr   r   random)
r:   r`   r   r   r   ra   r   r   rb   r   s
             r   r;   AlignedDataset.__init__?  sy    @ J))+	
&(*$& 12JKK	DIIr   c                 @   U R                   U   u  p#U R                  (       aL  [        U5      n[        U5      n[        US   US   5      n[        R
                  " SX`R                  -
  5      nOSn[        X'U R                  S9u  p[        X7U R                  S9u  pX4$ )Nr   r   r   r   )r   r   r   minr   uniformra   r&   )r:   rg   
input_pathoutput_path
input_infooutput_infor   r   X_audio_Y_audios              r   rk   AlignedDataset.__getitem__m  s    "&"2"25"9
":.J#K0K:j1;z3JKHNN1h1B1B&BCEE
T=N=NO
d>O>OP
r   c                 ,    [        U R                  5      $ r+   )lenr   ro   s    r   rp   AlignedDataset.__len__}  s    4##$$r   c              #   P  #    [        U R                  U R                  5      n[        R                  " UR	                  5       5       H  nUR                  5       (       d  M  [        UR                  U R                  5      5      n[        UR                  U R                  5      5      nU(       d  Mk  U(       d  Mt  U R                  bM  [        US   5      n[        US   5      n[        US   US   5      nXpR                  :  a  US   US   4v   M  M  US   US   4v   M     g7f)Loads input and output tracksNr   r   )r   r`   r   tqdmiterdiris_dirr   globr   r   ra   r   r   )r:   p
track_pathr   r   r   r   min_durations           r   r   AlignedDataset._get_paths  s     DJJ'))AIIK0J  ""!*//$//"BC
":??43C3C#DE:++((4%.z!}%=
&/A&?'*:j+A;zCZ'['*;*;;",Q-Q"?? < )m[^;; 1s   AD&!AD&2D&;A+D&)	r   r   r   r`   r   r   ra   r   r   )r   zmixture.wav
vocals.wavNF    @N*   )rA   rB   rC   rD   r   r   r   boolr	   r#   r;   rk   rp   r   rH   r,   r   r   r   r   >  s     ''(,#$37,, , 	,
 , uo, , , 'x0, , 
,\  %<r   r   c                       \ rS rSrSSSS/SSSS	S
S S4
S\S\S\S\\   S\S\S\\   S\	S\S\\
   S\SS4S jjrS rS rS rSrg)r   i  r   vocalsbassdrumsr   r   NTr   c                     U $ r+   r,   r-   s    r   r/   SourceFolderDataset.<lambda>      r   r   r`   r   r   r   r   r   ra   r   r   rb   r   r   c                 `   [        U5      R                  5       U l        X l        Xl        Xpl        XPl        Xl        Xl        X0l	        X@l
        U R                  U R                  /-   U l        U R                  5       U l        X`l        Xl        [         R                  " U R                  5        g)a@  A dataset that assumes folders of sources,
instead of track folders. This is a common
format for speech and environmental sound datasets
such das DCASE. For each source a variable number of
tracks/sounds is available, therefore the dataset
is unaligned by design.
By default, for each sample, sources from random track are drawn
to assemble the mixture.

Example
=======
train/vocals/track11.wav -----------------        train/drums/track202.wav  (interferer1) ---+--> input
train/bass/track007a.wav  (interferer2) --/

train/vocals/track11.wav ---------------------> output

N)r   re   r`   r   r   ra   r   r   rb   r   r   source_folders
get_trackssource_tracksr   r   r   )r:   r`   r   r   r   r   r   ra   r   r   rb   r   s               r   r;   SourceFolderDataset.__init__  s    @ J))+	
&(*$8!$."22doo5FF!__.$	DIIr   c                 P   / nU R                    H  nU R                  S:X  a  [        R                  " U5        [        R                  " U R
                  U   5      n[        U5      S   nU R                  (       a$  [        R                  " SXPR                  -
  5      nO[        US-  U R                  S-  -
  S5      n[        XFU R                  S9u  pxU R                  U5      nUR                  U5        M     [        R                  " U5      n	U	R!                  S5      n
U	S   nX4$ )Nr   r   r   rQ   r   )r   r   r   r   choicer   r   r   r   ra   maxr&   rb   appendrF   stacksum)r:   rg   audio_sourcessourcesource_pathr   r   r.   r   stemsxys               r   rk   SourceFolderDataset.__getitem__  s    ))FzzW$ E" !--(:(:6(BCK -j9H!!q(5F5F*FG HMD,=,=,BBAF!+@Q@QRHE--e4E  '% *( M*IIaL"Itr   c                     U R                   $ r+   )r   ro   s    r   rp   SourceFolderDataset.__len__  s    r   c                    [        U R                  U R                  5      n0 n[        R                  " U R                  5       H  n/ nX-  n[        UR                  SU R                  -   5      5       HT  nU R                  b3  [        U5      nUS   U R                  :  a  UR                  U5        MA  MC  UR                  U5        MV     XBU'   M     U$ )r   *r   )r   r`   r   r   r   sortedr   r   ra   r   r   )r:   r   r   source_foldertracksr   source_track_pathr   s           r   r   SourceFolderDataset.get_tracks  s    DJJ'!YYt':':;MF+K%+K,<,<S488^,L%M!$$0$%67DJ'$*;*;;&78 < MM"34 &N ,2-( < r   )r   r   r   r   r`   r   r   ra   rb   r   r   r   r   )rA   rB   rC   rD   r   r   r#   r   r   r   r	   r;   rk   rp   r   rH   r,   r   r   r   r     s     "&,g%6(,"$3F-- - 	-
 c- - - uo- - - 'x0- - 
-^<r   r   c                       \ rS rSrSSSS/SSSS S	S
4	S\S\S\S\\   S\\   S\S\S\\	   S\S\
SS4S jjrS rS rS rSrg)r   i  r   r   zbass.wavz	drums.wavNFc                     U $ r+   r,   r-   s    r   r/   'FixedSourcesTrackFolderDataset.<lambda>  r   r   r   r   r`   r   r   r   ra   r   r   rb   r   r   r   c                    [        U5      R                  5       U l        X l        Xl        XPl        Xpl        X`l        Xl        X0l	        X@l
        U R                  U R                  /-   U l        Xl        [        R                  " U R                  5        [        U R                  5       5      U l        [#        U R                   5      (       d  [%        S5      eg)aB  A dataset that assumes audio sources to be stored
in track folder where each track has a fixed number of sources.
For each track the users specifies the target file-name (`target_file`)
and a list of interferences files (`interferer_files`).
A linear mix is performed on the fly by summing the target and
the inferers up.

Due to the fact that all tracks comprise the exact same set
of sources, the random track mixing augmentation technique
can be used, where sources from different tracks are mixed
together. Setting `random_track_mix=True` results in an
unaligned dataset.
When random track mixing is enabled, we define an epoch as
when the the target source from all tracks has been seen and only once
with whatever interfering sources has randomly been drawn.

This dataset is recommended to be used for small/medium size
for example like the MUSDB18 or other custom source separation
datasets.

Example
=======
train/1/vocals.wav ---------------        train/1/drums.wav (interferer1) ---+--> input
train/1/bass.wav -(interferer2) --/

train/1/vocals.wav -------------------> output

zNo tracks foundN)r   re   r`   r   r   ra   r   r   rb   r   r   source_filesr   r   r   r   r  r   r   )r:   r`   r   r   r   ra   r   r   rb   r   r   s              r   r;   'FixedSourcesTrackFolderDataset.__init__  s    T J))+	
&( 0*$8!& 0 11T5E5E4FF	DII4??,-4;;011  r   c                 r   U R                   U   S   nU R                   U   S   nU R                  (       a$  [        R                  " SX0R                  -
  5      nOSn/ n[        X R                  -  X@R                  S9u  pgU R                  U5      nUR                  U5        U R                   H  nU R                  (       a  [        R                  " [        [        U R                   5      5      5      n	U R                   U	   S   nU R                  (       a5  U R                   U	   S   n[        R                  " SX0R                  -
  5      n[        X(-  X@R                  S9u  pU R                  U
5      n
UR                  U
5        M     [        R                  " U5      nUR!                  S5      nUS   nX4$ )Nr
   r   r   r   )r  r   r   r   ra   r&   r   rb   r   r   r   r   ranger   rF   r   r   )r:   rg   r   r   r   r   target_audior   r   
random_idxr.   r   r   r   s                 r   rk   *FixedSourcesTrackFolderDataset.__getitem__4  sp   [['/
{{5).9NN1l5F5F&FGEE $Z2B2B%B%UfUfg00>\*++F$$#]]5T[[1A+BC
![[4V<
%%#';;z#:>#JL"NN1l=N=N.NOE!*"5UHYHYZHE--e4E  ' , M*IIaL!Htr   c                 ,    [        U R                  5      $ r+   r   r  ro   s    r   rp   &FixedSourcesTrackFolderDataset.__len__Y      4;;r   c              #     #    [        U R                  U R                  5      n[        R                  " UR	                  5       5       H  nUR                  5       (       d  M  U R                   Vs/ s H  o2U-  PM	     nn[        S U 5       5      (       d  [        SU5        M]  U R                  bD  [        [        [        U5      5      n[        S U 5       5      nX`R                  :  a  X&S.v   M  M  USS.v   M     gs  snf 7f)r   c              3   @   #    U  H  oR                  5       v   M     g 7fr+   )exists).0sps     r   	<genexpr><FixedSourcesTrackFolderDataset.get_tracks.<locals>.<genexpr>b  s     >299;;s   zExclude track Nc              3   *   #    U  H	  oS    v   M     g7fr   Nr,   r  is     r   r  r  i  s     &De}e   r
   r   )r   r`   r   r   r   r   r
  allprintra   r   mapr   r   )r:   r   r   ssource_pathsinfosr   s          r   r   )FixedSourcesTrackFolderDataset.get_tracks\  s     DJJ'))AIIK0J  ""8<8I8IJ8I1Q8IJ>>>>*J7$$0 Y!=>E#&&De&D#DL#&7&77(2QR 8 %/EF 1Js   AD!D/D=B	D)r   r   r   r`   r   r   ra   rb   r
  r   r   r  )rA   rB   rC   rD   r   r   r   r   r   r	   r#   r;   rk   rp   r   rH   r,   r   r   r   r     s     ''1;&?(,#!&3F$:2:2 :2 	:2
 s):2 uo:2 :2 :2 'x0:2 :2 :2 
:2x#J Gr   r   c                       \ rS rSrSSSSSSSS S4	S	\S
\S\S\S\\   S\S\S\S\\   S\SS4S jjr	S r
S rS rSrg)r   ip  r   r   r   NFr   c                     U $ r+   r,   r-   s    r   r/   *VariableSourcesTrackFolderDataset.<lambda>{  r   r   r`   r   r   r   ra   r   r   r   rb   r   r   c                     [        U5      R                  5       U l        X l        Xl        XPl        X`l        Xpl        Xl        X0l	        X@l
        Xl        [        U R                  5       5      U l        g)aX  A dataset that assumes audio sources to be stored
in track folder where each track has a _variable_ number of sources.
The users specifies the target file-name (`target_file`)
and the extension of sources to used for mixing.
A linear mix is performed on the fly by summing all sources in a
track folder.

Since the number of sources differ per track,
while target is fixed, a random track mix
augmentation cannot be used. Instead, a random track
can be used to load the interfering sources.

Also make sure, that you do not provide the mixture
file among the sources!

Example
=======
train/1/vocals.wav --> input target           train/1/drums.wav --> input target     |
train/1/bass.wav --> input target    --+--> input
train/1/accordion.wav --> input target |
train/1/marimba.wav --> input target  /

train/1/vocals.wav -----------------------> output

N)r   re   r`   r   r   ra   r   r   rb   r   r   r   r   r   r  )r:   r`   r   r   r   ra   r   r   r   rb   r   s              r   r;   *VariableSourcesTrackFolderDataset.__init__q  s`    N J))+	
&(*%:"$8!&'>$4??,-r   c                 f   U R                   U   S   nU R                  (       a6  U R                   U   S   n[        R                  " SX0R                  -
  5      nOSnU R
                  (       a  [        R                  " [        [        U R                   5      5      5      nU R                   U   S   nU R                  (       a6  U R                   U   S   n[        R                  " SXpR                  -
  5      nOSnOUnUn[        [        UR                  SU R                  -   5      5      5      n	Sn
U	 HA  nXU R                  -  :X  a  M   [        XU R                  S9u  pXR#                  U5      -  n
MC     [%        X R                  -  5      R'                  5       (       a;  [        X R                  -  UU R                  S9u  pU R#                  U5      nX-  n
X4$ [(        R*                  " WR,                  5      nX4$ ! [         a&    US:  a  US-
  OUS-   nU R!                  U5      s s  $ f = f)Nr
   r   r   r   r   rL   )r  r   r   r   ra   r   r   r  r   r  r   r   r   r   r&   r   rk   rb   r   r  rF   zerosrR   )r:   rg   target_track_pathtarget_min_durationtarget_startr  intfr_track_pathintfr_min_durationintfr_startsourcesr   r   r.   r   r   s                  r   rk   -VariableSourcesTrackFolderDataset.__getitem__  s    KK.v6"&++e"4^"D!>>!-@CTCT-TULL %%uS-='>?J#{{:6v>!!%)[[%<^%L"$nnQ0BEVEV0VW0&K .33C$((NCDE "K1A1AAA/%k$J[J[\ **511A # !$4$445<<>>!$4$44"%%DA
 ))!,AFA t EKK(At'   /%*QY	EAI''../s   H  +H0/H0c                 ,    [        U R                  5      $ r+   r  ro   s    r   rp   )VariableSourcesTrackFolderDataset.__len__  r  r   c           	   #     #    [        U R                  U R                  5      n[        R                  " UR	                  5       5       H  nUR                  5       (       d  M  [        X R                  5      R                  5       (       d  U R                  (       d  MU  [        [        UR                  SU R                  -   5      5      5      nU(       d  [        SU5        M  U R                  bD  [        [        [         U5      5      n[#        S U 5       5      nXPR                  :  a  X%S.v   M  M  US S.v   M     g 7f)Nr   zempty track: c              3   *   #    U  H	  oS    v   M     g7fr  r,   r  s     r   r  ?VariableSourcesTrackFolderDataset.get_tracks.<locals>.<genexpr>  s     *H%QZ=%r   r!  )r   r`   r   r   r   r   r   r  r   r  r   r   r   r#  ra   r$  r   r   )r:   r   r   r6  r'  r   s         r   r   ,VariableSourcesTrackFolderDataset.get_tracks  s     DJJ'))AIIK0J  ""
$4$45<<>>$B^B^B^$T*//#.*I%JKG"oz: ((4 $SG%< ='**H%*H'H'*;*;;,6#UV < )3DIJ# 1s   AD>!7D>B"D>)r   r   r   r`   r   ra   r   rb   r   r   r  )rA   rB   rC   rD   r   r   r   r   r	   r;   rk   rp   r   rH   r,   r   r   r   r   p  s     '(,#&+$3F(-1.1. 1. 	1.
 1. uo1. 1.  $1. 1. 'x01. "&1. 
1.f5n Kr   r   c                       \ rS rSrSSSSSSSSS SS	4S
\S\S\S\S\S\S\\   S\S\\	   S\S\SS4S jjr
S rS rSrg)r   i  r   NFr   g      @r   c                     U $ r+   r,   r-   s    r   r/   MUSDBDataset.<lambda>  r   r   r   r   r`   r   r   r   r   ra   r   rb   r   r   r   c           	          SSK nXl        [        R                  " U5        X@l        Xpl        Xl        XPl        X`l        Xl        Xl	        Xl
        UR                  " UUUUUUS.UD6U l        SU l        g)a  MUSDB18 torch.data.Dataset that samples from the MUSDB tracks
using track and excerpts with replacement.

Parameters
----------
target : str
    target name of the source to be separated, defaults to ``vocals``.
root : str
    root path of MUSDB
download : boolean
    automatically download 7s preview version of MUSDB
is_wav : boolean
    specify if the WAV version (instead of the MP4 STEMS) are used
subsets : list-like [str]
    subset str or list of subset. Defaults to ``train``.
split : str
    use (stratified) track splits for validation split (``valid``),
    defaults to ``train``.
seq_duration : float
    training is performed in chunks of ``seq_duration`` (in seconds,
    defaults to ``None`` which loads the full audio track
samples_per_track : int
    sets the number of samples, yielded from each track per epoch.
    Defaults to 64
source_augmentations : list[callables]
    provide list of augmentation function that take a multi-channel
    audio file of shape (src, samples) as input and output. Defaults to
    no-augmentations (input = output)
random_track_mix : boolean
    randomly mixes sources from different tracks to assemble a
    custom mix. This augmenation is only applied for the train subset.
seed : int
    control randomness of dataset iterations
args, kwargs : additional keyword arguments
    used to add further control for the musdb dataset
    initialization function.

r   N)r`   r   r   r   r   r   )musdbr   r   r   ra   r   r   r   r   rb   r   DBmusr   )r:   r   r`   r   r   r   r   ra   r   rb   r   r   rd   kwargsrB  s                  r   r;   MUSDBDataset.__init__  s    l 		D(
!2$8! 088  
 
 #r   c                    / nS nU R                   R                  XR                  -     nU R                  S:X  Ga  U R                  (       Ga  [        U R                   R                  S   5       H  u  pVX`R                  :X  a  UnU R                  (       a*  [        R                  " U R                   R                  5      nU R                  Ul        [        R                  " SUR                  U R                  -
  5      Ul        [        R                   " UR"                  U   R$                  R&                  [        R(                  S9nU R+                  U5      nUR-                  U5        M     [        R.                  " USS9nUR1                  S5      n	Ub  X   n
X4$ [3        U R                   R                  S   R5                  5       5      R7                  S5      nXU   -
  n
 X4$ [        R                   " UR$                  R&                  [        R(                  S9n	[        R                   " UR8                  U R                     R$                  R&                  [        R(                  S9n
X4$ )Nr   r6  r   )dtyperX   r   )rD  r  r   r   ra   	enumeratesetupr   r   r   r   chunk_durationr   r   chunk_startrF   	as_tensorr6  r.   Tfloat32rb   r   r   r   r   keysrg   targets)r:   rg   r   
target_indtrackkr   r.   r   r   r   vocinds               r   rk   MUSDBDataset.__getitem__B  s   
 )?)? ?@ :: T%6%6%6&txx~~i'@A	[[(!"J (("MM$((//:E (,'8'8$$*NN1enntGXGX6X$Y!f(=(C(C(E(EU]][11%8$$U+# B( KK15E		!A%% t dhhnnY7<<>?EEhOf% t U]]CAdkk : @ @ B B%--XAtr   c                 Z    [        U R                  R                  5      U R                  -  $ r+   )r   rD  r  r   ro   s    r   rp   MUSDBDataset.__len__t  s     488??#d&<&<<<r   )r   rD  r   r   r   r   ra   rb   r   r   r   )rA   rB   rC   rD   r   r   r   r   r#   r	   r;   rk   rp   rH   r,   r   r   r   r     s     (+!#3F!&K#K# K# 	K#
 K# K# K# uoK# K# 'x0K# K# K# 
K#Z0d=r   r   __main__zOpen Unmix Trainer)descriptionz	--datasetrB  )rB  r   r   r   r   zName of the dataset.)r   r   choicesr   z--rootzroot path of dataset)r   r   z--saver   z$write out a fixed dataset of samples)r   r   z--targetr   r   z--seedr   z--audio-backend	soundfilez/Set torchaudio backend (`sox_io` or `soundfile`)r   r   r   z	--seq-durg      @z/Duration of <=0.0 will result in the full audioz--batch-size   zAudio Backend: rL   ztest/zx.wavzy.wavzTotal training duration (h): i  zNumber of train samples: zNumber of validation samples: Tr_   )
batch_sizeshufflenum_workers)g        NN)g      ?g      ?)Dargparser   pathlibr   typingr   r   r   r   r   r	   rF   torch.utils.datar   r   r   dictr   r   r&   r   r4   objectr1   rG   rO   rV   r[   utilsdataDatasetr]   ArgumentParser	Namespacer   r   r   r   r   r   rA   r   r   r#   parse_known_argsrd   r   set_audio_backendaudio_backendr   r   r#  r   total_training_durationr  r   rT  r   r   rR   r   saverN  r   ra   
DataLoaderr^  train_samplerr,   r   r   <module>rs     s      > >    C D 6 	
 
% 4.	@# #f  E  QVQ]Q]   	 	%,, 	5;;##++ @f.##f.+3+=+=f.
<x'9'99:f.RR<\ R<ja, aHvG\ vGrAK AKHA=< A=H z$$1EFF

 $   s1GH
=ce

h?
sB7
>	   >	   S"=%%'GD!  !3!34)6vt)D&M=$	
Z99;<  YYuS/01Q11771:0I0I#II999OOGc!f,w6]=V=VWOOGc!f,w6]=V=VW 2 

)+BT+IJ	
%s='9:	
*C,>? "&MKK$$//??	 0 M 		-(1agg )K r   