+
    ~j                    "   ^ RI Ht ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	H
t
 ^ RIHt ^ RIHtHtHt ^ RIHt ^ RIHt ^ R	IHt ^R
IHtHtHtHtHtHt ^RIHt ^RI H!t!H"t"H#t#H$t$ ^RI%H&t& ^RI'H(t( ^RIH)t) ^RI*H+t+H,t, ^RI-H.t.H/t/ ^RIH0t0H1t1 ^RIH2t2 ^RI3H4t4 ^RI5H6t6 ^RI7H8t8 ^RI9H:t: ]'       d   ^RI;H<t< ^t=^t>] ! R R4      4       t?] ! R R4      4       t@] ! R R4      4       tA ! R R ]4      tB ! R! R"4      tC ! R# R$4      tDR# )%    )annotationsN)deque)AsyncIterableCallable)	dataclass)TYPE_CHECKINGAnyProtocol)trace)ReadableSpan)rtc)	inferencellmstttokenizeutilsvad)APIError)_AgentSpeechEndedSentinel_AgentSpeechStartedSentinel_OverlapSpeechEndedSentinel_OverlapSpeechStartedSentinel)LanguageCodelogger)SpeechEvent)trace_typestracer)	NOT_GIVEN
NotGivenOr)aiois_given)io)_set_participant_attributes)BaseEndpointing)UserTurnExceededEvent)TurnDetectionMode)AgentSessionc                  `    ] tR t^-t$ R]R&    R]R&   R]R&   R]R&   R]R	&   R]R
&   R]R&   RtR# )_EndOfTurnInfobool
skip_replystrnew_transcriptfloattranscript_confidencefloat | Nonestarted_speaking_atstopped_speaking_attranscription_delayend_of_turn_delay N__name__
__module____qualname____firstlineno____annotations____static_attributes__r6       {/Users/mitch_tango/dev/rabbit-r1-livekit/agent/.venv/lib/python3.14/site-packages/livekit/agents/voice/audio_recognition.pyr*   r*   -   s1    c   &%%%%%##r>   r*   c                  6    ] tR t^;t$ R]R&   R]R&   R]R&   RtR# )	_PreemptiveGenerationInfor-   r.   r/   r0   r1   r2   r6   Nr7   r6   r>   r?   rA   rA   ;   s      %%r>   rA   c                  B    ] tR t^Bt$ ^ tR]R&   RtR]R&   RtR]R&   R	tR# )
_UserTurnTrackerintwords r-   
transcriptNr1   
started_atr6   )	r8   r9   r:   r;   rE   r<   rG   rH   r=   r6   r>   r?   rC   rC   B   s    E3NJ#J#r>   rC   c                      ] tR t^ItR R ltR R ltR R ltR R ltR	 R
 ltRR/R R llt	R R lt
R R ltR R ltR R ltRtR# )RecognitionHooksc                    V ^8  d   QhRRRR/#    evz inference.OverlappingSpeechEventreturnNoner6   )formats   "r?   __annotate__RecognitionHooks.__annotate__J   s    PP"BPtPr>   c                	    R # Nr6   selfrN   s   &&r?   on_interruption RecognitionHooks.on_interruptionJ   s    Sr>   c               $    V ^8  d   QhRRRRRR/# )rM   rN   vad.VADEvent | Nonespeech_start_timer/   rO   rP   r6   )rQ   s   "r?   rR   rS   K   s    ``%8`U`W[`r>   c                	    R # rU   r6   )rW   rN   r\   s   &&&r?   on_start_of_speech#RecognitionHooks.on_start_of_speechK   s    ]`r>   c                    V ^8  d   QhRRRR/# rM   rN   zvad.VADEventrO   rP   r6   )rQ   s   "r?   rR   rS   L   s    BBBBr>   c                	    R # rU   r6   rV   s   &&r?   on_vad_inference_done&RecognitionHooks.on_vad_inference_doneL   s    sr>   c                    V ^8  d   QhRRRR/# )rM   rN   r[   rO   rP   r6   )rQ   s   "r?   rR   rS   M   s    DD#6D4Dr>   c                	    R # rU   r6   rV   s   &&r?   on_end_of_speech!RecognitionHooks.on_end_of_speechM   s    r>   c               $    V ^8  d   QhRRRRRR/# rM   rN   stt.SpeechEventspeakingzbool | NonerO   rP   r6   )rQ   s   "r?   rR   rS   N   s    ___k_VZ_r>   c               	    R # rU   r6   rW   rN   rl   s   &&$r?   on_interim_transcript&RecognitionHooks.on_interim_transcriptN   s    \_r>   rl   Nc               $    V ^8  d   QhRRRRRR/# rj   r6   )rQ   s   "r?   rR   rS   O   s    ddodKd[_dr>   c               	    R # rU   r6   rn   s   &&$r?   on_final_transcript$RecognitionHooks.on_final_transcriptO   s    adr>   c                    V ^8  d   QhRRRR/# )rM   infor*   rO   r+   r6   )rQ   s   "r?   rR   rS   P   s    ??>?d?r>   c                	    R # rU   r6   rW   rv   s   &&r?   on_end_of_turnRecognitionHooks.on_end_of_turnP   s    Cr>   c                    V ^8  d   QhRRRR/# )rM   rv   rA   rO   rP   r6   )rQ   s   "r?   rR   rS   Q   s    TT-FT4Tr>   c                	    R # rU   r6   rx   s   &&r?   on_preemptive_generation)RecognitionHooks.on_preemptive_generationQ   s    QTr>   c                    V ^8  d   QhRRRR/# )rM   rN   r&   rO   rP   r6   )rQ   s   "r?   rR   rS   R   s    KK(=K$Kr>   c                	    R # rU   r6   rV   s   &&r?   on_user_turn_exceeded&RecognitionHooks.on_user_turn_exceededR   s    r>   c                   V ^8  d   QhRR/# )rM   rO   llm.ChatContextr6   )rQ   s   "r?   rR   rS   S   s    77?7r>   c                	    R # rU   r6   rW   s   &r?   retrieve_chat_ctx"RecognitionHooks.retrieve_chat_ctxS   s    Cr>   r6   )r8   r9   r:   r;   rX   r^   rc   rg   ro   rs   ry   r}   r   r   r=   r6   r>   r?   rJ   rJ   I   s)    P`BD_dRVd?TK77r>   rJ   c                      ] tR t^VtRtR R lt]R R l4       t]R R l4       t]	P                  ! ]R7      R	 R
 l4       tR R ltRtR# )_STTPipelineu   Transferable STT pipeline that survives agent handoff.

The pump task iterates the STT generator and forwards events into event_ch.
It is never cancelled during handoff — only the consumer is swapped.
c                    V ^8  d   QhRRRR/# )rM   stt_nodez
io.STTNoderO   rP   r6   )rQ   s   "r?   rR   _STTPipeline.__annotate__]   s     L L L Lr>   c                	b  a  VS n         \        P                  \        P                  ,          ! 4       S n        \        P                  \        P                  ,          ! 4       S n        \        P                  ! S P                  4       4      S n        S P                  P                  V 3R  l4       R# )c                8   < SP                   P                  4       # rU   )	_event_chclose)_rW   s   &r?   <lambda>'_STTPipeline.__init__.<locals>.<lambda>b   s    DNN4H4H4Jr>   N)	_stt_noder!   Chanr   
AudioFrame	_audio_chr   r   r   asynciocreate_task	_stt_pump
_pump_taskadd_done_callback)rW   r   s   f&r?   __init___STTPipeline.__init__]   sd    !#..13#//24!--dnn.>?))*JKr>   c                   V ^8  d   QhRR/# )rM   rO   zaio.Chan[rtc.AudioFrame]r6   )rQ   s   "r?   rR   r   e   s      2 r>   c                	    V P                   # rU   )r   r   s   &r?   audio_ch_STTPipeline.audio_chd       ~~r>   c                   V ^8  d   QhRR/# )rM   rO   aio.Chan[stt.SpeechEvent]r6   )rQ   s   "r?   rR   r   i   s      3 r>   c                	    V P                   # rU   )r   r   s   &r?   event_ch_STTPipeline.event_chh   r   r>   r   c                   V ^8  d   QhRR/# rM   rO   rP   r6   )rQ   s   "r?   rR   r   m   s     / / /r>   c                  "   ^RI Hp V P                  V P                  V! 4       4      p\        P
                  ! V4      '       d   VG Rj  xL
 pVf   R# \        V\        4      '       d]   V  Rj  xL
  p\        V\        P                  4      '       g   Q R\        V4       24       hV P                  P                  V4       KZ  R#  L~ LYDZR# 5i)u   Iterate the STT generator and forward events into *event_ch*.

