o
    i                     @   s0   d Z ddlmZ ddlZG dd dejjZdS )z Duration calculator for ESPnet2.    )TupleNc                   @   sP   e Zd ZdZe dejdeejejf fddZe	dd Z
e	dd	 Zd
S )DurationCalculatorzDuration calculator module.att_wsreturnc                 C   s   |  |}| |}||fS )a/  Convert attention weight to durations.

        Args:
            att_ws (Tesnor): Attention weight tensor (T_feats, T_text) or
                (#layers, #heads, T_feats, T_text).

        Returns:
            LongTensor: Duration of each input (T_text,).
            Tensor: Focus rate value.

        )_calculate_duration_calculate_focus_rete)selfr   duration
focus_rate r   Y/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/tts/utils/duration_calculator.pyforward   s   

zDurationCalculator.forwardc                 C   sT   t | jdkr| jddd  S t | jdkr&| jddd jdd S td)N   dimr      +att_ws should be 2 or 4 dimensional tensor.)lenshapemaxmean
ValueErrorr   r   r   r   r   "   s
   z(DurationCalculator._calculate_focus_retec                    s   t  jdkrn,t  jdkr0tjdd  D dd  jddd jdd}| } |  ntdt fd	dt	 jd
 D }|
dS )Nr   r   c                 S   s   g | ]}|qS r   r   ).0att_wr   r   r   
<listcomp>6   s    z:DurationCalculator._calculate_duration.<locals>.<listcomp>r   r   r   r   c                    s    g | ]}  d | qS )r   )argmaxeqsum)r   ir   r   r   r   ?   s        )r   r   torchcatr   r   r   r   stackrangeview)r   diagonal_scoresdiagonal_head_idx	durationsr   r   r   r   -   s   

z&DurationCalculator._calculate_durationN)__name__
__module____qualname____doc__r"   no_gradTensorr   r   staticmethodr   r   r   r   r   r   r      s    "

r   )r-   typingr   r"   nnModuler   r   r   r   r   <module>   s   