o
    i%                     @  s   d dl mZ d dlZd dlZd dlmZ ddlmZ ddlm	Z	 ddl
mZmZ dd	lmZ eG d
d dZG dd dZG dd deZdS )    )annotationsN)	dataclass   )utils)logger)SentenceStream	TokenData   )AudioEmitterc                   @  s   e Zd ZU ded< ded< dS )StreamPacerOptionsfloatmin_remaining_audiointmax_text_lengthN)__name__
__module____qualname____annotations__ r   r   a/var/www/html/livekit_bhavya/venv/lib/python3.10/site-packages/livekit/agents/tts/stream_pacer.pyr      s   
 r   c                   @  s(   e Zd Zddddd
dZdddZdS )SentenceStreamPacerg      @i,  r   r   r   r   r   r   returnNonec                C  s   t ||d| _dS )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   N)r   _options)selfr   r   r   r   r   __init__   s   
zSentenceStreamPacer.__init__sent_streamr   audio_emitterr
   StreamPacerWrapperc                 C  s   t | j||dS )N)optionsr   r   )r   r   )r   r   r   r   r   r   wrap#   s   zSentenceStreamPacer.wrapN)r   r   r   r   r   r   )r   r   r   r
   r   r   )r   r   r   r   r!   r   r   r   r   r      s    r   c                      sZ   e Zd Zd fd	d
ZdddZdddZdddZdddZdddZdddZ	  Z
S )r   r   r   r   r
   r    r   r   r   c                  sv   t    | _| _| _d _d _g  _t	  _
d  _t   _t   _ j fdd d S )NFc                   s
    j  S N)	_event_chclose)_r   r   r   <lambda>>   s   
 z-StreamPacerWrapper.__init__.<locals>.<lambda>)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__r&   r   r   *   s   

zStreamPacerWrapper.__init__textstrc                 C  s   | j | d S r"   )r)   	push_text)r   r:   r   r   r   r<   @   s   zStreamPacerWrapper.push_textc                 C  s   | j   d S r"   )r)   flushr&   r   r   r   r=   C   s   zStreamPacerWrapper.flushc                 C  s2   | j   d| _| jjjrd| _| j  d S d S NT)	r)   	end_inputr,   r*   _dst_chclosedr+   r0   setr&   r   r   r   r?   F   s   

zStreamPacerWrapper.end_inputc                   sT   | j  I d H  d| _| jr| j  d | _| j  tj	| j
| jI d H  d S r>   )r)   acloser+   r1   cancelr0   rB   r   aiocancel_and_waitr4   r6   r&   r   r   r   rC   N   s   

zStreamPacerWrapper.aclosec                   sZ   z"| j 2 z3 d H W }| j|j | j  q6 W d| _| j  d S d| _| j  w r>   )r)   r-   appendtokenr0   rB   r,   )r   evr   r   r   r3   X   s   zStreamPacerWrapper._recv_taskc                   s  d}d}d}d}d}d}| j s| j I d H  | j  | jr(| j  d | _| j s1| jr3| js3d S | j	 }t

 }|dkrF|dkrF|}|| dkr[||k rSd}n|rWd}|}|}|dkre|| | nd}	|sq|r|	| jjkrg }
| jr|
| jd |stdd |
D | jjkrn| jsv|
rd|
}| jt|d	 tjd
||	dd d}d}d}|r|sd}n	td|	| jj }t || jj| _| j rd S d S )Ng        TFg?r   c                 s  s    | ]}t |V  qd S r"   )len).0sr   r   r   	<genexpr>   s    z0StreamPacerWrapper._send_task.<locals>.<genexpr> )rH   zsent text to tts)r:   remaining_audio)extrag?g      ?)r+   r0   waitclearr1   rD   r,   r-   r*   pushed_durationtimer   r   rG   popsumr   joinr#   send_nowaitr   r   debugmaxr.   get_event_loop
call_laterrB   )r   audio_start_timefirst_sentenceprev_audio_durationprev_check_timegeneration_startedgeneration_stoppedaudio_duration	curr_timerO   batchr:   	wait_timer   r   r   r5   a   sr   



zStreamPacerWrapper._send_task)r   r   r   r
   r    r   r   r   )r:   r;   r   r   )r   r   )r   r   r   r   r<   r=   r?   rC   r3   r5   __classcell__r   r   r8   r   r   )   s    





	r   )
__future__r   r.   rT   dataclassesr    r   logr   tokenizer   r   ttsr
   r   r   r   r   r   r   r   <module>   s    