
    /j@                    z   S SK Jr  S SKrS SKrS SKrS SKrS SKJr  S SKJr  S SK	J
r
Jr  S SKJr  SSKJr  SS	KJrJr  SS
KJr  SSKJrJrJrJr  SSKJr  SSKJr  SSKJr  SSKJ r J!r!J"r"J#r#J$r$  \" S \RJ                  S9r&\ " S S5      5       r'\ " S S5      5       r( " S S\ \S      5      r) " S S\!5      r*g)    )annotationsN)AsyncIterable)	dataclass)AnyLiteral)rtc   )utils)APIConnectionErrorAPIError)logger)DEFAULT_API_CONNECT_OPTIONS	NOT_GIVENAPIConnectOptions
NotGivenOr)aio)AudioBuffer)VAD   )STTRecognizeStreamSpeechEventSpeechEventTypeSTTCapabilities	max_retrytimeoutc                  *    \ rS rSr% S\S'   S\S'   Srg)AvailabilityChangedEvent   r   sttbool	available N__name__
__module____qualname____firstlineno____annotations____static_attributes__r$       T/app/agent/.venv/lib/python3.13/site-packages/livekit/agents/stt/fallback_adapter.pyr   r      s    	HOr,   r   c                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg)	
_STTStatus"   r"   r#   zasyncio.Task[None] | Nonerecovering_recognize_taskrecovering_stream_taskr$   Nr%   r$   r,   r-   r/   r/   "   s    O8855r,   r/   c                  :  ^  \ rS rSrSSSSS.           SU 4S jjjr\SS j5       r\SS	 j5       r\S
S.           SS jjr	          SS jr
\S.       SS jjr\\S.       SU 4S jjjr\\S.     SS jjrSS jrSS jrSrU =r$ )FallbackAdapter)   Ng      $@r      )vadattempt_timeoutmax_retry_per_sttretry_intervalc          
     J  > [        U5      S:  a  [        S5      eU Vs/ s H!  ofR                  R                  (       a  M  UPM#     nnU(       ab  Uc'  SR	                  S U 5       5      n[        SU S35      eSSKJn	  U Vs/ s H%  ofR                  R                  (       d  U	" XbS	9OUPM'     nnS
n
[        S U 5       5      (       a  US   R                  R                  n
[        TU ])  [        S[        S U 5       5      [        S U 5       5      U
S9S9  Xl        X0l        X@l        XPl        U R                   Vs/ s H  n[!        SS S S9PM     snU l        U R                   H  nUR%                  SU R&                  5        M!     S
U l        g s  snf s  snf s  snf )Nr   z+At least one STT instance must be provided.z, c              3  8   #    U  H  oR                   v   M     g 7fN)label.0ts     r-   	<genexpr>+FallbackAdapter.__init__.<locals>.<genexpr>;   s     "F4Eq774Es   zSTTs do not support streaming: zx. Provide a VAD to enable stt.StreamAdapter automatically or wrap them with stt.StreamAdapter before using this adapter.r	   )StreamAdapter)r!   r7   Fc              3  L   #    U  H  oR                   R                  v   M     g 7fr=   )capabilitiesaligned_transcriptr?   s     r-   rB   rC   J   s     >#Q~~00#   "$r   Tc              3  L   #    U  H  oR                   R                  v   M     g 7fr=   )rF   interim_resultsr?   s     r-   rB   rC   P   s     #PCqNN$B$BCrH   c              3  L   #    U  H  oR                   R                  v   M     g 7fr=   )rF   diarizationr?   s     r-   rB   rC   Q   s     HCq : :CrH   )	streamingrJ   rL   rG   )rF   )r#   r1   r2   metrics_collected)len
ValueErrorrF   rM   joinr!   rD   allrG   super__init__r   _stt_instances_attempt_timeout_max_retry_per_stt_retry_intervalr/   _statuson_on_metrics_collected_recognize_metrics_needed)selfr!   r7   r8   r9   r:   rA   non_streaming_sttlabelsrD   rG   _stt_instance	__class__s                r-   rT   FallbackAdapter.__init__,   s    s8a<JKK(+L1>>3K3KQL{"F4E"FF 5fX >U U 
 , _b^aYZ^^5M5M!-STT^a   ?D>#>>>!$Q!4!4!G!G( ##PC#P PHCHH#5	 	 	
 " /"3- ((*
 ) *.'+
 )*
 !//LOO/1K1KL 0).&] M0*
s   FF,FF c                    g)Nr4   r$   r]   s    r-   modelFallbackAdapter.modelh   s     r,   c                    g)Nlivekitr$   re   s    r-   providerFallbackAdapter.providerl   s    r,   F)language
recoveringc                 #     UR                  UU[        R                  " UU R                  U R                  U R
                  S9S9I S h  vN $  N! [        R                   aR    U(       a%  [        R                  " UR                   S3SS0S9  e [        R                  " UR                   S3SS0S9  e [         aX  nU(       a&  [        R                  " UR                   S3USS0S	9  e [        R                  " UR                   S
3USS0S	9  e S nAf[         aR    U(       a%  [        R                  " UR                   S3SS0S9  e [        R                  " UR                   S3SS0S9  e f = f7f)Nr   r   r:   rl   conn_options recovery timed outstreamedFextra! timed out, switching to next STT recovery failedexc_inforu    failed, switching to next STT recovery unexpected error( unexpected error, switching to next STT)	recognizedataclassesreplacerW   rV   rX   asyncioTimeoutErrorr   warningr>   r   	Exception	exception)r]   r!   bufferrl   rq   rm   es          r-   _try_recognizeFallbackAdapter._try_recognizep   s    0	!(00 "55 11#'#7#7	 ' 	 	 	 	 ## 
	#)),?@UZH[\NN99+>?!5)
  	yyk!12%u-
 NN99+;<!5)
  	  yyk!;<ZQVDW 99+EF!5) 	s>   E5AA AA E5A A.E2 ADAE22E5c                 ^ ^^^^ T R                   T R                  R                  U5         mTR                  b  TR                  R	                  5       (       a.  SUUUU U4S jjn[
        R                  " U" U5      5      Tl        g g )Nc                6  >#     TR                  U TTTSS9I S h  vN   STl        [        R                  " U R                   S35        TR                  S[        U SS95        g  NI! [         a%    [        R                  " U R                   S3SS9   g f = f7f)NTr!   r   rl   rq   rm   
 recoveredstt_availability_changedr!   r#   z recovery attempt failed)ry   )	r   r#   r   infor>   emitr   r   debug)r!   r   rq   rl   r]   
stt_statuss    r-   _recover_stt_task8FallbackAdapter._try_recovery.<locals>._recover_stt_task   s     --%!)%1#' .    ,0J(KK399+Z 89II20SDI ! LLCII;.F!GRVWs9   BA' A%AA' $B%A' ',BBBBr!   r   returnNone)rY   rU   indexr1   doner   create_task)r]   r!   r   rl   rq   r   r   s   ` ``` @r-   _try_recoveryFallbackAdapter._try_recovery   sp     \\$"5"5";";C"@A
0083388:: ( 4;3F3FGXY\G]3^J0/ ;r,   rl   c          
       #    [         R                   " 5       n[        S U R                   5       5      nU(       a  [        R                  " S5        [        U R                  5       HZ  u  pgU R                  U   nUR                  (       d  U(       a   U R                  UUUUSS9I S h  vN s  $ U R                  XqX#S9  M\     [        SU R                   Vs/ s H  owR                  PM     sn S	[         R                   " 5       U-
   S
35      e Nf! [         a5    UR                  (       a!  SUl        U R                  S[        USS95         Nf = fs  snf 7f)Nc              3  B   #    U  H  oR                   (       + v   M     g 7fr=   r#   r@   r   s     r-   rB   2FallbackAdapter._recognize_impl.<locals>.<genexpr>   s     QLj1111L   $all STTs are unavailable, retrying..Fr   r   r   )r!   r   rl   rq   all STTs failed () after  seconds)timerR   rY   r   error	enumeraterU   r#   r   r   r   r   r   r   r>   )	r]   r   rl   rq   
start_time
all_failedir!   r   s	            r-   _recognize_implFallbackAdapter._recognize_impl   s>     YY[
QDLLQQ
LL?@ 3 34FAaJ##z!%!4!4%!)%1#( "5 "   3d' 5* !d6I6I J6Is6I JK8TXT]T]T_blTlSmmuv
 	
# ! !++/4
,		64N !KsH   BED)D*D-+EE
-#ED<EEEErp   c               <   >#    [         TU ]  XUS9I S h  vN $  N7f)Nrp   )rS   r}   )r]   r   rl   rq   rb   s       r-   r}   FallbackAdapter.recognize   s#      W&v|&\\\\s   c                   [        XUS9$ )N)r!   rl   rq   )FallbackRecognizeStream)r]   rl   rq   s      r-   streamFallbackAdapter.stream   s     '4Q]^^r,   c                p  #    U R                    Ho  nUR                  b(  [        R                  " UR                  5      I S h  vN   UR                  c  MG  [        R                  " UR                  5      I S h  vN   Mq     U R
                   H  nUR                  SU R                  5        M!     g  No N:7fNrN   )rY   r1   r   cancel_and_waitr2   rU   offr[   )r]   r   r!   s      r-   acloseFallbackAdapter.aclose  s     ,,J33?))**N*NOOO00<))**K*KLLL ' &&CGG')C)CD ' P Ms*   A B6B2B6#B69B4:9B64B6c                0    U R                   " S/UQ70 UD6  g r   )r   )r]   argskwargss      r-   r[   %FallbackAdapter._on_metrics_collected  s    		%777r,   )rV   rW   r\   rX   rY   rU   )r!   z	list[STT]r7   z
VAD | Noner8   floatr9   intr:   r   r   r   )r   str)r!   r   r   utils.AudioBufferrl   NotGivenOr[str]rq   r   rm   r"   r   r   )
r!   r   r   r   rl   r   rq   r   r   r   )r   r   rl   r   rq   r   r   r   )r   r   rl   r   rq   r   r   r   )rl   r   rq   r   r   r   r   r   )r   r   r   r   r   r   )r&   r'   r(   r)   rT   propertyrf   rj   r   r   r   r   $DEFAULT_FALLBACK_API_CONNECT_OPTIONSr}   r   r   r[   r+   __classcell__rb   s   @r-   r4   r4   )   s    !%!" !:/:/ 	:/
 :/ :/ :/ 
