o
    rri&                     @   s   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dZdefddZG dd dZdddZdd Zdd ZdS )z.Loading wav based datasets, including MusdbHQ.    )OrderedDictN)Path)distributed)
functional   )convert_audio_channels)distribmixturez.wavTc              	   C   s  d }d }d}d}|t g D ]}| | |  }	|t krV|	 sVd}
|D ]}| | |  }t|\}}|
|7 }
q#|
  dk}|rMt dksMJ dtj|	|
|dd z	tt	|	}W n t
yk   t|	  w |j}|d u ry|}|j}n&||krtd|	 d| d	| d
|j|krtd|	 d| d	|j d
|t kr|rztt	|	\}}W n t
y   t|	  w |d}|  }|  }q||||dS )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_ r2   >/home/ubuntu/.local/lib/python3.10/site-packages/demucs/wav.py_track_metadata   sl   


r4   c                 C   s   i }t | } g }ddlm} |dN}tj| ddD ]+\}}	}
t |}|jds/|	s/|| kr0qt|| }|	||
t||||f qtj|ddD ]
\}}| ||< qMW d	   |S 1 scw   Y  |S )
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.futuresr5   oswalkname
startswithr   relative_toappendsubmitr4   tqdmresult)pathr#   r$   r%   metapendingsr5   poolrootfoldersfilesr=   pendingr2   r2   r3   build_metadataN   s$   



rL   c                   @   s:   e Zd ZdddddefddZdd Zd	d
 Zdd ZdS )WavsetNTiD     c
                 C   s   t || _t|| _|| _|p|| _|| _|| _|| _|| _	|	| _
g | _| j D ],\}
}|d |d  }|du s=||k r@d}ntt|| j | j d }| j| q)dS )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   rH   r   metadatasegmentshiftr$   r#   channelsr   r%   num_examplesitemsintmathceilr@   )selfrH   rO   r#   rP   rQ   r$   r   rR   r%   r=   rE   track_durationexamplesr2   r2   r3   __init__l   s"   


zWavset.__init__c                 C   s
   t | jS N)sumrS   )rX   r2   r2   r3   __len__   s   
zWavset.__len__c                 C   s   | j | | | j  S r\   )rH   r%   )rX   r=   r(   r2   r2   r3   get_file   s   zWavset.get_filec                 C   s@  t | j| jD ]\}}||kr||8 }q| j| }d}d}| jd ur9t|d | j | }tt|d | j }g }| jD ]}| 	||}	t
jt|	||d\}
}t|
| j}
||
 q>t|}t||d | j}| jrz||d  |d  }| jrt| j| j }|dd |f }t|d||jd  f}|  S d S )Nr   r   )frame_offsetr   r   r   .)ziprO   rS   rP   rU   rQ   rV   rW   r#   r_   r   r   r   r   rR   r@   thstackjuliusresample_fracr   r$   Fpadshape)rX   indexr=   rZ   rE   r   offsetwavsr(   r)   r0   r1   exampler   r2   r2   r3   __getitem__   s4   



zWavset.__getitem__)__name__
__module____qualname__EXTr[   r^   r_   rn   r2   r2   r2   r3   rM   k   s    
,rM   r0   c              
   C   s>  t | |}tt|  dd }t| jd| d  }t|d }t|d }| sSt	j
dkrS|jjddd	 t|| j}t|| j}t||gt|d
 t	jdkr\t  tt|\}}| jrki }	n| j| jd}	t||| j| j| j| j| j| jd}
t||tgt| j f| j| j| jd|	}|
|fS )z/Extract the wav datasets from the XP arguments.Nr6   wav_.jsontrainvalidr   Texist_okparentswr   rP   rQ   rP   rQ   r   rR   r$   r   rR   r$   )getattrhashlibsha1r   encode	hexdigestr   rO   is_filer   rankparentmkdirrL   r#   jsondumpopen
world_sizer   barrierr   full_cvrP   rQ   rM   r   rR   r$   r   list)argsr=   rD   sigmetadata_file
train_path
valid_pathru   rv   kw_cv	train_set	valid_setr2   r2   r3   get_wav_datasets   s8   


r   c                  C   s6   dd l } ttjd d d }| t|d}|d S )Nr   configszmus.yamlrvalidation_tracks)yamlr   musdb__path__	safe_loadr   )r   
setup_pathsetupr2   r2   r3   _get_musdb_valid   s   r   c           
   
      sV  t t| j  dd }t| jd| d  }t| jd }| sBt	j
dkrB|jjddd t|| j}t|t|d	 t	jd
krKt  tt|}t  | jr[|}n fdd| D } fdd| D }| jrwi }n| j| jd}t||| j| j| j| j| j| jd}t||t gt!| j f| j| j| jd|}	||	fS )z0Extract the musdb dataset from the XP arguments.Nr6   musdb_rt   ru   r   Trw   rz   r   c                    s   i | ]\}}| vr||qS r2   r2   .0r=   rE   valid_tracksr2   r3   
<dictcomp>       z*get_musdb_wav_datasets.<locals>.<dictcomp>c                    s   i | ]\}}| v r||qS r2   r2   r   r   r2   r3   r      r   r{   r|   r}   )"r   r   r   r   r   r   r   rO   r   r   r   r   r   rL   r#   r   r   r   r   r   r   r   r   train_validrT   r   rP   rQ   rM   r   rR   r$   r   r   )
r   r   r   rH   rO   metadata_trainmetadata_validr   r   r   r2   r   r3   get_musdb_wav_datasets   s<    

r   )r0   ) __doc__collectionsr   r   rV   r   r;   pathlibr   rB   r   re   torchrc   r   
torchaudior   torch.nnr   rg   r*   r    r   r   rr   r4   rL   rM   r   r   r   r2   r2   r2   r3   <module>   s0   0
P