
    Cj^1                        S SK Jr  S SKrS SKrS SKJr  S SKJr  S SKJ	r	  SSK
Jr  SSKJr  SS	KJrJrJrJr  SS
KJr  SSKJrJrJrJr  SSKJrJr  SSKJrJr  SSKJ r   SS jr! " S S5      r"g)    )annotationsN)deque)AsyncIterator)Any   )	UserError)logger)SpanSpeechGroupSpanDataspeech_group_spanspeech_span)time_iso   )VoiceStreamEventVoiceStreamEventAudioVoiceStreamEventErrorVoiceStreamEventLifecycle)npnpt)TTSModelTTSModelSettings)VoicePipelineConfigc                n    SR                  U 5      n[        R                  " U5      R                  S5      $ )N    zutf-8)joinbase64	b64encodedecode)
audio_datajoined_audio_datas     e/home/rurouni/.local/share/pipx/venvs/strix-agent/lib/python3.13/site-packages/agents/voice/result.py_audio_to_base64r"      s.    ,-.55g>>r   c                      \ rS rSrSr      SS jrS rSS jrSS jr      SS jr	 S     SS jjr
SS	 jrS
 rS rS rS rS rS rS rSS jrSrg)StreamedAudioResult   zTThe output of a `VoicePipeline`. Streams events and audio data as they're generated.c                t   Xl         X l        SU l        UR                  U l        SU l        X0l        SU l        SU l        [        R                  " 5       U l
        / U l        [        5       U l        SU l        SU l        UR                   U l        SU l        SU l        SU l        SU l        SU l        SU l        g)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_tasksr   _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__StreamedAudioResult.__init__    s     #(!#(55>B!&;#!#7>}}/1G 	  	 !&(44(-%$)!26#"'7;?Cr   c                  #    U R                   (       a  g [        5       U l        U R                  R                  5         SU l         SU l        [        5       U l        U R                  R                  [        SS95      I S h  vN   g  N7f)NTFturn_startedevent)
