Ë
    ÿÍ:jt-  ã                   ó®  — d Z ddlmZ ddlmZ ddlmZmZ ddlZddl	Z
ddlZddlmZmZmZmZ ddlmZmZ e	 	 	 dded	ee   d
eeee
j.                  f      fd„«       Zej2                  	 	 	 dde
j.                  ded	ee   d
eeee
j.                  f      fd„«       Zej2                  	 	 	 ddeded	ee   d
ee   fd„«       Z G d„ d«      Z G d„ d«      Zy)z
# Signal processing
é    )Úsingledispatch)Úzip_longest)ÚOptionalÚUnionN)Ú
AnnotationÚSegmentÚSlidingWindowFeatureÚTimeline)ÚpairwiseÚstring_generatorÚonsetÚoffsetÚinitial_statec                 ó   — t        d«      ‚)a™  (Batch) hysteresis thresholding

    Parameters
    ----------
    scores : numpy.ndarray or SlidingWindowFeature
        (num_chunks, num_frames, num_classes)- or (num_frames, num_classes)-shaped scores.
    onset : float, optional
        Onset threshold. Defaults to 0.5.
    offset : float, optional
        Offset threshold. Defaults to `onset`.
    initial_state : np.ndarray or bool, optional
        Initial state.

    Returns
    -------
    binarized : same as scores
        Binarized scores with same shape and type as scores.

    Reference
    ---------
    https://stackoverflow.com/questions/23289976/how-to-find-zero-crossings-with-hysteresis
    z=scores must be of type numpy.ndarray or SlidingWindowFeatures)ÚNotImplementedError)Úscoresr   r   r   s       úp/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/pyannote/audio/utils/signal.pyÚbinarizer   ,   s   € ô: ØGóð ó    r   c                 ó¨  — |xs |}| j                   \  }}t        j                  | «      } |€| dd…df   d||z   z  k\  }nqt        |t        «      r |t        j
                  |ft        ¬«      z  }nAt        |t        j                  «      r'|j                   |fk(  sJ ‚|j                  t        k(  sJ ‚t        j                  ||df«      j                  }| |kD  }| |k  |z  }t        j                  t        t        |D �cg c]  }t        j                  |«      d   ‘Œ c}ddiŽ«      «      j                  }	|	j                  st        j                  | t        ¬«      |z  S t        j                   |d¬«      }
t        j                  t        j"                  |«      |df«      j                  }t        j$                  |
|||	||
dz
  f   f   |«      S c c}w )	aÞ  (Batch) hysteresis thresholding

    Parameters
    ----------
    scores : numpy.ndarray
        (num_frames, num_classes)-shaped scores.
    onset : float, optional
        Onset threshold. Defaults to 0.5.
    offset : float, optional
        Offset threshold. Defaults to `onset`.
    initial_state : np.ndarray or bool, optional
        Initial state.

    Returns
    -------
    binarized : same as scores
        Binarized scores with same shape and type as scores.
    Nr   ç      à?)Údtypeé   Ú	fillvalueéÿÿÿÿ)Úaxis)ÚshapeÚnpÚ
nan_to_numÚ
isinstanceÚboolÚonesÚndarrayr   ÚtileÚTÚarrayÚlistr   ÚnonzeroÚsizeÚ
zeros_likeÚcumsumÚarangeÚwhere)r   r   r   r   Ú
batch_sizeÚ
num_framesÚonÚ	off_or_onÚoonÚwell_defined_idxÚsame_asÚsampless               r   Úbinarize_ndarrayr6   N   s£  € ð4 Š_�u€Fà#Ÿ\™\Ñ€J�
ä�]‰]˜6Ó"€FàÐØšq !˜t™¨¨u°v©~Ñ(>Ñ>‰ä	�M¤4Ô	(Ø%¬¯©°°ÄTÔ(JÑJ‰ä	�M¤2§:¡:Ô	.Ø×"Ñ" z mÒ3Ð3Ð3Ø×"Ñ"¤dÒ*Ð*Ð*ä—G‘G˜M¨J¸¨?Ó;×=Ñ=€Mà	�%‰€BØ˜&‘ BÑ&€Iô —x‘xÜŒ[¸ÖC°#œ2Ÿ:™: c›?¨1Ó-ÒCÐRÈrÑRÓSóç�að ð
 × Ò Ü�}‰}˜V¬4Ô0°=Ñ@Ð@ô �i‰i˜	¨Ô*€Gä�g‰g”b—i‘i 
