o
    i                     @   sV   d Z ddlmZmZmZ ddlZddlmZ ddlm	Z	 ddl
mZ G dd dZdS )	z'Error Calculator module for Transducer.    )ListOptionalTupleN)BeamSearchTransducer)
AbsDecoder)JointNetworkc                       s   e Zd ZdZ		ddededee dedede	d	e	d
df fddZ
dejdejd
eee ee f 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 )ErrorCalculatoraN  Calculate CER and WER for transducer models.

    Args:
        decoder: Decoder module.
        joint_network: Joint Network module.
        token_list: List of token units.
        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_werreturnNc                    sF   t    t||dddd| _|| _|| _|| _|| _|| _|| _	dS )z.Construct an ErrorCalculatorTransducer object.   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ErrorCalculator.__init__encoder_outtargetc           
         s   d\}}t  d} tj j  fddt|D }dd |D }||\}}	j	r:
||	}jrC||	}||fS )a5  Calculate sentence-level WER or/and 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   g | ]	}  | qS r   )r   ).0br    r   r   r   
<listcomp>L       z,ErrorCalculator.__call__.<locals>.<listcomp>c                 S   s   g | ]}|d  j dd qS )r   r   N)yseq)r"   	nbest_hypr   r   r   r%   M   s    )intsizetonextr	   
parametersdevicerangeconvert_to_charr   calculate_cerr   calculate_wer)
r   r    r!   cerwer	batchsizebatch_nbestpred	char_predchar_targetr   r$   r   __call__8   s   zErrorCalculator.__call__r7   c           	         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   r&   z3ErrorCalculator.convert_to_char.<locals>.<listcomp>c                    r;   r   r<   )r"   rr>   r   r   r%   k   r&     )	enumeratejoinreplacer   r   append)	r   r7   r!   r8   r9   ipred_ichar_pred_ichar_target_ir   r>   r   r0   Y   s   

zErrorCalculator.convert_to_charr8   r9   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   rE   evallenfloatsum
r   r8   r9   rJ   	distanceslensrF   rH   r7   r!   r   r   r   r1   x   s   
zErrorCalculator.calculate_cerc           
      C   s|   ddl }g g }}t|D ]&\}}|dd }|| d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   Nu   ▁rA   )	rJ   rB   rD   splitrE   rK   rL   rM   rN   rO   r   r   r   r2      s   
zErrorCalculator.calculate_wer)FF)__name__
__module____qualname____doc__r   r   r   r)   strboolr   torchTensorr   r   rM   r:   r0   r1   r2   __classcell__r   r   r   r   r      sb    	
!


r   )rV   typingr   r   r   rY   -espnet2.asr_transducer.beam_search_transducerr   *espnet2.asr_transducer.decoder.abs_decoderr   $espnet2.asr_transducer.joint_networkr   r   r   r   r   r   <module>   s    