
    љiJ                         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
  S SKJs  Jr  SSKJr  \R"                  " \5      rSr " S S5      r " S	 S
\5      rg)    N)deque)AsyncGeneratorCallableOptionalDictList	Awaitable   )SpeechDetectori   c                   <    \ rS rSrS\S\4S jrS
S\S\4S jjrSr	g	)RecordingSession   
session_idpreroll_buffer_sizec                     Xl         SU l        [        5       U l        SU l        [        US9U l        0 U l        SU l        S U l	        S U l
        S U l        g )NFr   )maxlen)r   is_recording	bytearraybufferrecord_durationr   preroll_bufferdataon_recording_started_triggeredazure_push_streamazure_recognizer
event_loop)selfr   r   s      W/home/james-whalen/.local/lib/python3.13/site-packages/aiavatar/sts/vad/azure_stream.py__init__RecordingSession.__init__   sT    $"'!*&'%*2E%F	49+QUFJ?C    reasondebugc                 H   U(       al  [         R                  SU SU R                   SU R                   S[	        U R
                  5       SU R                  S S[	        U R                  5       35        U R
                  R                  5         SU l        S	U l        SU l	        g )
Nz![VAD_DEBUG] reset called: reason=z
, session=z, was_recording=, buffer_bytes=, duration=.2fzs, preroll_frames=Fr   )
loggerinfor   r   lenr   r   r   clearr   )r   r"   r#   s      r   resetRecordingSession.reset   s    KK3F8:dooEV W!!%!2!2 3?3t{{CSBT U 0055GDL_L_H`Gac
 	! .3+r!   )
r   r   r   r   r   r   r   r   r   r   N)unknownF)
__name__
__module____qualname____firstlineno__strintr   boolr,   __static_attributes__ r!   r   r   r      s0    D3 DS D4C 4D 4 4r!   r   c                   2  ^  \ rS rSrSSSSSSSS	SS
.	S\S\S\S\S\S\S\S\S\\\	/\	4      S\
S\\\/\S   4      4U 4S jjjrS\4S jrS\4S jrS\4S jrS\4S jrS\S\	4S jrS\\\/\S   4   S\\\/\S   4   4S  jrS! 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
S+ jrS,\	S&\S\
4S- jrS.\\	S4   S&\4S/ jrS0 rS&\4S1 jrS&\4S2 jr S&\4S3 jr!S&\S4\4S5 jr"S:S&\S4\S6\#S7\
4S8 jjr$S9r%U =r&$ );AzureStreamSpeechDetector*   zja-JPg      ?g      4@i>  r
   g       @NF)	azure_languagesilence_duration_thresholdmax_durationsample_ratechannelspreroll_buffer_secto_linear16r#   on_recording_startedazure_subscription_keyazure_regionr;   r<   r=   r>   r?   r@   rA   r#   rB   c                  > [         TU ]  US9  Xl        X l        X0l        X@l        XPl        Xpl        Xl        SU l	        Xl
        Xl        0 U l        U(       a  U R                  R                  U5        / U l        / U l        S U l        g )N)r>   F)superr   rC   rD   r;   r<   r=   r?   r#   debug_deeperr@   rA   recording_sessions_on_recording_startedappend_on_speech_detecting_on_speech_recognition_error_validate_recognized_text)r   rC   rD   r;   r<   r=   r>   r?   r@   rA   r#   rB   	__class__s               r   r   "AzureStreamSpeechDetector.__init__+   s     	[1&<#(,*D'( 
!"4&?A&&--.BC^`!_a)IM&r!   returnc           	          U R                   U R                  U R                  U R                  U R                  U R
                  U R                  U R                  S.$ )Nr;   r<   r=   r>   r?   r@   r#   rG   rR   )r   s    r   
get_config$AzureStreamSpeechDetector.get_configN   sP    "11*.*I*I --++"&"9"9ZZ --	
 		
