o
    roj                     @  s^   d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 e
eZdZG dd deZdS )	u?   TTS vía ElevenLabs (μ-law 8 kHz nativo para RTP telefónico).    )annotationsN)AudioFormatTextToSpeech)sanitize_for_ttszhttps://api.elevenlabs.io/v1c                   @  sZ   e Zd ZdZddddd%ddZd&ddZed'ddZddddd(d!d"Zd)d#d$Z	dS )*ElevenLabsTextToSpeech
elevenlabseleven_multilingual_v2g      ?g      N@)model_idspeedtimeoutapi_keystrvoice_idr	   r
   floatr   returnNonec                C  sp   |pd  }|p	d  }|std|std|| _|| _|p!d  | _tdtdt|| _|| _	d | _
d S )N u   ELEVENLABS_API_KEY está vacíou    ELEVENLABS_VOICE_ID está vacíor   g      ?g      @)strip
ValueErrorr   r   r	   maxminr   r
   _timeout_client)selfr   r   r	   r
   r   keyvid r   B/var/www/html/bot-asterisk-ari/backend/voice/tts/elevenlabs_tts.py__init__   s   	
zElevenLabsTextToSpeech.__init__httpx.AsyncClientc                 C  s.   | j d u rtjt| jddd| jd| _ | j S )Nzapplication/octet-streamzapplication/json)z
xi-api-keyAcceptzContent-Type)base_urlheadersr   )r   httpxAsyncClient	_API_BASEr   r   r   r   r   r   _get_client+   s   
	z"ElevenLabsTextToSpeech._get_clientfmtr   c                 C  s   | j dkrdS dS )Nmulaw	ulaw_8000pcm_8000encoding)r(   r   r   r   _output_format8   s   
z%ElevenLabsTextToSpeech._output_formatN)audio_formatvoicelanguage_codetextr/   AudioFormat | Noner0   
str | Noner1   bytesc             
     s   ~|pt dd}|p| j }t|}|sdS | |}|  }	z"|	jd| d|i|| jd| jiddI d H }
|
	  |
j
pBdW S  tjyd } z|jjpQd	d d
 }td|jj|  d }~w typ   td  w )Nr)   r,       z/text-to-speech/output_formatr
   )r2   r	   voice_settings)paramsjsonr   i,  zElevenLabs TTS HTTP %s: %su   ElevenLabs TTS falló)r   r   r   r   r.   r'   postr	   r
   raise_for_statuscontentr#   HTTPStatusErrorresponser2   logger	exceptionstatus_code	Exception)r   r2   r/   r0   r1   r(   r   cleanr7   clientr?   excbodyr   r   r   
synthesize>   sB   
	
z!ElevenLabsTextToSpeech.synthesizec                   s*   | j d ur| j  I d H  d | _ d S d S )N)r   acloser&   r   r   r   closeg   s
   

zElevenLabsTextToSpeech.close)r   r   r   r   r	   r   r
   r   r   r   r   r   )r   r   )r(   r   r   r   )
r2   r   r/   r3   r0   r4   r1   r4   r   r5   )r   r   )
__name__
__module____qualname__provider_namer   r'   staticmethodr.   rH   rJ   r   r   r   r   r      s    
	)r   )__doc__
__future__r   loggingr#   voice.protocolsr   r   voice.tts.sanitizer   	getLoggerrK   r@   r%   r   r   r   r   r   <module>   s    