This task owns the generator lifecycle and is never cancelled during
handoff — only the consumer is swapped.
)ModelSettingsNz&STT node must yield SpeechEvent, got: )agentr   r   r   r   iscoroutine
isinstancer   r   r   typer   send_nowait)rW   r   noderN   s   &   r?   r   _STTPipeline._stt_pumpl   s      	)~~dnnmo>t$$:D<dM**  / /b!"coo66 <T"XJG6 **2. + /Ds7   A	CC
"C.C2C3C6ACCCc                   V ^8  d   QhRR/# r   r6   )rQ   s   "r?   rR   r      s     3 3d 3r>   c                	b   "   \         P                  ! V P                  4      G R j  xL
  R #  L5irU   )r!   cancel_and_waitr   r   s   &r?   aclose_STTPipeline.aclose   s     !!$//222s   $/-/)r   r   r   r   N)r8   r9   r:   r;   __doc__r   propertyr   r   r   log_exceptionsr   r   r   r=   r6   r>   r?   r   r   V   s^    L     (/ )/,3 3r>   r   c                     ] tR t^tRRRR/R R lltR]R]R]R	]/R
 R lltRR/R R lltR R lt]	R R l4       t
]	R R l4       tR R ltR R ltR R ltR R ltRUR R lltR]3R R  lltRVR! R" llt]P(                  ! ]R#7      RWR% R& ll4       tR' R( ltR) R* ltR+R$/R, R- lltR. R/ ltR0R/R1 R2 lltR3 R4 ltR5 R6 ltR7 R8 ltR9 R: ltR;R<R=R$/R> R? llt ]	R@ RA l4       t!RB RC lt"]P(                  ! ]R#7      RD RE l4       t#RF RG lt$RWRH RI llt%RJ RK lt&]P(                  ! ]R#7      RL RM l4       t']P(                  ! ]R#7      RN RO l4       t(]P(                  ! ]R#7      RP RQ l4       t)RVRR RS llt*RTt+R# )XAudioRecognition	stt_modelNstt_providerc               @    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/
# )rM   sessionr(   hooksrJ   endpointingr%   r   io.STTNode | Noner   vad.VAD | Noneinterruption_detection-inference.AdaptiveInterruptionDetector | Noneturn_detectionzTurnDetectionMode | Noner   z
str | Noner   rO   rP   r6   )rQ   s   "r?   rR   AudioRecognition.__annotate__   s{     V> V>V>  	V>
 %V> V> V> !NV> 1V> V> !V> 
V>r>   c               	   Wn         W n        R V n        R V n        R V n        R V n        R V n        W0n        \        V\        4      '       g   TMR V n
        W@n        WPn        Wn        Wn        \        V\        4      '       d   TMR V n        V P                  R9   V n        RV n        R V n        RV n        R V n        R V n        R V n        \.        P0                  ! 4       V n        . V n        RV n        RV n        RV n        R V n        R V n        R V n         \C        4       V n"        R V n#        W`n$        R V n%        R V n&        \N        V n(        \S        4       V n*        VR J;'       d    VR JV n+        RV n,        VPZ                  P\                  P_                  R4      p
