o
    }oi%>                     @   s  d dl Z d dlmZ d dlm  mZ d dlmZmZmZ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mZmZ d dlmZ dZdddZdddZG dd de jjZG dd de jjZG dd deZG dd deZG dd deZ G dd deZ!G dd deZ"dS )     N)	AvgPool1dConv1dConv2dConvTranspose1d)remove_weight_normspectral_normweight_norm)	typecheck)NeuralModule)AudioSignalMelSpectrogramTypeVoidType)
NeuralTypeg?        {Gz?c                 C   s.   | j j}|ddkr| jj|| d S d S )NConv)	__class____name__findweightdatanormal_)mmeanstd	classname r   `/home/ubuntu/.local/lib/python3.10/site-packages/nemo/collections/tts/modules/hifigan_modules.pyinit_weights7   s   r      c                 C   s   t | | | d S )N   )int)kernel_sizedilationr   r   r   get_padding=   s   r%   c                       2   e Zd ZdgZ fddZdd Zdd Z  ZS )	ResBlock1lrelu_slopec                    s  t    t| _ttt|||d|d t||d dtt|||d|d t||d dtt|||d|d t||d dg| _	| j	
t ttt|||ddt|ddtt|||ddt|ddtt|||ddt|ddg| _| j
t d S )Nr    r   r$   paddingr!   )super__init__LRELU_SLOPEr(   nn
ModuleListr   r   r%   convs1applyr   convs2selfchannelsr#   r$   r   r   r   r,   D   sb   


"zResBlock1.__init__c                 C   sP   t | j| jD ]\}}t|| j}||}t|| j}||}|| }q|S N)zipr0   r2   F
leaky_relur(   )r4   xc1c2xtr   r   r   forwardz   s   
zResBlock1.forwardc                 C   s,   | j D ]}t| q| jD ]}t| qd S r7   )r0   r   r2   r4   lr   r   r   r      s
   



zResBlock1.remove_weight_normr   
__module____qualname____constants__r,   r?   r   __classcell__r   r   r6   r   r'   A   s
    6	r'   c                       r&   )	ResBlock2r(   c                    st   t    ttt|||d|d t||d dtt|||d|d t||d dg| _| jt	 t
| _d S )Nr    r   r)   )r+   r,   r.   r/   r   r   r%   convsr1   r   r-   r(   r3   r6   r   r   r,      s4   


zResBlock2.__init__c                 C   s.   | j D ]}t|| j}||}|| }q|S r7   )rH   r9   r:   r(   )r4   r;   cr>   r   r   r   r?      s
   

zResBlock2.forwardc                 C   s   | j D ]}t| qd S r7   )rH   r   r@   r   r   r   r      s   

zResBlock2.remove_weight_normrB   r   r   r6   r   rG      s
    rG   c                       sX   e Zd Zg dZ		d fdd	Zedd Zedd	 Ze d
d Z	dd Z
  ZS )	Generator)r(   num_kernelsnum_upsamplesP   Fc	                    sd  t    t|| _t|| _tt||dddd| _t| _	|dkr$t
nt}t | _tt||D ]#\}	\}
}| jtt|d|	  |d|	d   ||
||
 d d q2t | _tt| jD ]+}	t }|d|	d   }tt||D ]\}\}}||||| qw| j| qbtt|ddddd| _| jt | jt |r| jt d S d S )N   r       r*   r!   )r+   r,   lenrK   rL   r   r   conv_prer-   r(   r'   rG   r.   r/   ups	enumerater8   appendr   	resblocksrange	conv_postr1   r   )r4   resblockupsample_ratesupsample_kernel_sizesupsample_initial_channelresblock_kernel_sizesresblock_dilation_sizesinitial_input_sizeapply_weight_init_conv_preiukresblock_listchjdr6   r   r   r,      s@   






zGenerator.__init__c                 C      dt dt iS )Nr;   )BDT)r   r   r4   r   r   r   input_types      zGenerator.input_typesc                 C   rh   )Naudiori   Srk   r   r   rl   r   r   r   output_types   rn   zGenerator.output_typesc                 C   s   |  |}t| j| jD ]*\}}t|| j}||}tj|j	|j
|jd}|D ]}|||7 }q(|| j }qt|}| |}t|}|S )N)dtypedevice)rR   r8   rS   rV   r9   r:   r(   torchzerosshapert   ru   rK   rX   tanh)r4   r;   upsample_layerresblock_groupxsrY   r   r   r   r?      s   



zGenerator.forwardc                 C   sR   t d | jD ]}t| q| jD ]}|D ]}|  qqt| j t| j d S )NzRemoving weight norm...)printrS   r   rV   rR   rX   )r4   rA   groupblockr   r   r   r     s   




zGenerator.remove_weight_norm)rM   F)r   rC   rD   rE   r,   propertyrm   rs   r	   r?   r   rF   r   r   r6   r   rJ      s    
.


rJ   c                       sD   e Zd Zd fdd	Zedd Zedd	 Ze d
d Z  Z	S )DiscriminatorP   rO   Fc                    s4  t    || _|dkrtnt}|sg dng d}t|td|d |df|dftdddfd|t|d |d |df|dftdddfd|t|d |d |df|dftdddfd|t|d |d	 |df|dftdddfd|t|d	 |d	 |dfdd
dg| _	|t|d	 ddddd| _
d S )NF)             )      r   @   r    r   r   rP   r!   rO   )r!   r   )rO   r    )r    r   )r+   r,   periodr   r   r.   r/   r   r%   rH   rX   )r4   r   r#   strideuse_spectral_normdebugnorm_fconv_chr6   r   r   r,     s   
*...  	zDiscriminatorP.__init__c                 C   rh   Nr;   rp   rr   rl   r   r   r   rm     rn   zDiscriminatorP.input_typesc                 C      t dt t dt gdS )Nri   rk   ri   CHWdecisionfeature_mapsr   r   rl   r   r   r   rs   %     
zDiscriminatorP.output_typesc                 C   s   g }|j \}}}|| j dkr$| j|| j  }t|d|fd}|| }||||| j | j}| jD ]}||}t|t}|| q3| 	|}|| t
|dd}||fS )Nr   reflectr    r   )rx   r   r9   padviewrH   r:   r-   rU   rX   rv   flatten)r4   r;   fmapbrI   tn_padrA   r   r   r   r?   ,  s   


zDiscriminatorP.forward)r   rO   FF
r   rC   rD   r,   r   rm   rs   r	   r?   rF   r   r   r6   r   r     s    

r   c                       D   e Zd Zd
 fdd	Zedd Zedd Ze dd	 Z  Z	S )MultiPeriodDiscriminatorFc              
      sL   t    ttd|dtd|dtd|dtd|dtd|dg| _d S )Nr!   r   rO   r   rN      )r+   r,   r.   r/   r   discriminatorsr4   r   r6   r   r   r,   D  s   






z!MultiPeriodDiscriminator.__init__c                 C      t dt t dt dS Nrp   )yy_hatrr   rl   r   r   r   rm   P     

z$MultiPeriodDiscriminator.input_typesc                 C   :   t dt gt dt gt dt ggt dt ggdS )Nr   r   real_scoresfake_scoresreal_feature_mapsfake_feature_mapsr   rl   r   r   r   rs   W  
   z%MultiPeriodDiscriminator.output_typesc                 C   st   g }g }g }g }t | jD ]&\}}||d\}	}
||d\}}||	 ||
 || || q||||fS )Nr;   )rT   r   rU   r4   r   r   y_d_rsy_d_gsfmap_rsfmap_gsra   rg   y_d_rfmap_ry_d_gfmap_gr   r   r   r?   `  s   


