Ë
    óÿæiƒ  ã                   óÎ   — d dl mZ d dlmZmZmZ d dlZd dlmZ d dlm	Z	 g Z
e		 	 	 ddededee   d	ee   d
edeeef   fd„«       Ze G d„ d«      «       Zddeded
edee   fd„Zy)é    )Ú	dataclass)ÚListÚOptionalÚTupleN)ÚTensor)Úfail_if_no_alignÚ	log_probsÚtargetsÚinput_lengthsÚtarget_lengthsÚblankÚreturnc                 ó®  — ||v rt        d|› d�«      ‚t        j                  |«      | j                  d   k\  rt        d«      ‚|€T| j	                  d«      | j	                  d«      }}t        j
                  |f|t        j                  | j                  ¬«      }|€T|j	                  d«      |j	                  d«      }}t        j
                  |f|t        j                  |j                  ¬«      }|€J ‚|€J ‚t        j                  j                  j                  | ||||«      \  }}||dd…t        j                  |j                  d   «      |d   f   fS )	aš  Align a CTC label sequence to an emission.

    .. devices:: CPU CUDA

    .. properties:: TorchScript

    Args:
        log_probs (Tensor): log probability of CTC emission output.
            Tensor of shape `(B, T, C)`. where `B` is the batch size, `T` is the input length,
            `C` is the number of characters in alphabet including blank.
        targets (Tensor): Target sequence. Tensor of shape `(B, L)`,
            where `L` is the target length.
        input_lengths (Tensor or None, optional):
            Lengths of the inputs (max value must each be <= `T`). 1-D Tensor of shape `(B,)`.
        target_lengths (Tensor or None, optional):
            Lengths of the targets. 1-D Tensor of shape `(B,)`.
        blank_id (int, optional): The index of blank symbol in CTC emission. (Default: 0)

    Returns:
        Tuple(Tensor, Tensor):
            Tensor: Label for each time step in the alignment path computed using forced alignment.

            Tensor: Log probability scores of the labels for each time step.

    Note:
        The sequence length of `log_probs` must satisfy:


        .. math::
            L_{\text{log\_probs}} \ge L_{\text{label}} + N_{\text{repeat}}

        where :math:`N_{\text{repeat}}` is the number of consecutively repeated tokens.
        For example, in str `"aabbc"`, the number of repeats are `2`.

    Note:
        The current version only supports ``batch_size==1``.
    z4targets Tensor shouldn't contain blank index. Found Ú.éÿÿÿÿz2targets values must be less than the CTC dimensionNr   é   )ÚdtypeÚdevice)Ú
ValueErrorÚtorchÚmaxÚshapeÚsizeÚfullÚint64r   ÚopsÚ
torchaudioÚforced_alignÚarange)	r	   r
   r   r   r   Ú
batch_sizeÚlengthÚpathsÚscoress	            úu/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/torchaudio/functional/_alignment.pyr   r      s:  € ðZ �ÑÜÐOÐPWÈyÐXYÐZÓ[Ð[Ü‡y�y�Ó˜YŸ_™_¨RÑ0Ò0ÜÐMÓNÐNàÐØ&Ÿ^™^¨AÓ.°	·±¸qÓ0A�Fˆ
ÜŸ
™
 J =°&ÄÇÁÐT]×TdÑTdÔeˆØÐØ$Ÿ\™\¨!›_¨g¯l©l¸1«o�Fˆ
ÜŸ™ Z M°6ÄÇÁÐU\×UcÑUcÔdˆð Ð$Ð$Ð$ØÐ%Ð%Ð%ä—I‘I×(Ñ(×5Ñ5°iÀÈ-ÐYgÐinÓo�M€Eˆ6Ø�&šœEŸL™L¨¯©°a©Ó9¸5À¹8ÐCÑDÐDÐDó    c                   óN   — e Zd ZU dZeed<   	 eed<   	 eed<   	 eed<   	 defd„Zy)	Ú	TokenSpanz[TokenSpan()
    Token with time stamps and score. Returned by :py:func:`merge_tokens`.
    ÚtokenÚstartÚendÚscorer   c                 ó4   — | j                   | j                  z
  S )zReturns the time span)r*   r)   )Úselfs    r$   Ú__len__zTokenSpan.__len__[   s   € à�x‰x˜$Ÿ*™*Ñ$Ð$r%   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚintÚ__annotations__Úfloatr.   © r%   r$   r'   r'   L   s5   … ñð ƒJØØƒJØ;Ø	ƒHØ9ØƒLØ&ð%˜ô %r%   r'   Útokensr#   c                 ó”  — | j                   dk7  s|j                   dk7  rt        d«      ‚t        | «      t        |«      k7  rt        d«      ‚t        j                  | t        j
                  dg| j                  ¬«      t        j
                  dg| j                  ¬«      ¬«      }t        j                  |dk7  «      j                  «       j                  «       }| j                  «       } t        |dd |dd «      D ��cg c]=  \  }}| |   x}|k7  r.t        |||||| j                  «       j                  «       ¬	«      ‘Œ? }}}|S c c}}w )
a£  Removes repeated tokens and blank tokens from the given CTC token sequence.

    Args:
        tokens (Tensor): Alignment tokens (unbatched) returned from :py:func:`forced_align`.
            Shape: `(time, )`.
        scores (Tensor): Alignment scores (unbatched) returned from :py:func:`forced_align`.
            Shape: `(time, )`. When computing the token-size score, the given score is averaged
            across the corresponding time span.

    Returns:
        list of TokenSpan

    Example:
        >>> aligned_tokens, scores = forced_align(emission, targets, input_lengths, target_lengths)
        >>> token_spans = merge_tokens(aligned_tokens[0], scores[0])
    r   z(`tokens` and `scores` must be 1D Tensor.z.`tokens` and `scores` must be the same length.r   )r   )ÚprependÚappendr   N)r(   r)   r*   r+   )Úndimr   Úlenr   ÚdiffÚtensorr   ÚnonzeroÚsqueezeÚtolistÚzipr'   ÚmeanÚitem)	r7   r#   r   r=   Úchanges_wo_blankr)   r*   r(   Úspanss	            r$   Úmerge_tokensrG   `   s/  € ð" ‡{�{�aÒ˜6Ÿ;™;¨!Ò+ÜÐCÓDÐDÜ
ˆ6ƒ{”c˜&“kÒ!ÜÐIÓJÐJä�:‰:ØœŸ™ b T°&·-±-Ô@ÌÏÉÐWYÐVZÐci×cpÑcpÔIqô€Dô —}‘} d¨a¡iÓ1×9Ñ9Ó;×BÑBÓDÐØ�]‰]‹_€Fô Ð.¨s°Ð3Ð5EÀaÀbÐ5IÔJôáJ‰JˆE�3Ø˜E‘]Ð"ˆE uÒ,ô 	˜ U°¸6À%ÈÐ;L×;QÑ;QÓ;S×;XÑ;XÓ;ZÖ[ØJð 
ñ ð
 €Lùós   Ã=AE)NNr   )r   )Údataclassesr   Útypingr   r   r   r   r   Útorchaudio._extensionr   Ú__all__r3   r   r'   rG   r6   r%   r$   Ú<module>rL      sÍ   ðÝ !ß (Ñ (ã Ý Ý 2à
€ð ð '+Ø'+Øñ=EØð=Eàð=Eð ˜FÑ#ð=Eð ˜VÑ$ð	=Eð
 ð=Eð ˆ6�6ˆ>Ñò=Eó ð=Eð@ ÷%ð %ó ð%ñ& ˜ð  ¨ð  ¸ð  ÀDÈÁOô  r%   