Ë
    ÿÍ:jNr  ã                   ój  — 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	Z
d dlZd dlmc mZ d dlmc mZ d dlm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 d d
lm Z  d dl!m"Z"m#Z# 	 d dl$m%Z& dZ'	 d dl)m*Z+ dZ,	 d dl-Z.dZ/ G d„ de«      Z0 G d„ de«      Z1 G d„ de«      Z2 G d„ de«      Z3	 	 	 d$de"deejh                     deedf   deeedf   fd„Z5 G d„ de«      Z6	 	 	 	 d%de7d e7de7d!ee7   fd"„Z8e9d#k(  rd dl:Z: e:jv                  e8«       yy# e($ r dZ'Y Œ©w xY w# e($ r dZ,Y Œ­w xY w# e($ r dZ/Y Œ³w xY w)&é    N)Úcached_property)ÚPath)ÚOptionalÚTextÚUnion)Úhf_hub_download)ÚRepositoryNotFoundError)Úpad_sequence)Ú	InferenceÚModelÚPipeline)ÚBaseInference)Ú	AudioFile)ÚPipelineModelÚ	get_model)ÚEncoderClassifierTF)ÚEncDecSpeakerLabelModelc                   ó  ‡ — e Zd Z	 	 ddedeej                     fˆ fd„Zdej                  fd„Ze	de
fd„«       Ze	de
fd„«       Ze	defd„«       Ze	de
fd	„«       Z	 dd
ej                   deej                      dej$                  fd„Zˆ xZS )ÚNeMoPretrainedSpeakerEmbeddingÚ	embeddingÚdevicec                 ó\  •— t         st        d|› d�«      ‚t        ‰| �  «        || _        |xs t        j                  d«      | _        t        j                  | j                  «      | _	        | j                  j                  «        | j                  j                  | j                  «       y )Nz!'NeMo' must be installed to use 'zQ' embeddings. Visit https://nvidia.github.io/NeMo/ for installation instructions.Úcpu)ÚNEMO_IS_AVAILABLEÚImportErrorÚsuperÚ__init__r   Útorchr   ÚNeMo_EncDecSpeakerLabelModelÚfrom_pretrainedÚmodel_ÚfreezeÚto)Úselfr   r   Ú	__class__s      €ú‚/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/pyannote/audio/pipelines/speaker_verification.pyr   z'NeMoPretrainedSpeakerEmbedding.__init__B   s‹   ø€ õ
 !ÜØ3°I°;ð ?Vð Vóð ô
 	‰ÑÔØ"ˆŒØÒ3¤§¡¨UÓ 3ˆŒä2×BÑBÀ4Ç>Á>ÓRˆŒØ�‰×ÑÔØ�‰�‰�t—{‘{Õ#ó    c                 óÂ   — t        |t        j                  «      s"t        dt	        |«      j
                  › d�«      ‚| j                  j                  |«       || _        | S ©Nú5`device` must be an instance of `torch.device`, got `ú`©Ú
isinstancer   r   Ú	TypeErrorÚtypeÚ__name__r!   r#   ©r$   r   s     r&   r#   z!NeMoPretrainedSpeakerEmbedding.toU   óS   € Ü˜&¤%§,¡,Ô/ÜØGÌÈVË×H]ÑH]ÐG^Ð^_Ð`óð ð 	�‰�‰�vÔØˆŒØˆr'   Úreturnc                 ób   — | j                   j                  j                  j                  dd«      S )NÚsample_rateé€>  )r!   Ú_cfgÚtrain_dsÚget©r$   s    r&   r5   z*NeMoPretrainedSpeakerEmbedding.sample_rate_   s%   € à�{‰{×Ñ×(Ñ(×,Ñ,¨]¸EÓBÐBr'   c                 ó4  — t        j                  d| j                  «      j                  | j                  «      }t        j
                  | j                  g«      j                  | j                  «      }| j                  ||¬«      \  }}|j                  \  }}|S )Né   ©Úinput_signalÚinput_signal_length)r   Úrandr5   r#   r   Útensorr!   Úshape)r$   r>   r?   Ú_Ú
embeddingsÚ	dimensions         r&   rE   z(NeMoPretrainedSpeakerEmbedding.dimensionc   s‚   € ä—z‘z ! T×%5Ñ%5Ó6×9Ñ9¸$¿+¹+ÓFˆÜ#Ÿl™l¨D×,<Ñ,<Ð+=Ó>×AÑAÀ$Ç+Á+ÓNÐØŸ™Ø%Ð;Nð $ó 
‰ˆˆ:ð "×'Ñ'‰ˆˆ9ØÐr'   c                  ó   — y©NÚcosine© r:   s    r&   Úmetricz%NeMoPretrainedSpeakerEmbedding.metricm   ó   € àr'   c                 ó†  — dt        d| j                  z  «      }}||z   dz  }|dz   |k  r…	 t        j                  d|«      j	                  | j
                  «      }t        j                  |g«      j	                  | j
                  «      }| j                  ||¬«      }|}||z   dz  }|dz   |k  rŒ…|S # t        $ r |}Y Œ w xY w)Né   ç      à?r<   r=   )	Úroundr5   r   r@   r#   r   rA   r!   ÚRuntimeError)r$   ÚlowerÚupperÚmiddler>   r?   rC   s          r&   Úmin_num_samplesz.NeMoPretrainedSpeakerEmbedding.min_num_samplesq   sÔ   € àœ%  d×&6Ñ&6Ñ 6Ó7ˆuˆØ˜%‘- AÑ%ˆØ�a‰i˜%Òð
Ü$Ÿz™z¨!¨VÓ4×7Ñ7¸¿¹ÓD�Ü&+§l¡l°F°8Ó&<×&?Ñ&?ÀÇÁÓ&LÐ#à—K‘KØ!-ÐCVð  ó �ð �ð ˜e‘m¨Ñ)ˆFð �a‰i˜%Óð ˆøô  ò Ø’ðús   ¬A3B2 Â2C Â?C Ú	waveformsÚmasksc                 óð  — |j                   \  }}}|dk(  sJ ‚|j                  d¬«      }|€8|j                  d¬«      }|j                   d   t        j                  |«      z  }n’|j                   \  }}	||k(  sJ ‚t	        j
                  |j                  d¬«      |d¬«      j                  d¬«      }
