Ë
    þÍ:jQ@  ã                   óD  — d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlZ	d dl
Z
d dlmZ d dl
mZ d dlmZmZmZ d dlmZmZ d dlmZ d dlmZmZ erer	d dlZd dlZnd	\  ZZd
ddgiZdZdededefd„Zede ejB                  e"e#ef   f   fd„«       Z$d-d„Z% G d„ dejB                  «      Z& G d„ dejB                  «      Z' G d„ dejB                  «      Z( G d„ dejB                  «      Z) G d„ dejB                  «      Z* G d„ dejB                  «      Z+ G d „ d!ejB                  «      Z, G d"„ d#e
j                  jB                  «      Z-d$e	j\                  d%ed&e"e#ef   de	j\                  fd'„Z/d(ed&e"e#ef   de eef   fd)„Z0d*ejB                  d+edejb                  fd,„Z2y).é    N)Ú	lru_cache)ÚAny)ÚTensor)Úadaptive_max_pool2dÚreluÚsoftmax)Úpack_padded_sequenceÚpad_packed_sequence)Úrank_zero_info)Ú_LIBROSA_AVAILABLEÚ_REQUESTS_AVAILABLE)NN)Ú'non_intrusive_speech_quality_assessmentÚlibrosaÚrequestsz~/.torchmetrics/NISQAÚpredsÚfsÚreturnc                 óf  — t         rt        st        d«      ‚t        «       \  }}t	        |t
        «      r|dk  rt        d|› �«      ‚|j                  «        | j                  d| j                  d   «      }t        |j                  «       j                  «       ||«      }t        t        j                  |«      |«      \  }}t        j                   «       5   |||j#                  |j                  d   «      «      }ddd«       |j                  g | j                  dd ¢d‘­«      S # 1 sw Y   Œ,xY w)u6  `Non-Intrusive Speech Quality Assessment`_ (NISQA v2.0) [1], [2].

    .. hint::
        Usingsing this metric requires you to have ``librosa`` and ``requests`` installed. Install as
        ``pip install librosa requests``.

    Args:
        preds: float tensor with shape ``(...,time)``
        fs: sampling frequency of input

    Returns:
        Float tensor with shape ``(...,5)`` corresponding to overall MOS, noisiness, discontinuity, coloration and
        loudness in that order

    Raises:
        ModuleNotFoundError:
            If ``librosa`` or ``requests`` are not installed
        RuntimeError:
            If the input is too short, causing the number of mel spectrogram windows to be zero
        RuntimeError:
            If the input is too long, causing the number of mel spectrogram windows to exceed the maximum allowed

    Example:
        >>> import torch
        >>> from torchmetrics.functional.audio.nisqa import non_intrusive_speech_quality_assessment
        >>> _ = torch.manual_seed(42)
        >>> preds = torch.randn(16000)
        >>> non_intrusive_speech_quality_assessment(preds, 16000)
        tensor([1.0433, 1.9545, 2.6087, 1.3460, 1.7117])

    References:
        - [1] G. Mittag and S. MÃ¶ller, "Non-intrusive speech quality assessment for super-wideband speech communication
          networks", in Proc. ICASSP, 2019.
        - [2] G. Mittag, B. Naderi, A. Chehadi and S. MÃ¶ller, "NISQA: A deep CNN-self-attention model for
          multidimensional speech quality prediction with crowdsourced datasets", in Proc. INTERSPEECH, 2021.

    ziNISQA metric requires that librosa and requests are installed. Install as `pip install librosa requests`.r   z9Argument `fs` expected to be a positive integer, but got éÿÿÿÿNé   )r   r   ÚModuleNotFoundErrorÚ_load_nisqa_modelÚ
