
    /jF                    @   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JrJrJr  S S	KJr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%  SSK&J'r'  SSKJ(r(J)r)J*r*J+r+J,r,  SSK-J.r.J/r/J0r0  SSK1J2r2  \ " S S\3\5      5       r4\ " S S5      5       r5\ " S S5      5       r6\ " S S5      5       r7\ " S S5      5       r8 " S S\5      r9\" S 5      r: " S! S"\\Rv                  \S#   \:-     \\:   5      r< " S$ S%\5      r=\=r>g)&    )annotationsN)ABCabstractmethod)AsyncIterableAsyncIterator)	dataclassfield)Enumunique)TracebackType)AnyGenericLiteralTypeVar)	BaseModel
ConfigDictField)rtc)Metadata   )APIConnectionErrorAPIError)LanguageCode)logger)
STTMetrics)DEFAULT_API_CONNECT_OPTIONS	NOT_GIVENAPIConnectOptions
NotGivenOrTimedString)AudioBufferaiois_given)calculate_audio_durationc                  6    \ rS rSrSr Sr Sr Sr Sr Sr	Sr
g	)
SpeechEventType    start_of_speechinterim_transcriptpreflight_transcriptfinal_transcriptrecognition_usageend_of_speech N)__name__
__module____qualname____firstlineno__START_OF_SPEECHINTERIM_TRANSCRIPTPREFLIGHT_TRANSCRIPTFINAL_TRANSCRIPTRECOGNITION_USAGEEND_OF_SPEECH__static_attributes__r.       G/app/agent/.venv/lib/python3.13/site-packages/livekit/agents/stt/stt.pyr&   r&       s?    'Ot-@1 *)+E#MJr:   r&   c                      \ rS rSr% S\S'   S\S'   S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S\S'    SrS\S'    SrS\S'    SS jrSrg)
SpeechData5   r   languagestrtext        float
start_timeend_time
confidenceNz
str | None
speaker_idzbool | Noneis_primary_speakerzlist[TimedString] | Nonewordszlist[LanguageCode] | Nonesource_languageszlist[str] | Nonesource_textszdict[str, Any] | Nonemetadatac                   [        U R                  [        5      (       d9  [        U R                  [        5      (       a  [        U R                  5      U l        U R                  bX  U R                   Vs/ s H:  n[        U[        5      (       d   [        U[        5      (       a  [        U5      OUPM<     snU l        g g s  snf N)
isinstancer?   r   r@   rJ   )selflangs     r;   __post_init__SpeechData.__post_init__L   s    $--66:dmmUX;Y;Y(7DM  ,
 !11	% 2D "$55*T3:O:O T" 2	%D! -%s   4AB?)r?   rJ   returnNone)r/   r0   r1   r2   __annotations__rD   rE   rF   rG   rH   rI   rJ   rK   rL   rR   r9   r.   r:   r;   r=   r=   5   s    
IJHeJ!J
!&**&*E#*26/6]
 &*L")O&*H#*b	r:   r=   c                  >    \ rS rSr% S\S'    SrS\S'   SrS\S'   Srg	)
RecognitionUsageX   rC   audio_durationr   intinput_tokensoutput_tokensr.   N)r/   r0   r1   r2   rW   r]   r^   r9   r.   r:   r;   rY   rY   X   s    5L#M3r:   rY   c                  R    \ rS rSr% S\S'   SrS\S'   \" \S9rS\S	'   S
r	S\S'   Sr
g
)SpeechEvent`   r&   type r@   
request_id)default_factoryzlist[SpeechData]alternativesNzRecognitionUsage | Noner,   r.   )r/   r0   r1   r2   rW   rd   r	   listrf   r,   r9   r.   r:   r;   r`   r`   `   s.    
J%*4%@L"@15.5r:   r`   c                  T    \ rS rSr% S\S'   S\S'   SrS\S'   SrS\S'   S	rS\S
'   Srg)STTCapabilitiesh   bool	streaminginterim_resultsFdiarizationzLiteral['word', 'chunk', False]aligned_transcriptToffline_recognizer.   N)	r/   r0   r1   r2   rW   rn   ro   rp   r9   r.   r:   r;   ri   ri   h   s1    OK:?7?"t"Kr:   ri   c                  f    \ rS rSr% \" SS9rSrS\S'   S\S'   S	\S
'   \" SSS9r	S\S'   S\S'   Sr
g)STTErrorr   T)arbitrary_types_allowed	stt_errorzLiteral['stt_error']rb   rC   	timestampr@   label.)exclude	Exceptionerrorrk   recoverabler.   N)r/   r0   r1   r2   r   model_configrb   rW   r   rz   r9   r.   r:   r;   rr   rr   r   s9    d;L!,D
,JS$/E9/r:   rr   TEventc                  (  ^  \ 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.       SS jj5       r\\S	.       SS
 jjrSS jr\\S	.     SS jjrSS jrSS jr        SS jrSS jrSrU =r$ )STT~   c                  > [         TU ]  5         Xl        [        U 5      R                   S[        U 5      R
                   3U l        SU l        g )N.T)super__init___capabilitiesrb   r0   r/   _label_recognize_metrics_needed)rP   capabilities	__class__s     r;   r   STT.__init__   sD    )d../qd1D1D0EF)-&r:   c                    U R                   $ rN   )r   rP   s    r;   rw   	STT.label   s    {{r:   c                    g)zGet the model name/identifier for this STT instance.

Returns:
    The model name if available, "unknown" otherwise.

Note:
    Plugins should override this property to provide their model information.
unknownr.   r   s    r;   model	STT.model        r:   c                    g)zGet the provider name/identifier for this STT instance.

