
    љi                         S SK JrJr  S SKrS SKJr  S SKrS SKJrJ	r	J
r
JrJrJr  \R                  " \5      r " S S5      r " S S\5      r " S	 S
\5      rg)    )ABCabstractmethodN)deque)AsyncGeneratorListCallable	AwaitableOptionalAnyc                   4    \ rS rSrSrS	S\S\4S jjrS rSr	g)
RecordingSessionBase
   zYBase class for recording sessions with common interface for on_recording_started trigger.
session_idpreroll_buffer_countc                     Xl         SU l        [        5       U l        SU l        SU l        [        US9U l        0 U l        SU l	        S U l
        g )NFr   )maxlen)r   is_recording	bytearraybuffersilence_durationrecord_durationr   preroll_bufferdataon_recording_started_triggeredlast_recognized_text)selfr   r   s      O/home/james-whalen/.local/lib/python3.13/site-packages/aiavatar/sts/vad/base.py__init__RecordingSessionBase.__init__   sM    $"'!*'(&'%*2F%G	49+37!    c                 ~    U R                   R                  5         SU l        SU l        SU l        SU l        S U l        g )NFr   )r   clearr   r   r   r   r   r   s    r   resetRecordingSessionBase.reset   s:    ! ! .3+$(!r    )	r   r   r   r   r   r   r   r   r   N)   )
__name__
__module____qualname____firstlineno____doc__strintr   r$   __static_attributes__ r    r   r   r   
   s    c
83 
8c 
8)r    r   c            
          \ rS rSrSSSS.S\S\S\4S	 jjrS
\\\	\
\\	/\S   4   S\\\	\
\\	/\S   4   4S jrS\S\	S\
S\S\	4
S jrS
\\	/\S   4   S\\	/\S   4   4S jrS
\\	/\S   4   S\\	/\S   4   4S jrS\	4S jrS
\\\	   \/\4   4S jrS\\	   S\S\4S jrS$S\S\\	   4S jjrS\
4S jrS\
S\
4S jr\S$S\S\	4S jj5       r\S$S \\S4   S\	4S! jj5       r\S\	4S" j5       rS#rg)%SpeechDetector!   i>  g      ?   )sample_rate!on_recording_started_min_duration$on_recording_started_min_text_lengthr4   r5   r6   c                p    Xl         / U l        S U l        / U l        / U l        S U l        X l        X0l        g )Nc                      g)NFr/   r/   r    r   <lambda>)SpeechDetector.__init__.<locals>.<lambda>+   s    5r    )r4   _on_speech_detectedshould_mute_on_recording_started
_on_voiced!_should_trigger_recording_startedr5   r6   )r   r4   r5   r6   s       r   r   SpeechDetector.__init__"   s=     'df (MO"BDae.1R.4X1r    funcNreturnc                 <    U R                   R                  U5        U$ )zRegister callback for speech detection.

The callback is called with (data: bytes, text: str, metadata: dict, recorded_duration: float, session_id: str).
)r;   appendr   rA   s     r   on_speech_detected!SpeechDetector.on_speech_detected3   s    
 	  ''-r    r   textmetadatarecorded_durationr   c                    #    U R                   (       d  [        R                  SU S35        gU R                    H  n U" XX4U5      I Sh  vN   M     g N	! [         a    [        R	                  SSS9   M>  f = f7f)z%Execute on_speech_detected callbacks.zSpeech detected: len=z secNz$Error in on_speech_detected callbackTexc_info)r;   loggerinfo	Exceptionerror)r   r   rH   rI   rJ   r   handlers          r   _execute_on_speech_detected*SpeechDetector._execute_on_speech_detected;   su     ''KK/0A/B$GH//GTd(zRRR 0R TCdSTs:   ;A<AAAA<AA95A<8A99A<c                 <    U R                   R                  U5        U$ N)r=   rD   rE   s     r   on_recording_started#SpeechDetector.on_recording_startedF   s    ""))$/r    c                 <    U R                   R                  U5        U$ )zwRegister callback for voice activity detection.

The callback is called with (session_id: str) when voice is detected.
)r>   rD   rE   s     r   	on_voicedSpeechDetector.on_voicedJ   s    
 	t$r    c                    #    U R                   (       d  gU R                    H  n U" U5      I Sh  vN   M     g N	! [         a    [        R                  SSS9   M<  f = f7f)z*Execute on_voiced callbacks if registered.NzError in on_voiced callbackTrL   )r>   rP   rN   rQ   )r   r   rR   s      r   _execute_on_voiced!SpeechDetector._execute_on_voicedR   sU     GKj))) ') K:TJKs1   "A!<:<A!<AA!AA!c                     Xl         U$ )zDecorator to set custom trigger condition for on_recording_started callback.

