
    qiz$                        U d Z ddlmZ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 ddlmZ ddlmZmZmZmZ ddlmZmZmZmZ dd	lmZ dd
lmZ ed   ZddddddddddddddZee ef   e!d<   e G d de             Z" G d de      Z#y)zOpenAI text-to-speech service implementation.

This module provides integration with OpenAI's text-to-speech API for
generating high-quality synthetic speech from text input.
    )	dataclassfield)AsyncGeneratorDictLiteralOptional)logger)AsyncOpenAIBadRequestError)	BaseModel)
ErrorFrameFrame
StartFrameTTSAudioRawFrame)	NOT_GIVENTTSSettings	_NotGiven_warn_deprecated_param)
TTSService)
traced_tts)alloyashballadcedarcoralechofablemarinnovaonyxsageshimmerverser   r   r   r   r   r   r   r   r   r    r!   r"   r#   VALID_VOICESc                   Z    e Zd ZU dZ ed       Zeez  ed<    ed       Z	e
ez  ed<   y)OpenAITTSSettingszSettings for OpenAITTSService.

    Parameters:
        instructions: Instructions to guide voice synthesis behavior.
        speed: Voice speed control (0.25 to 4.0, default 1.0).
    c                      t         S Nr        M/opt/pipecat/venv/lib/python3.12/site-packages/pipecat/services/openai/tts.py<lambda>zOpenAITTSSettings.<lambda>H   s    ) r+   )default_factoryinstructionsc                      t         S r(   r)   r*   r+   r,   r-   zOpenAITTSSettings.<lambda>I   s    Y r+   speedN)__name__
__module____qualname____doc__r   r/   strr   __annotations__r1   floatr*   r+   r,   r&   r&   ?   s2     %*:K$LL#	/L$5FGE59Gr+   r&   c                       e Zd ZU dZeZeed<   dZ G d de      Z	dddddddddd	de
e   d	e
e   d
e
e   de
e   de
e   de
e   de
e   de
e	   de
e   f fdZdefdZdef fdZedededeedf   fd       Z xZS )OpenAITTSServicea  OpenAI Text-to-Speech service that generates audio from text.

    This service uses the OpenAI TTS API to generate PCM-encoded audio at 24kHz.
    Supports multiple voice models and configurable parameters for high-quality
    speech synthesis with streaming audio output.
    	_settingsi]  c                   :    e Zd ZU dZdZee   ed<   dZee	   ed<   y)OpenAITTSService.InputParamsa7  Input parameters for OpenAI TTS configuration.

        .. deprecated:: 0.0.105
            Use ``settings=OpenAITTSSettings(...)`` instead.

        Parameters:
            instructions: Instructions to guide voice synthesis behavior.
            speed: Voice speed control (0.25 to 4.0, default 1.0).
        Nr/   r1   )
r2   r3   r4   r5   r/   r   r6   r7   r1   r8   r*   r+   r,   InputParamsr=   Y   s%    	 '+hsm*!%x%r+   r>   N)	api_keybase_urlvoicemodelsample_rater/   r1   paramssettingsr?   r@   rA   rB   rC   r/   r1   rD   rE   c       	         r   |r5|| j                   k7  r&t        j                  d| j                    d| d       t        ddddd      }|t	        dt        d       ||_        |t	        d	t        d	       ||_        |t	        d
t        d
       ||_        |t	        dt        d       ||_        |Lt	        dt               |	s:|j                  |j                  |_        |j                  |j                  |_        |	|j                  |	       t        | ,  d|dd|d|
 t        ||      | _        y)a  Initialize OpenAI TTS service.

        Args:
            api_key: OpenAI API key for authentication. If None, uses environment variable.
            base_url: Custom base URL for OpenAI API. If None, uses default.
            voice: Voice ID to use for synthesis. Defaults to "alloy".

                .. deprecated:: 0.0.105
                    Use ``settings=OpenAITTSSettings(voice=...)`` instead.

            model: TTS model to use. Defaults to "gpt-4o-mini-tts".

                .. deprecated:: 0.0.105
                    Use ``settings=OpenAITTSSettings(model=...)`` instead.

            sample_rate: Output audio sample rate in Hz. If None, uses OpenAI's default 24kHz.
            instructions: Optional instructions to guide voice synthesis behavior.

                .. deprecated:: 0.0.105
                    Use ``settings=OpenAITTSSettings(instructions=...)`` instead.

            speed: Voice speed control (0.25 to 4.0, default 1.0).

                .. deprecated:: 0.0.105
                    Use ``settings=OpenAITTSSettings(speed=...)`` instead.

            params: Optional synthesis controls (acting instructions, speed, ...).

                .. deprecated:: 0.0.105
                    Use ``settings=OpenAITTSSettings(...)`` instead.

            settings: Runtime-updatable settings. When provided alongside deprecated
                parameters, ``settings`` values take precedence.
            **kwargs: Additional keyword arguments passed to TTSService.
        zOpenAI TTS only supports  Hz sample rate. Current rate of Hz may cause issues.zgpt-4o-mini-ttsr   N)rB   rA   languager/   r1   rA   rB   r/   r1   rD   T)rC   push_start_framepush_stop_framesrE   )r?   r@   r*   )OPENAI_SAMPLE_RATEr	   warningr&   r   rA   rB   r/   r1   apply_updatesuper__init__r
   _client)selfr?   r@   rA   rB   rC   r/   r1   rD   rE   kwargsdefault_settings	__class__s               r,   rP   zOpenAITTSService.__init__g   sh   b ;$*A*AANN+D,C,C+D E##.-/CE -#
 "7,=wG%*""7,=wG%*"#">3DnU,8)"7,=wG%*" "8->?&&24:4G4G$1<<+-3\\$* ))(3 	
