Ë
    ÿÍ:jüm  ã                   óL  — d Z ddlmZ ddlZddlmZ ddlmZ ddl	m
Z
 ddl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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  ddl!m"Z"  G d„ de«      Z# G d„ de#«      Z$ G d„ de#«      Z% G d„ de#«      Z& G d„ de#«      Z' G d„ de«      Z(y)zClustering pipelinesé    )ÚEnumN)Ú	rearrange)Ú	AudioFile)ÚPLDA)Úoracle_segmentation)Ú	permutate)Úcluster_vbx)ÚSlidingWindowÚSlidingWindowFeature)ÚPipeline)ÚCategoricalÚIntegerÚUniform)ÚfclusterÚlinkage)Úlinear_sum_assignment)Úcdist)ÚKMeansc                   óò  ‡ — e Zd Z	 	 ddedefˆ fd„Z	 	 	 ddededz  dedz  dedz  fd	„Z	 	 dd
ej                  de
dz  dedeej                  ej                  ej                  f   fd„Zdej                  dej                  fd„Z	 dd
ej                  dej                  dej                  dej                  def
d„Z	 	 	 	 dd
ej                  de
dz  dedz  dedz  dedz  dej                  fd„Zˆ xZS )ÚBaseClusteringÚmetricÚconstrained_assignmentc                 ó>   •— t         ‰| �  «        || _        || _        y )N)ÚsuperÚ__init__r   r   ©Úselfr   r   Ú	__class__s      €úx/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/pyannote/audio/pipelines/clustering.pyr   zBaseClustering.__init__-   s   ø€ ô
 	‰ÑÔØˆŒØ&<ˆÕ#ó    NÚnum_embeddingsÚnum_clustersÚmin_clustersÚmax_clustersc                 óÌ   — |xs |xs d}t        dt        ||«      «      }|xs |xs |}t        dt        ||«      «      }||kD  rt        d|d›d|d›d�«      ‚||k(  r|}|||fS )Né   zQmin_clusters must be smaller than (or equal to) max_clusters (here: min_clusters=Úgz and max_clusters=z).)ÚmaxÚminÚ
ValueError)r   r!   r"   r#   r$   s        r   Úset_num_clusterszBaseClustering.set_num_clusters6   sš   € ð $Ò8 |Ò8°qˆÜ˜1œc .°,Ó?Ó@ˆØ#ÒE |ÒE°~ˆÜ˜1œc .°,Ó?Ó@ˆà˜,Ò&Üð'Ø'3°AÐ&6Ð6HÈÐVWÐHXÐXZð\óð ð
 ˜<Ò'Ø'ˆLà˜\¨<Ð7Ð7r    Ú
embeddingsÚsegmentationsÚmin_active_ratioÚreturnc                 óx  — |j                   j                  \  }}}t        j                  |j                   dd¬«      dk(  }t        j                  |j                   |z  d¬«      }|||z  k\  }t        j                  t        j
                  |«      d¬«       }	t        j                  ||	z  «      \  }
}||
|f   |
|fS )a   Filter embeddings before clustering

        Embeddings that are removed:
        * NaN embeddings
        * embeddings speaking less than `min_active_ratio` times the chunk duration

        Parameters
        ----------
        embeddings : (num_chunks, num_speakers, dimension) array
            Sequence of embeddings.
        segmentations : (num_chunks, num_frames, num_speakers) array
            Binary segmentations.
        min_active_ratio : float, optional
            Minimum active ratio for a speaker to be considered active
            during clustering.

        Returns
        -------
        filtered_embeddings : (num_embeddings, dimension) array
        chunk_idx : (num_embeddings, ) array
        speaker_idx : (num_embeddings, ) array
        é   T©ÚaxisÚkeepdimsr&   ©r3   )ÚdataÚshapeÚnpÚsumÚanyÚisnanÚwhere)r   r,   r-   r.   Ú_Ú