r9   r   r>   startr:   r   r;   r2   putr   r?   s    r!   _start_turnStreamedAudioResult._start_turnH   sd     ((.0  "(,%$)!&.j#kkoo7nMNNNs   A>B BBc                    Xl         g N)r,   r?   tasks     r!   	_set_taskStreamedAudioResult._set_taskS   s    $(!r   c                h   #    U R                   R                  [        U5      5      I S h  vN   g  N7frM   )r2   rH   r   )r?   errors     r!   
_add_errorStreamedAudioResult._add_errorV   s!     kkoo3E:;;;s   (202c                f   SR                  U5      n[        U5      S-  S:w  a  US-  n[        R                  " U[        R                  S9nU[        R                  :X  a  U$ U[        R
                  :X  a2  UR                  [        R
                  5      S-  R                  SS5      $ [        S	5      e)
Nr   r   r       )dtypeg    @r   zInvalid output dtype)	r   lenr   
frombufferint16float32astypereshaper   )r?   bufferoutput_dtypecombined_buffernp_arrays        r!   _transform_audio_buffer+StreamedAudioResult._transform_audio_bufferY   s     ((6*!#q(w&O==A288#ORZZ'OOBJJ/'9BB2qII233r   c                  #    [        U R                  R                  U R                  R                  (       a  UOSU R
                  R                  U R                  U R
                  R                  S.SU R                  S9 n Sn/ n/ nSnU R                  R                  XR
                  5        S h  vN n	U(       d  Sn[        5       UR                  l        U	(       d  M4  UR                  U	5        UR                  U	5        [        U5      U R                   :  d  Mq  USR#                  U5      -   n
[        U
5      S-  S	:w  a  U
S
S  nU
S S
 n
OSnU
(       a}  U R%                  U
/U R
                  R&                  5      nU R
                  R(                  (       a  U R
                  R)                  U5      nUR+                  [-        US95      I S h  vN   / nGM-   GN) N
 U(       a  USR#                  U5      -   n
OUn
U
(       a  [        U
5      S-  S	:w  a  U
S-  n
U R%                  U
/U R
                  R&                  5      nU R
                  R(                  (       a  U R
                  R)                  U5      nUR+                  [-        US95      I S h  vN    U R                  R.                  (       a  [1        U5      UR                  l        OSUR                  l        U(       a"  UR+                  [5        SS95      I S h  vN    OUR+                  S 5      I S h  vN    O! [6         a}  nUR9                  [;        U5      SU R                  R                  (       a  UOS0S.5        [<        R>                  " SU 35        UR+                  [5        SS95      I S h  vN    UeS nAff = fS S S 5        g ! , (       d  f       g = f7f)Nr'   )voicer+   speedpcm)modelinputmodel_configoutput_formatparentFr   Tr   r   rY   )datarW   
turn_endedrE   text)messagero   zError streaming audio: session_ended) r   r(   
model_namer-   trace_include_sensitive_datar)   rg   r+   rh   r>   runr   	span_datafirst_content_atappendrZ   r8   r   rd   rX   transform_datarH   r   "trace_include_sensitive_audio_datar"   outputr   	Exception	set_errorstrr	   rS   )r?   rq   local_queuefinish_turntts_spanfirst_byte_receivedr`   full_audio_datapending_bytechunkcombinedaudio_npes                r!   _stream_audio!StreamedAudioResult._stream_audioj   s8     ..++55RR$XZ**00 $ 1 1**00
  %%

 F&+#&(/1"#'>>#5#5d<M<M#N (%..2+>Fj**;ue,'..u5v;$*;*;;'3chhv6F'FH"8}q0A5/7}+3CR=/2'+/+G+G%-J0A0A0G0G," $(#4#4#C#C/3/@/@/O/OPX/YH&1oo$9x$H'" !" !" &(F3(,!"- $O4 +chhv.>>H+H8}q(A- G+#;;XJHYHYH_H_`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E

 

 

s   A?ON;-L(0G"4G5G"8(L($9L(!B2L(G 	L(G" L("B5L(JA.L(L	L(N;L(!L$"L('N;(
N/2A0N*"N%#N**N//N;2	O;
O	Oc                  #    U R                  5       I S h  vN   U =R                  U-  sl        U =R                  U-  sl        U =R                  U-  sl        U R                  R                  U R                  5      u  o l        [        U5      S:  a  [        R                  " 5       nU R                  R                  U5        U R                  R                  [        R                  " U R                  X#5      5      5        U R                  c*  [        R                  " U R                  5       5      U l        g g g  GN&7f)N   )rJ   r.   r*   r/   r)   text_splitterrZ   r0   r1   r4   ry   r3   create_taskr   r5   _dispatch_audio)r?   rq   combined_sentencesr   s       r!   	_add_textStreamedAudioResult._add_text   s        T!$&$&040A0A0O0OPTPaPa0b--!"b(BI--/K&&{3KK##D$6$67I$WX $$,(/(;(;D<P<P<R(S% - ) 	!s   D?D<D&D?c           
       #    U R                   (       a  [        R                  " 5       nU R                  R	                  U5        U R
                  R	                  [        R                  " U R                  U R                   USS95      5        SU l         SU l        U R                  c)  [        R                  " U R                  5       5      U l	        [        R                  " U R
                  6 I S h  vN   g  N7f)NT)r   r'   )r.   r0   r1   r4   ry   r3   r   r   r6   r5   r   gather)r?   r   s     r!   
_turn_doneStreamedAudioResult._turn_done   s     BI--/K&&{3KK##&&t'8'8+SW&X
 !#D $  ($+$7$78L8L8N$OD!nndkk***s   C.C80C61C8c                <   U R                   (       a}  U R                  R                  (       a&  U R                  U R                   R                  l        OSU R                   R                  l        U R                   R                  5         S U l         SU l        SU l        g )Nr'   F)r>   r-   ru   r/   rw   rk   finishr9   rI   s    r!   _finish_turn StreamedAudioResult._finish_turn   sr    **GG595K5K"",,257"",,2%%'!%D!#(-%r   c                N   #    SU l         U R                  5       I S h  vN   g  N7f)NT)r<   _wait_for_completionrI   s    r!   _doneStreamedAudioResult._done   s     "&'')))s   %#%c                P  #     [        U R                  5      S:X  a2  U R                  (       a  O[        R                  " S5      I S h  vN   ML  U R                  R                  5       n UR                  5       I S h  vN nUc  OkU R                  R                  U5      I S h  vN   [        U[        5      (       a1  UR                  5         UR                  S:X  a  U R                  5         OM  M  U R                  R                  [        SS95      I S h  vN   g  N N N} N7f)Nr   rp   rs   rE   )rZ   r4   r<   r0   sleeppopleftgetr2   rH   
isinstancer   	task_donerF   r   )r?   r   r   s      r!   r   #StreamedAudioResult._dispatch_audio   s     4&&'1,**mmA&&&--557K)oo//=kkooe,,,e%>??))+{{l2))+  " kkoo7oNOOO ' 0 - 	PsI   AD&D	4D&=D >&D&$D"%A3D&D$D& D&"D&$D&c                   #    U R                   nU R                  b  UR                  U R                  5        [        R                  " U6 I S h  vN   g  N7frM   )r3   r5   ry   r0   r   )r?   taskss     r!   r   (StreamedAudioResult._wait_for_completion	  s>     )-  ,LL../nne$$$s   AAAAc                   U R                  5         U R                   H*  nUR                  5       (       a  M  UR                  5         M,     U R                  (       a9  U R                  R                  5       (       d  U R                  R                  5         U R
                  (       a;  U R
                  R                  5       (       d  U R
                  R                  5         g g g rM   )r   r3   donecancelr5   r,   rN   s     r!   _cleanup_tasks"StreamedAudioResult._cleanup_tasks  s    KKD99;;     )>)>)C)C)E)E!!((*$$T-F-F-K-K-M-M%%,,. .N$r   c                    U R                    HF  nUR                  5       (       d  M  UR                  5       (       d  M1  UR                  5       U l          g    g rM   )r3   r   	exceptionr=   rN   s     r!   _check_errors!StreamedAudioResult._check_errors  s:    KKDyy{{>>##-1^^-=D*	  r   c                 #    Sn  U R                   R                  5       I Sh  vN n[	        U[
        5      (       a5  UR                  U l        [        R                  " SUR                   35        O.Uc  O*U7v   UR                  S:X  a  UR                  S:X  a  SnOM  U(       aT  U R                  bG  U R                  R                  5       (       d(  [        R                  " U R                  5      I Sh  vN   U R                  5         U R                  5         U R                  (       a  U R                  eg GN! [        R                   a     M  f = f N`7f)z6Stream the events and audio data as they're generated.FTNzError processing output: voice_stream_event_lifecyclers   )r2   r   r0   CancelledErrorr   r   rS   r=   r	   typerF   r,   r   shieldr   r   )r?   saw_session_endrF   s      r!   streamStreamedAudioResult.stream#  s     "kkoo// %!677).&8FG}Kzz;;@^"& & ))5--2244..!:!:;;;!!((( "5 0)) ( <sE   ED= D:D= CE7E8AE:D= =EEEE)r8   r<   r5   r6   r:   r;   r4   r2   r9   r=   r3   r.   r>   r/   r-   r+   r,   r*   r(   r)   N)r(   r   r)   r   r@   r   )rO   zasyncio.Task[Any])rS   r}   )r`   list[bytes]ra   znpt.DTypeLikereturnz"npt.NDArray[np.int16 | np.float32])F)rq   r   r   z&asyncio.Queue[VoiceStreamEvent | None]r   bool)rq   r   )r   zAsyncIterator[VoiceStreamEvent])__name__
__module____qualname____firstlineno____doc__rA   rJ   rP   rT   rd   r   r   r   r   r   r   r   r   r   r   __static_attributes__ r   r!   r$   r$      s    ^&D&D '&D  3	&DP	O)<4!41>4	+4* "	WW <W 	WrT$+
.*P*%/ )r   r$   )r   r   r   r   )#
__future__r   r0   r   collectionsr   collections.abcr   typingr   
exceptionsr   r	   tracingr
   r   r   r   tracing.utilr   eventsr   r   r   r   importsr   r   rj   r   r   pipeline_configr   r"   r$   r   r   r!   <module>r      sL    "    )  "  O O #   - 0?
f) f)r   