Spaces:
Runtime error
Runtime error
declare(strict_types=1); | |
use GuzzleHttp\Client; | |
use GuzzleHttp\Psr7\Response; | |
class ElevenLabsApi { | |
private const BASE_URL = 'https://api.elevenlabs.io'; | |
private string $apiKey; | |
private Client $client; | |
/** | |
* ElevenLabsApi constructor. | |
* | |
* @param string $apiKey | |
* @param Client|null $client | |
*/ | |
public function __construct(string $apiKey, Client $client = null) { | |
$this->apiKey = $apiKey; | |
$this->client = $client ?? new Client(); | |
} | |
/** | |
* Returns metadata about all your generated audio. | |
* | |
* @return Response | |
* | |
* Example of a successful response (200 OK): | |
* { | |
* "items": [ | |
* { | |
* "id": "VW7YKqPnjY4h39yTbx2L", | |
* "title": "Generated Audio 1", | |
* "duration": 120, | |
* "created_at": "2023-03-16T08:00:00Z", | |
* "url": "https://download-link.example.com/your_history_item_audio.mp3" | |
* }, | |
* { | |
* "id": "AbCDeFgH1I2jK3LmN4O5", | |
* "title": "Generated Audio 2", | |
* "duration": 90, | |
* "created_at": "2023-03-15T08:00:00Z", | |
* "url": "https://download-link.example.com/your_history_item_audio2.mp3" | |
* } | |
* ] | |
* } | |
*/ | |
public function getHistory(): Response { | |
$url = self::BASE_URL . '/v1/history'; | |
return $this->makeRequest('GET', $url); | |
} | |
/** | |
* Returns the audio of a history item. | |
* | |
* @param string $history_item_id The history item ID to get audio from. | |
* | |
* @return Response | |
* | |
* Example of a successful response (200 OK): | |
* { | |
* "url": "https://download-link.example.com/your_history_item_audio.mp3" | |
* } | |
*/ | |
public function getAudioFromHistoryItem(string $historyItemId): Response { | |
$url = self::BASE_URL . "/v1/history/{$historyItemId}"; | |
return $this->makeRequest('GET', $url); | |
} | |
/** | |
* Delete a number of history items by their IDs. | |
* | |
* @param array $history_item_ids An array of history item IDs to delete. | |
* | |
* @return Response | |
* | |
* Example of a successful response (200 OK): | |
* { | |
* "status": "success", | |
* "message": "Selected history items deleted successfully." | |
* } | |
*/ | |
public function deleteHistoryItems(array $historyItemIds): Response { | |
$url = self::BASE_URL . '/v1/history/delete'; | |
$body = json_encode(['history_item_ids' => $historyItemIds]); | |
return $this->makeRequest('POST', $url, $body); | |
} | |
/** | |
* Delete a history item by its ID | |
* | |
* @param string $history_item_id The ID of the history item to be deleted | |
* @return Response | |
* | |
* Example of a successful response (200 OK): | |
* { | |
* "message": "History item deleted successfully" | |
* } | |
*/ | |
public function deleteHistoryItem(string $historyItemId): Response { | |
$url = self::BASE_URL . "/v1/history/{$historyItemId}"; | |
return $this->makeRequest('DELETE', $url); | |
} | |
/** | |
* Download one or more history items. | |
* | |
* @param array $history_item_ids An array of history item IDs to download. | |
* | |
* @return Response | |
* | |
* Example of a successful response (200 OK): | |
* { | |
* "url": "https://download-link.example.com/your_downloaded_audio.zip" | |
* } | |
*/ | |
public function downloadHistoryItems(array $historyItemIds): Response { | |
$url = self::BASE_URL . '/v1/history/download'; | |
$body = json_encode(['history_item_ids' => $historyItemIds]); | |
return $this->makeRequest('POST', $url, $body); | |
} | |
/** | |
* Convert text to speech | |
* | |
* @param string $text The text to be converted into speech | |
* @param array $options Optional parameters for the TTS conversion | |
* @return Response | |
* | |
* Example of a successful response (200 OK): | |
* { | |
* "history_item_id": "VW7YKqPnjY4h39yTbx2L", | |
* "text": "Hello, world!", | |
* "options": { | |
* "voice": "Joanna", | |
* "language": "en-US", | |
* "output_format": "mp3" | |
* }, | |
* "audio_url": "https://api.elevenlabs.io/v1/history/VW7YKqPnjY4h39yTbx2L/audio" | |
* } | |
*/ | |
public function textToSpeech(string $voiceId, array $data): Response { | |
$url = self::BASE_URL . "/v1/text-to-speech/{$voiceId}/stream"; | |
$body = json_encode($data); | |
return $this->makeRequest('POST', $url, $body); | |
} | |
/** | |
* Convert text to speech with a specific Voice ID | |
* | |
* @param string $text The text to be converted into speech | |
* @param string $voiceId The ID of the voice to be used for TTS conversion | |
* @param array $options Optional parameters for the TTS conversion | |
* @return Response | |
* | |
* Example of a successful response (200 OK): | |
* { | |
* "history_item_id": "VW7YKqPnjY4h39yTbx2L", | |
* "text": "Hello, world!", | |
* "options": { | |
* "voice_id": "Joanna", | |
* "language": "en-US", | |
* "output_format": "mp3" | |
* }, | |
* "audio_url": "https://api.elevenlabs.io/v1/history/VW7YKqPnjY4h39yTbx2L/audio" | |
* } | |
*/ | |
public function textToSpeechWithVoiceId(string $voiceId, array $data): Response { | |
$url = self::BASE_URL . "/v1/text-to-speech/{$voiceId}"; | |
$body = json_encode($data); | |
return $this->makeRequest('POST', $url, $body); | |
} | |
/** | |
* Make a request to the ElevenLabs API. | |
* | |
* @param string $method | |
* @param string $url | |
* @param string|null $body | |
* @return Response | |
*/ | |
private function makeRequest(string $method, string $url, string $body = null): Response { | |
$options = [ | |
'headers' => [ | |
'Xi-Api-Key' => $this->apiKey, | |
'Content-Type' => 'application/json', | |
], | |
]; | |
if ($body !== null) { | |
$options['body'] = $body; | |
} | |
return $this->client->request($method, $url, $options); | |
} | |
/** | |
* Delete a history item by its ID. | |
* | |
* @param string $history_item_id The history item ID to delete. | |
* | |
* @return Response | |
* | |
* Example of a successful response (200 OK): | |
* { | |
* "status": "success", | |
* "message": "History item deleted successfully." | |
* } | |
*/ | |
public function deleteSample(string $voiceId, string $sampleId): Response { | |
$url = self::BASE_URL . "/v1/voices/{$voiceId}/samples/{$sampleId}"; | |
return $this->makeRequest('DELETE', $url); | |
} | |
/** | |
* Returns the audio corresponding to a sample attached to a voice. | |
* | |
* @param string $voiceId | |
* @param string $sampleId | |
* @return Response | |
* Example of a successful response (200 OK): | |
* Content-Type: audio/mpeg | |
* (Binary audio content) | |
*/ | |
public function getAudioFromSample(string $voiceId, string $sampleId): Response { | |
$url = self::BASE_URL . "/v1/voices/{$voiceId}/samples/{$sampleId}/audio"; | |
return $this->makeRequest('GET', $url); | |
} | |
/** | |
* Delete a history item by its ID. | |
* | |
* @param string $historyItemId | |
* @return Response | |
*/ | |
public function deleteHistoryItemById(string $historyItemId): Response { | |
$url = self::BASE_URL . "/v1/history/{$historyItemId}"; | |
return $this->makeRequest('DELETE', $url); | |
} | |
/** | |
* Download one or more history items. | |
* | |
* @param array $historyItemIds | |
* @return Response | |
*/ | |
public function downloadHistoryItemsByIds(array $historyItemIds): Response { | |
$url = self::BASE_URL . '/v1/history/download'; | |
$body = json_encode(['history_item_ids' => $historyItemIds]); | |
return $this->makeRequest('POST', $url, $body); | |
} | |
/** | |
* Get metadata about all your generated audio. | |
* | |
* @return Response | |
* | |
* Example of a successful response (200 OK): | |
* { | |
* "items": [ | |
* { | |
* "id": "VW7YKqPnjY4h39yTbx2L", | |
* "created_at": "2023-03-16T12:30:00Z", | |
* "request": { | |
* "text": "Hello, world!", | |
* "voice": "en-US-Wavenet-A", | |
* "language_code": "en-US", | |
* "speed": 1, | |
* "pitch": 0, | |
* "volume_gain_db": 0 | |
* }, | |
* "duration_seconds": 2.16 | |
* }, | |
* { | |
* "id": "yv9dA7SxQx2zG8f4Zv1m", | |
* "created_at": "2023-03-15T14:45:00Z", | |
* "request": { | |
* "text": "Good morning!", | |
* "voice": "en-US-Wavenet-B", | |
* "language_code": "en-US", | |
* "speed": 1, | |
* "pitch": 0, | |
* "volume_gain_db": 0 | |
* }, | |
* "duration_seconds": 1.8 | |
* } | |
* ] | |
* } | |
*/ | |
public function getGeneratedItems(): Response { | |
$url = self::BASE_URL . '/v1/history'; | |
return $this->makeRequest('GET', $url); | |
} | |
/** | |
* Get the audio of a history item by its ID. | |
* | |
* @param string $historyItemId | |
* @return Response | |
*/ | |
public function getAudioFromHistoryItemById(string $historyItemId): Response { | |
$url = self::BASE_URL . "/v1/history/{$historyItemId}/audio"; | |
return $this->makeRequest('GET', $url); | |
} | |
/** | |
* Delete a number of history items by their IDs. | |
* | |
* @param array $historyItemIds | |
* @return Response | |
*/ | |
public function deleteHistoryItemsByIds(array $historyItemIds): Response { | |
$url = self::BASE_URL . '/v1/history/delete'; | |
$body = json_encode(['history_item_ids' => $historyItemIds]); | |
return $this->makeRequest('POST', $url, $body); | |
} | |
} | |