isinstanceÚintÚ
ValueErrorÚevalÚreshapeÚshapeÚ_get_librosa_melspecÚcpuÚnumpyÚ_segment_specsÚtorchÚ
from_numpyÚno_gradÚexpand)r   r   ÚmodelÚargsÚxÚn_winss         úx/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/torchmetrics/functional/audio/nisqa.pyr   r   B   s  € õL Õ%8Ü!Øwó
ð 	
ô $Ó%�K€Eˆ4Ü�bœ#Ô "¨¢'ÜÐTÐUWÐTXÐYÓZÐZØ	‡J�J„LØ�‰�b˜%Ÿ+™+ b™/Ó*€AÜ˜QŸU™U›WŸ]™]›_¨b°$Ó7€AÜœu×/Ñ/°Ó2°DÓ9�I€A€vÜ	�‰‹ñ 0Ù�!�V—]‘] 1§7¡7¨1¡:Ó.Ó/ˆ÷0ð
 �9‰9Ð+�u—{‘{ 3 BÐ'Ð+¨Ñ+Ó,Ð,÷0ð 0ús   Ã&D'Ä'D0c                  óZ  — t         j                  j                  t         j                  j                  t        d«      «      } t         j                  j                  | «      s
t        «        t        j                  | dd¬«      }|d   }t        |«      }|j                  |d   d¬«       ||fS )z¯Load NISQA model and its parameters.

    Returns:
        Tuple ``(model,args)`` where ``model`` is the NISQA model and ``args`` is a dictionary with all its parameters

    ú	nisqa.tarr    T)Úmap_locationÚweights_onlyr(   Úmodel_state_dict)Ústrict)ÚosÚpathÚ
