o
    <p f)  ã                   @   s¦  d dl Z d dlZd dlZd dlZd dlZd dlmZ zd dlmZ W n e	y/   d dlZY nw G dd„ dej
jjƒZG dd„ dej
jjƒZddd	„Zg fd
d„Zdd„ Zdd„ Zdd„ Zdd„ ZedkrÏd dlZd dl
Z
ejd Zejd Zejd Ze jedd eeeƒZeeƒD ]D\ZZe j  e j !e¡¡d  Z"e #eeddd¡\Z$Z%Z&Z&e 'e$¡Z(e 'e%¡Z)e(e) Z*e*e*e)k9 Z*d +ee"¡Z,e -e*¡Z.e
 /e,e.¡ qŒdS dS )é    N)Útqdm)Ú
spec_utilsc                   @   sX   e Zd Z	ddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚVocalRemoverTrainingSetFc                 C   s.   || _ || _|| _|| _|| _|| _|| _d S ©N)Útraining_setÚcropsizeÚreduction_rateÚreduction_weightÚ
mixup_rateÚmixup_alphaÚ
is_complex)Úselfr   r   r   r	   r
   r   r   © r   ú)/home/ubuntu/vocal-remover/lib/dataset.pyÚ__init__   s   
z VocalRemoverTrainingSet.__init__c                 C   ó
   t | jƒS r   )Úlenr   ©r   r   r   r   Ú__len__   ó   
zVocalRemoverTrainingSet.__len__c                 C   sX   t |dƒ}tjj |¡\}}tjj |¡\}}}|W  d   ƒ S 1 s%w   Y  d S )NÚrb)ÚopenÚnpÚlibÚformatÚ
read_magicÚread_array_header_1_0)r   ÚpathÚfhandleÚ_Úshaper   r   r   Úread_npy_shape   s
   $ýz&VocalRemoverTrainingSet.read_npy_shapec                 C   s¼   t |dƒO}tjj |¡\}}tjj |¡\}}}|rJ dƒ‚t |dd … ¡}|| |j }	| |	d¡ || j	 }
tj
||
|d}| d|dd …  ¡W  d   ƒ S 1 sWw   Y  d S )Nr   z&Fortran order arrays are not supportedé   )ÚcountÚdtype)éÿÿÿÿ)r   r   r   r   r   r   ÚprodÚitemsizeÚseekr   ÚfromfileÚreshape)r   r   Ú	start_rowr   r   r    Úfortranr$   Úrow_sizeÚ
start_byteÚn_itemsÚflatr   r   r   Úread_npy_chunk%   s   
$ôz&VocalRemoverTrainingSet.read_npy_chunkc                 C   sZ   t  |¡}t  |¡}|| }|||k9 }t  ||| j  dt j¡}|t  dt  |¡ ¡ S )Nr   y              ð?)r   ÚabsÚclipr	   ÚinfÚexpÚangle)r   ÚXÚyÚX_magÚy_magÚv_magr   r   r   Úaggressively_remove_vocal4   s   

z1VocalRemoverTrainingSet.aggressively_remove_vocalc           	      C   sn   |   |¡}tj d|d | j ¡}|  ||¡ ddd¡}|  ||¡ ddd¡}|  ||¡ ddd¡}|||fS )Nr   r"   é   )r!   r   ÚrandomÚrandintr   r1   Ú	transpose)	r   ÚX_pathÚy_pathÚv_pathr    r+   ÚX_cropÚy_cropÚv_cropr   r   r   Údo_crop>   s   

zVocalRemoverTrainingSet.do_cropc                 C   sŠ   t j ¡ | jk r|  ||¡}t j ¡ dk r0|d d d…  ¡ }|d d d…  ¡ }|d d d…  ¡ }t j ¡ dk r@| ¡ }t  |¡}|||fS )Ng      à?r%   g{®Gáz„?)r   r>   Úuniformr   r<   ÚcopyÚ
zeros_like)r   r7   r8   Úvr   r   r   Údo_augH   s   

