o
    㥵i$                     @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlZd dl	Z	d dl
Z
d dlmZ d dl	mZ dgZeG dd	 d	ZG d
d dZdS )    N)	dataclass)Path)Union)AudioSignal)nnz1.0.0c                   @   sd   e Zd ZU ejed< eed< eed< eed< eed< eed< eed< e	ed< d	d
 Z
edd ZdS )DACFilecodeschunk_lengthoriginal_lengthinput_dbchannelssample_ratepaddingdac_versionc              	   C   s   | j  tj| j tj| j| j| j	| j
| jtd dd}t|d}t|d}t|| W d    |S 1 s@w   Y  |S )N)r   r
   r   r	   r   r   r   )r   metadataz.dacwb)r   numpyastypenpuint16r   float32r
   r   r	   r   r   SUPPORTED_VERSIONSr   with_suffixopensave)selfpath	artifactsf r    B/home/ubuntu/.local/lib/python3.10/site-packages/dac/model/base.pyr      s"   
zDACFile.savec                 C   s`   t j|ddd }t|d t}|d dd tvr%td| d| dd|i|d S )	NT)allow_pickler    r   r   r   zGiven file z; can't be loaded with this version of descript-audio-codec.)	r   loadtorch
from_numpyr   intgetr   RuntimeError)clsr   r   r   r    r    r!   r#   .   s   
zDACFile.loadN)__name__
__module____qualname__r$   Tensor__annotations__r&   floatboolstrr   classmethodr#   r    r    r    r!   r      s   
 
r   c                   @   s   e Zd Zedd Zejdd Zdd Zdd Ze	 				
	dde
eeef dededededefddZe	 		dde
eeef dedefddZdS )
CodecMixinc                 C   s   t | dsd| _| jS )N_paddingT)hasattrr4   )r   r    r    r!   r   :   s   
zCodecMixin.paddingc                 C   sr   t |tsJ dd |  D }|D ]!}|r t|dr|j|_q|j|_tdd tt|jD |_q|| _	d S )Nc                 S   s"   g | ]}t |tjtjfr|qS r    )
isinstancer   Conv1dConvTranspose1d).0lr    r    r!   
<listcomp>D   s
    z&CodecMixin.padding.<locals>.<listcomp>original_paddingc                 s   s    | ]}d V  qdS )r   Nr    )r9   _r    r    r!   	<genexpr>N   s    z%CodecMixin.padding.<locals>.<genexpr>)
r6   r0   modulesr5   r<   r   tuplerangelenr4   )r   valuelayerslayerr    r    r!   r   @   s   
 
c           	      C   s   |  d}|}g }|  D ]}t|tjtjfr|| qt|D ]?}|jd }|j	d }|j
d }t|tjrH|||d   d | d }nt|tjr\|d | ||d   d }t|}q"|}|| d S )Nr         )get_output_lengthr?   r6   r   r7   r8   appendreverseddilationkernel_sizestridemathceil)	r   l_outLrD   rE   dksl_inr    r    r!   	get_delayR   s$   




zCodecMixin.get_delayc                 C   s   |}|   D ]H}t|tjtjfrN|jd }|jd }|jd }t|tjr5|||d   d | d }nt|tjrI|d | ||d   d }t	|}q|S )Nr   rF   )
r?   r6   r   r7   r8   rK   rL   rM   rN   floor)r   input_lengthrQ   rE   rR   rS   rT   r    r    r!   rH   l   s   



zCodecMixin.get_output_length      ?FNaudio_path_or_signalwin_durationverbosenormalize_dbn_quantizersreturnc              
   C   s&  |}t |ttfrtt|}|   | j}|j}| }|j	}	|j
}
|j}|jdkr2|j}
|j}|j}|
| j	 | }|durF|| |  |jj\}}}|j|| d||_|du rc|jn|}|j|krrd| _|}|}n$d| _|| j| j t|| j	 }tt|| j | j }| |}g }|stntj}|d||D ]@}|d||| f }|dtd||jd  }|j | j}| !|| j	}| "||\}}}}}|#| | |jd }qt$j%|dd	}t&||||||	| jt'd d
}|dur|ddd|ddf }|| _|S )a  Processes an audio signal from a file or AudioSignal object into
        discrete codes. This function processes the signal in short windows,
        using constant GPU memory.

        Parameters
        ----------
        audio_path_or_signal : Union[str, Path, AudioSignal]
            audio signal to reconstruct
        win_duration : float, optional
            window duration in seconds, by default 5.0
        verbose : bool, optional
            by default False
        normalize_db : float, optional
            normalize db, by default -16

        Returns
        -------
        DACFile
            Object containing compressed codes and metadata
            required for decompression
        頌  NrF   TFr   .r   dim)r   r	   r
   r   r   r   r   r   )(r6   r1   r   r   load_from_file_with_ffmpegevalr   devicecloner   resampleloudnesssignal_durationffmpeg_resampleffmpeg_loudnesssignal_length	normalizeensure_max_of_audio
audio_datashapereshapezero_paddelayr&   rN   rO   
hop_lengthrH   rA   tqdmtrangemaxto
preprocessencoderI   r$   catr   r   )r   r[   r\   r]   r^   r_   audio_signalr<   original_deviceoriginal_srresample_fnloudness_fnr
   r   nbnacnt	n_sampleshopr   range_fnixrp   r=   cr	   dac_filer    r    r!   compress}   sr   





zCodecMixin.compressobjc                 C   s:  |    t|ttfrt|}| j}|j| _|stntj	}|j
}|j}|j}g }|d|jd |D ]%}	|d|	|	| f | j}
| j|
d }| |}||| q2tj|dd}t|| j}|j}|j}|jdkrv|j}|j}||j ||j |dd|jf }|  |j d|j!|j|_|| _|S )a|  Reconstruct audio from a given .dac file

        Parameters
        ----------
        obj : Union[str, Path, DACFile]
            .dac file location or corresponding DACFile object.
        verbose : bool, optional
            Prints progress if True, by default False

        Returns
        -------
        AudioSignal
            Object with the reconstructed audio
        r   r   .rb   ra   N)"re   r6   r1   r   r   r#   r   rA   rv   rw   r   rf   r	   rq   ry   	quantizer
from_codesdecoderI   r$   r|   r   r   rh   ri   rj   rk   rl   rn   r   r
   rp   rr   r   )r   r   r]   r<   r   r   r~   r	   reconsr   r   zrr   r   r    r    r!   
decompress   s>   




zCodecMixin.decompress)rY   FrZ   N)F)r*   r+   r,   propertyr   setterrV   rH   r$   no_gradr   r1   r   r   r/   r0   r&   r   r   r   r    r    r    r!   r3   9   sD    

mr3   )rN   dataclassesr   pathlibr   typingr   r   r   r$   rv   
audiotoolsr   r   r   r   r3   r    r    r    r!   <module>   s    )