U
    %d                     @   s   d dl Z d dlmZ d dlmZmZmZ d dlZd dlm	Z	 d dl
mZ d dlmZ d dlmZ dZd	Zd
ZdZdddZdd Zeeee	eeeef dddZG dd deZdS )    N)Path)OptionalTupleUnion)Tensor)download_url_to_file)Dataset)extract_archiveZSpeechCommandsspeech_commands_v0.02Z_nohash_Z_background_noise_Z@743935421bb51cccdb6bdd152e04c5c70274e935c82119ad7faeec31780d811dZ@af14739ee7dc311471de98f5f9d2c9191b18aedfe957f4a6ff791c709868ff58)zXhttps://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.01.tar.gzzXhttps://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.02.tar.gzc              
      sJ   g }|D ]<}t j |}t|}| fdd|D 7 }W 5 Q R X q|S )Nc              	      s&   g | ]}t jt j | qS  )ospathnormpathjoinstrip).0linerootr   F/tmp/pip-unpacked-wheel-lbdmvq91/torchaudio/datasets/speechcommands.py
<listcomp>   s     z_load_list.<locals>.<listcomp>)r   r   r   open)r   	filenamesoutputfilenamefilepathfileobjr   r   r   
_load_list   s    
"r   )r   r   returnc                 C   sp   t j| |}t j|\}}t j|\}}t j|\}}|t\}}t|}t| \}	}
|	|
|||fS N)	r   r   relpathsplitsplitextHASH_DIVIDERint
torchaudioload)r   r   r    labelr   Zspeaker_Z
speaker_idZutterance_numberZwaveformZsample_rater   r   r   load_speechcommands_item   s    r)   c                   @   sj   e Zd ZdZeeddfeeef eee	e
e ddddZeeeeeeef ddd	Zed
ddZdS )SPEECHCOMMANDSa?  Create a Dataset for *Speech Commands* [:footcite:`speechcommandsv2`].

    Args:
        root (str or Path): Path to the directory where the dataset is found or downloaded.
        url (str, optional): The URL to download the dataset from,
            or the type of the dataset to dowload.
            Allowed type values are ``"speech_commands_v0.01"`` and ``"speech_commands_v0.02"``
            (default: ``"speech_commands_v0.02"``)
        folder_in_archive (str, optional):
            The top-level directory of the dataset. (default: ``"SpeechCommands"``)
        download (bool, optional):
            Whether to download the dataset if it is not found at root path. (default: ``False``).
        subset (str or None, optional):
            Select a subset of the dataset [None, "training", "validation", "testing"]. None means
            the whole dataset. "validation" and "testing" are defined in "validation_list.txt" and
            "testing_list.txt", respectively, and "training" is the rest. Details for the files
            "validation_list.txt" and "testing_list.txt" are explained in the README of the dataset
            and in the introduction of Section 7 of the original paper and its reference 12. The
            original paper can be found `here <https://arxiv.org/pdf/1804.03209.pdf>`_. (Default: ``None``)
    FN)r   urlfolder_in_archivedownloadsubsetr   c                    s  |d ks|dkst d|dkr:d}d}tj||| }t|}tj|}tj||}	|ddd }tj||}tj||| _|rtj| jstj	|	st
|d }
t||	|
d	 t|	| j n tj| jstd
| j d|dkrt| jd| _n|dkr&t| jd| _n~|dkrvtt| jdd tdd t| jdD } fdd|D | _n.tdd t| jdD }dd |D | _d S )N)training
validationtestingzXWhen `subset` not None, it must take a value from {'training', 'validation', 'testing'}.)zspeech_commands_v0.01r
   z<https://storage.googleapis.com/download.tensorflow.org/data/z.tar.gz.   r   )Zhash_prefixz	The path zT doesn't exist. Please check the ``root`` path or set `download=True` to download itr0   zvalidation_list.txtr1   ztesting_list.txtr/   c                 s   s   | ]}t |V  qd S r   strr   pr   r   r   	<genexpr>}   s     z*SPEECHCOMMANDS.__init__.<locals>.<genexpr>z*/*.wavc                    s0   g | ](}t |krt|krtj| kr|qS r   )r#   EXCEPT_FOLDERr   r   r   r   wZexcludesr   r   r   ~   s
     z+SPEECHCOMMANDS.__init__.<locals>.<listcomp>c                 s   s   | ]}t |V  qd S r   r4   r6   r   r   r   r8      s     c                 S   s    g | ]}t |krt|kr|qS r   )r#   r9   r:   r   r   r   r      s       )AssertionErrorr   r   r   fspathbasenamersplit_pathisdirisfile
_CHECKSUMSgetr   r	   existsRuntimeErrorr   _walkersetsortedr   glob)selfr   r+   r,   r-   r.   base_urlZext_archiver?   archiveZchecksumwalkerr   r<   r   __init__I   sF    	





zSPEECHCOMMANDS.__init__)nr   c                 C   s   | j | }t|| jS )a  Load the n-th sample from the dataset.

        Args:
            n (int): The index of the sample to be loaded

        Returns:
            (Tensor, int, str, str, int):
            ``(waveform, sample_rate, label, speaker_id, utterance_number)``
        )rH   r)   rA   )rL   rQ   Zfileidr   r   r   __getitem__   s    

zSPEECHCOMMANDS.__getitem__)r   c                 C   s
   t | jS r   )lenrH   )rL   r   r   r   __len__   s    zSPEECHCOMMANDS.__len__)__name__
__module____qualname____doc__URLFOLDER_IN_ARCHIVEr   r5   r   boolr   rP   r$   r   r   rR   rT   r   r   r   r   r*   3   s   
>r*   )r   pathlibr   typingr   r   r   r%   Ztorchr   Z	torch.hubr   Ztorch.utils.datar   Ztorchaudio.datasets.utilsr	   rZ   rY   r#   r9   rD   r   r5   r$   r)   r*   r   r   r   r   <module>   s"   	 