|
dkD  }
t        t        ||
«      D ��cg c]
  \  }}||   ‘Œ c}}d¬«      }|
j                  d¬«      }|j                  «       }|| j                  k  r2t        j                  t        j                  || j                  f«      z  S || j                  k  }|||<   | j!                  |j#                  | j$                  «      |j#                  | j$                  «      ¬«      \  }	}|j'                  «       j)                  «       }t        j                  ||j'                  «       j)                  «       <   |S c c}}w )	á   

        Parameters
        ----------
        waveforms : (batch_size, num_channels, num_samples)
            Only num_channels == 1 is supported.
        masks : (batch_size, num_samples), optional

        Returns
        -------
        embeddings : (batch_size, dimension)

        r<   ©ÚdimÚnearest©ÚsizeÚmoderN   T©Úbatch_firstr=   )rB   Úsqueezer   ÚonesÚFÚinterpolateÚ	unsqueezer
   ÚzipÚsumÚmaxrT   ÚnpÚnanÚzerosrE   r!   r#   r   r   Únumpy©r$   rU   rV   Ú
batch_sizeÚnum_channelsÚnum_samplesÚsignalsÚwav_lensÚbatch_size_masksrC   ÚimasksÚwaveformÚimaskÚmax_lenÚ	too_shortrD   s                   r&   Ú__call__z'NeMoPretrainedSpeakerEmbedding.__call__†   sÍ  € ð" 1:·±Ñ-ˆ
�L +Ø˜qÒ Ð Ð à×%Ñ%¨!Ð%Ó,ˆ	àˆ=Ø×'Ñ'¨AÐ'Ó.ˆGØ—}‘} QÑ'¬%¯*©*°ZÓ*@Ñ@‰Hð #(§+¡+ÑÐ˜aØÐ!1Ò1Ð1Ð1ô —]‘]Ø—‘ A�Ó&¨[¸yôç‰g˜!ˆg‹nð ð ˜c‘\ˆFä"Ü8;¸IÀvÓ8N×O¡_ X¨u�˜%“ÓOØ ôˆGð
 —z‘z a�zÓ(ˆHà—,‘,“.ˆð �T×)Ñ)Ò)Ü—6‘6œBŸH™H j°$·.±.Ð%AÓBÑBÐBà˜t×3Ñ3Ñ3ˆ	Ø%ˆ�ÑàŸ™Ø"Ÿ™ d§k¡kÓ2Ø (§¡¨D¯K©KÓ 8ð $ó 
‰ˆˆ:ð
  —^‘^Ó%×+Ñ+Ó-ˆ
Ü.0¯f©fˆ
�9—=‘=“?×(Ñ(Ó*Ñ+àÐùó/ Ps   ÃG2
)z+nvidia/speakerverification_en_titanet_largeN©N)r0   Ú
__module__Ú__qualname__r   r   r   r   r   r#   r   Úintr5   rE   ÚstrrJ   rT   ÚTensorri   Úndarrayry   Ú__classcell__©r%   s   @r&   r   r   A   sä   ø„ ð HØ)-ñ$àð$ð ˜Ÿ™Ñ&õ$ð&˜Ÿ™ó ð ðC˜Sò Có ðCð ð˜3ò ó ðð ð˜ò ó ðð ð ò ó ðð* HLñAØŸ™ðAØ.6°u·|±|Ñ.DðAà	�‰÷Ar'   r   c                   ó@  ‡ — e Zd ZdZ	 	 	 	 ddedeej                     deedf   dee	edf   fˆ fd„Z
dej                  fd„Zed	efd
„«       Zed	efd„«       Zed	efd„«       Zed	efd„«       Z	 ddej&                  deej&                     d	ej*                  fd„Zˆ xZS )Ú%SpeechBrainPretrainedSpeakerEmbeddingaµ  Pretrained SpeechBrain speaker embedding

    Parameters
    ----------
    embedding : str
        Name of SpeechBrain model
    device : torch.device, optional
        Device
    token : str or bool, optional
        Huggingface token to be used for downloading from Huggingface hub.
    cache_dir: Path or str, optional
        Path to the folder where files downloaded from Huggingface hub are stored.

    Usage
    -----
    >>> get_embedding = SpeechBrainPretrainedSpeakerEmbedding("speechbrain/spkrec-ecapa-voxceleb")
    >>> assert waveforms.ndim == 3
    >>> batch_size, num_channels, num_samples = waveforms.shape
    >>> assert num_channels == 1
    >>> embeddings = get_embedding(waveforms)
    >>> assert embeddings.ndim == 2
    >>> assert embeddings.shape[0] == batch_size

    >>> assert binary_masks.ndim == 1
    >>> assert binary_masks.shape[0] == batch_size
    >>> embeddings = get_embedding(waveforms, masks=binary_masks)
    Nr   r   ÚtokenÚ	cache_dirc                 óð  •— t         st        d|› d�«      ‚t        ‰| �  «        d|v r3|j	                  d«      d   | _        |j	                  d«      d   | _        n|| _        d | _        |xs t        j                  d«      | _        || _	        || _
        t        j                  | j
                  | j                  › d�d| j                  i| j                  | j                  | j                  ¬	«      | _        y )
