Ë
    ÿÍ:j¦!  ã                   ój   — 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 d dlZeeee	f   Z
	  G d„ d«      Zy)é    )ÚPath)ÚTextÚUnionN)ÚTensorc            	       óÆ   ‡ — e Zd ZdZededefd„«       Zededefd„«       Z	ede
eef   defd„«       Zdedefd	„Zdd
edefˆ fd„Zded
edefd„Z	 ddedededefd„Zˆ xZS )ÚAudiouI  Audio IO with on-the-fly resampling

    Parameters
    ----------
    sample_rate: int
        Target sample rate.
    mono : int, optional
        Convert multi-channel to mono. Defaults to True.

    Usage
    -----
    >>> audio = Audio(sample_rate=16000)
    >>> samples = audio("/path/to/audio.wav")

    #Â on-the-fly resampling
    >>> original_sample_rate = 44100
    >>> two_seconds_stereo = torch.rand(2, 2 * original_sample_rate)
    >>> samples = audio({"samples": two_seconds_stereo, "sample_rate": original_sample_rate})
    >>> assert samples.shape[1] == 2 * 16000
    ÚfileÚreturnc                 ó  — t        | t        «      r{d| v rg| d   }t        |j                  «      dk7  s|j                  d   |j                  d   kD  rt	        d«      ‚| j                  dd «      }|€t	        d«      ‚yd	| v ryt	        d
«      ‚y)NÚsamplesé   r   é   z='samples' must be provided as a (channel, time) torch.Tensor.Úsample_ratez4'samples' must be provided with their 'sample_rate'.TÚaudioz1either 'audio' or 'samples' key must be provided.)Ú
isinstanceÚdictÚlenÚshapeÚ
ValueErrorÚget)r	   r   r   s      ús/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/torch_audiomentations/utils/io.pyÚis_validzAudio.is_valid.   sŸ   € ä�dœDÔ!Ø˜DÑ Ø˜y™/�Ü�w—}‘}Ó%¨Ò*¨g¯m©m¸AÑ.>ÀÇÁÈqÑAQÒ.QÜ$ØWóð ð #Ÿh™h }°dÓ;�ØÐ&Ü$ØNóð ð à˜D‘Øô !Ð!TÓUÐUàó    r   c                 óp   — | j                  «       j                  dd¬«      j                  «       }| |dz   z  S )a  Power-normalize samples

        Parameters
        ----------
        samples : (..., time) Tensor
            Single (or multichannel) samples or batch of samples

        Returns
        -------
        samples: (..., time) Tensor
            Power-normalized samples
        éÿÿÿÿT©ÚdimÚkeepdimg:Œ0âŽyE>)ÚsquareÚmeanÚsqrt)r   Úrmss     r   Úrms_normalizezAudio.rms_normalizeH   s8   € ð �n‰nÓ×#Ñ#¨°DÐ#Ó9×>Ñ>Ó@ˆØ˜# ™*Ñ%Ð%r   Ú	file_pathc                 óÚ   — t        j                  t        | «      «      }t        |«      t        u r!|\  }}|j
                  }|j                  }||fS |j                  }|j                  }||fS )z"Return (num_samples, sample_rate).)	Ú
torchaudioÚinfoÚstrÚtypeÚtupleÚlengthÚrateÚ
num_framesr   )r$   r'   ÚsiÚeiÚnum_samplesr   s         r   Úget_audio_metadatazAudio.get_audio_metadataY   sm   € ô �‰œs 9›~Ó.ˆô �‹:œÑØ‰FˆB�ØŸ)™)ˆKØŸ'™'ˆKð ˜KÐ'Ð'ð Ÿ/™/ˆKØ×*Ñ*ˆKØ˜KÐ'Ð'r   c                 ó  — | j                  |«       t        |t        «      r4d|v r|d   j                  d   }|d   }n,| j	                  |d   «      \  }}n| j	                  |«      \  }}t        j                  || j                  z  |z  «      S )zTNumber of samples (in target sample rate)

        :param file: audio file

        r   r   r   r   )r   r   r   r   r1   ÚmathÚceilr   )Úselfr	   r0   r   s       r   Úget_num_sampleszAudio.get_num_samplesh   s‘   € ð 	�‰�dÔä�dœDÔ!à˜DÑ Ø" 9™o×3Ñ3°AÑ6�Ø" =Ñ1‘ð ,0×+BÑ+BÀ4ÈÁ=Ó+QÑ(�™[ð (,×'>Ñ'>¸tÓ'DÑ$ˆK˜ä�y‰y˜ t×'7Ñ'7Ñ7¸+ÑEÓFÐFr   r   Úmonoc                 ó>   •— t         ‰| �  «        || _        || _        y )N)ÚsuperÚ__init__r   r7   )r5   r   r7   Ú	__class__s      €r   r:   zAudio.__init__�   s   ø€ Ü‰ÑÔØ&ˆÔØˆ�	r   c                 óÜ   — | j                   r%|j                  d   dkD  r|j                  dd¬«      }| j                  |k7  r+t        j
                  j                  ||| j                  «      }|S )a2  Downmix and resample

        Parameters
        ----------
        samples : (channel, time) Tensor
            Samples.
        sample_rate : int
            Original sample rate.

        Returns
        -------
        samples : (channel, time) Tensor
            Remixed and resampled samples
        r   r   Tr   )r7   r   r    r   r&   Ú