\        V
\`        \b        ,          4      '       d   W3MT
V n2        V Pd                  '       dt   \g        V Pd                  4      ^8w  gO   \h        ;QJ d&    R V Pd                   4       F  '       g   K   RM	  RM! R V Pd                   4       4      '       d   \k        R4      hR V n6        R V n7        R V n8        R V n9        . V n:        \.        P0                  ! 4       V n;        RV n<        \{        4       V n>        \~        P                  P                  4       V nB        R # )NFrF   backchannel_boundaryc              3  *   "   T F	  qR 8  x  K  	  R# 5i        Nr6   ).0xs   & r?   	<genexpr>,AudioRecognition.__init__.<locals>.<genexpr>   s     7dIcACIcs   Tz?backchannel_boundary must be a tuple of two non-negative floatsr   N)C_session_hooks_audio_input_atask_commit_user_turn_atask_stt_consumer_atask
_vad_atask_end_of_turn_task_endpointingr   r-   _turn_detector_stt_vad
_stt_model_stt_provider_turn_detection_mode_vad_base_turn_detection_user_turn_committed_sample_rate	_speaking_last_final_transcript_time_last_speaking_time_speech_start_timer   Event_final_transcript_received_final_transcript_confidence_audio_transcript_audio_interim_transcript_audio_preflight_transcript_last_language_stt_pipeline_vad_chset_tasks_interruption_atask_interruption_detection_interruption_ch_input_started_atr   _ignore_user_transcript_untilr   _transcript_buffer_interruption_enabled_agent_speakingoptionsinterruptiongetrD   r/   _backchannel_boundarylenany
ValueError_backchannel_boundary_timerbackchannel_boundary_callback_user_turn_span_user_turn_start_stt_request_ids_closing_vad_speech_startedrC   _turn_trackerr   basicWordTokenizer_word_tokenizer)rW   r   r   r   r   r   r   r   r   r   r   s   &&$$$$$$$$ r?   r   AudioRecognition.__init__   si     =ABF$>B 59<@-84>~s4S4SnY]		#)6@QT6U6UN[_!(,(A(A](R%$)!(,9=(15 04 +2--/'9;)!#)+&+-(37268<.1e ?C '=$VZ/3@I*6;g+A+M+a+aRU]aRa"%* OO((,,-CD 	
 /u== #:& 	"
 %%%**+q0CC7dIcIc7dCCC7dIcIc7d4d4d^__GK(HL* 37.2+-).  ./'~~;;=r>   r   r   min_endpointing_delaymax_endpointing_delayc          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
rM   r   zNotGivenOr[BaseEndpointing]r   z$NotGivenOr[TurnDetectionMode | None]r  zNotGivenOr[float]r  rO   rP   r6   )rQ   s   "r?   rR   r      s>     6 6 16 =	6  16  16 
6r>   c               	&   \        V4      '       d   Wn        \        V4      '       d   \        V\        4      '       g   TMR V n        \        V\        4      '       d   TMR pV P
                  V8w  d   V P
                  pWPn        V P
                  R9   V n        V P
                  R8X  g   VR8X  d]   V P                  '       d;   V P                  P                  4       '       g   V P                  P                  4        R V n        RV n
        R # R # R # R # )NmanualFr   )r"   r   r   r-   r   r   r   r   donecancelr   )rW   r   r   r  r  modeprevious_modes   &$$$$  r?   update_optionsAudioRecognition.update_options   s     K   +N##8B>SV8W8W.]aD%/%D%D>$D((D0 $ 9 9,0)040I0I]0Z-,,8MX<U---#55::<< 2299;-1D*05D- =V 1	 $r>   stt_pipelinec                    V ^8  d   QhRRRR/# )rM   r  _STTPipeline | NonerO   rP   r6   )rQ   s   "r?   rR   r      s     I I%8 ID Ir>   c               	    V P                  V P                  VR 7       V P                  V P                  4       V P	                  V P
                  4       R# ))pipelineN)
update_sttr   
update_vadr   update_interruption_detectionr   )rW   r  s   &$r?   startAudioRecognition.start   s:    		L9		"**4+G+GHr>   c                   V ^8  d   QhRR/# r   r6   )rQ   s   "r?   rR   r     s     1 1d 1r>   c                	l    V P                  R 4       V P                  R 4       V P                  R 4       R # rU   )r   r!  r"  r   s   &r?   stopAudioRecognition.stop  s(    **40r>   c                   V ^8  d   QhRR/# rM   rO   r+   r6   )rQ   s   "r?   rR   r     s     
 
d 
r>   c                	    V P                   ;'       d2    V P                  R J;'       d    V P                  P                  '       * # rU   )r   r   closedr   s   &r?   adaptive_interruption_active-AudioRecognition.adaptive_interruption_active  sF     && 1 1%%T11 1))000	
r>   c                   V ^8  d   QhRR/# r*  r6   )rQ   s   "r?   rR   r     s     < <T <r>   c                	    V P                   R J# rU   )r  r   s   &r?   backchannel_boundary_active,AudioRecognition.backchannel_boundary_active  s    //t;;r>   c                   V ^8  d   QhRR/# r   r6   )rQ   s   "r?   rR   r     s      t r>   c                	T    R V n         V P                  R uqn        Ve
   V! 4        R # R # rU   )r  r  )rW   cbs   & r?   _on_backchannel_boundary_done.AudioRecognition._on_backchannel_boundary_done  s1    +/(.. 	/. >D r>   c                   V ^8  d   QhRR/# r   r6   )rQ   s   "r?   rR   r     s     2 2d 2r>   c                	r    V P                   e"   V P                   P                  4        R V n         R V n        R # rU   )r  r  r  r   s   &r?   _cancel_backchannel_boundary-AudioRecognition._cancel_backchannel_boundary  s0    ++7,,335/3D,-1*r>   c                    V ^8  d   QhRRRR/# )rM   rH   r/   rO   rP   r6   )rQ   s   "r?   rR   r   %  s     M M5 MT Mr>   c                	   R V n         V P                  P                  VR7       \        4       V n        V P
                  '       d^   V P
                  ^ ,          ;p^ 8  dD   V P                  4        \        P                  ! 4       P                  W P                  4      V n        V P                  '       d&   V P                  P                  \        4       4       R# R# )T)rH   N)r   r   on_start_of_agent_speechrC   r  r   r:  r   get_running_loop
call_laterr6  r  r-  r   r   r   )rW   rH   start_cooldowns   && r?   r>  )AudioRecognition.on_start_of_agent_speech%  s    #22j2I ./%%%T=W=WXY=Z+Z>^_*_--//6/G/G/I/T/T B B0D, ,,,!!--.I.KL -r>   c                    V ^8  d   QhRRRR/# )rM   ignore_user_transcript_untilr/   rO   rP   r6   )rQ   s   "r?   rR   r   5  s     (% (%e (%PT (%r>   c               	  a a S P                  4        S P                  '       d0   S P                  P                  \        P                  ! 4       R 7       S P
                  '       g
   RS n        R# S P                  P                  \        4       4       S P                  '       Ed   \        S P                  4      '       g&   S P                  \        P                  ! 4       R 7       S P                  '       d   S P                  ^,          MRp\        S P                  4      '       g   TM\        VS P                  4      p\        P                  ! RRVRV/R7       W2,
          S n
        \         P"                  ! S P%                  VR7      4      oSP'                  V V3R	 l4       S P(                  P+                  S4       RS n        R# )
ended_atFNr   zflushing held transcriptsignore_untilend_cooldownextracooldownc                :   < SP                   P                  S4      # rU   r   discardr   rW   tasks   &r?   r   9AudioRecognition.on_end_of_agent_speech.<locals>.<lambda>Z      T[[-@-@-Fr>   )r:  r   r   on_end_of_agent_speechtimer-  r   r   r   r"   r   on_end_of_overlap_speechr   minr   r   r   r   _flush_held_transcriptsr   r   add)rW   rD  rI  rH  rR  s   f$  @r?   rU  'AudioRecognition.on_end_of_agent_speech5  s`   ))+44diik4J000#(D ))*C*EFD>>??--tyy{-C 261K1K1K**1-QT    B BCC -5t7Y7YZ 
 LL+"L"L 2>1LD. &&t'C'C\'C'Z[D""#FGKKOOD!$r>   c               (    V ^8  d   QhRRRRRRRR/# )rM   rH   r/   speech_durationuser_speaking_spantrace.Span | NonerO   rP   r6   )rQ   s   "r?   rR   r   _  s2     
 

 
 .	

 

r>   c                	    V P                   P                  WP                  R 7       V P                  '       d   V P                  '       g   R# V P                  P                  \        VVVR7      4       R# ))rH   overlappingN)r]  r^  rH   )r   r^   r   r-  r   r   r   )rW   rH   r]  r^  s   &&&&r?   r^   #AudioRecognition.on_start_of_speech_  sg     	,,!/C/C 	- 	
 0008L8L8L))) /#5%	
