Ë
    ÿÍ:j<  ã                   ó  — d dl Z d dlmZ d dlmZmZmZmZmZm	Z	 d dl
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d	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ  ed«      deeee   f   fd„«       Zdefd„Z d„ Z!d„ Z"d„ Z#y)é    N)Ú	lru_cache)ÚBinaryIOÚDictÚOptionalÚTupleÚTypeÚUnion)Úlazy_import_sox_ext)ÚCodecConfig)Úlazy_import_ffmpeg_exté   )Úsoundfile_backend)ÚBackend)ÚAudioMetaData)ÚFFmpegBackend)ÚSoundfileBackend)Ú
SoXBackendÚreturnc                  óÀ   — i } t        «       j                  «       r	t        | d<   t        «       j                  «       r	t        | d<   t
        j                  r	t        | d<   | S )NÚffmpegÚsoxÚ	soundfile)r   Úis_availabler   r
   r   r   Ú_IS_SOUNDFILE_AVAILABLEr   )Úbackend_specss    ún/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/torchaudio/_backend/utils.pyÚget_available_backendsr      sR   € à.0€MÜÓ×,Ñ,Ô.Ü"/ˆ�hÑÜÓ×)Ñ)Ô+Ü)ˆ�eÑÜ×0Ò0Ü%5ˆ�kÑ"ØÐó    c                 ó‚   — |j                  | «      x}r|S t        d| › d�dt        |j                  «       «      › d�«      ‚)NzUnsupported backend 'z' specified; zplease select one of z	 instead.)ÚgetÚ
ValueErrorÚlistÚkeys)Úbackend_nameÚbackendsÚbackends      r   Úget_backendr'   !   sL   € Ø—,‘,˜|Ó,Ð,€wÐ,ØˆäØ# L >°Ð?Ø#¤D¨¯©«Ó$9Ð#:¸)ÐDó
ð 	
r   c                  óR  ‡‡— t        «       Šdt        t        t        t        j
                  f   dt        t           dt        t           dt        fˆfd„Š	 	 	 d	dt        t        t        t        j
                  f   dt        t           dt        dt        t           dt        f
ˆfd„} | S )
NÚuriÚformatr$   r   c                 óš   •— |�t        |‰«      S ‰j                  «       D ]  }|j                  | |«      sŒ|c S  t        d| › d|› d�«      ‚©Nz0Couldn't find appropriate backend to handle uri z and format ú.©r'   ÚvaluesÚ
can_decodeÚRuntimeError©r)   r*   r$   r&   r%   s       €r   Ú
dispatcherz!get_info_func.<locals>.dispatcher.   ód   ø€ ð Ð#Ü˜|¨XÓ6Ð6à—‘Ó(ò 	ˆGØ×!Ñ! # vÕ.Ø’ð	ô ÐMÈcÈUÐR^Ð_eÐ^fÐfgÐhÓiÐir   Úbuffer_sizer&   c                 ó>   •—  ‰| ||«      }|j                  | ||«      S )a­  Get signal information of an audio file.

        Note:
            When the input type is file-like object, this function cannot
            get the correct length (``num_samples``) for certain formats,
            such as ``vorbis``.
            In this case, the value of ``num_samples`` is ``0``.

        Args:
            uri (path-like object or file-like object):
                Source of audio data. The following types are accepted:

                * ``path-like``: File path or URL.
                * ``file-like``: Object with ``read(size: int) -> bytes`` method,
                  which returns byte string of at most ``size`` length.

            format (str or None, optional):
                If not ``None``, interpreted as hint that may allow backend to override the detected format.
                (Default: ``None``)

            buffer_size (int, optional):
                Size of buffer to use when processing file-like objects, in bytes. (Default: ``4096``)

            backend (str or None, optional):
                I/O backend to use.
                If ``None``, function selects backend given input and available backends.
                Otherwise, must be one of [``"ffmpeg"``, ``"sox"``, ``"soundfile"``],
                with the corresponding backend available.
                (Default: ``None``)

                .. seealso::
                   :ref:`backend`

        Returns:
            AudioMetaData
        )Úinfo)r)   r*   r5   r&   r3   s       €r   r7   zget_info_func.<locals>.info9   s'   ø€ ñT ˜S &¨'Ó2ˆØ�|‰|˜C ¨Ó5Ð5r   )Né   N)