num_framesÚsingle_active_maskÚnum_clean_framesÚactiveÚvalidÚ	chunk_idxÚspeaker_idxs               r   Úfilter_embeddingsz BaseClustering.filter_embeddingsM   s½   € ð: )×-Ñ-×3Ñ3Ñˆˆ:�qô !Ÿf™f ]×%7Ñ%7¸aÈ$ÔOÐSTÑTÐô Ÿ6™6 -×"4Ñ"4Ð7IÑ"IÐPQÔRÐð "Ð%5¸
Ñ%BÑBˆô —‘œŸ™ Ó,°1Ô5Ð5ˆô "$§¡¨&°5©.Ó!9Ñˆ	�;à˜) [Ð0Ñ1°9¸kÐIÐIr    Úsoft_clustersc                 óJ  — t        j                  |t        j                  |«      ¬«      }|j                  \  }}}dt        j                  ||ft         j
                  ¬«      z  }t        |«      D ]0  \  }}t        |d¬«      \  }}	t        ||	«      D ]  \  }
}||||
f<   Œ Œ2 |S )N)Únanéþÿÿÿ©ÚdtypeT)Úmaximize)	r8   Ú
nan_to_numÚnanminr7   ÚonesÚint8Ú	enumerater   Úzip)r   rF   Ú
num_chunksÚnum_speakersr"   Úhard_clustersÚcÚcostÚspeakersÚclustersÚsÚks               r   Úconstrained_argmaxz!BaseClustering.constrained_argmax   s¦   € äŸ™ m¼¿¹À=Ó9QÔRˆØ1>×1DÑ1DÑ.ˆ
�L ,ð œRŸW™W j°,Ð%?ÄrÇwÁwÔOÑOˆä  Ó/ò 	(‰GˆAˆtÜ!6°tÀdÔ!KÑˆH�hÜ˜H hÓ/ò (‘��1Ø&'�˜a ˜dÒ#ñ(ð	(ð
 Ðr    Útrain_chunk_idxÚtrain_speaker_idxÚtrain_clustersÚconstrainedc           
      óÀ  — t        j                  |«      dz   }|j                  \  }}}	|||f   }
t        j                  t	        |«      D �cg c]  }t        j
                  |
||k(     d¬«      ‘Œ! c}«      }t        t        t        |d«      || j                  ¬«      d||¬«      }d|z
  }|r| j                  |«      }nt        j                  |d¬«      }|||fS c c}w )	aÁ  Assign embeddings to the closest centroid

        Cluster centroids are computed as the average of the train embeddings
        previously assigned to them.

        Parameters
        ----------
        embeddings : (num_chunks, num_speakers, dimension)-shaped array
            Complete set of embeddings.
        train_chunk_idx : (num_embeddings,)-shaped array
        train_speaker_idx : (num_embeddings,)-shaped array
            Indices of subset of embeddings used for "training".
        train_clusters : (num_embedding,)-shaped array
            Clusters of the above subset
        constrained : bool, optional
            Use constrained_argmax, instead of (default) argmax.

        Returns
        -------
        soft_clusters : (num_chunks, num_speakers, num_clusters)-shaped array
        hard_clusters : (num_chunks, num_speakers)-shaped array
        centroids : (num_clusters, dimension)-shaped array
            Clusters centroids
        r&   r   r5   úc s d -> (c s) d©r   ú(c s) k -> c s k©rV   rZ   r1   )r8   r(   r7   ÚvstackÚrangeÚmeanr   r   r   r\   Úargmax)r   r,   r]   r^   r_   r`   r"   rS   rT   Ú	dimensionÚtrain_embeddingsr[   Ú	centroidsÚe2k_distancerF   rU   s                   r   Úassign_embeddingsz BaseClustering.assign_embeddingsŽ   sõ   € ôF —v‘v˜nÓ-°Ñ1ˆØ.8×.>Ñ.>Ñ+ˆ
�L )à% oÐ7HÐ&HÑIÐä—I‘Iô ˜|Ó,öàô —‘Ð(¨¸1Ñ)<Ñ=ÀAÖFòó
ˆ	ô !ÜÜ˜*Ð&8Ó9ØØ—{‘{ôð
 ØØô	
ˆð ˜LÑ(ˆñ Ø ×3Ñ3°MÓB‰MäŸI™I m¸!Ô<ˆMð ˜m¨YÐ6Ð6ùò;s   Á$Cc                 óÞ  — | j                  ||¬«      \  }}}	|j                  \  }
}| j                  |
|||¬«      \  }}}|dk  rl|j                  \  }}}t        j                  ||ft        j
                  ¬«      }t        j                  ||df«      }t        j                  |dd¬«      }|||fS | j                  ||||¬	«      }| j                  |||	|| j                  ¬
«      \  }}}|||fS )aô  Apply clustering

        Parameters
        ----------
        embeddings : (num_chunks, num_speakers, dimension) array
            Sequence of embeddings.
        segmentations : (num_chunks, num_frames, num_speakers) array
            Binary segmentations.
        num_clusters : int, optional
            Number of clusters, when known. Default behavior is to use
            internal threshold hyper-parameter to decide on the number
            of clusters.
        min_clusters : int, optional
            Minimum number of clusters. Has no effect when `num_clusters` is provided.
        max_clusters : int, optional
            Maximum number of clusters. Has no effect when `num_clusters` is provided.

        Returns
        -------
        hard_clusters : (num_chunks, num_speakers) array
            Hard cluster assignment (hard_clusters[c, s] = k means that sth speaker
            of cth chunk is assigned to kth cluster)
        soft_clusters : (num_chunks, num_speakers, num_clusters) array
            Soft cluster assignment (the higher soft_clusters[c, s, k], the most likely
            the sth speaker of cth chunk belongs to kth cluster)
        centroids : (num_clusters, dimension) array
            Centroid vectors of each cluster
        ©r-   )r"   r#   r$   r1   rJ   r&   r   Tr2   )r#   r$   r"   )r`   )rE   r7   r+   r8   ÚzerosrP   rO   rh   Úclusterrn   r   )r   r,   r-   r"   r#   r$   Úkwargsrk   r]   r^   r!   r=   rS   rT   rU   rF   rl   r_   s                     r   Ú__call__zBaseClustering.__call__Ö   s5  € ðL @D×?UÑ?UØØ'ð @Vó @
