+
    ~j                       ^ RI Ht ^ RIt^ RIt^ RIt^ RIt^ RIHtHt ^ RI	H
t
Ht ^ RIHt ^ RIHt ^ RIHtHtHtHtHt ^ RIHt ^ R	IHtHtHt ^ R
IHt ^ RIHt ^RI H!t!H"t" ^RI#H$t$ ^RI%H&t& ^RI'H(t(H)t)H*t+ ^RIH,t,H-t-H.t. ^RI*H/t/H0t0H1t1H2t2H3t3 ]'       d   ^RI4H5t5 ]6! ]Pn                  ! R^ 4      4      t8] ! R R4      4       t9] ! R R4      4       t: ! R R]4      t;]! R4      t< ! R R]]Pz                  ]R%,          ]<,          ,          ]]<,          4      t> ! R R]4      t? ! R R ]?4      t@ ! R! R"]4      tA ! R# R$4      tBR# )&    )annotationsN)ABCabstractmethod)AsyncIterableAsyncIterator)	dataclass)TracebackType)TYPE_CHECKINGClassVarGenericLiteralTypeVar)trace)	BaseModel
ConfigDictField)rtc)Metadata)APIErrorAPIStatusErrorlogger)
TTSMetrics)trace_typestracerutils)DEFAULT_API_CONNECT_OPTIONSUSERDATA_TIMED_TRANSCRIPTAPIConnectOptions)aioaudiocodecslog_exceptions	shortuuidTimedStringLK_DUMP_TTSc                  ^    ] tR t^ t$ R]R&    R]R&    RtR]R&    RtR]R	&    RtR]R
&   RtR# )SynthesizedAudiortc.AudioFrameframestr
request_idFboolis_final 
segment_id
delta_text N)	__name__
__module____qualname____firstlineno____annotations__r/   r1   r2   __static_attributes__r3       k/Users/mitch_tango/dev/rabbit-r1-livekit/agent/.venv/lib/python3.14/site-packages/livekit/agents/tts/tts.pyr)   r)       s:    !OHHd5JKJCr:   r)   c                  2    ] tR t^.t$ R]R&    RtR]R&   RtR# )TTSCapabilitiesr.   	streamingFaligned_transcriptr3   N)r4   r5   r6   r7   r8   r?   r9   r3   r:   r;   r=   r=   .   s    OJ$$Lr:   r=   c                  t    ] tR t^6t$ ]! RR7      tRtR]R&   R]R&   R]R	&   ]! R
RR7      t	R]R&   R]R&   Rt
R# )TTSErrorT)arbitrary_types_allowed	tts_errorzLiteral['tts_error']typefloat	timestampr,   label.)exclude	Exceptionerrorr.   recoverabler3   N)r4   r5   r6   r7   r   model_configrD   r8   r   rJ   r9   r3   r:   r;   rA   rA   6   s9    d;L!,D
,JS$/E9/r:   rA   TEventc                  (  a  ] tR t^BtR V 3R llt]R R l4       t]R R l4       t]R R l4       t]R	 R
 l4       t	]R R l4       t
]R R l4       t]R]/R R ll4       tR]/R R lltR]/R R lltR R ltR R ltR R ltR R ltRtV ;t# )TTSc               (    V ^8  d   QhRRRRRRRR/# )   capabilitiesr=   sample_rateintnum_channelsreturnNoner3   )formats   "r;   __annotate__TTS.__annotate__G   s:     G G &G 	G
 G 
Gr:   c               	   < \         SV `  4        Wn        W n        W0n        \        V 4      P                   R \        V 4      P                   2V n        R# ).N)	super__init___capabilities_sample_rate_num_channelsrD   r5   r4   _label)selfrR   rS   rU   	__class__s   &$$$r;   r^   TTS.__init__G   sJ     	)')d../qd1D1D0EFr:   c                   V ^8  d   QhRR/# rQ   rV   r,   r3   )rX   s   "r;   rY   rZ   U   s      s r:   c                	    V P                   # N)rb   rc   s   &r;   rG   	TTS.labelT   s    {{r:   c                   V ^8  d   QhRR/# rg   r3   )rX   s   "r;   rY   rZ   Y   s     	 	s 	r:   c                    R# )zGet the model name/identifier for this TTS instance.

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

Note:
    Plugins should override this property to provide their model information.
unknownr3   rj   s   &r;   model	TTS.modelX        r:   c                   V ^8  d   QhRR/# rg   r3   )rX   s   "r;   rY   rZ   e   s     	 	# 	r:   c                    R# )zGet the provider name/identifier for this TTS instance.

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

Note:
    Plugins should override this property to provide their provider information.
rn   r3   rj   s   &r;   providerTTS.providerd   rq   r:   c                   V ^8  d   QhRR/# )rQ   rV   r=   r3   )rX   s   "r;   rY   rZ   q   s     " "o "r:   c                	    V P                   # ri   )r_   rj   s   &r;   rR   TTS.capabilitiesp       !!!r:   c                   V ^8  d   QhRR/# rQ   rV   rT   r3   )rX   s   "r;   rY   rZ   u   s     ! !S !r:   c                	    V P                   # ri   )r`   rj   s   &r;   rS   TTS.sample_ratet   s       r:   c                   V ^8  d   QhRR/# r{   r3   )rX   s   "r;   rY   rZ   y        " "c "r:   c                	    V P                   # ri   )ra   rj   s   &r;   rU   TTS.num_channelsx   ry   r:   conn_optionsc               $    V ^8  d   QhRRRRRR/# rQ   textr,   r   r   rV   ChunkedStreamr3   )rX   s   "r;   rY   rZ   }   s$      *;	r:   c               	    R # ri   r3   rc   r   r   s   &&$r;   
synthesizeTTS.synthesize|   s     r:   c                    V ^8  d   QhRRRR/# )rQ   r   r   rV   SynthesizeStreamr3   )rX   s   "r;   rY   rZ      s     
 
0
	
r:   c               	    \        R 4      h)zYstreaming is not supported by this TTS, please use a different TTS or use a StreamAdapter)NotImplementedError)rc   r   s   &$r;   stream
TTS.stream   s     "g
 	
r:   c               $    V ^8  d   QhRRRRRR/# r   r3   )rX   s   "r;   rY   rZ      s$     
 

*;
	
r:   c                   \        V VVR7      # )zHelper method to implement synthesize() using stream() for TTS providers
that only support streaming inference.