r   r	   r   ÚstrÚosÚPathLiker   r   Úintr   )r7   r%   r3   s    @@r   Úget_info_funcr=   +   s­   ù€ Ü%Ó'€Hð	jÜ”8œS¤"§+¡+Ð-Ñ.ð	jÜ8@Ä¹ð	jÜU]Ô^aÑUbð	jä	õ	jð !%ØØ!%ñ	+6Ü”8œS¤"§+¡+Ð-Ñ.ð+6äœ‘ð+6ô ð+6ô œ#‘ð	+6ô
 
õ+6ðZ €Kr   c                  ó¸  ‡‡— t        «       Šdt        t        t        t        j
                  f   dt        t           dt        t           dt        fˆfd„Š	 	 	 	 	 	 	 ddt        t        t        t        j
                  f   dt        dt        dt        d	t        dt        t           d
t        dt        t           dt        t        j                  t        f   fˆfd„} | S )Nr)   r*   r$   r   c                 óš   •— |�t        |‰«      S ‰j                  «       D ]  }|j                  | |«      sŒ|c S  t        d| › d|› d�«      ‚r,   r.   r2   s       €r   r3   z!get_load_func.<locals>.dispatcherl   r4   r   Úframe_offsetÚ
num_framesÚ	normalizeÚchannels_firstr5   r&   c           	      óp   •— t        j                  d«        ‰| ||«      }|j                  | ||||||«      S )a*  Load audio data from source.

        .. warning::
            In 2.9, this function's implementation will be changed to use
            :func:`~torchaudio.load_with_torchcodec` under the hood. Some
            parameters like ``normalize``, ``format``, ``buffer_size``, and
            ``backend`` will be ignored. We recommend that you port your code to
            rely directly on TorchCodec's decoder instead:
            https://docs.pytorch.org/torchcodec/stable/generated/torchcodec.decoders.AudioDecoder.html#torchcodec.decoders.AudioDecoder.

        By default (``normalize=True``, ``channels_first=True``), this function returns Tensor with
        ``float32`` dtype, and the shape of `[channel, time]`.

        Note:
            The formats this function can handle depend on the availability of backends.
            Please use the following functions to fetch the supported formats.

            - FFmpeg: :py:func:`torchaudio.utils.ffmpeg_utils.get_audio_decoders`
            - Sox: :py:func:`torchaudio.utils.sox_utils.list_read_formats`
            - SoundFile: Refer to `the official document <https://pysoundfile.readthedocs.io/>`__.

        .. warning::

            ``normalize`` argument does not perform volume normalization.
            It only converts the sample type to `torch.float32` from the native sample
            type.

            When the input format is WAV with integer type, such as 32-bit signed integer, 16-bit
            signed integer, 24-bit signed integer, and 8-bit unsigned integer, by providing ``normalize=False``,
            this function can return integer Tensor, where the samples are expressed within the whole range
            of the corresponding dtype, that is, ``int32`` tensor for 32-bit signed PCM,
            ``int16`` for 16-bit signed PCM and ``uint8`` for 8-bit unsigned PCM. Since torch does not
            support ``int24`` dtype, 24-bit signed PCM are converted to ``int32`` tensors.

            ``normalize`` argument has no effect on 32-bit floating-point WAV and other formats, such as
            ``flac`` and ``mp3``.

            For these formats, this function always returns ``float32`` Tensor with values.


        Args:
            uri (path-like object or file-like object):
                Source of audio data.
            frame_offset (int, optional):
                Number of frames to skip before start reading data.
            num_frames (int, optional):
                Maximum number of frames to read. ``-1`` reads all the remaining samples,
                starting from ``frame_offset``.
                This function may return the less number of frames if there is not enough
                frames in the given file.
            normalize (bool, optional):
                When ``True``, this function converts the native sample type to ``float32``.
                Default: ``True``.

                If input file is integer WAV, giving ``False`` will change the resulting Tensor type to
                integer type.
                This argument has no effect for formats other than integer WAV type.

            channels_first (bool, optional):
                When True, the returned Tensor has dimension `[channel, time]`.
                Otherwise, the returned Tensor's dimension is `[time, channel]`.

            format (str or None, optional):
                If not ``None``, interpreted as hint that may allow backend to override the detected format.
                (Default: ``None``)

            buffer_size (int, optional):
                Size of buffer to use when processing file-like objects, in bytes. (Default: ``4096``)

            backend (str or None, optional):
                I/O backend to use.
                If ``None``, function selects backend given input and available backends.
                Otherwise, must be one of [``"ffmpeg"``, ``"sox"``, ``"soundfile"``],
                with the corresponding backend being available. (Default: ``None``)

                .. seealso::
                   :ref:`backend`

        Returns:
            (torch.Tensor, int): Resulting Tensor and sample rate.
                If the input file has integer wav format and normalization is off, then it has
                integer type, else ``float32`` type. If ``channels_first=True``, it has
                `[channel, time]` else `[time, channel]`.
        a¤  In 2.9, this function's implementation will be changed to use torchaudio.load_with_torchcodec` under the hood. Some parameters like ``normalize``, ``format``, ``buffer_size``, and ``backend`` will be ignored. We recommend that you port your code to rely directly on TorchCodec's decoder instead: https://docs.pytorch.org/torchcodec/stable/generated/torchcodec.decoders.AudioDecoder.html#torchcodec.decoders.AudioDecoder.)ÚwarningsÚwarnÚload)	r)   r@   rA   rB   rC   r*   r5   r&   r3   s	           €r   rG   zget_load_func.<locals>.loadw   sE   ø€ ô| 	�‰ðKô	
