
    qi[5                        d Z ddlZddlmZmZ ddl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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Zddl m!Z!m"Z" dedee'   fdZ(e G d de             Z) G d de      Z* G d de*      Z+y# e#$ r7Z$ e
jJ                  de$         e
jJ                  d        e&de$       dZ$[$ww xY w)zAWS Polly text-to-speech service implementation.

This module provides integration with Amazon Polly for text-to-speech synthesis,
supporting multiple languages, voices, and SSML features.
    N)	dataclassfield)AsyncGeneratorListOptional)logger)	BaseModel)create_stream_resampler)
ErrorFrameFrameTTSAudioRawFrame)	NOT_GIVENTTSSettings	_NotGiven_warn_deprecated_param)
TTSService)Languageresolve_language)
traced_tts)BotoCoreErrorClientErrorzException: zHIn order to use AWS services, you need to `pip install pipecat-ai[aws]`.zMissing module: languagereturnc                    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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'i}t]        | |d()      S )*zConvert a Language enum to AWS Polly language code.

    Args:
        language: The Language enum value to convert.

    Returns:
        The corresponding AWS Polly language code, or None if not supported.
    arbzar-AEzca-ESzcmn-CNzyue-CNzcs-CZzda-DKznl-NLznl-BEen-USzen-AUzen-GBzen-INzen-NZzen-ZAzfi-FIzfr-FRzfr-BEzfr-CAzde-DEzde-ATzde-CHzhi-INzis-ISzit-ITzja-JPzko-KRznb-NOzpl-PLzpt-PTzpt-BRzro-ROzru-RUzes-ESzes-MXzes-USzsv-SEztr-TRzcy-GBF)use_base_code)/r   ARAR_AECAZHYUEYUE_CNCSDANLNL_BEENEN_AUEN_GBEN_INEN_NZEN_USEN_ZAFIFRFR_BEFR_CADEDE_ATDE_CHHIISITJAKONONBNB_NOPLPTPT_BRPT_PTRORUESES_MXES_USSVTRCYCY_GBr   )r   LANGUAGE_MAPs     J/opt/pipecat/venv/lib/python3.12/site-packages/pipecat/services/aws/tts.pylanguage_to_aws_languagerM   (   s   FUF 	F
 	WF 	XF 	hF 	F 	WF 	WF 	WF  	!F$ 	W%F& 	'F( 	)F* 	+F, 	-F. 	/F0 	1F4 	W5F8 	W9F: 	;F< 	=F@ 	WAFB 	CFD 	EFH 	WIFL 	WMFP 	WQFT 	WUFX 	WYF\ 	W]F^ 	W_F` 	aFd 	WeFh 	WiFj 	WWWWWWKFLP Hl%HH    c                       e Zd ZU dZ ed       Zeez  ed<    ed       Z	eez  ed<    ed       Z
eez  ed<    ed	       Zeez  ed
<    ed       Zee   ez  ed<   y)AWSPollyTTSSettingsaG  Settings for AWSPollyTTSService.

    Parameters:
        engine: TTS engine to use ('standard', 'neural', etc.).
        pitch: Voice pitch adjustment (for standard engine only).
        rate: Speech rate adjustment.
        volume: Voice volume adjustment.
        lexicon_names: List of pronunciation lexicons to apply.
    c                      t         S Nr    rN   rL   <lambda>zAWSPollyTTSSettings.<lambda>       I rN   )default_factoryenginec                      t         S rR   rS   rT   rN   rL   rU   zAWSPollyTTSSettings.<lambda>   s    9 rN   pitchc                      t         S rR   rS   rT   rN   rL   rU   zAWSPollyTTSSettings.<lambda>   s    ) rN   ratec                      t         S rR   rS   rT   rN   rL   rU   zAWSPollyTTSSettings.<lambda>   rV   rN   volumec                      t         S rR   rS   rT   rN   rL   rU   zAWSPollyTTSSettings.<lambda>   s     rN   lexicon_namesN)__name__
