Spaces:
Runtime error
Runtime error
"""ElevenLabs speech module""" | |
import os | |
import requests | |
from playsound import playsound | |
from autogpt.config import Config | |
from autogpt.speech.base import VoiceBase | |
PLACEHOLDERS = {"your-voice-id"} | |
class ElevenLabsSpeech(VoiceBase): | |
"""ElevenLabs speech class""" | |
def _setup(self) -> None: | |
"""Set up the voices, API key, etc. | |
Returns: | |
None: None | |
""" | |
cfg = Config() | |
default_voices = ["ErXwobaYiN019PkySvjV", "EXAVITQu4vr4xnSDxMaL"] | |
voice_options = { | |
"Rachel": "21m00Tcm4TlvDq8ikWAM", | |
"Domi": "AZnzlk1XvdvUeBnXmlld", | |
"Bella": "EXAVITQu4vr4xnSDxMaL", | |
"Antoni": "ErXwobaYiN019PkySvjV", | |
"Elli": "MF3mGyEYCl7XYWbV9V6O", | |
"Josh": "TxGEqnHWrfWFTfGW9XjX", | |
"Arnold": "VR6AewLTigWG4xSOukaG", | |
"Adam": "pNInz6obpgDQGcFmaJgB", | |
"Sam": "yoZ06aMxZJJ28mfd3POQ", | |
} | |
self._headers = { | |
"Content-Type": "application/json", | |
"xi-api-key": cfg.elevenlabs_api_key, | |
} | |
self._voices = default_voices.copy() | |
if cfg.elevenlabs_voice_1_id in voice_options: | |
cfg.elevenlabs_voice_1_id = voice_options[cfg.elevenlabs_voice_1_id] | |
if cfg.elevenlabs_voice_2_id in voice_options: | |
cfg.elevenlabs_voice_2_id = voice_options[cfg.elevenlabs_voice_2_id] | |
self._use_custom_voice(cfg.elevenlabs_voice_1_id, 0) | |
self._use_custom_voice(cfg.elevenlabs_voice_2_id, 1) | |
def _use_custom_voice(self, voice, voice_index) -> None: | |
"""Use a custom voice if provided and not a placeholder | |
Args: | |
voice (str): The voice ID | |
voice_index (int): The voice index | |
Returns: | |
None: None | |
""" | |
# Placeholder values that should be treated as empty | |
if voice and voice not in PLACEHOLDERS: | |
self._voices[voice_index] = voice | |
def _speech(self, text: str, voice_index: int = 0) -> bool: | |
"""Speak text using elevenlabs.io's API | |
Args: | |
text (str): The text to speak | |
voice_index (int, optional): The voice to use. Defaults to 0. | |
Returns: | |
bool: True if the request was successful, False otherwise | |
""" | |
tts_url = ( | |
f"https://api.elevenlabs.io/v1/text-to-speech/{self._voices[voice_index]}" | |
) | |
response = requests.post(tts_url, headers=self._headers, json={"text": text}) | |
if response.status_code == 200: | |
with open("speech.mpeg", "wb") as f: | |
f.write(response.content) | |
playsound("speech.mpeg", True) | |
os.remove("speech.mpeg") | |
return True | |
else: | |
print("Request failed with status code:", response.status_code) | |
print("Response content:", response.content) | |
return False | |