Nz('speechbrain' must be installed to use 'zP' embeddings. Visit https://speechbrain.github.io for installation instructions.ú@r   r<   r   ú/speechbrainr   ©ÚsourceÚsavedirÚrun_optsr…   Úhuggingface_cache_dirÚrevision)ÚSPEECHBRAIN_IS_AVAILABLEr   r   r   Úsplitr   r�   r   r   r…   r†   ÚSpeechBrain_EncoderClassifierÚfrom_hparamsÚclassifier_©r$   r   r   r…   r†   r%   s        €r&   r   z.SpeechBrainPretrainedSpeakerEmbedding.__init__ç   sã   ø€ õ (ÜØ:¸9¸+ð FUð Uóð ô
 	‰ÑÔØ�)ÑØ&Ÿ_™_¨SÓ1°!Ñ4ˆDŒNØ%ŸO™O¨CÓ0°Ñ3ˆD�Mà&ˆDŒNØ ˆDŒMØÒ3¤§¡¨UÓ 3ˆŒØˆŒ
Ø"ˆŒä8×EÑEØ—>‘>Ø—~‘~Ð& lÐ3Ø §¡Ð,Ø—*‘*Ø"&§.¡.Ø—]‘]ô
ˆÕr'   c                 ó:  — t        |t        j                  «      s"t        dt	        |«      j
                  › d�«      ‚t        j                  | j                  | j                  › d�d|i| j                  | j                  | j                  ¬«      | _        || _        | S )Nr*   r+   r‰   r   rŠ   )r-   r   r   r.   r/   r0   r’   r“   r   r†   r…   r�   r”   r1   s     r&   r#   z(SpeechBrainPretrainedSpeakerEmbedding.to  s‹   € Ü˜&¤%§,¡,Ô/ÜØGÌÈVË×H]ÑH]ÐG^Ð^_Ð`óð ô 9×EÑEØ—>‘>Ø—~‘~Ð& lÐ3Ø Ð'Ø—*‘*Ø"&§.¡.Ø—]‘]ô
ˆÔð ˆŒØˆr'   r3   c                 óB   — | j                   j                  j                  S rz   )r”   Úaudio_normalizerr5   r:   s    r&   r5   z1SpeechBrainPretrainedSpeakerEmbedding.sample_rate  s   € à×Ñ×0Ñ0×<Ñ<Ð<r'   c                 ó´   — t        j                  dd«      j                  | j                  «      }| j                  j                  |«      j                  �^ }}|S )Nr<   r6   )r   r@   r#   r   r”   Úencode_batchrB   )r$   Údummy_waveformsrC   rE   s       r&   rE   z/SpeechBrainPretrainedSpeakerEmbedding.dimension  sG   € äŸ*™* Q¨Ó.×1Ñ1°$·+±+Ó>ˆØ×(Ñ(×5Ñ5°oÓF×LÑL‰ˆˆIØÐr'   c                  ó   — yrG   rI   r:   s    r&   rJ   z,SpeechBrainPretrainedSpeakerEmbedding.metric#  rK   r'   c                 óˆ  — t        j                  «       5  dt        d| j                  z  «      }}||z   dz  }|dz   |k  r\	 | j                  j                  t        j                  d|«      j                  | j                  «      «      }|}||z   dz  }|dz   |k  rŒ\d d d «       |S # t        $ r |}Y Œ(w xY w# 1 sw Y   S xY w©NrM   rN   r<   )
r   Úinference_moderO   r5   r”   rš   Úrandnr#   r   rP   ©r$   rQ   rR   rS   rC   s        r&   rT   z5SpeechBrainPretrainedSpeakerEmbedding.min_num_samples'  sÒ   € ä×!Ñ!Ó#ñ 	.Øœe C¨$×*:Ñ*:Ñ$:Ó;�5ˆEØ˜e‘m¨Ñ)ˆFØ˜!‘)˜eÒ#ð#Ø×(Ñ(×5Ñ5ÜŸ™ A vÓ.×1Ñ1°$·+±+Ó>ó�Að #�Eð   %™-¨AÑ-�ð ˜!‘)˜eÓ#÷	.ð ˆøô $ò #Ø"’Eð#ú÷	.ð ˆús0   •+B7ÁA
B&ÂB7Â&B4Â1B7Â3B4Â4B7Â7CrU   rV   c                 óÜ  — |j                   \  }}}|dk(  sJ ‚|j                  d¬«      }|€8|j                  d¬«      }|j                   d   t        j                  |«      z  }n |j                   \  }}	||k(  sJ ‚t	        j
                  |j                  d¬«      |d¬«      j                  d¬«      }
|
dkD  }
t        t        ||
«      D ��cg c]  \  }}||   j                  «       ‘Œ c}}d¬«      }|
j                  d¬«      }|j                  «       }|| j                  k  r2t        j                  t        j                  || j                   f«      z  S || j                  k  }||z  }d||<   | j"                  j%                  ||¬	«      j                  d¬«      j'                  «       j)                  «       }t        j                  ||j'                  «       j)                  «       <   |S c c}}w )
rX   r<   rY   r[   r\   rN   Tr_   g      ð?)rr   )rB   ra   r   rb   rc   rd   re   r
   rf   Ú
