
    mi&                         d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	Z	ddl
Z
ddlZddlZddlmZ ddlZddlmZ ddlmZ dd	lmZ d
ZdZdefdZdefdZ G d d      ZddZd Zd Zy)z.Loading wav based datasets, including MusdbHQ.    )OrderedDictN)Path)distributed)
functional   )convert_audio_channels)distribmixturez.wavTc           
          d }d }d}d}|t         gz   D ]  }| | | z  }	|t         k(  r|	j                         sd}
|D ](  }| | | z  }t        j                  |      \  }}|
|z  }
* |
j	                         j                         dk\  }|rt        j                         dk(  sJ d       t        j                  |	|
d       	 t        j                  t        |	            }|j                  }||}|j                  }nH||k7  rt        d|	 d| d	| d
      |j                  |k7  rt        d|	 d| d	|j                   d
      |t         k(  s>|sB	 t        j                  t        |	            \  }}|j                  d      }|j                         j!                         }|j#                         j!                         } |||dS # t        $ r t        |	        w xY w# t        $ r t        |	        w xY w)Nr   r   	soundfilezuse dset.backend=soundfilePCM_F)encodingzInvalid length for file z: expecting z	 but got .zInvalid sample rate for file )lengthmeanstd
samplerate)MIXTUREexiststaloadabsmaxget_audio_backendsaveinfostrRuntimeErrorprint
num_framessample_rate
ValueErrorr   itemr   )tracksources	normalizeexttrack_lengthtrack_samplerater   r   sourcefileaudio
sub_sourcesub_file	sub_audiosr
would_clipr   r   wav_s                       D/var/www/stems/demucs_env/lib/python3.12/site-packages/demucs/wav.py_track_metadatar5      s4   LD
CWI% &#&#''WT[[]E% #
 j\##77 " 1	2"# *a/J++-<Z>ZZ<GGD%g6	773t9%D !L#//V#*4& 1)N)F81>? ? !11/v 6-.i8H8H7ILM M WT+Q ((1+C88:??$D'').."CM&#P d3FVWW3  	$K	$   ds   G!G'G$'G=c                    i }t        |       } g }ddlm}  |d      5 }t        j                  | d      D ]x  \  }}	}
t        |      }|j
                  j                  d      s|	s|| k(  r5t        |j                  |             }|j                  ||j                  t        ||||      f       z t        j                  |d      D ]  \  }}|j                         ||<    	 d	d	d	       |S # 1 sw Y   |S xY w)
aU  
    Build the metadata for `Wavset`.

    Args:
        path (str or Path): path to dataset.
        sources (list[str]): list of sources to look for.
        normalize (bool): if True, loads full track and store normalization
            values based on the mixture file.
        ext (str): extension of audio files (default is .wav).
    r   )ThreadPoolExecutor   T)followlinksr   x   )ncolsN)r   concurrent.futuresr7   oswalkname
startswithr   relative_toappendsubmitr5   tqdmresult)pathr%   r&   r'   metapendingsr7   poolrootfoldersfilesr?   pendings                r4   build_metadatarN   N   s     D:DH5	A	 	*$$&GGDd$C 	a D'5:Dyy##C(Gtt|t''-.DOOT4;;gyZ]#^_`	a "YYxs; 	*MD' )DJ	*	* K	* Ks   CC..C8c                   2    e Zd ZdddddefdZd Zd Zd Zy)	WavsetNTiD     c
                    t        |      | _        t        |      | _        || _        |xs || _        || _        || _        || _        || _	        |	| _
        g | _        | j                  j                         D ]p  \  }
}|d   |d   z  }|||k  rd}n;t        t        j                  || j                  z
  | j
                  z        dz         }| j                  j!                  |       r y)a_  
        Waveset (or mp3 set for that matter). Can be used to train
        with arbitrary sources. Each track should be one folder inside of `path`.
        The folder should contain files named `{source}.{ext}`.

        Args:
            root (Path or str): root folder for the dataset.
            metadata (dict): output from `build_metadata`.
            sources (list[str]): list of source names.
            segment (None or float): segment length in seconds. If `None`, returns entire tracks.
            shift (None or float): stride in seconds bewteen samples.
            normalize (bool): normalizes input audio, **based on the metadata content**,
                i.e. the entire track is normalized, not individual extracts.
            samplerate (int): target sample rate. if the file sample rate
                is different, it will be resampled on the fly.
            channels (int): target nb of channels. if different, will be
                changed onthe fly.
            ext (str): extension for audio files (default is .wav).

        samplerate and channels are converted on the fly.
        r   r   Nr   )r   rJ   r   metadatasegmentshiftr&   r%   channelsr   r'   num_examplesitemsintmathceilrB   )selfrJ   rS   r%   rT   rU   r&   r   rV   r'   r?   rG   track_durationexampless                 r4   __init__zWavset.__init__l   s    4 J	#H-%g
