video-generater / classes /VoiceGenerator.php
stephenz007's picture
initial commit
ae8c95b
raw
history blame
No virus
2.07 kB
<?php
declare(strict_types=1);
use GuzzleHttp\Psr7\Response;
class VoiceGenerator {
private ElevenLabsApi $elevenLabsApi;
/**
* VoiceGenerator constructor.
*
* @param ElevenLabsApi $elevenLabsApi
*/
public function __construct(ElevenLabsApi $elevenLabsApi) {
$this->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());
}
}
}