
    љi:                         S SK r S SKrS SKrS SKJrJrJrJrJr  SSK	J
r
Jr  SSKJr  \R                  " \5      r " S S\5      r " S	 S
\
5      rg)    N)CallableOptionalDictList	Awaitable   )SileroSpeechDetectorRecordingSession   )SpeechRecognizerc                   D   ^  \ rS rSrSS\S\4U 4S jjjrU 4S jrSrU =r	$ )r
      
session_idpreroll_buffer_countc                    > [         TU ]  XU5        [        5       U l        SU l        SU l        SU l        S U l        SU l        g Nr   F)	super__init__	bytearraysegment_buffersegment_durationsegment_silence_durationsegment_firedpending_recognition_taskrecognition_sequence)selfr   r   vad_iterator	__class__s       Q/home/james-whalen/.local/lib/python3.13/site-packages/aiavatar/sts/vad/stream.pyr   RecordingSession.__init__   sD    <H)2'(/0%#(@D%)*!    c                    > [         TU ]  5         U R                  R                  5         SU l        SU l        SU l        S U l        SU l        g r   )	r   resetr   clearr   r   r   r   r   )r   r   s    r   r#   RecordingSession.reset   sF    !!# !()%"(,%$%!r!   )r   r   r   r   r   r   )   N)
__name__
__module____qualname____firstlineno__strintr   r#   __static_attributes____classcell__r   s   @r   r
   r
      s%    	+3 	+c 	+ 	+& &r!   r
   c            '         ^  \ rS rSrSSSSSSSSSS	SSS
SSSSS	S.S\S\\   S\S\S\S\S\S\S\S\\\	/\	4      S\
S\\   S\S\S\S\\\/\S   4      S\S\S \
4&U 4S! jjjrS"\\\/\S   4   S#\\\/\S   4   4S$ jrS"\\/\\   4   4S% jrS"\\\/\S   4   S#\\\/\S   4   4S& jrS'\S(\4S) jrS*\S+\4S, jrS-\	S'\S.\S/\S+\4
S0 jrS1\	S+\S#\
4S2 jrS+\4S3 jrS4rU =r$ )5SileroStreamSpeechDetector"   Ng      ?g?g      $@i>  r   r&   Fi   g      ?r   )volume_db_thresholdsilence_duration_thresholdsegment_silence_thresholdmax_durationmin_durationsample_ratechannelsr   to_linear16debug
model_pathspeech_probability_threshold
chunk_sizemodel_pool_sizeon_recording_started!on_recording_started_min_duration$on_recording_started_min_text_lengthuse_vad_iteratorspeech_recognizerr3   r4   r5   r6   r7   r8   r9   r   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   c                   > [         TU ]  UUUUUUU	U
UUUUUUUUS9  Xl        X@l        UU l        0 U l        / U l        / U l        S U l        g )N)r3   r4   r6   r7   r8   r9   r   r:   r;   r<   r=   r>   r?   r@   rA   rC   )	r   r   rD   r5   rB   recording_sessions_on_speech_detecting_on_speech_recognition_error_validate_recognized_text)r   rD   r3   r4   r5   r6   r7   r8   r9   r   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   r   s                       r   r   #SileroStreamSpeechDetector.__init__#   s}    . 	 3'A%%#!5#!)E!+!5.O-! 	 	
$ "3)B&4X1?A^`!_a)SW&r!   funcreturnc                 <    U R                   R                  U5        U$ )zRegister callback for speech detecting (partial results).

The callback is called with (text: str, session: RecordingSession).
)rG   appendr   rK   s     r   on_speech_detecting.SileroStreamSpeechDetector.on_speech_detectingT   s    
 	!!((.r!   c                     Xl         U$ N)rI   rO   s     r   validate_recognized_text3SileroStreamSpeechDetector.validate_recognized_text\   s    )-&r!   c                 <    U R                   R                  U5        U$ )zsRegister callback for speech recognition errors.

