Spaces:
Running
Running
# genesis/narration.py | |
""" | |
Narration Module for GENESIS-AI | |
Generates audio narration from text using ElevenLabs, with gTTS fallback. | |
""" | |
import os | |
import requests | |
from gtts import gTTS | |
ELEVEN_LABS_API_KEY = os.getenv("ELEVEN_LABS_API_KEY") | |
ELEVEN_TTS_URL = "https://api.elevenlabs.io/v1/text-to-speech" | |
def narrate_text_elevenlabs(text, voice="Rachel"): | |
"""Generate narration using ElevenLabs API.""" | |
headers = { | |
"xi-api-key": ELEVEN_LABS_API_KEY, | |
"Content-Type": "application/json" | |
} | |
payload = {"text": text, "voice_settings": {"stability": 0.75, "similarity_boost": 0.75}} | |
try: | |
r = requests.post(f"{ELEVEN_TTS_URL}/{voice}", json=payload, headers=headers) | |
r.raise_for_status() | |
output_path = "narration.mp3" | |
with open(output_path, "wb") as f: | |
f.write(r.content) | |
return output_path | |
except Exception as e: | |
return {"error": str(e)} | |
def narrate_text_gtts(text, lang="en"): | |
"""Fallback narration with gTTS.""" | |
try: | |
tts = gTTS(text=text, lang=lang) | |
output_path = "narration_fallback.mp3" | |
tts.save(output_path) | |
return output_path | |
except Exception as e: | |
return {"error": str(e)} | |
def narrate_text(text): | |
"""Try ElevenLabs first, else fallback.""" | |
if ELEVEN_LABS_API_KEY: | |
result = narrate_text_elevenlabs(text) | |
if isinstance(result, str): | |
return result | |
return narrate_text_gtts(text) | |