zVocalRemoverTrainingSet.do_augc                 C   s¼   t j dt| ƒ¡}| j| \}}}}|  |||¡\}	}
}|	| }	|
| }
|| }|  |	|
|¡\}	}
}t j | j| j¡}|| d| |	  }|| d| |
  }|| d| |  }|||fS )Nr   r"   )	r   r>   r?   r   r   rG   rL   Úbetar   )r   r7   r8   rK   ÚidxrA   rB   rC   ÚcoefÚX_iÚy_iÚv_iÚlamr   r   r   Údo_mixup^   s   
z VocalRemoverTrainingSet.do_mixupc                 C   s¸   | j | \}}}}|  |||¡\}}}|| }|| }|| }|  |||¡\}}}tj ¡ | jk r;|  |||¡\}}}| jrIt 	||g¡}||fS t 
|¡}	t 
t 	||g¡¡}
|	|
fS r   )r   rG   rL   r   r>   rH   r
   rT   r   Úconcatenater2   )r   rN   rA   rB   rC   rO   r7   r8   rK   r9   r:   r   r   r   Ú__getitem__p   s   
z#VocalRemoverTrainingSet.__getitem__N©F)Ú__name__Ú
__module__Ú__qualname__r   r   r!   r1   r<   rG   rL   rT   rV   r   r   r   r   r      s    
þ

r   c                   @   s&   e Zd Zd	dd„Zdd„ Zdd„ ZdS )
ÚVocalRemoverValidationSetFc                 C   s   || _ || _d S r   )Úvalidation_setr   )r   r\   r   r   r   r   r   ˆ   s   
z"VocalRemoverValidationSet.__init__c                 C   r   r   )r   r\   r   r   r   r   r   Œ   r   z!VocalRemoverValidationSet.__len__c           	      C   sr   | j | }t |¡}|d |d |d }}}| jr&t ||g¡}||fS t |¡}t t ||g¡¡}||fS )Nr7   r8   rK   )r\   r   Úloadr   rU   r2   )	r   rN   r   Údatar7   r8   rK   r9   r:   r   r   r   rV      s   


z%VocalRemoverValidationSet.__getitem__NrW   )rX   rY   rZ   r   r   rV   r   r   r   r   r[   †   s    
r[   c                    s   g d¢‰t ‡ ‡fdd„t ˆ ¡D ƒƒ}t ‡‡fdd„t ˆ¡D ƒƒ}ˆd ur?t ‡‡fdd„t ˆ¡D ƒƒ}tt|||ƒƒ}|S tt||ƒƒ}|S )N)z.wavz.m4az.mp3z.mp4z.flacc                    s.   g | ]}t j |¡d  ˆv rt j ˆ |¡‘qS ©r"   ©Úosr   ÚsplitextÚjoin©Ú.0Úfname)ÚX_dirÚ
input_extsr   r   Ú
<listcomp>¡   ó
    þzmake_pair.<locals>.<listcomp>c                    ó.   g | ]}t j |¡d  ˆ v rt j ˆ|¡‘qS r_   r`   rd   )rh   Úy_dirr   r   ri   ¦   rj   c                    rk   r_   r`   rd   )rh   Úv_dirr   r   ri   ­   rj   )Úsortedra   ÚlistdirÚlistÚzip)rg   rl   rm   ÚX_listÚy_listÚv_listÚfilelistr   )rg   rh   rm   rl   r   Ú	make_pairž   s   þþþþrv   c                    s  |dkrKt tj | d¡tj | d¡tj | d¡ƒ}t |¡ tˆ ƒdkr>tt|ƒ| ƒ}|d | … }|| d … ‰ |ˆ fS ‡ fdd„|D ƒ}|ˆ fS |dkrƒtˆ ƒdkrYtd	ƒ‚t tj | d
