+
    ~j5                       ^ RI Ht ^ RIt^ RIt^ RIHt ^ RIt^ RIH	t	 ^RI
Ht ^RIHt ^RIHt ^RIHtHtHtHt ^R	IHt ^R
IHtHtHtHtHt  ! R R]4      t ! R R]4      t] ! R R4      4       t ! R R4      t R# )    )annotationsN)	dataclass)rtc)utils)LanguageCode)logger)DEFAULT_API_CONNECT_OPTIONS	NOT_GIVENAPIConnectOptions
NotGivenOr)AudioByteStream)STTRecognizeStream
SpeechDataSpeechEventSpeechEventTypec            
      v   a  ] tR t^tRRRRR]RRRR/R	 V 3R
 llltR]R]/R R lltR]R]/R R lltRt	V ;t
# )MultiSpeakerAdapterdetect_primary_speakerTsuppress_background_speakerFprimary_detection_optionsprimary_format{text}background_formatc               0    V ^8  d   QhRRRRRRRRRR	R
R	/# )   sttr   r   boolr   r   *NotGivenOr[PrimarySpeakerDetectionOptions]r   strr    )formats   "}/Users/mitch_tango/dev/rabbit-r1-livekit/agent/.venv/lib/python3.14/site-packages/livekit/agents/stt/multi_speaker_adapter.py__annotate__ MultiSpeakerAdapter.__annotate__   sI     %4 %4 %4 !%	%4
 &*%4 $N%4 %4 %4    c                  < VP                   P                  '       g   \        R4      h\        SV `  VP                   R7       Wn        W n        W0n        T;'       g    \        4       V n	        WPn
        W`n        R# )a  MultiSpeakerAdapter is an adapter that allows to detect and suppress background speakers.
It needs STT with diarization capability and works for a single audio track.

Args:
    stt (STT): STT instance to wrap
    detect_primary_speaker (bool, optional): Whether to detect primary speaker. Defaults to True.
    suppress_background_speaker (bool, optional): Whether to suppress background speaker. Defaults to False.
    primary_detection_options (NotGivenOr[PrimarySpeakerDetectionOptions], optional): Primary speaker detection options.
        If not provided, the default options will be used.
    primary_format (str, optional): Format for primary speaker.
        Supports {text} and {speaker_id} placeholders. Defaults to "{text}".
    background_format (str, optional): Format for background speaker.
        Supports {text} and {speaker_id} placeholders. Defaults to "{text}".

Raises:
    ValueError: If the STT does not support diarization.
z9MultiSpeakerAdapter needs STT with diarization capability)capabilitiesN)r(   diarization
ValueErrorsuper__init___stt_detect_primary_suppress_backgroundPrimarySpeakerDetectionOptions_opt_primary_format_background_format)selfr   r   r   r   r   r   	__class__s   &$$$$$$r#   r,   MultiSpeakerAdapter.__init__   si    6 +++XYYc&6&67	5$?!-QQ1O1Q	-"3r&   languageconn_optionsc               (    V ^8  d   QhRRRRRRRR/# )	r   bufferzutils.AudioBufferr7   NotGivenOr[str]r8   r   returnr   r!   )r"   s   "r#   r$   r%   ;   s8     _ _!_ "	_
 (_ 
_r&   c               	X   "   V P                   P                  WVR 7      G Rj  xL
 #  L5i)r7   r8   N)r-   	recognize)r4   r:   r7   r8   s   &&$$r#   _recognize_impl#MultiSpeakerAdapter._recognize_impl;   s(      YY((Q](^^^^s   !*(*c               $    V ^8  d   QhRRRRRR/# )r   r7   r;   r8   r   r<   r   r!   )r"   s   "r#   r$   r%   D   s*     
 
 "
 (	

 

r&   c               	0    \        W P                  WR 7      # ))r   wrapped_sttr7   r8   )MultiSpeakerAdapterWrapperr-   )r4   r7   r8   s   &$$r#   streamMultiSpeakerAdapter.streamD   s     *))h
 	
r&   )r3   r.   r1   r2   r-   r/   )__name__
__module____qualname____firstlineno__r
   r,   r	   r@   rF   __static_attributes____classcell__r5   s   @r#   r   r      s~    %4 (,	%4
 -2%4 QZ%4 '%4 "*%4 %4N_ %.	_
 +F_
 %.
 +F	
 
r&   r   c                  :   a  ] tR t^OtR V 3R lltR R ltRtV ;t# )rE   c               (    V ^8  d   QhRRRRRRRR/# )	r   r   r   rD   r   r7   r;   r8   r   r!   )r"   s   "r#   r$   'MultiSpeakerAdapterWrapper.__annotate__P   s2     
 
 
 	

 "
 (
r&   c               	   < \         SV `  WR 7       W n        W0n        \	        VP
                  VP                  VP                  VP                  VP                  R7      V n
        R# ))r   r8   )r   r   r   r   r   N)r+   r,   _wrapped_stt	_language_PrimarySpeakerDetectorr.   r/   r1   r2   r3   	_detector)r4   r   rD   r7   r8   r5   s   &&$$$r#   r,   #MultiSpeakerAdapterWrapper.__init__P   sW     	S<'!0#&#6#6(+(@(@&)hh..!44