Ñ<Ð˜/Ð+<ð
 -×2Ñ2Ñˆ˜à37×3HÑ3HØØ%Ø%Ø%ð	 4Ió 4
Ñ0ˆ�l Lð ˜!Òà*4×*:Ñ*:Ñ'ˆJ˜ aÜŸH™H j°,Ð%?ÄrÇwÁwÔOˆMÜŸG™G Z°¸qÐ$AÓBˆMÜŸ™Ð 0°qÀ4ÔHˆIØ  -°Ð:Ð:àŸ™ØØ%Ø%Ø%ð	 &ó 
ˆð 37×2HÑ2HØØØØØ×3Ñ3ð 3Ió 3
Ñ/ˆ�} ið ˜m¨YÐ6Ð6r    ©ÚcosineF©NNN)Ngš™™™™™É?)F©NNNN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚboolr   Úintr+   r8   Úndarrayr   ÚfloatÚtuplerE   r\   rn   rt   Ú__classcell__©r   s   @r   r   r   ,   s—  ø„ ð Ø',ñ=àð=ð !%õ=ð $(Ø#'Ø#'ñ8àð8ð ˜D‘jð8ð ˜D‘jð	8ð
 ˜D‘jó8ð4 6:Ø"%ñ	0Jà—J‘Jð0Jð ,¨dÑ2ð0Jð  ð	0Jð
 
ˆr�z‰z˜2Ÿ:™: r§z¡zÐ1Ñ	2ó0Jðd°·
±
ð ¸r¿z¹zó ð* "ñF7à—J‘JðF7ð Ÿ™ðF7ð Ÿ:™:ð	F7ð
 Ÿ
™
ðF7ð óF7ðV 6:Ø#'Ø#'Ø#'ñK7à—J‘JðK7ð ,¨dÑ2ðK7ð ˜D‘jð	K7ð
 ˜D‘jðK7ð ˜D‘jðK7ð 
�‰÷K7r    r   c            
       óˆ   ‡ — e Zd ZU dZdZeed<   	 	 ddedefˆ fd„Z	 	 	 dde	j                  d	edz  d