__module____qualname____doc__r   rX   strr   __annotations__rZ   r\   r^   r`   r   rT   rN   rL   rP   rP   |   sr     $4EFFC)OF"3DEE3?E!2CDD#	/D#4EFFC)OF+0AR+SM49y(SrN   rP   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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   f fdZdefdZdede	e
   fdZde
de
fdZede
de
deedf   fd       Z xZS )AWSPollyTTSServicezAWS Polly text-to-speech service.

    Provides text-to-speech synthesis using Amazon Polly with support for
    multiple languages, voices, SSML features, and voice customization
    options including prosody controls.
    	_settingsc                       e Zd ZU dZdZee   ed<   ej                  Z
ee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZeee      ed<   y)	AWSPollyTTSService.InputParamsa1  Input parameters for AWS Polly TTS configuration.

        .. deprecated:: 0.0.105
            Use ``AWSPollyTTSSettings`` directly via the ``settings`` parameter instead.

        Parameters:
            engine: TTS engine to use ('standard', 'neural', etc.).
            language: Language for synthesis. Defaults to English.
            pitch: Voice pitch adjustment (for standard engine only).
            rate: Speech rate adjustment.
            volume: Voice volume adjustment.
            lexicon_names: List of pronunciation lexicons to apply.
        NrX   r   rZ   r\   r^   r`   )ra   rb   rc   rd   rX   r   re   rf   r   r(   r   rZ   r\   r^   r`   r   rT   rN   rL   InputParamsrk      sg    	 !%$'/{{(8$2#x}#"hsm" $$-1xS	*1rN   rl   N)api_keyaws_access_key_idaws_session_tokenregionvoice_idsample_rateparamssettingsrm   rn   ro   rp   rq   rr   rs   rt   c          
         t        dddddddd      }
|t        dt         d       ||
_        |t        dt                |s|j                  |
_        |j                  r| j                  |j                        nd|
_        |j                  |
_        |j                  |
_        |j                  |
_        |j                  |
_	        ||
j                  |       t        | 0  d|dd|
d	|	 |xs t        j                  d
      |xs t        j                  d      |xs t        j                  d      |xs t        j                  dd      d| _        t!        j"                         | _        t'               | _        y)aN  Initializes the AWS Polly TTS service.

        Args:
            api_key: AWS secret access key. If None, uses AWS_SECRET_ACCESS_KEY environment variable.
            aws_access_key_id: AWS access key ID. If None, uses AWS_ACCESS_KEY_ID environment variable.
            aws_session_token: AWS session token for temporary credentials.
            region: AWS region for Polly service. Defaults to 'us-east-1'.
            voice_id: Voice ID to use for synthesis. Defaults to 'Joanna'.

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

            sample_rate: Audio sample rate. If None, uses service default.
            params: Additional input parameters for voice customization.

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

            settings: Runtime-updatable settings. When provided alongside deprecated
                parameters, ``settings`` values take precedence.
            **kwargs: Additional arguments passed to parent TTSService class.
        NJoannar   )modelvoicer   rX   rZ   r\   r^   r`   rq   rx   rs   T)rr   push_start_framepush_stop_framesrt   AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN
AWS_REGIONz	us-east-1)rn   aws_secret_access_keyro   region_namerT   )rP   r   rx   rX   r   language_to_service_languagerZ   r\   r^   r`   apply_updatesuper__init__osgetenv_aws_paramsaioboto3Session_aws_sessionr
   
_resampler)selfrm   rn   ro   rp   rq   rr   rs   rt   kwargsdefault_settings	__class__s              rL   r   zAWSPollyTTSService.__init__   sz   H /	
 ":/BGL%-" "8-@A*0-- '  55fooF  !)
 *0 &(. %*0-- '171E1E . ))(3 	
#!!%		

 	
 "3!Tbii@S6T%,%R		:Q0R!2!Tbii@S6T!IRYY|[%I	
 %,,.13rN   r   c                      y)zCheck if this service can generate processing metrics.

        Returns:
            True, as AWS Polly service supports metrics generation.
        TrT   )r   s    rL   can_generate_metricsz'AWSPollyTTSService.can_generate_metrics  s     rN   r   c                     t        |      S )zConvert a Language enum to AWS Polly language format.

        Args:
            language: The language to convert.

        Returns:
            The AWS Polly-specific language code, or None if not supported.
        )rM   )r   r   s     rL   r   z/AWSPollyTTSService.language_to_service_language  s     (11rN   textc                    d}| j                   j                  }|d| dz  }g }| j                   j                  dk(  r?| j                   j                  r)|j	                  d| j                   j                   d       | j                   j
                  r)|j	                  d| j                   j
                   d       | j                   j                  r)|j	                  d| j                   j                   d       |r|d	d
j                  |       dz  }||z  }|r|dz  }|dz  }|dz  }t        j                  |  d|        |S )Nz<speak>z<lang xml:lang='z'>standardzpitch=''zrate='zvolume='z	<prosody  >z
</prosody>z</lang>z</speak>z SSML: )
ri   r   rX   rZ   appendr\   r^   joinr   trace)r   r   ssmlr   prosody_attrss        rL   _construct_ssmlz"AWSPollyTTSService._construct_ssml  s4   >>**"8*B//>>  J.~~##$$wt~~/C/C.DA%FG>>  6$..*=*=)>a!@A>>    8DNN,A,A+B!!DEi 78::DL D	
vWTF+,rN   
context_idc                  K   t        j                  |  d| d       	 | j                  |      }|dd| j                  j                  | j                  j
                  d| j                  j                  d}|j                         D ci c]  \  }}|	|| }}} | j                  j                  di | j                  4 d{   } |j                  di | d{   }	d|	v r|	d   }
|
j                          d{   }nt        j                  |  d	       d}| j                  j                  |d
| j                          d{   }| j#                  |       d{    | j$                  }t'        dt)        |      |      D ]O  }||||z    }t)        |      dkD  s| j+                          d{    t-        || j                   d|      }| Q ddd      d{    yc c}}w 7 .7 7 7 7 7 G7 # 1 d{  7  sw Y   yxY w# t.        t0        f$ r'}dt3        |       }t5        |       Y d}~yd}~ww xY ww)a  Generate speech from text using AWS Polly.

        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.
        z: Generating TTS []r   pcm16000)TextTextTypeOutputFormatVoiceIdEngine
SampleRateLexiconNamesNAudioStreamz No audio stream in responsei>  r      )r   zAWS Polly TTS error: )error)pollyrT   )r   debugr   ri   rx   rX   r`   itemsr   clientr   synthesize_speechreadr   r   resamplerr   start_tts_usage_metrics
chunk_sizerangelenstop_ttfb_metricsr   r   r   re   r   )r   r   r   r   rs   kvfiltered_paramsr   responsestream
audio_data
CHUNK_SIZEichunkframer   error_messages                     rL   run_ttszAWSPollyTTSService.run_tts?  s9     	v/vQ78+	2''-D " %>>//..//% $ < <	F 17P1!-q!tPOP/t((//L4;K;KL $ $PU!8!8!8!K?!KK H,%m4F'-{{}!4JLLD6)E!FG!%J#'??#;#;JtO_O_#``
224888!__
q#j/:> $A&q1z>:E5zA~"44666 08H8H!Xb c#$!$ $ $ Q$K "5
 a8 7'$ $ $ $. {+ 	23CJ<@M=111	2s   IA*H 	
G.G.-H G4H 
H G7! HG:A	HG<H$G>%?H%H8H 9$HH (H)H -I.H 7H:H<H>H HH H
HHH IH I(I
I
II)ra   rb   rc   rd   rP   Settingsrf   r	   rl   r   re   intr   boolr   r   r   r   r   r   r   r   __classcell__r   s   @rL   rh   rh      s'    #H""2i 22 "&+/+/ $"&%)(,26Y4 #Y4 $C=	Y4
 $C=Y4 Y4 3-Y4 c]Y4 %Y4 ./Y4vd 	2X 	2(3- 	2C C B 72# 723 72>%QU+;V 72 72rN   rh   c                   &     e Zd ZdZeZ fdZ xZS )PollyTTSServicezDeprecated alias for AWSPollyTTSService.

    .. deprecated:: 0.0.67
        `PollyTTSService` is deprecated, use `AWSPollyTTSService` instead.

    c                     t        |   di | ddl}|j                         5  |j	                  d       |j                  dt               ddd       y# 1 sw Y   yxY w)zInitialize the deprecated PollyTTSService.

        Args:
            **kwargs: All arguments passed to AWSPollyTTSService.
        r   NalwayszB'PollyTTSService' is deprecated, use 'AWSPollyTTSService' instead.rT   )r   r   warningscatch_warningssimplefilterwarnDeprecationWarning)r   r   r   r   s      rL   r   zPollyTTSService.__init__  sY     	"6"$$& 	!!(+MMT"	 	 	s   (AA)ra   rb   rc   rd   rP   r   r   r   r   s   @rL   r   r   z  s     #H rN   r   ),rd   r   dataclassesr   r   typingr   r   r   logurur   pydanticr	   pipecat.audio.utilsr
   pipecat.frames.framesr   r   r   pipecat.services.settingsr   r   r   r   pipecat.services.tts_servicer   pipecat.transcriptions.languager   r   (pipecat.utils.tracing.service_decoratorsr   r   botocore.exceptionsr   r   ModuleNotFoundErrorer   	Exceptionre   rM   rP   rh   r   rT   rN   rL   <module>r      s    
 ( 1 1   7 
 ` _ 3 F ?,>QIx QIHSM QIh T+ T T$h2 h2V( q
  ,FLL;qc"#FLL[\
&qc*
++,s   B C2CC