
    /j                    H   S SK Jr  S SKrS SKrS SKJrJr  S SKJrJ	r	  S SK
JrJr  S SKJrJr  S SKJr  S SKJr  S S	KJr  S
SKJr  S
SKJr  \ " S S\\5      5       r\ " S S5      5       r\ " S S5      5       r " S S\\R<                  \S      5      r " S S\5      r g)    )annotationsN)ABCabstractmethod)AsyncIterableAsyncIterator)	dataclassfield)Enumunique)Literal)rtc)Metadata   )
VADMetrics)aioc                       \ rS rSrSrSrSrSrg)VADEventType   start_of_speechinference_doneend_of_speech N)__name__
__module____qualname____firstlineno__START_OF_SPEECHINFERENCE_DONEEND_OF_SPEECH__static_attributes__r       C/app/agent/.venv/lib/python3.13/site-packages/livekit/agents/vad.pyr   r      s    'O%N#Mr!   r   c                      \ rS rSr% SrS\S'    S\S'    S\S'    S\S	'    S\S
'    \" \S9rS\S'    Sr	S\S'    Sr
S\S'    SrS\S'    SrS\S'    SrS\S'   Srg)VADEvent   zD
Represents an event detected by the Voice Activity Detector (VAD).
r   typeintsamples_indexfloat	timestampspeech_durationsilence_duration)default_factoryzlist[rtc.AudioFrame]frames        probabilityinference_durationFboolspeakingraw_accumulated_silenceraw_accumulated_speechr   N)r   r   r   r   __doc____annotations__r	   listr.   r0   r1   r3   r4   r5   r    r   r!   r"   r$   r$      s     Wd:45#(#>F > KP ##]Hd>%(U(+$'E'*r!   r$   c                       \ rS rSr% S\S'   Srg)VADCapabilitiesG   r)   update_intervalr   N)r   r   r   r   r7   r    r   r!   r"   r:   r:   G   s    r!   r:   c                  |   ^  \ rS rSrSU 4S jjr\S	S j5       r\S	S j5       r\S
S j5       r\	SS j5       r
SrU =r$ )VADL   c                  > [         TU ]  5         Xl        [        U 5      R                   S[        U 5      R
                   3U l        g )N.)super__init___capabilitiesr&   r   r   _label)selfcapabilities	__class__s     r"   rC   VAD.__init__M   s<    )d../qd1D1D0EFr!   c                    gNunknownr   rF   s    r"   model	VAD.modelR       r!   c                    grK   r   rM   s    r"   providerVAD.providerV   rP   r!   c                    U R                   $ N)rD   rM   s    r"   rG   VAD.capabilitiesZ   s    !!!r!   c                    g rU   r   rM   s    r"   stream
VAD.stream^   s    #&r!   )rD   rE   )rG   r:   returnNone)rZ   str)rZ   r:   )rZ   	VADStream)r   r   r   r   rC   propertyrN   rR   rG   r   rX   r    __classcell__)rH   s   @r"   r>   r>   L   sU    G
     " " & &r!   r>   metrics_collectedc                      \ rS rSr " S S5      rSS jr\SS j5       rSS jrSS jr	SS jr
