Spaces:
Sleeping
Sleeping
| 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""" | |
| # First try EdgeTTS (free) | |
| try: | |
| return asyncio.run(generate_edge_audio(text, filename)) | |
| except Exception as edge_error: | |
| # If Edge fails, try ElevenLabs if configured | |
| 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: | |
| # Verify ElevenLabs key | |
| 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)}" | |
| ) |