Returns:
    The provider name if available, "unknown" otherwise.

Note:
    Plugins should override this property to provide their provider information.
r   r.   r   s    r;   providerSTT.provider   r   r:   c                    U R                   $ rN   )r   r   s    r;   r   STT.capabilities   s    !!!r:   )r?   c                  #    g 7frN   r.   )rP   bufferr?   conn_optionss       r;   _recognize_implSTT._recognize_impl   s
         r?   r   c                 #    [        UR                  S-   5       H  n [        R                  " 5       nU R	                  XUS9I S h  vN nU R
                  (       a  [        R                  " 5       U-
  n[        UR                  [        R                  " 5       UU R                  [        U5      S[        U R                  U R                  S9S9nU R                  SU5        Us  $    [/        S5      e N! [         a  n	UR                  U5      n
UR                  S:X  a  U R!                  U	SS9  e XCR                  :X  a-  U R!                  U	SS9  [#        S	UR                  S-    S
35      U	eU R!                  U	SS9  [$        R&                  " SU	 SU
 S3U R                  US-   SS.S9  [(        R*                  " U
5      I S h  vN     S n	A	GM  S n	A	f[,         a  n	U R!                  U	SS9  e S n	A	ff = f7f)N   r   F
model_namemodel_provider)rd   rv   durationrw   r[   streamedrL   metrics_collectedr   r{   !failed to recognize speech after 	 attemptsTfailed to recognize speech: , retrying in ssttattemptr   extraunreachable)range	max_retrytimeperf_counterr   r   r   rd   r   r$   r   r   r   emitr   _interval_for_retry_emit_errorr   r   warningasynciosleepry   RuntimeError)rP   r   r?   r   irD   eventr   stt_metricseretry_intervals              r;   	recognizeSTT.recognize   s     |--12A/!..0
"22L 3   11#002Z?H",#(#3#3"&))+!)"kk'?'G!&!)'+zz+/=="#K II1;?+ 3d =))_(  4!-!A!A!!D))Q.$$QE$:000$$QE$:,;L<R<RUV<V;WW`a $$QD$9NN6qcGWWXY#';;'(1u(- mmN3333    6sZ   G6(C5C3BC5#G63C55
G3?CGGG	G6G3G..G33G6c           
     v    U R                  S[        [        R                  " 5       U R                  UUS95        g Nrz   )rv   rw   rz   r{   )r   rr   r   r   rP   	api_errorr{   s      r;   r   STT._emit_error   s/    		))+kk'		
r:   c                   [        S5      e)NzYstreaming is not supported by this STT, please use a different STT or use a StreamAdapter)NotImplementedError)rP   r?   r   s      r;   stream
STT.stream   s     "g
 	
r:   c                   #    g7f)z;Close the STT, and every stream/requests associated with itNr.   r   s    r;   aclose
STT.aclose  s     r   c                   #    U $ 7frN   r.   r   s    r;   
__aenter__STT.__aenter__  
        c                @   #    U R                  5       I S h  vN   g  N7frN   r   rP   exc_typeexcexc_tbs       r;   	__aexit__STT.__aexit__	        kkm   c                    g)z&Pre-warm connection to the STT serviceNr.   r   s    r;   prewarmSTT.prewarm  s    r:   )r   r   r   )r   ri   rU   rV   )rU   r@   )rU   ri   )r   r!   r?   NotGivenOr[str]r   r   rU   r`   r   ry   r{   rk   rU   rV   )r?   r   r   r   rU   RecognizeStreamrT   )rU   r   r   ztype[BaseException] | Noner   zBaseException | Noner   zTracebackType | NonerU   rV   )r/   r0   r1   r2   r   propertyrw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r9   __classcell__)r   s   @r;   r   r   ~   s:   
.   	 	 	 	 " " 
 %.	 "	
 ( 
  %.*E9*9* "	9*
 (9* 
9*v	
 %.*E	
 "
 (	

 

, " %	
 
 r:   r   )r   rz   c                  0   \ rS rSr " S S5      r\S.     SS jjr\SS j5       r\R                  SS j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S jrSS jrS#S jr        S$S jrSrg)%r   i  c                      \ rS rSrSrSrg)RecognizeStream._FlushSentineli  z$Sentinel to mark when it was flushedr.   N)r/   r0   r1   r2   __doc__r9   r.   r:   r;   _FlushSentinelr     s    2r:   r   )sample_ratec                 ^  UT l         U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        ST l        [        R                   " T R)                  5       5      T l        T R*                  R-                  U 4S j5        [/        U5      (       a  UOST l        ST l        ST l        ST l        g)a8  
Args:
sample_rate : int or None, optional
    The desired sample rate for the audio input.
    If specified, the audio input will be automatically resampled to match
    the given sample rate before being processed for Speech-to-Text.
    If not provided (None), the input will retain its original sample rate.
r   zSTT._metrics_task)namer   c                8   > TR                   R                  5       $ rN   )	_event_chclose)_rP   s    r;   <lambda>*RecognizeStream.__init__.<locals>.<lambda>8  s    t~~/C/C/Er:   NrB   )_stt_conn_optionsr"   Chanr   
AudioFramer   r   	_input_chr`   r   	itertoolstee_tee_event_aiterr   create_task_metrics_monitor_task_metrics_task_num_retries
_main_task_taskadd_done_callbackr#   
_needed_sr
_pushed_sr
_resampler_start_time_offset)rP   r   r   r   monitor_aiters   `    r;   r   RecognizeStream.__init__  s     	)#..?3Q3Q"QRT+.0MM%%dnna8	+/99(=$00&&}5<O
 (():;


$$%EF)1+)>)>+D59),r:   c                    U R                   $ rN   )r
  r   s    r;   start_time_offset!RecognizeStream.start_time_offset@  s    &&&r:   c                2    US:  a  [        S5      eXl        g )Nr   z&start_time_offset must be non-negative)