SS	 jrSS
 jrSS jrSS jrSS jrSS jrSrg)r]   b   c                      \ rS rSrSrg)VADStream._FlushSentinelc   r   N)r   r   r   r   r    r   r!   r"   _FlushSentinelrd   c   s    r!   rf   c                j  ^  UT l         [        R                  " 5       T l        [        R
                  [        R                  [        R                  -     " 5       T l
        [        R
                  [           " 5       T l        [        R                  R                  T R                  S5      T l        T R                  u  T l        n["        R$                  " T R'                  U5      SS9T l        ["        R$                  " T R+                  5       5      T l        T R,                  R/                  U 4S j5        g )N   zTTS._metrics_task)namec                8   > TR                   R                  5       $ rU   )	_event_chclose)_rF   s    r"   <lambda>$VADStream.__init__.<locals>.<lambda>s   s    t~~/C/C/Er!   )_vadtimeperf_counter_last_activity_timer   Chanr   
AudioFramer]   rf   	_input_chr$   rk   	itertoolstee
_tee_aiter_event_aiterasynciocreate_task_metrics_monitor_task_metrics_task
_main_task_taskadd_done_callback)rF   vadmonitor_aiters   `  r"   rC   VADStream.__init__f   s    	#'#4#4#6 #..93K3K"KLN(+---++DNNA>+/??(=$00&&}5<O
 (():;


$$%EFr!   c                   #    g 7frU   r   rM   s    r"   r   VADStream._main_tasku   s     (+s   c                  #    SnSnU  Sh  vN nUR                   [        R                  :X  a  X$R                  -  nUS-  nUSU R                  R
                  R                  -  :  a  [        [        R                  " 5       [        R                  " 5       U R                  -
  UUU R                  R                  [        U R                  R                  U R                  R                  S9S9nU R                  R                  SU5        SnSnGM	  GM  UR                   [        R                   [        R"                  4;   d  GM=  [        R                  " 5       U l
        GMZ   GNV
 g7f)zTask used to collect metricsr/   r   Nr   )
model_namemodel_provider)r*   	idle_timeinference_duration_totalinference_countlabelmetadatar`   )r&   r   r   r1   rp   rG   r<   r   rq   rr   rs   rE   r   rN   rR   emitr   r   )rF   event_aiterr   r   evvad_metricss         r"   r}   VADStream._metrics_monitor_taskx   s     $' # 	?"ww,555(,A,AA(1$"a$))*@*@*P*P&PP","&))+"&"3"3"58P8P"P1I(7"ii..!)'+yytyyGYGY"	#K IINN#6D/2,&'O Q \99<;U;UVV+/+<+<+>(+	?s,   E(E&E#E&D0E(E(#E&&E(c                z    U R                  5         U R                  5         U R                  R                  U5        g)z$Push some audio frame to be analyzedN)_check_input_not_ended_check_not_closedrv   send_nowait)rF   frames     r"   
push_frameVADStream.push_frame   s,    ##% ""5)r!   c                    U R                  5         U R                  5         U R                  R                  U R	                  5       5        g)z#Mark the end of the current segmentN)r   r   rv   r   rf   rM   s    r"   flushVADStream.flush   s5    ##% ""4#6#6#89r!   c                X    U R                  5         U R                  R                  5         g)z3Mark the end of input, no more audio will be pushedN)r   rv   rl   rM   s    r"   	end_inputVADStream.end_input   s    

r!   c                <  #    U R                   R                  5         [        R                  " U R                  5      I Sh  vN   U R
                  R                  5         U R                  I Sh  vN   U R                  R                  5       I Sh  vN   g NU N) N	7f)zClose the stream immediatelyN)	rv   rl   r   cancel_and_waitr   rk   r~   ry   acloserM   s    r"   r   VADStream.aclose   sm     !!$**---    oo$$&&& 	. &s5   >B B-B.B/!BBBBBc                  #     U R                   R                  5       I S h  vN nU$  N! [         aJ    U R                  R	                  5       (       d#  U R                  R                  5       =n(       a  Ue[        S ef = f7frU   )rz   	__anext__StopAsyncIterationr   	cancelled	exception)rF   valexcs      r"   r   VADStream.__anext__   sr     	/))3355C 
 6! 	/::''))djj6J6J6L/Ls/L	$$.		/s&   B* (* B* AA>>Bc                    U $ rU   r   rM   s    r"   	__aiter__VADStream.__aiter__   s    r!   c                    U R                   R                  (       a0  [        U 5      n[        UR                   SUR
                   S35      eg )NrA   z
 is closed)rk   closedr&   RuntimeErrorr   r   rF   clss     r"   r   VADStream._check_not_closed   s>    >>  t*C#..!13<<.
KLL !r!   c                    U R                   R                  (       a0  [        U 5      n[        UR                   SUR
                   S35      eg )NrA   z input ended)rv   r   r&   r   r   r   r   s     r"   r    VADStream._check_input_not_ended   s>    >>  t*C#..!13<<.MNN !r!   )rz   rk   rv   rs   r~   r   ry   rp   N)r   r>   rZ   r[   )rZ   r[   )r   zAsyncIterable[VADEvent]rZ   r[   )r   zrtc.AudioFramerZ   r[   )rZ   r$   )rZ   zAsyncIterator[VADEvent])r   r   r   r   rf   rC   r   r   r}   r   r   r   r   r   r   r   r   r    r   r!   r"   r]   r]   b   sQ     G + +?:*:
'	M
Or!   r]   )!
__future__r   r{   rq   abcr   r   collections.abcr   r   dataclassesr   r	   enumr
   r   typingr   livekitr   livekit.agents.metrics.baser   metricsr   utilsr   r\   r   r$   r:   EventEmitterr>   r]   r   r!   r"   <module>r      s    "   # 8 (    0   $3 $ $ *+ *+ *+Z   '#s(; <= ',bO bOr!   