U
    þjgC!  ã                   @   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	k
r`   d dlZY nX G dd„ dej
jjƒZG dd„ dej
jjƒZdd	„ Z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 ]†\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 )é    N)Útqdm)Ú
spec_utilsc                   @   sT   e Z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d„ ZdS )ÚVocalRemoverTrainingSetc                 C   s(   || _ || _|| _|| _|| _|| _d S ©N)Útraining_setÚcropsizeÚreduction_rateÚreduction_weightÚ
mixup_rateÚmixup_alpha)Úselfr   r   r   r	   r
   r   © r   ú)/home/ubuntu/vocal-remover/lib/dataset.pyÚ__init__   s    z VocalRemoverTrainingSet.__init__c                 C   s
   t | jƒS r   )Úlenr   ©r   r   r   r   Ú__len__   s    zVocalRemoverTrainingSet.__len__c              
   C   sL   t |dƒ8}tjj |¡\}}tjj |¡\}}}|W  5 Q R £ S Q R X 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ƒœ}tjj |¡\}}tjj |¡\}}}|r>tdƒ‚t |dd … ¡}|| |j }	| 	|	d¡ || j
 }
tj||
|d}| d|dd …  ¡W  5 Q R £ S Q R X d S )Nr   z&Fortran order arrays are not supportedé   )ÚcountÚdtype)éÿÿÿÿ)r   r   r   r   r   r   ÚAssertionErrorÚprodÚitemsizeÚseekr   ÚfromfileÚreshape)r   r   Ú	start_rowr   r   r   Úfortranr!   Zrow_sizeZ
start_byteZ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_vocal1   s    

z1VocalRemoverTrainingSet.aggressively_remove_vocalc                 C   sV   |   |¡}tj d|d | j ¡}|  ||¡ ddd¡}|  ||¡ ddd¡}||fS )Nr   r   é   )r   r   ÚrandomÚrandintr   r,   Ú	transpose)r   ÚX_pathÚy_pathr   r)   ZX_cropÚy_cropr   r   r   Údo_crop;   s
    
zVocalRemoverTrainingSet.do_cropc                 C   sl   t j ¡ | jk r|  ||¡}t j ¡ dk rN|d d d…  ¡ }|d d d…  ¡ }t j ¡ dk rd| ¡ }||fS )Ng      à?r"   g{®Gáz„?)r   r9   Úuniformr   r7   Úcopy)r   r2   r3   r   r   r   Údo_augD   s    zVocalRemoverTrainingSet.do_augc           
      C   s”   t j dt| ƒ¡}| j| \}}}|  ||¡\}}|| }|| }|  ||¡\}}t j | j| j¡}	|	| d|	 |  }|	| d|	 |  }||fS )Nr   r   )	r   r9   r:   r   r   r?   rB   Úbetar   )
r   r2   r3   Úidxr<   r=   ÚcoefZX_iZy_iÚlamr   r   r   Údo_mixupX   s    z VocalRemoverTrainingSet.do_mixupc           	      C   s|   | j | \}}}|  ||¡\}}|| }|| }|  ||¡\}}tj ¡ | jk r`|  ||¡\}}t |¡}t |¡}||fS r   )	r   r?   rB   r   r9   r@   r
   rG   r-   )	r   rD   r<   r=   rE   r2   r3   r4   r5   r   r   r   Ú__getitem__h   s    

z#VocalRemoverTrainingSet.__getitem__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r,   r7   r?   rB   rG   rH   r   r   r   r   r      s   
	r   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚVocalRemoverValidationSetc                 C   s
   || _ d S r   )Ú
patch_list)r   rM   r   r   r   r   }   s    z"VocalRemoverValidationSet.__init__c                 C   s
   t | jƒS r   )r   rM   r   r   r   r   r   €   s    z!VocalRemoverValidationSet.__len__c                 C   sB   | j | }t |¡}|d |d  }}t |¡}t |¡}||fS )Nr2   r3   )rM   r   Úloadr-   )r   rD   r   Údatar2   r3   r4   r5   r   r   r   rH   ƒ   s    