contiguousrg   rh   rT   ri   rj   rk   rE   r”   rš   r   rl   rm   s                   r&   ry   z.SpeechBrainPretrainedSpeakerEmbedding.__call__9  sØ  € ð" 1:·±Ñ-ˆ
�L +Ø˜qÒ Ð Ð à×%Ñ%¨!Ð%Ó,ˆ	àˆ=Ø×'Ñ'¨AÐ'Ó.ˆGØ—}‘} QÑ'¬%¯*©*°ZÓ*@Ñ@‰Hð #(§+¡+ÑÐ˜aØÐ!1Ò1Ð1Ð1ô —]‘]Ø—‘ A�Ó&¨[¸yôç‰g˜!ˆg‹nð ð ˜c‘\ˆFä"ô ,/¨y¸&Ó+A÷á'˜ %ð ˜U‘O×.Ñ.Õ0óð !ôˆGð —z‘z a�zÓ(ˆHà—,‘,“.ˆð �T×)Ñ)Ò)Ü—6‘6œBŸH™H j°$·.±.Ð%AÓBÑBÐBà˜t×3Ñ3Ñ3ˆ	Ø˜gÑ%ˆØ!ˆ�Ñð ×Ñ×)Ñ)¨'¸HÐ)ÓEß‰W˜ˆW‹^ß‰S‹Uß‰U‹Wð	 	ô /1¯f©fˆ
�9—=‘=“?×(Ñ(Ó*Ñ+àÐùó9s   ÃG(
)z!speechbrain/spkrec-ecapa-voxcelebNNNrz   )r0   r{   r|   Ú__doc__r   r   r   r   r   r   r   r#   r   r}   r5   rE   r~   rJ   rT   r   ri   r€   ry   r�   r‚   s   @r&   r„   r„   Ê   s  ø„ ñð< >Ø)-Ø#'Ø-1ñ
àð
ð ˜Ÿ™Ñ&ð
ð �T˜4�ZÑ ð	
ð
 ˜˜t TÐ)Ñ*õ
ðB˜Ÿ™ó ð" ð=˜Sò =ó ð=ð ð˜3ò ó ðð
 ð˜ò ó ðð ð ò ó ðð$ HLñFØŸ™ðFØ.6°u·|±|Ñ.DðFà	�‰÷Fr'   r„   c                   ó¨  ‡ — e Zd ZdZ	 	 	 	 ddedeej                     deedf   dee	edf   fˆ fd„Z
dej                  fd„Zed	efd
„«       Zed	efd„«       Zed	efd„«       Zed	efd„«       Zed	efd„«       Z	 	 	 	 ddej(                  dedededed	ej(                  fd„Z	 ddej(                  deej(                     d	ej0                  fd„Zˆ xZS )Ú'ONNXWeSpeakerPretrainedSpeakerEmbeddingaÏ  Pretrained WeSpeaker speaker embedding

    Parameters
    ----------
    embedding : str
        Path to WeSpeaker pretrained speaker embedding
    device : torch.device, optional
        Device
    token : str or bool, optional
        Huggingface token to be used for downloading from Huggingface hub.
    cache_dir: Path or str, optional
        Path to the folder where files downloaded from Huggingface hub are stored.

    Usage
    -----
    >>> get_embedding = ONNXWeSpeakerPretrainedSpeakerEmbedding("hbredin/wespeaker-voxceleb-resnet34-LM")
    >>> assert waveforms.ndim == 3
    >>> batch_size, num_channels, num_samples = waveforms.shape
    >>> assert num_channels == 1
    >>> embeddings = get_embedding(waveforms)
    >>> assert embeddings.ndim == 2
    >>> assert embeddings.shape[0] == batch_size

    >>> assert binary_masks.ndim == 1
    >>> assert binary_masks.shape[0] == batch_size
    >>> embeddings = get_embedding(waveforms, masks=binary_masks)
    Nr   r   r…   r†   c                 ó4  •— t         st        d|› d�«      ‚t        ‰| �  «        t	        |«      j                  «       s	 t        |d||¬«      }|| _	        | j                  |xs t        j                  d«      «       y # t        $ r t        d|› d�«      ‚w xY w)Nz('onnxruntime' must be installed to use 'z' embeddings.zspeaker-embedding.onnx)Úrepo_idÚfilenamer…   r†   zCould not find 'z&' on huggingface.co nor on local disk.r   )ÚONNX_IS_AVAILABLEr   r   r   r   Úexistsr   r	   Ú
ValueErrorr   r#   r   r   r•   s        €r&   r   z0ONNXWeSpeakerPretrainedSpeakerEmbedding.__init__Ÿ  s§   ø€ õ !ÜØ:¸9¸+À]ÐSóð ô 	‰ÑÔä�I‹×%Ñ%Ô'ð
Ü+Ø%Ø5ØØ'ô	�	ð #ˆŒà�‰�Ò-œ%Ÿ,™, uÓ-Õ.øô +ò Ü Ø& y kÐ1WÐXóð ðús   ¿A> Á>Bc                 óè  — t        |t        j                  «      s"t        dt	        |«      j
                  › d�«      ‚|j                  dk(  rdg}nR|j                  dk(  rdddifg}n;t        j                  d	|j                  › d
�«       t        j                  d«      }dg}t        j                  «       }d|_
        d|_        t        j                  | j                  ||¬«      | _        || _        | S )Nr*   r+   r   ÚCPUExecutionProviderÚcudaÚCUDAExecutionProviderÚcudnn_conv_algo_searchÚDEFAULTzUnsupported device type: z, falling back to CPUr<   )Úsess_optionsÚ	providers)r-   r   r   r.   r/   r0   ÚwarningsÚwarnÚortÚSessionOptionsÚinter_op_num_threadsÚintra_op_num_threadsÚInferenceSessionr   Úsession_)r$   r   r´   r³   s       r&   r#   z*ONNXWeSpeakerPretrainedSpeakerEmbedding.to¿  sò   € Ü˜&¤%§,¡,Ô/ÜØGÌÈVË×H]ÑH]ÐG^Ð^_Ð`óð ð �;‰;˜%ÒØ/Ð0‰IØ�[‰[˜FÒ"ð ,à0°)ððð‰Iô �M‰MØ+¨F¯K©K¨=Ð8MÐNôô —\‘\ %Ó(ˆFØ/Ð0ˆIä×)Ñ)Ó+ˆØ,-ˆÔ)Ø,-ˆÔ)Ü×,Ñ,Ø�N‰N¨Àô
