|
import json |
|
|
|
import requests |
|
|
|
|
|
class ElevenLabsAPI: |
|
|
|
def __init__(self, api_key): |
|
self.api_key = api_key |
|
self.url_base = 'https://api.elevenlabs.io/v1/' |
|
self.get_voices() |
|
|
|
def get_voices(self): |
|
'''Get the list of voices available''' |
|
url = self.url_base + 'voices' |
|
headers = {'accept': 'application/json'} |
|
if self.api_key: |
|
headers['xi-api-key'] = self.api_key |
|
response = requests.get(url, headers=headers) |
|
self.voices = {voice['name']: voice['voice_id'] for voice in response.json()['voices']} |
|
return self.voices |
|
|
|
def get_remaining_characters(self): |
|
'''Get the number of characters remaining''' |
|
url = self.url_base + 'user' |
|
headers = {'accept': '*/*', 'xi-api-key': self.api_key, 'Content-Type': 'application/json'} |
|
response = requests.get(url, headers=headers) |
|
|
|
if response.status_code == 200: |
|
sub = response.json()['subscription'] |
|
return sub['character_limit'] - sub['character_count'] |
|
else: |
|
raise Exception(response.json()['detail']['message']) |
|
|
|
def generate_voice(self, text, character, filename, stability=0.2, clarity=0.1): |
|
'''Generate a voice''' |
|
if character not in self.voices: |
|
print(character, 'is not in the array of characters: ', list(self.voices.keys())) |
|
|
|
voice_id = self.voices[character] |
|
url = f'{self.url_base}text-to-speech/{voice_id}/stream' |
|
headers = {'accept': '*/*', 'xi-api-key': self.api_key, 'Content-Type': 'application/json'} |
|
data = json.dumps({"model_id": "eleven_multilingual_v1", "text": text, "stability": stability, "similarity_boost": clarity}) |
|
response = requests.post(url, headers=headers, data=data) |
|
|
|
if response.status_code == 200: |
|
with open(filename, 'wb') as f: |
|
f.write(response.content) |
|
return filename |
|
else: |
|
message = response.text |
|
raise Exception(f'Error in response, {response.status_code} , message: {message}') |
|
|