|
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 |
|
async 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 |
|
|
|
|
|
if __name__=="__main__": |
|
ts=TextToSpeech() |
|
import asyncio |
|
async def main(): |
|
audio_buffer = await ts.synthesize("help the poort") |
|
play(audio_buffer) |
|
asyncio.run(main()) |