o
    i'                  
   @   sD  d Z ddlZddlZddlmZmZ ddlmZmZm	Z	m
Z
mZmZ ddlmZ dejd< ddl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  zddl!Z"ddl#m$  m%  m&Z' W n  e(y Z) ze*de)  e*d e+de) dZ)[)ww eG dd deZ,G dd deZ-dS )zNVIDIA Riva text-to-speech service implementation.

This module provides integration with NVIDIA Riva's TTS services through
gRPC API for high-quality speech synthesis.
    N)	dataclassfield)AnyAsyncGeneratorAsyncIterator	GeneratorMappingOptional)
traced_ttsfalseGRPC_ENABLE_FORK_SUPPORT)logger)	BaseModel)
ErrorFrameFrame
StartFrameTTSAudioRawFrame)	NOT_GIVENTTSSettings	_NotGiven)
TTSService)LanguagezException: zNIn order to use NVIDIA Riva TTS, you need to `pip install pipecat-ai[nvidia]`.zMissing module: c                   @   s,   e Zd ZU dZedd dZeeB ed< dS )NvidiaTTSSettingszdSettings for NvidiaTTSService.

    Parameters:
        quality: Audio quality setting (0-100).
    c                   C   s   t S N)r    r   r   O/home/ubuntu/.local/lib/python3.10/site-packages/pipecat/services/nvidia/tts.py<lambda>5   s    zNvidiaTTSSettings.<lambda>)default_factoryqualityN)	__name__
__module____qualname____doc__r   r   intr   __annotations__r   r   r   r   r   -   s   
 r   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de	de	de
e	 de
e dee	e	f de
e de
e def fddZde	fddZdedee	ef f fddZdd Z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 )(NvidiaTTSServicezNVIDIA Riva text-to-speech service.

    Provides high-quality text-to-speech synthesis using NVIDIA Riva's
    cloud-based TTS models. Supports multiple voices, languages, and
    configurable quality settings.
    	_settingsc                   @   s4   e Zd ZU dZejZee ed< dZ	ee
 ed< dS )zNvidiaTTSService.InputParamsaY  Input parameters for Riva TTS configuration.

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

        Parameters:
            language: Language code for synthesis. Defaults to US English.
            quality: Audio quality setting (0-100). Defaults to 20.
        language   r   N)r   r    r!   r"   r   EN_USr'   r	   r$   r   r#   r   r   r   r   InputParamsC   s   
 
r*   zgrpc.nvcf.nvidia.com:443Nz$877104f7-e885-42b9-8de8-f6e4c6303969zmagpie-tts-multilingual)function_id
model_nameT)servervoice_idsample_ratemodel_function_mapparamssettingsuse_sslapi_keyr-   r.   r/   r0   r1   r2   r3   c                   s   | j |ddtjdd}
|dur| dd ||
_|dur7| d |s7|jdur.|j|
_|jdur7|j|
_|dur@|
| t	 j
d|d	d	|
d
|	 || _|| _|d| _|| _d| _d| _dS )a;  Initialize the NVIDIA Riva TTS service.

        Args:
            api_key: NVIDIA API key for authentication.
            server: gRPC server endpoint. Defaults to NVIDIA's cloud endpoint.
            voice_id: Voice model identifier. Defaults to multilingual Aria voice.

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

            sample_rate: Audio sample rate. If None, uses service default.
            model_function_map: Dictionary containing function_id and model_name for the TTS model.
            params: Additional configuration parameters for TTS synthesis.

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

            settings: Runtime-updatable settings. When provided alongside deprecated
                parameters, ``settings`` values take precedence.
            use_ssl: Whether to use SSL for the NVIDIA Riva server. Defaults to True.
            **kwargs: Additional arguments passed to parent TTSService.
        r,   zMagpie-Multilingual.EN-US.Ariar(   )modelvoicer'   r   Nr.   r6   r1   T)r/   push_start_framepush_stop_framesr2   r+   r   )Settingsgetr   r)   "_warn_init_param_moved_to_settingsr6   r'   r   apply_updatesuper__init___server_api_key_function_id_use_ssl_service_config)selfr4   r-   r.   r/   r0   r1   r2   r3   kwargsdefault_settings	__class__r   r   r>   Q   s@   '