ˆŒð ˆŒØˆr'   r3   c                  ó   — y)Nr6   rI   r:   s    r&   r5   z3ONNXWeSpeakerPretrainedSpeakerEmbedding.sample_rateá  s   € àr'   c                 óÖ   — t        j                  ddd«      }| j                  |«      }| j                  j	                  dgd|j                  «       i¬«      d   }|j                  \  }}|S )Nr<   r6   ÚembsÚfeats©Úoutput_namesÚ
input_feedr   )r   r@   Úcompute_fbankr¼   Úrunrl   rB   )r$   r›   ÚfeaturesrD   rC   rE   s         r&   rE   z1ONNXWeSpeakerPretrainedSpeakerEmbedding.dimensionå  so   € äŸ*™* Q¨¨5Ó1ˆØ×%Ñ% oÓ6ˆØ—]‘]×&Ñ&Ø ˜¨w¸¿¹Ó8HÐ.Ið 'ó 
à
ñˆ
ð "×'Ñ'‰ˆˆ9ØÐr'   c                  ó   — yrG   rI   r:   s    r&   rJ   z.ONNXWeSpeakerPretrainedSpeakerEmbedding.metricï  rK   r'   c                 ó¸  — dt        d| j                  z  «      }}||z   dz  }|dz   |k  r–	 | j                  t        j                  dd|«      «      }| j                  j                  dgd|j                  «       i¬«      d   }t        j                  t        j                  |«      «      r|}n|}||z   dz  }|dz   |k  rŒ–|S # t
        $ r |}||z   dz  }Y Œµw xY w)NrM   rN   r<   r¿   rÀ   rÁ   r   )rO   r5   rÄ   r   r    ÚAssertionErrorr¼   rÅ   rl   ri   ÚanyÚisnan)r$   rQ   rR   rS   rÆ   rD   s         r&   rT   z7ONNXWeSpeakerPretrainedSpeakerEmbedding.min_num_samplesó  sø   € àœ%  d×&6Ñ&6Ñ 6Ó7ˆuˆØ˜%‘- AÑ%ˆØ�a‰i˜%ÒðØ×-Ñ-¬e¯k©k¸!¸QÀÓ.GÓH�ð Ÿ™×*Ñ*Ø$˜X°7¸H¿N¹NÓ<LÐ2Mð +ó àñˆJô �v‰v”b—h‘h˜zÓ*Ô+Ø‘à�Ø˜e‘m¨Ñ)ˆFð# �a‰i˜%Óð& ˆøô "ò Ø�Ø %™-¨AÑ-�Ùðús   ¬&C ÃCÃCc                 ó|   — | j                  t        j                  dd| j                  «      «      j                  d   S )Nr<   )rÄ   r   r    rT   rB   r:   s    r&   Úmin_num_framesz6ONNXWeSpeakerPretrainedSpeakerEmbedding.min_num_frames  s2   € à×!Ñ!¤%§+¡+¨a°°D×4HÑ4HÓ"IÓJ×PÑPÐQRÑSÐSr'   rU   Únum_mel_binsÚframe_lengthÚframe_shiftÚditherc                 óÜ   — |dz  }t        j                  |D �cg c])  }t        j                  |||||| j                  dd¬«      ‘Œ+ c}«      }|t        j
                  |dd¬«      z
  S c c}w )af  Extract fbank features

        Parameters
        ----------
        waveforms : (batch_size, num_channels, num_samples)

        Returns
        -------
        fbank : (batch_size, num_frames, num_mel_bins)

        Source: https://github.com/wenet-e2e/wespeaker/blob/45941e7cba2c3ea99e232d02bedf617fc71b0dad/wespeaker/bin/infer_onnx.py#L30C1-L50
        i €  ÚhammingF)rÎ   rÏ   rÐ   rÑ   Úsample_frequencyÚwindow_typeÚ
use_energyr<   T)rZ   Úkeepdim)r   ÚstackÚkaldiÚfbankr5   Úmean)r$   rU   rÎ   rÏ   rÐ   rÑ   ru   rÆ   s           r&   rÄ   z5ONNXWeSpeakerPretrainedSpeakerEmbedding.compute_fbank  s|   € ð*  Ñ)ˆ	Ü—;‘;ð !*öð ô —‘ØØ!-Ø!-Ø +Ø!Ø%)×%5Ñ%5Ø )Ø$ö	òó
ˆð  œ%Ÿ*™* X°1¸dÔCÑCÐCùòs   ™.A)rV   c                 ó  — |j                   \  }}}|dk(  sJ ‚| j                  |j                  | j                  «      «      }|j                   \  }}}|€5| j                  j                  dgd|j                  d¬«      i¬«      d   }	|	S |j                   \  }
}||
k(  sJ ‚t        j                  |j                  d¬	«      |d
¬«      j                  d¬	«      }|dkD  }t        j                  t        j                  || j                  f«      z  }	t        t!        ||«      «      D ]f  \  }\  }}||   }|j                   d   | j"                  k  rŒ+| j                  j                  dgd|j                  d¬«      d   i¬«      d   d   |	|<   Œh |	S )rX   r<   Nr¿   rÀ   T)ÚforcerÁ   r   rY   r[   r\   rN   )rB   rÄ   r#   r   r¼   rÅ   rl   rc   rd   re   ra   ri   rj   rk   rE   Ú	enumeraterf   rÍ   )r$   rU   rV   rn   ro   rp   rÆ   rC   Ú
num_framesrD   rs   rt   ÚfÚfeaturerv   Úmasked_features                   r&   ry   z0ONNXWeSpeakerPretrainedSpeakerEmbedding.__call__8  s¯  € ð" 1:·±Ñ-ˆ
�L +Ø˜qÒ Ð Ð à×%Ñ% i§l¡l°4·;±;Ó&?Ó@ˆØ#Ÿ>™>Ñˆˆ:�qàˆ=ØŸ™×*Ñ*Ø$˜X°7¸H¿N¹NÐQU¸NÓ<VÐ2Wð +ó àñˆJð Ðà#Ÿk™kÑÐ˜!ØÐ-Ò-Ð-Ð-ä—‘Ø�O‰O ˆOÓ"¨¸)ô
ç
‰'�aˆ'‹.ð 	ð ˜#‘ˆä—V‘VœbŸh™h¨
°D·N±NÐ'CÓDÑDˆ
ä#,¬S°¸6Ó-BÓ#Cò 	ÑˆAÑ�˜Ø$ U™^ˆNØ×#Ñ# AÑ&¨×)<Ñ)<Ò<Øà ŸM™M×-Ñ-Ø$˜XØ# ^×%9Ñ%9ÀÐ%9Ó%EÀdÑ%KÐLð .ó ð ñð ñˆJ�qŠMð	ð Ðr'   )z&hbredin/wespeaker-voxceleb-resnet34-LMNNN)éP   é   é
   ç        rz   )r0   r{   r|   r¤   r   r   r   r   r   r   r   r#   r   r}   r5   rE   r~   rJ   rT   rÍ   r   ÚfloatrÄ   ri   r€   ry   r�   r‚   s   @r&   r¦   r¦   ‚  sŽ  ø„ ñð< CØ)-Ø#'Ø-1ñ/àð/ð ˜Ÿ™Ñ&ð/ð �T˜4�ZÑ ð	/ð
 ˜˜t TÐ)Ñ*õ/ð@ ˜Ÿ™ó  ðD ð˜Sò ó ðð ð˜3ò ó ðð ð˜ò ó ðð ð ò ó ðð0 ðT ò Tó ðTð ØØØñ&Dà—<‘<ð&Dð ð&Dð ð	&Dð
 ð&Dð ð&Dð 