expanduserÚjoinÚ	NISQA_DIRÚexistsÚ_download_weightsr#   ÚloadÚ	_NISQADIMÚload_state_dict)Ú
model_pathÚ
checkpointr(   r'   s       r+   r   r   {   s…   € ô —‘×#Ñ#¤B§G¡G§L¡L´¸KÓ$HÓI€JÜ�7‰7�>‰>˜*Ô%ÜÔÜ—‘˜J°UÈÔN€JØ�fÑ€DÜ�d‹O€EØ	×Ñ˜*Ð%7Ñ8ÀÐÔFØ�$ˆ;Ðó    c                  óÀ  — d} t         j                  j                  t        «      }t        j                  |d¬«       t         j                  j                  |d«      }t         j                  j                  |«      ryt        d| › d|› �«       t        j                  | «      }t        |d«      5 }|j                  |j                  «       ddd«       y# 1 sw Y   yxY w)	zDownload NISQA model weights.zNhttps://github.com/gabrielmittag/NISQA/raw/refs/heads/master/weights/nisqa.tarT)Úexist_okr-   Nzdownloading z to Úwb)r2   r3   r4   r6   Úmakedirsr5   r7   r   r   ÚgetÚopenÚwriteÚcontent)ÚurlÚ	nisqa_dirÚsavetoÚmyfileÚfs        r+   r8   r8   �   s¤   € à
Z€CÜ—‘×"Ñ"¤9Ó-€IÜ‡K�K�	 DÕ)Ü�W‰W�\‰\˜) [Ó1€FÜ	‡w�w‡~�~�fÔØÜ�\ #  d¨6¨(Ð3Ô4Ü�\‰\˜#Ó€FÜ	ˆf�dÓ	ð  ˜qØ	�‰�—‘Ô÷ ÷  ñ  ús   Â/CÃCc                   óF   ‡ — e Zd Zdeeef   ddfˆ fd„Zdededefd„Zˆ xZ	S )r:   r(   r   Nc                 óš   •— t         ‰| �  «        t        |«      | _        t	        |«      | _        t        |«      }t        |d«      | _        y )Nr   )	ÚsuperÚ__init__Ú
_FramewiseÚcnnÚ_TimeDependencyÚtime_dependencyÚ_PoolingÚ_get_clonesÚpool_layers)Úselfr(   ÚpoolÚ	__class__s      €r+   rO   z_NISQADIM.__init__    s?   ø€ Ü‰ÑÔÜ˜dÓ#ˆŒÜ.¨tÓ4ˆÔÜ˜‹~ˆÜ& t¨QÓ/ˆÕr>   r)   r*   c                 óÈ   — | j                  ||«      }| j                  ||«      \  }}| j                  D �cg c]  } |||«      ‘Œ }}t        j                  |d¬«      S c c}w )Né   ©Údim)rQ   rS   rV   r#   Úcat)rW   r)   r*   ÚmodÚouts        r+   Úforwardz_NISQADIM.forward§   s]   € Ø�H‰H�Q˜ÓˆØ×(Ñ(¨¨FÓ3‰	ˆˆ6Ø)-×)9Ñ)9Ö: #‰s�1�f�~Ð:ˆÐ:Ü�y‰y˜ !Ô$Ð$ùò ;s   ¶A©
Ú__name__Ú
__module__Ú__qualname__ÚdictÚstrr   rO   r   ra   Ú__classcell__©rY   s   @r+   r:   r:   ›   s8   ø„ ð
0˜T # s (™^ð 0°õ 0ð%˜ð %¨ð %°F÷ %r>   r:   c                   óF   ‡ — e Zd Zdeeef   ddfˆ fd„Zdededefd„Zˆ xZ	S )rP   r(   r   Nc                 óB   •— t         ‰| �  «        t        |«      | _        y ©N)rN   rO   Ú	_AdaptCNNr'   ©rW   r(   rY   s     €r+   rO   z_Framewise.__init__°   s   ø€ Ü‰ÑÔÜ˜t“_ˆ�
r>   r)   r*   c           	      óî   — t        ||dd¬«      }| j                  |j                  j                  d«      «      }|j	                  |¬«      }t        |ddt        |j                  «       «      ¬«      \  }}|S )NTF)Úbatch_firstÚenforce_sortedr[   )Údataç        )rp   Úpadding_valueÚtotal_length)r	   r'   rr   Ú	unsqueezeÚ_replacer
   r   Úmax)rW   r)   r*   Úx_packedÚ_s        r+   ra   z_Framewise.forward´   sl   € Ü'¨¨6¸tÐTYÔZˆØ�J‰J�x—}‘}×.Ñ.¨qÓ1Ó2ˆØ×Ñ 1ÐÓ%ˆÜ" 1°$ÀcÔX[Ð\b×\fÑ\fÓ\hÓXiÔj‰ˆˆ1Øˆr>   rb   ri   s   @r+   rP   rP   ®   s8   ø„ ð%˜T # s (™^ð %°õ %ð˜ð ¨ð °F÷ r>   rP   c                   óB   ‡ — e Zd Zdeeef   ddfˆ fd„Zdedefd„Zˆ xZ	S )rm   r(   r   Nc                 ón  •— t         ‰| �  «        |d   | _        |d   | _        |d   | _        t        j                  |d   ¬«      | _        |d   d   dk(  rd	nd
}t        j                  d|d   |d   |¬«      | _	        t        j                  | j                  j                  «      | _        t        j                  | j                  j                  |d   |d   |¬«      | _        t        j                  | j                  j                  «      | _        t        j                  | j                  j                  |d   |d   |¬«      | _        t        j                  | j                  j                  «      | _        t        j                  | j                  j                  |d   |d   |¬«      | _        t        j                  | j"                  j                  «      | _        t        j                  | j"                  j                  |d   |d   |¬«      | _        t        j                  | j&                  j                  «      | _        t        j                  | j&                  j                  |d   |d   d   |d   d   fd	¬«      | _        t        j                  | j*                  j                  «      | _        y )NÚ
cnn_pool_1Ú
cnn_pool_2Ú
cnn_pool_3Úcnn_dropout)ÚpÚcnn_kernel_sizer   r[   )r[   r   )r[   r[   Úcnn_c_out_1)ÚpaddingÚcnn_c_out_2Úcnn_c_out_3)rN   rO   Úpool_1Úpool_2Úpool_3ÚnnÚ	Dropout2dÚdropoutÚConv2dÚconv1ÚBatchNorm2dÚout_channelsÚbn1Úconv2Úbn2Úconv3Úbn3Úconv4Úbn4Úconv5Úbn5Úconv6Úbn6)rW   r(   Úcnn_padrY   s      €r+   rO   z_AdaptCNN.__init__¾   s  ø€ Ü‰ÑÔØ˜<Ñ(ˆŒØ˜<Ñ(ˆŒØ˜<Ñ(ˆŒÜ—|‘| d¨=Ñ&9Ô:ˆŒØ Ð!2Ñ3°AÑ6¸!Ò;‘&ÀˆÜ—Y‘Y˜q $ }Ñ"5°tÐ<MÑ7NÐX_Ô`ˆŒ
Ü—>‘> $§*¡*×"9Ñ"9Ó:ˆŒÜ—Y‘Y˜tŸz™z×6Ñ6¸¸]Ñ8KÈTÐRcÑMdÐnuÔvˆŒ
Ü—>‘> $§*¡*×"9Ñ"9Ó:ˆŒÜ—Y‘Y˜tŸz™z×6Ñ6¸¸]Ñ8KÈTÐRcÑMdÐnuÔvˆŒ
Ü—>‘> $§*¡*×"9Ñ"9Ó:ˆŒÜ—Y‘Y˜tŸz™z×6Ñ6¸¸]Ñ8KÈTÐRcÑMdÐnuÔvˆŒ
Ü—>‘> $§*¡*×"9Ñ"9Ó:ˆŒÜ—Y‘Y˜tŸz™z×6Ñ6¸¸]Ñ8KÈTÐRcÑMdÐnuÔvˆŒ
Ü—>‘> $§*¡*×"9Ñ"9Ó:ˆŒÜ—Y‘YØ�J‰J×#Ñ#Ø�ÑØÐ#Ñ$ QÑ'¨¨lÑ);¸AÑ)>Ð?Øô	
ˆŒ
ô —>‘> $§*¡*×"9Ñ"9Ó:ˆ�r>   r)   c                 ól  — t        | j                  | j                  |«      «      «      }t        || j                  ¬«      }t        | j                  | j                  |«      «      «      }t        || j                  ¬«      }| j                  |«      }t        | j                  | j                  |«      «      «      }| j                  |«      }t        | j                  | j                  |«      «      «      }t        || j                  ¬«      }| j                  |«      }t        | j                  | j                  |«      «      «      }| j                  |«      }t        | j!                  | j#                  |«      «      «      }|j%                  d| j"                  j&                  | j                  d   z  «      S )N)Úoutput_sizer   r   )r   r‘   rŽ   r   r‡   r“   r’   rˆ   rŒ   r•   r”   r—   r–   r‰   r™   r˜   r›   rš   Úviewr�   )rW   r)   s     r+   ra   z_AdaptCNN.forward×   s0  € Ü�—‘˜$Ÿ*™* Q›-Ó(Ó)ˆÜ °·±Ô=ˆÜ�—‘˜$Ÿ*™* Q›-Ó(Ó)ˆÜ °·±Ô=ˆØ�L‰L˜‹OˆÜ�—‘˜$Ÿ*™* Q›-Ó(Ó)ˆØ�L‰L˜‹OˆÜ�—‘˜$Ÿ*™* Q›-Ó(Ó)ˆÜ °·±Ô=ˆØ�L‰L˜‹OˆÜ�—‘˜$Ÿ*™* Q›-Ó(Ó)ˆØ�L‰L˜‹OˆÜ�—‘˜$Ÿ*™* Q›-Ó(Ó)ˆØ�v‰v�b˜$Ÿ*™*×1Ñ1°D·K±KÀ±NÑBÓCÐCr>   rb   ri   s   @r+   rm   rm   ¼   s4   ø„ ð;˜T # s (™^ð ;°õ ;ð2D˜ð D F÷ Dr>   rm   c                   óF   ‡ — e Zd Zdeeef   ddfˆ fd„Zdededefd„Zˆ xZ	S )rR   r(   r   Nc                 óB   •— t         ‰| �  «        t        |«      | _        y rl   )rN   rO   Ú_SelfAttentionr'   rn   s     €r+   rO   z_TimeDependency.__init__ê   s   ø€ Ü‰ÑÔÜ# DÓ)ˆ�
r>   r)   r*   c                 ó&   — | j                  ||«      S rl   ©r'   ©rW   r)   r*   s      r+   ra   z_TimeDependency.forwardî   ó   € Ø�z‰z˜!˜VÓ$Ð$r>   rb   ri   s   @r+   rR   rR   è   s8   ø„ ð*˜T # s (™^ð *°õ *ð%˜ð %¨ð %°F÷ %r>   rR   c                   óX   ‡ — e Zd Zdeeef   ddfˆ fd„Zd	d„Zdedede	eef   fd„Z
ˆ xZS )
r¢   r(   r   Nc                 ó  •— t         ‰| �  «        t        |«      }t        j                  |d   «      | _        t        j                  |d   |d   d   z  |d   «      | _        t        ||d   «      | _	        | j                  «        y )NÚtd_sa_d_modelr†   r   r   Útd_sa_num_layers)rN   rO   Ú_SelfAttentionLayerrŠ   Ú	LayerNormÚnorm1ÚLinearÚlinearrU   ÚlayersÚ_reset_parameters)rW   r(   Úencoder_layerrY   s      €r+   rO   z_SelfAttention.__init__ô   sy   ø€ Ü‰ÑÔÜ+¨DÓ1ˆÜ—\‘\ $ Ñ"7Ó8ˆŒ
Ü—i‘i  ]Ñ 3°d¸<Ñ6HÈÑ6KÑ KÈTÐRaÑMbÓcˆŒÜ! -°Ð6HÑ1IÓJˆŒØ×ÑÕ r>   c                 ó”   — | j                  «       D ]5  }|j                  «       dkD  sŒt        j                  j	                  |«       Œ7 y )Nr[   )Ú
parametersr]   rŠ   ÚinitÚxavier_uniform_)rW   r�   s     r+   r±   z _SelfAttention._reset_parametersü   s7   € Ø—‘Ó"ò 	+ˆAØ�u‰u‹w˜‹{Ü—‘×'Ñ'¨Õ*ñ	+r>   Úsrcr*   c                 óÌ   — | j                  |«      }|j                  dd«      }| j                  |«      }| j                  D ]  } |||«      \  }}Œ |j                  dd«      |fS )Nr[   r   )r¯   Ú	transposer­   r°   )rW   r·   r*   Úoutputr_   s        r+   ra   z_SelfAttention.forward  si   € Ø�k‰k˜#ÓˆØ—‘˜q !Ó$ˆØ—‘˜FÓ#ˆØ—;‘;ò 	1ˆCÙ  ¨Ó0‰NˆF‘Fð	1à×Ñ  1Ó% vÐ-Ð-r>   ©r   N)rc   rd   re   rf   rg   r   rO   r±   r   Útuplera   rh   ri   s   @r+   r¢   r¢   ò   sF   ø„ ð!˜T # s (™^ð !°õ !ó+ð
.˜6ð .¨6ð .°e¸FÀF¸NÑ6K÷ .r>   r¢   c                   óP   ‡ — e Zd Zdeeef   ddfˆ fd„Zdededeeef   fd„Z	ˆ xZ
S )r«   r(   r   Nc                 ó(  •— t         ‰| �  «        t        j                  |d   |d   |d   «      | _        t        j
                  |d   |d   «      | _        t        j                  |d   «      | _        t        j
                  |d   |d   «      | _	        t        j                  |d   «      | _        t        j                  |d   «      | _        t        j                  |d   «      | _        t        j                  |d   «      | _        t        | _        y )Nr©   Útd_sa_nheadÚtd_sa_dropoutÚtd_sa_h)rN   rO   rŠ   ÚMultiheadAttentionÚ	self_attnr®   Úlinear1ÚDropoutrŒ   Úlinear2r¬   r­   Únorm2Údropout1Údropout2r   Ú