The callback is called with (error: Exception, session_id: str).
)rH   rN   rO   s     r   on_speech_recognition_error6SileroStreamSpeechDetector.on_speech_recognition_error`   s    
 	))006r!   textsessionc                    #    U R                    H  n U" X5      I Sh  vN   M     g N	! [         a    [        R                  SSS9   M<  f = f7f)z&Execute on_speech_detecting callbacks.Nz%Error in on_speech_detecting callbackTexc_info)rG   	Exceptionloggererror)r   rY   rZ   handlers       r   _execute_on_speech_detecting7SileroStreamSpeechDetector._execute_on_speech_detectingh   sM     00GUd,,, 1, UDtTU1   A*(*A*AAAAr`   r   c                    #    U R                    H  n U" X5      I Sh  vN   M     g N	! [         a    [        R                  SSS9   M<  f = f7f)z.Execute on_speech_recognition_error callbacks.Nz-Error in on_speech_recognition_error callbackTr\   )rH   r^   r_   r`   )r   r`   r   ra   s       r   $_execute_on_speech_recognition_error?SileroStreamSpeechDetector._execute_on_speech_recognition_errorp   sN     88G]e000 90 ]LW[\]rd   recorded_datametadatarecorded_durationc                 F   #    U R                  XX4U5      I S h  vN   g  N7frS   )_execute_on_speech_detected)r   rh   rY   ri   rj   r   s         r   execute_on_speech_detected5SileroStreamSpeechDetector.execute_on_speech_detectedx   s     ..}Hakllls   !!samplesc           	        ^ #    T R                   (       a  T R                  U5      nT R                  U5      nT R                  5       (       aZ  UR                  5         UR                  R                  5         UR                  R                  5         [        R                  S5        gUR                  R                  U5        UR                  R                  U5        [        U5      S-  T R                  T R                  -  -  nSn[        UR                  5      T R                  S-  :  a  [        UR                  T R                  * S-  S  5      nT R!                  Xc5      nU(       aN  UR"                  bA  [%        ['        S [(        R*                  " SU5       5       5      5      nXsR"                  ::  a  Sn[        UR                  5      T R                  S-  :  a"  UR                  T R                  * S-  S  Ul        T R                  (       a3  [        R                  SU SUR,                  S	 S