�‰ó&DðR HLñ3ØŸ™ð3Ø.6°u·|±|Ñ.Dð3à	�‰÷3r'   r¦   c                   ó@  ‡ — e Zd ZdZ	 	 	 	 ddedeej                     dee	df   dee
e	df   fˆ fd„Zdej                  fd„Zed	efd
„«       Zed	efd„«       Zed	efd„«       Zed	efd„«       Z	 ddej(                  deej(                     d	ej,                  fd„Zˆ xZS )Ú'PyannoteAudioPretrainedSpeakerEmbeddinga›  Pretrained pyannote.audio speaker embedding

    Parameters
    ----------
    embedding : PipelineModel
        pyannote.audio model
    device : torch.device, optional
        Device
    token : str or bool, optional
        Huggingface token to be used for downloading from Huggingface hub.
    cache_dir: Path or str, optional
        Path to the folder where files downloaded from Huggingface hub are stored.

    Usage
    -----
    >>> get_embedding = PyannoteAudioPretrainedSpeakerEmbedding("pyannote/embedding")
    >>> assert waveforms.ndim == 3
    >>> batch_size, num_channels, num_samples = waveforms.shape
    >>> assert num_channels == 1
    >>> embeddings = get_embedding(waveforms)
    >>> assert embeddings.ndim == 2
    >>> assert embeddings.shape[0] == batch_size

    >>> assert masks.ndim == 1
    >>> assert masks.shape[0] == batch_size
    >>> embeddings = get_embedding(waveforms, masks=masks)
    Nr   r   r…   r†   c                 ó$  •— t         ‰| �  «        || _        |xs t        j                  d«      | _        t        | j                  ||¬«      | _        | j                  j                  «        | j                  j                  | j                  «       y )Nr   ©r…   r†   )	r   r   r   r   r   r   r!   Úevalr#   r•   s        €r&   r   z0PyannoteAudioPretrainedSpeakerEmbedding.__init__‹  sd   ø€ ô 	‰ÑÔØ"ˆŒØÒ3¤§¡¨UÓ 3ˆŒä& t§~¡~¸UÈiÔXˆŒØ�‰×ÑÔØ�‰�‰�t—{‘{Õ#r'   c                 óÂ   — t        |t        j                  «      s"t        dt	        |«      j
                  › d�«      ‚| j                  j                  |«       || _        | S r)   r,   r1   s     r&   r#   z*PyannoteAudioPretrainedSpeakerEmbedding.toš  r2   r'   r3   c                 óB   — | j                   j                  j                  S rz   )r!   Úaudior5   r:   s    r&   r5   z3PyannoteAudioPretrainedSpeakerEmbedding.sample_rate¤  s   € à�{‰{× Ñ ×,Ñ,Ð,r'   c                 ó.   — | j                   j                  S rz   )r!   rE   r:   s    r&   rE   z1PyannoteAudioPretrainedSpeakerEmbedding.dimension¨  s   € à�{‰{×$Ñ$Ð$r'   c                  ó   — yrG   rI   r:   s    r&   rJ   z.PyannoteAudioPretrainedSpeakerEmbedding.metric¬  rK   r'   c                 óv  — t        j                  «       5  dt        d| j                  z  «      }}||z   dz  }|dz   |k  rS	 | j	                  t        j
                  dd|«      j                  | j                  «      «      }|}||z   dz  }|dz   |k  rŒSd d d «       |S # t        $ r |}Y Œ(w xY w# 1 sw Y   S xY wrž   )	r   rŸ   rO   r5   r!   r    r#   r   Ú	Exceptionr¡   s        r&   rT   z7PyannoteAudioPretrainedSpeakerEmbedding.min_num_samples°  sÇ   € ä×!Ñ!Ó#ñ 
	.Øœe C¨$×*:Ñ*:Ñ$:Ó;�5ˆEØ˜e‘m¨Ñ)ˆFØ˜!‘)˜eÒ#ð#ØŸ™¤E§K¡K°°1°fÓ$=×$@Ñ$@ÀÇÁÓ$MÓN�AØ"�Eð   %™-¨AÑ-�ð ˜!‘)˜eÓ#÷
	.ð ˆøô !ò #Ø"’Eð#ú÷
	.ð ˆús0   •+B.ÁABÂB.ÂB+Â(B.Â*B+Â+B.Â.B8rU   rV   c                 óð  — t        j                  «       5  |€+| j                  |j                  | j                  «      «      }nwt        j                  «       5  t        j                  d«       | j                  |j                  | j                  «      |j                  | j                  «      ¬«      }d d d «       d d d «       j                  «       j                  «       S # 1 sw Y   Œ/xY w# 1 sw Y   Œ3xY w)NÚignore©Úweights)
