
    qi (                        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mZ ddlmZ ddl m!Z! 	 ddl"Z#ddl$m%c m&c m'Z( e G d de             Z- G d de      Z.y# e)$ r7Z* ejV                  de*         ejV                  d        e,de*       dZ*[*ww xY w)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_warn_deprecated_param)
TTSService)LanguagezException: zNIn order to use NVIDIA Riva TTS, you need to `pip install pipecat-ai[nvidia]`.zMissing module: c                   6    e Zd ZU dZ ed       Zeez  ed<   y)NvidiaTTSSettingszdSettings for NvidiaTTSService.

    Parameters:
        quality: Audio quality setting (0-100).
    c                      t         S N)r        M/opt/pipecat/venv/lib/python3.12/site-packages/pipecat/services/nvidia/tts.py<lambda>zNvidiaTTSSettings.<lambda>5   s    Y r   )default_factoryqualityN)	__name__
__module____qualname____doc__r   r#   intr   __annotations__r   r   r    r   r   -   s      %5FGGS9_Gr   r   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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Zde	fdZdedee	ef   f fdZd Zd Zdef fdZede	de	deedf   fd        Z x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                   N    e Zd ZU dZej
                  Zee   ed<   dZ	ee
   ed<   y)NvidiaTTSService.InputParamsaQ  Input parameters for Riva TTS configuration.

        .. deprecated:: 0.0.105
            Use ``NvidiaTTSSettings`` 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    InputParamsr.   C   s*    	 (0~~(8$5!###r   r2   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_keyr5   r6   r7   r8   r9   r:   r;   c                   t        |j                  d      dt        j                  d      }
|t	        dt         d       ||
_        |Lt	        dt                |s:|j                  |j                  |
_        |j                  |j                  |
_        ||
j                  |       t        | (  d|d	d	|
d
|	 || _        || _        |j                  d      | _        || _        d| _        d| _        y)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=NvidiaTTSSettings(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=NvidiaTTSSettings(...)`` 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.
        r4   zMagpie-Multilingual.EN-US.Ariar0   )modelvoicer/   r#   Nr6   r?   r9   T)r7   push_start_framepush_stop_framesr:   r3   r   )r   getr   r1   r   r?   r/   r#   apply_updatesuper__init___server_api_key_function_id_use_ssl_service_config)selfr<   r5   r6   r7   r8   r9   r:   r;   kwargsdefault_settings	__class__s              r    rE   zNvidiaTTSService.__init__Q   s   N -$((62^^	
 ":/@'J%-" "8->???.06$->>-/5~~$, ))(3 	
#!!%		

 	
 .22=Ar   r>   c                    K   ddl }|j                         5  |j                  d       |j                  dt        d       ddd       y# 1 sw Y   yxY ww)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)rL   r>   rT   s      r    	set_modelzNvidiaTTSService.set_model   sX      	$$& 		!!(+MMK #  		 		 		s   A*A
	A
AAdeltareturnc                 l   K   t         |   |       d{   }|s|S | j                  |       |S 7 w)zgApply a settings delta.

        Settings are stored but not applied to the active connection.
        N)rD   _update_settings _warn_unhandled_updated_settings)rL   rZ   changedrO   s      r    r]   z!NvidiaTTSService._update_settings   s;     
 077N--g6 8s   424c                    | j                   y d| j                  gdd| j                   gg}t        j                  j                  d | j                  | j                  |      }t        j                  j                  |      | _         y )Nzfunction-idauthorizationzBearer )	rJ   rH   rG   rivaclientAuthrI   rF   SpeechSynthesisService)rL   metadataauths      r    _initialize_clientz#NvidiaTTSService._initialize_client   ss    ==$ D--.78
 {{dmmT\\8L::4@r   c                     | j                   sy | j                   j                  j                  t        j                  j
                  j                  j                               }|S r   )rJ   stubGetRivaSynthesisConfigrb   rc   protoriva_tts_pb2RivaSynthesisConfigRequest)rL   configs     r    _create_synthesis_configz)NvidiaTTSService._create_synthesis_config   sK    }} ##::KK**EEG
 r   framec                    K   t         |   |       d{    | j                          | j                         | _        t        j                  d| j                  j                          y7 Vw)zStart the Cartesia TTS service.

        Args:
            frame: The start frame containing initialization parameters.
        Nz)Initialized NvidiaTTSService with model: )	rD   startrh   rp   rK   r   debugr,   r>   )rL   rq   rO   s     r    rs   zNvidiaTTSService.start   s[      gmE"""!446@AUAU@VWX 	#s   A/A-AA/text
context_idc                N   	K   dt         t        j                  ddf   f fd}d 	dt        t        j                     f	fd}	  j                  J d        j
                  J d       t        j                    d d	       t        j                  |       d{   } ||      2 3 d{   } j                          d{    t        |j                   j                  d
|      }| J7 V7 G7 16  j                         d{  7   y# t        j                  $ r6}t        j                     d       t#          d|        Y d}~yd}~wt$        $ r8}t        j                     d|        t#          d|        Y d}~yd}~ww xY 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.
        r[   Nc            	          j                   j                  j                  j                  j                  j                  j
                  d j                  j                  i       } | S )N)sample_rate_hzzero_shot_audio_prompt_filezero_shot_qualitycustom_dictionary)rJ   synthesize_onliner,   r?   r/   r7   r#   )	responsesrL   ru   s    r    read_audio_responsesz6NvidiaTTSService.run_tts.<locals>.read_audio_responses   s]    77$$''#//,0"&.."8"8"$ 8 I r   c                 8    	 t        |       S # t        $ r Y y w xY wr   )nextStopIteration)its    r    
async_nextz,NvidiaTTSService.run_tts.<locals>.async_next  s"    Bx  s   
 	c                `   K   	 t        j                  |        d {   }|y | '7 wr   )asyncio	to_thread)iteratoritemr   s     r    async_iteratorz0NvidiaTTSService.run_tts.<locals>.async_iterator  s4     $..z8DD<
	 Ds   .,.zTTS service not initializedz#Synthesis configuration not createdz: Generating TTS []   )audior7   num_channelsrv   z# timeout waiting for audio responsez error: )errorz exception: )r   rttsSynthesizeSpeechResponser   rJ   rK   r   rt   r   r   stop_ttfb_metricsr   r   r7   start_tts_usage_metricsTimeoutErrorr   r   	Exception)
rL   ru   rv   r   r   r~   resprq   er   s
   ``       @r    run_ttszNvidiaTTSService.run_tts   s    
	i0M0MtUY0Y&Z 
			mD<Y<Y.Z 		9==,K.KK,<<+R-RR+LLD6!3D6;<%//0DEEI,Y7  d,,...(** $ 0 0!")	  F. 8 ..t444## 	9LLD6!DEFdV8A3#7888 	9LLD6aS12dV8A3#7888	9s   AF%AD !C8"D .C>2C:3C>6D 
C<.D :C><D >D DD F%F"-,EF%F"*.FF%F""F%)r$   r%   r&   r'   r   Settingsr)   r   r2   strr
   r(   r	   boolrE   rY   dictr   r]   rh   rp   r   rs   r   r   r   r   __classcell__)rO   s   @r    r+   r+   8   s1    !H  $i $$ 1"&%)A31
 )-04N N 	N
 3-N c]N $CH-N %N ,-N N`S 8
,= 
$sCx. 

A	Y 	Y <9# <93 <9>%QU+;V <9 <9r   r+   )/r'   r   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   r   pipecat.services.tts_servicer   pipecat.transcriptions.languager   riva.clientrb   riva.client.proto.riva_tts_pb2rc   rl   rm   r   ModuleNotFoundErrorr   r   r   r   r+   r   r   r    <module>r      s     	 ( S S ? *1

% &    ` _ 3 4,11 H H Ho9z o9#  ,FLL;qc"#FLLab
&qc*
++,s   )B C2CC