functionalÚresample)r5   r   r   s      r   Údownmix_and_resamplezAudio.downmix_and_resample†   sg   € ð" �9Š9˜Ÿ™ qÑ)¨AÒ-Ø—l‘l q°$�lÓ7ˆGð ×Ñ˜{Ò*Ü ×+Ñ+×4Ñ4Ø˜ d×&6Ñ&6óˆGð ˆr   Úsample_offsetr0   c                 ó¨  — | j                  |«       d}t        |t        «      red|v r,|d   }|d   }|j                  d   }|j	                  dd«      }nVt        |d   «      }| j                  |«      \  }}|j	                  dd«      }n!t        |«      }| j                  |«      \  }}d}t        ||z  | j                  z  «      }	|€||	z
  }
nt        ||z  | j                  z  «      }
|	|
z   |kD  r
t        «       ‚|€	 t        j                  |	|
¬«      \  }}n|dd…|	|	|
z   …f   }|�||dz
  |…dd…f   }| j                  ||«      }|�o|j                  d	   |kD  r|dd…d|…f   }|S |j                  d	   |k  r>||j                  d	   z
  }t        j                   j"                  j%                  |d
|f«      }|S # t        $ r t        d«      ‚w xY w)a©  

        Parameters
        ----------
        file : AudioFile
            Audio file.
        sample_offset : int, optional
            Start loading at this `sample_offset` sample. Defaults ot 0.
        num_samples : int, optional
            Load that many samples. Defaults to load up to the end of the file.

        Returns
        -------
        samples : (time, channel) torch.Tensor
            Samples

        Nr   r   r   Úchannelr   )Úframe_offsetr-   z~It looks like you are using an unsupported version of torchaudio. If you have 0.6 or older, please upgrade to a newer version.r   r   )r   r   r   r   r   r(   r1   Úroundr   r   r&   ÚloadÚ	TypeErrorÚ	Exceptionr?   ÚtorchÚnnr=   Úpad)r5   r	   r@   r0   Úoriginal_samplesÚoriginal_sample_rateÚoriginal_total_num_samplesrB   Ú
audio_pathÚoriginal_sample_offsetÚoriginal_num_samplesÚoriginal_dataÚ_ÚresultÚdiffs                  r   Ú__call__zAudio.__call__¢   sK  € ð* 	�‰�dÔàÐä�dœDÔ!à˜DÑ Ø#'¨	¡?Ð Ø'+¨MÑ':Ð$Ø-=×-CÑ-CÀAÑ-FÐ*ØŸ(™( 9¨dÓ3‘ô !  g¡Ó/�
ð ×+Ñ+¨JÓ7ñØ.Ø(àŸ(™( 9¨dÓ3‘ô ˜T›ˆJØ?C×?VÑ?VØó@Ñ<Ð&Ð(<ð ˆGä!&ØÐ0Ñ0°4×3CÑ3CÑCó"
Ðð ÐØ#=Ð@VÑ#VÑ ä#(ØÐ2Ñ2°T×5EÑ5EÑEó$Ð ð "Ð$8Ñ8Ð;UÒUÜ“,ÐàÐ#ð
Ü#-§?¡?ØØ!7Ø3ô$Ñ �™qð -ÚÐ)Ð,BÐEYÑ,YÐYÐYñˆMð ÐØ)¨'°A©+¸Ð*?ÂÐ*BÑCˆMà×*Ñ*¨=Ð:NÓOˆàÐ"à�|‰|˜BÑ +Ò-Ø¢ < K < Ñ0�ð
 ˆð	 —‘˜bÑ! KÒ/Ø" V§\¡\°"Ñ%5Ñ5�ÜŸ™×,Ñ,×0Ñ0°¸!¸T¸ÓC�àˆøô1 ò ÜðTóð ðús   Ã=F< Æ<G)T)r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstaticmethodÚ	AudioFileÚboolr   r   r#   r   r(   r   r*   r1   Úintr6   r:   r?   rU   Ú__classcell__)r;   s   @r   r   r      së   ø„ ñð* ð�yð  Tò ó ðð2 ð&˜vð &¨&ò &ó ð&ð  ð( e¨C°¨IÑ&6ð (¸5ò (ó ð(ðG Ið G°#ó Gñ2 Cð ¨tõ ð
¨Fð Àð Èó ð: KOñ^Øð^Ø.1ð^ØDGð^à	÷^r   r   )Úpathlibr   Útypingr   r   rH   r&   r   r3   r   r[   r   © r   r   ú<module>rb      s9   ðÝ ß ã Û Ý ã à�$˜˜dÐ"Ñ#€	ð
÷hò hr   