r   rŸ   r!   r#   r   rµ   Úcatch_warningsÚsimplefilterr   rl   )r$   rU   rV   rD   s       r&   ry   z0PyannoteAudioPretrainedSpeakerEmbedding.__call__À  s¾   € ô ×!Ñ!Ó#ñ 	Øˆ}Ø!Ÿ[™[¨¯©°d·k±kÓ)BÓC‘
ä×,Ñ,Ó.ñ Ü×)Ñ)¨(Ô3Ø!%§¡Ø!Ÿ™ T§[¡[Ó1¸5¿8¹8ÀDÇKÁKÓ;Pð "-ó "�J÷÷		ð �~‰~Ó×%Ñ%Ó'Ð'÷ð ú÷		ð 	ús%   •AC,ÁAC Â2C,Ã C)	Ã%C,Ã,C5©úpyannote/embeddingNNNrz   )r0   r{   r|   r¤   r   r   r   r   r   r   r   r   r#   r   r}   r5   rE   r~   rJ   rT   r   ri   r€   ry   r�   r‚   s   @r&   ré   ré   n  s  ø„ ñð< $8Ø)-Ø#'Ø-1ñ$à ð$ð ˜Ÿ™Ñ&ð$ð �T˜4�ZÑ ð	$ð
 ˜˜t TÐ)Ñ*õ$ð˜Ÿ™ó ð ð-˜Sò -ó ð-ð ð%˜3ò %ó ð%ð ð˜ò ó ðð ð ò ó ðð  HLñ(ØŸ™ð(Ø.6°u·|±|Ñ.Dð(à	�‰÷(r'   ré   r   r   r…   r†   c                 ó4  — t        | t        «      rd| v rt        | |||¬«      S t        | t        «      rd| v rt        | |||¬«      S t        | t        «      rd| v rt	        | |¬«      S t        | t        «      rd| v rt        | |||¬«      S t        | |||¬«      S )a~  Pretrained speaker embedding

    Parameters
    ----------
    embedding : Text
        Can be a SpeechBrain (e.g. "speechbrain/spkrec-ecapa-voxceleb")
        or a pyannote.audio model.
    device : torch.device, optional
        Device
    token : str or bool, optional
        Huggingface token to be used for downloading from Huggingface hub.
    cache_dir: Path or str, optional
        Path to the folder where files downloaded from Huggingface hub are stored.

    Usage
    -----
    >>> get_embedding = PretrainedSpeakerEmbedding("pyannote/embedding")
    >>> get_embedding = PretrainedSpeakerEmbedding("speechbrain/spkrec-ecapa-voxceleb")
    >>> get_embedding = PretrainedSpeakerEmbedding("nvidia/speakerverification_en_titanet_large")
    >>> assert waveforms.ndim == 3
    >>> batch_size, num_channels, num_samples = waveforms.shape
    >>> assert num_channels == 1
    >>> embeddings = get_embedding(waveforms)
    >>> assert embeddings.ndim == 2
    >>> assert embeddings.shape[0] == batch_size

    >>> assert masks.ndim == 1
    >>> assert masks.shape[0] == batch_size
    >>> embeddings = get_embedding(waveforms, masks=masks)
    Úpyannote)r   r…   r†   ÚspeechbrainÚnvidia)r   Ú	wespeaker)r-   r~   ré   r„   r   r¦   )r   r   r…   r†   s       r&   ÚPretrainedSpeakerEmbeddingr  Ï  s´   € ôJ �)œSÔ! j°IÑ&=Ü6Ø˜f¨E¸Yô
ð 	
ô 
�IœsÔ	#¨¸Ñ(BÜ4Ø˜f¨E¸Yô
ð 	
ô 
�IœsÔ	#¨°IÑ(=Ü-¨iÀÔGÐGä	�IœsÔ	#¨°yÑ(@Ü6Ø˜f¨E¸Yô
ð 	
ô 7Ø˜f¨E¸Yô
ð 	
r'   c                   ó~   ‡ — e Zd ZdZ	 	 	 	 ddedee   deedf   deeedf   fˆ fd„Z	de
d	ej                  fd
„Zˆ xZS )ÚSpeakerEmbeddinga‹  Speaker embedding pipeline

    This pipeline assumes that each file contains exactly one speaker
    and extracts one single embedding from the whole file.

    Parameters
    ----------
    embedding : Model, str, or dict, optional
        Pretrained embedding model. Defaults to "pyannote/embedding".
        See pyannote.audio.pipelines.utils.get_model for supported format.
    segmentation : Model, str, or dict, optional
        Pretrained segmentation (or voice activity detection) model.
        See pyannote.audio.pipelines.utils.get_model for supported format.
        Defaults to no voice activity detection.
    token : str or bool, optional
        Huggingface token to be used for downloading from Huggingface hub.
    cache_dir: Path or str, optional
        Path to the folder where files downloaded from Huggingface hub are stored.

    Usage
    -----
    >>> from pyannote.audio.pipelines import SpeakerEmbedding
    >>> pipeline = SpeakerEmbedding()
    >>> emb1 = pipeline("speaker1.wav")
    >>> emb2 = pipeline("speaker2.wav")
    >>> from scipy.spatial.distance import cdist
    >>> distance = cdist(emb1, emb2, metric="cosine")[0,0]
    Nr   Úsegmentationr…   r†   c                 óÔ   •— t         ‰| �  «        || _        || _        t	        |||¬«      | _        | j                  �,t	        | j                  ||¬«      }t        |d„ ¬«      | _        y y )Nrë   c                 ó2   — t        j                  | dd¬«      S )NéÿÿÿÿT)ÚaxisÚkeepdims)ri   rh   )Úscoress    r&   ú<lambda>z+SpeakerEmbedding.__init__.<locals>.<lambda>A  s   € ´B·F±FØ ¨dô5€ r'   )Úpre_aggregation_hook)r   r   r   r  r   Úembedding_model_r   Ú_segmentation)r$   r   r  r…   r†   Úsegmentation_modelr%   s         €r&   r   zSpeakerEmbedding.__init__+  su   ø€ ô 	‰ÑÔà"ˆŒØ(ˆÔä'0Ø˜U¨iô(
ˆÔð ×ÑÐ(Ü(1Ø×!Ñ!¨¸)ô)Ðô "+Ø"ñ&ô"ˆDÕð	 )r'   Úfiler3   c                 ó"  — | j                   j                  }| j                   j                  |«      d   d    j                  |«      }| j                  €d }nb| j                  |«      j                  }d|t        j                  |«      <   t        j                  |dz  «      d d d …df   j                  |«      }t        j                  «       5  | j                  ||¬«      j                  «       j                  «       cd d d «       S # 1 sw Y   y xY w)Nr   ræ   é   rö   )r  r   rï   r#   r  r  Údatari   rË   r   Ú
from_numpyÚno_gradr   rl   )r$   r  r   ru   r÷   s        r&   ÚapplyzSpeakerEmbedding.applyF  sï   € Ø×&Ñ&×-Ñ-ˆð ×(Ñ(×.Ñ.¨tÓ4°QÑ7¸Ñ=×@Ñ@ÀÓHˆà×ÑÐ$Ø‰Gð ×(Ñ(¨Ó.×3Ñ3ˆGà),ˆG”B—H‘H˜WÓ%Ñ&Ü×&Ñ& w°¡zÓ2°4º¸A°:Ñ>×AÑAÀ&ÓIˆGô �]‰]‹_ñ 	RØ×(Ñ(¨¸7Ð(ÓC×GÑGÓI×OÑOÓQ÷	R÷ 	Rò 	Rús   Ã/DÄDrú   )r0   r{   r|   r¤   r   r   r   r   r   r   r   ri   r€   r  r�   r‚   s   @r&   r  r    su   ø„ ñð> $8Ø04Ø#'Ø-1ñà ðð ˜}Ñ-ðð �T˜4�ZÑ ð	ð
 ˜˜t TÐ)Ñ*õð6R˜)ð R¨¯
©
÷ Rr'   r  ÚprotocolÚsubsetr  c                 óf  — dd l }ddlm}m} ddlm} ddlm} ddlm}	 t        ||¬«      }
 || d |«       i¬«      } g g }}t        «       } t        | |› d	�«      «       }t         |	|«      «      D ]m  \  }}|d
   d   }||vr |