r>   c               (    V ^8  d   QhRRRRRRRR/# )	rM   rG  r/   r^  r_  r   zNotGivenOr[bool]rO   rP   r6   )rQ   s   "r?   rR   r   r  s8     ` `` .` '	`
 
`r>   c                	    V P                   '       dJ   V P                  P                  T\        V4      ;'       d    V'       * ;'       d    V P                  R 7       V P                  WR7       R# ))rG  should_ignore)rG  r^  N)r   r   rg   r"   r   rW  )rW   rG  r^  r   s   &&&&r?   rg   !AudioRecognition.on_end_of_speechr  s]     >>>..!\*XX</?XXDDXDX /  	%%x%_r>   c               $    V ^8  d   QhRRRRRR/# )rM   rG  r/   r^  r_  rO   rP   r6   )rQ   s   "r?   rR   r     s(     
 

 .
 
	
r>   c                :   V P                   '       d   V P                  '       g   R# V'       d   VP                  4       '       d   \        V\        4      '       d_   VP
                  '       dL   VP
                  P                  \        P                  4      f!   VP                  \        P                  R4       M VP                  \        P                  R4       V P                  P                  \        T;'       g    \        P                  ! 4       R7      4       R# )zJEnd interruption inference when agent is speaking and overlap speech ends.NfalserF  )r-  r   is_recordingr   r   
attributesr   r   ATTR_IS_INTERRUPTIONset_attributer   r   r   rV  )rW   rG  r^  s   &&&r?   rW  )AudioRecognition.on_end_of_overlap_speech  s     0008L8L8L "4"A"A"C"C,l;;&111*5599+:Z:Z[c&44[5U5UW^_"001Q1QSZ[))'1H1HTYY[I	
r>   r   Fc               $    V ^8  d   QhRRRRRR/# )rM   rM  r/   forcer+   rO   rP   r6   )rQ   s   "r?   rR   r     s'     T) T)e T)D T)UY T)r>   c           
       "   V P                   '       g   V P                  4        R# V'       dJ   \        V P                   4      pV P                  4        V F  pV P                  V4      G Rj  xL
  K  	  R# V P                  '       d*   \        V P                  4      '       d   V P                  f   V P                  4        R# RpRp\        V P                   4       F  w  rtVP                  '       g   Ve   \        WW4      MTpK*  VP                  ^ ,          P                  VP                  ^ ,          P                  u;8X  d   ^ 8X  d   M MV P                  4         R# VP                  ^ ,          P                  ^ 8  dB   VP                  ^ ,          P                  V P                  ,           V P                  8  d   RpK  Ve   \        WW4      MTpRp M	  Ve*   V'       d"   \        V P                   4      \        V4      R M. pV P                  pV P                  4        V F  pRp	VP                  '       ds   VP                  ^ ,          P                  ^ 8  dQ   \        ^ VP                  ^ ,          P                  V P                  ,           V,
          T;'       g    R,           4      p	\        P                   ! RRVP"                  RVRV	/R	7       V P                  V4      G Rj  xL
  K  	  R#  EL L5i)
a  Flush held transcripts.

When ``force`` is True, all buffered events are emitted unconditionally; this
is used during interruption-detector teardown when the ignore-window gating
can no longer be trusted.

Otherwise, drop transcripts whose *end time* falls before
``ignore_user_transcript_until - cooldown`` and re-emit the rest. Events
without timestamps are treated as the next valid event.
NFTr   z re-emitting held user transcripteventrM  added_delayrJ  )r   _reset_interruption_detectionlist_on_stt_eventr   r"   r   r   	enumeratealternativesrX  
start_timeend_timerD   maxr   r   r   )
rW   rM  rp  events_to_emitrN   emit_from_indexshould_flushir   rs  s
   &&&       r?   rY  (AudioRecognition._flush_held_transcripts  s     &&&..0!$"9"9:N..0$((,,, % ***D>>??%%-..0&*t667EA???=L=X#o"9^_q!,,0B0K0KPqP224 "++a/OOA&//$2H2HH445 #' >M=X#o"9^_#) 80 *| (()#o*>*@A 	
 )-(J(J%**, BK2??1#5#>#>#B!*3300178  3( LL2RWW!; $$R((() !Y -@ )s=   ,K?>K?-K:.K?
EK?)B<K?&A	K?/K=0K?=K?c                   V ^8  d   QhRR/# r   r6   )rQ   s   "r?   rR   r     s     7 7t 7r>   c                P    V P                   P                  4        \        V n        R# )z:Reset relevant states for adaptive interruption detection.N)r   clearr   r   r   s   &r?   rt  .AudioRecognition._reset_interruption_detection  s    %%'-6*r>   c                    V ^8  d   QhRRRR/# )rM   rN   rk   rO   r+   r6   )rQ   s   "r?   rR   r     s     & & &T &r>   c                   V P                   '       g   R# V P                  '       d   R# VP                  \        P                  P
                  8X  d   \        V n        R# \        V P                  4      '       g   R# VP                  '       g   R# \        V P                  4      '       d   V P                  e   VP                  ^ ,          P                  VP                  ^ ,          P                  u;8X  d   ^ 8X  gd   M VP                  ^ ,          P                  ^ 8  d@   VP                  ^ ,          P                  V P                  ,           V P                  8  d   R# R# )zRTest if the event should be held until the ignore_user_transcript_until timestamp.FT)r   r   r   r   SpeechEventTypeSTART_OF_SPEECHr   r   r"   rx  r   ry  rz  rV   s   &&r?   _should_hold_stt_event'AudioRecognition._should_hold_stt_event  s    ))) 77c))9991:D.::;;  T++,,
 &&2__Q'22booa6H6Q6QVUVV"--1"--0F0FF001 r>   skip_sttc               $    V ^8  d   QhRRRRRR/# )rM   framezrtc.AudioFramer  r+   rO   rP   r6   )rQ   s   "r?   rR   r     s!     5 5 5T 5d 5r>   c               	2   V P                   f,   \        P                  ! 4       VP                  ,
          V n         VP                  V n        V'       g4   V P
                  e&   V P
                  P                  P                  V4       V P                  e   V P                  P                  V4       V P                  P                  e&   V P                  P                  P                  V4       V P                  e   V P                  P                  V4       R # R # rU   )r   rV  durationsample_rater   r   r   r   r   r   amd
push_audior   )rW   r  r  s   &&$r?   r  AudioRecognition.push_audio  s    !!)%)YY[5>>%AD"!--D..:''33E:<<#LL$$U+==(MM((/  ,!!--e4 -r>   c                   V ^8  d   QhRR/# r   r6   )rQ   s   "r?   rR   r   /  s      6  6d  6r>   c                	  "   V P                   P                  4        V P                  e    V P                  G R j  xL
  V P
                  e*   V P
                  P                  4       G R j  xL
  R V n        \        P                  ! V P                  !  G R j  xL
  V P                  e)   \        P                  ! V P                  4      G R j  xL
  V P                  e)   \        P                  ! V P                  4      G R j  xL
  V P                  e)   \        P                  ! V P                  4      G R j  xL
  V P                  e    V P                  G R j  xL
  V P                  e+   V P                  P                  4        R V n        R V n        R # R #  ELa  \        P                   d     ELwi ; i ELP EL& L L L Li  \        P                   d     L~i ; i5irU   )r	  r   r   r   CancelledErrorr   r   r!   r   r   r   r   r   r   r  r  r  r   s   &r?   r   AudioRecognition.aclose/  s    ''32222 )$$++---!%D!!4;;///##/%%d&>&>?????&%%doo666##/%%d&>&>???!!-,,,, ++7,,335/3D,15D. 83 3))  . 	0 @ 7 @ -)) s   )G$F FF  +G$+F;,,G$F>5G$G5G$G5G$:G;G$G	 GG	 ":G$F F84G$7F88G$>G$G$G$G$G	 	G!G$ G!!G$r  c               $    V ^8  d   QhRRRRRR/# )rM   r   r   r  r  rO   rP   r6   )rQ   s   "r?   rR   r   Q  s$     * */ *>Q *]a *r>   c               	&  a a VS n         Vf   Ve   \        V4      pVe   \        P                  ! S P	                  VP
                  S P                  S P                  R7      4      S n        VS n        S P                  P                  4        \        S n        R S n        R # S P                  em   \        P                  ! \        P                  ! S P                  4      4      oSP                  V V3R l4       S P                   P#                  S4       R S n        S P                  ei   \        P                  ! S P                  P%                  4       4      oSP                  V V3R l4       S P                   P#                  S4       R S n        R # R # )N)r   old_pipelineold_consumerc                :   < SP                   P                  S4      # rU   rO  rQ  s   &r?   r   -AudioRecognition.update_stt.<locals>.<lambda>f      1D1DT1Jr>   c                :   < SP                   P                  S4      # rU   rO  rQ  s   &r?   r   r  l  r  r>   )r   r   r   r   _stt_consumerr   r   r   r   r  r   r   r   r!   r   r   r   rZ  r   )rW   r   r  rR  s   f&$@r?   r   AudioRecognition.update_sttQ  s<   	#C(H'.':':""%..!%!3!3!%!9!9 # (D$ "*D##))+1:D.%)D"''3**3+>+>t?W?W+XY&&'JK%+/(!!-**4+=+=+D+D+FG&&'JK%%)"	 .r>   c                    V ^8  d   QhRRRR/# )rM   r   r   rO   rP   r6   )rQ   s   "r?   rR   r   p  s     
 
n 
 
r>   c                	\  a a VS n         V'       dq   \        P                  \        P                  ,          ! 4       S n        \        P                  ! S P                  VS P
                  S P                  4      4      S n	        MS P                  et   \        P                  ! \        P                  ! S P                  4      4      oSP                  V V3R l4       S P                  P                  S4       R S n	        R S n        S P                  R J;'       d    S P                   R JS n        R # )Nc                :   < SP                   P                  S4      # rU   rO  rQ  s   &r?   r   -AudioRecognition.update_vad.<locals>.<lambda>y  rT  r>   )r   r!   r   r   r   r   r   r   	_vad_taskr   r   r   r   rZ  r   r   )rW   r   rR  s   f&@r?   r!  AudioRecognition.update_vadp  s    	88CNN35DL%11sDLL$//BDO __(&&s':':4??'KLD""#FGKKOOD!"DODL ((4NN$9N 	"r>   c                   V ^8  d   QhRR/# )rM   rO   r  r6   )rQ   s   "r?   rR   r     s      "5 r>   c                   "   V P                   pRV n         V P                  e0   \        P                  ! V P                  4      G Rj  xL
  RV n        V#  L5i)zDetach the STT pipeline for handoff to another AudioRecognition.

Returns the pipeline (pump task + channels) without stopping it.
The caller is responsible for passing it to the new AudioRecognition
via start(..., stt_pipeline=pipeline).
N)r   r   r!   r   )rW   r  s   & r?   
detach_sttAudioRecognition.detach_stt  sU      %%! ##/%%d&>&>???'+D$ @s   AAAAc                    V ^8  d   QhRRRR/# )rM   r   r   rO   rP   r6   )rQ   s   "r?   rR   r     s     
 
&S
	
r>   c                	~  a aa VS n         Ve   \        P                  \        P                  ,          ! 4       S n        \        P                  ! S P                  VS P
                  S P                  4      4      S n	        S P                  P                  4        \        S n        R S n        MS P                  e   \        P                  ! \        P                  ! S P                  4      4      oSP!                  V V3R l4       S P"                  P%                  S4       R S n	        R S n        S P'                  4        \        P                  ! S P)                  RRR7      4      oSP!                  VV 3R l4       S P"                  P%                  S4       S P                   R J;'       d    S P*                  R JS n        R # )Nc                :   < SP                   P                  S4      # rU   rO  rQ  s   &r?   r   @AudioRecognition.update_interruption_detection.<locals>.<lambda>  rT  r>   r   T)rM  rp  c                :   < SP                   P                  S4      # rU   rO  )r   
flush_taskrW   s   &r?   r   r    s    4;;3F3Fz3Rr>   )r   r!   r   r   InterruptionDataFrameTyper   r   r   _interruption_taskr   r   r  r   r   r   r   r   r   rZ  r:  rY  r   r   )rW   r   r  rR  s   f&@@r?   r"  .AudioRecognition.update_interruption_detection  sW    (>$!-$'HHY-P-P$Q$SD!'.':':''*D,A,A4C[C[(D$
 ##))+1:D.%)D"%%1&&s':':4;S;S'TUD""#FGKKOOD!'+D$$(D!--/ ,,T-I-ISV^b-I-cdJ(()RSKKOOJ' ((4NN$9N 	"r>   c                   V ^8  d   QhRR/# r   r6   )rQ   s   "r?   rR   r     s       r>   c                	   R V n         R V n        R V n        . V n        RV n        RV n        RV n        RV n        RV n        V P                  e;   V P                  P                  4       '       d   V P                  P                  4        RV n	        . V n        V P                  pV P                  R4       V P                  V4       R# )rF   NF)r   r   r   r   r   r   r   r
  r   r  rj  endr  r   r   )rW   r   s   & r?   clear_user_turn AudioRecognition.clear_user_turn  s    !#)+&+-(,.)+/("&#' #( $)! +0D0D0Q0Q0S0S  $$&# " iir>   stt_flush_durationg       @r,   c          
     ,    V ^8  d   QhRRRRRRRRRR/# )	rM   audio_detachedr+   transcript_timeoutr/   r  r,   rO   zasyncio.Future[str]r6   )rQ   s   "r?   rR   r     sE     \ \ \ "	\
 "\ \ 
\r>   c               	  a aaaaa \         P                  ! 4       pVP                  4       oS P                  '       d!   S P                  P                  4       '       d   SP                  R 4       S# R VVV VVV3R llpR V3R llpS P                  e   S P                  P                  4        \         P                  ! V! 4       4      S n        S P                  P                  V4       S# )rF   c                   V ^8  d   QhRR/# r   r6   )rQ   s   "r?   rR   7AudioRecognition.commit_user_turn.<locals>.__annotate__  s     >	+ >	+ >	+r>   c            
       <"   SP                   e-   \        P                  ! 4       SP                   ,
          R8  Ed   SP                  P                  4        S'       d   SP                  '       d   \        SP                  R,          4      p \        P                  ! RV ,          SP                  ^V R7      p\        ^ \        \        P                  ! S
VP                  ,          4      4      4      p\        V4       F  pSP                  V4       K  	   \        P                  ! SP                  P!                  4       SR7      G R j  xL
  SP$                  '       d   SP*                  P-                  \.        P0                  ! \.        P2                  P4                  \.        P6                  ! \9        R
4      SP$                  R7      .R7      4       SP:                   RSP$                   2P=                  4       Sn        SP:                  pR
Sn        SP*                  P?                  4       PA                  4       pSPC                  VS	R7       RSn"        SPG                  4       '       g   SPI                  V4       R # R #  EL8  \        P"                   d=    SP$                  '       d'   \&        P(                  ! RRSRSP$                  /R	7        ELi ; i5i)Ng      ?g?s     )r  num_channelssamples_per_channeltimeoutz+final transcript not received after timeoutr  interim_transcriptrJ  rF   )languagetext)r   rx   )r,   T)%r   rV  r   r  r   rD   r   r   r{  mathceilr  ranger  r   wait_forwaitTimeoutErrorr   r   warningr   rs   r   r   r  FINAL_TRANSCRIPT
SpeechDatar   r   stripr   copy_run_eou_detectionr   r  
set_result)num_samplessilence_frame
num_framesr   rG   chat_ctxr  futrW   r,   r  r  s         r?   _commit_user_turn<AudioRecognition.commit_user_turn.<locals>._commit_user_turn  s>    //7		d>>>D
 //557 "d&7&7&7"%d&7&7#&=">K$'NN#k1$($5$5%&,7	%M "%QDII6H=KaKa6a,b(c!dJ":.6 /!**77<<> 2   ---//OO 00AANN)5b)9@^@^&	 --.a0N0N/OPVVX & //J-/D*{{446;;=H##H#D(,D%88::z* K ++ 555I 46H 4d6T6T#s\   AK K2B$K3J 
JJ K!DK-KJ &K,&KKKKc                    V ^8  d   QhRRRR/# )rM   rR  zasyncio.Task[None]rO   rP   r6   )rQ   s   "r?   rR   r    s     	' 	' 2 	't 	'r>   c                   < SP                  4       '       d   R # V P                  4       '       d   SP                  4        R # V P                  4       ;p'       d   SP	                  V4       R # R # rU   )r  	cancelledr  	exceptionset_exception)rR  excr  s   & r?   _on_task_done8AudioRecognition.commit_user_turn.<locals>._on_task_done  sL    xxzz~~

(((!!#& )r>   )r   r?  create_futurer   r	  is_setr  r   r  r   r   )	rW   r  r  r  r,   loopr  r  r  s	   fdddd   @r?   commit_user_turn!AudioRecognition.commit_user_turn  s     '')#'#5#5#7yyyDMM0022NN2J>	+ >	+@	' 	' ''3((//1'.':':;L;N'O$$$66}E
r>   c                   V ^8  d   QhRR/# )rM   rO   r-   r6   )rQ   s   "r?   rR   r   %  s     & &C &r>   c                    V P                   '       d%   V P                  R,           V P                   ,           # V P                  # )zF
Transcript for this turn, including interim transcript if available.
r  )r   r   r   s   &r?   current_transcript#AudioRecognition.current_transcript$  s8    
 )))))C/$2P2PPP%%%r>   c                    V ^8  d   QhRRRR/# )rM   rN   rk   rO   rP   r6   )rQ   s   "r?   rR   r   -  s     I0 I0o I0$ I0r>   c           	     	R  "   VP                   '       dA   VP                   V P                  9  d&   V P                  P                  VP                   4       V P                  R 8X  dl   V P                  '       dZ   V P
                  eJ   V P
                  P                  4       '       g*   VP                  \        P                  P                  8X  d   R# VP                  \        P                  P                  8w  d   V P                  '       d   V P                  V4      '       dk   \        P                  ! RRVP                  R\!        V P"                  4      '       d   V P"                  MR/R7       V P$                  P                  V4       R# V P$                  '       dB   V P&                  '       d   V P&                  ^,          MRpV P)                  VR7      G Rj  xL
  VP                  \        P                  P*                  8X  Edw   VP,                  ^ ,          P.                  pVP,                  ^ ,          P0                  pVP,                  ^ ,          P2                  pV P4                  '       d   V'       d   \7        V4      \8        8  d   W@n        V P:                  P=                  4        V'       g   R# V P>                  PA                  TV PB                  '       g   V P                  R8X  d   V PD                  MRR	7       V PF                  PH                  e&   V PF                  PH                  PK                  V4       R
VRV P4                  /pV PL                  '       d*   \N        PN                  ! 4       V PL                  ,
          VR&   \        PP                  ! RVR7       \N        PN                  ! 4       V n)        V ;PT                  RV 2,          un*        V PT                  PW                  4       V n*        V PX                  P                  V4       V PT                  V PZ                  8g  pRV n.        RV n-        V PB                  '       d   V PL                  f   \N        PN                  ! 4       V n&        V P_                  V4       V P`                  '       g   V P                  '       d   V'       d}   V P>                  Pc                  \e        V PT                  V PX                  '       d0   \g        V PX                  4      \7        V PX                  4      ,          M^ V Ph                  R7      4       V PD                  '       g<   V P>                  Pk                  4       Pm                  4       pV Po                  V4       R# R# R# VP                  \        P                  Pp                  8X  Ed'   V P>                  Ps                  TV PB                  '       g   V P                  R8X  d   V PD                  MRR	7       VP,                  ^ ,          P.                  pVP,                  ^ ,          P0                  pVP,                  ^ ,          P2                  pV P4                  '       d   V'       d   \7        V4      \8        8  d   W@n        V'       g   R# \        PP                  ! RR
VRV P4                  /R7       \N        PN                  ! 4       V n)        V PT                  R,           V,           PW                  4       V n-        W0n.        V PB                  '       d   V PL                  f   \N        PN                  ! 4       V n&        V P                  R 8w  g   V P                  '       dt   \u        V PX                  4      V.,           p	V P>                  Pc                  \e        V PZ                  \g        V	4      \7        V	4      ,          V Ph                  R7      4       R# R# VP                  \        P                  P                  8X  dq   V P>                  Ps                  TV PB                  '       g   V P                  R8X  d   V PD                  MRR	7       VP,                  ^ ,          P.                  V n.        R# VP                  \        P                  Pv                  8X  Ed;   V P                  R8X  Ed)   \        Px                  ! V P{                  4       4      ;_uu_ 4        V P>                  P}                  R4       RRR4       V PB                  '       dD   V PD                  '       d   \        P~                  ! R4       V P                  V PB                  4       RV n"        RV n        V PB                  '       d   V PL                  f   \N        PN                  ! 4       V n&        V P>                  Pk                  4       Pm                  4       pV Po                  V4       R# VP                  \        P                  P                  8X  Ed   V P                  R8X  d   V Ph                  f/   VP                  ;'       g    \N        PN                  ! 4       V n4        \        Px                  ! V P{                  V Ph                  R7      4      ;_uu_ 4        V P>                  P                  RV Ph                  R7       RRR4       RV n"        \N        PN                  ! 4       V n&        V P
                  e   V P
                  P                  4        R# R# R# R#  E	L"  + '       g   i     EL; i  + '       g   i     Lx; i5i)r  Nz<holding STT event until ignore_user_transcript_until expiresrr  rD  rJ  r   rL  r   )rl   user_transcriptr  transcript_delayzreceived user transcriptr  rF   )r.   r0   r2   z"received user preflight transcriptz@stt end of speech received while user is speaking, resetting vadFTry  r\   )E