:/ :/x ! !   %. 9 9 "	9
 "9 (9 9 
9v"_ "_ "	"_
 ""_ ("_ 
"_P %.	$
!$
 "	$

 ($
 
$
T %.*N]] "	]
 (] 
] ] %.*N	_ "_ (	_
 
_	E8 8r,   r4   r   c                  \   ^  \ rS rSr\S.     SU 4S jjjrS	S jrS
S jrSS jrSr	U =r
$ )r   i  r   c               P   > [         TU ]  X[        S9  X l        Xl        / U l        g )N)r!   rq   sample_rate)rS   rT   r   	_language_fallback_adapter_recovering_streams)r]   r!   rl   rq   rb   s       r-   rT    FallbackRecognizeStream.__init__  s*     	SS!!$:< r,   c                :  ^ ^#    [         R                   " 5       n[        S T R                  R                   5       5      nU(       a  [        R
                  " S5        S mS nSUU 4S jjn[        T R                  R                  5       GH%  u  pVT R                  R                  U   nUR                  (       d  U(       a   UR                  T R                  [        R                  " T R                  T R                  R                  T R                  R                  T R                  R                   S9S9mUb  UR#                  5       (       a  [$        R&                  " U" 5       5      n T IS h  vN   T  S h  vN nT R(                  R+                  U5        M&  T R?                  U5        GM(     Ub  [@        RB                  " U5      I S h  vN   [$        RD                  " T RF                   V
