
    qi:3                     D   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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Z'de(de)e(e(f   fdZ*e G d de             Z+ G d de      Z,y)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_warn_deprecated_param)
TTSService)Languageresolve_language)
traced_tts"V  i  )
mars-flashzmars-promars-instructMODEL_SAMPLE_RATESlanguagereturnc                 T   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         j0                  dt         j2                  dt         j4                  dt         j6                  dt         j8                  dt         j:                  dt         j<                  dt         j>                  dt         j@                  dt         jB                  dt         jD                  di t         jF                  dt         jH                  dt         jJ                  dt         jL                  d t         jN                  d!t         jP                  d"t         jR                  d#t         jT                  d$t         jV                  d%t         jX                  d&t         jZ                  d't         j\                  d(t         j^                  d)t         j`                  d*t         jb                  d+t         jd                  d,t         jf                  d-t         jh                  d.t         jj                  d/t         jl                  d0t         jn                  d1t         jp                  d2t         jr                  d3t         jt                  d4t         jv                  d5t         jx                  d6t         jz                  d7t         j|                  d8i}t        | |d9:      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_MAPs     K/opt/pipecat/venv/lib/python3.12/site-packages/pipecat/services/camb/tts.pylanguage_to_camb_languagerc   .   s   ?W?? 	? 		?
 	W? 	? 	? 	W? 	? 	? 	W? 	? 	W? 	W? 	?  	!?" 	W#?$ 	W%?& 	W'?( 	W)?* 	W+?, 	W-?. 	/?0 	1?2 	W3?4 	W5?6 	W7?8 	W9?: 	W;?< 	W=?> 	W??@ 	WA?B 	WC?D 	WE?F 	WG?H 	WI?J 	WK?L 	WM?N 	WO?P 	WQ?R 	WS?T 	WU?V 	WW?X 	WY?Z 	W[?\ 	W]?^ 	W_?` 	Wa?b 	Wc?d 	We?f 	Wg?h 	WWWWWWWWWWW}?LB Hl$GG    bufferc                 8    t        |       dz  dz  }| 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)re   aligned_sizes     rb   _get_aligned_audiorj   {   s0     K1$)L-< &"777rd   c                   <    e Zd ZU dZ ed       Zedz  ez  ed<   y)CambTTSSettingszSettings for CambTTSService.

    Parameters:
        user_instructions: Custom instructions for mars-instruct model only.
            Ignored for other models. Max 1000 characters.
    c                      t         S )N)r    rd   rb   <lambda>zCambTTSSettings.<lambda>   s    i rd   )default_factoryNuser_instructions)	__name__
__module____qualname____doc__r   rq   strr   __annotations__rn   rd   rb   rl   rl      s#     16FW0XsTzI-Xrd   rl   c                        e Zd ZU dZeZeed<    G 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ZdefdZdede
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 )CambTTSServiceaT  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", model="mars-flash")

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

        .. deprecated:: 0.0.105
            Use ``settings=CambTTSSettings(...)`` 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descriptionrq   )rr   rs   rt   ru   r   r#   r   r   rw   r   rq   rv   rn   rd   rb   InputParamsr|      s>    		 (0{{(8$2+0Q,
8C= 	
rd   r   Ng      N@)voice_idmodeltimeoutsample_rateparamssettingsapi_keyr   r   r   r   r   r   c          	      v   t        dddd      }	|t        dt         d       ||	_        |t        dt         d       ||	_        |_t        d	t                |sM|j                  $| j                  |j                        xs d|	_        |j                  |j                  |	_        ||	j                  |       |	j                  }
|rJ|t        j                  |
      k7  r2t        j                  d