r!   c                     U R                   U R                  -  S-  n[        S[        U R                  U-  [
        -  5      5      $ )zHCalculate preroll buffer size based on a conservative minimum chunk size   r
   )r>   r?   maxr4   r@   MIN_CHUNK_BYTES)r   bytes_per_secs     r   _calculate_preroll_buffer_size8AzureStreamSpeechDetector._calculate_preroll_buffer_sizeZ   s=    ((4==81<1c422]BoUVWWr!   sessionc                 x  ^ ^   [         R                  " 5       Tl        [
        R                  " T R                  T R                  S9nT R                  Ul
        [        T R                  S-  5      nUR                  [
        R                  R                  [!        U5      5        [#        S[        T R$                  S-  5      5      nUR                  [
        R                  R&                  [!        U5      5        [
        R(                  R+                  T R,                  ST R.                  S9n[
        R(                  R1                  US9Tl        [
        R(                  R5                  TR2                  S9n[
        R6                  " UUS9Tl        U U4S	 jnU U4S
 jnU U4S jn	TR8                  R:                  R=                  U5        TR8                  R>                  R=                  U5        TR8                  R@                  R=                  U	5        TR8                  RC                  5         T RD                  (       a#  [F        RI                  STRJ                   35        gg! [         a    [         R                  " 5       Tl         GNjf = f! [L         a"  n
[F        RO                  SU
 35         Sn
A
gSn
A
ff = f)z,Start Azure Speech recognition for a session)subscriptionregioni  i N     )samples_per_secondbits_per_sampler?   )stream_format)stream)speech_configaudio_configc                   > TR                   (       a^  [        R                  SU R                  R                   STR
                   S[        TR                  5       STR                  S S3	5        TR
                  (       Gd
  STl        [        TR                  TR                  -  TR                  -  S-  5      nS	n/ n[        TR                  5       H)  nU[        U5      -  nUR                  U5        X!:  d  M)    O   [        U5       H  nTR                  R!                  U5        M      TR                   (       aM  [        R                  S
[        TR                  5       S[        U5       S[        TR                  5       35        TR"                  (       aF   [$        R&                  " TR)                  U R                  R                  T5      TR*                  5        TR0                  (       d  TR2                  (       a  STl        TR                   (       a"  [        R                  STR4                   35        TR2                   H5  n [$        R&                  " U" TR4                  5      TR*                  5        M7     g g g ! [,         a  n[        R/                  SSS9   S nANS nAff = f! [,         a  n[        R/                  SSS9   S nAM  S nAff = f)Nz"[VAD_DEBUG] on_recognizing: text='', is_recording=r%   r&   r'   sTrV   r   z-[VAD_DEBUG] recording_started: preroll_total=z, used_frames=z, preroll_bytes=z-Error scheduling on_speech_detecting callbackexc_infoz on_recording_started triggered: z&Error in on_recording_started callback)r#   r(   r)   resulttextr   r*   r   r   r4   r@   r>   r?   reversedr   rJ   extendrK   asynciorun_coroutine_threadsafe_execute_on_speech_detectingr   	Exceptionerrorr   rI   r   )	evtpreroll_max_bytestotal_bytesframes_to_copyfexhandlerr   r\   s	          r   on_recognizingJAzureStreamSpeechDetector._start_azure_recognition.<locals>.on_recognizing   s}   ::KK<SZZ__<M N((/(<(<'=_SQXQ_Q_M`La b$$+$;$;C#@C ++++/G((+D,C,CdFVFV,VY]YfYf,fij,j(k%"#K%'N%g&<&<=#s1v-&--a0&;!	 >
 &n5--a0 6zzKCPWPfPfLgKh i++.~+>*??OPST[TbTbPcOdf
 ,,e889Z9Z[^[e[e[j[jls9tv}  wI  wI  J
 ==$B\B\=AG:zz&FwGYGYFZ$[\#'#=#=b#<<WWEWEW=XZaZlZlm $>	 C]=	 % e%T_cde  ) b"LL)Q\`Labs1   AJ 1J3
J0J++J03
K=KKc                 B  > TR                   (       au  [        R                  SU R                  R                   SU R                  R
                   STR                   S[        TR                  5       STR                  S S35        U R                  R                  [        R                  R                  :X  Ga  U R                  R
                  (       dA  TR                   (       a  [        R                  S5        TR                  S	TR                   S
9  g [        TR                  5      nTR                  nTR                   (       a=  [        R                  SU R                  R
                   S[        U5       SUS S35         TR                  (       a  TR                  U R                  R
                  5      =n(       a\  TR                   (       a/  [        R                  SU R                  R
                   SU 35         TR                  STR                   S
9  g [         R"                  " TR%                  XR                  R
                  S UTR&                  5      TR(                  5        TR                  STR                   S
9  g U R                  R                  [        R                  R.                  :X  aA  TR                   (       a  [        R                  S5        TR                  STR                   S
9  g TR                   (       aE  [        R                  SU R                  R                   SU R                  R
                   S35        g g ! [*         a  n[        R-                  SSS9   S nAGN	S nAff = f! TR                  STR                   S
9  f = f)Nz"[VAD_DEBUG] on_recognized: reason=z, text='rh   r%   r&   r'   ri   z+[VAD_DEBUG] recognized empty text, skippingrecognized_emptyr"   r#   z#[VAD_DEBUG] speech_detected: text='z', buffer_bytes=zInvalid recognized text: z / validation: recognized_speechz+Error scheduling execute_on_speech_detectedTrj   z[VAD_DEBUG] no_matchno_matchz([VAD_DEBUG] on_recognized other: reason=')r#   r(   r)   rl   r"   rm   r   r*   r   r   	speechsdkResultReasonRecognizedSpeechr,   bytesrM   rp   rq   execute_on_speech_detectedr   r   rs   rt   NoMatch)ru   recorded_datarecorded_duration
validationrz   r   r\   s        r   on_recognizedIAzureStreamSpeechDetector._start_azure_recognition.<locals>.on_recognized   s   ::KK<SZZ=N=N<OxX[XbXbXgXgWh i((/(<(<'=_SQXQ_Q_M`La b$$+$;$;C#@C
 ::$$	(>(>(O(OO::??::"KK(UV-?tzzR$)'..$9M(/(?(?%zzA#**//AR S,,/,>+?{K\]`JaabdT99-1-K-KCJJOO-\\z\#'::$*KK2KCJJOOK\\klvkw0x$y &  -@

S  88 ;;M::??\`bsu|  vH  vH  I#..  -@

SZZ&&)*@*@*H*HHzz$:;MM4::MFzz&NszzO`O`Naaijmjtjtjyjyizz{$|} " % c%R]abc  -@

Ss2   A=M  AM 
M? M:4N :M??N Nc           
      V  > TR                   (       aE  [        R                  SU R                   STR                   S[        TR                  5       35        U R                  [        R                  R                  :X  ae  TR                  (       aT   [        SU R                   35      n[        R                  " TR                  UTR                   5      TR"                  5        TR'                  STR                   S	9  g ! [         a  n[        R%                  SSS9   S nAN>S nAff = f)
Nz [VAD_DEBUG] on_canceled: reason=z, is_recording=r%   z Azure speech recognition error: z5Error scheduling on_speech_recognition_error callbackTrj   canceledr   )r#   r(   r)   r"   r   r*   r   r   CancellationReasonErrorrL   rs   error_detailsrp   rq   $_execute_on_speech_recognition_errorr   r   rt   r,   )ru   rt   rz   r   r\   s      r   on_canceledGAzureStreamSpeechDetector._start_azure_recognition.<locals>.on_canceled   s   ::KK"B3::,o^e^r^r]s  tC  DG  HO  HV  HV  DW  CX  !Y  Z::!=!=!C!CCHiHim ),LSM^M^L_*` a889b9bchjqj|j|9}  @G  @R  @R  S ZtzzB % m%\gklms   AD   
D(
D##D(z&Azure recognition started for session z#Failed to start Azure recognition: N)(rp   get_running_loopr   RuntimeErrorget_event_loopr   SpeechConfigrC   rD   r;   speech_recognition_languager4   r<   set_property
PropertyId#Speech_SegmentationSilenceTimeoutMsr3   rW   r=    Speech_SegmentationMaximumTimeMsaudioAudioStreamFormatr>   r?   PushAudioInputStreamr   AudioConfigSpeechRecognizerr   recognizingconnect
recognizedr   start_continuous_recognitionr#   r(   r)   r   rs   rt   )r   r\   re   silence_timeout_msmax_duration_msaudio_formatrf   r|   r   r   es   ``         r   _start_azure_recognition2AzureStreamSpeechDetector._start_azure_recognition_   sA   V	D>%,%=%=%?" &22!88((M 9=8K8KM5 "%T%D%Dt%K!L&&$$HH&' "%T->->-E)FGO&&$$EEO$
 %??<<#'#3#3 " = L
 )2(L(L[g(L(hG%$??66g>W>W6XL'0'A'A+)(G$
+bZ*~X
C $$0088H$$//77F$$--55kB$$AACzzDWEWEWDXYZ ]   >%,%;%;%=">b  	DLL>qcBCC	Ds5   I" IJ "$J
J 	J

J 
J9J44J9c                     UR                   (       a!  UR                   R                  5         SUl         UR                  (       a!  UR                  R                  5         SUl        U R                  (       a#  [
        R                  SUR                   35        gg! [         a"  n[
        R                  SU 35         SnAgSnAff = f)z+Stop Azure Speech recognition for a sessionNz&Azure recognition stopped for session z"Failed to stop Azure recognition: )
r   closer   stop_continuous_recognitionr#   r(   r)   r   rs   rt   )r   r\   r   s      r   _stop_azure_recognition1AzureStreamSpeechDetector._stop_azure_recognition   s    	C(())//1,0)''((DDF+/(zzDWEWEWDXYZ   	CLL=aSABB	Cs   BB 
C%CC
audio_datac                 &   UR                   (       a   UR                   R                  U5        gU R
                  (       a#  [        R                  SUR                   35        gg! [         a"  n[        R	                  SU 35         SnAgSnAff = f)z%Write audio data to Azure push streamz!Failed to write to Azure stream: Nz&Azure push stream is None for session )r   writers   r(   rt   r#   warningr   )r   r\   r   r   s       r   _write_to_azure_stream0AzureStreamSpeechDetector._write_to_azure_stream
  sy    $$F))//
; zz!GHZHZG[\]   F@DEEFs   A$ $
B.BBfuncc                 <    U R                   R                  U5        U$ )zRegister callback for speech detecting (partial results).

The callback is called with (text: str, session: RecordingSession).
)rK   rJ   r   r   s     r   on_speech_detecting-AzureStreamSpeechDetector.on_speech_detecting  s    
 	!!((.r!   c                     Xl         U$ N)rM   r   s     r   validate_recognized_text2AzureStreamSpeechDetector.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).
)rL   rJ   r   s     r   on_speech_recognition_error5AzureStreamSpeechDetector.on_speech_recognition_error!  s    
 	))006r!   rm   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_detecting callbacks.Nz%Error in on_speech_detecting callbackTrj   )rK   rs   r(   rt   )r   rm   r\   r{   s       r   rr   6AzureStreamSpeechDetector._execute_on_speech_detecting)  sM     00GUd,,, 1, UDtTU1   A*(*A*AAAArt   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 callbackTrj   )rL   rs   r(   rt   )r   rt   r   r{   s       r   r   >AzureStreamSpeechDetector._execute_on_speech_recognition_error1  sN     88G]e000 90 ]LW[\]r   r   metadatar   c                 F   #    U R                  XX4U5      I S h  vN   g  N7fr   )_execute_on_speech_detected)r   r   rm   r   r   r   s         r   r   4AzureStreamSpeechDetector.execute_on_speech_detected9  s     ..}Hakllls   !!samplesc           	      x  #    U R                   (       a  U R                  U5      nU R                  (       a:  U R                  (       a)  [        R	                  SU SU R                  5        35        U R                  U5      nU R                  5       (       a5  UR                  SU R                  S9  UR                  R                  5         g[        U5      S-  U R                  U R                  -  -  nU R                  (       a5  U R                  (       a$  [        R	                  SU S[        U5       35        U R                  X15        UR                  R                  U5        UR                  (       a0  UR                   R#                  U5        U=R$                  U-  sl        U R                  (       aw  UR                  (       af  ['        UR$                  S	-  5      S
-  S:X  aG  [        R	                  SUR                   S[        UR                   5       SUR$                  S S35        UR                  $ 7f)Nzprocess_samples: session_id=z, should_mute=mutedr   FrV   z"Send samples to Azure: session_id=z
, samples=
   2   r   z*[VAD_DEBUG] process_samples: is_recording=r%   r&   r'   ri   )rA   r#   rG   r(   r)   should_muteget_sessionr,   r   r+   r*   r>   r?   r   rJ   r   r   ro   r   r4   )r   r   r   r\   sample_durations        r   process_samples)AzureStreamSpeechDetector.process_samples<  s    &&w/G::$++KK6zl.QUQaQaQcPdef"":.MM

M;""((* w<!+0@0@4==0PQ ::$++KK<ZL
SVW^S_R`ab##G5 	%%g. NN!!'*##6#::'..3w7N7NQS7S3TWY3Y]^3^KK<W=Q=Q<R S  #GNN 34K@W@WX[?\\]_
 ###s   H8H:input_streamc                 ,  #    [         R                  S5        U  S h  vN nU(       d    O9U R                  X25      I S h  vN   [        R                  " S5      I S h  vN   MK  U R                  U5        [         R                  S5        g  Nm NM N1
 N/7f)Nz2AzureStreamSpeechDetector start processing stream.g-C6?z3AzureStreamSpeechDetector finish processing stream.)r(   r)   r   rp   sleepdelete_session)r   r   r   r   s       r   process_stream(AzureStreamSpeechDetector.process_streamb  su     HI& 	($&&t888--'''J'IJ	( 9'	 'sI   BBBBB BBB-BBBBBc                 .   #    U R                  U5        g 7fr   )r   )r   r   s     r   finalize_session*AzureStreamSpeechDetector.finalize_sessiono  s     J's   c                    U R                   R                  U5      nUcf  U R                  5       n[        X5      nX R                   U'   U R	                  U5        U R
                  (       a  [        R                  SU SU 35        U$ )NzSession created: z, preroll_buffer_size=)rH   getrZ   r   r   r#   r(   r)   )r   r   r\   r   s       r   r   %AzureStreamSpeechDetector.get_sessionr  s{    ))--j9?"&"E"E"G&zGG29##J/))'2zz/
|;QReQfghr!   c                 ~    U R                   R                  U5      =n(       a  UR                  SU R                  S9  g g )Nreset_sessionr   )rH   r   r,   r#   r   r   r\   s      r   r   'AzureStreamSpeechDetector.reset_session~  s7    --11*==7=MM

MC >r!   c                 ~    XR                   ;   a.  U R                   U   nU R                  U5        U R                   U	 g g r   )rH   r   r   s      r   r   (AzureStreamSpeechDetector.delete_session  s?    000--j9G((1''
3 1r!   keyc                 ~    U R                   R                  U5      nU(       a  UR                  R                  U5      $ g r   )rH   r   r   )r   r   r   r\   s       r   get_session_data*AzureStreamSpeechDetector.get_session_data  s5    ))--j9<<##C(( r!   valuecreate_sessionc                     U(       a  U R                  U5      nOU R                  R                  U5      nU(       a  X5R                  U'   g g r   )r   rH   r   r   )r   r   r   r   r   r\   s         r   set_session_data*AzureStreamSpeechDetector.set_session_data  s?    &&z2G--11*=G %LL r!   )rK   rL   rM   r;   rD   rC   r?   r#   rG   r=   r@   rH   r<   rA   )F)'r/   r0   r1   r2   r3   floatr4   r   r   r   r5   r	   r   dictrS   rZ   r   r   r   r   r   r   rs   r   rr   r   r   r   r   r   r   r   r   r   r   anyr   r6   __classcell__)rN   s   @r   r9   r9   *   s    &,/" $':>KO!N !$!N 	!N
 !N %*!N !N !N !N "!N hw~67!N !N 'xy0F'GH!N !NF

D 

X X
XD0@ XDtC/? C"	^.> 	^E 	^#7G1H)TX/1Y(Z _giln~h  BK  LP  BQ  iQ  `R )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$$U $$ $$ $$LKt1L KZ] K(
c 
D D4 4)3 )S )
&3 &S & &VZ & &r!   r9   )rp   collectionsr   loggingtypingr   r   r   r   r   r	   azure.cognitiveservices.speechcognitiveservicesspeechr    r   	getLoggerr/   r(   rX   r   r9   r7   r!   r   <module>r      sJ       L L 2 2 			8	$4 48j& j&r!   