This creates a stream, pushes the text as a single chunk, ends the input,
and returns a ChunkedStream wrapper around it.
tts
input_textr   )_ChunkedStreamFromStreamr   s   &&$r;   _synthesize_with_streamTTS._synthesize_with_stream   s     (%
 	
r:   c                   V ^8  d   QhRR/# rQ   rV   rW   r3   )rX   s   "r;   rY   rZ      s       r:   c                    R# )z&Pre-warm connection to the TTS serviceNr3   rj   s   &r;   prewarmTTS.prewarm   s    r:   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   rZ      s    ''d'r:   c                	   "   R # 5iri   r3   rj   s   &r;   aclose
TTS.aclose   s     C   c                   V ^8  d   QhRR/# )rQ   rV   rO   r3   )rX   s   "r;   rY   rZ      s      # r:   c                	   "   V # 5iri   r3   rj   s   &r;   
__aenter__TTS.__aenter__   
     r   c               (    V ^8  d   QhRRRRRRRR/# 	rQ   exc_typeztype[BaseException] | NoneexcBaseException | Noneexc_tbzTracebackType | NonerV   rW   r3   )rX   s   "r;   rY   rZ      2      , " %	
 
r:   c                	B   "   V P                  4       G R j  xL
  R #  L5iri   r   rc   r   r   r   s   &&&&r;   	__aexit__TTS.__aexit__         kkm   )r_   rb   ra   r`   )r4   r5   r6   r7   r^   propertyrG   ro   rt   rR   rS   rU   r   r   r   r   r   r   r   r   r   r9   __classcell__rd   s   @r;   rO   rO   B   s    
G G   	 	 	 	 " " ! ! " " >Y 
3N

>Y
 ( r:   rO   c                     ] tR t^t$ RtRtR]R&   R R lt]R R l4       t	]R	 R
 l4       t
]R R l4       tR^ R^ /R R lltR R ltR R lt]R R l4       tR R ltR R ltR R ltR R ltR R  ltR! R" ltR# R$ ltR%tR&# )'r   zVUsed by the non-streamed synthesize API, some providers support chunked http responsestts_requestClassVar[str]_tts_request_span_namec               (    V ^8  d   QhRRRRRRRR/# 	rQ   r   rO   r   r,   r   r   rV   rW   r3   )rX   s   "r;   rY   ChunkedStream.__annotate__   s4      9  9  9 	 9
 ( 9 
 9r:   c               	B  a  VS n         VS n        VS n        \        P                  \
        ,          ! 4       S n        ^ S n        ^ S n        RS n	        RS n
        \        P                  P                  S P                  ^4      S n        S P                  w  S n        pRS n        \         P"                  ! S P%                  V4      RR7      S n        R V 3R llp\         P"                  ! V! 4       RR7      S n        S P(                  P+                  V 3R l4       R	S n        R	# )
r           FTTS._metrics_tasknamec                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   ,ChunkedStream.__init__.<locals>.__annotate__        	( 	(D 	(r:   c                    <"   \         P                  ! S P                  R R7      ;_uu_ 4        S P                  4       G Rj  xL
  RRR4       R#  L  + '       g   i     R# ; i5iF)end_on_exitNr   start_as_current_spanr   
_main_taskrj   s   r;   _traceable_main_task4ChunkedStream.__init__.<locals>._traceable_main_task   H     --d.I.IW\]]oo''' ^]' ^]].   +A'AAA
A'AA$		A'zTTS._synthesize_taskc                8   < SP                   P                  4       # ri   	_event_chclose_rc   s   &r;   <lambda>(ChunkedStream.__init__.<locals>.<lambda>   s    $..:N:N:Pr:   N)_input_text_tts_conn_optionsr    Chanr)   r   _input_tokens_output_tokens_acquire_time_connection_reused	itertoolstee_tee_event_aiter_current_attempt_has_errorasynciocreate_task_metrics_monitor_task_metrics_task_synthesize_taskadd_done_callback_tts_request_span)rc   r   r   r   monitor_aiterr   s   f$$$  r;   r^   ChunkedStream.__init__   s     &	)"235$'(-MM%%dnna8	+/99(=*/'$00&&}5<O
	( 	( !( 3 3 ")?!
 	//0PQ48r:   c                   V ^8  d   QhRR/# rg   r3   )rX   s   "r;   rY   r      s        C  r:   c                	    V P                   # ri   )r   rj   s   &r;   r   ChunkedStream.input_text   s    r:   c                   V ^8  d   QhRR/# )rQ   rV   r.   r3   )rX   s   "r;   rY   r      s     , ,d ,r:   c                	6    V P                   P                  4       # ri   )r   donerj   s   &r;   r   ChunkedStream.done   s    $$))++r:   c                   V ^8  d   QhRR/# )rQ   rV   r   r3   )rX   s   "r;   rY   r      s     1 1/ 1r:   c                	6    V P                   P                  4       # ri   )r   	exceptionrj   s   &r;   r   ChunkedStream.exception   s    $$..00r:   input_tokensoutput_tokensc               $    V ^8  d   QhRRRRRR/# rQ   r   rT   r   rV   rW   r3   )rX   s   "r;   rY   r      "     , , , ,TX ,r:   c               	    Wn         W n        R # ri   r   r   rc   r   r   s   &$$r;   _set_token_usageChunkedStream._set_token_usage       )+r:   c                    V ^8  d   QhRRRR/# rQ   event_aiterzAsyncIterable[SynthesizedAudio]rV   rW   r3   )rX   s   "r;   rY   r      s     (5 (57V (5[_ (5r:   c                  "   \         P                  ! 4       pRpRpRpV  Rj  xL
  pVP                  pVR8X  d   \         P                  ! 4       V,
          pW6P                  P                  ,          pKW   LRDS\         P                  ! 4       T,
          pT P
                  '       d   R# \        \         P                   ! 4       TTT\        T P                  4      T P                  T P                  TT P                  P                  4       T P                  P                  RT P                  T P                   \#        T P                  P$                  T P                  P&                  R7      R7      pT P(                  '       d9   T P(                  P+                  \,        P.                  TP1                  4       4       T P                  P3                  RT4       R# 5i)	Task used to collect metricsr   r0   NF
model_namemodel_provider)rF   r-   ttfbdurationcharacters_countr   r   audio_duration	cancelledrG   streamedacquire_timeconnection_reusedmetadatametrics_collected      )timeperf_counterr-   r+   r  r   r   lenr   r   r   r   r  r   rb   r   r   r   ro   rt   r   set_attributer   ATTR_TTS_METRICSmodel_dump_jsonemit)	rc   r  
start_timer  r  r-   evr  metricss	   &&       r;   r   #ChunkedStream._metrics_monitor_task   sm     &&(

# 	0 	0"Jt|((*Z7hh///N	0 $$&3***iik! !1!12++--)++557))""++"55I[I[\
  !!!""00,,g.E.E.G 			*G4s-   GA9A7A9AG7A99.G(D0Gc                   V ^8  d   QhRR/# )rQ   rV   r*   r3   )rX   s   "r;   rY   r   
  s     0 0~ 0r:   c                   "   . pV   Rj  xL
  pVP                  VP                  4       K'   L"D#\        P                  ! T4      # 5i)z6Utility method to collect every frame in a single callN)appendr+   r   combine_audio_frames)rc   framesr!  s   &  r;   collectChunkedStream.collect
  sC      	$ 	$"MM"((#	$ ''//s   A0.0A0Ac                    V ^8  d   QhRRRR/# rQ   output_emitterAudioEmitterrV   rW   r3   )rX   s   "r;   rY   r         CCC$Cr:   c                	   "   R # 5iri   r3   rc   r-  s   &&r;   _runChunkedStream._run       @Cr   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   r     s     1. 1.$ 1.r:   c                	2  "   \         P                  ! 4       ;V n        pVP                  \        P
                  R \        P                  V P                  P                  /4       \        V P                  P                  ^,           4       EFJ  p\        V P                  P                  V P                  R7      p \        P                  ! R4      ;_uu_ 4       pVP!                  \        P"                  V4        V P%                  V4      G Rj  xL
   RRR4       TP-                  4        TP/                  4       G Rj  xL
  T P0                  P3                  4       '       d.   TP5                  4       R8:  d   \7        RT P0                   24      hTP!                  \        P8                  T P0                  4        TP;                  4       G Rj  xL
   R# 	  R#  L  \&         d   p\(        P*                  ! YE4       h Rp?ii ; i  + '       g   i     L; i L LL  \6         Ed0   p\=        T\>        4      '       d2   TP@                  R8X  d!    Rp?TP;                  4       G Rj  xL 
   R# T P                  PC                  T4      pT P                  P                  ^ 8X  g   T P                  P                  T8X  d   T PE                  TR R7       h T PE                  TRR7       \F        PH                  ! R	T R
T R2RT P                  PJ                  RT^,           RR /R7       \L        PN                  ! T4      G Rj  xL 
  R T n(         Rp?MRp?ii ; i TP;                  4       G Rj  xL 
  EK    TP;                  4       G Rj  xL 
  i ; i5i)FrG   dst_chtts_request_runNr   &no audio frames were pushed for text:   rK   Tzfailed to synthesize speech: z, retrying in sr   attemptr  extra))r   get_current_spanr   set_attributesr   ATTR_TTS_STREAMINGATTR_TTS_LABELr   rG   ranger   	max_retryr.  r   r   r   r  ATTR_RETRY_COUNTr2  rI   telemetry_utilsrecord_exception	end_inputjoinr   strippushed_durationr   ATTR_TTS_INPUT_TEXTr   
isinstancer   status_code_interval_for_retry_emit_errorr   warningrb   r   sleepr   )rc   current_spanir-  attempt_spaneretry_intervals   &      r;   r   ChunkedStream._main_task  s    050F0F0HH##..**DIIOO	
 t))33a78A)		WN&.112CDD ..{/K/KQO"ii777 E ((*$))+++##))++0N0N0PTW0W"%KDL\L\K]#^__**;+J+JDL\L\]* %++---Q 9 8$ '88I	 ED ,6 .)  8a00Q]]c5I" %++--- "&!3!3!G!G!J%%//148J8J8T8TXY8Y$$QE$:$$QD$9NN7s.HXXYZ$dii&6&6	1q5*V[\
 mmN33327//%8$ 0$++---n++---s   B7N:H!H:GG
G+H?H #H$AH<NHNGH	(G?	?H	HH	HNM*'MM9N(I+)N1CMMMM9MM9N0M31N9NN
NNc               $    V ^8  d   QhRRRRRR/# rQ   	api_errorrI   rK   r.   rV   rW   r3   )rX   s   "r;   rY   r   H  !     

 

Y 

T 

d 

r:   c           
     	    R V n         V P                  P                  R\        \        P                  ! 4       V P                  P
                  VVR7      4       R# TrJ   )rF   rG   rJ   rK   Nr   r   r  rA   r  rb   rc   r]  rK   s   &&&r;   rR  ChunkedStream._emit_errorH  A    *.'		))+ii&&'		
r:   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   r   T  s     * *d *r:   c                t  "   \         P                  ! V P                  4      G Rj  xL
  V P                  P	                  4        V P
                  G Rj  xL
  V P                  P                  4       G Rj  xL
  V P                  '       d$   V P                  P                  4        RV n        R# R#  L L_ L?5i)zCClose is automatically called if the stream is completely collectedN)
r    cancel_and_waitr   r   r   r   r   r   r   endrj   s   &r;   r   ChunkedStream.acloseT  s     !!$"7"7888    ii   !!!""&&(%)D" "	 	9  s9   $B8B2-B8B4!B86B67B8&B84B86B8c                   V ^8  d   QhRR/# rQ   rV   r)   r3   )rX   s   "r;   rY   r   ^       	 	!1 	r:   c                	  "    V P                   P                  4       G R j  xL
 pV#  L  \         dM    T P                  P	                  4       '       g%   T P                  P                  4       ;p'       d   Th\        R hi ; i5iri   )r   	__anext__StopAsyncIterationr   r  r   rc   valr   s   &  r;   rn  ChunkedStream.__anext__^  sv     	/))3355C 
 6! 	/((2244AVAVA`A`Ab:b#:b	$$.		/1   B* (* B* *B!B7
BBc                   V ^8  d   QhRR/# rQ   rV   zAsyncIterator[SynthesizedAudio]r3   )rX   s   "r;   rY   r   i        : r:   c                	    V # ri   r3   rj   s   &r;   	__aiter__ChunkedStream.__aiter__i      r:   c                   V ^8  d   QhRR/# )rQ   rV   r   r3   )rX   s   "r;   rY   r   l  s      - r:   c                	   "   V # 5iri   r3   rj   s   &r;   r   ChunkedStream.__aenter__l  r   r   c               (    V ^8  d   QhRRRRRRRR/# r   r3   )rX   s   "r;   rY   r   o  r   r:   c                	B   "   V P                  4       G R j  xL
  R #  L5iri   r   r   s   &&&&r;   r   ChunkedStream.__aexit__o  r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   N)r4   r5   r6   r7   __doc__r   r8   r^   r   r   r   r   r  r   r)  r   r2  r   rR  r   rn  rx  r   r   r9   r3   r:   r;   r   r      s    `,9M9 9D     , , 1 1,a ,a ,(5T0 C C1.f

*	 r:   r   c                  >   a  ] tR tRtRtR V 3R lltR R ltRtV ;t# )r   ix  zImplementation of ChunkedStream that wraps a SynthesizeStream.

Used by TTS providers that only support streaming inference to implement
the synthesize() method.
c               (    V ^8  d   QhRRRRRRRR/# r   r3   )rX   s   "r;   rY   %_ChunkedStreamFromStream.__annotate__  s4     
 
 
 	

 (
 

r:   c               	,   < \         SV `  VVVR 7       R# )r   N)r]   r^   )rc   r   r   r   rd   s   &$$$r;   r^   !_ChunkedStreamFromStream.__init__  s      	!% 	 	
r:   c                    V ^8  d   QhRRRR/# r,  r3   )rX   s   "r;   rY   r    s       $ r:   c                	  "   VP                  \        4       V P                  P                  V P                  P                  R RR7       V P                  P                  \        ^ V P                  P                  R7      R7      ;_uu_4       GRj  xL
 pVP                  V P                  4       VP                  4        V  Rj  xL
  pVP                  VP                  P                  P                  4       4       VP                  P                   P#                  \$        4      ;p'       g   Kp  VP'                  V4       K   L LDRRR4      GRj  xL 
  M  + GRj  xL 
 '       g   i     M; iTP)                  4        R# 5i)	audio/pcmF)r-   rS   rU   	mime_typer   )rF  timeout)r   N)
initializer$   r   rS   rU   r   r   r   r  	push_textr   rJ  pushr+   datatobytesuserdatagetr   push_timed_transcriptflush)rc   r-  r   r!  timed_transcriptss   &&   r;   r2  _ChunkedStreamFromStream._run  s7    !! {		--//! 	" 	
 99##*Q@R@R@Z@Z[ $ 
 
 
T--." L Lb##BHHMM$9$9$;<(*(9(9(=(=>W(XX$XX"889JK

LF
 
 
 
 
 
 	sy   BF
EF
.EE	E
E	
A#E2EF
E		E
F
EF
E5	"E%#
E5	.E5	0F
r3   )	r4   r5   r6   r7   r  r^   r2  r9   r   r   s   @r;   r   r   x  s    
 
 r:   r   c                    a  ] tR tRt$ RtR]R&    ! R R4      tR V 3R lltR	^ R
^ /R R llt]	R R l4       t
R R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R  ltR! R" ltR# R$ ltR% R& ltR'tV ;t# )(r   i  r   r   r   c                      ] tR tRtRtR# )SynthesizeStream._FlushSentineli  r3   Nr4   r5   r6   r7   r9   r3   r:   r;   _FlushSentinelr    s    #r:   r  c               $    V ^8  d   QhRRRRRR/# )rQ   r   rO   r   r   rV   rW   r3   )rX   s   "r;   rY   SynthesizeStream.__annotate__  s"     !9 !9s !92C !9 !9r:   c               	  <a  \         SS `  4        VS n        VS n        \        P
                  \        \        P                  ,          ,          ! 4       S n	        \        P
                  \        ,          ! 4       S n        \        P                  P                  S P                  ^4      S n        S P                  w  S n        S n        R V 3R llp\"        P$                  ! V! 4       RR7      S n        S P&                  P)                  V 3R l4       RS n        RS n        ^ S n        RS n        . S n        RS n        . S n        RS n        ^ S n        ^ S n        ^ S n        R	S n         RS n!        RS n"        R# )
rQ   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   /SynthesizeStream.__init__.<locals>.__annotate__  r   r:   c                    <"   \         P                  ! S P                  R R7      ;_uu_ 4        S P                  4       G Rj  xL
  RRR4       R#  L  + '       g   i     R# ; i5ir   r   rj   s   r;   r   7SynthesizeStream.__init__.<locals>._traceable_main_task  r   r   zTTS._main_taskr   c                8   < SP                   P                  4       # ri   r   r   s   &r;   r   +SynthesizeStream.__init__.<locals>.<lambda>  s    t~~/C/C/Er:   NFr0   r   )#r]   r^   r   r   r    r   r,   r   r  	_input_chr)   r   r   r   r   r   _monitor_aiterr   r   _taskr   r   r   _started_time_pushed_text_input_buffer_input_ended_mtc_pending_texts	_mtc_text_num_segmentsr   r   r   r   r   )rc   r   r   r   rd   s   f$$ r;   r^   SynthesizeStream.__init__  s-   	)#(8(G(G"GHJ"235MM%%dnna8	15.4.	( 	( (()=)?FVW


$$%EF8<*/'$%!# KM! .0$'(-48r:   r   r   c               $    V ^8  d   QhRRRRRR/# r   r3   )rX   s   "r;   rY   r    r   r:   c               	    Wn         W n        R # ri   r  r  s   &$$r;   r  !SynthesizeStream._set_token_usage  r  r:   c                    V ^8  d   QhRRRR/# r,  r3   )rX   s   "r;   rY   r    r/  r:   c                	   "   R # 5iri   r3   r1  s   &&r;   r2  SynthesizeStream._run  r4  r   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   r    s     S. S.$ S.r:   c                		  "   \         P                  ! 4       ;V n        pVP                  \        P
                  R \        P                  V P                  P                  /4       \        V P                  P                  ^,           4       EF  p\        V P                  P                  V P                  R7      p \        P                  ! R4      ;_uu_ 4       pVP!                  \        P"                  V4        V P%                  V4      G Rj  xL
   RRR4       TP-                  4        TP/                  4       G Rj  xL
  T P0                  P3                  4       '       dp   TP5                  RR7      R8:  d   \7        RT P0                   24      hT P8                  TP:                  8w  d&   \7        RT P8                   RTP:                   24      hTP!                  \        P<                  T P0                  4        TP?                  4       G Rj  xL
   R# 	  R#  EL  \&         d   p\(        P*                  ! YE4       h Rp?ii ; i  + '       g   i     EL?; i EL LO  \6         Ed4   p\A        T\B        4      '       d2   TPD                  R	8X  d!    Rp?TP?                  4       G Rj  xL 
   R# TP5                  4       pTPF                  ;'       dG    TR8H  ;'       d:    T P                  P                  ^ 8  ;'       d    Y P                  P                  8  pT'       gN   TR8  d3   \H        PJ                  ! R
RT P                  PL                  RR RT/R7       T PO                  TRR7       h T P                  PQ                  T4      pT PO                  TR R7       \H        PR                  ! RTTRT P                  PL                  RT^,           RR /R7       \T        PV                  ! T4      G Rj  xL 
  \X        PZ                  \\        \^        P`                  ,          ,          ! 4       T n1        T Pd                   F  p	T Pb                  Pg                  T	4       K   	  T Ph                  '       d   T Pb                  Pk                  4        RT n6         Rp?MRp?ii ; i TP?                  4       G Rj  xL 
  EK8    TP?                  4       G Rj  xL 
  i ; i5i)Tr7  r9  N)idxr   r:  z&number of segments mismatch: expected z
, but got r;  zKTTS failed after partial audio was already sent to the user, skip retrying.r   r  rM  r?  Fr<  z0failed to synthesize speech: %s, retrying in %ssr>  )7r   rA  r   rB  r   rC  rD  r   rG   rE  r   rF  r.  r   r   r   r  rG  r2  rI   rH  rI  rJ  rK  r  rL  rM  r   r  num_segmentsrN  r   rO  r   rP  	retryabler   rJ   rb   rR  rQ  rS  r   rT  r    r   r,   r   r  r  r  send_nowaitr  r   r   )
rc   rU  rV  r-  rW  rX  rM  should_retryrY  events
   &         r;   r   SynthesizeStream._main_task  s    050F0F0HH##..**DIIOO	
 t))33a78A)		WNH.112CDD ..{/K/KQO"ii777 E ((*$))+++$$**,,%55"5=D&)OPTPaPaOb'cdd))^-H-HH&DTEWEWDX Y''5'B'B&CE 
 **;+J+JDL]L]^` %++---U 9 8$ '88I	 EDD ,z ._  -8a00Q]]c5IX %++---U #1"@"@"BKK 9 9'3.9 9**44q89 9 ..888	  $&,i %tyy'7'7 *D 1?# $$QE$:!%!3!3!G!G!J   5F" $))"2"2Iq1ujRVW	 mmN333 "%#0@0O0O*O!P!R!//ENN..u5 0$$$NN((* 38//[-8Z 0$++---n++---s  B7S :I#!I
:H H
H +I#?I #I#$BI#>S I!S H  I	+I	I	I

I
I#!S #R"/'RSS -J0.S 6"RR& R R(CR7O:8A>R7!RSR""S&S 9R<:S SS
SS c               $    V ^8  d   QhRRRRRR/# r\  r3   )rX   s   "r;   rY   r  %  r^  r:   c           
     	    R V n         V P                  P                  R\        \        P                  ! 4       V P                  P
                  VVR7      4       R# r`  ra  rb  s   &&&r;   rR  SynthesizeStream._emit_error%  rd  r:   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   r  1  s     5 5t 5r:   c                	`    V P                   ^ 8X  d   \        P                  ! 4       V n         R# R# )r   N)r  r  r  rj   s   &r;   _mark_startedSynthesizeStream._mark_started1  s&    "!%!2!2!4D #r:   c                    V ^8  d   QhRRRR/# r  r3   )rX   s   "r;   rY   r  6  s     ;  ; 7V ; [_ ; r:   c                ^  a aaaa"   RoRoRoRoR VVVV V3R llpV  Rj  xL
  pSR8X  d'   \         P                  ! 4       S P                  ,
          oSVP                  P                  ,          oVP
                  oVP                  oVP                  '       g   K  V! 4        K   LDR# 5i)r
  r   r0   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   <SynthesizeStream._metrics_monitor_task.<locals>.__annotate__=  s     )	# )	#t )	#r:   c                 r  < SP                   '       d   SP                  '       d   R # \        P                  ! 4       SP                   ,
          p SP                  '       g   R # SP                  P                  ^ 4      pV'       g   R # \        \        P                  ! 4       SSSV \        V4      SP                  SP                  SSP                  P                  4       SP                  P                  RSP                  SP                  \!        SP                  P"                  SP                  P$                  R7      R7      pSP&                  '       d9   SP&                  P)                  \*        P,                  VP/                  4       4       SP                  P1                  RV4       RoRoRo^ Sn         R # )NTr  )rF   r-   r1   r  r  r  r   r   r  r  rG   r  r  r  r  r  r   r0   r  )r  r   r  r  r  popr   r  r   r   r  r  r   rb   r   r   r   ro   rt   r   r  r   r  r  r  )r  r   r"  r  r-   r1   rc   r  s      r;   _emit_metrics=SynthesizeStream._metrics_monitor_task.<locals>._emit_metrics=  sN    %%%)H)H)H((*T-?-??H*****..q1D ))+%%!!$T!//"11-**..0ii&&!//"&"9"9!TYY__TYYM_M_`G" %%%&&4400'2I2I2K IINN.8 NDJ!"Dr:   Nr  )r  r  r  r+   r  r-   r1   r/   )rc   r  r  r!  r  r-   r1   r  s   f&  @@@@r;   r   &SynthesizeStream._metrics_monitor_task6  s     

)	# )	#V $ 		  		 "t|((*T-?-??bhh///NJJ{{{		 s,   B-B*B(B*A3B-	B-(B**B-c                    V ^8  d   QhRRRR/# )rQ   tokenr,   rV   rW   r3   )rX   s   "r;   rY   r  s  s     ) )s )t )r:   c                R   V'       d   V P                   P                  '       d   R# V ;P                  V,          un        V P                  f7   \        P
                  ! V P                  V P                  4      RR7      V n        V P                  '       gC   V P                  ^8  d   \        P                  ! R4       R# V ;P                  ^,          un	        V ;P                  V,          un        V P                   P                  V4       V P                  P                  V4       R# )z Push some text to be synthesizedNr   r   zSynthesizeStream: handling multiple segments in a single instance is deprecated. Please create a new SynthesizeStream instance for each segment. Most TTS plugins now use pooled WebSocket connections via ConnectionPool.)r  closedr  r   r   r   r   r  r  r  r   rS  r  r  r&  )rc   r  s   &&r;   r  SynthesizeStream.push_texts  s    ---U"%!(!4!4**4+>+>?FY"D ~~~!!Q&`
 !#%""5)!!%(r:   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   r    s     , ,t ,r:   c                J   V P                   P                  '       d   R# V P                  '       d-   V P                  P	                  V P                  4       RV n        V P                  4       pV P                   P                  V4       V P                  P	                  V4       R# )z#Mark the end of the current segmentNr0   )r  r  r  r  r&  r  r  r  )rc   sentinels   & r;   r  SynthesizeStream.flush  sq    >>   >>>##**4>>:DN&&(""8,!!(+r:   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   r    s     ! !4 !r:   c                h    V P                  4        V P                  P                  4        RV n        R# )z2Mark the end of input, no more text will be pushedTN)r  r  r   r  rj   s   &r;   rJ  SynthesizeStream.end_input  s#    

 r:   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   r    s     * *d *r:   c                  "   \         P                  ! V P                  4      G Rj  xL
  V P                  P	                  4        V P
                  P	                  4        V P                  e   V P                  G Rj  xL
  V P                  P                  4       G Rj  xL
  V P                  '       d$   V P                  P                  4        RV n	        R# R#  L L_ L?5i)zClose ths stream immediatelyN)r    rg  r  r   r   r  r   r   r   r   rh  rj   s   &r;   r   SynthesizeStream.aclose  s     !!$**---)$$$$ii   !!!""&&(%)D" " 	.
 % s:   $C CAC <C=!C CC 5&C C C c                   V ^8  d   QhRR/# rk  r3   )rX   s   "r;   rY   r    rl  r:   c                	  "    V P                   P                  4       G R j  xL
 pV#  L  \         dM    T P                  P	                  4       '       g%   T P                  P                  4       ;p'       d   Th\        R hi ; i5iri   )r   rn  ro  r  r  r   rp  s   &  r;   rn  SynthesizeStream.__anext__  sr     	/))3355C 
 6! 	/::''))djj6J6J6L/Ls/L	$$.		/rs  c                   V ^8  d   QhRR/# ru  r3   )rX   s   "r;   rY   r    rv  r:   c                	    V # ri   r3   rj   s   &r;   rx  SynthesizeStream.__aiter__  rz  r:   c                   V ^8  d   QhRR/# )rQ   rV   r   r3   )rX   s   "r;   rY   r    s      "2 r:   c                	   "   V # 5iri   r3   rj   s   &r;   r   SynthesizeStream.__aenter__  r   r   c               (    V ^8  d   QhRRRRRRRR/# r   r3   )rX   s   "r;   rY   r    r   r:   c                	B   "   V P                  4       G R j  xL
  R #  L5iri   r   r   s   &&&&r;   r   SynthesizeStream.__aexit__  r   r   )r   r   r   r   r   r   r  r  r  r   r   r  r  r  r  r   r  r  r  r   r   r   )r4   r5   r6   r7   r   r8   r  r^   r  r   r2  r   rR  r  r   r  r  rJ  r   rn  rx  r   r   r9   r   r   s   @r;   r   r     s    ,9M9!9 !9F,a ,a , C CS.j

5
; z)6,!*	 r:   r   c                  l   ] tR tRt ! R R4      t] ! R R4      4       t ! R R4      t] ! R R	4      4       tR
 R lt	R0R R llt
]R R l4       tR^RR/R R lltR R ltR R ltR R ltR R ltR R ltR R  ltR! R" ltR# R$ ltR% R& ltR' R( ltR) R* lt]! ]R+7      R, R- l4       tR.tR/# )1r.  i  c                      ] tR tRtRtR# )AudioEmitter._FlushSegmenti  r3   Nr  r3   r:   r;   _FlushSegmentr        r:   r  c                  "    ] tR tRt$ R]R&   RtR# )AudioEmitter._StartSegmenti  r,   r1   r3   N)r4   r5   r6   r7   r8   r9   r3   r:   r;   _StartSegmentr    s    r:   r  c                      ] tR tRtRtR# )AudioEmitter._EndSegmenti  r3   Nr  r3   r:   r;   _EndSegmentr    r  r:   r  c                  0    ] tR tRt$ R]R&   RtR]R&   RtR# )	AudioEmitter._SegmentContexti  r,   r1   r   rE   r  r3   N)r4   r5   r6   r7   r8   r  r9   r3   r:   r;   _SegmentContextr    s     ##r:   r  c               $    V ^8  d   QhRRRRRR/# )rQ   rG   r,   r8  zaio.Chan[SynthesizedAudio]rV   rW   r3   )rX   s   "r;   rY   AudioEmitter.__annotate__  s*     3 3 3 +	3
 
3r:   c               	d    W n         Wn        R V n        RV n        ^ V n        . V n        . V n        R# )r0   FN)_dst_chrb   _request_id_startedr  _audio_durations_provider_request_ids)rc   rG   r8  s   &$$r;   r^   AudioEmitter.__init__  s5      "-/02"r:   c                    V ^8  d   QhRRRR/# )rQ   r  rT   rV   rE   r3   )rX   s   "r;   rY   r    s     
 
3 
 
r:   c                	    \        V P                  4      ) Tu;8:  d   \        V P                  4      8  d   M MV P                  V,          # R # )r   )r  r  )rc   r  s   &&r;   rM  AudioEmitter.pushed_duration  sI     D))**cNC8M8M4NN !!#&	
 	
r:   c                   V ^8  d   QhRR/# r{   r3   )rX   s   "r;   rY   r    r   r:   c                	    V P                   # ri   )r  rj   s   &r;   r  AudioEmitter.num_segments  ry   r:   frame_size_msr   Fc               4    V ^8  d   QhRRRRRRRRRRRR	R
R/# )rQ   r-   r,   rS   rT   rU   r  r  r   r.   rV   rW   r3   )rX   s   "r;   rY   r    sR     +0 +0 +0 	+0
 +0 +0 +0 +0 
+0r:   c               	(   V P                   '       d   \        R 4      hRV n        V'       dN   VP                  4       P	                  4       pVP                  R4      ;'       g    VP                  R4      V n        W@n        V'       g$   \        P                  ! RV P                  4       RpRV n         Wn
        WPn        W n        W0n        W`n        ^RIHp \"        P$                  \&        \(        P*                  ,          \(        P,                  ,          \(        P.                  ,          V,          ,          ! 4       V n        \2        P4                  ! V P7                  4       RR	7      V n        V P                  '       g   V P;                  R
R7       R# R# )zAudioEmitter already startedFr  z	audio/rawz!no request_id provided for TTS %srn   Tr%   zAudioEmitter._main_taskr   r0   r1   N)r  RuntimeError_is_raw_pcmlowerrL  
startswith
_mime_typer   rS  rb   r  _frame_size_msr`   ra   
_streamingvoice.ior&   r    r   bytesr.  r  r  r  	_write_chr   r   r   _main_atask_AudioEmitter__start_segment)	rc   r-   rS   rU   r  r  r   mtr&   s	   &$$$$$$  r;   r  AudioEmitter.initialize  s.    ====>> "((*B!}}[9WWR]];=WD#NN>L"J%+') *(()(() &&' 	
  #..t/@G`a  B / r:   c                    V ^8  d   QhRRRR/# rQ   r1   r,   rV   rW   r3   )rX   s   "r;   rY   r     s     ; ;3 ;4 ;r:   c               	    V P                   '       g   \        R 4      hV P                  V4       V P                  VR7      # )zXstart_segment() can only be called when SynthesizeStream is initialized with stream=Truer  )r  r  _note_provider_request_idr  rc   r1   s   &$r;   start_segmentAudioEmitter.start_segment   sA    # 
 	&&z2##z#::r:   c                    V ^8  d   QhRRRR/# )rQ   
context_idr,   rV   rW   r3   )rX   s   "r;   rY   r  *  s      C D r:   c                   V'       d   WP                   9   d   R# V P                   P                  V4       \        P                  ! 4       pVP	                  4       '       d-   VP                  \        P                  V P                   4       R# R# )a  Record a provider-known id for this stream on the current span.

Exposed on the `tts_request_run` span as `lk.provider_request_ids` so users
can correlate traces with the provider's server-side logs for debugging.
`start_segment()` calls this automatically; plugins can also call it when
the provider-known id becomes available later (e.g. from a response
message's `request_id`/`session_id` field after start_segment).
N)r   r&  r   rA  is_recordingr  r   ATTR_PROVIDER_REQUEST_IDS)rc   r"  rU  s   && r;   r  &AudioEmitter._note_provider_request_id*  sj     Z+E+EE""))*5--/$$&&&&55t7Q7Q 'r:   c                    V ^8  d   QhRRRR/# r  r3   )rX   s   "r;   rY   r  <  s     N NS NT Nr:   c               	   V P                   '       g   \        R 4      hV P                  P                  '       d   R# V ;P                  ^,          un        V P                  P                  V P                  VR7      4       R# )AudioEmitter isn't startedNr  )r  r  r  r  r  r  r  r  s   &$r;   __start_segmentAudioEmitter.__start_segment<  s[    }}};<<>>   a""4#5#5#5#LMr:   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   r  F  s     $ $T $r:   c                	\    V P                   '       g   \        R 4      hV P                  4       # )zVend_segment() can only be called when SynthesizeStream is initialized with stream=True)r  r  _AudioEmitter__end_segmentrj   s   &r;   end_segmentAudioEmitter.end_segmentF  s.    # 
 !!##r:   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   r  O  s     7 7t 7r:   c                	    V P                   '       g   \        R 4      hV P                  P                  '       d   R# V P                  P	                  V P                  4       4       R# r)  N)r  r  r  r  r  r  rj   s   &r;   __end_segmentAudioEmitter.__end_segmentO  sE    }}};<<>>   ""4#3#3#56r:   c                    V ^8  d   QhRRRR/# )rQ   r  r  rV   rW   r3   )rX   s   "r;   rY   r  X  s     ) ) )4 )r:   c                	    V P                   '       g   \        R 4      hV P                  P                  '       d   R# V P                  P	                  V4       R# r3  )r  r  r  r  r  )rc   r  s   &&r;   r  AudioEmitter.pushX  s<    }}};<<>>   ""4(r:   c                    V ^8  d   QhRRRR/# )rQ   r2   zTimedString | list[TimedString]rV   rW   r3   )rX   s   "r;   rY   r  a  s     3 30O 3TX 3r:   c                	*   V P                   '       g   \        R 4      hV P                  P                  '       d   R# \	        V\
        4      '       d'   V F  pV P                  P                  V4       K   	  R# V P                  P                  V4       R# r3  )r  r  r  r  rO  listr  )rc   r2   r   s   && r;   r  "AudioEmitter.push_timed_transcripta  sg    }}};<<>>   j$''"**40 # NN&&z2r:   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   r  n  s     9 9t 9r:   c                	    V P                   '       g   \        R 4      hV P                  P                  '       d   R# V P                  P	                  V P                  4       4       R# r3  )r  r  r  r  r  r  rj   s   &r;   r  AudioEmitter.flushn  sE    }}};<<>>   ""4#5#5#78r:   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   r  w  s      4 r:   c                	    V P                   '       g   \        R 4      hV P                  P                  '       d   R# V P	                  4        V P                  P                  4        R# r3  )r  r  r  r  r.  r   rj   s   &r;   rJ  AudioEmitter.end_inputw  sF    }}};<<>>   r:   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   r    s      D r:   c                	t   "   V P                   '       g   \        R 4      hV P                  G Rj  xL
  R#  L5ir3  )r  r  r  rj   s   &r;   rK  AudioEmitter.join  s)     }}};<<s   -868c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   r    s     4 4d 4r:   c                	   "   V P                   '       g   R # \        P                  ! V P                  4      G R j  xL
  R #  L5iri   )r  r    rg  r  rj   s   &r;   r   AudioEmitter.aclose  s+     }}}!!$"2"2333s   8AAAr   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   r    s     y8 y8$ y8r:   c           
     	
  a a	a
aaaaaaaaaaaa"   ^RI Hp RoRpRoRo. o. oRoRoRo\        P                  ! 4       oRR/R VVV VV3R llloS P                  ^
,          R,          o	R	 V	3R
 lloR VVVV V3R llo
RRR/R V
VVVVV V3R lllloR VVVVVV VVV3	R llpR VVV 3R llp\        \        R7      R VVVV 3R ll4       pRp S P                    Rj  xL
  p\        Wq4      '       d   SP                  V4       K.  \        V\        P                  4      '       dQ   S'       d   \        R4      hS P                  P                  R4       \        P                  VP                  R7      oK  S'       gP   S P                   '       d>   \        V\        P"                  \        P$                  34      '       d   K  \        R4      hS P&                  '       Edv   \        V\(        4      '       d   VfZ   \*        P,                  ! S P                  S P.                  \1        S P                  R,          S P2                  ,          4      RR7      pVP5                  V4       F  pS! V4       K  	  EK  V'       d   \        V\        P$                  4      '       d:   VP7                  4        F  pS! V4       K  	  V! 4        VP9                  4        EK  \        V\        P"                  4      '       d9   VP7                  4        F  pS! V4       K  	  S! RR7       V! 4        R;o;poEKW  \        P:                  ! R\=        V4      4       EKz  EK}  \        V\(        4      '       do   S'       gS   \>        P@                  ! S P                  S P.                  S PB                  R7      o\        PD                  ! V! 4       4      pSP5                  V4       EK  V'       g   EK  \        V\        P$                  4      '       d   V! 4        EK6  \        V\        P"                  4      '       dF   S'       d>   S'       d   SPG                  4        VG Rj  xL
  S! RR7       V! 4        R;o;o;poEK  \        P:                  ! R\=        V4      4       EK   EL LEED Se   SPI                  4        S'       dE   T'       d;   SPK                  4       G Rj  xL 
  \L        PN                  ! T4      G Rj  xL 
  R# R# R#   Se   SPI                  4        S'       dC   T'       d:   SPK                  4       G Rj  xL 
  \L        PN                  ! T4      G Rj  xL 
  i i i ; i5i) rQ   r%   Nr   flush_if_delayedFc               $    V ^8  d   QhRRRRRR/# )rQ   r!  r)   rK  r.   rV   rW   r3   )rX   s   "r;   rY   -AudioEmitter._main_task.<locals>.__annotate__  s(     	G 	G, 	G4 	GTX 	Gr:   c               ~  < SP                   P                  V 4       Sf   SP                  4       oSV P                  P                  ,          oSe   SP                  4        R V3R llpV'       dK   SR8  dB   SSP                  4       S,
          ,
          R,
          pV^ 8  d   SP                  W24      oR # R # R # R # )Nc                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   BAudioEmitter._main_task.<locals>._send_audio.<locals>.__annotate__  s     Q QD Qr:   c                 T   < S P                  4        \        P                  ! R 4       R# )z0flush audio emitter due to slow audio generationN)r  r   debugrj   s   r;   _flush<AudioEmitter._main_task.<locals>._send_audio.<locals>._flush  s    

OPr:   g333333?g{Gz?)r  r  r  r+   r  cancel
call_later)	r!  rK  rS  delay
event_loopflush_timerrc   sent_duration
sent_starts	   &$  r;   _send_audio,AudioEmitter._main_task.<locals>._send_audio  s     LL$$R(!'__.
RXX...M&""$Q Q  MD$8 &):Z)GH4O19","7"7"FK  %9r:     c                    V ^8  d   QhRRRR/# )rQ   r+   r*   rV   z,tuple[rtc.AudioFrame | None, rtc.AudioFrame]r3   )rX   s   "r;   rY   rM    s     	 	~ 	2^ 	r:   c                j  < V P                   S8:  d   RV 3# V P                   S,
          pWP                  ,          p\        P                  ! V P                  RV V P
                  V P                  VR7      p\        P                  ! V P                  VR V P
                  V P                  SR7      pW43# )zSplit *frame* into (head, tail) where tail is exactly _TAIL_SAMPLES.

If the frame is too small to split, returns (None, frame).
Nr  rS   rU   samples_per_channel)rb  rU   r   
AudioFramer  rS   )r+   head_samples	split_idxheadtail_TAIL_SAMPLESs   &    r;   _split_tail,AudioEmitter._main_task.<locals>._split_tail  s    
 ((M9U{" 44}DL$'9'99I>>ZZ
+!--"//$0	D >>ZZ	
+!--"//$1	D :r:   c               $    V ^8  d   QhRRRRRR/# )rQ   r+   r*   r/   r.   rV   rW   r3   )rX   s   "r;   rY   rM    s!     	+ 	+N 	+ 	+$ 	+r:   c          	     t  < Sf   Q hSV P                   \        &   . oS! \        V SP                  SP                  VR7      V'       * R7       S;P
                  V P                  ,          un        SP                  R;;,          V P                  ,          uu&   \        '       d   SP                  V 4       R# R# )z/Send a frame downstream and update bookkeeping.Nr+   r-   r1   r/   rK  r  )
r  r   r)   r  r1   r  r  r  lk_dump_ttsr&  )r+   r/   r\  debug_framessegment_ctxrc   r  s   &$r;   _do_send)AudioEmitter._main_task.<locals>._do_send  s     ***8IENN45 " #//*55%	 &. &&%..8&!!"%7%{##E* r:   r/   c               $    V ^8  d   QhRRRRRR/# )rQ   r+   zrtc.AudioFrame | Noner/   r.   rV   rW   r3   )rX   s   "r;   rY   rM    s#     4	 4	4 4	$ 4	[_ 4	r:   c          	       < S
f   Q hV'       Ed   S	e+   V e'   \         P                  ! S	V .4      pS! VRR7       R o	R # S	e   S! S	RR7       R o	R # V e   S! V RR7       R # S
P                  ^ 8  d   \         P                  ! RSP                  ^d,          SP
                  ,          ,          SP                  SP
                  SP                  ^d,          R7      pSVP                  \        &   . oS! \        VSP                  S
P                  RR7      RR7       R # V f   R # S	e   \         P                  ! S	V .4      pMT pS! V4      w  rEVe   S! VRR7       Vo	R # )NTr/   s     ra  rm  Frn  )r   r'  r  rc  r`   ra   r  r   r)   r  r1   )r+   r/   combinedmarkerrf  rg  rr  r\  ri  
last_framerq  rc   r  s   &$    r;   _emit_frame,AudioEmitter._main_task.<locals>._emit_frame  so   ***x)e.?"77U8KLHX5!%J4 3  +Z$7!%J. - &UT2* ) !//!3 !^^$(9(9S(@4CUCU(UV$($5$5%)%7%7,0,=,=,D	F BSFOO$=>(*%("('+'7'7'2'='=%)	 */ } %33Z4GH $X.JD.Jr:   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   rM    s     	# 	#d 	#r:   c            	       <	 Sf   Q hSf   R # SSP                   \        &   S ! \        SSP                  SP                  RR7      RR7       . oS;P
                  SP                  ,          un        SP                  R;;,          SP                  ,          uu&   \        '       d   SP                  S4       R oR oRoSe   SP                  4        R oR # R # )NFrm  rn  r   r  )r  r   r)   r  r1   r  r  r  ro  r&  rU  )	r\  rp  rY  ry  rq  rc   rZ  r[  r  s	   r;   _flush_frame-AudioEmitter._main_task.<locals>._flush_frame  s     ***!=NJ 9: $#//*55"	 "' !#&&**=*==&!!"%)<)<<%{##J/JJM&""$" 'r:   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   rM  =  s     	! 	!d 	!r:   c            	     >  < Sf   Q h\         '       d	   S'       g   R # \        P                  P                  4       P                  R4      p SP                  '       d.   RSP
                   RSP                   RSP                   RV  R2	MRSP
                   RSP                   RV  R2p\        VR4      ;_uu_ 4       pVP                  \        P                  ! S4      P                  4       4       R R R 4       SP                  4        R #   + '       g   i     L"; i)Nz%Y-%m-%d_%H-%M-%Szlk_dump/r   z.wavwb)ro  datetimenowstrftimer  rb   r  r1   openwriter   r'  to_wav_bytesclear)tsfnamefrp  rq  rc   s      r;   dump_segment-AudioEmitter._main_task.<locals>.dump_segment=  s    ***;l""&&(112EFB ??? 4;;-q)9)9(:!K<R<R;SSTUWTXX\]}Ad.>.>-?qDI 
 eT""a00>KKMN #   #"s   >4DD	r   c                   V ^8  d   QhRR/# r   r3   )rX   s   "r;   rY   rM  P  s     	) 	)D 	)r:   c            	       <"   Sf   Q hSf   Q hR p S  R j  xL
  pV fZ   \         P                  ! VP                  VP                  \	        VP                  R,          SP
                  ,          4      RR7      p V P                  VP                  4       F  pS! V4       K  	  K   LDT '       d    T P                  4        F  pS! T4       K  	  SP                  4       G R j  xL 
  R # 5i)Nr^  TrS   rU   rb  progressive)
r!   AudioByteStreamrS   rU   rT   r  r  r  r  r   )audio_byte_streamr+   r  rz  audio_decoderrq  rc   s      r;   _decode_task-AudioEmitter._main_task.<locals>._decode_taskO  s      *** ,,,>B, 	# 	#e$,(-(=(=$)$5$5%*%7%7,/0A0AT0IDL_L_0_,`$(	)% +//

;AN <	#} !*002AN 3  &&(((s8   C,B)B'B)BC,'B))C,22C,$C'%C,z<start_segment() called before the previous segment was endedr  z8start_segment() must be called before pushing audio dataTr  rv  zunknown data type: %s)rS   rU   rX   ri   )(r  r&   r   get_event_loopr`   r#   r   r  rO  r&  r.  r  r  r  r  r1   r  r  r  r  r  r!   r  ra   rT   r  r  r  r  rS  rD   r"   AudioStreamDecoderr  r   rJ  rU  r   r    rg  )rc   r&   decode_ataskr~  r  r  r  r  r  rh  rr  rz  r\  ri  r  rp  rX  rY  ry  rq  rZ  r[  r  s   f        @@@@@@@@@@@@@@r;   r   AudioEmitter._main_task  sV    *:>,0;?,0
-//126#'
"++-
	G% 	G 	G4 ))B.$6	 	0	+ 	+*4	QV 4	 4	 4	l	# 	# 	#B	! 	!$ 
v	&	) 	) 
'	). ;?_	8"nn VP VPdd00%,,T2dL$>$>??"*Z  ))005".">">$//">"ZK"%d\-E-E|GaGa,bcc$*V  ###!$..,4050E0E,0,=,=-1-?-?47$($5$5$=@S@S$S5" -11- "3!7!7!=A'N ">*%dL,F,FGG%6%<%<%> +A &?(N-335'l.F.FGG%6%<%<%> +A &? (6(NKOOKO*;j"NN+BDJO +" "$..,,2,E,E,0,=,=-1-?-?'+-M
 ,3+>+>|~+NL%**40%%dL,F,FGG )N'l.F.FGGK, - 7 7 9&2 2 2'6(N[__M_K_:Kj"NN+BDJOmVPb !3c -r &""$#**,,,)),777 ".} &""$#**,,,)),777 ".}s   CU*T R"#R$R"'AT 5AT T AT 'BT C4T :A+T +AT =T T R AT R" T "T %U*U*	U*SU*;S><U*U'$U',U'?U U'U!U''U*)r  r  r  r  rb   r  r  ra   r  r   r  r`   r  r  r  N)r  )r4   r5   r6   r7   r  r   r  r  r  r^   rM  r   r  r  r  r  r  r/  r.  r  r  r  rJ  rK  r   r#   r   r   r9   r3   r:   r;   r.  r.    s          $ $ $3
 " "+0 !+0 +0Z;$N$7)394 6"y8 #y8r:   r.  )r  rJ   )C
__future__r   r   r  osr  abcr   r   collections.abcr   r   dataclassesr   typesr	   typingr
   r   r   r   r   opentelemetryr   pydanticr   r   r   livekitr   livekit.agents.metrics.baser   _exceptionsr   r   logr   r"  r   	telemetryr   r   r   rH  r   r   r   r    r!   r"   r#   r$   r  r&   rT   getenvro  r)   r=   rA   rM   EventEmitterrO   r   r   r   r.  r3   r:   r;   <module>r     s"   "   	  # 8 !  E E  1 1  0 2    E E ] ] A A&"))M1-. 
D 
D 
D M M My  
	dW9:VCDFOdNLC L^&} &Rfs fR	}8 }8r:   