r&   c                   V ^8  d   QhRR/# )r   r<   Noner!   )r"   s   "r#   r$   rQ   d   s     (" ("D ("r&   c                	Z  a "   R  V 3R llpR V 3R llpS P                   P                  S P                  S P                  R7      p\        P
                  ! V! V4      RR7      \        P
                  ! V! V4      RR7      .p \        P                  ! V!  G Rj  xL
  \        P                  P                  ! V!  G Rj  xL
  VP                  4       G Rj  xL
  R#  LD L  L
  \        P                  P                  ! T!  G Rj  xL 
  TP                  4       G Rj  xL 
  i ; i5i)	c                    V ^8  d   QhRRRR/# r   rF   r   r<   rY   r!   )r"   s   "r#   r$   5MultiSpeakerAdapterWrapper._run.<locals>.__annotate__e   s     		# 		# 		#T 		#r&   c                  <"   SP                     R j  xL
  p\        V\        P                  4      '       d/   V P	                  V4       SP
                  P                  V4       KX  \        VSP                  4      '       g   Kv  V P                  4        K   LD\        P                  ! \        4      ;_uu_ 4        T P                  4        R R R 4       R #   + '       g   i     R # ; i5iN)	_input_ch
isinstancer   
AudioFrame
push_framerV   
push_audio_FlushSentinelflush
contextlibsuppressRuntimeError	end_input)rF   framer4   s   & r#   _forward_input7MultiSpeakerAdapterWrapper._run.<locals>._forward_inpute   s     #~~ # #eeS^^44%%e,NN--e4t':':;;LLN#~ $$\22  " 3222sD   C,BBBA)C,C,B#C,=C
C,C)	#	C,c                    V ^8  d   QhRRRR/# r\   r!   )r"   s   "r#   r$   r]   p   s     	 	/ 	d 	r&   c                ~  <"   V   R j  xL
  pSP                   P                  V4      pVe   SP                  P                  V4       KF  VP                  \
        P                  8X  g   Kg  SP                  P                  \        \
        P                  \        \        R4      RR7      .R7      4       K   LDR # 5i)N )r7   text)typealternatives)
rV   on_stt_event	_event_chsend_nowaitrr   r   FINAL_TRANSCRIPTr   r   r   )rF   ev
updated_evr4   s   &  r#   _forward_output8MultiSpeakerAdapterWrapper._run.<locals>._forward_outputp   s     "  b!^^88<
)NN..z:WW @ @@NN..#!0!A!A*4l2>NUW*X)YFs-   B=B:B8B:AB=-AB=8B::B=r>   z'DiarizationAdapterWrapper.forward_input)namez(DiarizationAdapterWrapper.forward_outputN)rS   rF   rT   _conn_optionsasynciocreate_taskgatherr   aiocancel_and_waitaclose)r4   rl   rz   rF   taskss   f    r#   _runMultiSpeakerAdapterWrapper._rund   s     		# 		#	 	 ""))4>>PTPbPb)cv&-V '.X	
	"..%((())++U333--/!! )3! ))++U333--/!!sl   B D+C& C C&  !D+C"D+C$D+ C& "D+$D+&"D(D	D(!D$"D((D+)rV   rT   rS   )rH   rI   rJ   rK   r,   r   rL   rM   rN   s   @r#   rE   rE   O   s    
 
((" ("r&   rE   c                      ] tR t^t$ Rt^dtR]R&    RtR]R&    ^tR]R&    Rt	R]R	&    R
t
R]R&    ^<tR]R&    RtR]R&   RtR# )r0   z+Configuration for primary speaker detectionintframe_size_msg      ^@floatrms_buffer_durationmin_rms_samplesg      ?rms_smoothing_factorg?threshold_multiplierdecay_to_equal_timethreshold_min_multiplierr!   N)rH   rI   rJ   rK   __doc__r   __annotations__r   r   r   r   r   r   rL   r!   r&   r#   r0   r0      sg    5M3(!&&#OS7"%%%] #&%%Z!##N&)e)Pr&   r0   c            
          ] tR t^t] ! R R4      4       tRRRRR]RR	R
