
    5i                        d Z ddlmZ ddlZddlZddlZddlmZ ddlZddl	m
Z
 ddlmZ  e
         ej                  e      ZdZg dZg d	Z G d
 de      Zy)u  
Pollinations TTS Provider – generates speech audio from text via Pollinations.ai API.

Supports multiple voices from OpenAI and ElevenLabs.

Env vars:
  POLLINATIONS_API_KEY - API key from enter.pollinations.ai (optional for limited use)
  POLLINATIONS_TTS_VOICE - Voice to use (default: nova)
  POLLINATIONS_TTS_MODEL - Model to use (default: elevenlabs)

Docs: https://gen.pollinations.ai/docs
    )annotationsN)Path)load_dotenv)TTSProviderzhttps://gen.pollinations.ai)#alloyechofableonyxnovashimmerashballadcoralsageverseracheldomibellaelli	charlottedorothysarahemilylilymatildaadamantoniarnoldjoshsamdanielcharliejamesfincallumliamgeorgebrianbill)mp3opusaacflacwavpcmc                      e Zd ZdZdZ	 	 	 	 	 d
	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZedd       Z	edd       Z
edd	       Zy)PollinationsTTSProviderz<Wraps the Pollinations.ai API for text-to-speech generation.pollinationsNc                b   |xs t        j                  dd      | _        t        | _        |xs t        j                  dd      | _        |xs t        j                  dd      | _        |xs t        j                  dd      | _        ||nt        t        j                  d
d            | _	        | j
                  t        vr/t        j                  d| j
                  t        d	d        d| _        | j                  t        vr-t        j                  d| j                  t               d| _        y	y	)a  Initialize the Pollinations TTS provider.
        
        Args:
            api_key: Optional API key. If not provided, uses POLLINATIONS_API_KEY env var.
            voice: Voice to use (default: nova). See VOICES list for options.
            speed: Speech speed 0.25-4.0 (default: 1.0).
            audio_format: Output format - mp3, opus, aac, flac, wav, pcm (default: mp3).
            model: TTS model to use (default: openai).
        POLLINATIONS_API_KEY POLLINATIONS_TTS_VOICEr   POLLINATIONS_TTS_MODELopenaiPOLLINATIONS_TTS_FORMATr*   NPOLLINATIONS_TTS_SPEEDz1.0z/Unknown voice '%s', using 'nova'. Available: %s
   z/Unknown format '%s', using 'mp3'. Available: %s)osgetenvapi_keyPOLLINATIONS_BASE_URLbase_urlvoicemodelformatfloatspeedVOICESloggerwarningAUDIO_FORMATS)selfr>   rA   rE   audio_formatrB   s         L/root/.openclaw/workspace/visionaryfx/providers/pollinations_tts_provider.py__init__z PollinationsTTSProvider.__init__7   s    " G")),BB"G-Ibii(@&I
Kbii(@(K
"Qbii0I5&Q#/UU299E]_d;e5f
::V#NNA

s
  DJ;;m+NNA
  DK ,    c                   t        |      }|j                  j                  dd       |xs | j                  }||n| j                  }|xs | j
                  }|xs | j                  }t        |      dkD  r$t        j                  dt        |             |dd }|dk  s|dkD  r,t        j                  d|       t        dt        d|            }|||||d	}d
d| d}| j                  rd| j                   |d<   t        j                  d||t        |      |       t        j                  d      5 }	|	j!                  | j"                   d||      }
|
j%                          |j'                  |
j(                         ddd       t        j                  d|t        
j(                               |S # 1 sw Y   5xY w)a  Generate speech audio from text and save to output_path.
        
        Args:
            text: Text to convert to speech (max 4096 characters)
            output_path: Where to save the generated audio
            voice: Voice to use (default: from env or 'nova')
            speed: Speech speed 0.25-4.0 (default: 1.0)
            response_format: Audio format: mp3, opus, aac, flac, wav, pcm
            model: TTS model to use (default: elevenlabs)
            
        Returns:
            Path to the saved audio file
        T)parentsexist_okNi   z,Text too long (%d chars), truncating to 4096g      ?g      @z,Speed %.2f out of range (0.25-4.0), clamping)rB   inputrA   response_formatrE   zapplication/jsonzaudio/)zContent-TypeAcceptzBearer AuthorizationuB   Generating TTS via Pollinations: voice=%s model=%s %d chars → %sx   )timeoutz/v1/audio/speech)jsonheaderszTTS audio saved: %s (%d bytes))r   parentmkdirrA   rE   rC   rB   lenrG   rH   maxminr>   infohttpxClientpostr@   raise_for_statuswrite_bytescontent)rJ   textoutput_pathrA   rE   rS   rB   payloadrY   clientresponses              rL   _generate_syncz&PollinationsTTSProvider._generate_sync_   s   , ;'   = #*

)8T[[# t9tNN>D	 ;D 4<53;NN> c#uo.E .
 //0
 <<)0'?GO$PI	
 \\#& 		6&{{==/!12 # H
 %%' ##H$4$45		6 	4k3xGWGWCXY		6 		6s   7AF88Gc                `   K   t        j                  | j                  ||       d{   S 7 w)z%Generate speech audio asynchronously.N)asyncio	to_threadrk   )rJ   rf   rg   s      rL   generatez PollinationsTTSProvider.generate   s'     &&t':':D+NNNNs   %.,.c                 *    t         j                         S )z Return list of available voices.)rF   copy rN   rL   list_voicesz#PollinationsTTSProvider.list_voices   s     {{}rN   c                 *    t         j                         S )z'Return list of available audio formats.)rI   rq   rr   rN   rL   list_formatsz$PollinationsTTSProvider.list_formats   s     !!##rN   c                Z    ddl m} |j                  t        |             }|j                  S )zReturn the duration of an audio file in seconds using pydub.
        
        Args:
            audio_path: Path to audio file
            
        Returns:
            Duration in seconds
        r   )AudioSegment)pydubrw   	from_filestrduration_seconds)
audio_pathrw   segs      rL   get_audio_durationz*PollinationsTTSProvider.get_audio_duration   s'     	'$$S_5###rN   )NNNNN)
r>   
str | NonerA   r   rE   float | NonerK   r   rB   r   )NNNN)rf   rz   rg   
str | PathrA   r   rE   r   rS   r   rB   r   returnr   )rf   rz   rg   r   r   r   )r   z	list[str])r|   r   r   rD   )__name__
__module____qualname____doc__namerM   rk   ro   staticmethodrs   ru   r~   rr   rN   rL   r1   r1   2   s    FD # "#' & &  &  	& 
 !&  & X !"&* UU  U 	U
 U $U U 
UnO   $ $ $ $rN   r1   )r   
__future__r   rm   loggingr<   pathlibr   r`   dotenvr   providers.portsr   	getLoggerr   rG   r?   rF   rI   r1   rr   rN   rL   <module>r      s]    #   	    ' 			8	$5 
 =_$k _$rN   