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 ddlmZ ddlmZ ddlmZ G dd	 d	eZdS )
Energy extractor.    )AnyDictTupleUnionN)check_argument_types)Stft)AbsFeatsExtract)pad_listc                       s
  e Zd ZdZ										d(d	eeef d
ededededededededef fddZdefddZ	de
eef fddZ				d)dejdejdejdejdejdeejejf fdd Zd!ejd"ejdejfd#d$Zed!ejd%ejdejfd&d'Z  ZS )*Energyr   "V     N   hannTFfsn_fft
win_length
hop_lengthwindowcenter
normalizedonesideduse_token_averaged_energyreduction_factorc              	      s~   t  sJ t   t|trt|}|| _|| _|| _	|| _
|| _|	| _|	r.|
dks.J |
| _t|||||||d| _d S )N   )r   r   r   r   r   r   r   )r   super__init__
isinstancestrhumanfriendly
parse_sizer   r   r   r   r   r   r   r   stft)selfr   r   r   r   r   r   r   r   r   r   	__class__ T/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/tts/feats_extract/energy.pyr      s,   



zEnergy.__init__returnc                 C   s   dS )Nr   r%   r"   r%   r%   r&   output_size;   s   zEnergy.output_sizec                 C   s0   t | j| j| j| j| j| jj| jj| j	| j
d	S )N)	r   r   r   r   r   r   r   r   r   )dictr   r   r   r   r   r!   r   r   r   r   r(   r%   r%   r&   get_parameters>   s   zEnergy.get_parametersinputinput_lengthsfeats_lengths	durationsdurations_lengthsc           
         s  |d u r|j |jd tjd|jd  } ||\}}| dks'J |j|jd dks3J |j|d d |d d  }ttj|jdd	d
d}	|d ur` fddt	|	||D }	|} j
rw| j } fddt	|	||D }	|}t|	trt|	d}	|	d|fS )Nr   )dtyper         ).r   ).r   dimg|=)minc                    ,   g | ]\}}}  |d | d|qS Nr3   )_adjust_num_framesview).0eelflr(   r%   r&   
<listcomp>f       z"Energy.forward.<locals>.<listcomp>c                    r8   r9   )_average_by_durationr;   )r<   r=   r>   dr(   r%   r&   r@   o   rA           )new_onesshapetorchlongr!   r6   sqrtclampsumzipr   r   r   listr
   	unsqueeze)
r"   r,   r-   r.   r/   r0   
input_stftenergy_lengthsinput_powerenergyr%   r(   r&   forwardK   s,   	






zEnergy.forwardxrC   c                    sp   dt  |    kr| jk sJ  J t|jddd} fddt|d d |dd  D }t|S )Nr   r5   )r   r   c                    s>   g | ]\}}t  || d kr ||  n dqS )r   rD   )lenmean
new_tensor)r<   startendrT   r%   r&   r@      s    ,z/Energy._average_by_duration.<locals>.<listcomp>r3   r   )	rU   rK   r   FpadcumsumrL   rG   stack)r"   rT   rC   d_cumsumx_avgr%   rZ   r&   rB   |   s   *

zEnergy._average_by_duration
num_framesc                 C   sD   |t | krt| d|t |  f} | S |t | k r | d | } | S )Nr   )rU   r[   r\   )rT   ra   r%   r%   r&   r:      s   zEnergy._adjust_num_frames)
r   r   Nr   r   TFTTN)NNNN)__name__
__module____qualname____doc__r   intr   boolr   r)   r   r   r+   rG   Tensorr   rS   rB   staticmethodr:   __classcell__r%   r%   r#   r&   r      sn    
	
&
1	&r   )re   typingr   r   r   r   r   rG   torch.nn.functionalnn
functionalr[   	typeguardr   espnet2.layers.stftr   +espnet2.tts.feats_extract.abs_feats_extractr	   &espnet.nets.pytorch_backend.nets_utilsr
   r   r%   r%   r%   r&   <module>   s   