edz  dedz  fd„Zˆ xZS )ÚAgglomerativeClusteringaÇ  Agglomerative clustering

    Parameters
    ----------
    metric : {"cosine", "euclidean", ...}, optional
        Distance metric to use. Defaults to "cosine".

    Hyper-parameters
    ----------------
    method : {"average", "centroid", "complete", "median", "single", "ward"}
        Linkage method.
    threshold : float in range [0.0, 2.0]
        Clustering threshold.
    min_cluster_size : int in range [1, 20]
        Minimum cluster size
    FÚexpects_num_clustersr   r   c                 ó�   •— t         ‰| �  ||¬«       t        dd«      | _        t	        g d¢«      | _        t        dd«      | _        y )N©r   r   g        g       @)ÚaverageÚcentroidÚcompleteÚmedianÚsingleÚwardÚweightedr&   é   )r   r   r   Ú	thresholdr   Úmethodr   Úmin_cluster_sizer   s      €r   r   z AgglomerativeClustering.__init__8  sL   ø€ ô
 	‰ÑØØ#9ð 	ô 	
ô
 !  cÓ*ˆŒÜ!ÚWó
ˆŒô
 !(¨¨2£ˆÕr    Nr,   r#   r$   r"   c           
      ó�  — |j                   \  }}t        | j                  t        dt	        d|z  «      «      «      }|dk(  r%t        j                  dt
        j                  ¬«      S | j                  dk(  rl| j                  dv r^t        j                  dd¬«      5  |t
        j                  j                  |d	d
¬«      z  }ddd«       t        || j                  d¬«      }n"t        || j                  | j                  ¬«      }t        || j                  d¬«      dz
  }	t        j                   |	d
¬«      \  }
}|
||k\     }t#        |«      }||k  r|}n||kD  r|}|��J||k7  �rDt        j$                  |«      }t        j&                  |dz
  «      |dd…df<   |dz
  }d}t        j(                  t        j*                  |dd…df   | j                  z
  «      «      D ]u  }||df   }||k  rŒt        ||d¬«      dz
  }	t        j                   |	d
¬«      \  }
}|
||k\     }t#        |«      }t+        ||z
  «      t+        ||z
  «      k  r|}|}||k(  sŒu n ||k7  rPt        ||d¬«      dz
  }	t        j                   |	d
¬«      \  }
}|
||k\     }t#        |«      }t-        d|› d|› d�«       |dk(  rd|	dd |	S |
||k     }t#        |«      dk(  r|	S t        j.                  |D �cg c]  }t        j0                  ||	|k(     d¬«      ‘Œ! c}«      }t        j.                  |D �cg c]  }t        j0                  ||	|k(     d¬«      ‘Œ! c}«      }t3        ||| j                  ¬«      }t5        t        j6                  |d¬«      «      D ]  \  }}||   |	|	||   k(  <   Œ t        j                   |	d
¬«      \  }}	|	S # 1 sw Y   �ŒóxY wc c}w c c}w )a@  

        Parameters
        ----------
        embeddings : (num_embeddings, dimension) array
            Embeddings
        min_clusters : int
            Minimum number of clusters
        max_clusters : int
            Maximum number of clusters
        num_clusters : int, optional
            Actual number of clusters. Default behavior is to estimate it based
            on values provided for `min_clusters`,  `max_clusters`, and `threshold`.

        Returns
        -------
        clusters : (num_embeddings, ) array
            0-indexed cluster indices.
        r&   gš™™™™™¹?)r&   rJ   rv   )rŠ   rŒ   rŽ   Úignore©ÚdivideÚinvalidéÿÿÿÿTr2   NÚ	euclidean©r’   r   Údistance©Ú	criterion)Úreturn_countsr1   é   zFound only z& clusters. Using a smaller value than z# for `min_cluster_size` might help.r   r5   rc   ©Úreturn_inverse)r7   r)   r“   r(   Úroundr8   rq   Úuint8r   r’   ÚerrstateÚlinalgÚnormr   r   r‘   ÚuniqueÚlenÚcopyÚarangeÚargsortÚabsÚprintrf   rh   r   rQ   Úargmin)r   r,   r#   r$   r"   r!   r=   r“   Ú