R	/R R lltR R ltR R lt	R R lt
R R ltR R ltRtR# )rU   c                  >    ] tR t^t$ R]R&   RtR]R&   RtR]R&   RtR# )	#_PrimarySpeakerDetector.SpeakerDatar    
speaker_id        r   last_activity_timermsr!   N)rH   rI   rJ   rK   r   r   r   rL   r!   r&   r#   SpeakerDatar      s    $'E'Ur&   r   r   Tr   Fr   r   r   r   c          
     ,    V ^8  d   QhRRRRRRRRRR/# )	r   r   r   r   r   r   r   r    r   r!   )r"   s   "r#   r$   $_PrimarySpeakerDetector.__annotate__   sF     (S (S !%(S &*	(S
 $N(S (S (Sr&   c                  W@n         WPn        Wn        W n        T;'       g    \	        4       V n        V P                  '       d0   V P                  '       g   \        P                  ! R4       RV n        RV n        RV n	        / V n
        RV n        . V n        V P
                  P                  R,          V n        \        V P
                  P                   V P                  ,          4      V n        R# )a  Primary speaker detector. It detects the primary speaker based on RMS,
formats the primary and background speakers separately, or suppresses the background speaker.

Args:
    detect_primary_speaker (bool, optional): Whether to detect primary speaker. Defaults to True.
    suppress_background_speaker (bool, optional): Whether to suppress background speaker. Defaults to False.
    primary_detection_options (PrimaryDetectionOptions, optional): Primary speaker detection options.
    primary_format (str, optional): Format for primary speaker.
        Supports {text} and {speaker_id} placeholders. Defaults to "{text}".
    background_format (str, optional): Format for background speaker.
        Supports {text} and {speaker_id} placeholders. Defaults to "{text}".
zVSuppressing background speaker is not supported when `detect_primary_speaker` is FalseFr   Ni  )r2   r3   r.   r/   r0   r1   r   warning_pushed_duration_primary_speaker_speaker_data_bstream_rms_bufferr   _frame_sizer   r   _max_rms_size)r4   r   r   r   r   r   s   &$$$$$r#   r,    _PrimarySpeakerDetector.__init__   s    *  ."35$?!-QQ1O1Q	$$$T-A-A-ANNh ).D%'*,0MO04(*9922T9 !>!>AQAQ!QRr&   c                    V ^8  d   QhRRRR/# )r   rk   rtc.AudioFramer<   rY   r!   )r"   s   "r#   r$   r      s     G G G4 Gr&   c                	   V P                   '       g&   V ;P                  VP                  ,          un        R # V P                  '       ge   \	        VP
                  V P                  ,          4      p\        VP
                  VP                  VR7      V n        W!P
                  ,          V n        V P                  P                  VP                  4       FR  pV P                  V4      pV P                  P                  V4       V ;P                  VP                  ,          un        KT  	  \        V P                  4      V P                  8  d"   V P                  V P                  ) R  V n        R # R # )N)sample_ratenum_channelssamples_per_channel)r.   r   durationr   r   r   r   r   r   pushdata_compute_rmsr   appendlenr   )r4   rk   sample_per_channelfr   s   &&   r#   rd   "_PrimarySpeakerDetector.push_audio   s   ###!!U^^3!}}}!$U%6%69I9I%I!J+!--"//$6DM
  24E4EED##EJJ/A##A&C##C(!!QZZ/! 0
 t 4#5#55#//1C1C0C0EFD 6r&   c                    V ^8  d   QhRRRR/# )r   rx   r   r<   zSpeechEvent | Noner!   )r"   s   "r#   r$   r      s      { /A r&   c                	T   VP                   '       g   V# VP                   ^ ,          pVP                  \        P                  8X  d   V P	                  V4       VP
                  e   V P                  f   V# VP
                  V P                  8H  Vn        VP                  '       d9   V P                  P                  VP                  VP
                  R7      Vn
        V# V P                  '       d   R# V P                  P                  VP                  VP
                  R7      Vn
        V# )r   N)rq   r   )rs   rr   r   rw   _update_primary_speakerr   r   is_primary_speakerr2   r"   rq   r/   r3   )r4   rx   sds   && r#   rt   $_PrimarySpeakerDetector.on_stt_event   s    I__Q77o666((,== D$9$9$AI "1F1F F    **11rww2==1YBG 		 (((--44"''bmm4\BG	r&   c                    V ^8  d   QhRRRR/# )r   rk   r   r<   r   r!   )r"   s   "r#   r$   r     s      . U r&   c                	8   \         P                  ! VP                  \         P                  R 7      p\	        V4      ^ 8X  d   R# \         P
                  ! \         P                  ! VP                  \         P                  4      ^,          4      4      p\        V4      # ))dtyper   )
np
frombufferr   int16r   sqrtmeanastypefloat32r   )r4   rk   
audio_datar   s   &&  r#   r   $_PrimarySpeakerDetector._compute_rms  s^    ]]5::RXX>
z?aggbggj//