" $----/ 	/JD$!(^d<.@@N.7":tyy.4<<*G4::)UVYZZ[$$X.	/    c                 ,    t        | j                        S N)sumrW   )r\   s    r4   __len__zWavset.__len__   s    4$$%%r`   c                 B    | j                   |z  | | j                   z  S rb   )rJ   r'   )r\   r?   r*   s      r4   get_filezWavset.get_file   s#    yy4VHTXXJ"777r`   c                    t        | j                  | j                        D ]  \  }}||k\  r||z  }| j                  |   }d}d}| j                  Lt	        |d   | j
                  z  |z        }t	        t        j                  |d   | j                  z              }g }| j                  D ]_  }| j                  ||      }	t        j                  t        |	      ||      \  }
}t        |
| j                        }
|j                  |
       a t!        j"                  |      }t%        j&                  ||d   | j(                        }| j*                  r||d   z
  |d   z  }| j                  rSt	        | j                  | j(                  z        }|dd |f   }t-        j.                  |d||j0                  d   z
  f      }|c S  y )Nr   r   )frame_offsetr    r   r   .)ziprS   rW   rT   rY   rU   rZ   r[   r%   rf   r   r   r   r   rV   rB   thstackjuliusresample_fracr   r&   Fpadshape)r\   indexr?   r^   rG   r    offsetwavsr*   r+   r2   r3   exampler   s                 r4   __getitem__zWavset.__getitem__   s   !$--1B1BC 	ND( !==&DJF||'T,/$**<uDE 4+=+L!MN
D,, !}}T62TJWQ,S$--@C 	! hhtnG**7D4FXG~~"T&\1T%[@||T\\DOO;<!#ww,/%%!VgmmB6G-G)HIN3	r`   )__name__
__module____qualname__EXTr_   rd   rf   rv    r`   r4   rP   rP   k   s'     qc	*/X&8r`   rP   c           
      @   t        | |      }t        j                  t        |      j	                               j                         dd }t        | j                        d|z   dz   z  }t        |      dz  }t        |      dz  }|j                         s~t        j                  dk(  rk|j                  j                  dd	       t        || j                        }t        || j                        }t        j                   ||gt#        |d
             t        j$                  dkD  rt'        j(                          t        j*                  t#        |            \  }}| j,                  ri }	n| j.                  | j0                  d}	t3        ||| j                  | j.                  | j0                  | j4                  | j6                  | j8                        }
t3        ||t:        gt=        | j                        z   f| j4                  | j6                  | j8                  d|	}|
|fS )z/Extract the wav datasets from the XP arguments.Nr8   wav_.jsontrainvalidr   Texist_okparentswr   rT   rU   rT   rU   r   rV   r&   r   rV   r&   )getattrhashlibsha1r   encode	hexdigestr   rS   is_filer	   rankparentmkdirrN   r%   jsondumpopen
world_sizer   barrierr   full_cvrT   rU   rP   r   rV   r&   r   list)argsr?   rF   sigmetadata_file
train_path
valid_pathr   r   kw_cv	train_set	valid_sets               r4   get_wav_datasetsr      s   4D
,,s4y'')
*
4
4
6r
:C'6C<'+ABMdg%Jdg%J  "w||q'8""D$"?z4<<8z4<<8		5%.$}c":;A99T-01LE5|| LL4::>z5$,,#||4::"&//DMM!%1I z57)d4<<6H*H :"&//DMM!%:38:I ir`   c                      dd l } t        t        j                  d         dz  dz  }| j	                  t        |d            }|d   S )Nr   configszmus.yamlrvalidation_tracks)yamlr   musdb__path__	safe_loadr   )r   
setup_pathsetups      r4   _get_musdb_validr      sC    ennQ'(94zAJNN4
C01E$%%r`   c           
         t        j                  t        | j                        j	                               j                         dd }t        | j                        d|z   dz   z  }t        | j                        dz  }|j                         sft        j                  dk(  rS|j                  j                  dd       t        || j                        }t        j                   |t#        |d	             t        j$                  d
kD  rt'        j(                          t        j*                  t#        |            }t-               }| j.                  r|}n(|j1                         D ci c]  \  }}||vs|| }}}|j1                         D ci c]  \  }}||v s|| }	}}| j2                  ri }
n| j4                  | j6                  d}
t9        ||| j                  | j4                  | j6                  | j:                  | j<                  | j>                        }t9        ||	t@        gtC        | j                        z   f| j:                  | j<                  | j>                  d|
}||fS c c}}w c c}}w )z0Extract the musdb dataset from the XP arguments.Nr8   musdb_r~   r   r   Tr   r   r   r   r   r   )"r   r   r   r   r   r   r   rS   r   r	   r   r   r   rN   r%   r   r   r   r   r   r   r   r   train_validrX   r   rT   rU   rP   r   rV   r&   r   r   )r   r   r   rJ   rS   valid_tracksmetadata_trainr?   rG   metadata_validr   r   r   s                r4   get_musdb_wav_datasetsr      s   
,,s4::--/
0
:
:
<Ra
@C'8c>G+CDM

g%D  "w||q'8""D$"?!$5		(D45Ayym,-H#%L!7?~~7Gdt4WcKc$*dd3;>>3C\ZT4t|G[dDj\N\|| LL4::>t^T\\#||4::"&//DMM!%1I t^gYdll9K-K :"&//DMM!%:38:I i e\s   %I(2I(I.I.)r2   ) __doc__collectionsr   r   rZ   r   r=   pathlibr   rD   r   rm   torchrk   r   
torchaudior   torch.nnr   ro   r,   r    r	   r   rz   r5   rN   rP   r   r   r   r{   r`   r4   <module>r      sw    5 #    	        $ ) 
 /3 -X` -1c :M M` :& r`   