
    /Uic+                        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
 ddlmZmZmZmZ dd	lmZ d
dlmZmZmZmZ d
dlmZmZ d
dlmZmZ d
dlmZ ddZ G d d      Z y)    )annotationsN)AsyncIterator)Any   )	UserError)logger)SpanSpeechGroupSpanDataspeech_group_spanspeech_span)time_iso   )VoiceStreamEventVoiceStreamEventAudioVoiceStreamEventErrorVoiceStreamEventLifecycle)npnpt)TTSModelTTSModelSettings)VoicePipelineConfigc                l    dj                  |       }t        j                  |      j                  d      S )N    zutf-8)joinbase64	b64encodedecode)
audio_datajoined_audio_datas     o/home/jay/workspace/tools/ai-image-gen/jaaz-app/server/venv/lib/python3.12/site-packages/agents/voice/result.py_audio_to_base64r!      s.    ,-.55g>>r   c                      e Zd ZdZ	 	 	 	 	 	 ddZd ZddZddZ	 	 	 	 	 	 ddZ	 d	 	 	 	 	 ddZ	ddZ
d	 Zd
 Zd Zd Zd Zd Zd ZddZy)StreamedAudioResultzTThe output of a `VoicePipeline`. Streams events and audio data as they're generated.c                h   || _         || _        d| _        |j                  | _        d| _        || _        d| _        d| _        t        j                         | _
        g | _        g | _        d| _        d| _        |j                  | _        d| _        d| _        d| _        d| _        d| _        d| _        y)zCreate a new `StreamedAudioResult` instance.

        Args:
            tts_model: The TTS model to use.
            tts_settings: The TTS settings to use.
            voice_pipeline_config: The voice pipeline config to use.
         NF)	tts_modeltts_settingstotal_output_textinstructionstext_generation_task_voice_pipeline_config_text_buffer_turn_text_bufferasyncioQueue_queue_tasks_ordered_tasks_dispatcher_task_done_processingbuffer_size_buffer_size_started_processing_turn_first_byte_received_generation_start_time_completed_session_stored_exception_tracing_span)selfr&   r'   voice_pipeline_configs       r    __init__zStreamedAudioResult.__init__   s     #(!#(55>B!&;#!#7>}}/1  	  	 !&(44(-%$)!26#"'7;?Cr   c                  K   | j                   ry t               | _        | j                  j                          d| _         d| _        t               | _        | j                  j                  t        d             d {    y 7 w)NTFturn_startedevent)
r7   r   r<   startr8   r   r9   r0   putr   r=   s    r    _start_turnzStreamedAudioResult._start_turnG   se     ((.0  "(,%$)!&.j#kkoo7nMNNNs   A<B>B?Bc                    || _         y N)r*   r=   tasks     r    	_set_taskzStreamedAudioResult._set_taskR   s
    $(!r   c                h   K   | j                   j                  t        |             d {    y 7 wrI   )r0   rE   r   )r=   errors     r    
_add_errorzStreamedAudioResult._add_errorU   s"     kkoo3E:;;;s   (202c                4   t        j                  dj                  |      t         j                        }|t         j                  k(  r|S |t         j                  k(  r2|j                  t         j                        dz  j                  dd      S t        d      )Nr   )dtypeg    @r   zInvalid output dtype)r   
frombufferr   int16float32astypereshaper   )r=   bufferoutput_dtypenp_arrays       r    _transform_audio_bufferz+StreamedAudioResult._transform_audio_bufferX   so     ==&!1B288#ORZZ'OOBJJ/'9BB2qII233r   c                b  K   t        | j                  j                  | j                  j                  r|nd| j
                  j                  | j                  | j
                  j                  dd| j                        5 }	 d}g }g }| j                  j                  || j
                        2 3 d {   }|sd}t               |j                  _        |s)|j                  |       |j                  |       t        |      | j                   k\  sd| j#                  || j
                  j$                        }	| j
                  j&                  r| j
                  j'                  |	      }	|j)                  t+        |	             d {    g }7 7 	6 |r{| j#                  || j
                  j$                        }	| j
                  j&                  r| j
                  j'                  |	      }	|j)                  t+        |	             d {  7   | j                  j,                  rt/        |      |j                  _        nd|j                  _        |r%|j)                  t3        d	             d {  7   n|j)                  d        d {  7   n# t4        $ rz}
|j7                  t9        |
      d
| j                  j                  r|ndid       t;        j<                  d|
        |j)                  t3        d	             d {  7   |
d }
~
ww xY wd d d        y # 1 sw Y   y xY ww)Nr%   )voicer)   speedpcm)modelinputmodel_configoutput_formatparentFT)data
turn_endedrB   text)messagere   zError streaming audio: session_ended)r   r&   
model_namer+   trace_include_sensitive_datar'   r]   r)   r^   r<   runr   	span_datafirst_content_atappendlenr6   r[   rQ   transform_datarE   r   "trace_include_sensitive_audio_datar!   outputr   	Exception	set_errorstrr   rN   )r=   rg   local_queuefinish_turntts_spanfirst_byte_receivedrX   full_audio_datachunkaudio_npes              r    _stream_audioz!StreamedAudioResult._stream_audiod   s     ..++55RR$XZ**00 $ 1 1**00
  %%

 >	 3&+#&(/1#'>>#5#5dD<M<M#N ( (%..2+>Fj**;e,'..u5v;$*;*;;'+'C'CFDL]L]LcLc'dH#00??+/+<+<+K+KH+U"-// 58 D#   &(F( $O  #;;FDDUDUD[D[\H((77#'#4#4#C#CH#M%//*?X*NOOO..QQ0@0QH&&-02H&&-%//*C,*WXXX%//$/// ""#&q6"#::WW %)!#!	 6qc:; "oo&?o&VWWW_>	 >	 >	s   A=L/?L#,J-F1F2F5 J:JA5JFJFJA8J