ñ ˜S &¨'Ó2ˆØ�|‰|˜C ¨z¸9ÀnÐV\Ð^iÓjÐjr   )r   éÿÿÿÿTTNr8   N)r   r	   r   r9   r:   r;   r   r   r<   Úboolr   ÚtorchÚTensor)rG   r%   r3   s    @@r   Úget_load_funcrL   i   s  ù€ Ü%Ó'€Hð	jÜ”8œS¤"§+¡+Ð-Ñ.ð	jÜ8@Ä¹ð	jÜU]Ô^aÑUbð	jä	õ	jð ØØØ#Ø $ØØ!%ñgkÜ”8œS¤"§+¡+Ð-Ñ.ðgkäðgkô ðgkô ð	gkô
 ðgkô œ‘ðgkô ðgkô œ#‘ðgkô 
Œu�|‰|œSÐ Ñ	!õgkðR €Kr   c                  óø  ‡‡— t        «       Šdt        t        t        t        j
                  f   dt        t           dt        t           dt        fˆfd„Š	 	 	 	 	 	 	 ddt        t        t        t        j
                  f   dt        j                  dt        dt        dt        t           d	t        t           d
t        t           dt        dt        t           dt        t        t        t        t        f      fˆfd„} | S )Nr)   r*   r$   r   c                 óš   •— |�t        |‰«      S ‰j                  «       D ]  }|j                  | |«      sŒ|c S  t        d| › d|› d�«      ‚r,   )r'   r/   Ú
can_encoder1   r2   s       €r   r3   z!get_save_func.<locals>.dispatcheræ   r4   r   ÚsrcÚsample_raterC   ÚencodingÚbits_per_sampler5   r&   Úcompressionc
                 ót   •— t        j                  d«        ‰