activationrn   s     €r+   rO   z_SelfAttentionLayer.__init__  sÛ   ø€ Ü‰ÑÔÜ×.Ñ.¨t°OÑ/DÀdÈ=ÑFYÐ[_Ð`oÑ[pÓqˆŒÜ—y‘y  oÑ!6¸¸Y¹ÓHˆŒÜ—z‘z $ Ñ"7Ó8ˆŒÜ—y‘y  i¡°$°Ñ2GÓHˆŒÜ—\‘\ $ Ñ"7Ó8ˆŒ
Ü—\‘\ $ Ñ"7Ó8ˆŒ
ÜŸ
™
 4¨Ñ#8Ó9ˆŒÜŸ
™
 4¨Ñ#8Ó9ˆŒÜˆ�r>   r·   r*   c           	      ó²  — t        j                  |j                  d   «      d d d …f   |d d …d f   k  }| j                  |||| ¬«      d   }|| j	                  |«      z   }| j                  |«      }| j                  | j                  | j                  | j                  |«      «      «      «      }|| j                  |«      z   }| j                  |«      }||fS )Nr   )Úkey_padding_mask)r#   Úaranger   rÃ   rÈ   r­   rÆ   rŒ   rÊ   rÄ   rÉ   rÇ   )rW   r·   r*   ÚmaskÚsrc2s        r+   ra   z_SelfAttentionLayer.forward  s¾   € Ü�|‰|˜CŸI™I a™LÓ)¨$²¨'Ñ2°VºA¸t¸G±_ÑDˆØ�~‰~˜c 3¨¸t¸eˆ~ÓDÀQÑGˆØ�D—M‘M $Ó'Ñ'ˆØ�j‰j˜‹oˆØ�|‰|˜DŸL™L¨¯©¸¿¹ÀcÓ9JÓ)KÓLÓMˆØ�D—M‘M $Ó'Ñ'ˆØ�j‰j˜‹oˆØ�Fˆ{Ðr>   )rc   rd   re   rf   rg   r   rO   r   r¼   ra   rh   ri   s   @r+   r«   r«   
  sA   ø„ ð
˜T # s (™^ð 
°õ 
ð˜6ð ¨6ð °e¸FÀF¸NÑ6K÷ r>   r«   c                   óF   ‡ — e Zd Zdeeef   ddfˆ fd„Zdededefd„Zˆ xZ	S )rT   r(   r   Nc                 óB   •— t         ‰| �  «        t        |«      | _        y rl   )rN   rO   Ú
_PoolAttFFr'   rn   s     €r+   rO   z_Pooling.__init__%  s   ø€ Ü‰ÑÔÜ Ó%ˆ�
r>   r)   r*   c                 ó&   — | j                  ||«      S rl   r¤   r¥   s      r+   ra   z_Pooling.forward)  r¦   r>   rb   ri   s   @r+   rT   rT   #  s8   ø„ ð&˜T # s (™^ð &°õ &ð%˜ð %¨ð %°F÷ %r>   rT   c                   óF   ‡ — e Zd Zdeeef   ddfˆ fd„Zdededefd„Zˆ xZ	S )rÒ   r(   r   Nc                 ó,  •— t         ‰| �  «        t        j                  |d   |d   «      | _        t        j                  |d   d«      | _        t        j                  |d   d«      | _        t        | _        t        j                  |d   «      | _
        y )Nr©   Ú
pool_att_hr[   Úpool_att_dropout)rN   rO   rŠ   r®   rÄ   rÆ   Úlinear3r   rÊ   rÅ   rŒ   rn   s     €r+   rO   z_PoolAttFF.__init__/  su   ø€ Ü‰ÑÔÜ—y‘y  oÑ!6¸¸\Ñ8JÓKˆŒÜ—y‘y  lÑ!3°QÓ7ˆŒÜ—y‘y  oÑ!6¸Ó:ˆŒÜˆŒÜ—z‘z $Ð'9Ñ":Ó;ˆ�r>   r)   r*   c           	      óÎ  — | j                  | j                  | j                  | j                  |«      «      «      «      }|j	                  dd«      }t        j                  |j                  d   «      d d d …f   |d d …d f   k  }t        d«      ||j                  d«       <   t        |d¬«      }t        j                  ||«      }|j                  d«      }| j                  |«      S )Né   r[   z-infr\   )rÆ   rŒ   rÊ   rÄ   r¹   r#   rÍ   r   Úfloatrv   r   ÚbmmÚsqueezerØ   )rW   r)   r*   ÚattrÎ   s        r+   ra   z_PoolAttFF.forward7  s·   € Ø�l‰l˜4Ÿ<™<¨¯©¸¿¹ÀQ»Ó(HÓIÓJˆØ�m‰m˜A˜qÓ!ˆÜ�|‰|˜CŸI™I a™LÓ)¨$²¨'Ñ2°VºA¸t¸G±_ÑDˆÜ"'¨£-ˆˆT�^‰^˜AÓÐÑÜ�c˜qÔ!ˆÜ�I‰I�c˜1ÓˆØ�I‰I�a‹LˆØ�|‰|˜A‹Ðr>   rb   ri   s   @r+   rÒ   rÒ   -  s8   ø„ ð<˜T # s (™^ð <°õ <ð˜ð ¨ð °F÷ r>   rÒ   ÚyÚsrr(   c                 ó²  — t        ||d   z  «      }t        ||d   z  «      }t        j                  «       5  t        j                  dd¬«       t        j
                  j                  | |d|d   ||dd	d
d|d   d|d   dd¬«      }ddd«       t        j                  D �cg c]  }t	        j                  |ddd¬«      ‘Œ c}«      S # 1 sw Y   ŒCxY wc c}w )a  Compute mel spectrogram from waveform using librosa.

    Args:
        y: waveform with shape ``(batch_size,time)``
        sr: sampling rate
        args: dictionary with all NISQA parameters

    Returns:
        Mel spectrogram with shape ``(batch_size,n_mels,n_frames)``

    Úms_hop_lengthÚms_win_lengthÚignorez-Empty filters detected in mel frequency basis)ÚmessageNÚms_n_fftÚhannTÚreflectg      ð?Ú	ms_n_melsrs   Úms_fmaxFÚslaney)rß   rà   ÚSÚn_fftÚ
hop_lengthÚ
win_lengthÚwindowÚcenterÚpad_modeÚpowerÚn_melsÚfminÚfmaxÚhtkÚnormg-Cëâ6?g      T@)ÚrefÚaminÚtop_db)
r   ÚwarningsÚcatch_warningsÚfilterwarningsr   ÚfeatureÚmelspectrogramÚnpÚstackÚamplitude_to_db)rß   rà   r(   rî   rï   ÚmelspecÚms          r+   r   r   B  sè   € ô �R˜$˜Ñ/Ñ/Ó0€JÜ�R˜$˜Ñ/Ñ/Ó0€JÜ	×	 Ñ	 Ó	"ñ 
ô 	×Ñ Ð2aÕbÜ—/‘/×0Ñ0ØØØØ�zÑ"Ø!Ø!ØØØØØ˜Ñ$ØØ�i‘ØØð 1ó 
ˆ÷	
ô0 �8‰8ÐZaÖbÐUV”W×,Ñ,¨Q°C¸dÈ4ÖPÒbÓcÐc÷1
ð 
üò0 cs   ·ACÂ! CÃCr)   c                 óˆ  — |d   }|d   }|d   }| j                   d   |dz
  z
  }|dk  rt        d«      ‚t        j                  |«      }t        j                  |«      }|j	                  d«      |j	                  d«      z   }| j                  dd«      dd…|dd…f   j                  d	d«      } | dd…dd|…f   } t        j                  ||z  «      }||k  rt        d
«      ‚t        j                  | j                   d   || j                   d   | j                   d	   f«      }	| |	dd…d|…f<   |	t        j                  |«      fS )a   Segment mel spectrogram into overlapping windows.

    Args:
        x: mel spectrogram with shape ``(batch_size,n_mels,n_frames)``
        args: dictionary with all NISQA parameters

    Returns:
        Tuple ``(x_padded,n_wins)```, where ``x_padded`` is the segmented mel spectrogram with shape
        ``(batch_size,max_length,n_mels,seg_length)`` where the second dimension is the number of windows and was
        padded to ``max_length``, and ``n_wins`` is the number of windows and is 0-dimensional

    Úms_seg_lengthÚms_seg_hop_lengthÚms_max_segmentsrÚ   r[   zInput signal is too short.r   Né   zFMaximum number of mel spectrogram windows exceeded. Use shorter audio.)
r   ÚRuntimeErrorr#   rÍ   rv   r¹   ÚmathÚceilÚzerosÚtensor)
r)   r(   Ú
seg_lengthÚseg_hopÚ
max_lengthr*   Úidx1Úidx2Úidx3Úx_paddeds
             r+   r"   r"   k  s:  € ð �oÑ&€JØÐ&Ñ'€GØÐ'Ñ(€JØ�W‰W�Q‰Z˜:¨™>Ñ*€FØ�‚zÜÐ7Ó8Ð8Ü�<‰<˜
Ó#€DÜ�<‰<˜Ó€DØ�>‰>˜!Ó˜tŸ~™~¨aÓ0Ñ0€DØ	�‰�A�qÓš!˜T¢1˜*Ñ%×/Ñ/°°1Ó5€AØ	Š!‰YˆwˆYˆ,‰€AÜ�Y‰Y�v Ñ'Ó(€FØ�FÒÜÐcÓdÐdÜ�{‰{˜AŸG™G A™J¨
°A·G±G¸A±JÀÇÁÈÁ
ÐKÓL€HØ€HŠQ���ˆZÑØ”U—\‘\ &Ó)Ð)Ð)r>   ÚmoduleÚnc                 óŠ   — t        j                  t        |«      D �cg c]  }t        j                  | «      ‘Œ c}«      S c c}w )z Create ``n`` copies of a module.)rŠ   Ú
ModuleListÚrangeÚcopyÚdeepcopy)r  r  Úis      r+   rU   rU   ‹  s,   € ä�=‰=¼¸q»ÖB°Aœ$Ÿ-™-¨Õ/ÒBÓCÐCùÒBs   �A r»   )3r  r  r2   rü   Ú	functoolsr   Útypingr   r!   r  r#   Útorch.nnrŠ   r   Útorch.nn.functionalr   r   r   Útorch.nn.utils.rnnr	   r
   Útorchmetrics.utilitiesr   Útorchmetrics.utilities.importsr   r   r   r   Ú__doctest_requires__r6   r   r   r¼   ÚModulerf   rg   r   r8   r:   rP   rm   rR   r¢   r«   rT   rÒ   Úndarrayr   r"   r  rU   © r>   r+   ú<module>r*     sÂ  ðóL Û Û 	Û Ý Ý ã Û Ý Ý ß BÑ Bß Hå 1ß RáÑ-ÛÜà"Ñ€GˆXàDÀyÐR\ÐF]Ð^Ð à#€	ð6-°6ð 6-¸sð 6-Àvó 6-ðr ð˜5 §¡¨D°°c°©NÐ!:Ñ;ò ó ðó" ô%�—	‘	ô %ô&�—‘ô ô)D�—	‘	ô )DôX%�b—i‘iô %ô.�R—Y‘Yô .ô0˜"Ÿ)™)ô ô2%ˆr�y‰yô %ô�—‘—‘ô ð*&d˜BŸJ™Jð &d¨Cð &d°t¸CÀ¸H±~ð &dÈ"Ï*É*ó &dðR*�fð * D¨¨c¨¡Nð *°u¸VÀV¸^Ñ7Ló *ð@D˜Ÿ	™	ð D cð D¨b¯m©mô Dr>   