|
 dt        j                  |
       d| d       t        | 4  d|dd|	d| || _        || _        d| _        y)a?  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=CambTTSSettings(voice=...)`` instead.

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

                .. deprecated:: 0.0.105
                    Use ``settings=CambTTSSettings(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=CambTTSSettings(...)`` 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   voicer   rq   r   r   r   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   rn   )rl   r   r   r   r   language_to_service_languagerq   apply_updater   getr   warningsuper__init___api_key_timeout_client)selfr   r   r   r   r   r   r   kwargsdefault_settings_model	__class__s              rb   r   zCambTTSService.__init__   sf   N +"	
 "7OWE%*"":H%-" "8_=??.99&//JUg %- ++79?9Q9Q$6 ))(3 "'';*<*@*@*HHNNVH$9:L:P:PQW:X9Y Z00;}<PR
 	 	
#!!%		

 	
  rd   r   c                      y)zCheck if this service can generate processing metrics.

        Returns:
            True, as Camb.ai service supports metrics generation.
        Trn   )r   s    rb   can_generate_metricsz#CambTTSService.can_generate_metrics  s     rd   r   c                     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.
        )rc   )r   r   s     rb   r   z+CambTTSService.language_to_service_language$  s     )22rd   framec                   K   t         |   |       d{    t        | j                  | j                        | _        | j                  s0t        j                  | j                  j                  d      | _        yy7 gw)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   rz   r   _sample_rate)r   r   r   s     rb   r   zCambTTSService.start/  se      gmE""""4==$--P %% 2 6 6t~~7K7KU SD & 	#s   B A>A(B text
context_idc                  K   t        j                  |  d| d       t        |      dkD  rt        j                  d       |dd }	 || j                  j
                  | j                  j                  | j                  j                  t        d      d}| j                  j                  d	k(  r/| j                  j                  r| j                  j                  |d
<   | j                  |       d{    | j                  J d       d} | j                  j                  j                  di |2 3 d{   }|s| j                          d{    ||z  }t        |      \  }}|s:t!        || j"                  d|       W7 7 T7 ;6 t        |      dk\  r.t        |      \  }}|rt!        || j"                  d|       yyy# t$        $ r}t'        d|        Y d}~yd}~ww xY 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   rq   z#Camb.ai TTS service not initializedrd      )audior   num_channelsr   rg   zCamb.ai TTS error: )errorrn   )r   debugrh   r   rz   r   r   r   r	   rq   start_tts_usage_metricsr   text_to_speechttsstop_ttfb_metricsrj   r   r   	Exceptionr   )	r   r   r   
tts_kwargsaudio_bufferchunkaligned_audio_es	            rb   run_ttszCambTTSService.run_tts=  s     	v/vQ78 t9tNNWX;D1	>  NN00 NN33 $ 4 4(DK(X*J ~~##64>>;[;[26..2R2R
./..t444<<+R-RR+ L  ?t||::>>LL  e00222 E)L 3E\2R/M<$."/(,(8(8)*'1	 ! 52  M  < A%#5l#C q *+$($4$4%&#-	  ! &  	>%8#<===	>s   AG4B*G 1F2?G 1F5F
6F9G =G FG +G 
FG ;G 	G4	G1G,'G4,G11G4)rr   rs   rt   ru   rl   Settingsrw   r   r   rv   r   intfloatr   boolr   r   r   r   r   r   r   r   r   __classcell__)r   s   @rb   ry   ry      s   , H
i 
0 #'#%)(,.2X X 3-	X
 }X X c]X %X ?+Xtd 	3X 	3(3- 	3T T B># B>3 B>>%QU+;V B> B>rd   ry   N)-ru   dataclassesr   r   typingr   r   r   r   cambr	   camb.clientr
   logurur   pydanticr   r   pipecat.frames.framesr   r   r   r   pipecat.services.settingsr   r   r   r   pipecat.services.tts_servicer   pipecat.transcriptions.languager   r   (pipecat.utils.tracing.service_decoratorsr   r   rv   r   rw   rc   bytestuplerj   rl   ry   rn   rd   rb   <module>r      s   
 ) 6 6 - #  %  ` _ 3 F ? & DcN JH JHXc] JHZ
8u 
8ue|)< 
8 Yk Y Yl>Z l>rd   