Ó+¨j¸!¨_Ó=×?Ñ?€Gä�8‰8Ø��GÐ-¨g°wÀ±{Ð.BÑCÐCÑDÀmóð ùò Ds   Ã=Gc           
      óz  — |xs |}| j                   j                  dk(  r{| j                   j                  \  }}t        j                  | j                   d||¬«      }t        ||||¬«      }t        dt        j                  |d||¬«      z  | j                  «      S | j                   j                  dk(  r~| j                   j                  \  }}}t        j                  | j                   d|||¬	«      }t        ||||¬«      }t        dt        j                  |d
|||¬	«      z  | j                  «      S t        d«      ‚)a  (Batch) hysteresis thresholding

    Parameters
    ----------
    scores : SlidingWindowFeature
        (num_chunks, num_frames, num_classes)- or (num_frames, num_classes)-shaped scores.
    onset : float, optional
        Onset threshold. Defaults to 0.5.
    offset : float, optional
        Offset threshold. Defaults to `onset`.
    initial_state : np.ndarray or bool, optional
        Initial state.

    Returns
    -------
    binarized : same as scores
        Binarized scores with same shape and type as scores.

    é   z
f k -> k f)ÚfÚk)r   r   r   ç      ð?z
k f -> f ké   zc f k -> (c k) f)Úcr9   r:   z(c k) f -> c f kz[Shape of scores must be (num_chunks, num_frames, num_classes) or (num_frames, num_classes).)	ÚdataÚndimr   ÚeinopsÚ	rearranger   r	   Úsliding_windowÚ
ValueError)	r   r   r   r   r/   Únum_classesr>   Ú	binarizedÚ
num_chunkss	            r   Úbinarize_swfrG   �   sB  € ð6 Š_�u€Fà‡{�{×Ñ˜1ÒØ"(§+¡+×"3Ñ"3Ñˆ
�KÜ×Ñ §¡¨\¸ZÈ;ÔWˆÜØ˜ f¸Mô
ˆ	ô $ØÜ×Ñ˜y¨,¸*ÈÔTñUà×!Ñ!ó
ð 	
ð 
�‰×	Ñ	˜QÒ	Ø.4¯k©k×.?Ñ.?Ñ+ˆ
�J Ü×ÑØ�K‰KÐ+¨z¸ZÈ;ô
ˆô Ø˜ f¸Mô
ˆ	ô $ØÜ×ÑØÐ-°¸zÈ[ôñð ×!Ñ!ó
ð 	
ô Øió
ð 	
r   c                   ó`   ‡ — e Zd ZdZ	 	 	 	 	 	 ddedee   dedededefˆ fd„Zd	ed
efd„Z	ˆ xZ
S )ÚBinarizeaƒ  Binarize detection scores using hysteresis thresholding

    Parameters
    ----------
    onset : float, optional
        Onset threshold. Defaults to 0.5.
    offset : float, optional
        Offset threshold. Defaults to `onset`.
    min_duration_on : float, optional
        Remove active regions shorter than that many seconds. Defaults to 0s.
    min_duration_off : float, optional
        Fill inactive regions shorter than that many seconds. Defaults to 0s.
    pad_onset : float, optional
        Extend active regions by moving their start time by that many seconds.
        Defaults to 0s.
    pad_offset : float, optional
        Extend active regions by moving their end time by that many seconds.
        Defaults to 0s.

    Reference
    ---------
    Gregory Gelly and Jean-Luc Gauvain. "Minimum Word Error Training of
    RNN-based Voice Activity Detection", InterSpeech 2015.
    r   r   Úmin_duration_onÚmin_duration_offÚ	pad_onsetÚ
pad_offsetc                 ó~   •— t         ‰| �  «        || _        |xs || _        || _        || _        || _        || _        y ©N)ÚsuperÚ__init__r   r   rL   rM   rJ   rK   )Úselfr   r   rJ   rK   rL   rM   Ú	__class__s          €r   rQ   zBinarize.__init__é   s@   ø€ ô 	‰ÑÔàˆŒ
Ø’o ˆŒà"ˆŒØ$ˆŒà.ˆÔØ 0ˆÕr   r   Úreturnc                 ó  — |j                   j                  \  }}|j                  }t        |«      D �cg c]  }||   j                  ‘Œ }}t        «       }t        «       }t        |j                   j                  «      D ]æ  \  }	}
|j                  €|	n|j                  |	   }t        |«      }|d   }|
d   | j                  kD  }t        |dd |
dd «      D ]]  \  }}|rB|| j                  k  sŒt        || j                  z
  || j                   z   «      }||||f<   |}d}ŒJ|| j                  kD  sŒZ|}d}Œ_ |sŒºt        || j                  z
  | j                   z   «      }||||f<   Œè | j                   dkD  s| j                  dkD  s| j"                  dkD  r|j%                  | j"                  ¬«      }| j&                  dkD  r@t)        |j+                  «       «      D ]$  \  }}|j,                  | j&                  k  sŒ |||f= Œ& |S c c}w )zèBinarize detection scores

        Parameters
        ----------
        scores : SlidingWindowFeature
            Detection scores.

        Returns
        -------
        active : Annotation
            Binarized scores.
        Nr   r   FTç        )Úcollar)r>   r   rB   ÚrangeÚmiddler   r   Ú	enumerater%   ÚlabelsÚnextr   Úzipr   r   rL   rM   rK   ÚsupportrJ   r'   Ú
itertracksÚduration)rR   r   r/   rD   ÚframesÚiÚ
timestampsÚactiveÚtrack_generatorr:   Úk_scoresÚlabelÚtrackÚstartÚ	is_activeÚtÚyÚregionÚsegments                      r   Ú__call__zBinarize.__call__þ   s  € ð #)§+¡+×"3Ñ"3Ñˆ
�KØ×&Ñ&ˆÜ05°jÓ0AÖB¨1�f˜Q‘i×&Ó&ÐBˆ
ÐBô “ˆÜ*Ó,ˆä$ V§[¡[§]¡]Ó3ò 	.‰KˆAˆxØŸ™Ð.‘A°F·M±MÀ!Ñ4DˆEÜ˜Ó)ˆEð ˜q‘MˆEØ  ™ d§j¡jÑ0ˆIä˜J q r˜N¨H°Q°R¨LÓ9ò )‘��1ñ à˜4Ÿ;™;“Ü!(¨°·±Ñ)?ÀÀTÇ_Á_ÑATÓ!U˜Ø05˜˜v u˜}Ñ-Ø !˜Ø$)™	ð
 ˜4Ÿ:™:“~Ø !˜Ø$(™	ð!)ò& Ü  ¨¯©Ñ!7¸¸T¿_¹_Ñ9LÓM�Ø(-��v˜u�}Ò%ð;	.ðB �?‰?˜SÒ  D§N¡N°SÒ$8¸D×<QÑ<QÐTWÒ<WØ—^‘^¨4×+@Ñ+@�^ÓAˆFð ×Ñ !Ò#Ü"& v×'8Ñ'8Ó':Ó";ò /‘�˜Ø×#Ñ# d×&:Ñ&:Ó:Ø˜w¨˜~Ñ.ð/ð ˆùòa Cs   ³H)r   NrV   rV   rV   rV   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úfloatr   rQ   r	   r   ro   Ú__classcell__©rS   s   @r   rI   rI   Ï   sv   ø„ ñð6 Ø"&Ø!$Ø"%ØØñ1àð1ð ˜‘ð1ð ð	1ð
  ð1ð ð1ð õ1ð*@Ð3ð @¸
÷ @r   rI   c                   ó>   ‡ — e Zd ZdZ	 	 ddedefˆ fd„Zdefd„Zˆ xZS )ÚPeakzëPeak detection

    Parameters
    ----------
    alpha : float, optional
        Peak threshold. Defaults to 0.5
    min_duration : float, optional
        Minimum elapsed time between two consecutive peaks. Defaults to 1 second.
    ÚalphaÚmin_durationc                 óF   •— t         t        | �  «        || _        || _        y rO   )rP   rx   rQ   ry   rz   )rR   ry   rz   rS   s      €r   rQ   zPeak.__init__L  s!   ø€ ô
 	Œd�DÑ"Ô$ØˆŒ
Ø(ˆÕr   r   c           	      ó¼  — |j                   dk7  rt        d«      ‚t        |«      }|j                  }|j                  }t        dt        t        j                  | j                  |z  «      «      «      }t        j                  j                  |dd |¬«      d   }t        j                  |D �cg c]$  }||   | j                  kD  sŒ||   j                  ‘Œ& c}«      }t        j                   |d   j"                  g|||   j$                  gg«      }	t'        «       }
t)        t+        |	«      «      D ]%  \  }\  }}t-        ||«      }|
j/                  |«       Œ' |
S c c}w )zØPeak detection

        Parameter
        ---------
        scores : SlidingWindowFeature
            Detection scores.

        Returns
        -------
        segmentation : Timeline
            Partition.
        r   z$Peak expects one-dimensional scores.N)Úorderr   )Ú	dimensionrC   ÚlenrB   ÚstepÚmaxÚintr   Úrintrz   ÚscipyÚsignalÚ	argrelmaxr&   ry   rY   Úhstackri   Úendr
   rZ   r   r   Úadd)rR   r   r/   ra   Ú	precisionr}   Úindicesrb   Ú	peak_timeÚ
boundariesÚsegmentationri   rˆ   rn   s                 r   ro   zPeak.__call__U  s7  € ð ×Ñ˜qÒ ÜÐCÓDÐDä˜“[ˆ
Ø×&Ñ&ˆà—K‘Kˆ	Ü�A”sœ2Ÿ7™7 4×#4Ñ#4°yÑ#@ÓAÓBÓCˆÜ—,‘,×(Ñ(¨±¨¸%Ð(Ó@ÀÑCˆä—H‘HØ'.ÖI !°&¸±)¸d¿j¹jÓ2HˆV�A‰Y×ÓÒIó
ˆ	ô —Y‘Y ¨¡§¡Ð 1°9¸vÀjÑ?Q×?UÑ?UÐ>VÐWÓXˆ
ä“zˆÜ(¬°*Ó)=Ó>ò 	&‰OˆA‰|��sÜ˜e SÓ)ˆGØ×Ñ˜WÕ%ð	&ð Ðùò Js   Â-EÃE)r   r;   )	rp   rq   rr   rs   rt   rQ   r	   ro   ru   rv   s   @r   rx   rx   A  s4   ø„ ñð Ø!ñ)àð)ð õ)ð"Ð3÷ "r   rx   )r   NN)rs   Ú	functoolsr   Ú	itertoolsr   Útypingr   r   r@   Únumpyr   Úscipy.signalr„   Úpyannote.corer   r   r	   r
   Úpyannote.core.utils.generatorsr   r   rt   r!   r#   r   Úregisterr6   rG   rI   rx   © r   r   ú<module>r˜      sH  ðñ:õ %Ý !ß "ã Û Û ß MÓ Mß Eð ð Ø"Ø7;ñ	àðð �U‰Oðð ˜E $¨¯
©
Ð"2Ñ3Ñ4ò	ó ððB 
×Ñð Ø"Ø7;ñ	>Ø�J‰Jð>àð>ð �U‰Oð>ð ˜E $¨¯
©
Ð"2Ñ3Ñ4ò	>ó ð>ðB 
×Ñð Ø"Ø$(ñ	;
Ø ð;
àð;
ð �U‰Oð;
ð ˜D‘>ò	;
ó ð;
÷|oñ o÷d6ò 6r   