UR.                   35        U(       a  T R1                  U5      I S h  vN   UR2                  (       d  U(       au  UR                  5         SUl        UR                   H  nUR4                  R                  U5        M      UR4                  R                  U5        U=R,                  U-  sl        UR2                  $ UR4                  R                  U5        U=R,                  U-  sl        UR6                  R                  U5        U=R8                  U-  sl        U(       a  SUl        SUl        SUl        O*U=R:                  U-  sl        U=R<                  U-  sl        UR<                  T R@                  :  a  [        UR6                  5      S:  a  UR>                  (       dy  SUl        [        UR6                  5      n	U=RB                  S-  sl!        URB                  n
S[        S[D        S[F        4U 4S jjn[H        RJ                  " U" XU
5      5      Ul&        T RO                  U5      I S h  vN   UR:                  T RP                  :  Ga   UR,                  UR:                  -
  nUT RR                  :  a,  T R                  (       a  [        RU                  SU S35        GOT R                  (       a  [        RU                  SU S35        URL                  b   URL                  I S h  vN   URZ                  nUcN   T R\                  R_                  UR.                  [        UR4                  5      5      I S h  vN nUR`                  nU(       a  T Rd                  (       a`  T Re                  U5      =n(       aH  T R                  (       a  [        RU                  SU SU 35        UR                  5         UR2                  $ [        UR4                  5      n[H        RJ                  " T Rg                  UUS XR.                  5      5        O&T R                  (       a  [        RU                  S5        UR                  5         UR2                  $ UR,                  T Rh                  :  Gac  T R                  (       a#  [        RU                  SUR,                   S35        URL                  b   URL                  I S h  vN   URZ                  nU(       a  T Rd                  (       a`  T Re                  U5      =n(       aH  T R                  (       a  [        RU                  SU SU 35        UR                  5         UR2                  $ [        UR4                  5      n[H        RJ                  " T Rg                  UUS UR,                  UR.                  5      5        O&T R                  (       a  [        RU                  S5        UR                  5         UR2                  $  GN GN GN! [V         a  n[        RY                  SSS9   S nAGNS nAff = f GN! [V         aC  n[        RY                  SSS9  T Rc                  XR.                  5      I S h  vN     S nAGNS nAff = f GN! [V         a  n[        RY                  SSS9   S nAGNS nAff = f7f)Nz$SileroStreamSpeechDetector is muted.Fr   c              3   <   #    U  H  u  n[        U5      v   M     g 7frS   )abs).0samples     r   	<genexpr>=SileroStreamSpeechDetector.process_samples.<locals>.<genexpr>   s     )gEf'&#f++Efs   z<h   zSpeech detected: z, duration: z.2fz, session: Tr   r   datasessseqc                   >#     TR                   R                  UR                  U 5      I S h  vN nUR                  (       a_  X!R                  :X  aO  UR                  Ul        TR                  UR                  U5      I S h  vN   TR                  U5      I S h  vN   g g g  Nu N" N! [         aB  n[        R                  SSS9  TR                  XAR                  5      I S h  vN     S nAg S nAff = f7f)NzError in segment recognitionTr\   )rD   	recognizer   rY   r   last_recognized_textrb   $_check_and_trigger_recording_startedr^   r_   r`   rf   )rx   ry   rz   resultexr   s        r   _run_segment_recognitionLSileroStreamSpeechDetector.process_samples.<locals>._run_segment_recognition   s     
]'+'='='G'GY]'^!^!;;32K2K+K8>D5"&"C"CFKKQU"VVV"&"K"KD"QQQ	 ,L; "_ WQ$ ]%CdS"GGOO\\\]so   C9)B* B$AB* B&B* B(B* !C9$B* &B* (B* *
C642C1&C)'C1,C91C66C9zRecording too short: z seczRecording finished: z%Error waiting for pending recognitionr\   zError in final recognitionzInvalid recognized text: z / validation: zNo text recognized, skippingz Recording max duration reached: z,No text recognized at max duration, skipping)5r:   get_sessionshould_muter#   preroll_bufferr$   
vad_bufferr_   r;   rN   extendlenr8   r9   r>   bytes_detect_speech_sileroamplitude_thresholdfloatmaxstructiter_unpackrecord_durationr   _execute_on_voicedis_recordingbufferr   r   silence_durationr   r   r5   r   r
   r,   asynciocreate_taskr   r~   r4   r7   infor^   r`   r}   rD   r|   rY   rf   rI   rm   r6   )r   ro   r   rZ   sample_durationspeech_detected	vad_chunkmax_amplitudefsegment_datacurrent_seqr   rj   r   
final_textr   
validationrh   s   `                 r   process_samples*SileroStreamSpeechDetector.process_samples{   sj    &&w/G"":.MMO""((*$$&LL?@%%g.!!'* w<!+0@0@4==0PQ  w!!"doo&99g00$//1AA1E1FGHI"88LO7#>#>#J %c)gVEWEWX\^eEf)g&g h $?$??&+O 7%%&1)<<%,%7%78H18L8M%N"::LL,_,=\'JaJabeIffqry  sE  sE  rF  G  H))*555##'+$ //ANN))!, 0 %%g.''?:'l ###e NN!!'*##6# ""))'2$$7$+,(340(-%((O;(00OC0 00D4R4RRG**+a/))(,%$W%;%;<,,1,%::] ]FV ]]` ] 4;3F3FG_`l  xC  HD  4E0 ;;GDDD''4+J+JJ$+$;$;g>V>V$V!$t'8'88zz&;<M;Nd$STzz&:;L:MT$RS 77Ca")"B"BBB
 ")!=!=J!)d+/+A+A+K+KGL^L^`efmftft`u+v%vF)/J
 "99-1-K-KJ-WWzW#'::$*KK2KJ<Wfgqfr0s$t ''.';'; ;(-gnn(=++D,K,KM[egkm~  AS  AS  -T  U::"KK(FG< ###9 ((D,=,==::KK"B7CZCZB[[_ `a 33?]%>>>>
 %99
55)-)G)G
)SS:S#zz &.G
|Sbcmbn,o p#MMO#*#7#77$)'..$9M''(G(GWacgip  jA  jA  CJ  CU  CU  )V  Wzz$RS###E 6t E C( a"LL)P[_L`a &w( d"LL)EPTLU"&"K"KBPbPb"cccd4 ?$ ]%LW[\]s   Ic` Hc5`"6B+c"`( 1`%2`( 6c<a aa Ec2b* b'b* Dc"c%`( (
a2acaca 
b$!2bbbcb$$c'b* *
c4ccccc                 6   U R                   R                  U5      nUc\  U R                  U5      u  p4U R                  UU R                  U R
                  S9n[        XR                  U5      nX R                   U'   UR                  c  U R                  Ul        U$ )N)	thresholdsampling_rate)	rF   get_get_model_and_lockVADIteratorClassr=   r8   r
   r   r   )r   r   rZ   model_r   s         r   r   &SileroStreamSpeechDetector.get_session&  s    ))--j9?//
;HE00;;".. 1 L
 'z3L3Ll[G29##J/&&.*.*B*BG'r!   )rG   rH   rI   rB   rF   r5   rD   )r'   r(   r)   r*   r   r   r   r,   r   r   boolr+   r   r   r
   rP   rT   r^   rW   rb   rf   dictrm   r   r   r-   r.   r/   s   @r   r1   r1   "   s   
 04,/+."! $%:>$(.1 KO3645!&+/X ,/X &e_	/X
 %*/X $)/X /X /X /X /X "/X hw~67/X /X SM/X ',/X  !/X" #/X$ 'xy0F'GH%/X& ,1'/X( /2)/X* +/X /Xb#7G1H)TX/1Y(Z _giln~h  BK  LP  BQ  iQ  `R XseXc]6J-K )S9I9UY?9Z0[ `hjsuxiy  |E  FJ  |K  jK  aL Us UEU U]	 ]WZ ]me m3 mZ^ msx m  GJ mi$U i$ i$ i$Vc  r!   r1   )r   loggingr   typingr   r   r   r   r   sileror	   r
   SileroRecordingSessionstt.baser   	getLoggerr'   r_   r1    r!   r   <module>r      sF       < < T '			8	$&- &.R!5 Rr!   