request_idr  appendr   r   r   r  r   r   r  INTERIM_TRANSCRIPTRECOGNITION_USAGEr   r  r   r   r"   r   r   r   rY  r  rx  r  r  
confidencer   r  MIN_LANGUAGE_DETECTION_LENGTHr   r   r   rs   r   r   r   r  _on_transcriptr   rV  debugr   r   lstripr   r   r   _check_user_turn_limitr   r}   rA   sumr   r   r  r  PREFLIGHT_TRANSCRIPTro   ru  END_OF_SPEECHuse_span_ensure_user_turn_spanrg   r  r!  r  r\   r^   r  )
rW   rN   rI  rG   r  r  rK  transcript_changedr  confidence_valss
   &&        r?   rv  AudioRecognition._on_stt_event-  s     ===R]]$2G2GG!!((7 %%1)))&&.))..0077c11DDD
  77c));;;@Z@Z@Z**2..R6#D$F$FGG 9=8Z8Z!	 ''..r2&&&595O5O5OD..q1UX  22L2III 77c)):::+00Jq)22H+66J&&&S_/LL&.#++//1KK++999 9 9U B 	 ,  }}  ,!!00<%6
JPTPcPc$dE''',0IIK$:R:R,R()LL35A/3yy{D,""*&66"%)%;%;%B%B%DD"--44Z@!%!7!74;[;[![-/D*/1D,999 8 8 @ ,099;( ''
3,,,0I0I0I%KK881+/+A+A $(#D#D#D !$D$E$E F"%d&G&G"H!I &'040G0G	 ~~~#{{<<>CCEH++H5 & 1J& WW++@@@KK--999 9 9U B 	 .  +00Jq)22H+66J&&&S_/LL&.#LL4(*j$BUBUV 04yy{D,040F0F0Lz0Y/a/a/cD,-7*999 8 8 @+/99;(((H48Q8Q8Q"&t'H'H"IZL"X44-'+'G'G.1/.BSEY.Y,0,C,C 9R WW++>>>KK--999 9 9U B 	 .  .0__Q-?-D-DD*WW++999d>W>W[`>` ; ; =>>,,T2 ? yyy>>>NNZ 		*"DN(,D%999 8 8 @+/99;({{446;;=H##H-WW++;;;@Y@Y]b@b &&.*,*>*>*M*M$))+' ; ;tG^G^ ; _``..ttG^G^._ a "DN'+yy{D$%%1&&--/ 2 Ac;e Jv ?>>: a`s   A5l'8-l'&A%l'l'#A;l'l'1*l'k=Bl'3l';;l'7)l'!Bl'$C)l'A
l'l'+l'3Bl'Bl'Bl'l''!l'	Cl'Cl'!B0l'l -l'l'Al'*B>l')Al'<(l$Al' l		l'l$	l'c                    V ^8  d   QhRRRR/# ra   r6   )rQ   s   "r?   rR   r     s     *M *Ml *Mt *Mr>   c                	  "   VP                   \        P                  P                  8X  Ed   \        P                  ! 4       VP
                  ,
          VP                  ,
          pV P                  '       g   W n        R V n        \        P                  ! V P                  VR7      4      ;_uu_ 4        V P                  P                  WR7       RRR4       R V n        V P                  e   V P                  P!                  4        V P"                  P$                  e'   V P"                  P$                  P'                  4        R# R# VP                   \        P                  P(                  8X  d   V P                  P+                  V4       VP,                  R8  dX   \        P                  ! 4       V n        V P                  f.   \        P                  ! 4       VP,                  ,
          V n        R# R# R# VP                   \        P                  P0                  8X  Ed   \        P                  ! V P                  4       4      ;_uu_ 4        V P                  P3                  V4       RRR4       RV n        RV n        V P4                  '       g$   V P6                  R8X  dL   V P8                  '       d:   V P                  P;                  4       P=                  4       pV P?                  V4       V P"                  P$                  e2   V P"                  P$                  PA                  VPB                  4       R# R# R#   + '       g   i     ELq; i  + '       g   i     L; i5i)Tr  r  Nr   Fr   )"r   r   VADEventTyper  rV  r]  inference_durationr
  r   r   r  r  r   r^   r   r   r  r   r  _on_user_speech_startedINFERENCE_DONErc   raw_accumulated_speechr   r  rg   r   r   r   r   r  r  _on_user_speech_endedsilence_duration)rW   rN   r\   r  s   &&  r?   _on_vad_eventAudioRecognition._on_vad_event  sR    77c&&666 $		b.@.@ @2CXCX X+++*;'+/( ; ;GX ; YZZ..r.W [ "DN%%1&&--/}}  ,!!99; - WW((777KK--b1 ((3.+/99;(**2.2iikB<U<U.UD+ 3 / WW((666 ; ; =>>,,R0 ? (-D$"DN,,,))U2t7P7P7P;;88:??A''1}}  ,!!778K8KL - 7+ [ZZ, ?>sJ   A3M6;M1L6E;M	M
%'M"M0BM6M		M
M	Mc                    V ^8  d   QhRRRR/# rL   r6   )rQ   s   "r?   rR   r   %  s     , ,1Q ,VZ ,r>   c                	   "   V P                   '       d+   VP                  '       g   \        P                  ! R 4       R# VP                  '       d   V P                  P                  V4       R# R# 5i)zTignoring backchannel event during backchannel boundary cooldown, falling back to vadN)r1  is_interruptionr   r   r   rX   rV   s   &&r?   _on_overlap_speech_event)AudioRecognition._on_overlap_speech_event%  sS     +++B4F4F4FLLf KK''+ s   $A0)A0A0c               $    V ^8  d   QhRRRRRR/# )rM   r  r   r,   r+   rO   rP   r6   )rQ   s   "r?   rR   r   /  s'     ^
 ^
? ^
 ^
Y] ^
r>   c                	b  a aaa S P                   '       d&   S P                  '       g   S P                  R 8w  d   R# SP                  4       oSP	                  RS P                  R7       S P                  '       d   S P                  R 8w  d   S P
                  MRo\        P                  ! \        R7      RR VV VV3R lll4       pS P                  e   S P                  P                  4        \        P                  ! V! S P                  S P                  S P                  4      4      S n	        R# )r  Nuser)rolecontentr   c               (    V ^8  d   QhRRRRRRRR/# )rM   last_speaking_timer1   last_final_transcript_timer\   rO   rP   r6   )rQ   s   "r?   rR   9AudioRecognition._run_eou_detection.<locals>.__annotate__=  s6     C	. C	. ,C	.(4C	.  ,C	. 	C	.r>   c                	  <"   SP                   P                  pSP                  4       pSEe   SP                  SP                  4      G R j  xL
 '       g$   \
        P                  ! RSP                  4       EM\        P                  ! V4      ;_uu_ 4        \        P                  ! R4      ;_uu_ 4       pRpR p SP                  S4      G R j  xL
 pSP                  SP                  4      G R j  xL
 pVe   Wg8  d   SP                   P                  pTP!                  \"        P$                  \&        P(                  ! \*        P,                  ! SP.                  \0        ) R  4      P3                  RRRRRR7      P5                  RRRRR7      4      \"        P6                  T\"        P8                  T;'       g    ^ \"        P:                  T\"        P<                  SP                  ;'       g    R/4       R R R 4       R R R 4       TpV '       d#   W\>        P>                  ! 4       ,
          ,          pV^ 8  d:    \@        PB                  ! SPD                  PG                  4       VR	7      G R j  xL
  SPJ                  '       d0   \M        SPJ                  4      \O        SPJ                  4      ,          M^ p	R p
R pR pR pVe;   V e7   Ve3   Tp
T p\Q        W,
          ^ 4      p\>        P>                  ! 4       V ,
          pSPR                  PU                  \W        SSPX                  T	T;'       g    ^ VV
VR
7      4      pV'       Ed   TP!                  \"        PZ                  SPX                  \"        P\                  T	\"        P^                  T;'       g    ^ \"        P`                  T;'       g    ^ /4       SPb                  '       d+   VPe                  \"        Pf                  SPb                  4       VPi                  4        R Sn5        R Sn6        . Sn1        RSn,        . Sn%        R Sn7        SPp                  V 8X  d   R Sn9        RSn:        R Sn8        RSn;        R #  EL EL ELl  \         d    \
        P                  ! R4        ELni ; i  + '       g   i     EL; i  + '       g   i     EL; i ELC  \@        PH                   d     ELYi ; i5i)Nz*Turn detector does not support language %seou_detectionr   zError predicting end of turnT)exclude_function_callexclude_instructionsexclude_empty_messageexclude_handoffexclude_config_update)exclude_audioexclude_imageexclude_timestampexclude_metricsrF   r  )r,   r.   r0   r4   r5   r2   r3   F)<r   	min_delayr  supports_languager   r   rv   r   r  r   start_as_current_spanpredict_end_of_turnunlikely_threshold	max_delay	Exceptionr  set_attributesr   ATTR_CHAT_CTXjsondumpsr   ChatContextitems_EOU_MAX_HISTORY_TURNSr  to_dictATTR_EOU_PROBABILITYATTR_EOU_UNLIKELY_THRESHOLDATTR_EOU_DELAYATTR_EOU_LANGUAGErV  r   r  r	  r  r  r   r  r  r{  r   ry   r*   r   ATTR_USER_TRANSCRIPTATTR_TRANSCRIPT_CONFIDENCEATTR_TRANSCRIPTION_DELAYATTR_END_OF_TURN_DELAYr  rm  ATTR_PROVIDER_REQUEST_IDSr  r  r  r   r   r   r
  r   )r  r  r\   endpointing_delayuser_turn_spaneou_detection_spanend_of_turn_probabilityr/  extra_sleepconfidence_avgr2   r3   r4   r5   	committedr  rW   r,   turn_detectors   &&&            r?   _bounce_eou_task=AudioRecognition._run_eou_detection.<locals>._bounce_eou_task<  sM     !% 1 1 ; ;!88:N(*<<T=P=PQQQKK LdNaNab ~6644_EEI[ 36/;?*M<I<]<] (= 73 8E7W7W $ 3 38 2. !3 >$;$P484E4E4O4O 1 +99 + 9 94::$'OOHNNDZCZC[4\$]%)T>B=A>B8<>B &* && &-W6:6::>8<	 &- &&<"  !, @ @BY + G GI[I`I`_` + : :<M + = =t?R?R?X?XVX)) F 7\ ,K!DIIK??Q!**4==+=+=+?UUU 444 D556T=^=^9__  #'"&"& $
 +6&2%1&7#&8#&)*D*Y[\&]#$(IIK2D$D!22)#'#9#9*8(;(@(@q&7(;(;
I y--#88$:P:P#>>#<<>Q>V>VUV#::<M<R<RQR	 ((("00#==t?T?T ""$'+$(,%(*% *,&461370 ++/AA.2D+/4D,/3D,(-D%w R72  ) M",,-KLM# FEE 766h V++ s  A
SQ	SASR 8R	>Q$Q"Q$5Q!6$Q$B#R	>3R	2R	:R S)S>3R7 1R42R7 6SB&S/SASS.SBSQ$!Q$$!R	R	R		R	R	R  R1	+	S4R7 7SSSS)NNN)r   r   r   r  add_messager   r   r   r   r   r  r   r   r   r   r  )rW   r  r,   rK  rJ  s   fff @r?   r  #AudioRecognition._run_eou_detection/  s    999T3338Q8QU]8]==?&$2H2HI %%%$*C*Cx*O  	 
		V	,C	. C	. 
-C	.J !!-""))+ ")!4!4((00%%"
r>   c                    V ^8  d   QhRRRR/# )rM   rG   r-   rO   rP   r6   )rQ   s   "r?   rR   r     s     . . . .r>   c                   V P                   P                  P                  R,          pVP                  R4      pVP                  R4      pVf   Vf   R# \        P                  ! 4       pV P
                  P                  f&   V P                  ;'       g    TV P
                  n        V P                  P                  V4      pV P
                  ;P                  \        V4      ,          un
        V P
                  P                   RV 2P                  4       V P
                  n        WPP
                  P                  ,
          pVRJ;'       d    Wt8  pVRJ;'       d    V P
                  P                  V8  p	V'       g   V	'       g   R# \        V P                  V P
                  P                  V P
                  P                  VR7      p
V P                   P#                  V
4       R# )zcCheck if the user turn exceeds configured limits.
Called when a final transcript event is received.user_turn_limit	max_wordsmax_durationNr  )rG   accumulated_transcriptaccumulated_word_countr  )r   r   turn_handlingr   rV  r  rH   r   r  r   rE   r  rG   r  r&   r  r   r   )rW   rG   optsrR  rS  nowrE   r  time_exceededwords_exceededrN   s   &&         r?   r  'AudioRecognition._check_user_turn_limit  s~    }}$$223DEHH[)	xx/!5iik((0,0,C,C,J,JsD)$$--j9  CJ. +/+=+=+H+H*I:,(W(](](_%++666$D0MMX5M"$.XX43E3E3K3Ky3X^"..#'#5#5#@#@#'#5#5#;#;	
 	))"-r>   c               (    V ^8  d   QhRRRRRRRR/# )	rM   r   r   r  r  r  asyncio.Task[None] | NonerO   rP   r6   )rQ   s   "r?   rR   r     s2     ) )+) *) 0	)
 
)r>   c                   "   Ve   VP                  4       G Rj  xL
  Ve   \        P                  ! V4      G Rj  xL
  V  Rj  xL
  pV P                  V4      G Rj  xL
  K%   LM L- L$ LD'R# 5i)z5Consume STT events from the pump. Swapped on handoff.N)r   r!   r   rv  )rW   r   r  r  rN   s   &&&& r?   r  AudioRecognition._stt_consumer  ss      #%%'''#%%l333  	) 	)"$$R((( ( 4	)( !sU   A3A(!A3A*A3A0A,A0A3!A."A3*A3,A0.A30A3c               (    V ^8  d   QhRRRRRRRR/# )	rM   r   zvad.VADaudio_inputzAsyncIterable[rtc.AudioFrame]rR  r]  rO   rP   r6   )rQ   s   "r?   rR   r     s2     1 11 31 (	1
 
