o
    
jB                     @   sd   d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlZ	d dl
Z
d dlmZ G dd deZdS )    N)Manager)ListTuple)Datasetc                       s|   e Zd ZdZ						d fdd	Zdd Zed	d
 Zdd Zdd Z	de
dee fddZdd Zedd Z  ZS )WaveGradDatasetz
    WaveGrad Dataset searchs for all the wav files under root path
    and converts them to acoustic features on the fly and returns
    random segments of (audio, feature) couples.
       TFc                    s   t    || _|| _|r|nd | _|| _|| _|| _|| _|| _	|
| _
|	| _|| _|r6|| dks6J d|| d|  | _|
rG|   d S d S )Nr   z- [!] seq_len has to be a multiple of hop_len.r   )super__init__ap	item_listseq_lenhop_len	pad_shortconv_padis_trainingreturn_segments	use_cacheuse_noise_augmentverbosefeat_frame_lencreate_feature_cache)selfr
   itemsr   r   r   r   r   r   r   r   r   	__class__ X/home/kuhnn/.local/lib/python3.10/site-packages/TTS/vocoder/datasets/wavegrad_dataset.pyr	      s$   
zWaveGradDataset.__init__c                 C   s:   t  | _| j | _|  jdd tt| jD 7  _d S )Nc                 S   s   g | ]}d qS Nr   ).0_r   r   r   
<listcomp>9   s    z8WaveGradDataset.create_feature_cache.<locals>.<listcomp>)r   managerlistcacherangelenr   r   r   r   r   r   6   s   &z$WaveGradDataset.create_feature_cachec                 C   s   t j tj| ddddS )Nz**z*.wavT)	recursive)globospathjoin)r*   r   r   r   find_wav_files;   s   zWaveGradDataset.find_wav_filesc                 C   s
   t | jS r   )r%   r   r&   r   r   r   __len__?   s   
zWaveGradDataset.__len__c                 C   s   |  |}|S r   )	load_item)r   idxitemr   r   r   __getitem__B   s   
zWaveGradDataset.__getitem__num_samplesreturnc                 C   sD   g }| j }d| _ t|D ]}| |\}}|||g q|| _ |S )a$  Return test samples.

        Args:
            num_samples (int): Number of samples to return.

        Returns:
            List[Tuple]: melspectorgram and audio.

        Shapes:
            - melspectrogram (Tensor): :math:`[C, T]`
            - audio (Tensor): :math:`[T_audio]`
        F)r   r$   r.   append)r   r2   samplesr   r/   melaudior   r   r   load_test_samplesF   s   z!WaveGradDataset.load_test_samplesc           	      C   s  | j | }| jr| j| dur| j| }ng| j|}| jrW|jd | j| j k r<t	j
|d| j| j t| fddd}|jd | j| j ksWJ |jd  d| j| j  |jd | j d | j |jd  }t	j
|d|fddd}| jr||| j|< | jrt|| j }td|}|| j }||| }| jr| jr| jr|d	t|  }| j|}|d
ddf }t| }t| d}||fS )zload (audio, feat) coupleNr   constantg        )modeconstant_valuesz vs    g       ?.)r   r   r#   r
   load_wavr   shaper   r   nppadr%   r   randomrandintr   r   torch
randn_likemelspectrogram
from_numpyfloatsqueeze)	r   r/   wavpathr7   p	max_startstartendr6   r   r   r   r.   \   s8   
$

zWaveGradDataset.load_itemc           	      C   s   t | dkrtdd | D n| d d jd }t | dkr'tdd | D n| d d jd }tt | | d d jd |g}tt | |g}t| D ]%\}}|d }|d }|||ddd|jd f< |||d|jd f< qN||fS )zNThis is used in tune_wavegrad.py.
        It pads sequences to the max length.r=   c                 S      g | ]	}|d  j d qS )r   r=   r?   r   br   r   r   r           z6WaveGradDataset.collate_full_clips.<locals>.<listcomp>r   c                 S   rO   )r=   r   rP   rQ   r   r   r   r       rS   N)r%   maxr?   rD   zeros	enumerate)	batchmax_mel_lengthmax_audio_lengthmelsaudiosr/   rR   r6   r7   r   r   r   collate_full_clips   s   00"z"WaveGradDataset.collate_full_clips)r   TTFFF)__name__
__module____qualname____doc__r	   r   staticmethodr,   r-   r1   intr   r   r8   r.   r\   __classcell__r   r   r   r   r      s$    #
+r   )r(   r)   rB   multiprocessingr   typingr   r   numpyr@   rD   torch.utils.datar   r   r   r   r   r   <module>   s    