o
    i                     @   s   d Z ddlmZmZmZmZ ddlZddlZddl	m
  mZ ddlmZ G dd dej
jZG dd dej
jZG d	d
 d
ej
jZG dd dej
jZdS )z`Upsampling module.

This code is modified from https://github.com/kan-bayashi/ParallelWaveGAN.

    )AnyDictListOptionalN)Conv1dc                       sF   e Zd ZdZddededef fddZdejd	ejfd
dZ	  Z
S )	Stretch2dzStretch2d module.nearestx_scaley_scalemodec                    s    t    || _|| _|| _dS )zInitialize Stretch2d module.

        Args:
            x_scale (int): X scaling factor (Time axis in spectrogram).
            y_scale (int): Y scaling factor (Frequency axis in spectrogram).
            mode (str): Interpolation mode.

        N)super__init__r	   r
   r   )selfr	   r
   r   	__class__ ]/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/gan_tts/parallel_wavegan/upsample.pyr      s   
	
zStretch2d.__init__xreturnc                 C   s   t j|| j| jf| jdS )zCalculate forward propagation.

        Args:
            x (Tensor): Input tensor (B, C, F, T).

        Returns:
            Tensor: Interpolated tensor (B, C, F * y_scale, T * x_scale),

        )scale_factorr   )Finterpolater
   r	   r   )r   r   r   r   r   forward$   s   
zStretch2d.forward)r   )__name__
__module____qualname____doc__intstrr   torchTensorr   __classcell__r   r   r   r   r      s    r   c                       s(   e Zd ZdZ fddZdd Z  ZS )Conv2dz-Conv2d module with customized initialization.c                    s   t  j|i | dS )zInitialize Conv2d module.N)r   r   )r   argskwargsr   r   r   r   6   s   zConv2d.__init__c                 C   s>   | j jdt| j  | jdurtjj	
| jd dS dS )zReset parameters.g      ?Ng        )weightdatafill_npprodkernel_sizebiasr   nninit	constant_)r   r   r   r   reset_parameters:   s   
zConv2d.reset_parameters)r   r   r   r   r   r/   r!   r   r   r   r   r"   3   s    r"   c                       sf   e Zd ZdZdi ddfdee dee deee	f ded	ef
 fd
dZ
dejdejfddZ  ZS )UpsampleNetworkzUpsampling network module.Nr      upsample_scalesnonlinear_activationnonlinear_activation_paramsinterpolate_modefreq_axis_kernel_sizec                    s   t    tj | _|D ]V}t|d|}|  j|g7  _|d d dks)J d|d d }||d d f}	||f}
tdd|	|
dd}|  j|g7  _|durcttj|di |}|  j|g7  _qdS )	a  Initialize UpsampleNetwork module.

        Args:
            upsample_scales (List[int]): List of upsampling scales.
            nonlinear_activation (Optional[str]): Activation function name.
            nonlinear_activation_params (Dict[str, Any]): Arguments for the specified
                activation function.
            interpolate_mode (str): Interpolation mode.
            freq_axis_kernel_size (int): Kernel size in the direction of frequency axis.

        r1      r   z.Not support even number freq axis kernel size.F)r*   paddingr+   Nr   )	r   r   r   r,   
ModuleList	up_layersr   r"   getattr)r   r2   r3   r4   r5   r6   scalestretchfreq_axis_paddingr*   r8   conv	nonlinearr   r   r   r   D   s0   
zUpsampleNetwork.__init__cr   c                 C   s(   | d}| jD ]}||}q|dS )zCalculate forward propagation.

        Args:
            c : Input tensor (B, C, T_feats).

        Returns:
            Tensor: Upsampled tensor (B, C, T_wav).

        r1   )	unsqueezer:   squeeze)r   rA   fr   r   r   r   o   s   




zUpsampleNetwork.forwardr   r   r   r   r   r   r   r   r   r   r   r   r    r   r!   r   r   r   r   r0   A   s$    
+r0   c                       sr   e Zd ZdZdi ddddfdee dee d	eee	f d
edededef fddZ
dejdejfddZ  ZS )ConvInUpsampleNetworkz(Convolution + upsampling network module.Nr   r1   P   r   r2   r3   r4   r5   r6   aux_channelsaux_context_windowc           	         sT   t    || _d| d }tj|| _t|||dd| _t	|||||d| _
dS )as  Initialize ConvInUpsampleNetwork module.

        Args:
            upsample_scales (list): List of upsampling scales.
            nonlinear_activation (Optional[str]): Activation function name.
            nonlinear_activation_params (Dict[str, Any]): Arguments for the specified
                activation function.
            mode (str): Interpolation mode.
            freq_axis_kernel_size (int): Kernel size in the direction of
                frequency axis.
            aux_channels (int): Number of channels of pre-conv layer.
            aux_context_window (int): Context window size of the pre-conv layer.

        r7   r1   F)r*   r+   )r2   r3   r4   r5   r6   N)r   r   rI   r   r,   ReplicationPad1dpadr   conv_inr0   upsample)	r   r2   r3   r4   r5   r6   rH   rI   r*   r   r   r   r      s"   
zConvInUpsampleNetwork.__init__rA   r   c                 C   s   |  | |}| |S )zCalculate forward propagation.

        Args:
            c (Tensor): Input tensor (B, C, T_feats).

        Returns:
            Tensor: Upsampled tensor (B, C, T_wav),
                where T_wav = T_feats * prod(upsample_scales).

        )rL   rK   rM   )r   rA   r   r   r   r      s   
zConvInUpsampleNetwork.forwardrE   r   r   r   r   rF      s0    
,rF   )r   typingr   r   r   r   numpyr(   r   torch.nn.functionalr,   
functionalr   &espnet2.gan_tts.wavenet.residual_blockr   Moduler   r"   r0   rF   r   r   r   r   <module>   s    >