o
    ~i                  
   @   s  d Z ddlZddlZddlZddlmZ dgZG dd deZedkrddl	Z	ej
 r.dndZd	Zd
ZdZdD ]^ZdD ]YZeeeeed eZedkrXeede neeeeZe ( eeZeej e Zeej edv reeZeej W d   n1 sw   Y  q<q8e	d\Z Zeeed Ze  ee Z!W d   n1 sw   Y  e	"de!e dS dS )zTEnCodec (see https://arxiv.org/abs/2210.13438 and https://arxiv.org/abs/2306.00814).    N)CodecEncodecc                       sN   e Zd Z				d fdd	Ze dd Zd	d
 Zdd Zdd Z	  Z
S )r   ]  reconstruct   Fc           
         s8  zddl m} W n ty   tdw t ||| || _|| _d| _t|d }|d d | _	|
d| d	| _d | _|rz(tjtjt d
d tjD } fddtjD t_ddlm}	 |t_W n tyt   tdw |	
d| d	| _d | j_|dkrd | j_d | _d S |dkrd | j_d S d S )Nr   )EncodecModelz5`pip install transformers>=4.31.0` to use this modulei   i  K   d   zfacebook/encodec_khzc                 S   s   g | ]}|qS  r   .0xr   r   G/home/ubuntu/.local/lib/python3.10/site-packages/audiocodecs/encodec.py
<listcomp>9   s    z$Encodec.__init__.<locals>.<listcomp>c                    s   g | ]} |vr|qS r   r   r   root_dirr   r   r   :   s    )Vocosz&`pip install vocos` to use this modulezcharactr/vocos-encodec-encodedecode)transformersr   ImportErrorsuper__init__num_codebooks	use_vocos
vocab_sizeint	bandwidthfrom_pretrainedmodelvocosospathdirnamerealpath__file__sysr   decoderencoder)
selfsample_rateorig_sample_ratemoder   r   EncodecModelHFtagsys_pathr   	__class__r   r   r      s>   

zEncodec.__init__c                 C   s0   | j jjd | j }dd |D }t|}|S )Nc                 S   s   g | ]}|j jqS r   )codebookembed)r   layerr   r   r   r   M   s    z Encodec.embs.<locals>.<listcomp>)r    	quantizerlayersr   torchstack)r*   r7   embsr   r   r   r:   J   s   
zEncodec.embsc                 C   s   |j d | }|   }tj||j|jdd  |d d d f k }| jj	|d d d f |d d d f | j
d}|jd dd}|S )Ndevicedtype)r   r   )shapemaxlongitemr8   aranger=   r>   r    r   r   audio_codesmovedim)r*   siglengthabs_lensmax_lenpadding_maskoutputtoksr   r   r   _sig_to_toksR   s    zEncodec._sig_to_toksc           
      C   s   |j d | }|   }tj||j|jdd  |d d d f k }|d d d f }|d d d f }| jj	j
r[|| }tj|ddd|j d  }|djddd d }|| }| j|}	|	dd	}	|	S )
Nr;   r<      T)keepdim   )dimrP   g:0yE>r?   )r@   rA   rB   rC   r8   rD   r=   r>   r    config	normalizesumpowmeansqrtr)   rF   )
r*   rG   rH   rI   rJ   rK   input_valuesmonoscalefeatsr   r   r   _sig_to_featsa   s    
zEncodec._sig_to_featsc                 C   s   | j d ur)g d| j}| j | dd}| j j|tj||j	dd}|S | j
|d  ddd g}|jd d df }|S )N)g      ?g      @g      @g      (@r;   r   )r=   )bandwidth_idr?   )r!   indexr   codes_to_featuresrB   rF   r   r8   tensorr=   r    audio_values)r*   rM   rH   r^   r\   rG   rL   r   r   r   _toks_to_sigy   s   
zEncodec._toks_to_sig)r   r   r   F)__name__
__module____qualname__r   r8   no_gradr:   rN   r]   rc   __classcell__r   r   r1   r   r      s    +
__main__cudacpui'  rQ   r   )r   r   r   )FT)r-   r   r   r   
   )r   r   zexample.wav)r   zreconstruction.wav)#__doc__r"   r'   r8   audiocodecs.codecr   __all__r   rd   
torchaudiorj   is_availabler=   r+   
batch_sizer   r-   r   evaltocodeczerosrB   randninputrg   rL   printr@   r:   sig_to_featsloadrG   rec_sigsaver   r   r   r   <module>   s`   j







