o
    
j                     @   sN   d dl 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ejZ	dS )    N)nn)weight_norm)load_fsspec)ResidualStackc                       sP   e Zd Z							d fdd	Zd	d
 Zdd Zdd Z	dddZ  ZS )MelganGeneratorP               r      r      c                    s2  t    |d d dksJ d|d d }d}	d| _g }
|
t|ttj|||dddg7 }
t|D ]=\}}|d|  }|d|d   }|d }|}|d }|d | }|
t|	ttj	||||||ddt
|||d	g7 }
q5|
t|	g7 }
|
t|ttj|||ddd
t g7 }
tj|
 | _d S )Nr   r   r   z) [!] proj_kernel should be an odd number.g?T)kernel_sizestridebias)r   paddingoutput_paddingr   )channelsnum_res_blocksr   )r   r   )super__init__inference_paddingr   ReflectionPad1dr   Conv1d	enumerate	LeakyReLUConvTranspose1dr   Tanh
Sequentiallayers)selfin_channelsout_channelsproj_kernelbase_channelsupsample_factors
res_kernelr   base_padding	act_sloper    idxupsample_factorlayer_in_channelslayer_out_channelslayer_filter_sizelayer_stridelayer_output_paddinglayer_padding	__class__ V/home/kuhnn/.local/lib/python3.10/site-packages/TTS/vocoder/models/melgan_generator.pyr   
   sN   

zMelganGenerator.__init__c                 C   s
   |  |S )N)r    r!   cr4   r4   r5   forwardG   s   
zMelganGenerator.forwardc                 C   s8   | | jd jj}tjj|| j| jfd}| |S )Nr   	replicate)	tor    weightdevicetorchr   
functionalpadr   r6   r4   r4   r5   	inferenceJ   s   
zMelganGenerator.inferencec              	   C   sX   t | jD ]$\}}t| dkr)z
tjj|d W q ty(   |	  Y qw qd S )Nr   r;   )
r   r    len
state_dictr   utilsparametrizeremove_parametrizations
ValueErrorremove_weight_norm)r!   _layerr4   r4   r5   rG   O   s   z"MelganGenerator.remove_weight_normFc                 C   sH   t |td|d}| |d  |r"|   | jrJ |   d S d S )Ncpu)map_locationcachemodel)r   r=   r<   load_state_dictevaltrainingrG   )r!   configcheckpoint_pathrO   rL   stater4   r4   r5   load_checkpointW   s   
zMelganGenerator.load_checkpoint)r   r   r	   r
   r   r   r   )FF)	__name__
__module____qualname__r   r8   r@   rG   rT   __classcell__r4   r4   r2   r5   r   	   s    =	r   )
r=   r   torch.nn.utils.parametrizationsr   TTS.utils.ior   TTS.vocoder.layers.melganr   Moduler   r4   r4   r4   r5   <module>   s    