zNvidiaTTSService.__init__r5   c                    sR   ddl }|  |d |jdtdd W d   dS 1 s"w   Y  dS )a  Set the TTS model.

        .. deprecated:: 0.0.104
            Model cannot be changed after initialization for NVIDIA Riva TTS.
            Set model and function id in the constructor instead, e.g.::

                NvidiaTTSService(
                    api_key=...,
                    model_function_map={"function_id": "<UUID>", "model_name": "<model_name>"},
                )

        Args:
            model: The model name to set.
        r   Nalwaysa  'set_model' is deprecated. Model cannot be changed after initialization for NVIDIA Riva TTS. Set model and function id in the constructor instead, e.g.: NvidiaTTSService(api_key=..., model_function_map={'function_id': '<UUID>', 'model_name': '<model_name>'})   )
stacklevel)warningscatch_warningssimplefilterwarnDeprecationWarning)rE   r5   rM   r   r   r   	set_model   s   

"zNvidiaTTSService.set_modeldeltareturnc                    s*   t  |I dH }|s|S | | |S )zgApply a settings delta.

        Settings are stored but not applied to the active connection.
        N)r=   _update_settings _warn_unhandled_updated_settings)rE   rS   changedrH   r   r   rU      s   
z!NvidiaTTSService._update_settingsc                 C   sP   | j d urd S d| jgdd| j gg}tjd | j| j|}tj|| _ d S )Nzfunction-idauthorizationzBearer )	rC   rA   r@   rivaclientAuthrB   r?   SpeechSynthesisService)rE   metadataauthr   r   r   _initialize_client   s   
z#NvidiaTTSService._initialize_clientc                 C   s&   | j sd S | j jtjjj }|S r   )rC   stubGetRivaSynthesisConfigrY   rZ   protoriva_tts_pb2RivaSynthesisConfigRequest)rE   configr   r   r   _create_synthesis_config   s   z)NvidiaTTSService._create_synthesis_configframec                    s>   t  |I dH  |   |  | _td| jj  dS )zStart the Cartesia TTS service.

        Args:
            frame: The start frame containing initialization parameters.
        Nz)Initialized NvidiaTTSService with model: )	r=   startr_   rf   rD   r   debugr&   r5   )rE   rg   rH   r   r   rh      s
   
zNvidiaTTSService.starttext
context_idc           	   
     s  dt tjddf ffdd}dd  dttj f fdd}zPjdus+J d	jdus4J d
t d d t	|I dH }||2 z3 dH W }
 I dH  t|jjd|d}|V  qK6 I dH  W dS  tjy } zt d t d| dV  W Y d}~dS d}~w ty } zt d|  t d| dV  W Y d}~dS d}~ww )a  Generate speech from text using NVIDIA Riva TTS.

        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.
        rT   Nc               	      s,    j j jj jj jd  jji d} | S )N)sample_rate_hzzero_shot_audio_prompt_filezero_shot_qualitycustom_dictionary)rC   synthesize_onliner&   r6   r'   r/   r   )	responses)rE   rj   r   r   read_audio_responses   s   	z6NvidiaTTSService.run_tts.<locals>.read_audio_responsesc                 S   s    zt | W S  ty   Y d S w r   )nextStopIteration)itr   r   r   
async_next  s
   
z,NvidiaTTSService.run_tts.<locals>.async_nextc                   s*   	 t  | I d H }|d u rd S |V  qr   )asyncio	to_thread)iteratoritem)rv   r   r   async_iterator  s   z0NvidiaTTSService.run_tts.<locals>.async_iteratorzTTS service not initializedz#Synthesis configuration not createdz: Generating TTS []   )audior/   num_channelsrk   z# timeout waiting for audio responsez error: )errorz exception: )r   rttsSynthesizeSpeechResponser   rC   rD   r   ri   rw   rx   stop_ttfb_metricsr   r~   r/   start_tts_usage_metricsTimeoutErrorr   r   	Exception)	rE   rj   rk   rr   r{   rq   resprg   er   )rv   rE   rj   r   run_tts   s:    
$$zNvidiaTTSService.run_tts)r   r    r!   r"   r   r9   r$   r   r*   strr	   r#   r   boolr>   rR   dictr   rU   r_   rf   r   rh   r
   r   r   r   __classcell__r   r   rH   r   r%   8   sL   
 
P
(r%   ).r"   rw   osdataclassesr   r   typingr   r   r   r   r   r	   (pipecat.utils.tracing.service_decoratorsr
   environlogurur   pydanticr   pipecat.frames.framesr   r   r   r   pipecat.services.settingsr   r   r   pipecat.services.tts_servicer   pipecat.transcriptions.languager   riva.clientrY   riva.client.proto.riva_tts_pb2rZ   rb   rc   r   ModuleNotFoundErrorr   r   r   r   r%   r   r   r   r   <module>   s2    


