o
    i84                     @   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 ddlmZ ddlmZ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mZ ddl m!Z! ddddZ"ee#e$f e%d< dedee# fddZ&de'de(e'e'f fddZ)eG dd deZ*G dd deZ+dS )a  Camb.ai MARS text-to-speech service implementation.

This module provides TTS functionality using Camb.ai's MARS model family,
offering high-quality text-to-speech synthesis with streaming support.

Features:
    - MARS models: mars-flash (fast), mars-pro (high quality)
    - 140+ languages supported
    - Real-time streaming via official SDK
    - Model-specific sample rates: mars-pro (48kHz), mars-flash (22.05kHz)
    )	dataclassfield)AnyAsyncGeneratorDictOptional)StreamTtsOutputConfiguration)AsyncCambAI)logger)	BaseModelField)
ErrorFrameFrame
StartFrameTTSAudioRawFrame)	NOT_GIVENTTSSettings	_NotGiven)
TTSService)Languageresolve_language)
traced_tts"V  i  )
mars-flashzmars-promars-instructMODEL_SAMPLE_RATESlanguagereturnc                 C   s  i t jdt jdt jdt jdt jdt jdt jdt jdt j	dt j
dt jdt jdt jd	t jd
t jdt jd
t jdi t jdt jdt jdt jdt jdt jdt jdt jdt jdt jdt jdt jdt jdt jdt j dt j!dt j"di t j#dt j$dt j%dt j&d t j'd!t j(d"t j)d#t j*d$t j+d%t j,d&t j-d't j.d(t j/d)t j0d*t j1d+t j2d,t j3d-t j4d.t j5d/t j6d0t j7d1t j8d2t j9d3t j:d4t j;d5t j<d6t j=d7t j>d8i}t?| |d9d:S );zConvert a Pipecat Language enum to Camb.ai language code.

    Args:
        language: The Language enum value to convert.

    Returns:
        The corresponding Camb.ai language code (BCP-47 format), or None if not supported.
    en-uszen-gbzen-auzes-eszes-mxzfr-frzfr-cazde-dezit-itzpt-ptzpt-brznl-nlzpl-plzru-ruzja-jpzko-krzzh-cnzzh-twzar-sazhi-inztr-trzvi-vnzth-thzid-idzms-myzsv-sezda-dkzno-nozfi-fizcs-czzel-grzhe-ilzhu-huzro-rozsk-skzuk-uazbg-bgzhr-hrzsr-rszsl-sizca-eszeu-eszgl-eszaf-zazsw-kezta-inzte-inzbn-inzmr-inzgu-inzkn-inzml-inzpa-inzur-pkzfa-irztl-phT)use_base_code)@r   ENEN_USEN_GBEN_AUESES_ESES_MXFRFR_FRFR_CADEDE_DEITPTPT_BRPT_PTNLPLRUJAKOZHZH_CNZH_TWARHITRVITHIDMSSVDANOFICSELHEHUROSKUKBGHRSRSLCAEUGLAFSWTATEBNMRGUKNMLPAURFATLr   )r   LANGUAGE_MAP r_   M/home/ubuntu/.local/lib/python3.10/site-packages/pipecat/services/camb/tts.pylanguage_to_camb_language.   s   		
 !"#$%&'()*+,-./01234Ara   bufferc                 C   s(   t | d d }| d| | |d fS )zSplit buffer into aligned audio (2-byte samples) and remainder.

    Args:
        buffer: Raw audio bytes to align.

    Returns:
        Tuple of (aligned audio bytes, remaining bytes).
       N)len)rb   aligned_sizer_   r_   r`   _get_aligned_audio{   s   	rf   c                   @   sJ   e Zd ZU dZedd dZeeB ed< edd dZ	e
dB eB ed< dS )	CambTTSSettingsa5  Settings for CambTTSService.

    Parameters:
        voice: Camb.ai voice ID. Overrides ``TTSSettings.voice`` (str) because
            Camb.ai uses integer voice IDs.
        user_instructions: Custom instructions for mars-instruct model only.
            Ignored for other models. Max 1000 characters.
    c                   C      t S Nr   r_   r_   r_   r`   <lambda>       zCambTTSSettings.<lambda>)default_factoryvoicec                   C   rh   ri   rj   r_   r_   r_   r`   rk      rl   Nuser_instructions)__name__
__module____qualname____doc__r   rn   intr   __annotations__ro   strr_   r_   r_   r`   rg      s   
 	"rg   c                       s   e Zd ZU dZeZeed< G dd deZdddddddde	d	e
e d
e
e	 dede
e de
e de
e f fddZdefddZdede
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 )CambTTSServicea  Camb.ai MARS text-to-speech service using the official SDK.

    Converts text to speech using Camb.ai's MARS TTS models with support for
    multiple languages.

    Models:
        - mars-flash: Fast inference, 22.05kHz output (default)
        - mars-pro: High quality, 48kHz output

    Example::

        # Basic usage with mars-flash (fast)
        tts = CambTTSService(
            api_key="your-api-key",
            settings=CambTTSService.Settings(
                model="mars-flash"
            )
        )

        # High quality with mars-pro
        tts = CambTTSService(
            api_key="your-api-key",
            settings=CambTTSService.Settings(
                voice=12345,
                model="mars-pro",
            )
        )
    	_settingsc                   @   s>   e Zd ZU dZejZee ed< e	ddddZ
