elevenLabsApi = $elevenLabsApi; } /** * Generate voice audio for the given message and voice ID. * * @param string $voiceId * @param string $message * @return string The local file path of the downloaded audio file * @throws Exception */ public function generate_and_download(string $voiceId, string $message): string { $data = ['text' => $message]; $response = $this->elevenLabsApi->textToSpeechWithVoiceId($voiceId, $data); if ($response->getStatusCode() === 200) { $result = json_decode((string)$response->getBody(), true); $audioUrl = $result['audio_url']; return $this->downloadAudio($audioUrl); } else { throw new Exception('Error generating audio: ' . $response->getReasonPhrase()); } } /** * Download audio file from the given URL and save it to the voices subfolder. * * @param string $audioUrl * @return string The local file path of the downloaded audio file */ private function downloadAudio(string $audioUrl): string { $voicesDirectory = 'voices'; if (!file_exists($voicesDirectory) && !mkdir($voicesDirectory) && !is_dir($voicesDirectory)) { throw new RuntimeException(sprintf('Directory "%s" was not created', $voicesDirectory)); } $localFilePath = $voicesDirectory . '/' . uniqid() . '.mp3'; $client = new GuzzleHttp\Client(); $response = $client->get($audioUrl, ['sink' => $localFilePath]); if ($response->getStatusCode() === 200) { return $localFilePath; } else { throw new Exception('Error downloading audio: ' . $response->getReasonPhrase()); } } }