ValueErrorr
  )rP   values     r;   r  r  D  s    19EFF"'r:   c                   U R                   R                  S[        S[        R                  " 5       SU R                   R                  SSUU[        U R                   R                  U R                   R                  S9S9	5        g)z@Report connection timing as an STTMetrics event with zero usage.r   rc   rB   Tr   )	rd   rv   r   rw   r[   r   acquire_timeconnection_reusedrL   N)r   r   r   r   r   r   r   r   )rP   r  r  s      r;   _report_connection_acquired+RecognizeStream._report_connection_acquiredJ  sa    		))+ii&&")"3!TYY__TYYM_M_`
	
r:   c                   #    g 7frN   r.   r   s    r;   _runRecognizeStream._run[  s     "%r   c                  #    U R                   R                  n[        R                  " 5       nU R                  U::  aY   U =R                  [        R                  " 5       U-
  -  sl        [        R                  " 5       nU R                  5       I S h  vN $ g  N! [         Ga  nUS:X  a  U R                  USS9  e U R                  U:X  a*  U R                  USS9  [        SU R                   S35      UeU R                  USS9  U R                   R                  U R                  5      n[        R                  " SU SU S	3U R                  R                  U R                  SS
.S9  [        R                  " U5      I S h  vN    U =R                  S-  sl         S nAO&S nAf[          a  nU R                  USS9  e S nAff = fU R                  U::  a  GM  g 7f)Nr   Fr   r   r   Tr   r   r   r   r   r   )r   r   r   r  r
  r  r   r   r   r   r   r   r   r   r   r   ry   )rP   max_retrieslast_start_timer   r   s        r;   r  RecognizeStream._main_task^  s    ((22 ))+;.''499;+HH'"&))+!YY[((	 / ) '!#$$QE$:&&+5$$QE$:,;D<M<M;NiX $$QD$9%)%7%7%K%KDL]L]%^NNN6qcGWWXY#'99#3#3'+'8'8(, "--777!!Q&!!    6= ;.s`   <GAB BB GB G%CF"FF"G"G/G  GGGc           
         U R                   R                  S[        [        R                  " 5       U R                   R                  UUS95        g r   )r   r   rr   r   r   r   s      r;   r   RecognizeStream._emit_error  s9    		))+ii&&'		
r:   c                ~  #    U  Sh  vN nUR                   [        R                  :X  a  UR                  c   S5       e[	        UR
                  [        R                  " 5       SU R                  R                  UR                  R                  UR                  R                  UR                  R                  S[        U R                  R                  U R                  R                  S9S9	nU R                  R                  SU5        GM  UR                   [        R                   :X  d  GM)  SU l        GM3   GN/
 g7f)	zTask used to collect metricsNz>recognition_usage must be provided for RECOGNITION_USAGE eventrB   Tr   )	rd   rv   r   rw   r[   r]   r^   r   rL   r   r   )rb   r&   r7   r,   r   rd   r   r   r   r[   r]   r^   r   r   r   r   r6   r  )rP   event_aiterevr   s       r;   r  %RecognizeStream._metrics_monitor_task  s      $ 	&"ww/;;;++7 T7 )!}}"iik ))**#%#7#7#F#F!#!5!5!B!B"$"6"6"D"D!%#'99??499CUCU 		2K@O<<<$%!/	&s,   D=D;D8D;DD=.
