| import os |
| import edge_tts |
| import asyncio |
| from elevenlabs import generate, save, voices |
| from elevenlabs.api.error import APIError |
|
|
| async def generate_edge_audio(text, filename="output_audio.mp3"): |
| """Free Microsoft Edge TTS implementation""" |
| try: |
| communicate = edge_tts.Communicate(text, "en-US-AriaNeural") |
| await communicate.save(filename) |
| return filename |
| except Exception as e: |
| raise RuntimeError(f"EdgeTTS error: {str(e)}") |
|
|
| def generate_audio(text, filename="output_audio.mp3"): |
| """Hybrid audio generator with fallback logic""" |
| |
| try: |
| return asyncio.run(generate_edge_audio(text, filename)) |
| except Exception as edge_error: |
| |
| elevenlabs_key = os.getenv("ELEVENLABS_API_KEY") |
| if not elevenlabs_key: |
| raise RuntimeError( |
| "EdgeTTS failed and no ElevenLabs API key configured. " |
| f"Original error: {str(edge_error)}" |
| ) |
| |
| try: |
| |
| available_voices = voices() |
| if not available_voices: |
| raise RuntimeError("No ElevenLabs voices available") |
| |
| audio = generate( |
| text=text, |
| voice=available_voices[0], |
| model="eleven_monolingual_v1", |
| api_key=elevenlabs_key |
| ) |
| save(audio, filename) |
| return filename |
| except APIError as e: |
| if "requires a valid API key" in str(e): |
| raise RuntimeError("Invalid ElevenLabs API key") |
| raise RuntimeError(f"ElevenLabs error: {str(e)}") |
| except Exception as e: |
| raise RuntimeError( |
| f"Both EdgeTTS and ElevenLabs failed. " |
| f"Edge error: {str(edge_error)}. " |
| f"ElevenLabs error: {str(e)}" |
| ) |