s/ s H  oRI                  5       PM     sn
6 I S h  vN   [K        ST R                  R                   Vs/ s H  ofR0                  PM     sn S[         R                   " 5       U-
   S35      e N N
 S S S 5      IS h  vN    O! , IS h  vN  (       d  f       O= f! [$        R,                   a&    [        R.                  " UR0                   S3SS0S	9  e [2         a+  n	[        R.                  " UR0                   S
3U	SS0S9  e S n	A	f[4         a&    [        R6                  " UR0                   S3SS0S	9  e f = f  g ! [4         a@    UR                  (       a+  SUl        T R8                  R;                  S[=        USS95         GNf = f GNs  sn
f  GNs  snf 7f)Nc              3  B   #    U  H  oR                   (       + v   M     g 7fr=   r   r   s     r-   rB   /FallbackRecognizeStream._run.<locals>.<genexpr>%  s     cDbj1111Dbr   r   c                   >#    TR                     S h  vN n [        TR                  5       Hc  n [        U [        R
                  5      (       a  UR                  U 5        M6  [        U TR                  5      (       a  UR                  5         Mc  Me     Tc  M   [        U [        R
                  5      (       a  TR                  U 5        M  [        U TR                  5      (       a  TR                  5         M  M   N! [         a     M  f = f! [         a    [        R                  " SSS0S9   GM$  f = f
 TbE  [        R                  " [        5         TR                  5         S S S 5        g ! , (       d  f       g = fg 7f)Nz"error happened in forwarding inputrs   Trt   )	_input_chlistr   
isinstancer   
AudioFrame
push_frame_FlushSentinelflushr   r   r   
contextlibsuppressRuntimeError	end_input)datar   main_streamr]   s     r-   _forward_input_task9FallbackRecognizeStream._run.<locals>._forward_input_task,  s:    "nn d"4#;#;<F%dCNN;;"--d3'd.A.ABB"LLN C	 = *%dCNN;;'2248'd.A.ABB'--/ C %  % ((@UYHZ! -* &((6))+ 766 's   FD8C<D8F0C>"F$+C>F0DF+D8F<D8>
DFDF!D50F4D55!FE0'	F0
E>:Fro   rp   rv   rs   Trt   rz   rx   r|   Fr   r   r   r   r   r   )&r   rR   r   rY   r   r   r   rU   r#   r   r   r~   r   _conn_optionsrW   rV   rX   r   r   r   	_event_chsend_nowaitr   r   r>   r   r   r   _sttr   r   r   r   r   gatherr   r   r   )r]   r   r   forward_input_taskr   r   r!   r   evr   r   r   s   `          @r-   _runFallbackRecognizeStream._run"  s    YY[
cDDZDZDbDbcc
LL?@.28<	, 	,4   6 6 E EFFA//77:J##z."%**!%%0%8%8 ..&*&<&<&O&O$($:$:$K$K+/+A+A+Q+Q	& #- #K *15G5L5L5N5N-4-@-@ATAV-W*#.;,7 ?b $ : :2 >> s#g Gj )%%&8999nnT=U=UV=U6}}=UVWWW d6L6L6[6[ \6[s6[ \]]efjfofofqt~f~e  @H  I
 	
Q $/?K $/;;;;; #// "yyk)JK#-t"4 # "yyk)GH%&#-t"4
 $ (("yyk)QR#-t"4    !++/4
,		64N :VW !]s  B<NB(L>*J0I-1J4J7I1;I/
<I1?J2NN"N2NNN"N5N

#N-J/I11J2J=J >JL>J	
JJ	JL>JAL9 &L3L99L><N>ANNNNNNc           	     2  ^ ^^^ T R                   R                  T R                   R                  R                  T5         mTR                  b  TR                  R                  5       (       a  TR                  T R                  [        R                  " T R                  ST R                   R                  S9S9mT R                  R                  T5        SU UUU4S jjn[        R                  " U" 5       5      =Tl        nUR!                  U U4S j5        g g )Nr   r   rp   c                   >#     Sn T IS h  vN   T  S h  vN nUR                   [        R                  :X  d  M)  UR                  (       a  UR                  S   R                  (       d  MZ  U S-  n   S S S 5      IS h  vN   U S:X  a  g STl        [        R                  " STR                   S35        TR                  R                  S[        TSS95        g  N N
 Nm Na! , IS h  vN  (       d  f       Nv= f! [        R                   a1    [        R                  " TR                  R                   S3S	S0S
9   g [          a9  n[        R                  " TR                  R                   S3US	S0S9   S nAg S nAf["         a0    [        R$                  " TR                  R                   S3S	S0S
9  e f = f7f)Nr   r   Tzstt.FallbackAdapter, r   r   r   rr   rs   rt   rw   rx   r{   )typer   FINAL_TRANSCRIPTalternativestextr#   r   r   r>   r   r   r   r   r   r   r   r   r   r   )nb_transcriptr   r   r]   r   r!   r   s      r-   r   @FallbackRecognizeStream._try_recovery.<locals>._recover_stt_task  sz    %$%M%v(. &"!ww/*J*JJ')booa>P>U>U$, - 2 %  &v %)+/J(KK"7		{* MN**//20SDI  &&  &vvv& ++ NN!;;,,--@A)40   NN!;;,,--=>!")40
 ! $$!;;,,--GH)40 s   F>C= CC= C#CCCC#7C#4C= ?C! 
C= 
F>AC= F>C= CC#!C= #C:)C,*C:6C= =AF;?F>	F;
/E>9F>>=F;;F>c                :   > TR                   R                  T5      $ r=   )r   remove)r`   r]   r   s    r-   <lambda>7FallbackRecognizeStream._try_recovery.<locals>.<lambda>  s    T-E-E-L-LV-Tr,   r   )r   rY   rU   r   r2   r   r   r   r~   r   r   rV   r   appendr   r   add_done_callback)r]   r!   r   taskr   r   s   ``  @@r-   r   %FallbackRecognizeStream._try_recovery  s    ++33""1177<

 ,,4
8Y8Y8^8^8`8`ZZ(00&& 22CC   F $$++F3& &P 8?7J7JK\K^7__J-""#TUi 9ar,   c                ,   #    U  S h  vN nM   N
 g 7fr=   r$   )r]   event_aiterr`   s      r-   _metrics_monitor_task-FallbackRecognizeStream._metrics_monitor_task  s     " 	!	{s   )r   r   r   )r!   r4   rl   r   rq   r   r   r   )r   zAsyncIterable[SpeechEvent]r   r   )r&   r'   r(   r)   r   rT   r   r   r   r+   r   r   s   @r-   r   r     sH    
 %.	
= 
= "	
=
 (
= 
=`
D8Vt r,   r   )+
__future__r   r   r   r~   r   collections.abcr   r   typingr   r   ri   r    r
   _exceptionsr   r   logr   typesr   r   r   r   r   utils.audior   r7   r   r!   r   r   r   r   r   r   r   r   r/   r4   r   r$   r,   r-   <module>r	     s    "     ) !    6  Y Y  %  T T (94<<( $
   
 6 6 6i8*+,i8Xko kr,   