fusionpbx/core/ai/resources/classes/ai_elevenlabs.php

238 lines
6.1 KiB
PHP
Raw Normal View History

<?php
/**
* ai_elevenlabs class
*
*/
class ai_elevenlabs implements ai_speech {
private $voice;
private $path;
private $message;
private $format;
private $filename;
private $languages;
private $transcribe_key;
private $speech_key;
private $model;
public function __construct($settings) {
$this->voice = "";
$this->path = "";
$this->message = "";
$this->format = "";
$this->filename = "";
//build the setting object and get the recording path
$this->transcribe_key = $settings->get('ai', 'transcribe_key');
$this->speech_key = $settings->get('ai', 'speech_key');
}
public function set_filename(string $audio_filename) {
$this->filename = $audio_filename;
}
public function set_format(string $audio_format) {
$this->format = $audio_format;
}
public function set_message(string $audio_message) {
$this->message = $audio_message;
}
public function set_path(string $audio_path) {
$this->path = $audio_path;
}
public function set_voice(string $audio_voice) {
$this->voice = $audio_voice;
}
public function speech(): bool {
//get the model automatically
$model_id = $this->get_model();
// set the request URL
$url = 'https://api.elevenlabs.io/v1/text-to-speech/' . $this->voice;
// set the request headers
$headers[] = 'Content-Type: application/json';
$headers[] = 'xi-api-key: '.$this->speech_key;
// set the http data
$data['model_id'] = $model_id;
$data['text'] = $this->message;
//$data['pronunciation_dictionary_locators'][0]['pronunciation_dictionary_id'];
//$data['pronunciation_dictionary_locators'][0]['version_id'];
$data['voice_settings']['similarity_boost'] = 1;
$data['voice_settings']['stability'] = 1;
$data['voice_settings']['style'] = 0;
$data['voice_settings']['use_speaker_boost'] = 'true';
// initialize curl handle
$ch = curl_init($url);
// set the curl options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
// run the curl request and get the response
$response = curl_exec($ch);
// get the errors
$error = curl_error($ch);
// get the http code
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// close the handle
curl_close($ch);
// show the result when there is an error
if ($http_code != 200) {
echo "error ".$error."\n";
echo "http_code ".$http_code."\n";
if (strlen($response) < 500) {
view_array(json_decode($response, true));
}
exit;
}
// save the audio file
if ($http_code == 200) {
file_put_contents($this->path.'/'.$this->filename, $response);
return true;
}
return false;
//$curl = new curl('https://api.elevenlabs.io/v1/text-to-speech/' . $this->voice);
//$response = $curl->set_headers($headers)->post(json_encode($data));
//$error = $curl->get_error();
//$http_code = $curl->get_http_code();
//if ($curl->get_http_code() == 200) {
//save the audio
//if ($http_code == 200) {
// file_put_contents($this->path . '/' . $this->filename, $response);
// return true;
//}
//return false;
}
public function is_language_enabled(): bool {
return false;
}
public function is_model_enabled(): bool {
return false;
}
public function get_languages(): array {
return ['en' => 'English'];
}
public function get_voices(): array {
$return_value = [];
$url = 'https://api.elevenlabs.io/v1/voices';
$headers = [
'Content-Type: application/json',
"xi-api-key: $this->speech_key",
];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$error = curl_error($curl);
curl_close($curl);
if (!empty($response)) {
$json_array = json_decode($response, true);
foreach($json_array['voices'] as $row) {
$voice_id = $row['voice_id'];
$name = $row['name'];
$gender = $row['labels']['gender'] ?? '';
$accent = $row['labels']['accent'] ?? '';
$use_case = $row['labels']['use case'] ?? '';
$recommended_model = $row['high_quality_base_model_ids'][0] ?? '';
$return_value[$voice_id] = "$name ($gender, $accent";
if (!empty($use_case)) {
$return_value[$voice_id] .= ", " . $use_case;
}
$return_value[$voice_id] .= ")";
if (!empty($recommended_model)) {
$return_value[$voice_id] .= " - $recommended_model";
}
}
}
return $return_value;
}
public function set_language(string $audio_language) {
$this->languages = $audio_language;
}
public function set_model(string $model): void {
if (array_key_exists($model, $this->get_models())) {
$this->model = $model;
}
}
public function get_model() {
//if the voice is not set return the default model
if (empty($this->voice)) {
return 'eleven_monolingual_v1';
}
//get the voices and automatically find the model
$url = 'https://api.elevenlabs.io/v1/voices';
$headers = [
'Content-Type: application/json',
"xi-api-key: $this->speech_key",
];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$error = curl_error($curl);
curl_close($curl);
if (!empty($response)) {
$json_array = json_decode($response, true);
foreach($json_array['voices'] as $row) {
if ($this->voice == $row['voice_id'] && !empty($row['high_quality_base_model_ids'][0])) {
return $row['high_quality_base_model_ids'][0];
}
}
return 'eleven_monolingual_v1';
}
}
public function get_models(): array {
return [
'eleven_monolingual_v1' => 'Default',
'eleven_turbo_v1' => 'Eleven Turbo v1',
'eleven_turbo_v2' => 'Eleven Turbo v2',
'eleven_multilingual_v1' => 'Eleven Multilingual v1',
'eleven_multilingual_v2' => 'Eleven Multilingual v2',
];
}
}
?>