+
    ~j%                        ^ RI Ht ^ RIt^ RIt^ RIHt ^RIHt ^RIH	t	 ^RI
HtHt ^RIHt ] ! R R	4      4       t ! R
 R4      t ! R R]4      tR# )    )annotationsN)	dataclass)utils)logger)SentenceStream	TokenData)AudioEmitterc                  ,    ] tR t^t$ R]R&   R]R&   RtR# )StreamPacerOptionsfloatmin_remaining_audiointmax_text_length N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r       t/Users/mitch_tango/dev/rabbit-r1-livekit/agent/.venv/lib/python3.14/site-packages/livekit/agents/tts/stream_pacer.pyr   r      s    r   r   c                  :    ] tR t^tRRRR/R R lltR R ltR	tR
# )SentenceStreamPacerr   g      @r   i,  c               $    V ^8  d   QhRRRRRR/# )   r   r   r   r   returnNoner   )formats   "r   __annotate__ SentenceStreamPacer.__annotate__   s"     
 
u 
S 
[_ 
r   c               *    \        VVR7      V n        R# )a  
Controls the pacing of text sent to TTS. It buffers sentences and decides when to flush
based on remaining audio duration. This may reduce waste from interruptions and improve
speech quality by sending larger chunks of text with more context.

Args:
    min_remaining_audio: Minimum remaining audio duration (seconds) before sending next batch.
    max_text_length: Maximum text length sent to TTS at once.
)r   r   N)r   _options)selfr   r   s   &$$r   __init__SentenceStreamPacer.__init__   s     + 3+
r   c               $    V ^8  d   QhRRRRRR/# )r   sent_streamr   audio_emitterr	   r   StreamPacerWrapperr   )r   s   "r   r    r!   #   s"     
 
 
| 
Pb 
r   c                	0    \        V P                  WR 7      # ))optionsr(   r)   )r*   r#   )r$   r(   r)   s   &&&r   wrapSentenceStreamPacer.wrap#   s    !MM{
 	
r   )r#   N)r   r   r   r   r%   r-   r   r   r   r   r   r      s     
s 
SV 

 
r   r   c                  v   a  ] tR t^)tR V 3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tV ;t# )r*   c               (    V ^8  d   QhRRRRRRRR/# )	r   r(   r   r)   r	   r,   r   r   r   r   )r   s   "r   r    StreamPacerWrapper.__annotate__*   s8     M M#M $M
 $M 
