
     i?,                         d dl Z d dlmZmZmZ d dlZd dlmc 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 d dlmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ  G d d      Zy)    N)DictSequenceUnion)Problem
ResolutionSpecifications)EqualErrorRate)create_rng_for_worker)Segment)SpeakerDiarizationProtocolSpeakerVerificationProtocol)default_collate)Metric)BinaryAUROC)tqdmc                   D   e Zd ZdZedefd       Zej                  defd       Zedefd       Zej                  defd       Zedefd	       Z	e	j                  d
efd       Z	ddZ
deeee   eeef   f   fdZd Zd ZddZdefdZdefdZd Zd ZdefdZy))SupervisedRepresentationLearningTaskMixinz6Methods common to most supervised representation tasksreturnc                 d    t        | d      r| j                  S | j                  | j                  z  S )Nnum_classes_per_batch_)hasattrr   
batch_sizenum_chunks_per_classselfs    z/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/pyannote/audio/tasks/embedding/mixins.pynum_classes_per_batchz?SupervisedRepresentationLearningTaskMixin.num_classes_per_batch0   s.    412...$";";;;    r   c                     || _         y N)r   )r   r   s     r   r   z?SupervisedRepresentationLearningTaskMixin.num_classes_per_batch6   s
    &;#r   c                 d    t        | d      r| j                  S | j                  | j                  z  S )Nnum_chunks_per_class_)r   r"   r   r   r   s    r   r   z>SupervisedRepresentationLearningTaskMixin.num_chunks_per_class:   s.    401---$"<"<<<r   r   c                     || _         y r    )r"   )r   r   s     r   r   z>SupervisedRepresentationLearningTaskMixin.num_chunks_per_class@   s
    %9"r   c                 d    t        | d      r| j                  S | j                  | j                  z  S )Nbatch_size_)r   r%   r   r   r   s    r   r   z4SupervisedRepresentationLearningTaskMixin.batch_sizeD   s/    4'###((4+E+EEEr   r   c                     || _         y r    )r%   )r   r   s     r   r   z4SupervisedRepresentationLearningTaskMixin.batch_sizeJ   s
    %r   Nc           	         t               | _        d| j                  j                   d}t	        | j                  j                         |d      D ]  }|d   j                         D ]  }|d   j                  |      D cg c]  }|j                  | j                  kD  r| }}|s@t        d |D              }|| j                  vrt               | j                  |<   | j                  |   j                  |d   |d   ||d	         t        t        j                  t         j"                  | j                  | j                  t%        | j                        
      | _        y c c}w )NzLoading z training labelsfile)iterabledescunit
annotationc              3   4   K   | ]  }|j                     y wr    )duration).0segments     r   	<genexpr>zBSupervisedRepresentationLearningTaskMixin.setup.<locals>.<genexpr>c   s     L|Gw//|   uriaudio)r3   r4   r.   speech_turns)problem
resolutionr.   min_durationclasses)dict_trainprotocolnamer   trainlabelslabel_timeliner.   r8   sumlistappendr   r   REPRESENTATIONr   CHUNKsortedspecifications)r   stager*   fklassr0   r5   r.   s           r   setupz/SupervisedRepresentationLearningTaskMixin.setupN   sN    f$--,,--=>t}}2244fMA<//1 $%\?#A#A%#H #H''$*;*;; #H    $ L|LL +)-DKK&E")) x!"7$,(4	' 2 N: -**!'']]**4;;'
5 s   ?"E#c                 4    t        dd      t        d      gS )NTF)compute_on_cpu	distances)rM   )r	   r   r   s    r   default_metricz8SupervisedRepresentationLearningTaskMixin.default_metricz   s      $%@t,
 	
r   c           
   #      K   t        | j                        }t        | j                  j                        }|j                  | j                  | j                        }d}	 |j                  |       |D ]  }| j                  j                  j                  |      }t        | j                        D ]  }|j                  | j                  |   | j                  |   D cg c]  }|d   	 c}d      ^}	}|j                  |	d   |	d   D 
cg c]  }
|
j                   c}
d      ^}}|j                  |k  r| j                  j                  j                  |	|      \  }}t!        j"                  || j                  j                  j$                  z        |j&                  d   z
  }|j)                  d|      }t+        j,                  ||||z
  f      }na|j                  |j.                  |j0                  |z
        }t3        |||z         }| j                  j                  j                  |	|      \  }}||d |dz  }|| j4                  k(  s|j                  | j                  | j                        }d}  $c c}w c c}
w w)zIterate over training samples

        Yields
        ------
        X: (time, channel)
            Audio chunks.
        y: int
            Speaker index.
        r   r.      )weightskr5   )Xy)r
   modelrB   rG   r9   uniformr8   r.   shuffleindexranger   choicesr;   r4   cropmathfloorsample_rateshaperandintFpadstartendr   r   )r   rngr9   batch_durationnum_samplesrJ   rU   _rI   r(   sspeech_turnrT   num_missing_framesleft_pad
start_timechunks                    r   train__iter__z7SupervisedRepresentationLearningTaskMixin.train__iter__   sf     $DJJ/t**223 T%6%6F
 KK  ''//55e< t889A"{{E*8<E8J K8J1:8J K  +  HD1 '*kk^,59.5I J5I5I J '2 'OK! #++n<#zz//44T;G1 JJ~

8H8H8T8T'TUggaj) + $';;q2D#EEE!h0BX0M%NO &)[['--{/O&
 !(
J4O P#zz//44 ! 1
 !"**1$K"doo5),T5F5F)V&'W : !   !L !Ks%   CJJ+!JJ	D3J:Jc                     t        d | j                  j                         D              }d| j                  | j                  z   z  }t        | j                  t        j                  ||z              S )Nc              3   4   K   | ]  }|D ]	  }|d       yw)r.   N )r/   datadatums      r   r1   zISupervisedRepresentationLearningTaskMixin.train__len__.<locals>.<genexpr>   s#      