| ||«      }|j                  | ||||||||	«	      S )aL  Save audio data to file.

        .. warning::
            In 2.9, this function's implementation will be changed to use
            :func:`~torchaudio.save_with_torchcodec` under the hood. Some
            parameters like format, encoding, bits_per_sample, buffer_size, and
            ``backend`` will be ignored. We recommend that you port your code to
            rely directly on TorchCodec's decoder instead:
            https://docs.pytorch.org/torchcodec/stable/generated/torchcodec.encoders.AudioEncoder

        Note:
            The formats this function can handle depend on the availability of backends.
            Please use the following functions to fetch the supported formats.

            - FFmpeg: :py:func:`torchaudio.utils.ffmpeg_utils.get_audio_encoders`
            - Sox: :py:func:`torchaudio.utils.sox_utils.list_write_formats`
            - SoundFile: Refer to `the official document <https://pysoundfile.readthedocs.io/>`__.

        Args:
            uri (str or pathlib.Path): Path to audio file.
            src (torch.Tensor): Audio data to save. must be 2D tensor.
            sample_rate (int): sampling rate
            channels_first (bool, optional): If ``True``, the given tensor is interpreted as `[channel, time]`,
                otherwise `[time, channel]`.
            format (str or None, optional): Override the audio format.
                When ``uri`` argument is path-like object, audio format is
                inferred from file extension. If the file extension is missing or
                different, you can specify the correct format with this argument.

                When ``uri`` argument is file-like object,
                this argument is required.

                Valid values are ``"wav"``, ``"ogg"``, and ``"flac"``.
            encoding (str or None, optional): Changes the encoding for supported formats.
                This argument is effective only for supported formats, i.e.
                ``"wav"`` and ``""flac"```. Valid values are

                - ``"PCM_S"`` (signed integer Linear PCM)
                - ``"PCM_U"`` (unsigned integer Linear PCM)
                - ``"PCM_F"`` (floating point PCM)
                - ``"ULAW"`` (mu-law)
                - ``"ALAW"`` (a-law)

            bits_per_sample (int or None, optional): Changes the bit depth for the
                supported formats.
                When ``format`` is one of ``"wav"`` and ``"flac"``,
                you can change the bit depth.
                Valid values are ``8``, ``16``, ``24``, ``32`` and ``64``.

            buffer_size (int, optional):
                Size of buffer to use when processing file-like objects, in bytes. (Default: ``4096``)

            backend (str or None, optional):
                I/O backend to use.
                If ``None``, function selects backend given input and available backends.
                Otherwise, must be one of [``"ffmpeg"``, ``"sox"``, ``"soundfile"``],
                with the corresponding backend being available.
                (Default: ``None``)

                .. seealso::
                   :ref:`backend`

            compression (CodecConfig, float, int, or None, optional):
                Compression configuration to apply.

                If the selected backend is FFmpeg, an instance of :py:class:`CodecConfig` must be provided.

                Otherwise, if the selected backend is SoX, a float or int value corresponding to option ``-C`` of the
                ``sox`` command line interface must be provided. For instance:

                ``"mp3"``
                    Either bitrate (in ``kbps``) with quality factor, such as ``128.2``, or
                    VBR encoding with quality factor such as ``-4.2``. Default: ``-4.5``.

                ``"flac"``
                    Whole number from ``0`` to ``8``. ``8`` is default and highest compression.

                ``"ogg"``, ``"vorbis"``
                    Number from ``-1`` to ``10``; ``-1`` is the highest compression
                    and lowest quality. Default: ``3``.

                Refer to http://sox.sourceforge.net/soxformat.html for more details.

        a�  In 2.9, this function's implementation will be changed to use torchaudio.save_with_torchcodec` under the hood. Some parameters like format, encoding, bits_per_sample, buffer_size, and ``backend`` will be ignored. We recommend that you port your code to rely directly on TorchCodec's encoder instead: https://docs.pytorch.org/torchcodec/stable/generated/torchcodec.encoders.AudioEncoder)rE   rF   Úsave)r)   rP   rQ   rC   r*   rR   rS   r5   r&   rT   r3   s             €r   rV   zget_save_func.<locals>.saveñ   sN   ø€ ô@ 	�‰ðdô	
ñ ˜S &¨'Ó2ˆØ�|‰|Ø��k >°6¸8À_ÐVaÐcnó
ð 	
r   )TNNNr8   NN)r   r	   r   r9   r:   r;   r   r   rJ   rK   r<   rI   r   Úfloat)rV   r%   r3   s    @@r   Úget_save_funcrX   ã   s  ù€ Ü%Ó'€Hð	jÜ”8œS¤"§+¡+Ð-Ñ.ð	jÜ8@Ä¹ð	jÜU]Ô^aÑUbð	jä	õ	jð  $Ø $Ø"&Ø)-ØØ!%Ø@Dñk
Ü”8œS¤"§+¡+Ð-Ñ.ðk
ä�\‰\ðk
ô ðk
ô ð	k
ô
 œ‘ðk
ô œ3‘-ðk
ô "¤#™ðk
ô ðk
ô œ#‘ðk
ô œe¤K´¼Ð$;Ñ<Ñ=õk
ðZ €Kr   )$r:   Ú	functoolsr   Útypingr   r   r   r   r   r	   rE   rJ   Útorchaudio._extensionr
   Útorchaudio.ior   Útorio._extensionr   Ú r   r&   r   Úcommonr   r   r   r   r   r   r   r9   r   r'   r=   rL   rX   © r   r   ú<module>ra      s~   ðÛ 	Ý ß ?× ?Û ã å 5Ý %Ý 3å å Ý !Ý !Ý 'Ý ñ ˆ4ƒð  S¨$¨w©-Ð%7Ñ 8ò ó ðð
¨7ó 
ò;ò|wót{r   