ee ed< dS )zCambTTSService.InputParamsa  Input parameters for Camb.ai TTS configuration.

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

        Parameters:
            language: Language for synthesis (BCP-47 format). Defaults to English.
            user_instructions: Custom instructions for mars-instruct model only.
                Ignored for other models. Max 1000 characters.
        r   Ni  ztCustom instructions for mars-instruct model only. Use to control tone, style, or pronunciation. Max 1000 characters.)default
max_lengthdescriptionro   )rp   rq   rr   rs   r   r    r   r   ru   r   ro   rv   r_   r_   r_   r`   InputParams   s   
 r|   Ng      N@)voice_idmodeltimeoutsample_rateparamssettingsapi_keyr}   r~   r   r   r   r   c             	      s   | j ddddd}	|dur| dd ||	_|dur#| dd ||	_|dur@| d	 |s@|jdur7|j|	_|jdur@|j|	_|durI|	| |	j}
|rg|t|
krgt	
d
|
 dt|
 d| d t jd|dd|	d| || _|| _d| _dS )aW  Initialize the Camb.ai TTS service.

        Args:
            api_key: Camb.ai API key for authentication.
            voice_id: Voice ID to use.

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

            model: TTS model to use. Options: "mars-flash" (fast), "mars-pro" (high quality).

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

            timeout: Request timeout in seconds. Defaults to 60.0 (minimum recommended
                by Camb.ai).
            sample_rate: Audio sample rate in Hz. If None, uses model-specific default.
            params: Additional voice parameters. If None, uses defaults.

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

            settings: Runtime-updatable settings. When provided alongside deprecated
                parameters, ``settings`` values take precedence.
            **kwargs: Additional arguments passed to parent TTSService.
        r   ix? r   N)r~   rn   r   ro   r~   r}   rn   r   z
Camb.ai's z model only supports z Hz sample rate. Current rate of zHz may cause issues.T)r   push_start_framepush_stop_framesr   r_   )Settings"_warn_init_param_moved_to_settingsr~   rn   r   ro   apply_updater   getr
   warningsuper__init___api_key_timeout_client)selfr   r}   r~   r   r   r   r   kwargsdefault_settings_model	__class__r_   r`   r      sN   '




zCambTTSService.__init__r   c                 C   s   dS )zCheck if this service can generate processing metrics.

        Returns:
            True, as Camb.ai service supports metrics generation.
        Tr_   )r   r_   r_   r`   can_generate_metrics$  s   z#CambTTSService.can_generate_metricsr   c                 C   s   t |S )zConvert a Language enum to Camb.ai language format.

        Args:
            language: The language to convert.

        Returns:
            The Camb.ai-specific language code, or None if not supported.
        )ra   )r   r   r_   r_   r`   language_to_service_language,  s   	z+CambTTSService.language_to_service_languageframec                    sF   t  |I dH  t| j| jd| _| js!t| j	j
d| _dS dS )zStart the Camb.ai TTS service.

        Args:
            frame: The start frame containing initialization parameters.
        N)r   r   r   )r   startr	   r   r   r   _init_sample_rater   r   rx   r~   _sample_rate)r   r   r   r_   r`   r   7  s   zCambTTSService.starttext
context_idc           	   
   C  s  t |  d| d t|dkrt d |dd }z|| jj| jj| jjtddd}| jjd	kr?| jj	r?| jj	|d
< | 
|I dH  | jdusPJ dd}| jjjdi |2 z%3 dH W }|r|  I dH  ||7 }t|\}}|rt|| jd|dV  q\6 t|dkrt|\}}|rt|| jd|dV  W dS W dS W dS  ty } ztd| dV  W Y d}~dS d}~ww )a,  Generate speech from text using Camb.ai's TTS API.

        Args:
            text: The text to synthesize into speech (max 3000 characters).
            context_id: The context ID for tracking audio frames.

        Yields:
            Frame: Audio frames containing the synthesized speech.
        z: Generating TTS []i  z:Text too long for Camb.ai TTS (max 3000 chars), truncatingN	pcm_s16le)format)r   r}   r   speech_modeloutput_configurationr   ro   z#Camb.ai TTS service not initialized       )audior   num_channelsr   rc   zCamb.ai TTS error: )errorr_   )r
   debugrd   r   rx   rn   r   r~   r   ro   start_tts_usage_metricsr   text_to_speechttsstop_ttfb_metricsrf   r   r   	Exceptionr   )	r   r   r   
tts_kwargsaudio_bufferchunkaligned_audio_er_   r_   r`   run_ttsE  s\   
	  zCambTTSService.run_tts)rp   rq   rr   rs   rg   r   ru   r   r|   rv   r   rt   floatr   boolr   r   r   r   r   r   r   r   r   __classcell__r_   r_   r   r`   rw      s>   
 	X(rw   N),rs   dataclassesr   r   typingr   r   r   r   cambr   camb.clientr	   logurur
   pydanticr   r   pipecat.frames.framesr   r   r   r   pipecat.services.settingsr   r   r   pipecat.services.tts_servicer   pipecat.transcriptions.languager   r   (pipecat.utils.tracing.service_decoratorsr   r   rv   rt   ru   ra   bytestuplerf   rg   rw   r_   r_   r_   r`   <module>   s*   M