o
    i4                  
   @   sP  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 dd
lmZ ddlmZmZ ddlmZ zddlZddlm Z m!Z! W n  e"y Z# ze
$de#  e
$d e%de# dZ#[#ww dedee& fddZ'eG dd deZ(G dd deZ)G dd de)Z*dS )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)
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                 C   sl  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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.| |d(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_MAP rI   L/home/ubuntu/.local/lib/python3.10/site-packages/pipecat/services/aws/tts.pylanguage_to_aws_language(   s   		 !"$&(*,./0245HrK   c                   @   s   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< edd dZ
eeB ed	< ed
d dZeeB ed< edd dZee eB ed< dS )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                   C      t S Nr   rI   rI   rI   rJ   <lambda>       zAWSPollyTTSSettings.<lambda>)default_factoryenginec                   C   rM   rN   rO   rI   rI   rI   rJ   rP      rQ   pitchc                   C   rM   rN   rO   rI   rI   rI   rJ   rP      rQ   ratec                   C   rM   rN   rO   rI   rI   rI   rJ   rP      rQ   volumec                   C   rM   rN   rO   rI   rI   rI   rJ   rP      rQ   lexicon_namesN)__name__
__module____qualname____doc__r   rS   strr   __annotations__rT   rU   rV   rW   r   rI   rI   rI   rJ   rL   |   s   
 
"rL   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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dZdefddZdede	e
 fddZde
de
fddZede
de
deedf fddZ  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                   @   sx   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< dS )	zAWSPollyTTSService.InputParamsa9  Input parameters for AWS Polly TTS configuration.

        .. deprecated:: 0.0.105
            Use ``AWSPollyTTSService.Settings`` 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.
        NrS   r   rT   rU   rV   rW   )rX   rY   rZ   r[   rS   r   r\   r]   r   r%   r   rT   rU   rV   rW   r   rI   rI   rI   rJ   InputParams   s   
 r`   N)api_keyaws_access_key_idaws_session_tokenregionvoice_idsample_rateparamssettingsra   rb   rc   rd   re   rf   rg   rh   c             
      s  | j ddddddddd}
|dur| dd ||
_|durB| d |sB|j|
_|jr/|jnd|
_|j|
_|j|
_|j|
_|j|
_|durK|
	| t
 jd|dd|
d	|	 |p_td
|petd|pktd|prtddd| _t | _t | _dS )a^  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=AWSPollyTTSService.Settings(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=AWSPollyTTSService.Settings(...)`` 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   rS   rT   rU   rV   rW   re   rk   rg   T)rf   push_start_framepush_stop_framesrh   AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN
AWS_REGIONz	us-east-1)rb   aws_secret_access_keyrc   region_namerI   )Settings"_warn_init_param_moved_to_settingsrk   rS   r   rT   rU   rV   rW   apply_updatesuper__init__osgetenv_aws_paramsaioboto3Session_aws_sessionr	   
_resampler)selfra   rb   rc   rd   re   rf   rg   rh   kwargsdefault_settings	__class__rI   rJ   rx      sN   $



zAWSPollyTTSService.__init__r   c                 C   s   dS )zCheck if this service can generate processing metrics.

        Returns:
            True, as AWS Polly service supports metrics generation.
        TrI   )r   rI   rI   rJ   can_generate_metrics  s   z'AWSPollyTTSService.can_generate_metricsr   c                 C   s   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.
        )rK   )r   r   rI   rI   rJ   language_to_service_language  s   	z/AWSPollyTTSService.language_to_service_languagetextc                 C   s   d}| j j}|d| d7 }g }| j jdkr%| j jr%|d| j j d | j jr4|d| j j d | j jrC|d| j j d |rP|d	d
| d7 }||7 }|rZ|d7 }|d7 }|d7 }t	|  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: )
r_   r   rS   rT   appendrU   rV   joinr   trace)r   r   ssmlr   prosody_attrsrI   rI   rJ   _construct_ssml  s(   z"AWSPollyTTSService._construct_ssml
context_idc              
   C  s  t |  d| d z| |}|dd| jj| jjd| jjd}dd | D }| jj	di | j
4 I d
H u}|jdi |I d
H }d|v rU|d }| I d
H }	n
t |  d d
}	| j|	d| jI d
H }	| |I d
H  | j}
tdt|	|
D ]#}|	|||
  }t|dkr|  I d
H  t|| jd|d}|V  q~W d
  I d
H  W d
S 1 I d
H sw   Y  W d
S  ttfy } zdt| }t|dV  W Y d
}~d
S d
}~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LexiconNamesc                 S   s   i | ]\}}|d ur||qS rN   rI   ).0kvrI   rI   rJ   
<dictcomp>X  s    z.AWSPollyTTSService.run_tts.<locals>.<dictcomp>pollyNAudioStreamz No audio stream in responsei>  r      )r   zAWS Polly TTS error: )error)r   rI   )r   debugr   r_   rk   rS   rW   itemsr~   clientr{   synthesize_speechreadr   r   resamplerf   start_tts_usage_metrics
chunk_sizerangelenstop_ttfb_metricsr   r   r   r\   r
   )r   r   r   r   rg   filtered_paramsr   responsestream
audio_data
CHUNK_SIZEichunkframer   error_messagerI   rI   rJ   run_tts;  sJ   
2zAWSPollyTTSService.run_tts)rX   rY   rZ   r[   rL   rt   r]   r   r`   r   r\   intrx   boolr   r   r   r   r   r   r   r   __classcell__rI   rI   r   rJ   r^      sF   
 	
W!(r^   c                       s$   e Zd ZdZeZ fddZ  ZS )PollyTTSServicezDeprecated alias for AWSPollyTTSService.

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

    c                    s^   t  jdi | ddl}|  |d |dt W d   dS 1 s(w   Y  dS )zInitialize the deprecated PollyTTSService.

        Args:
            **kwargs: All arguments passed to AWSPollyTTSService.
        r   NalwayszB'PollyTTSService' is deprecated, use 'AWSPollyTTSService' instead.rI   )rw   rx   warningscatch_warningssimplefilterwarnDeprecationWarning)r   r   r   r   rI   rJ   rx     s   

"zPollyTTSService.__init__)rX   rY   rZ   r[   rL   rt   rx   r   rI   rI   r   rJ   r   v  s    r   )+r[   ry   dataclassesr   r   typingr   r   r   logurur   pydanticr   pipecat.audio.utilsr	   pipecat.frames.framesr
   r   r   pipecat.services.settingsr   r   r   pipecat.services.tts_servicer   pipecat.transcriptions.languager   r   (pipecat.utils.tracing.service_decoratorsr   r|   botocore.exceptionsr   r   ModuleNotFoundErrorer   	Exceptionr\   rK   rL   r^   r   rI   rI   rI   rJ   <module>   s6   
T h