o
    i+                     @   sH   d Z ddlmZmZ ddlZddlmZ ddlmZ G dd de	Z
dS )z'Error Calculator module for Transducer.    )ListTupleN)
AbsDecoder)BeamSearchTransducerc                       s   e Zd ZdZ		ddedejjdee	 de
de
ded	ef fd
dZdejdejfddZdejdejdeeef fddZdejdejdefddZdejdejdefddZ  ZS )ErrorCalculatorTransducera  Calculate CER and WER for transducer models.

    Args:
        decoder: Decoder module.
        token_list: List of tokens.
        sym_space: Space symbol.
        sym_blank: Blank symbol.
        report_cer: Whether to compute CER.
        report_wer: Whether to compute WER.

    Fdecoderjoint_network
token_list	sym_space	sym_blank
report_cer
report_werc                    sF   t    t||dddd| _|| _|| _|| _|| _|| _|| _	dS )z'Construct an ErrorCalculatorTransducer.   defaultF)r   r   	beam_sizesearch_type
score_normN)
super__init__r   beam_searchr   r	   spaceblankr   r   )selfr   r   r	   r
   r   r   r   	__class__ [/home/ubuntu/.local/lib/python3.10/site-packages/espnet2/asr/transducer/error_calculator.pyr      s   

z"ErrorCalculatorTransducer.__init__encoder_outtargetc                 C   s   d\}}t |d}g }|t| j j}t|D ]}| || }|	| qdd |D }	| 
|	|\}
}| jrC| |
|}| jrL| |
|}||fS )a.  Calculate sentence-level WER/CER score for Transducer model.

        Args:
            encoder_out: Encoder output sequences. (B, T, D_enc)
            target: Target label ID sequences. (B, L)

        Returns:
            : Sentence-level CER score.
            : Sentence-level WER score.

        )NNr   c                 S   s   g | ]}|d  j dd qS )r      N)yseq).0	nbest_hypr   r   r   
<listcomp>M   s    z6ErrorCalculatorTransducer.__call__.<locals>.<listcomp>)intsizetonextr   
parametersdeviceranger   appendconvert_to_charr   calculate_cerr   calculate_wer)r   r   r   cerwer	batchsizebatch_nbestb
nbest_hypspred	char_predchar_targetr   r   r   __call__6   s   z"ErrorCalculatorTransducer.__call__r5   returnc           	         s   g g }}t |D ]D\}} fdd|D } fdd|| D }d| jd}| jd}d| jd}| jd}|| || q	||fS )aE  Convert label ID sequences to character sequences.

        Args:
            pred: Prediction label ID sequences. (B, U)
            target: Target label ID sequences. (B, L)

        Returns:
            char_pred: Prediction character sequences. (B, ?)
            char_target: Target character sequences. (B, ?)

        c                       g | ]	} j t| qS r   r	   r$   )r!   hr   r   r   r#   j       z=ErrorCalculatorTransducer.convert_to_char.<locals>.<listcomp>c                    r:   r   r;   )r!   rr=   r   r   r#   k   r>     )	enumeratejoinreplacer   r   r+   )	r   r5   r   r6   r7   ipred_ichar_pred_ichar_target_ir   r=   r   r,   Y   s   

z)ErrorCalculatorTransducer.convert_to_charr6   r7   c           
      C   st   ddl }g g }}t|D ]"\}}|dd}|| dd}	||||	 |t|	 qtt|t| S )zCalculate sentence-level CER score.

        Args:
            char_pred: Prediction character sequences. (B, ?)
            char_target: Target character sequences. (B, ?)

        Returns:
            : Average sentence-level CER score.

        r   NrA   r@   )editdistancerB   rD   r+   evallenfloatsum
r   r6   r7   rI   	distanceslensrE   rG   r5   r   r   r   r   r-   x   s   
z'ErrorCalculatorTransducer.calculate_cerc           
      C   sl   ddl }g g }}t|D ]\}}| }||  }	||||	 |t|	 qtt|t| S )zCalculate sentence-level WER score.

        Args:
            char_pred: Prediction character sequences. (B, ?)
            char_target: Target character sequences. (B, ?)

        Returns:
            : Average sentence-level WER score

        r   N)rI   rB   splitr+   rJ   rK   rL   rM   rN   r   r   r   r.      s   
z'ErrorCalculatorTransducer.calculate_wer)FF)__name__
__module____qualname____doc__r   torchnnModuler   r$   strboolr   Tensorr8   r   r,   rL   r-   r.   __classcell__r   r   r   r   r      sR    #


r   )rU   typingr   r   rV   espnet2.asr.decoder.abs_decoderr   -espnet2.asr.transducer.beam_search_transducerr   objectr   r   r   r   r   <module>   s    