;q@ABSzr&   c               $    V ^8  d   QhRRRRRR/# )r   
start_timer   end_timer<   zfloat | Noner!   )r"   s   "r#   r$   r     s!     = = =% =L =r&   c                	V   V P                   '       g   R # \        V P                  V,
          V P                  ,          4      p\        V P                  V,
          V P                  ,          4      p\	        V P                   4      V,
          ^,
          p\	        V P                   4      V,
          pV^ 8  g   V\	        V P                   4      8  d   R # \        V^ 4      pWC,
          V P                  P                  8  d   R # \        \        P                  ! V P                   W4 4      4      # r_   )r   r   r   r   r   maxr1   r   r   r   median)r4   r   r   startends   &&&  r#   _get_rms_for_timerange._PrimarySpeakerDetector._get_rms_for_timerange  s    T**Z74;K;KKL4((83t7G7GGHD$$%-1$""#c)7es4#3#344E1;222RYYt//:;<<r&   c                    V ^8  d   QhRRRR/# )r   r   r   r<   rY   r!   )r"   s   "r#   r$   r     s     >C >C* >C >Cr&   c           
     	8   VP                   e   V P                  '       g
   R V n        R # V P                  VP                  VP
                  4      pVf   R # VP                   pV P                  P                  V4      ;p'       dh   VP
                  Vn        VP                  V P                  P                  ,          V^V P                  P                  ,
          ,          ,           Vn	        M/\        P                  VVP
                  VR7      V P                  V&   V P                  V8X  d   R # V P                  e*   V P                  P                  V P                  4      ;pf%   W0n        \        P                  ! RRVRV/R7       R # V P                   VP                  ,
          pV P                  P"                  R8  d:   V P                  P"                  R,
          V P                  P$                  ,          pMRp\'        V P                  P"                  Wv,          ,
          V P                  P(                  4      pVP                  V,          p	RVRVRV	R	VR
V/p
W)8  d!   W0n        \        P                  ! RV
R7       R # \        P                  ! RV
R7       R # )N)r   r   r   zset first primary speakerr   r   )extrag      ?r   rms_thresholdsilence_duration
multiplierzprimary speaker switchedzprimary speaker unchanged)r   r.   r   r   r   r   r   getr   r   r1   r   rU   r   r   debugr   r   r   r   r   )r4   r   r   r   r   primaryr   
decay_rater   r   r   s   &&         r#   r   /_PrimarySpeakerDetector._update_primary_speaker  s#   == (<(<(<$(D!))"--E; ]]
%%))*5545&(kkD#xx$))"@"@@3DII222D DH .E-P-P%#%;; .Q .Dz*   J. !!)--11$2G2GHHQ$.!LL4\:W\^a<bc0073M3MM 99))C/))883>$))B_B__JJII**j.KLII..

  j0*3] 0*
 $.!LL35ALL4EBr&   )r3   r   r.   r   r   r1   r2   r   r   r   r   r/   N)rH   rI   rJ   rK   r   r   r
   r,   rd   rt   r   r   r   rL   r!   r&   r#   rU   rU      sz      
(S (,(S -2	(S
 QZ(S '(S "*(STG,.=$>C >Cr&   rU   )!
__future__r   r~   rg   dataclassesr   numpyr   livekitr   rp   r   r7   r   logr   typesr	   r
   r   r   utils.audior   r   r   r   r   r   r   r   rE   r0   rU   r!   r&   r#   <module>r      ss    "   !    #  Y Y ) O O9
# 9
x=" ="@ Q Q Q*vC vCr&   