HA'J2I53JJJL#	LA-L
LLLL#	L/#L,(L/c                |  K   | j                          d {    | xj                  |z  c_        | xj                  |z  c_        | xj                  |z  c_        | j                  j                  | j                        \  }| _        t        |      dk\  rt        j                         }| j                  j                  |       | j                  j                  t        j                  | j                  ||                   | j                  )t        j                  | j                               | _        y y y 7 #w)N   )rG   r,   r(   r-   r'   text_splitterrp   r.   r/   r2   ro   r1   create_taskr   r3   _dispatch_audio)r=   rg   combined_sentencesrw   s       r    	_add_textzStreamedAudioResult._add_text   s       T!$&$&040A0A0O0OPTPaPa0b-D-!"b(BI--/K&&{3KK##D$6$67I;$WX $$,(/(;(;D<P<P<R(S% - ) 	!s   D<D9D#D<c           	       K   | j                   rt        j                         }| j                  j	                  |       | j
                  j	                  t        j                  | j                  | j                   |d                   d| _         d| _        | j                  (t        j                  | j                               | _	        t        j                  | j
                    d {    y 7 w)NT)rx   r%   )r,   r.   r/   r2   ro   r1   r   r   r4   r3   r   gather)r=   rw   s     r    
_turn_donezStreamedAudioResult._turn_done   s     BI--/K&&{3KK##&&t'8'8+SW&X
 !#D $  ($+$7$78L8L8N$OD!nndkk***s   C'C1)C/*C1c                (   | j                   rx| j                  j                  r&| j                  | j                   j                  _        nd| j                   j                  _        | j                   j                          d | _         d| _        d| _        y )Nr%   F)r<   r+   rk   r-   rm   ra   finishr7   rF   s    r    _finish_turnz StreamedAudioResult._finish_turn   sr    **GG595K5K"",,257"",,2%%'!%D!#(-%r   c                N   K   d| _         | j                          d {    y 7 w)NT)r:   _wait_for_completionrF   s    r    _donezStreamedAudioResult._done   s      "&'')))s   %#%c                6  K   	 t        | j                        dk(  r+| j                  rnt        j                  d       d {    D| j                  j                  d      }	 |j                          d {   }|nd| j                  j                  |       d {    t        |t              r0|j                          |j                  dk(  r| j                          n| j                  j                  t        d             d {    y 7 7 7 x7 w)Nr   rf   ri   rB   )rp   r2   r:   r.   sleeppopgetr0   rE   
isinstancer   	task_donerC   r   )r=   rw   r|   s      r    r   z#StreamedAudioResult._dispatch_audio   s     4&&'1,**mmA&&&--11!4K)oo//=kkooe,,,e%>?))+{{l2))+  " kkoo7oNOOO ' 0 - 	PsH   ?DD4D6D7%DDA.DDDDDDc                   K   | j                   }| j                  |j                  | j                         t        j                  |  d {    y 7 wrI   )r1   r3   ro   r.   r   )r=   taskss     r    r   z(StreamedAudioResult._wait_for_completion   s?     )-  ,LL../nne$$$s   A	AAAc                   | j                          | j                  D ]#  }|j                         r|j                          % | j                  r4| j                  j                         s| j                  j                          | j
                  r6| j
                  j                         s| j
                  j                          y y y rI   )r   r1   donecancelr3   r*   rJ   s     r    _cleanup_tasksz"StreamedAudioResult._cleanup_tasks   s    KK 	D99;	   )>)>)C)C)E!!((*$$T-F-F-K-K-M%%,,. .N$r   c                    | j                   D ]:  }|j                         s|j                         s%|j                         | _         y  y rI   )r1   r   	exceptionr;   rJ   s     r    _check_errorsz!StreamedAudioResult._check_errors  s:    KK 	Dyy{>>#-1^^-=D*		r   c                 K   	 	 | j                   j                          d{   }t	        |t
              r4|j                  | _        t        j                  d|j                          n(|n%| |j                  dk(  r|j                  dk(  rn| j                          | j                          | j                  r| j                  y7 # t        j                  $ r Y Pw xY ww)z6Stream the events and audio data as they're generated.NzError processing output: voice_stream_event_lifecycleri   )r0   r   r.   CancelledErrorr   r   rN   r;   r   typerC   r   r   )r=   rC   s     r    streamzStreamedAudioResult.stream
  s     "kkoo// %!67).&8FG}Kzz;;@^  	!!((( "! 0)) s8   C'C CC B%C'C C$!C'#C$$C'N)r&   r   r'   r   r>   r   )rK   zasyncio.Task[Any])rN   rt   )rX   list[bytes]rY   znpt.DTypeLikereturnz"npt.NDArray[np.int16 | np.float32])F)rg   rv   rw   z&asyncio.Queue[VoiceStreamEvent | None]rx   bool)rg   rv   )r   zAsyncIterator[VoiceStreamEvent])__name__
__module____qualname____doc__r?   rG   rL   rO   r[   r   r   r   r   r   r   r   r   r   r    r   r    r#   r#      s    ^&D&D '&D  3	&DP	O)<
4!
41>
4	+
4  "	DD <D 	DLT$+
.*P*%/)r   r#   )r   r   r   rv   )!
__future__r   r.   r   collections.abcr   typingr   
exceptionsr   r   tracingr	   r
   r   r   tracing.utilr   eventsr   r   r   r   importsr   r   r`   r   r   pipeline_configr   r!   r#   r   r   r    <module>r      sI    "   )  "  O O #   - 0?
C) C)r   