|«      ||<   |d   d   }||vr |
|«      ||<   |j                   |||   ||   d¬«      d   d   «       |j                  |d   «       Œo  ||t        j                  |«      d¬«      \  }}}} |j                   | j"                  › d|› d|› d|› dd|z  d›d�
«       y )Nr   )Ú
FileFinderÚget_protocol)Ú	det_curve)Úcdist)Útqdm)r   r  rï   )ÚpreprocessorsÚ_trialÚfile1Úfile2rH   )rJ   Ú	referenceT)Ú	distancesz | z	 | EER = éd   z.3fú%)ÚtyperÚpyannote.databaser  r  Ú&pyannote.metrics.binary_classificationr  Úscipy.spatial.distancer  r  r  ÚdictÚgetattrrÞ   Úappendri   ÚarrayÚechoÚname)r  r  r   r  r'  r  r  r  r  r  ÚpipelineÚy_trueÚy_predÚembÚtrialsÚtÚtrialÚaudio1Úaudio2rC   Úeers                        r&   Úmainr;  Z  sT  € ó ß:Ý@Ý,Ýä¨)À,ÔO€Há˜H°W¹j»lÐ4KÔL€Hà˜ˆF€Fä
‹&€Cà1ŒW�X & ¨Ð0Ó1Ó3€Fä™d 6›lÓ+ò 
*‰ˆˆ5Ø�w‘ Ñ(ˆØ˜ÑÙ" 6Ó*ˆC�‰Kà�w‘ Ñ(ˆØ˜ÑÙ" 6Ó*ˆC�‰Kà�‰‘e˜C ™K¨¨V©¸XÔFÀqÑIÈ!ÑLÔMØ�‰�e˜KÑ(Õ)ð
*ñ ˜V¤R§X¡X¨fÓ%5ÀÔF�L€A€qˆ!ˆSØ€E‡J�JØ�=‰=ˆ/˜˜V˜H C¨	 {°#°l°^À9ÈSÐSVÉYÐWZÈOÐ[\Ð]õr'   Ú__main__)NNN)z&VoxCeleb.SpeakerVerification.VoxCeleb1Útestrû   N)<rµ   Ú	functoolsr   Úpathlibr   Útypingr   r   r   rl   ri   r   Útorch.nn.functionalÚnnÚ
functionalrc   Útorchaudio.compliance.kaldiÚ
compliancerÙ   Úhuggingface_hubr   Úhuggingface_hub.utilsr	   Útorch.nn.utils.rnnr
   Úpyannote.audior   r   r   Úpyannote.audio.core.inferencer   Úpyannote.audio.core.ior   Úpyannote.audio.pipelines.utilsr   r   Úspeechbrain.inferencer   r’   r�   r   Únemo.collections.asr.modelsr   r   r   Úonnxruntimer·   rª   r   r„   r¦   ré   r   r  r  r~   r;  r0   r'  rÅ   rI   r'   r&   ú<module>rP     s­  ðó. Ý %Ý ß (Ñ (ã Û ß Ð ß +Ð +Ý +Ý 9Ý +ç 5Ñ 5Ý 7Ý ,ß Cð%ÝXà#Ððõð ÐðÛàÐô
F ]ô FôRu¨Mô uôpi¨mô iôX^(¨mô ^(ðF &*Ø#Ø)-ñ	;
Øð;
à�U—\‘\Ñ"ð;
ð ��t�Ñð;
ð �T˜4 Ð%Ñ&ó	;
ô|JR�xô JRð\ =ØØ)Ø"&ñ	%Øð%àð%ð ð%ð ˜3‘-ó	%ðP ˆzÒÛà€E‡I�Iˆd…Oð øðk ò %Ø$Òð%ûð ò ØÒðûð ò ØÒðús6   Á&D Á/D Á8D( ÄDÄDÄD%Ä$D%Ä(D2Ä1D2