Mr   c               	  <a  \         SS `  4        VS n        VS n        VS n        R S n        R S n        . S n        \        P                  ! 4       S n
        RS n        \        P                  ! S P                  4       4      S n        \        P                  ! S P                  4       4      S n        S P                   P#                  V 3R l4       R# )FNc                8   < SP                   P                  4       # N)	_event_chclose)_r$   s   &r   <lambda>-StreamPacerWrapper.__init__.<locals>.<lambda>>   s    T^^5I5I5Kr   )superr%   _sent_streamr#   _audio_emitter_closing_input_ended
_sentencesasyncioEvent_wakeup_event_wakeup_timercreate_task
_recv_task_recv_atask
_send_task_send_ataskadd_done_callback)r$   r(   r)   r,   	__class__s   f&&$r   r%   StreamPacerWrapper.__init__*   s     	'+!%'$]]_9="..t/@A"..t/@A**+KLr   c                    V ^8  d   QhRRRR/# )r   textstrr   r   r   )r   s   "r   r    r1   @   s     * *c *d *r   c                	<    V P                   P                  V4       R # r4   )r;   	push_text)r$   rM   s   &&r   rP   StreamPacerWrapper.push_text@   s    ##D)r   c                   V ^8  d   QhRR/# r   r   r   r   )r   s   "r   r    r1   C   s     " "t "r   c                	:    V P                   P                  4        R # r4   )r;   flushr$   s   &r   rU   StreamPacerWrapper.flushC   s    !r   c                   V ^8  d   QhRR/# rS   r   )r   s   "r   r    r1   F   s     % %4 %r   c                	    V P                   P                  4        R V n        V P                  P                  P
                  '       d$   R V n        V P                  P                  4        R# R# )TN)	r;   	end_inputr>   r<   _dst_chclosedr=   rB   setrV   s   &r   rZ   StreamPacerWrapper.end_inputF   sR    ##% &&--- DM""$ .r   c                   V ^8  d   QhRR/# rS   r   )r   s   "r   r    r1   N   s     L Ld Lr   c                	z  "   V P                   P                  4       G R j  xL
  RV n        V P                  '       d"   V P                  P	                  4        R V n        V P
                  P                  4        \        P                  P                  V P                  V P                  4      G R j  xL
  R #  L L5iNT)r;   acloser=   rC   cancelrB   r]   r   aiocancel_and_waitrF   rH   rV   s   &r   rb   StreamPacerWrapper.acloseN   s     &&(((%%'!%D ii''(8(8$:J:JKKK 	) 	Ls'   B;B7B;A2B;0B91B;9B;c                   V ^8  d   QhRR/# rS   r   )r   s   "r   r    r1   X   s     % %$ %r   c                	T  "    V P                     R j  xL
  pV P                  P                  VP                  4       V P                  P                  4        KK   LFDG RT n        T P                  P                  4        R #   RT n        T P                  P                  4        i ; i5ira   )r;   r?   appendtokenrB   r]   r>   )r$   evs   & r   rE   StreamPacerWrapper._recv_taskX   s     	% -- ) )b&&rxx0""&&()- !%D""$ !%D""$s=   B(B AAAAB AB #B(#B%%B(c                   V ^8  d   QhRR/# rS   r   )r   s   "r   r    r1   a   s     C C$ Cr   c                	  "   R pRpR pR pRpRpV P                   '       Eg   V P                  P                  4       G Rj  xL
  V P                  P                  4        V P                  '       d"   V P                  P                  4        RV n        V P                   '       g%   V P                  '       d   V P                  '       g   R# V P                  P                  4       p\        P                  ! 4       pVR 8  d
   VR 8X  d   TpW,
          R8  d   W78  d   RpM
V'       d   RpTpTpVR 8  d   W,           V,
          MR p	V'       g#   V'       d   WP                  P                  8:  d   . p
V P                  '       da   V
P                  V P                  P                  ^ 4      4       V'       g.   \        R V
 4       4      V P                  P                   8  g   Kq   V
'       dY   RP#                  V
4      pV P$                  P'                  \)        VR7      4       \*        P,                  ! RR	VR
V	/R7       RpRpRpV'       d   V'       g   RpM&\/        RWP                  P                  ,
          4      p\0        P2                  ! 4       P5                  WP                  P6                  4      V n        EK  R#  EL~5i)g        TFNg?c              3  8   "   T F  p\        V4      x  K  	  R # 5ir4   )len).0ss   & r   	<genexpr>0StreamPacerWrapper._send_task.<locals>.<genexpr>   s     5u!s1vvus    )rj   zsent text to ttsrM   remaining_audio)extrag?g      ?)r=   rB   waitclearrC   rc   r>   r?   r<   pushed_durationtimer#   r   ri   popsumr   joinr5   send_nowaitr   r   debugmaxr@   get_event_loop
call_laterr]   )r$   audio_start_timefirst_sentenceprev_audio_durationprev_check_timegeneration_startedgeneration_stoppedaudio_duration	curr_timerv   batchrM   	wait_times   &            r   rG   StreamPacerWrapper._send_taska   s6     """---$$))+++$$&!!!""))+%)"}}}!2!2!24???!00@@BN		I#(8C(?#,  *c1&7)-&')-&&4#"+ BRTWAW 1I=]`  "--:[:['[#%oooLL!4!4Q!78&5u559V9VV88E?DNN..yt/DELL*%t->P */&).&%*N "*<	_}}7X7X%XY	!(!7!7!9!D!D--11"Do  +sf   K K J= /K 02K #K 5K AK &%K K -K 1K 4(K !K *AK 
K A,K )
r<   r=   r>   r#   rF   rH   r;   r?   rB   rC   )r   r   r   r   r%   rP   rU   rZ   rb   rE   rG   r   __classcell__)rJ   s   @r   r*   r*   )   s5    M M,*"%L%C Cr   r*   )
__future__r   r@   r{   dataclassesr    r   logr   tokenizer   r   ttsr	   r   r   r*   r   r   r   <module>r      sN    "   !   0    

 
,{ {r   