z%VocalRemoverValidationSet.__getitem__N)rI   rJ   rK   r   r   rH   r   r   r   r   rL   {   s   rL   c                    s\   dddddg‰ t ‡ ‡fdd„t ˆ¡D ƒƒ}t ‡ ‡fdd„t ˆ¡D ƒƒ}tt||ƒƒ}|S )	Nz.wavz.m4az.mp3z.mp4z.flacc                    s.   g | ]&}t j |¡d  ˆ krt j ˆ|¡‘qS ©r   ©Úosr   ÚsplitextÚjoin©Ú.0Úfname)Ú
input_extsÚmix_dirr   r   Ú
<listcomp>“   s   þzmake_pair.<locals>.<listcomp>c                    s.   g | ]&}t j |¡d  ˆ krt j ˆ|¡‘qS rP   rQ   rU   )rX   Úinst_dirr   r   rZ   ˜   s   þ)ÚsortedrR   ÚlistdirÚlistÚzip)rY   r[   ZX_listZy_listÚfilelistr   )rX   r[   rY   r   Ú	make_pair   s    þþra   c                    sÞ   |dkr~t tj | d¡tj | d¡ƒ}t |¡ tˆ ƒdkrjtt|ƒ| ƒ}|d | … }|| d … ‰ qÖ‡ fdd„|D ƒ}nX|dkrÖtˆ ƒdkrštdƒ‚t tj | d	¡tj | d
¡ƒ}t tj | d¡tj | d¡ƒ‰ |ˆ fS )Nr9   ZmixturesZinstrumentsr   c                    s   g | ]}t |ƒˆ kr|‘qS r   )r^   )rV   Úpair©Úval_filelistr   r   rZ   ±   s   ÿz#train_val_split.<locals>.<listcomp>Zsubdirsz:`val_filelist` option is not available with `subdirs` modeztraining/mixturesztraining/instrumentszvalidation/mixtureszvalidation/instruments)	ra   rR   r   rT   r9   Úshuffler   ÚintÚ
ValueError)Zdataset_dirZ
split_modeZval_raterd   r`   Zval_sizeZtrain_filelistr   rc   r   Útrain_val_split£   s2    þ

ÿþþrh   c                 C   s6   |}||d  }|dkr|}|| |  | }|||fS )Nr8   r   r   )Úwidthr   ÚoffsetÚleftÚroi_sizeÚrightr   r   r   Úmake_paddingÆ   s    rn   c                 C   sf   g }t | ƒD ]T\}}t |||||¡\}}}	}
t t |¡ ¡ t |¡ ¡ g¡}| |	|
|g¡ q|S r   )r   r   Úcache_or_loadr   Úmaxr-   Úappend)r`   ÚsrÚ
hop_lengthÚn_fftÚretr<   r=   r2   r3   ZX_cache_pathZy_cache_pathrE   r   r   r   Úmake_training_setÐ   s        ÿ"rv   c                 C   s  g }d  |||||¡}tj|dd t| ƒD ]\\}}	tj tj |¡¡d }
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t	 |jd | ¡ƒ}t|ƒD ]€}tj |d	  |
|¡¡}|| }tj |¡s|t	j||d d …d d …||| …f |d d …d d …||| …f d
 | |¡ qq,|S )Nzcs{}_sr{}_hl{}_nf{}_of{}T©Úexist_okr   r8   )r   r   Úconstant)Úmodez
{}_p{}.npz)r2   r3   )r   rR   Úmakedirsr   r   rS   Úbasenamer   ro   r   rp   r-   rn   r   Úpadrf   ÚceilÚrangerT   ÚexistsÚsavezrq   )r`   r   rr   rs   rt   rj   rM   Z	patch_dirr<   r=   r|   r2   r3   r   rE   ÚlÚrrl   ZX_padZy_padZlen_datasetÚjÚoutpathÚstartr   r   r   Úmake_validation_setÜ   s.    "ýr‡   c           
      C   s|   t t| ƒ| dd|   ƒ}t t| ƒ| ƒ}t |¡d d d… d |… }tjj||dd}| |  ¡ }||  ¡ }	||	|fS )Nr   r"   F)Úreplace)rf   r   r   Úargsortr9   ÚchoicerA   )
r2   r3   Zoracle_lossZoracle_rateZoracle_drop_rateÚkÚnÚindicesZoracle_XZoracle_yr   r   r   Úget_oracle_dataû   s    rŽ   Ú__main__r   r8   é   Trw   iD¬  i   i   z{}/{}_Vocal.jpg)0rR   r9   Únumpyr   ÚtorchÚtorch.utils.datar   r   r   ÚModuleNotFoundErrorÚutilsrO   ÚDatasetr   rL   ra   rh   rn   rv   r‡   rŽ   rI   ÚsysÚargvrY   r[   Zoutdirr{   r`   Zmix_pathZ	inst_pathr   rS   r|   Zmix_basenamero   ÚX_specÚy_specr   r-   r4   r5   r6   r   r…   Úspectrogram_to_imageZv_imageÚimwriter   r   r   r   Ú<module>   sR   l#





    ÿ