*>$D5E*D*>r2         ?)	rA   r;   valuesr8   r.   maxr   r]   ceil)r   r.   avg_chunk_durations      r   train__len__z6SupervisedRepresentationLearningTaskMixin.train__len__   sb     
*.++*<*<*>
 
 !D$5$5$EF4??DIIh9K.K$LMMr   c                     t        |      }|dk(  r_| j                  j                  d       | j                  |d   | j                  j                  j
                        }|j                  |d<   |S )Nr>   T)moderT   )samplesr_   )r   augmentationr>   rV   hparamsr_   r~   )r   batchrH   collated	augmenteds        r   
collate_fnz4SupervisedRepresentationLearningTaskMixin.collate_fn   sp    "5)G###.))  JJ..:: * I &--HSMr   	batch_idxc                     |d   |d   }}| j                   j                  | j                  |      |      }t        j                  |      ry | j                   j	                  d|dddd       d|iS )NrT   rU   z
loss/trainFTon_stepon_epochprog_barloggerloss)rV   	loss_functorchisnanlog)r   r   r   rT   rU   r   s         r   training_stepz7SupervisedRepresentationLearningTaskMixin.training_step   su    Sz5:1zz##DJJqM15 ;;t

 	 	
 ~r   prepared_dictc                     t        | j                  t              r't        | j                  j	                               |d<   y y )N
validation)
isinstancer<   r   rB   development_trial)r   r   s     r   prepare_validationz<SupervisedRepresentationLearningTaskMixin.prepare_validation   s3    dmm%@A*.t}}/N/N/P*QM,' Br   c                    t        | j                  t              rW| j                  d   |   }t	               }dD ]+  }|d|d   }| j
                  j                  j                  |      }|| j                  kD  r\t        d|z  d| j                  z  z
  d|z  d| j                  z  z         }| j
                  j                  j                  ||      \  }}n| j
                  j                  |      \  }}t        j                  | j                  | j
                  j                  j                  z        |j                  d   z
  }	t        j                   |d|	f      }||d|d<   . |d	   |d
<   |S t        | j                  t"              ry y )Nr   )rQ      r(   drv   rQ   r   rT   	referencerU   )r   r<   r   prepared_datar:   rV   r4   get_durationr.   r   r\   r]   r^   r_   r`   rb   rc   r   )
r   idxtrialrt   r(   r.   middlerT   ri   rl   s
             r   val__getitem__z8SupervisedRepresentationLearningTaskMixin.val__getitem__   sn   dmm%@A&&|4S9E6DtC7^,::++88>dmm+$ht}})<<ht}})<<F  ::++00v>DAq::++D1DAq

4==4::3C3C3O3O#OP''!*% ' a!%7!89A$%qQ[!! " k*DIK'AB Cr   c                     t        | j                  t              rt        | j                  d         S t        | j                  t
              ryy )Nr   r   )r   r<   r   lenr   r   r   s    r   
val__len__z4SupervisedRepresentationLearningTaskMixin.val__len__  s?    dmm%@At)),788'AB Cr   c                    t        | j                  t              rt        j                         5  | j                  |d         j                         }| j                  |d         j                         }t        j                  ||      }d d d        |d   }| j
                  j                  |       | j
                  j                  | j
                  j                  dddd       y y # 1 sw Y   `xY w)NX1X2rU   FTr   )r   r<   r   r   no_gradrV   detachrb   cosine_similarityvalidation_metriclog_dict)r   r   r   emb1emb2y_predy_trues          r   validation_stepz9SupervisedRepresentationLearningTaskMixin.validation_step  s    dmm%@Azz%+.557zz%+.557,,T48 !
 3ZFJJ((8JJ

,,    B s   AC))C2r    )r>   )__name__
__module____qualname____doc__propertyintr   setterr   r   rK   r   r   r   r   strrO   rp   r{   r   r   r   r   r   r   rs   r   r   r   r   +   s+   @ <s < <
 !!<3 < "< =c = =
   : : !: FC F F
 &S & &*
X
	vx'c6k)::	;
K(ZNc &R R: r   r   )r]   typingr   r   r   r   torch.nn.functionalnn
functionalrb   pyannote.audio.core.taskr   r   r   *pyannote.audio.torchmetrics.classificationr	   pyannote.audio.utils.randomr
   pyannote.corer   pyannote.database.protocolr   r   torch.utils.data._utils.collater   torchmetricsr   torchmetrics.classificationr   r   r   rs   r   r   <module>r      sG   0  ( (    H H E = ! <  3 C Cr   