dendrogramrY   Úcluster_uniqueÚcluster_countsÚlarge_clustersÚnum_large_clustersÚ_dendrogramÚbest_iterationÚbest_num_large_clustersÚ	iterationÚnew_cluster_sizeÚsmall_clustersÚlarge_kÚlarge_centroidsÚsmall_kÚsmall_centroidsÚcentroids_cdists                            r   rr   zAgglomerativeClustering.clusterJ  s#  € ð6 '×,Ñ,Ñˆ˜ô Ø×!Ñ!¤3 q¬%°°nÑ0DÓ*EÓ#Fó
Ðð
 ˜QÒÜ—8‘8˜D¬¯©Ô1Ð1ð �;‰;˜(Ò" t§{¡{Ð6TÑ'TÜ—‘ H°hÔ?ñ QØœbŸi™iŸn™n¨Z¸bÈ4˜nÓPÑP�
÷Qä%,Ø 4§;¡;°{ô&‰Jô &-Ø 4§;¡;°t·{±{ô&ˆJô
 ˜J¨¯©À*ÔMÐPQÑQˆô *,¯©ØØô*
Ñ&ˆ˜ð (¨Ð:JÑ(JÑKˆÜ  Ó0Ðð  Ò,Ø'‰Lð   ,Ò.Ø'ˆLð Ñ#Ð(:¸lÓ(JäŸ'™' *Ó-ˆKÜ "§	¡	¨.¸1Ñ*<Ó =ˆKš˜1˜Ñà+¨aÑ/ˆNØ&'Ð#ô
  ŸZ™Z¬¯©¨zº!¸Q¸$Ñ/?À$Ç.Á.Ñ/PÓ(QÓRò �	ð $/¨y¸!¨|Ñ#<Ð Ø#Ð&6Ò6Øô $ K°ÀjÔQÐTUÑU�Ü13·±¸8ÐSWÔ1XÑ.� Ø!/°ÐBRÑ0RÑ!S�Ü%(¨Ó%8Ð"ô Ð)¨LÑ8Ó9¼CØ+¨lÑ:ó=ò ð &/�NØ.@Ð+ð &¨Ó5Ùð/ð4 '¨,Ò6ä˜[¨.ÀJÔOÐRSÑSð ô 24·±¸8ÐSWÔ1XÑ.� Ø!/°ÐBRÑ0RÑ!S�Ü%(¨Ó%8Ð"ÜØ!Ð"4Ð!5Ð5[Ð\lÐ[mð  nQð  Rôð  Ò"ØˆH‘QˆKØˆOà'¨Ð9IÑ(IÑJˆÜˆ~Ó !Ò#ØˆOô Ÿ)™)ð  .öàô —‘˜
 8¨wÑ#6Ñ7¸aÖ@òó
ˆô Ÿ)™)ð  .öàô —‘˜
 8¨wÑ#6Ñ7¸aÖ@òó
ˆô   °ÈÏÉÔUˆÜ )¬"¯)©)°OÈ!Ô*LÓ Mò 	TÑˆG�WØ<JÈ7Ñ<SˆH�X °Ñ!8Ñ8Ò9ð	Tô —i‘i ¸Ô>‰ˆˆ8Øˆ÷YQñ Qüòvùòs   Â&N1Ë$N>Ì$OÎ1N;ru   rw   ©ry   rz   r{   Ú__doc__r†   r}   Ú__annotations__r|   r   r8   r   r~   rr   r‚   rƒ   s   @r   r…   r…   $  s   ø… ñð" "'Ð˜$Ó&ð Ø',ñ/àð/ð !%õ/ð* $(Ø#'Ø#'ñVà—J‘JðVð ˜D‘jðVð ˜D‘jð	Vð
 ˜D‘j÷Vr    r…   c            
       ó‚   ‡ — e Zd ZU dZdZeed<   	 ddefˆ fd„Z	 	 	 dde	j                  dedz  d	edz  d
edz  fd„Zˆ xZS )ÚKMeansClusteringzÎKMeans clustering

    Parameters
    ----------
    metric : {"cosine", "euclidean"}, optional
        Distance metric to use. Defaults to "cosine".

    Hyper-parameters
    ----------------
    None
    Tr†   r   c                 óL   •— |dvrt        d|› d�«      ‚t        ‰| �	  |¬«       y )N)rv   rš   zUnsupported metric: z". Must be 'cosine' or 'euclidean'.rc   )r*   r   r   )r   r   r   s     €r   r   zKMeansClustering.__init__ò  s:   ø€ ð Ð0Ñ0ÜØ& v hÐ.PÐQóð ô 	‰Ñ ÐÕ'r    Nr,   r#   r$   r"   c                 óŠ  — |€t        d«      ‚|j                  \  }}||k  r%t        j                  |t        j                  ¬«      S | j
                  dk(  rEt        j                  dd¬«      5  |t        j                  j                  |dd¬	«      z  }ddd«       t        |d
