o
    2wi                     @   s   d dl Z d dlZd dlmZ d dl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mZmZ d dlmZ d dlmZ d dlmZ d d	lmZ G d
d dZdS )    N)BytesIO)ListLiteralOptionalTupleUnion)	Recording)LibsndfileBackendget_current_audio_backend
save_audio)get_or_create_resampler)to_shar_placeholder)	TarWriter)is_torchaudio_availablec                   @   s   e Zd ZdZ			d$dedee ded d	efd
dZdd Z	dd Z
dd Zedee fddZdefddZdeddfddZ	d%dedejdededee ddfdd Zd!eejejf dedededeeejejf eef f
d"d#ZdS )&AudioTarWriteraz  
    AudioTarWriter writes audio examples in numpy arrays or PyTorch tensors into a tar archive
    that is automatically sharded.

    It is different from :class:`~lhotse.shar.writers.array.ArrayTarWriter` in that it supports
    audio-specific compression mechanisms, such as ``flac``, ``opus``, ``mp3``, or ``wav``.

    Example::

        >>> with AudioTarWriter("some_dir/audio.%06d.tar", shard_size=100, format="mp3") as w:
        ...     w.write("audio1", audio1_array)
        ...     w.write("audio2", audio2_array)  # etc.

    It would create files such as ``some_dir/audio.000000.tar``, ``some_dir/audio.000001.tar``, etc.
    The starting shard offset can be set using ``shard_offset`` parameter. The writer starts from 0 by default.

    It's also possible to use ``AudioTarWriter`` with automatic sharding disabled::

        >>> with AudioTarWriter("some_dir/audio.tar", shard_size=None, format="flac") as w:
        ...     w.write("audio1", audio1_array)
        ...     w.write("audio2", audio2_array)  # etc.

    See also: :class:`~lhotse.shar.writers.tar.TarWriter`, :class:`~lhotse.shar.writers.array.ArrayTarWriter`
      flacr   pattern
shard_sizeformat)wavr   mp3opusshard_offsetc                 C   s   || _ t|||d| _d S )N)r   )r   r   
tar_writer)selfr   r   r   r    r   V/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/lhotse/shar/writers/audio.py__init__/   s   zAudioTarWriter.__init__c                 C   s   | j   | S N)r   	__enter__r   r   r   r   r    9   s   
zAudioTarWriter.__enter__c                 C   s   |    d S r   )close)r   exc_typeexc_valexc_tbr   r   r   __exit__=   s   zAudioTarWriter.__exit__c                 C   s   | j   d S r   )r   r"   r!   r   r   r   r"   @   s   zAudioTarWriter.closereturnc                 C   s   | j jS r   )r   output_pathsr!   r   r   r   r(   C   s   zAudioTarWriter.output_pathsoriginal_formatc                 C   s   | j dkr|S | j S )Noriginalr   )r   r)   r   r   r   resolve_formatG   s   
zAudioTarWriter.resolve_formatkeyNc                 C   s4   | j | dt  | j j| dt dd d S )Nz.nodataz.nometaFcount)r   writer   )r   r-   r   r   r   write_placeholderO   s   z AudioTarWriter.write_placeholdervaluesampling_ratemanifestc           	      C   s   |  |}| j||||d\}}}t }t||||d | j| d| j | t|}t }tt	
| td|d |d | jj| d|dd	 d S )
Nr+   )destsrcr3   r   .zutf-8)filer   z.jsonFr.   )r,   _maybe_resampler   r   r   r0   r   r   printjsondumpsto_dictcodecs	getwriterseek)	r   r-   r2   r3   r4   r)   save_formatstreamjson_streamr   r   r   r0   S   s"   

zAudioTarWriter.writeaudioc                 C   sX   d}|dkr't  r'tt ts'||kr'||}t||t|}|||fS |||fS )Ni  r   )r   
isinstancer
   r	   resampler   torch	as_tensor)r   rD   r4   r3   r   OPUS_DEFAULT_SAMPLING_RATEr   r   r   r9   r   s   




zAudioTarWriter._maybe_resample)r   r   r   r   )__name__
__module____qualname____doc__strr   intr   r   r    r&   r"   propertyr   r(   r,   r1   npndarrayr   r0   r   rG   Tensorr   r9   r   r   r   r   r      s\    



r   )r>   r;   ior   typingr   r   r   r   r   numpyrQ   rG   lhotser   lhotse.audio.backendr	   r
   r   lhotse.augmentationr   lhotse.shar.utilsr   lhotse.shar.writers.tarr   lhotse.utilsr   r   r   r   r   r   <module>   s    