#!!%		

 	
 #7XFr+   returnc                      y)zCheck if this service can generate processing metrics.

        Returns:
            True, as OpenAI TTS service supports metrics generation.
        Tr*   )rR   s    r,   can_generate_metricsz%OpenAITTSService.can_generate_metrics   s     r+   framec                    K   t         |   |       d{    | j                  | j                  k7  r1t	        j
                  d| j                   d| j                   d       yy7 Ow)z~Start the OpenAI TTS service.

        Args:
            frame: The start frame containing initialization parameters.
        NzOpenAI TTS requires rG   rH   )rO   startrC   rL   r	   rM   )rR   rY   rU   s     r,   r[   zOpenAITTSService.start   sn      gmE"""t666NN&t'>'>&? @##'#3#3"44HJ 7 	#s   A(A&AA(text
context_idc           	       K   t        j                  |  d| d       	 || j                  j                  t        | j                  j
                     dd}| j                  j                  r| j                  j                  |d<   | j                  j                  r| j                  j                  |d<    | j                  j                  j                  j                  j                  di |4 d{   }|j                  dk7  rr|j                          d{   }t        j                  |  d	|j                   d
| d       t!        d|j                   d
| d       	 ddd      d{    y| j#                  |       d{    | j$                  }|j'                  |      2 3 d{   }t)        |      dkD  s| j+                          d{    t-        || j.                  d|      }| O7 7 7 7 w7 S7 .6 ddd      d{  7   y# 1 d{  7  sw Y   yxY w# t0        $ r}	t!        d|	        Y d}	~	yd}	~	ww xY ww)a  Generate speech from text using OpenAI's TTS API.

        Args:
            text: The text to synthesize into speech.
            context_id: The context ID for tracking audio frames.

        Yields:
            Frame: Audio frames containing the synthesized speech data.
        z: Generating TTS []pcm)inputrB   rA   response_formatr/   r1   N   z error getting audio (status: z	, error: )zError getting audio (status: )errorr      )r]   zUnknown error occurred: r*   )r	   debugr;   rB   r$   rA   r/   r1   rQ   audiospeechwith_streaming_responsecreatestatus_coder\   re   r   start_tts_usage_metrics
chunk_size
iter_byteslenstop_ttfb_metricsr   rC   r   )
rR   r\   r]   create_paramsrre   
CHUNK_SIZEchunkrY   es
             r,   run_ttszOpenAITTSService.run_tts   s-     	v/vQ78&	C --%dnn&:&:;#(	M ~~**040K0Kn-~~##)-)=)=g&Ot||))00HHOO  $ $==C'"#&&(NELL& >q}}oYW\V]]^_ % =amm_IV[U\\]^  $ $ $ 224888!__
#$<<
#; $ $%5zA~"44666 08H8H!Xb c#+$ +	$ 9$6 $<#$ $ $ $ $,  	C%=aS#ABBB	Cs  ICH1 1G<2H1 5#HG?AH&H1 1H2H1 6I7HH!H-H	1H2H	5HHH#H<H1 ?HH1 HH	H	H
H1 HH1 IH."H%#H.*H1 -I.H1 1	I:IIII)r2   r3   r4   r5   r&   Settingsr7   rL   r   r>   r   r6   intr8   rP   boolrX   r   r[   r   r   r   rw   __classcell__)rU   s   @r,   r:   r:   L   s/    !H  &i &" "&"&##%)&*!%(,04cG #cG 3-	cG
 }cG }cG c]cG smcG cG %cG ,-cGJd   1C# 1C3 1C>%QU+;V 1C 1Cr+   r:   N)$r5   dataclassesr   r   typingr   r   r   r   logurur	   openair
   r   pydanticr   pipecat.frames.framesr   r   r   r   pipecat.services.settingsr   r   r   r   pipecat.services.tts_servicer   (pipecat.utils.tracing.service_decoratorsr   
ValidVoicer$   r6   r7   r&   r:   r*   r+   r,   <module>r      s    ) : :  /   ` _ 3 ?
" 'd3
?# " 	H 	H 	HGCz GCr+   