§
    @Äj  ã                   óú   — 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dS )é    )Ú	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¦  «        ‚|€R|                      d¦  «        |                      d¦  «        }}t          j        |f|t          j        | j        ¬¦  «        }|€R|                     d¦  «        |                     d¦  «        }}t          j        |f|t          j        |j        ¬¦  «        }|€J ‚|€J ‚t          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	            úQC:\Projects\Historical\venv\Lib\site-packages\torchaudio/functional/_alignment.pyr   r      sO  € ðZ �ÐÐÝÐZÐPWÐZÐZÐZÑ[Ô[Ð[Ý„y�ÑÔ˜Yœ_¨RÔ0Ò0Ð0ÝÐMÑNÔNÐNàÐØ&Ÿ^š^¨AÑ.Ô.°	·²¸qÑ0AÔ0A�Fˆ
Ýœ
 J =°&ÅÄÐT]ÔTdÐeÑeÔeˆØÐØ$Ÿ\š\¨!™_œ_¨g¯lªl¸1©o¬o�Fˆ
Ýœ Z M°6ÅÄÐU\ÔUcÐdÑdÔdˆð Ð$Ð$Ð$ØÐ%Ð%Ð%å”IÔ(×5Ò5°iÀÈ-ÐYgÐinÑoÔo�M€Eˆ6Ø�&˜˜˜�EœL¨¬°a¬Ñ9Ô9¸5À¼8ÐCÔDÐDÐDó    c                   óP   — e Zd ZU dZeed<   	 eed<   	 eed<   	 eed<   	 defd„ZdS )	Ú	TokenSpanz[TokenSpan()
    Token with time stamps and score. Returned by :py:func:`merge_tokens`.
    ÚtokenÚstartÚendÚscorer   c                 ó    — | j         | j        z
  S )zReturns the time span)r*   r)   )Úselfs    r$   Ú__len__zTokenSpan.__len__[   s   € àŒx˜$œ*Ñ$Ð$r%   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚintÚ__annotations__Úfloatr.   © r%   r$   r'   r'   L   sm   € € € € € € ðð ð €J€J�JØØ€J€J�JØ;Ø	€H€H�HØ9Ø€L€L�LØ&ð%˜ð %ð %ð %ð %ð %ð %r%   r'   Útokensr#   c                 óJ  ‡ ‡‡‡— ‰ j         dk    s‰j         dk    rt          d¦  «        ‚t          ‰ ¦  «        t          ‰¦  «        k    rt          d¦  «        ‚t          j        ‰ t          j        dg‰ j        ¬¦  «        t          j        dg‰ j        ¬¦  «        ¬¦  «        }t          j        |dk    ¦  «                             ¦   «          	                    ¦   «         }‰  	                    ¦   «         Š ˆˆˆˆ fd„t          |d	d…         |dd	…         ¦  «        D ¦   «         }|S )
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   c           
      ó°   •— g | ]R\  }}‰|         xŠ‰k    ¯t          ‰||‰||…                              ¦   «                              ¦   «         ¬ ¦  «        ‘ŒSS ))r(   r)   r*   r+   )r'   ÚmeanÚitem)Ú.0r)   r*   r   r#   r(   r7   s      €€€€r$   ú
<listcomp>z merge_tokens.<locals>.<listcomp>{   sm   ø€ ð ð ð áˆE�3Ø˜E”]Ð"ˆE uÒ,Ð,õ 	˜ U°¸6À%ÈÀ)Ô;L×;QÒ;QÑ;SÔ;S×;XÒ;XÑ;ZÔ;ZÐ[Ñ[Ô[à,Ð,Ð,r%   N)Úndimr   Úlenr   ÚdiffÚtensorr   ÚnonzeroÚsqueezeÚtolistÚzip)r7   r#   r   rB   Úchanges_wo_blankÚspansr(   s   ```   @r$   Úmerge_tokensrJ   `   s4  øøøø€ ð" „{�aÒÐ˜6œ;¨!Ò+Ð+ÝÐCÑDÔDÐDÝ
ˆ6�{„{•c˜&‘k”kÒ!Ð!ÝÐIÑJÔJÐJåŒ:Ø�œ b T°&´-Ð@Ñ@Ô@ÍÌÐWYÐVZÐciÔcpÐIqÑIqÔIqðñ ô €Dõ ”} d¨a¢iÑ1Ô1×9Ò9Ñ;Ô;×BÒBÑDÔDÐØ�]Š]‰_Œ_€Fðð ð ð ð ð ð åÐ.¨s°¨sÔ3Ð5EÀaÀbÀbÔ5IÑJÔJðñ ô €Eð
 €Lr%   )NNr   )r   )Údataclassesr   Útypingr   r   r   r   r   Útorchaudio._extensionr   Ú__all__r3   r   r'   rJ   r6   r%   r$   ú<module>rO      sf  ðØ !Ð !Ð !Ð !Ð !Ð !Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (à €€€Ø Ð Ð Ð Ð Ð Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2à
€ð ð '+Ø'+Øð=Eð =EØð=Eàð=Eð ˜FÔ#ð=Eð ˜VÔ$ð	=Eð
 ð=Eð ˆ6�6ˆ>Ôð=Eð =Eð =Eñ Ôð=Eð@ ð%ð %ð %ð %ð %ñ %ô %ñ „ð%ð& ð  ˜ð  ¨ð  ¸ð  ÀDÈÄOð  ð  ð  ð  ð  ð  r%   