§
    @Äj;  ã            
       óÈ   — d dl mZ d dlZd dlmZ d dlZ G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z	d	e
d
ededede	f
d„Zde	fd„ZdS )é    )ÚTupleNc                   óP   ‡ — e Zd ZdZdedefˆ fd„Zdej        dej        fd„Zˆ xZ	S )ÚAttPoolz±Attention-Pooling module that estimates the attention score.

    Args:
        input_dim (int): Input feature dimension.
        att_dim (int): Attention Tensor dimension.
    Ú	input_dimÚatt_dimc                 ó¾   •— t          t          | ¦  «                             ¦   «          t          j        |d¦  «        | _        t          j        ||¦  «        | _        d S )Né   )Úsuperr   Ú__init__ÚnnÚLinearÚlinear1Úlinear2©Úselfr   r   Ú	__class__s      €úSC:\Projects\Historical\venv\Lib\site-packages\torchaudio/models/squim/subjective.pyr   zAttPool.__init__   sI   ø€ Ý�g�tÑÔ×%Ò%Ñ'Ô'Ð'å”y ¨AÑ.Ô.ˆŒÝ”y ¨GÑ4Ô4ˆŒˆˆó    ÚxÚreturnc                 ó  — |                       |¦  «        }|                     dd¦  «        }t          j                             |d¬¦  «        }t          j        ||¦  «                             d¦  «        }|                      |¦  «        }|S )zïApply attention and pooling.

        Args:
            x (torch.Tensor): Input Tensor with dimensions `(batch, time, feature_dim)`.

        Returns:
            (torch.Tensor): Attention score with dimensions `(batch, att_dim)`.
        é   r	   ©Údim)	r   Ú	transposer   Ú
functionalÚsoftmaxÚtorchÚmatmulÚsqueezer   )r   r   Úatts      r   ÚforwardzAttPool.forward   ss   € ð �lŠl˜1‰oŒoˆØ�mŠm˜A˜qÑ!Ô!ˆÝŒm×#Ò# C¨QÐ#Ñ/Ô/ˆÝŒL˜˜aÑ Ô ×(Ò(¨Ñ+Ô+ˆØ�LŠL˜‰OŒOˆØˆr   ©
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úintr   r   ÚTensorr"   Ú__classcell__©r   s   @r   r   r      s{   ø€ € € € € ðð ð5 #ð 5°ð 5ð 5ð 5ð 5ð 5ð 5ð˜œð ¨%¬,ð ð ð ð ð ð ð ð r   r   c                   óP   ‡ — e Zd ZdZdedefˆ fd„Zdej        dej        fd„Zˆ xZ	S )Ú	PredictorzÏPrediction module that apply pooling and attention, then predict subjective metric scores.

    Args:
        input_dim (int): Input feature dimension.
        att_dim (int): Attention Tensor dimension.
    r   r   c                 óŽ   •— t          t          | ¦  «                             ¦   «          t          ||¦  «        | _        || _        d S ©N)r
   r-   r   r   Úatt_pool_layerr   r   s      €r   r   zPredictor.__init__0   s<   ø€ Ý�i˜ÑÔ×'Ò'Ñ)Ô)Ð)Ý% i°Ñ9Ô9ˆÔØˆŒˆˆr   r   r   c                 óè   — |                       |¦  «        }t          j                             |d¬¦  «        }t	          j        dd| j        |j        ¬¦  «        }||z                       d¬¦  «        }|S )a  Predict subjective evaluation metric score.

        Args:
            x (torch.Tensor): Input Tensor with dimensions `(batch, time, feature_dim)`.

        Returns:
            (torch.Tensor): Subjective metric score. Tensor with dimensions `(batch,)`.
        r	   r   r   é   )ÚstepsÚdevice)	r0   r   r   r   r   Úlinspacer   r4   Úsum)r   r   ÚBs      r   r"   zPredictor.forward5   si   € ð ×Ò Ñ"Ô"ˆÝŒM×!Ò! !¨Ð!Ñ+Ô+ˆÝŒN˜1˜a t¤|¸A¼HÐEÑEÔEˆØ�‰U�KŠK˜AˆKÑÔˆØˆr   r#   r+   s   @r   r-   r-   (   s{   ø€ € € € € ðð ð #ð °ð ð ð ð ð ð ð
˜œð ¨%¬,ð ð ð ð ð ð ð ð r   r-   c                   ó¾   ‡ — e Zd ZdZdej        dej        dej        fˆ fd„Zdej        dej        de	ej        ej        f         fd	„Z
dej        dej        fd
„Zˆ xZS )ÚSquimSubjectiveaP  Speech Quality and Intelligibility Measures (SQUIM) model that predicts **subjective** metric scores
    for speech enhancement (e.g., Mean Opinion Score (MOS)). The model is adopted from *NORESQA-MOS*
    :cite:`manocha2022speech` which predicts MOS scores given the input speech and a non-matching reference.

    Args:
        ssl_model (torch.nn.Module): The self-supervised learning model for feature extraction.
        projector (torch.nn.Module): Projection layer that projects SSL feature to a lower dimension.
        predictor (torch.nn.Module): Predict the subjective scores.
    Ú	ssl_modelÚ	projectorÚ	predictorc                 ó€   •— t          t          | ¦  «                             ¦   «          || _        || _        || _        d S r/   )r
   r9   r   r:   r;   r<   )r   r:   r;   r<   r   s       €r   r   zSquimSubjective.__init__P   s8   ø€ Ý�o˜tÑ$Ô$×-Ò-Ñ/Ô/Ð/Ø"ˆŒØ"ˆŒØ"ˆŒˆˆr   ÚwaveformÚ	referencer   c                 óÒ   ‡— |j         d         }‰j         d         }||k     r7||z  dz   }t          j        ˆfd„t          |¦  «        D ¦   «         d¬¦  «        Š|‰dd…d|…f         fS )aÙ  Cut or pad the reference Tensor to make it aligned with waveform Tensor.

        Args:
            waveform (torch.Tensor): Input waveform for evaluation. Tensor with dimensions `(batch, time)`.
            reference (torch.Tensor): Non-matching clean reference. Tensor with dimensions `(batch, time_ref)`.

        Returns:
            (torch.Tensor, torch.Tensor): The aligned waveform and reference Tensors
                with same dimensions `(batch, time)`.
        éÿÿÿÿr	   c                 ó   •— g | ]}‰‘ŒS © rC   )Ú.0Ú_r?   s     €r   ú
