o
    hc+                     @  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
 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dZG d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                 C  s   d | }t|dS )N    zutf-8)joinbase64	b64encodedecode)r   joined_audio_data r!   T/var/www/html/openai_agents/venv/lib/python3.10/site-packages/agents/voice/result.py_audio_to_base64   s   
r#   c                   @  s   e Zd ZdZd9dd	Zd
d Zd:ddZd;ddZd<ddZ	d=d>d#d$Z	d?d%d&Z
d'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd@d6d7Zd8S )AStreamedAudioResultzTThe output of a `VoicePipeline`. Streams events and audio data as they're generated.	tts_modelr   tts_settingsr   voice_pipeline_configr   c                 C  s   || _ || _d| _|j| _d| _|| _d| _d| _t	 | _
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'   r!   r!   r"   __init__   s,   

zStreamedAudioResult.__init__c                   sN   | j rd S t | _| j  d| _ d| _t | _| jt	ddI d H  d S )NTFturn_startedevent)
r8   r
   r=   startr9   r   r:   r1   putr   r>   r!   r!   r"   _start_turnG   s   
zStreamedAudioResult._start_turntaskasyncio.Task[Any]c                 C  s
   || _ d S N)r+   r>   rG   r!   r!   r"   	_set_taskR   s   
zStreamedAudioResult._set_taskerror	Exceptionc                   s   | j t|I d H  d S rI   )r1   rD   r   )r>   rL   r!   r!   r"   
_add_errorU   s   zStreamedAudioResult._add_errorbufferr   output_dtypenpt.DTypeLiker   "npt.NDArray[np.int16 | np.float32]c                 C  sN   t jd|t jd}|t jkr|S |t jkr#|t jd ddS td)Nr   )dtypeg    @r   zInvalid output dtype)r   
frombufferr   int16float32astypereshaper   )r>   rO   rP   np_arrayr!   r!   r"   _transform_audio_bufferX   s   

z+StreamedAudioResult._transform_audio_bufferFtextr   local_queue&asyncio.Queue[VoiceStreamEvent | None]finish_turnboolc                   s  t | jj| jjr|nd| jj| j| jjdd| j	d}zd}g }g }| j
|| j2 zA3 d H W }|s;d}t |j_|rm|| || t|| jkrm| || jj}	| jjr`| j|	}	|t|	dI d H  g }q,6 |r| || jj}	| jjr| j|	}	|t|	dI d H  | jjrt||j_nd|j_|r|tdd	I d H  n|d I d H  W n3 ty }
 z'|t|
d
| jjr|ndid td|
  |tdd	I d H  |
d }
~
ww W d    d S 1 sw   Y  d S )Nr(   )voicer*   speedpcm)modelinputmodel_configoutput_formatparentFT)data
turn_endedrA   r\   )messageri   zError streaming audio: session_ended)r   r%   
model_namer,   trace_include_sensitive_datar&   ra   r*   rb   r=   runr   	span_datafirst_content_atappendlenr7   r[   rS   transform_datarD   r   "trace_include_sensitive_audio_datar#   outputr   rM   	set_errorr   r   rL   )r>   r\   r]   r_   tts_spanfirst_byte_receivedrO   full_audio_datachunkaudio_nper!   r!   r"   _stream_audiod   s|   





"z!StreamedAudioResult._stream_audioc                   s   |   I d H  |  j|7  _|  j|7  _|  j|7  _| j| j\}| _t|dkrSt }| j	
| | j
t| || | jd u rUt|  | _d S d S d S )N   )rF   r-   r)   r.   r&   text_splitterrs   r/   r0   r3   rr   r2   create_taskr~   r4   _dispatch_audio)r>   r\   combined_sentencesr]   r!   r!   r"   	_add_text   s    
zStreamedAudioResult._add_textc              	     sx   | j r!t }| j| | jt| j| j |dd d| _ d| _| j	d u r1t| 
 | _	tj| j I d H  d S )NT)r_   r(   )r-   r/   r0   r3   rr   r2   r   r~   r5   r4   r   gather)r>   r]   r!   r!   r"   
_turn_done   s   
zStreamedAudioResult._turn_donec                 C  sF   | j r| jjr| j| j j_nd| j j_| j   d | _ d| _d| _d S )Nr(   F)r=   r,   rn   r.   rp   re   finishr8   rE   r!   r!   r"   _finish_turn   s   


z StreamedAudioResult._finish_turnc                   s   d| _ |  I d H  d S )NT)r;   _wait_for_completionrE   r!   r!   r"   _done   s   zStreamedAudioResult._donec                   s   	 t | jdkr| jrn:tdI d H  q| jd}	 | I d H }|d u r)n| j|I d H  t	|t
rE|  |jdkrE|   nqq| jt
ddI d H  d S )NTr   rj   rl   rA   )rs   r3   r;   r/   sleeppopgetr1   rD   
isinstancer   	task_donerB   r   )r>   r]   r{   r!   r!   r"   r      s*   

z#StreamedAudioResult._dispatch_audioc                   s2   | j }| jd ur|| j tj| I d H  d S rI   )r2   r4   rr   r/   r   )r>   tasksr!   r!   r"   r      s
   
z(StreamedAudioResult._wait_for_completionc                 C  sd   |    | jD ]
}| s|  q| jr| j s| j  | jr.| j s0| j  d S d S d S rI   )r   r2   donecancelr4   r+   rJ   r!   r!   r"   _cleanup_tasks   s   

z"StreamedAudioResult._cleanup_tasksc                 C  s0   | j D ]}| r| r| | _ d S qd S rI   )r2   r   	exceptionr<   rJ   r!   r!   r"   _check_errors  s   

z!StreamedAudioResult._check_errorsAsyncIterator[VoiceStreamEvent]c                 C s   	 z
| j  I dH }W n
 tjy   Y n(w t|tr*|j| _td|j  n|du r/n|V  |j	dkr=|j
dkr=nq|   |   | jrL| jdS )z6Stream the events and audio data as they're generated.TNzError processing output: voice_stream_event_lifecyclerl   )r1   r   r/   CancelledErrorr   r   rL   r<   r   typerB   r   r   )r>   rB   r!   r!   r"   stream
  s,   
zStreamedAudioResult.streamN)r%   r   r&   r   r'   r   )rG   rH   )rL   rM   )rO   r   rP   rQ   r   rR   )F)r\   r   r]   r^   r_   r`   )r\   r   )r   r   )__name__
__module____qualname____doc__r?   rF   rK   rN   r[   r~   r   r   r   r   r   r   r   r   r   r!   r!   r!   r"   r$      s$    
(



Fr$   )r   r   r   r   )!
__future__r   r/   r   collections.abcr   typingr   
exceptionsr   r   tracingr   r	   r
   r   tracing.utilr   eventsr   r   r   r   importsr   r   rd   r   r   pipeline_configr   r#   r$   r!   r!   r!   r"   <module>   s    
