
    (HJj7                    |    d dl mZ d dlmZmZ d dlmZ  ed       G d d             ZddZ	 	 	 	 	 	 dd	Z	dd
Z
y)    )annotations)asdict	dataclass)IterableT)frozenc                  d    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   edd	       Zdd
Zy)	WERResultintsubstitutions	deletions
insertionsreference_tokenshypothesis_tokensfloatwerc                N    | j                   | j                  z   | j                  z   S N)r   r   r   )selfs    `/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/mlx_audio/stt/eval/wer.pyeditszWERResult.edits   s     !!DNN2T__DD    c                :    t        |       }| j                  |d<   |S )Nr   )r   r   )r   datas     r   to_dictzWERResult.to_dict   s    d|

Wr   N)returnr
   )r   dict)__name__
__module____qualname____annotations__propertyr   r    r   r   r	   r	      s<    NO	JE Er   r	   c                L    | d   | d   | d   | d   f|d   |d   |d   |d   fk  S )zKTie-break edit paths deterministically: fewer edits, then fewer insertions.r            r"   )	candidatebests     r   _preferr)      sJ    aL)A,	!ilCQQQQ	G  r   c                   t        | t              r| j                         n
t        |       }t        |t              r|j                         n
t        |      }t	        |      }t	        |      }t        |dz         D cg c]  }t        |dz         D cg c]  }d c}  }}t        d|dz         D ]$  }||dz
     d   \  }	}
}}|	dz   |
|dz   |f||   d<   & t        d|dz         D ]$  }|d   |dz
     \  }	}
}}|	dz   |
||dz   f|d   |<   & t        d|dz         D ]  }t        d|dz         D ]  }||dz
     ||dz
     k(  r||dz
     |dz
     }n||dz
     |dz
     \  }	}
}}|	dz   |
dz   ||f}||dz
     |   \  }	}
}}|	dz   |
|dz   |f}t        ||      r|}||   |dz
     \  }	}
}}|	dz   |
||dz   f}t        ||      r|}|||   |<     ||   |   \  }}}}|dk(  r
|dk(  rdnd}n||z  }t        ||||||      S c c}w c c}w )zCompute WER and edit operation counts.

    Args:
        reference: Reference text or pre-tokenized reference words.
        hypothesis: Hypothesis text or pre-tokenized hypothesis words.
    r&   )r   r   r   r   r           g      ?)r   r   r   r   r   r   )
isinstancestrsplitlistlenranger)   r	   )	reference
hypothesis
ref_tokens
hyp_tokensnm_dpicostsubsdelsinsjr(   deletion	insertionr   r   r   r   r   s                         r   compute_werrB   $   s    '1C&@"d9oJ'1*c'B!!#ZHXJJAJA6;AEl16BuQU|,|!|,l  1 1a!e_ "1q5	!dD#1HdD1Hc21a  1a!e_ "1a!edD#1HdD#'21a  1a!e_q!a%A!a% Jq1u$55!a%yQ'(*1q5	!a%(8%dD#q$(D#6$&q1uIaL!D$cq$q#6Hx&$&qE!a%L!D$c4sQw7Iy$' BqE!H# ! ( 35Q%(/E=)ZAvaZcSai# K 	-1s   =H	H
HHc                t   t        |       } t        d | D              }t        d | D              }t        d | D              }t        d | D              }||z   |z   }|r||z  nd}| rt        d | D              t        |       z  nd}|||r||z  nd|r||z  nd|r||z  nd|t        d | D              ||||dS )	Nc              3  4   K   | ]  }|j                     y wr   )r   .0results     r   	<genexpr>z aggregate_wer.<locals>.<genexpr>d   s     B'F++'   c              3  4   K   | ]  }|j                     y wr   )r   rE   s     r   rH   z aggregate_wer.<locals>.<genexpr>e   s     @fV))rI   c              3  4   K   | ]  }|j                     y wr   )r   rE   s     r   rH   z aggregate_wer.<locals>.<genexpr>f   s     <G&V%%GrI   c              3  4   K   | ]  }|j                     y wr   )r   rE   s     r   rH   z aggregate_wer.<locals>.<genexpr>g   s     <G&F%%GrI   r+   c              3  4   K   | ]  }|j                     y wr   )r   rE   s     r   rH   z aggregate_wer.<locals>.<genexpr>j   s     5W6FJJWrI   c              3  4   K   | ]  }|j                     y wr   )r   rE   s     r   rH   z aggregate_wer.<locals>.<genexpr>s   s     &VgFv'?'?grI   )	wer_micro	wer_macrosubstitution_ratedeletion_rateinsertion_ratetotal_reference_tokenstotal_hypothesis_tokenstotal_substitutionstotal_deletionstotal_insertionstotal_edits)r/   sumr0   )results	total_ref
total_subs
total_dels	total_insrY   rO   rP   s           r   aggregate_werr`   b   s    7mGB'BBI@@@J<G<<J<G<<Iz)I5K+4i'#IHO5W55GDUXI 7@Z)3c3<i/#3<)i/#"+#&&Vg&V#V)%%" r   N)r'   tuple[int, int, int, int]r(   ra   )r2   str | Iterable[str]r3   rb   r   r	   )r[   zIterable[WERResult]r   r   )
__future__r   dataclassesr   r   typingr   r	   r)   rB   r`   r"   r   r   <module>rf      sT    " )  $  $;";0C;;|r   