z MultiPeriodDiscriminator.forwardFr   r   r   r6   r   r   C  s    

r   c                       r   )DiscriminatorSFc                    s$  t    |dkrtnt}|sg dng d}t|td|d dddd|t|d |d d	d
ddd|t|d |d d	d
ddd|t|d |d
 d	dddd|t|d
 |d d	dddd|t|d |d d	dddd|t|d |d ddd
dg| _|t|d ddddd| _d S )NF)r      r   r   )   r   r   r   r    r      rN   rP   )   r!         )groupsr*   r   rO   r   )	r+   r,   r   r   r.   r/   r   rH   rX   )r4   r   r   r   r   r6   r   r   r,   r  s   
 zDiscriminatorS.__init__c                 C   rh   r   rr   rl   r   r   r   rm     rn   zDiscriminatorS.input_typesc                 C   r   )Nr   ri   r   rk   r   r   rl   r   r   r   rs     r   zDiscriminatorS.output_typesc                 C   sX   g }| j D ]}||}t|t}|| q| |}|| t|dd}||fS )Nr    r   )rH   r9   r:   r-   rU   rX   rv   r   )r4   r;   r   rA   r   r   r   r?     s   


zDiscriminatorS.forward)FFr   r   r   r6   r   r   q  s    

r   c                       r   )MultiScaleDiscriminatorFc                    sX   t    ttd|dt|dt|dg| _ttddddtddddg| _d S )NT)r   r   r   r   r!   rP   )r+   r,   r.   r/   r   r   r   	meanpoolsr   r6   r   r   r,     s   

(z MultiScaleDiscriminator.__init__c                 C   r   r   rr   rl   r   r   r   rm     r   z#MultiScaleDiscriminator.input_typesc                 C   r   )Nr   r   r   r   rl   r   r   r   rs     r   z$MultiScaleDiscriminator.output_typesc                 C   s   g }g }g }g }t | jD ]<\}}|dkr'| j|d  |}| j|d  |}||d\}	}
||d\}}||	 ||
 || || q||||fS )Nr   r    r   )rT   r   r   rU   r   r   r   r   r?     s   


zMultiScaleDiscriminator.forwardr   r   r   r   r6   r   r     s    

r   )r   r   )r    )#rv   torch.nnr.   torch.nn.functional
functionalr9   r   r   r   r   torch.nn.utilsr   r   r   nemo.core.classes.commonr	   nemo.core.classes.moduler
   nemo.core.neural_types.elementsr   r   r   "nemo.core.neural_types.neural_typer   r-   r   r%   Moduler'   rG   rJ   r   r   r   r   r   r   r   r   <module>   s&   (

I,X5.-