<listcomp>z1SquimSubjective._align_shapes.<locals>.<listcomp>e   s   ø€ Ð"IÐ"IÐ"I° 9Ð"IÐ"IÐ"Ir   r   N)Úshaper   ÚcatÚrange)r   r>   r?   Ú
T_waveformÚT_referenceÚnum_paddings     `   r   Ú_align_shapeszSquimSubjective._align_shapesV   s„   ø€ ð ”^ BÔ'ˆ
Ø”o bÔ)ˆØ˜Ò#Ð#Ø$¨Ñ3°aÑ7ˆKÝœ	Ð"IÐ"IÐ"IÐ"Iµe¸KÑ6HÔ6HÐ"IÑ"IÔ"IÈqÐQÑQÔQˆIØ˜ 1 1 1 k z k >Ô2Ð2Ð2r   c                 ó|  — |                       ||¦  «        \  }}|                      | j                             |¦  «        d         d         ¦  «        }|                      | j                             |¦  «        d         d         ¦  «        }t	          j        ||fd¬¦  «        }|                      |¦  «        }d|z
  S )a‰  Predict subjective evaluation metric score.

        Args:
            waveform (torch.Tensor): Input waveform for evaluation. Tensor with dimensions `(batch, time)`.
            reference (torch.Tensor): Non-matching clean reference. Tensor with dimensions `(batch, time_ref)`.

        Returns:
            (torch.Tensor): Subjective metric score. Tensor with dimensions `(batch,)`.
        r   rA   r   r   é   )rM   r;   r:   Úextract_featuresr   rH   r<   )r   r>   r?   ÚconcatÚ
score_diffs        r   r"   zSquimSubjective.forwardh   s©   € ð #×0Ò0°¸9ÑEÔEÑˆ�)Ø—>’> $¤.×"AÒ"AÀ(Ñ"KÔ"KÈAÔ"NÈrÔ"RÑSÔSˆØ—N’N 4¤>×#BÒ#BÀ9Ñ#MÔ#MÈaÔ#PÐQSÔ#TÑUÔUˆ	Ý”˜I xÐ0°aÐ8Ñ8Ô8ˆØ—^’^ FÑ+Ô+ˆ
Ø�:‰~Ðr   )r$   r%   r&   r'   r   ÚModuler   r   r)   r   rM   r"   r*   r+   s   @r   r9   r9   E   sÈ   ø€ € € € € ðð ð# "¤)ð #¸¼	ð #ÈbÌið #ð #ð #ð #ð #ð #ð3 e¤lð 3¸u¼|ð 3ÐPUÐV[ÔVbÐdiÔdpÐVpÔPqð 3ð 3ð 3ð 3ð$ ¤ð ¸¼ð ð ð ð ð ð ð ð r   r9   Ússl_typeÚfeat_dimÚproj_dimr   r   c                 ó¸   —  t          t          j        | ¦  «        ¦   «         }t          j        ||¦  «        }t          |dz  |¦  «        }t          |||¦  «        S )a£  Build a custome :class:`torchaudio.prototype.models.SquimSubjective` model.

    Args:
        ssl_type (str): Type of self-supervised learning (SSL) models.
            Must be one of ["wav2vec2_base", "wav2vec2_large"].
        feat_dim (int): Feature dimension of the SSL feature representation.
        proj_dim (int): Output dimension of projection layer.
        att_dim (int): Dimension of attention scores.
    r   )ÚgetattrÚ
torchaudioÚmodelsr   r   r-   r9   )rT   rU   rV   r   r:   r;   r<   s          r   Úsquim_subjective_modelr[   z   sT   € ð 5•�
Ô)¨8Ñ4Ô4Ñ6Ô6€IÝ”	˜( HÑ-Ô-€IÝ˜( Q™,¨Ñ0Ô0€IÝ˜9 i°Ñ;Ô;Ð;r   c                  ó(   — t          dddd¬¦  «        S )zXBuild :class:`torchaudio.prototype.models.SquimSubjective` model with default arguments.Úwav2vec2_basei   é    rO   )rT   rU   rV   r   )r[   rC   r   r   Úsquim_subjective_baser_   �   s%   € å!Ø ØØØð	ñ ô ð r   )Útypingr   r   Útorch.nnr   rY   rS   r   r-   r9   Ústrr(   r[   r_   rC   r   r   ú<module>rc      s+  ðØ Ð Ð Ð Ð Ð à €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð ðð ð ð ð ˆbŒiñ ô ð ð@ð ð ð ð �”	ñ ô ð ð:2ð 2ð 2ð 2ð 2�b”iñ 2ô 2ð 2ðj<Øð<àð<ð ð<ð ð	<ð
 ð<ð <ð <ð <ð*˜ð ð ð ð ð ð r   