1r>   c           	     	^  aa"   Ve   \         P                  ! V4      G R j  xL
  VP                  ! 4       o\        P                  ! \
        R7      R VV3R ll4       p\        P                  ! V! 4       4      p S  R j  xL
  pV P                  V4      G R j  xL
  K%   L L" L
D% \         P                  ! T4      G R j  xL 
  SP                  4       G R j  xL 
  T P                  '       du   \        P                  ! T P                  4       4      ;_uu_ 4        T P                  P                  R 4       R R R 4       M  + '       g   i     M; iRT n
        RT n        R # R #   \         P                  ! T4      G R j  xL 
  SP                  4       G R j  xL 
  T P                  '       dt   \        P                  ! T P                  4       4      ;_uu_ 4        T P                  P                  R 4       R R R 4       M  + '       g   i     M; iRT n
        RT n        i i ; i5i)Nr   c                   V ^8  d   QhRR/# r   r6   )rQ   s   "r?   rR   0AudioRecognition._vad_task.<locals>.__annotate__       	) 	) 	)r>   c                 T   <"   S  R j  xL
  p SP                  V 4       K   LDR # 5irU   
push_framer  ra  streams    r?   _forward,AudioRecognition._vad_task.<locals>._forward  *     * ) )e!!%(){   (%#%(%(F)r!   r   rj  r   r   r   r   r   r  r   r   r   r  r  r   rg   r
  )rW   r   ra  rR  rk  forward_taskrN   rj  s   &&f&   @r?   r  AudioRecognition._vad_task  s     %%d+++			V	,	) 	) 