D=8D;;D=c                   U R                  5         U R                  5         U R                  (       a%  U R                  UR                  :w  a  [	        S5      eUR                  U l        U R
                  (       ar  U R
                  UR                  :w  aX  U R                  (       dG  [        R                  " UR                  U R
                  [        R                  R                  S9U l        U R                  (       a@  U R                  R                  U5      nU H  nU R                  R                  U5        M      gU R                  R                  U5        g)zPush audio to be recognizedz6the sample rate of the input frames must be consistent)qualityN)_check_input_not_ended_check_not_closedr  r   r  r  r	  r   AudioResamplerAudioResamplerQualityHIGHpushr   send_nowait)rP   frameframess      r;   
push_frameRecognizeStream.push_frame  s    ##% ??t%2C2CCUVV++??t%2C2CC??"%"4"4%%OO55::# ??__))%0F**51   NN&&u-r:   c                0   U R                  5         U R                  5         U R                  (       a<  U R                  R                  5        H  nU R                  R                  U5        M      U R                  R                  U R                  5       5        g)z#Mark the end of the current segmentN)r'  r(  r	  flushr   r-  r   )rP   r.  s     r;   r3  RecognizeStream.flush  sg    ##% ??..0**51 1 	""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)r3  r   r   r   s    r;   	end_inputRecognizeStream.end_input  s    

r:   c                J  #    U R                   R                  5         [        R                  " U R                  5      I Sh  vN   U R
                  b(  [        R                  " U R
                  5      I Sh  vN   U R                  R                  5       I Sh  vN   g N\ N) N	7f)zClose ths stream immediatelyN)r   r   r"   cancel_and_waitr  r  r   r   r   s    r;   r   RecognizeStream.aclose  sv     !!$**---)%%d&8&8999ii    	. : s5   >B# B4B#5B6!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rN   )r   	__anext__StopAsyncIterationr  	cancelled	exception)rP   valr   s      r;   r<  RecognizeStream.__anext__  sr     	/))3355C 
 6! 	/::''))djj6J6J6L/Ls/L	$$.		/s&   B* (* B* AA>>Bc                    U $ rN   r.   r   s    r;   	__aiter__RecognizeStream.__aiter__  s    r:   c                    U R                   R                  (       a0  [        U 5      n[        UR                   SUR
                   S35      eg )Nr   z
 is closed)r   closedrb   r   r0   r/   rP   clss     r;   r(  !RecognizeStream._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 )Nr   z input ended)r   rF  rb   r   r0   r/   rG  s     r;   r'  &RecognizeStream._check_input_not_ended  s>    >>  t*C#..!13<<.MNN !r:   c                   #    U $ 7frN   r.   r   s    r;   r   RecognizeStream.__aenter__  r   r   c                @   #    U R                  5       I S h  vN   g  N7frN   r   r   s       r;   r   RecognizeStream.__aexit__  r   r   )r   r   r   r   r  r  r  r  r	  r
  r   r  r   N)r   r   r   r   r   zNotGivenOr[int])rU   rC   )r  rC   rU   rV   )r  rC   r  rk   rU   rV   rT   r   )r"  zAsyncIterable[SpeechEvent]rU   rV   )r.  zrtc.AudioFramerU   rV   )rU   r`   )rU   zAsyncIterator[SpeechEvent])rU   r   r   )r/   r0   r1   r2   r   r   r   r   r  setterr  r   r  r  r   r  r0  r3  r6  r   r<  rC  r(  r'  r   r   r9   r.   r:   r;   r   r     s      (1"- "- (	"-
 %"-H ' ' ( (

" % %&P	
&8.2	:
!	M
O
, " %	
 
r:   r   )?
__future__r   r   r   abcr   r   collections.abcr   r   dataclassesr   r	   enumr
   r   typesr   typingr   r   r   r   pydanticr   r   r   livekitr   livekit.agents.metrics.baser   _exceptionsr   r   r?   r   logr   metricsr   r   r   r   r   r    utilsr!   r"   r#   utils.audior$   r@   r&   r=   rY   r`   ri   rr   r}   EventEmitterr   r   SpeechStreamr.   r:   r;   <module>rb     s6   "   # 8 (   1 1 1 1  0 6 #     / . 2 Kc4 K K(   D    6 6 6 L L Ly  
	UW9:VCDFOUpkc k\ r:   