
    .hc+                        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 dS )    )annotationsN)AsyncIterator)Any   )	UserError)logger)SpanSpeechGroupSpanDataspeech_group_spanspeech_span)time_iso   )VoiceStreamEventVoiceStreamEventAudioVoiceStreamEventErrorVoiceStreamEventLifecycle)npnpt)TTSModelTTSModelSettings)VoicePipelineConfig
audio_datalist[bytes]returnstrc                z    d                     |           }t          j        |                              d          S )N    zutf-8)joinbase64	b64encodedecode)r   joined_audio_datas     P/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/agents/voice/result.py_audio_to_base64r$      s4    ,,-..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	d0dZ
d  Zd! Zd" Zd# Zd$ Zd% Zd& Zd1d(Zd)S )2StreamedAudioResultzTThe output of a `VoicePipeline`. Streams events and audio data as they're generated.	tts_modelr   tts_settingsr   voice_pipeline_configr   c                T   || _         || _        d| _        |j        | _        d| _        || _        d| _        d| _        t          j	                    | _
        g | _        g | _        d| _        d| _        |j        | _        d| _        d| _        d| _        d| _        d| _        d| _        dS )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)r'   r(   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(   r)   s       r#   __init__zStreamedAudioResult.__init__   s     #(!#(5>B!&;#!#7>}/1  	  	 !&(4(-%$)!26#"'7;?Cr   c                  K   | j         rd S t                      | _        | j                                         d| _         d| _        t                      | _        | j                            t          d                     d {V  d S )NTFturn_startedevent)
r;   r   r@   startr<   r   r=   r4   putr   rA   s    r#   _start_turnzStreamedAudioResult._start_turnG   s      ( 	F.00  """(,%$)!&.jj#koo7nMMMNNNNNNNNNNNr   taskasyncio.Task[Any]c                    || _         d S N)r.   rA   rK   s     r#   	_set_taskzStreamedAudioResult._set_taskR   s    $(!!!r   error	Exceptionc                d   K   | j                             t          |                     d {V  d S rN   )r4   rH   r   )rA   rQ   s     r#   
_add_errorzStreamedAudioResult._add_errorU   s;      koo3E::;;;;;;;;;;;r   bufferr   output_dtypenpt.DTypeLiker   "npt.NDArray[np.int16 | np.float32]c                6   t          j        d                    |          t           j                  }|t           j        k    r|S |t           j        k    r6|                    t           j                  dz                      dd          S t          d          )Nr   )dtypeg    @r   zInvalid output dtype)r   
frombufferr   int16float32astypereshaper   )rA   rU   rV   np_arrays       r#   _transform_audio_bufferz+StreamedAudioResult._transform_audio_bufferX   s}     =&!1!1BBB28##ORZ''OOBJ//'9BB2qIII2333r   Ftextr   local_queue&asyncio.Queue[VoiceStreamEvent | None]finish_turnboolc                  K   t          | j        j        | j        j        r|nd| j        j        | j        | j        j        dd| j	                  5 }	 d}g }g }| j        
                    || j                  2 3 d {V }|sd}t                      |j        _        |r|                    |           |                    |           t          |          | j        k    rq|                     || j        j                  }	| j        j        r| j                            |	          }	|                    t+          |	                     d {V  g }6 |ro|                     || j        j                  }	| j        j        r| j                            |	          }	|                    t+          |	                     d {V  | j        j        rt/          |          |j        _        nd|j        _        |r*|                    t3          d	                     d {V  n|                    d            d {V  n# t4          $ r|}
|                    t9          |
          d
| j        j        r|ndid           t;          j        d|
            |                    t3          d	                     d {V  |
d }
~
ww xY wd d d            d S # 1 swxY w Y   d S )Nr+   )voicer-   speedpcm)modelinputmodel_configoutput_formatparentFT)data
turn_endedrE   rc   )messagerq   zError streaming audio: session_ended)r   r'   
model_namer/   trace_include_sensitive_datar(   ri   r-   rj   r@   runr   	span_datafirst_content_atappendlenr:   rb   rZ   transform_datarH   r   "trace_include_sensitive_audio_datar$   outputr   rR   	set_errorr   r   rQ   )rA   rc   rd   rf   tts_spanfirst_byte_receivedrU   full_audio_datachunkaudio_npes              r#   _stream_audioz!StreamedAudioResult._stream_audiod   s      .+5RZ$$XZ*0 $ 1*0 
  %

 

 

 >	 3&+#&(/1#'>#5#5dD<M#N#N ( ( ( ( ( ( (%. I.2+>Fjj*; 
(e,,,'..u555v;;$*;;;'+'C'CFDL]Lc'd'dH#0? V+/+<+K+KH+U+U"-// 58 D D D# #        &(F $O   P#;;FDDUD[\\H(7 N#'#4#C#CH#M#M%//*?X*N*N*NOOOOOOOOO.Q 30@0Q0QH&--02H&- 0%//*C,*W*W*WXXXXXXXXXX%//$/////////   ""#&q66"#:W%$DD!#! 	 	 	 :q::;;; "oo&?o&V&V&VWWWWWWWWW_>	 >	 >	 >	 >	 >	 >	 >	 >	 >	 >	 >	 >	 >	 >	 >	 >	 >	sD   K&H>9E?F>H>=K>
KA7J??KKKKc                X  K   |                                   d {V  | xj        |z  c_        | xj        |z  c_        | xj        |z  c_        | j                            | j                  \  }| _        t          |          dk    rt          j                    }| j	        
                    |           | j        
                    t          j        |                     ||                               | j        /t          j        |                                           | _        d S d S d S )N   )rJ   r0   r,   r1   r(   text_splitterr{   r2   r3   r6   rz   r5   create_taskr   r7   _dispatch_audio)rA   rc   combined_sentencesrd   s       r#   	_add_textzStreamedAudioResult._add_text   s8              T!$&$&040A0O0OPTPa0b0b-D-!""b((BI-//K&&{333K#D$6$67I;$W$WXX   $,(/(;D<P<P<R<R(S(S%%% )( -,r   c           	       K   | j         r{t          j                    }| j                            |           | j                            t          j        |                     | j         |d                               d| _         d| _        | j	        +t          j        | 
                                          | _	        t          j        | j          d {V  d S )NT)rf   r+   )r0   r2   r3   r6   rz   r5   r   r   r8   r7   r   gather)rA   rd   s     r#   