dd¬«      j                  |«      S # 1 sw Y   Œ'xY w)aY  Perform KMeans clustering

        Parameters
        ----------
        embeddings : (num_embeddings, dimension) array
            Embeddings
        num_clusters : int, optional
            Expected number of clusters.

        Returns
        -------
        clusters : (num_embeddings, ) array
            0-indexed cluster indices.
        Nz `num_clusters` must be provided.rJ   rv   r•   r–   r™   Tr2   r    é*   F©Ú
n_clustersÚn_initÚrandom_stateÚcopy_x)r*   r7   r8   r«   Úint32r   r¥   r¦   r§   r   Úfit_predict)r   r,   r#   r$   r"   r!   r=   s          r   rr   zKMeansClustering.clusterý  s·   € ð, ÐÜÐ?Ó@Ð@à&×,Ñ,Ñˆ˜Ø˜LÒ(ä—9‘9˜^´2·8±8Ô<Ð<ð �;‰;˜(Ò"Ü—‘ H°hÔ?ñ QØœbŸi™iŸn™n¨Z¸bÈ4˜nÓPÑP�
÷Qô Ø#¨A¸BÀuô
ç
‰+�jÓ
!ð	"÷	Qð Qús   Á-&B9Â9C)rv   rw   rÀ   rƒ   s   @r   rÄ   rÄ   ã  sm   ø… ñ
ð "&Ð˜$Ó%ð ñ	(àõ	(ð $(Ø#'Ø#'ñ&"à—J‘Jð&"ð ˜D‘jð&"ð ˜D‘jð	&"ð
 ˜D‘j÷&"r    rÄ   c                   ó¬   ‡ — e Zd ZU dZeed<   	 	 ddededefˆ fd„Z	 	 	 	 dde	j                  d	edz  d
edz  dedz  dedz  de	j                  fd„Zˆ xZS )ÚVBxClusteringFr†   Úpldar   r   c                 óœ   •— t         ‰| �  ||¬«       || _        t        dd«      | _        t        dd«      | _        t        dd«      | _        y )Nrˆ   g      à?gš™™™™™é?g{®Gáz„?g      .@)r   r   rÑ   r   r‘   ÚFaÚFb)r   rÑ   r   r   r   s       €r   r   zVBxClustering.__init__+  sP   ø€ ô 	‰ÑØØ#9ð 	ô 	
ð
 ˆŒ	ä   cÓ*ˆŒÜ˜$ Ó$ˆŒÜ˜$ Ó%ˆ�r    Nr,   r-   r"   r#   r$   r/   c           
      óÖ  — | j                   }| j                  ||¬«      \  }}	}	|j                  d   dk  rl|j                  \  }
}}	t        j                  |
|ft        j
                  ¬«      }t        j                  |
|df«      }t        j                  |dd¬«      }|||fS |t        j                  j                  |dd¬«      z  }t        |dd	¬
«      }t        || j                  d¬«      dz
  }t        j                  |d¬«      \  }	}| j                  |«      }t        ||| j                  j                   | j"                  | j$                  d¬«      \  }}|j                  \  }
}}|d d …|dkD  f   }|j&                  |j)                  d|«      z  |j+                  dd¬«      j&                  z  }|j                  \  }}	||k  r|}n||kD  r|}|rl||k7  rgd}t-        |ddd¬«      j/                  |«      }t        j0                  t3        |«      D �cg c]  }t        j                  |||k(     d¬«      ‘Œ! c}«      }t5        t7        t5        |d«      || j8                  ¬«      d|
|¬«      }d|z
  }|rF|j;                  «       dz
  }|||j<                  j+                  d«      dk(  <   | j?                  |«      }nt        j@                  |d¬«      }|j)                  |