The function receives (text: Optional[str], session: Any) and returns bool.
If not set, subclasses should use their default trigger logic.
)r?   rE   s     r    should_trigger_recording_started/SpeechDetector.should_trigger_recording_started\   s     26.r    sessionc                     UR                   UR                  -
  U R                  :  a  gU(       a  [        U5      U R                  :  a  gg)z<Default trigger condition for on_recording_started callback.TF)r   r   r5   lenr6   )r   rH   rb   s      r   )_default_should_trigger_recording_started8SpeechDetector._default_should_trigger_recording_startede   s@     ""W%=%==AgAggCI!J!JJr    c                 r  #    UR                   (       d  U R                  (       d  gUb  UOUR                  nU R                  (       a  U R                  X15      nOU R	                  X15      nU(       aD  SUl         U R                   H,  nS n[
        R                  " U" XQR                  5      5        M.     gg7f)zFCheck trigger condition and fire on_recording_started callback if met.NTc                 z   #     U " U5      I S h  vN   g  N! [          a    [        R                  SSS9   g f = f7f)Nz&Error in on_recording_started callbackTrL   )rP   rN   rQ   )hr   s     r   _runASpeechDetector._check_and_trigger_recording_started.<locals>._run   s:     ^
m++$ ^%MX\]^s(   ;  ; 8;8;)r   r=   r   r?   re   asynciocreate_taskr   )r   rb   rH   
check_textshould_triggerrR   rj   s          r   $_check_and_trigger_recording_started3SpeechDetector._check_and_trigger_recording_startedo   s     119S9S "-T73O3O
 11!CCJXN!KKJ`N59G255^
 ##D2D2D$EF 6 s   B5B7c                     0 $ rV   r/   r#   s    r   
get_configSpeechDetector.get_config   s    	r    configc                     U R                  5       R                  5       n0 nUR                  5        H"  u  pEUc  M
  XB;  a  M   [        XU5        XSU'   M$     U$ ! [         a     M5  f = frV   )rs   keysitemssetattrrP   )r   ru   allowed_keysupdatedkvs         r   
set_configSpeechDetector.set_config   sp    (--/LLNDAy$#
 #   s   A
A'&A'samplesc                    #    g 7frV   r/   r   r   r   s      r   process_samplesSpeechDetector.process_samples           input_streamc                    #    g 7frV   r/   r   r   r   s      r   process_streamSpeechDetector.process_stream   r   r   c                    #    g 7frV   r/   r   r   s     r   finalize_sessionSpeechDetector.finalize_session   r   r   )r=   r;   r>   r?   r5   r6   r4   r<   rV   ) r'   r(   r)   r*   r-   floatr   r   bytesr,   dictr	   rF   rS   rW   rZ   r]   r
   r   boolr`   r   re   rp   rs   r~   r   r   r   r   r   r.   r/   r    r   r1   r1   !   s<    !3645Y Y ,1	Y
 /2Y"xT5#0NPYZ^P_0_'` emotvy{  BG  IL  oM  OX  Y]  O^  o^  f_ 	Te 	T3 	TRV 	Tkp 	T  B 	T3%42H)I hX[W\^ghl^mWmNn huio'=> 8SES\]aSbLbCc K3 KXx}c>RTX>X5Y hsm Vj os GBV G^fgj^k G0D  $  U    t1L Z]     r    r1   c                   .    \ rS rSrSS jrSS jrS rSrg)SpeechDetectorDummy   Nc                    #    g 7frV   r/   r   s      r   r   #SpeechDetectorDummy.process_samples        r   c                    #    g 7frV   r/   r   s      r   r   "SpeechDetectorDummy.process_stream   r   r   c                    #    g 7frV   r/   r   s     r   r   $SpeechDetectorDummy.finalize_session   r   r   r/   rV   )r'   r(   r)   r*   r   r   r   r.   r/   r    r   r   r      s    r    r   )abcr   r   rl   collectionsr   loggingtypingr   r   r   r	   r
   r   	getLoggerr'   rN   r   r1   r   r/   r    r   <module>r      sL    #    K K			8	$) ).BS BJ. r    