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 ]XZeeeed eZedkrSe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  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 )z+DAC (see https://arxiv.org/abs/2306.06546).    N)CodecDACc                       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           
         s   z&t jt jt dd tjD } fddtjD t_dd l}|t_W n ty1   tdw t 	||| || _
d| _|| _t|d }t|jj| dd	}	|j|	| _|d
krfd | j_d S |dkrpd | j_d S d S )Nc                 S   s   g | ]}|qS  r   .0xr   r   C/home/ubuntu/.local/lib/python3.10/site-packages/audiocodecs/dac.py
<listcomp>*   s    z DAC.__init__.<locals>.<listcomp>c                    s   g | ]} |vr|qS r   r   r   root_dirr   r   r   +   s    r   z5`pip install descript-audio-codec` to use this modulei   i  khz)
model_typeencodedecode)ospathdirnamerealpath__file__sysdacImportErrorsuper__init__num_codebooks
vocab_sizelatentintstrutilsdownloadr   loadmodeldecoderencoder)
selfsample_rateorig_sample_ratemoder   r   sys_pathr   tag
model_path	__class__r   r   r      s*   
zDAC.__init__c                 C   s   | j rdd | jjjD }|d | j }t|}|S tt| j	 
 j}tj| j|d}|d d d d f d| jd }| jj|\}}}|j|jd |jd  dd}g }t|D ]\}	}
| jjj|	 |
}|| q_t|d }|S )Nc                 S   s   g | ]}|j jqS r   )codebookweight)r	   	quantizerr   r   r   r   D   s    zDAC.embs.<locals>.<listcomp>)device   )dim).r   )r   r%   r3   
quantizersr   torchstacknextiter
state_dictvaluesr4   aranger   expandclone
from_codessplitshape	enumerateout_projappend)r(   embsr4   toksz_qz_p_z_psz_qsiz_p_iz_q_ir   r   r   rH   A   s&   
 zDAC.embsc                 C   s4   | j j|d d d f | jd^}}}|dd}|S )N)n_quantizersr5   )r%   r   r   movedim)r(   siglengthrL   rI   r   r   r   _sig_to_toks^   s
   zDAC._sig_to_toksc                 C   sj   | j r!| j|d d d f }| jjjd |}|dd}|S | j|d d d f }|dd}|S )Nr   r5   rS   )r   r%   r'   r3   r8   in_projrT   )r(   rU   rV   featsr   r   r   _sig_to_featsg   s   zDAC._sig_to_featsc                 C   s8   | j j|dd\}}}| j |d d df }|S )Nr5   rS   r   )r%   r3   rB   rT   r   )r(   rI   rV   qfeatsrL   rU   r   r   r   _toks_to_sigs   s
   

zDAC._toks_to_sig)r   r   r   F)__name__
__module____qualname__r   r9   no_gradrH   rW   rZ   r\   __classcell__r   r   r/   r   r      s    "
	__main__cudacpui'     r   )r   r   r   )r+   r   r   
   )r   r   zexample.wav)r   zreconstruction.wav)"__doc__r   r   r9   audiocodecs.codecr   __all__r   r]   
torchaudiorc   is_availabler4   r)   
batch_sizer   r+   evaltocodeczeroslongrandninputr`   outputprintrD   rH   sig_to_featsr$   rU   rec_sigsaver   r   r   r   <module>   sZ   _





	