|«      }|||fS c c}w )Nrp   r   r1   rJ   r&   Tr2   rŠ   rš   r›   rœ   r�   r¡   r�   )rÓ   rÔ   ÚmaxItersgH¯¼šò×z>r™   )r4   Fr    rÇ   rÈ   r5   rb   rc   rd   re   ç      ð?)!r   rE   r7   r8   rq   rP   rO   rh   r¦   r§   r   r   r‘   r¨   rÑ   r	   ÚphirÓ   rÔ   ÚTÚreshaper9   r   rÎ   rf   rg   r   r   r   r)   r6   r\   ri   )r   r,   r-   r"   r#   r$   rs   r   rk   r=   rS   rT   rU   rF   rl   Útrain_embeddings_normedr°   Úahc_clustersÚfeaÚqÚsprj   ÚWÚauto_num_clustersÚkmeans_clustersr[   rm   Úconsts                               r   rt   zVBxClustering.__call__<  s  € ð "&×!<Ñ!<Ðà!%×!7Ñ!7Ø mð "8ó "
ÑÐ˜!˜Qð ×!Ñ! !Ñ$ qÒ(à*4×*:Ñ*:Ñ'ˆJ˜ aÜŸH™H j°,Ð%?ÄrÇwÁwÔOˆMÜŸG™G Z°¸qÐ$AÓBˆMÜŸ™Ð 0°qÀ4ÔHˆIØ  -°Ð:Ð:ð #3´R·Y±Y·^±^Ø 1¨tð 6Dó 6
ñ #
Ðô Ø#¨J¸{ô
ˆ
ô   
¨D¯N©NÀjÔQÐTUÑUˆÜŸ)™) LÀÔF‰ˆˆ<ð �i‰iÐ(Ó)ˆÜØØØ�I‰I�M‰MØ�w‰wØ�w‰wØô
‰ˆˆ2ð /9×.>Ñ.>Ñ+ˆ
�L )ØŠa��d‘ˆl‰OˆØ—C‘CÐ*×2Ñ2°2°yÓAÑAÀAÇEÁEÈ!ÐVZÀEÓD[×D]ÑD]Ñ]ˆ	ð  )Ÿ™ÑÐ˜1Ø˜|Ò+Ø'‰LØ Ò-Ø'ˆLÙ˜LÐ,=Ò=ð &+Ð"Ü$Ø'°ÀÈ5ôç‰kÐ1Ó2ð ô Ÿ	™	ô # <Ó0öàô —G‘GÐ,¨_ÀÑ-AÑBÈÖKòóˆIô !ÜÜ˜*Ð&8Ó9ØØ—{‘{ôð
 ØØô	
ˆð ˜LÑ(ˆñ "Ø!×%Ñ%Ó'¨"Ñ,ˆEØ<AˆM˜-×,Ñ,×0Ñ0°Ó3°qÑ8Ñ9Ø ×3Ñ3Øó‰Mô ŸI™I m¸!Ô<ˆMà%×-Ñ-¨j¸,ÓGˆà˜m¨YÐ6Ð6ùò=s   È$K&)rv   Trx   )ry   rz   r{   r†   r}   rÂ   r   r|   r   r8   r   r   r~   rt   r‚   rƒ   s   @r   rÐ   rÐ   &  s¤   ø… à!&Ð˜$Ó&ð Ø'+ñ	&àð&ð ð&ð !%õ	&ð( 6:Ø#'Ø#'Ø#'ña7à—J‘Jða7ð ,¨dÑ2ða7ð ˜D‘jð	a7ð
 ˜D‘jða7ð ˜D‘jða7ð 
�‰÷a7r    rÐ   c                   ó†   — e Zd ZU dZdZeed<   	 	 	 	 ddej                  dz  de	dz  de
dz  dedz  d	ej                  f
d
„Zy)ÚOracleClusteringzOracle clusteringTr†   Nr,   r-   ÚfileÚframesr/   c           
      ób  — |j                   j                  \  }}}|j                  }	t        ||	|¬«      }
|
|d<   |
j                   j                  \  }}}|j                   dd…dt	        ||«      …f   }|
j                   dd…dt	        ||«      …f   }
dt        j                  ||ft
        j                  ¬«      z  }t        j                  |||f«      }t        t        ||
«      «      D ]O  \  }\  }}t        |t
        j                     |«      \  }^}}t        |«      D ]  \  }}|€Œ	||||f<   d||||f<   Œ ŒQ |€||dfS | j                  ||¬«      \  }}}|||f   }t        j                  t        |«      D �cg c]  }t        j                   |||k(     d¬	«      ‘Œ! c}«      }|||fS c c}w )
