| import os |
| from elevenlabs import ElevenLabs,Voice,VoiceSettings |
| from typing import Optional |
| from elevenlabs import play |
| from dotenv import load_dotenv |
|
|
| import io |
| load_dotenv() |
| print(os.getenv("ELEVENLABS_API_KEY")) |
| class TextToSpeech: |
| REQUIRED_ENV_VARS=["ELEVENLABS_API_KEY","ELEVENLABS_VOICE_ID"] |
| def __init__(self): |
| """Initialize""" |
| self._validate_env_vars() |
| self._client: Optional[ElevenLabs] = None |
| |
| def _validate_env_vars(self) -> None: |
| """validate that all the environment variables are set""" |
| missing_vars=[var for var in self.REQUIRED_ENV_VARS if not os.getenv(var)] |
| if missing_vars: |
| raise ValueError(f"Missing required environment variables: {', '.join(missing_vars)}") |
| |
| @property |
| def client(self) -> Optional[ElevenLabs]: |
| """Get or create a client instance""" |
| if self._client is None: |
| self._client = ElevenLabs(api_key=os.getenv("ELEVENLABS_API_KEY")) |
| return self._client |
| def synthesize(self,text:str)->bytes: |
| """Convert text to speech""" |
| if not text.strip(): |
| raise ValueError("Input text cannot be empty") |
| if len(text)>5000: |
| raise ValueError("Input text cannot exceed 5000 characters") |
| try: |
| audio_generator =self.client.generate( |
| text=text, |
| voice=Voice( |
| voice_id=os.getenv("ELEVENLABS_VOICE_ID"), |
| settings=VoiceSettings(stability=0.5, similarity_boost=0.5), |
| ), |
| model=os.getenv("TTS_MODEL_NAME"), |
|
|
| ) |
| audio_bytes = b"".join(audio_generator) |
| return audio_bytes |
| except Exception as e: |
| print(f"Error synthesizing text: {str(e)}") |
| return None |
| |
| |
| |
| |
| |
| |
| |
| |
| |