o
    oi:"                     @   s0  d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	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mZ d dlmZmZ d dlmZ d d	lmZ 	
					dJdededededededede
e defddZG dd deZ dKdededede
e dej!f
ddZ"e#d kre $ Z%e%j&d!ed"d# e%j&d$ed%d# e%j&d&ed'd# e%j&d(edd) e%j&d*ed
d+d, e%j&d-ed.d/d, e%j&d0ed1d2d, e%j&d3edd4d, e%j&d5d6d7 e%j&d8edd9d, e%' Z(e(j)*d:se( j)d:7  _)ed; d<Z+e(j,e+vre-d=e+ d>e(j, e(j,dg d?iZ.e/e(j0SZ1ej23e(j0Z4e4e.e(j, d@< e5dAe4  dBefdCdDZ6ee7e(j8dEZ9e9:e6e1dFZ;e<e;e.e(j, dG< W d   n	1 scw   Y  e5dH W d   n	1 sxw   Y  ee(j)e.e(j=e(j>e(j?e(j@A e(jBe(jCe(j8dI	 dS dS )L    N)Pool)NamedTemporaryFile)ListOptional)logger)Tensor)
DataLoaderDataset)resample)init_loggerfloat32pcmF   	file_namedatasrmax_freqdtypecodecmonocompressionnum_workersc	                 C   sl  |dkr|d }d}	|durd}	t j| dddd}
t  tt |
jd	< tj	| |
jd
< ||
jd< ||
jd< ||
jd< ||
jd< |
 D ]\}}z|
|}W n tyj   td|  |
| }Y nw t||d ||||	d}t||ddd}t|}t|D ]y\}}tj|d d |d }|d d  }|dv r| }|d |d k rtd| d|j d || d }t|dd| d | d! |d dkrq|d"d#}||v rtd$| d% ||= |j|||d&}|d |jd< ~~qtd'|| qJW d   n1 sw   Y  W d   dS W d   dS 1 s/w   Y  dS )(zCreates a HDF5 dataset based on the provided dict.

    Args:
        file_name: Full path of the HDF5 dataset file.
        data: Dictionary containing for each key (dataset group) a list of file names
            to pre-process and store.
    r      N   alatestT)libverswmrdb_iddb_namer   r   r   r   zFound existing group files)
file_namesr   r   r   r      F)r   
batch_sizeshuffler   working_dirr   )flacvorbis	n_samplesd   zShort audio z: .z2.0fz% | Writing file z to the z	 dataset./_zFound dataset z. Replacing.)r   r   z!Added {} samples to the group {}.)h5Filetorchno_gradinttimeattrsospathbasenameitemscreate_group
ValueErrorr   infoPreProcessingDatasetr   len	enumeraterelpathnumpysqueezewarningshapereplacecreate_datasetformat)r   r   r   r   r   r   r   r   r   compression_factorfkey	data_dictgrpdatasetloaderr)   isamplefnaudioprogressds_keyds rU   U/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/df/scripts/prepare_data.pywrite_to_h5   sd    



TrW   c                   @   sX   e Zd Z					ddedee dee fdd	Zd
edefddZ	dd Z
dd ZdS )r<   Nr   r   Fr   r"   r   c                 C   sh   |pg | _ || _|dkrtj| _n|dkrtj| _ntd| | _| jdkr,tj| _|| _	|| _
d S )Nr   int16zUnkown dtyper(   )r"   r   npr   r   rX   r:   lowerr   r   r   )selfr   r"   r   r   r   r   rU   rU   rV   __init___   s   
	




zPreProcessingDataset.__init__filereturnc                 C   s   t  Z t d t|}|j| jkr(tj|dd\}}t||| jdd}n	tj|dd\}}| j	rB|j
d dkrB|jddd	}| dkrV|dd
}W d    |S W d    |S 1 saw   Y  |S )NignoreT)	normalizekaiser_best)new_srmethodFr   r#   )keepdimr   )warningscatch_warningssimplefilter
torchaudior;   sample_rater   loadr
   r   rC   meandimreshape)r[   r]   metaxr   rU   rU   rV   readv   s$   




zPreProcessingDataset.readc                 C   s~   | j | }td|  | |}| dkr|jd dks*J d| d|j |jd }t|| j| j| j	}|||dS )	NzReading audio file r   r      zGot sample z with unexpected shape r#   )r   r   r)   )
r"   r   debugrp   rl   rC   encoder   r   r   )r[   indexrP   ro   r)   rU   rU   rV   __getitem__   s   

0
z PreProcessingDataset.__getitem__c                 C   s
   t | jS N)r=   r"   )r[   rU   rU   rV   __len__   s   
zPreProcessingDataset.__len__)Nr   r   FN)__name__
__module____qualname__r2   r   strr   r\   r   rp   ru   rw   rU   rU   rU   rV   r<   ^   s     
	r<   ro   r^   c              	   C   s   |dkr3t dd }tj|j| |d|d tjt| tjd} W d    | S 1 s,w   Y  | S |dkrgt dd!}tj|j| |d|dd	 tjt| tjd} W d    | S 1 s`w   Y  | S |d
krq| 	 } | S t
d| d)Nr(   z.ogg)suffix)rF   r   )r   r'   z.flacrq   )rF   r   bits_per_sampler   zCodec 'z' not supported.)r   rh   savenamerY   arraylistrp   uint8r@   NotImplementedError)ro   r   r   r   tfrU   rU   rV   rs      s6   

rs   __main__typez$Either 'speech', 'noise' or 'noisy'.)r   helpaudio_fileszCText file containing speech or noise files separated by a new line.hdf5_dbz0HDF5 file name where the data will be stored in.z--num_workers)r   defaultz
--max_freqzOnly frequencies below the specified frequency will be considered during loss computation.
This is useful for upsampled signals, that contain no information in higher frequencies.)r   r   r   z--sri  zSample rate to resample to.z--dtyperX   zJDtype that will be used to store the audio files. Can be float32 or int16.z--codeczQcodec that will be stored in the database. Can be PCM or Vorbis. Defaults to PCM.z--mono
store_true)actionz--compressionz'HDF5 dataset compression (e.g. `gzip`).z.hdf5z/tmp/prepare_data.log)speechnoisenoisyrirzDataset type must be one of z
, but got )r&   r!   r&   zUsing speech working directory r]   c                 C   s2   t jt|  } t j| std|  d| S )Nzfile z
 not found)r5   r6   joinr&   stripisfileFileNotFoundError)r]   rU   rU   rV   _check_file   s   r   r#   r*   r!   z!Checking all audio files complete)	r   r   r   r   r   r   r   r   r   )r   r   r   FNr   rv   )Dargparser5   r3   re   multiprocessingr   tempfiler   typingr   r   h5pyr.   r@   rY   r0   rh   logurur   r   torch.utils.datar   r	   df.ior
   	df.loggerr   r{   dictr2   boolrW   r<   ndarrayrs   rx   ArgumentParserparseradd_argument
parse_argsargsr   endswithvalid_typesr   r:   r   openr   rH   r6   dirnamer&   r;   r   maxr   pimapresr   r   r   r   r   rZ   r   r   rU   rU   rU   rV   <module>   s   	
G&5

