Update AI text speech
- elevenlabs - update curl code - automatically determine the model
This commit is contained in:
@@ -1,30 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
|
||||||
FusionPBX
|
|
||||||
Version: MPL 1.1
|
|
||||||
|
|
||||||
The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
1.1 (the "License"); you may not use this file except in compliance with
|
|
||||||
the License. You may obtain a copy of the License at
|
|
||||||
http://www.mozilla.org/MPL/
|
|
||||||
|
|
||||||
Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
for the specific language governing rights and limitations under the
|
|
||||||
License.
|
|
||||||
|
|
||||||
The Original Code is FusionPBX
|
|
||||||
|
|
||||||
The Initial Developer of the Original Code is
|
|
||||||
Mark J Crane <markjcrane@fusionpbx.com>
|
|
||||||
Portions created by the Initial Developer are Copyright (C) 2008-2018
|
|
||||||
the Initial Developer. All Rights Reserved.
|
|
||||||
|
|
||||||
Contributor(s):
|
|
||||||
Mark J Crane <markjcrane@fusionpbx.com>
|
|
||||||
Tim Fry <tim.fry@hotmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ai_elevenlabs class
|
* ai_elevenlabs class
|
||||||
@@ -74,46 +49,88 @@ class ai_elevenlabs implements ai_speech {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function speech(): bool {
|
public function speech(): bool {
|
||||||
$model_id = $this->model;
|
|
||||||
$ch = curl_init('https://api.elevenlabs.io/v1/text-to-speech/' . $this->voice);
|
//get the model automatically
|
||||||
$headers = [
|
$model_id = $this->get_model();
|
||||||
'Content-Type: application/json',
|
|
||||||
"xi-api-key: $this->speech_key",
|
// set the request URL
|
||||||
];
|
$url = 'https://api.elevenlabs.io/v1/text-to-speech/' . $this->voice;
|
||||||
$encoded_message = json_encode([
|
|
||||||
'model_id' => $model_id,
|
// set the request headers
|
||||||
'text' => $this->message,
|
$headers[] = 'Content-Type: application/json';
|
||||||
'voice_settings' => [
|
$headers[] = 'xi-api-key: '.$this->speech_key;
|
||||||
'similarity_boost' => 1,
|
|
||||||
'stability' => 1,
|
// 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_RETURNTRANSFER, true);
|
||||||
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
||||||
curl_setopt($ch, CURLOPT_POST, true);
|
curl_setopt($ch, CURLOPT_POST, true);
|
||||||
curl_setopt($ch, CURLOPT_POSTFIELDS, $encoded_message);
|
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||||
|
|
||||||
|
// run the curl request and get the response
|
||||||
$response = curl_exec($ch);
|
$response = curl_exec($ch);
|
||||||
|
|
||||||
|
// get the errors
|
||||||
$error = curl_error($ch);
|
$error = curl_error($ch);
|
||||||
|
|
||||||
|
// get the http code
|
||||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||||
|
|
||||||
|
// close the handle
|
||||||
curl_close($ch);
|
curl_close($ch);
|
||||||
// $curl = new curl('https://api.elevenlabs.io/v1/text-to-speech/' . $this->voice);
|
|
||||||
// $response = $curl->set_headers($headers)->post($encoded_message);
|
// show the result when there is an error
|
||||||
// $error = $curl->get_error();
|
if ($http_code != 200) {
|
||||||
// $http_code = $curl->get_http_code();
|
echo "error ".$error."\n";
|
||||||
// if ($curl->get_http_code() == 200) {
|
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) {
|
if ($http_code == 200) {
|
||||||
file_put_contents($this->path . '/' . $this->filename, $response);
|
file_put_contents($this->path.'/'.$this->filename, $response);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
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 {
|
public function is_language_enabled(): bool {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function is_model_enabled(): bool {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public function get_languages(): array {
|
public function get_languages(): array {
|
||||||
return ['english' => 'English'];
|
return ['en' => 'English'];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function get_voices(): array {
|
public function get_voices(): array {
|
||||||
@@ -167,13 +184,49 @@ class ai_elevenlabs implements ai_speech {
|
|||||||
public function set_model(string $model): void {
|
public function set_model(string $model): void {
|
||||||
if (array_key_exists($model, $this->get_models())) {
|
if (array_key_exists($model, $this->get_models())) {
|
||||||
$this->model = $model;
|
$this->model = $model;
|
||||||
} else {
|
|
||||||
throw new \Exception('Model does not exist');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 {
|
public function get_models(): array {
|
||||||
return [
|
return [
|
||||||
|
'eleven_monolingual_v1' => 'Default',
|
||||||
'eleven_turbo_v1' => 'Eleven Turbo v1',
|
'eleven_turbo_v1' => 'Eleven Turbo v1',
|
||||||
'eleven_turbo_v2' => 'Eleven Turbo v2',
|
'eleven_turbo_v2' => 'Eleven Turbo v2',
|
||||||
'eleven_multilingual_v1' => 'Eleven Multilingual v1',
|
'eleven_multilingual_v1' => 'Eleven Multilingual v1',
|
||||||
@@ -181,3 +234,5 @@ class ai_elevenlabs implements ai_speech {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ai class
|
* ai class
|
||||||
*
|
*
|
||||||
@@ -18,6 +19,7 @@ if (!class_exists('ai_openai')) {
|
|||||||
private $format;
|
private $format;
|
||||||
private $voice;
|
private $voice;
|
||||||
private $message;
|
private $message;
|
||||||
|
private $model;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* called when the object is created
|
* called when the object is created
|
||||||
@@ -162,7 +164,7 @@ if (!class_exists('ai_openai')) {
|
|||||||
'Content-Type: application/json'
|
'Content-Type: application/json'
|
||||||
];
|
];
|
||||||
|
|
||||||
// Set the request data format, wav, mp3, opus
|
// set the http data
|
||||||
$data['model'] = 'tts-1-hd';
|
$data['model'] = 'tts-1-hd';
|
||||||
$data['input'] = $this->message;
|
$data['input'] = $this->message;
|
||||||
$data['voice'] = $this->voice;
|
$data['voice'] = $this->voice;
|
||||||
@@ -250,7 +252,22 @@ if (!class_exists('ai_openai')) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function set_model(string $model): void {
|
||||||
|
if (array_key_exists($model, $this->get_models())) {
|
||||||
|
$this->model = $model;
|
||||||
|
} else {
|
||||||
|
throw new \Exception('Model does not exist');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function get_models(): array {
|
||||||
|
return [
|
||||||
|
'tts-1-hd' => 'tts-1-hd'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
Reference in New Issue
Block a user