¡tj | d¡tj | d¡ƒ}t tj | d¡tj | d¡tj | d¡ƒ‰ |ˆ fS )Nr>   ÚmixturesÚinstrumentsÚpseudo_vocalsr   c                    s   g | ]
}t |ƒˆ vr|‘qS r   )rp   )re   Úpair©Úval_filelistr   r   ri   È   s
    ÿz#train_val_split.<locals>.<listcomp>Úsubdirsz:`val_filelist` option is not available with `subdirs` modeútraining/mixturesútraining/instrumentsztraining/pseudo_vocalsúvalidation/mixturesúvalidation/instrumentszvalidation/pseudo_vocals)	rv   ra   r   rc   r>   Úshuffler   ÚintÚ
ValueError)Údataset_dirÚ
split_modeÚval_rater|   ru   Úval_sizeÚtrain_filelistr   r{   r   Útrain_val_split¹   s<   ý

ìÿðýýrŠ   c                 C   sz   |dkrt tj | d¡tj | d¡ƒ}|S |dkr;t tj | d¡tj | d¡ƒ}t tj | d¡tj | d¡ƒ}|| }|S )	Nr>   rw   rx   r}   r~   r   r€   r   )rv   ra   r   rc   )r…   r†   ru   r‰   r|   r   r   r   Úraw_data_splitß   s"   þõþþr‹   c                 C   s6   |}||d  }|dkr|}|| |  | }|||fS )Nr=   r   r   )Úwidthr   ÚoffsetÚleftÚroi_sizeÚrightr   r   r   Úmake_paddingó   s   
r‘   c              	   C   s|   g }t | ƒD ]5\}}}t ||||||¡\}}	}
}}}t t |¡ ¡ t |	¡ ¡ t |
¡ ¡ g¡}| ||||g¡ q|S r   )r   r   Úcache_or_loadr   Úmaxr2   Úappend)ru   ÚsrÚ
hop_lengthÚn_fftÚretrA   rB   rC   r7   r8   rK   ÚX_cache_pathÚy_cache_pathÚv_cache_pathrO   r   r   r   Úmake_training_setý   s   ÿ.rœ   c                 C   sÞ  g }d  |||||¡}tj|dd t| ƒD ]Ö\}}	}
tj tj |¡¡d }t ||	|
|||¡\}}}}}}t	 
t	 |¡ 
¡ t	 |¡ 
¡ t	 |¡ 
¡ g¡}|| || || }}}t|jd ||ƒ\}}}t	j|dd||ffdd}t	j|dd||ffdd}t	j|dd||ffdd}tt	 |jd | ¡ƒ}t|ƒD ]L}tj |d	  ||¡¡}|| }tj |¡sæt	j||d d …d d …||| …f |d d …d d …||| …f |d d …d d …||| …f d
 | |¡ qŸq|S )Nzcs{}_sr{}_hl{}_nf{}_of{}T©Úexist_okr   r=   )r   r   Úconstant)Úmodez
{}_p{}.npz)r7   r8   rK   )r   ra   Úmakedirsr   r   rb   Úbasenamer   r’   r   r“   r2   r‘   r    Úpadrƒ   ÚceilÚrangerc   ÚexistsÚsavezr”   )ru   r   r•   r–   r—   r   Ú
patch_listÚ	patch_dirrA   rB   rC   r¢   r7   r8   rK   r   rO   ÚlÚrr   ÚX_padÚy_padÚv_padÚlen_datasetÚjÚoutpathÚstartr   r   r   Úmake_validation_set	  s4    .üör³   Ú__main__r"   r=   é   Tr   iD¬  i   i   z{}/{}_Vocal.jpgr   )0ra   r>   Únumpyr   ÚtorchÚtorch.utils.datar   r   r   ÚModuleNotFoundErrorÚutilsr^   ÚDatasetr   r[   rv   rŠ   r‹   r‘   rœ   r³   rX   ÚsysÚargvÚmix_dirÚinst_dirÚoutdirr¡   ru   Úmix_pathÚ	inst_pathr   rb   r¢   Úmix_basenamer’   ÚX_specÚy_specr   r2   r9   r:   r;   r   r±   Úspectrogram_to_imageÚv_imageÚimwriter   r   r   r   Ú<module>   sR    ÿw
&
!




ÿ


ç