-	) **8:6	1" - -b((,,, ,-, # %%l333--/!! ~~~^^D$?$?$ABBKK006 CBBB!&+0(	 	 %%l333--/!! ~~~^^D$?$?$ABBKK006 CBBB!&+0(	 s   H-B#AH-<E+ >B)B%B)E+ B'E+ #H-%B)'E+ )E+ +H-CH-C H-5,H-!E=	H-E	H-+H*FH*F!H*6,H*"H	>	H*HH**H-c               (    V ^8  d   QhRRRRRRRR/# )	rM   r   z&inference.AdaptiveInterruptionDetectorra  z2AsyncIterable[inference.InterruptionDataFrameType]rR  r]  rO   rP   r6   )rQ   s   "r?   rR   r   $  s3     " " F" H" (	"
 
"r>   c                	  aa"   Ve   \         P                  ! V4      G R j  xL
  VP                  4       o\        P                  ! \
        R7      R VV3R ll4       p\        P                  ! V! 4       4      p S  R j  xL
  pV P                  V4      G R j  xL
  K%   L L" L
D%MJ  \         d=     \         P                  ! T4      G R j  xL 
  SP                  4       G R j  xL 
  R # i ; i \         P                  ! T4      G R j  xL 
  SP                  4       G R j  xL 
  R #   \         P                  ! T4      G R j  xL 
  SP                  4       G R j  xL 
  i ; i5i)Nr   c                   V ^8  d   QhRR/# r   r6   )rQ   s   "r?   rR   9AudioRecognition._interruption_task.<locals>.__annotate__0  re  r>   c                 T   <"   S  R j  xL
  p SP                  V 4       K   LDR # 5irU   rg  ri  s    r?   rk  5AudioRecognition._interruption_task.<locals>._forward/  rm  rn  )r!   r   rj  r   r   r   r   r   r  r   r   )rW   r   ra  rR  rk  ro  rN   rj  s   &&f&   @r?   r  #AudioRecognition._interruption_task#  s%     %%d+++'..0			V	,	) 	) 
