o
    y	i&                     @   sp   d Z ddlZddlZddlZddlmZmZmZ ddlZddl	Z	ddl
mZ ddlmZ G dd dZe ZdS )zc
Sarvam TTS Service for Text-to-Speech Conversion
Handles text-to-speech using Sarvam AI's TTS API
    N)OptionalDictAny)Config)Logc                   @   s   e Zd ZdZddefddZdedee fdd	Zdedee fd
dZ	de
fddZdeeef fddZdede
fddZdS )SarvamTTSServicez
    Service for converting text to speech using Sarvam AI's TTS API.
    Provides cost-effective alternative to OpenAI TTS.
    Nvoice_idc                 C   sd   t j| _t j| _t j| _|st jr|pt j nd| _	t j
| _t j| _td| j d| j	  d S )NZmanishau-   🎤 Sarvam TTS Service initialized - Model: z	, Voice: )r   ZSARVAM_TTS_API_KEYapi_keyZSARVAM_TTS_BASE_URLbase_urlZSARVAM_TTS_MODELmodelZSARVAM_TTS_VOICElowervoiceZSARVAM_TTS_LANGUAGElanguageZSARVAM_TTS_SAMPLE_RATEsample_rater   info)selfr    r   services/sarvam_tts_service.py__init__   s   zSarvamTTSService.__init__textreturnc              
      s   |r|  std dS z-td|dd  d | |I dH }|r4tdt| d |W S td W dS  tyV } ztd	|  W Y d}~dS d}~ww )
z
        Convert text to speech audio.
        
        Args:
            text: Text to convert to speech
            
        Returns:
            Audio bytes in WAV format or None if failed
        u"   ⚠️ Empty text provided for TTSNu    🎤 Converting text to speech: 2   z...u    ✅ TTS conversion successful -  bytesu   ❌ TTS conversion failedu(   ❌ Error in text-to-speech conversion: )	stripr   Zwarningdebug_call_sarvam_tts_apir   lenerror	Exception)r   r   
audio_dataer   r   r   text_to_speech"   s"   


zSarvamTTSService.text_to_speechc              
      s>  z| j ddd}|d| jddddd	}tjd
d}tj|d4 I dH }|j| j d||d4 I dH }|jdkr| I dH }d|v r{t	|d dkr{|d d }t
|}	tdt	|	 d |	W  d  I dH  W  d  I dH  W S td|  	 W d  I dH  W d  I dH  W dS | I dH }
td|j d|
  	 W d  I dH  W d  I dH  W dS 1 I dH sw   Y  W d  I dH  W dS 1 I dH sw   Y  W dS  tjy } ztd|  W Y d}~dS d}~w ty } ztd|  W Y d}~dS d}~ww )z
        Make API call to Sarvam TTS service.
        
        Args:
            text: Text to convert
            
        Returns:
            Audio data bytes or None
        zapplication/jsonz	audio/wav)zapi-subscription-keyzContent-TypeZAcceptzen-INg?g?g?i>  )r   Ztarget_language_codeZspeakerZpitchZpaceZloudnessZspeech_sample_rate   )total)timeoutNz/text-to-speech)headersjson   Zaudiosr   u   🎤 Received z bytes from Sarvam TTSu*   ❌ No audio data in Sarvam TTS response: u   ❌ Sarvam TTS API error z: u&   ❌ Network error calling Sarvam TTS: u)   ❌ Unexpected error calling Sarvam TTS: )r	   r   aiohttpZClientTimeoutZClientSessionZpostr
   statusr&   r   base64Z	b64decoder   r   r   r   ZClientErrorr   )r   r   r%   Zrequest_datar$   ZsessionZresponseZresponse_jsonZaudio_base64Z	raw_audioZ
error_textr    r   r   r   r   A   sf   




2z%SarvamTTSService._call_sarvam_tts_apic              
      s~   z"d}|  |I dH }|rt|dkrtd W dS td W dS  ty> } ztd|  W Y d}~dS d}~ww )	z
        Test connection to Sarvam TTS API.
        
        Returns:
            True if connection successful, False otherwise
        zHello, this is a test.Nr   u)   ✅ Sarvam TTS connection test successfulTu%   ❌ Sarvam TTS connection test failedFu)   ❌ Error testing Sarvam TTS connection: )r!   r   r   r   r   r   )r   Z	test_textr   r    r   r   r   test_connection~   s   

z SarvamTTSService.test_connectionc                 C   s   d| j | j| j| j| jdS )z
        Get information about the TTS service configuration.
        
        Returns:
            Dictionary with service information
        Z
sarvam_tts)Zservice_typer   r   r   r   r
   )r   r   r   r   r
   )r   r   r   r   get_service_info   s   z!SarvamTTSService.get_service_infor   c              
   C   s   z/|r	t |dk rW dS |dd dkrW dS |dd dkr"W dS td	t | d
 W dS  tyJ } ztd|  W Y d}~dS d}~ww )z
        Validate that the audio data is in correct format.
        
        Args:
            audio_data: Audio bytes to validate
            
        Returns:
            True if valid, False otherwise
        ,   FN   s   RIFF      s   WAVEu&   🎤 Audio format validation passed - r   Tu#   ❌ Error validating audio format: )r   r   r   r   r   )r   r   r    r   r   r   validate_audio_format   s   
z&SarvamTTSService.validate_audio_format)N)__name__
__module____qualname____doc__strr   r   bytesr!   r   boolr+   r   r   r,   r1   r   r   r   r   r      s    =r   )r5   Zasyncior(   r*   typingr   r   r   ioZwaveZconfigr   Zservices.log_utilsr   r   Zsarvam_tts_servicer   r   r   r   <module>   s     
2