o
    ir$                     @   s   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 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 deZ!G dd deZ"dS )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)
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                   @   sF   e Zd ZU dZedd dZeeB ed< edd dZ	e
eB ed< dS )	OpenAITTSSettingszSettings for OpenAITTSService.

    Parameters:
        instructions: Instructions to guide voice synthesis behavior.
        speed: Voice speed control (0.25 to 4.0, default 1.0).
    c                   C      t S Nr    r'   r'   O/home/ubuntu/.local/lib/python3.10/site-packages/pipecat/services/openai/tts.py<lambda>H       zOpenAITTSSettings.<lambda>)default_factoryinstructionsc                   C   r$   r%   r&   r'   r'   r'   r(   r)   I   r*   speedN)__name__
__module____qualname____doc__r   r,   strr   __annotations__r-   floatr'   r'   r'   r(   r#   ?   s   
 r#   c                       s   e Zd ZU dZeZeed< dZG d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dZdefddZdef fddZedededeedf fddZ  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                   @   s2   e Zd ZU dZdZee ed< dZee	 ed< dS )zOpenAITTSService.InputParamsa?  Input parameters for OpenAI TTS configuration.

        .. deprecated:: 0.0.105
            Use ``settings=OpenAITTSService.Settings(...)`` instead.

        Parameters:
            instructions: Instructions to guide voice synthesis behavior.
            speed: Voice speed control (0.25 to 4.0, default 1.0).
        Nr,   r-   )
r.   r/   r0   r1   r,   r   r2   r3   r-   r4   r'   r'   r'   r(   InputParamsY   s   
 
r7   N)	api_keybase_urlvoicemodelsample_rater,   r-   paramssettingsr8   r9   r:   r;   r<   r,   r-   r=   r>   c       	            s  |r|| j krtd| j  d| d | jdddddd}|dur+| dd ||_|dur8| d	d	 ||_|durE| d
d
 ||_|durR| dd ||_|duro| d |	so|jdurf|j|_|jduro|j|_|	durx|	|	 t
 jd|dd|d|
 t||d| _dS )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=OpenAITTSService.Settings(voice=...)`` instead.

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

                .. deprecated:: 0.0.105
                    Use ``settings=OpenAITTSService.Settings(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=OpenAITTSService.Settings(instructions=...)`` instead.

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

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

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

                .. deprecated:: 0.0.105
                    Use ``settings=OpenAITTSService.Settings(...)`` 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)r;   r:   languager,   r-   r:   r;   r,   r-   r=   T)r<   push_start_framepush_stop_framesr>   )r8   r9   r'   )OPENAI_SAMPLE_RATEr   warningSettings"_warn_init_param_moved_to_settingsr:   r;   r,   r-   apply_updatesuper__init__r	   _client)selfr8   r9   r:   r;   r<   r,   r-   r=   r>   kwargsdefault_settings	__class__r'   r(   rJ   g   sV   1
	



zOpenAITTSService.__init__returnc                 C   s   dS )zCheck if this service can generate processing metrics.

        Returns:
            True, as OpenAI TTS service supports metrics generation.
        Tr'   )rL   r'   r'   r(   can_generate_metrics   s   z%OpenAITTSService.can_generate_metricsframec                    sD   t  |I dH  | j| jkr td| j d| j d dS dS )z~Start the OpenAI TTS service.

        Args:
            frame: The start frame containing initialization parameters.
        NzOpenAI TTS requires r?   r@   )rI   startr<   rD   r   rE   )rL   rS   rO   r'   r(   rT      s   
zOpenAITTSService.starttext
context_idc           
   
   C  s  t |  d| d z|| 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 I dH t}|jdkru| I dH }t |  d	|j d
| d td|j d
| ddV  	 W d  I dH  W dS | |I dH  | j}||2 z3 dH W }t|dkr|  I dH  t|| jd|d}|V  q6 W d  I dH  W dS 1 I dH sw   Y  W dS  ty }	 ztd|	 dV  W Y d}	~	dS d}	~	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)inputr;   r:   response_formatr,   r-   N   z error getting audio (status: z	, error: )zError getting audio (status: )errorr      )rV   zUnknown error occurred: r'   )r   debugr6   r;   r"   r:   r,   r-   rK   audiospeechwith_streaming_responsecreatestatus_coderU   r]   r   start_tts_usage_metrics
chunk_size
iter_byteslenstop_ttfb_metricsr   r<   r
   )
rL   rU   rV   create_paramsrr]   
CHUNK_SIZEchunkrS   er'   r'   r(   run_tts   sP   

2 zOpenAITTSService.run_tts)r.   r/   r0   r1   r#   rF   r3   rD   r   r7   r   r2   intr4   rJ   boolrR   r   rT   r   r   r   ro   __classcell__r'   r'   rO   r(   r5   L   sL   
 	
e(r5   N)#r1   dataclassesr   r   typingr   r   r   r   logurur   openair	   r
   pydanticr   pipecat.frames.framesr   r   r   r   pipecat.services.settingsr   r   r   pipecat.services.tts_servicer   (pipecat.utils.tracing.service_decoratorsr   
ValidVoicer"   r2   r3   r#   r5   r'   r'   r'   r(   <module>   s<   