aì  Apply oracle clustering

        Parameters
        ----------
        embeddings : (num_chunks, num_speakers, dimension) array, optional
            Sequence of embeddings. When provided, compute speaker centroids
            based on these embeddings.
        segmentations : (num_chunks, num_frames, num_speakers) array
            Binary segmentations.
        file : AudioFile
        frames : SlidingWindow

        Returns
        -------
        hard_clusters : (num_chunks, num_speakers) array
            Hard cluster assignment (hard_clusters[c, s] = k means that sth speaker
            of cth chunk is assigned to kth cluster)
        soft_clusters : (num_chunks, num_speakers, num_clusters) array
            Soft cluster assignment (the higher soft_clusters[c, s, k], the most likely
            the sth speaker of cth chunk belongs to kth cluster)
        centroids : (num_clusters, dimension), optional
            Clusters centroids if `embeddings` is provided, None otherwise.
        )rç   Úoracle_segmentationsNrI   rJ   r×   rp   r   r5   )r6   r7   Úsliding_windowr   r)   r8   rO   rP   rq   rQ   rR   r   ÚnewaxisrE   rf   rg   rh   )r   r,   r-   ræ   rç   rs   rS   r>   rT   Úwindowré   r=   Úoracle_num_framesr"   rU   rF   rV   ÚsegmentationÚoracleÚpermutationÚjÚirk   r]   r^   r_   r[   rl   s                               r   rt   zOracleClustering.__call__¥  s	  € ð@ 0=×/AÑ/A×/GÑ/GÑ,ˆ
�J Ø×-Ñ-ˆä2°4¸ÈÔOÐð (<ˆÐ#Ñ$à-A×-FÑ-F×-LÑ-LÑ*ˆÐ˜là%×*Ñ*ª1Ð.R´°JÐ@QÓ0RÐ.RÐ+RÑSˆØ3×8Ñ8ÚÐ3”�ZÐ!2Ó3Ð3Ð3ñ 
Ðð œRŸW™W j°,Ð%?ÄrÇwÁwÔOÑOˆÜŸ™ *¨l¸LÐ!IÓJˆÜ)2Ü�Ð3Ó4ó*
ò 	-Ñ%ˆAÑ%�˜fô $-¨V´B·J±JÑ-?ÀÓ#NÑ ˆAÐ �˜aÜ! +Ó.ò -‘��1Ø�9ØØ&'�˜a ˜dÑ#Ø),�˜a  A˜gÒ&ñ	-ð		-ð ÐØ  -°Ð5Ð5ð ×"Ñ"ØØ'ð #ó 
ñ		
ØØØð ' Ð8IÐ'IÑJˆÜ—I‘Iô ˜|Ó,öàô —‘Ð(¨¸1Ñ)<Ñ=ÀAÖFòó
ˆ	ð ˜m¨YÐ6Ð6ùòs   Å<$F,rx   )ry   rz   r{   rÁ   r†   r}   rÂ   r8   r   r   r   r
   rt   © r    r   rå   rå      su   … Ùà!%Ð˜$Ó%ð )-Ø59Ø!%Ø'+ñO7à—J‘J Ñ%ðO7ð ,¨dÑ2ðO7ð ˜$Ñð	O7ð
  Ñ$ðO7ð 
�‰ôO7r    rå   c                   ó   — e Zd ZeZeZeZeZy)Ú
ClusteringN)ry   rz   r{   r…   rÄ   rÐ   rå   ró   r    r   rõ   rõ   ÷  s   „ Ø5ÐØ'ÐØ!€MØ'Ñr    rõ   ))rÁ   Úenumr   Únumpyr8   Úeinopsr   Úpyannote.audio.core.ior   Úpyannote.audio.core.pldar   Úpyannote.audio.pipelines.utilsr   Ú pyannote.audio.utils.permutationr   Úpyannote.audio.utils.vbxr	   Úpyannote.corer
   r   Úpyannote.pipeliner   Úpyannote.pipeline.parameterr   r   r   Úscipy.cluster.hierarchyr   r   Úscipy.optimizer   Úscipy.spatial.distancer   Úsklearn.clusterr   r   r…   rÄ   rÐ   rå   rõ   ró   r    r   ú<module>r     s‘   ðñ0 å ã Ý Ý ,Ý )Ý >Ý 6Ý 0ß =Ý &ß EÑ Eß 5Ý 0Ý (Ý "ôu7�Xô u7ôp|˜nô |ô~@"�~ô @"ôFw7�Nô w7ôtT7�~ô T7ôn(�õ (r    