_turn_donezStreamedAudioResult._turn_done   s       	#BI-//K&&{333K#&&t'8+SW&XX   
 !#D $ ($+$78L8L8N8N$O$OD!ndk**********r   c                    | j         rT| j        j        r| j        | j         j        _        nd| j         j        _        | j                                          d | _         d| _        d| _        d S )Nr+   F)r@   r/   rv   r1   rx   rm   finishr;   rI   s    r#   _finish_turnz StreamedAudioResult._finish_turn   sp     	&*G 8595K",2257",2%%'''!%D!#(-%%%r   c                L   K   d| _         |                                  d {V  d S )NT)r>   _wait_for_completionrI   s    r#   _donezStreamedAudioResult._done   s8      "&'')))))))))))r   c                $  K   	 t          | j                  dk    r#| j        rnt          j        d           d {V  <| j                            d          }	 |                                 d {V }|nj| j                            |           d {V  t          |t                    r4|                                 |j        dk    r|                                  n| j                            t          d                     d {V  d S )NTr   rr   rt   rE   )r{   r6   r>   r2   sleeppopgetr4   rH   
isinstancer   	task_donerF   r   )rA   rd   r   s      r#   r   z#StreamedAudioResult._dispatch_audio   sI     	4&''1,,* mA&&&&&&&&&-11!44K	)oo////////=kooe,,,,,,,,,e%>?? ))+++{l22))+++		" koo7oNNNOOOOOOOOOOOr   c                   K   | j         }| j        |                    | j                   t          j        |  d {V  d S rN   )r5   r7   rz   r2   r   )rA   taskss     r#   r   z(StreamedAudioResult._wait_for_completion   sP      )- ,LL.///ne$$$$$$$$$$r   c                ~   |                                   | j        D ]*}|                                s|                                 +| j        r2| j                                        s| j                                         | j        r4| j                                        s| j                                         d S d S d S rN   )r   r5   donecancelr7   r.   rO   s     r#   _cleanup_tasksz"StreamedAudioResult._cleanup_tasks   s    K 	 	D99;;   	+)>)C)C)E)E 	+!((***$ 	/T-F-K-K-M-M 	/%,,.....	/ 	/ 	/ 	/r   c                    | j         D ]F}|                                r0|                                r|                                | _         d S Gd S rN   )r5   r   	exceptionr?   rO   s     r#   _check_errorsz!StreamedAudioResult._check_errors  sY    K 	 	Dyy{{ >>## -1^^-=-=D*EE		 	r   AsyncIterator[VoiceStreamEvent]c                 K   	 	 | j                                          d{V }n# t          j        $ r Y nbw xY wt	          |t
                    r)|j        | _        t          j        d|j                    n |n|W V  |j	        dk    r|j
        dk    rn|                                  |                                  | j        r| j        dS )z6Stream the events and audio data as they're generated.TNzError processing output: voice_stream_event_lifecyclert   )r4   r   r2   CancelledErrorr   r   rQ   r?   r   typerF   r   r   )rA   rF   s     r#   streamzStreamedAudioResult.stream
  s     	"koo////////)   %!677 ).&FFFGGG}KKKKz;;;@^@^	 	! 	)((	) 	)s   % 77N)r'   r   r(   r   r)   r   )rK   rL   )rQ   rR   )rU   r   rV   rW   r   rX   )F)rc   r   rd   re   rf   rg   )rc   r   )r   r   )__name__
__module____qualname____doc__rB   rJ   rP   rT   rb   r   r   r   r   r   r   r   r   r   r    r   r#   r&   r&      s=       ^^&D &D &D &DP	O 	O 	O) ) ) )< < < <
4 
4 
4 
4  "	D D D D DLT T T T$+ + +
. 
. 
.* * *P P P*% % %/ / /  ) ) ) ) ) )r   r&   )r   r   r   r   )!
__future__r   r2   r   collections.abcr   typingr   
exceptionsr   r   tracingr	   r
   r   r   tracing.utilr   eventsr   r   r   r   importsr   r   rl   r   r   pipeline_configr   r$   r&   r   r   r#   <module>r      sw   " " " " " "   ) ) ) ) ) )       " " " " " "       O O O O O O O O O O O O # # # # # #                    - - - - - - - - 0 0 0 0 0 0? ? ? ?
C) C) C) C) C) C) C) C) C) C)r   