
    /j/0                    t   S SK Jr  S SKrS SKrS SKrS SKJrJr  S SKJ	r	  S SK
r
S SKrS SKJrJrJrJrJr  S SK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rSrSr Sr!\	S   \"-  r#SS1r$\ " S S5      5       r% " S S\RL                  5      r& " S S\RN                  5      r( " S S\RN                  5      r)g)    )annotationsN)	dataclassreplace)Literal)APIConnectionErrorAPIConnectOptionsAPIStatusErrorAPITimeoutErrortts)DEFAULT_API_CONNECT_OPTIONS	NOT_GIVEN
NotGivenOr)aiois_given   )	TTSModels	TTSVoices)AsyncAzureADTokenProvideri]  zgpt-4o-mini-ttsash)mp3opusaacflacwavpcmztts-1ztts-1-hdc                  H    \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S
\S'   Srg)_TTSOptions3   TTSModels | strmodelTTSVoices | strvoicefloatspeed
str | NoneinstructionsRESPONSE_FORMATSresponse_format N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r)       K/app/agent/.venv/lib/python3.13/site-packages/livekit/plugins/openai/tts.pyr   r   3   s    L%%r0   r   c                  \  ^  \ rS rSr\\S\\\S\S.                 SU 4S jjjr\SS j5       r	\SS j5       r
\\\\S.         SS	 jjr\\\S\SSSSSSSSS\SS
.                               SS jj5       r\S.     SS jjrSS jrSS jrSrU =r$ )TTS<   g      ?N)r    r"   r$   r&   base_urlapi_keyclientr(   c               4  > [         T	U ]  [        R                  " SS9[        [
        S9  [        UUU[        U5      (       a  UOS[        U5      (       a  UOSS9U l        [        U5      (       a  U(       d  [        S5      eUSL U l
        U=(       dx    [        R                  " S[        U5      (       a  UOS[        U5      (       a  UOS[        R                  " [        R                  " S	S
S
S
S9S[        R                  " SSSS9S9S9U l        SU l        g)z
Create a new instance of OpenAI TTS.

``api_key`` must be set to your OpenAI API key, either using the argument or by setting the
``OPENAI_API_KEY`` environmental variable.
F)	streaming)capabilitiessample_ratenum_channelsNr   )r    r"   r$   r&   r(   zYOpenAI API key is required, either as argument or set OPENAI_API_KEY environment variabler         .@      @connectreadwritepoolT2   x   )max_connectionsmax_keepalive_connectionskeepalive_expiry)timeoutfollow_redirectslimits)max_retriesr6   r5   http_client)super__init__r   TTSCapabilitiesSAMPLE_RATENUM_CHANNELSr   r   _opts
ValueError_owns_clientopenaiAsyncClienthttpxTimeoutLimits_client_prewarm_task)
selfr    r"   r$   r&   r5   r6   r7   r(   	__class__s
            r1   rO   TTS.__init__=   s
   $ 	,,u=#% 	 	
 !)1,)?)?T/7/H/HOe

 GW7  #dN 
!3!3'00Gd!)(!3!3X))dCcR!%||$&"WZ	"
 37r0   c                .    U R                   R                  $ N)rS   r    r]   s    r1   r    	TTS.modelr   s    zzr0   c                `    U R                   R                  R                  R                  S5      $ )Nzutf-8)r[   	_base_urlnetlocdecoderb   s    r1   providerTTS.providerv   s#    ||%%,,33G<<r0   )r    r"   r$   r&   c                  [        U5      (       a  XR                  l        [        U5      (       a  X R                  l        [        U5      (       a  X0R                  l        [        U5      (       a  X@R                  l        g g ra   )r   rS   r    r"   r$   r&   )r]   r    r"   r$   r&   s        r1   update_optionsTTS.update_optionsz   sW     E??$JJE??$JJE??$JJL!!&2JJ# "r0   )r    r"   r$   r&   azure_endpointazure_deploymentapi_versionr6   azure_ad_tokenazure_ad_token_providerorganizationprojectr5   r(   rI   c                    [         R                  " SUUUUUU	U
UUU(       a  UO[        R                  " SSSSS9S9n[	        U UUUUUS9nSUl        U$ )a  
Create a new instance of Azure OpenAI TTS.

This automatically infers the following arguments from their corresponding environment
variables if they are not provided:
- `api_key` from `AZURE_OPENAI_API_KEY`
- `organization` from `OPENAI_ORG_ID`
- `project` from `OPENAI_PROJECT_ID`
- `azure_ad_token` from `AZURE_OPENAI_AD_TOKEN`
- `api_version` from `OPENAI_API_VERSION`
- `azure_endpoint` from `AZURE_OPENAI_ENDPOINT`
r   r=   r>   r?   )rL   rm   rn   ro   r6   rp   rq   rr   rs   r5   rI   )r    r"   r$   r&   r7   r(   T)rV   AsyncAzureOpenAIrX   rY   r3   rU   )r    r"   r$   r&   rm   rn   ro   r6   rp   rq   rr   rs   r5   r(   rI   azure_clientr   s                    r1   
with_azureTTS.with_azure   sz    @ ..)-#)$;% t#SsK
  %+
  
r0   )conn_optionsc               f    U R                   R                  [        ;   a
  [        XUS9$ [	        XUS9$ N)r   
input_textry   )rS   r    AUDIO_STREAM_MODELSAudioChunkedStreamSSEChunkedStream)r]   textry   s      r1   
synthesizeTTS.synthesize   s1    
 ::22%$l[[DUUr0   c                V   ^  SU 4S jjn[         R                  " U" 5       5      T l        g )Nc                    >#     T R                   R                  S[        S9I S h  vN   g  N! [         a     g f = f7f)N/)cast_to)r[   getstr	Exceptionrb   s   r1   _prewarmTTS.prewarm.<locals>._prewarm   s9     ll&&sC&888 s(   >!. ,. >. 
;>;>returnNone)asynciocreate_taskr\   )r]   r   s   ` r1   prewarmTTS.prewarm   s    	 %00<r0   c                   #    U R                   (       a(  [        R                  " U R                   5      I S h  vN   U R                  (       a#  U R                  R                  5       I S h  vN   g g  N9 N7fra   )r\   r   cancel_and_waitrU   r[   closerb   s    r1   aclose
TTS.aclose   sV     %%d&8&8999,,$$&&&  : 's!   5A5A12A5*A3+A53A5)r[   rS   rU   r\   )r    r   r"   r!   r$   r#   r&   NotGivenOr[str]r5   r   r6   r   r7   zopenai.AsyncClient | Noner(   NotGivenOr[RESPONSE_FORMATS]r   r   )r   r   )
r    zNotGivenOr[TTSModels | str]r"   zNotGivenOr[TTSVoices | str]r$   zNotGivenOr[float]r&   r   r   r   ) r    r   r"   r!   r$   r#   r&   r   rm   r%   rn   r%   ro   r%   r6   r%   rp   r%   rq   z AsyncAzureADTokenProvider | Nonerr   r%   rs   r%   r5   r%   r(   r   rI   zhttpx.Timeout | Noner   r3   )r   r   ry   r   r   ztts.ChunkedStreamr   )r*   r+   r,   r-   DEFAULT_MODELDEFAULT_VOICEr   rO   propertyr    rh   rk   staticmethodrw   r   r   r   r   r/   __classcell__r^   s   @r1   r3   r3   <   s    "/!.(1$-#,,08A37 37 	37
 37 &37 "37 !37 *37 637 
37 37j     = = .7-6#,(13 +3 +	3
 !3 &3 
3"  "/!.(1%)'+"&"%)DH#'"#8A(,!88 8 	8
 &8 #8 %8  8 8 #8 "B8 !8 8 8 68  &!8" 
#8 8v ?ZVV*;V	V=' 'r0   r3   c                  :   ^  \ rS rSrSrSU 4S jjrSS jrSrU =r$ )r~      zFChunkedStream for tts-1 and tts-1-hd models using audio stream format.c               b   > [         TU ]  XUS9  Xl        [        UR                  5      U l        g r{   rN   rO   _ttsr   rS   r]   r   r|   ry   r^   s       r1   rO   AudioChunkedStream.__init__   *    SlS	SYY'
r0   c                |  #    U R                   R                  R                  R                  R                  R                  U R                  U R                  R                  U R                  R                  U R                  R                  U R                  R                  U R                  R                  =(       d    [        R                  S[        R                   " SU R"                  R$                  S9S9n U IS h  vN nUR'                  UR(                  =(       d    S[*        [,        SU R                  R                   3S9  UR/                  5         S h  vN nUR1                  U5        M   Nt N
 S S S 5      IS h  vN    O! , IS h  vN  (       d  f       O= fUR3                  5         g ! [        R4                   a    [5        5       S e[        R6                   a:  n[7        UR8                  UR:                  UR(                  UR<                  S9S eS nAf[>         a  n[A        5       UeS nAff = f7f)	Naudio   r@   inputr    r"   r(   r$   r&   stream_formatrI    audio/
request_idr;   r<   	mime_typestatus_coder   body)!r   r[   r   speechwith_streaming_responsecreater|   rS   r    r"   r(   r$   r&   rV   omitrX   rY   _conn_optionsrI   
initializer   rQ   rR   
iter_bytespushflushr
   r	   messager   r   r   r   )r]   output_emitter
oai_streamstreamdataes         r1   _runAudioChunkedStream._run   s    YY&&,,33KKRR//**""**"" JJ66**""00?FKK!MM"d.@.@.H.HI S 	

	.!zV))%006B +!- &tzz'A'A&BC	 *  #)"3"3"5 .$"''- "."5 "zzzzz   "%% 	.!#-$$ 	 		q}}TUTZTZ  	.$&A-	.s   C5H<8F5 >E3?F5 AF
E7E5E7F
3F5 5E77F
8F5 FF5 
F!FF!F5 4H<52H9'5HH9)H44H99H<rS   r   r   r3   r|   r   ry   r   r   r   r   ztts.AudioEmitterr   r   	r*   r+   r,   r-   __doc__rO   r   r/   r   r   s   @r1   r~   r~      s    P(
!. !.r0   r~   c                  :   ^  \ rS rSrSrSU 4S jjrSS jrSrU =r$ )r   i  zKChunkedStream for gpt-4o-mini-tts and newer models using SSE stream format.c               b   > [         TU ]  XUS9  Xl        [        UR                  5      U l        g r{   r   r   s       r1   rO   SSEChunkedStream.__init__  r   r0   c                  #    U R                   R                  R                  R                  R                  R                  U R                  U R                  R                  U R                  R                  U R                  R                  U R                  R                  U R                  R                  =(       d    [        R                  S[        R                   " SU R"                  R$                  S9S9n U IS h  vN nUR'                  UR(                  =(       d    S[*        [,        SU R                  R                   3S9  UR/                  5         S h  vN nU(       a  UR1                  S5      (       d  M(  US	S  nUS
:X  a    O [2        R4                  " U5      nUR9                  SS5      nUS:X  a]  UR9                  SS5      =(       d    UR9                  SS5      nU(       a)  [:        R<                  " U5      n	UR?                  U	5        M  M  US:X  d  M  UR9                  S0 5      n
U
R9                  SS5      nU
R9                  SS5      nU(       d
  U(       d  GM  U RA                  UUS9  GM#  S S S 5      IS h  vN   URC                  5         g  GN GNC! [2        R6                   a     GMb  f = f
 NE N9! , IS h  vN  (       d  f       NN= f! [        RD                   a    [E        5       S e[        RF                   a:  n[G        URH                  URJ                  UR(                  URL                  S9S eS nAf[N         a  n[Q        5       UeS nAff = f7f)Nsser   r   r   r   r   r   zdata:    z[DONE]typezspeech.audio.deltadeltar   zspeech.audio.doneusageinput_tokensr   output_tokens)r   r   r   ))r   r[   r   r   r   r   r|   rS   r    r"   r(   r$   r&   rV   r   rX   rY   r   rI   r   r   rQ   rR   
iter_lines
startswithjsonloadsJSONDecodeErrorr   base64	b64decoder   _set_token_usager   r
   r	   r   r   r   r   r   )r]   r   r   r   liner   event
event_type	audio_b64
audio_datar   r   r   r   s                 r1   r   SSEChunkedStream._run  s    YY&&,,33KKRR//**""**"" JJ66**""00?FKKMM"d.@.@.H.HI S 	

4	.!zV))%006B +!- &tzz'A'A&BC	 *  #)"3"3"5 $tx'@'@ 8Dx'! $

4 0 "'62!6J!%99$)IIgr$:$TeiiQS>T	$)/)9)9))DJ*//
; % $':: %		'2 6',yy'C(-		/1(E'== 11-9.; 2 K "zT   "U "  // ! ! #6 "zzzX %% 	.!#-$$ 	 		q}}TUTZTZ  	.$&A-	.s   C5M"8K >J?K AKJ=JJ=-KJ!#A9K AK'K:K J?K M"K J=!J:5K9J::K?K KK
KK 2M5MMMMM"r   r   r   r   r   s   @r1   r   r     s    U(
@. @.r0   r   )*
__future__r   r   r   r   dataclassesr   r   typingr   rX   rV   livekit.agentsr   r   r	   r
   r   livekit.agents.typesr   r   r   livekit.agents.utilsr   r   modelsr   r   utilsr   rQ   rR   r   r   r   r'   r}   r   r3   ChunkedStreamr~   r   r)   r0   r1   <module>r      s    #    *     T S . ( ,!EFL  
+  & & &a'#'' a'H).** ).XH.s(( H.r0   