-	) **8:6	"" 8 8b33B777 ,87 # 	%%l333--/!!	 # %%l333--/!! %%l333--/!!s   E,B"AE,;B* =B(B$B(B* B&B* "E,$B(&B* (B* )D/ *C15D/ 6E,CE,(C+)E,0C11D/ 5E,DE,'D*(E,/E)	E
E)"E%#E))E,c                    V ^8  d   QhRRRR/# )rM   ry  r1   rO   z
trace.Spanr6   )rQ   s   "r?   rR   r   @  s     $ $ $ $r>   c                	   V P                   '       d-   V P                   P                  4       '       d   V P                   # Vf   \        P                  ! 4       p\        VR,          4      p\        P
                  ! RVR7      V n         V P                  f   Wn        V P                  P                  ;p'       d3   VP                  '       d!   \        V P                   VP                  4       V P                  '       d5   V P                   P                  \        P                  V P                  4       V P                  '       d5   V P                   P                  \        P                   V P                  4       V P                   # )Ni ʚ;	user_turnr  )r  rj  rV  rD   r   
start_spanr  r   _room_iolinked_participantr$   r   rm  r   ATTR_GEN_AI_REQUEST_MODELr   ATTR_GEN_AI_PROVIDER_NAME)rW   ry  start_time_nsroom_ios   &&  r?   r  'AudioRecognition._ensure_user_turn_span@  s   D$8$8$E$E$G$G'''JJ67%00W  ($.!}}---G-73M3M3M'(<(<g>X>XY ???  ..55t   ..55t7I7I ###r>   )0r   r   r   r   r   r   r  r	  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r  r   r  r  r   r   r   r   r
  r  r  r   rU   )F),r8   r9   r:   r;   r   r   r  r#  r'  r   r-  r1  r6  r:  r>  rU  r^   rg   rW  r   r   r   rY  rt  r  r  r   r   r!  r  r"  r  r  r  rv  r  r  r  r  r  r  r  r  r=   r6   r>   r?   r   r      s   V> !%V> $(V>p6 4=6 @I	6 4=6 4=68I4 I
1
 
 
 < <2M (%T
, 15)2	` 
0 (T) )T)l7
&P5E 5" 6D*TX *>
$"
:,\
 %(\ !\| & &I0V (*M )*MX,^
@.B () ))" (1 )1@ (" )"8$ $r>   r   )E
__future__r   r   r4  r  rV  collectionsr   collections.abcr   r   dataclassesr   typingr   r	   r
   opentelemetryr   opentelemetry.sdk.tracer   livekitr   rF   r   r   r   r   r   r   _exceptionsr   inference.interruptionr   r   r   r   r  r   logr   r   	telemetryr   r   typesr   r    r!   r"   r#   _utilsr$   r   r%   eventsr&   turnr'   agent_sessionr(   r  r8  r*   rA   rC   rJ   r   r   r6   r>   r?   <module>r     s    "      3 ! / /  0  8 8 "  $   + ) !  / ( ) 8+ !   
$ 
$ 
$ & & & $ $ $
8x 
8.3 .3bR$ R$r>   