Настройка elevenlabs по API

Germango

Client
Регистрация
30.07.2013
Сообщения
37
Благодарностей
26
Баллы
18
Привет,
помогите пожалуйста настроить генерацию текста в речь по API.

Документация на странице https://elevenlabs.io/docs/api-reference/text-to-speech
Если в конструкторе на странице указываю значения, то все ОК - аудио создается.
А в ZennoPoster кубике C# ошибки.

Значения, которые указываю на странице конструктора (рабочие):
xi-api-key: sk_1d790cb72acf040d4f73c8876d1e87c86f74d183314c9697
voice_id: JBFqnCBsd6RMkjVDRZzb
text: Hello, this is a test synthesis.
stability: 1.0
similarity_boost: 1.0

Проект в приложении

Код С#
C#:
using System;
using System.Net;
using System.Text;
using System.IO;

public class Program
{
    public static void Execute()
    {
        string apiKey = "sk_1d790cb72acf040d4f73c8876d1e87c86f74d183314c9697"; // Ваш API-ключ
        string url = "https://api.elevenlabs.io/v1/text-to-speech/JBFqnCBsd6RMkjVDRZzb";
        string outputPath = @"D:\YouTube\OutputFile.mp3"; // Путь для сохранения аудиофайла

        // Формируем данные для запроса
        string requestData = "{\"text\":\"It sure does, Jackie… My mama always said: 'In Carolina, the air's so thick you can wear it!'\", \"voice_id\":\"JBFqnCBsd6RMkjVDRZzb\", \"voice_settings\":{\"stability\":0.1, \"similarity_boost\":0.3, \"style\":0.2}, \"optimize_streaming_latency\":\"zero\", \"output_format\":\"mp3_22050\"}";

        using (WebClient client = new WebClient())
        {
            client.Headers.Add("xi-api-key", apiKey);
            client.Headers.Add("Content-Type", "application/json");

            try
            {
                // Отправляем POST-запрос
                byte[] responseBytes = client.UploadData(url, "POST", Encoding.UTF8.GetBytes(requestData));

                // Сохраняем ответ (аудиофайл) на диск
                File.WriteAllBytes(outputPath, responseBytes);
                
                // Логируем успешное завершение
                project.SendInfoToLog("Аудио успешно сгенерировано и сохранено в " + outputPath, true);
            }
            catch (WebException ex)
            {
                // Логируем ошибку
                project.SendErrorToLog("Ошибка при запросе к API: " + ex.Message);
            }
        }
    }
}
 

Вложения

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
в экшенах нельзя прописывать юзинги, классы и т.д.
C#:
        string apiKey = "sk_1d790cb72acf040d4f73c8876d1e87c86f74d183314c9697"; // Ваш API-ключ
        string url = "https://api.elevenlabs.io/v1/text-to-speech/JBFqnCBsd6RMkjVDRZzb";
        string outputPath = @"D:\YouTube\OutputFile.mp3"; // Путь для сохранения аудиофайла

        // Формируем данные для запроса
        string requestData = "{\"text\":\"It sure does, Jackie… My mama always said: 'In Carolina, the air's so thick you can wear it!'\", \"voice_id\":\"JBFqnCBsd6RMkjVDRZzb\", \"voice_settings\":{\"stability\":0.1, \"similarity_boost\":0.3, \"style\":0.2}, \"optimize_streaming_latency\":\"zero\", \"output_format\":\"mp3_22050\"}";

        using (WebClient client = new WebClient())
        {
            client.Headers.Add("xi-api-key", apiKey);
            client.Headers.Add("Content-Type", "application/json");

            try
            {
                // Отправляем POST-запрос
                byte[] responseBytes = client.UploadData(url, "POST", Encoding.UTF8.GetBytes(requestData));

                // Сохраняем ответ (аудиофайл) на диск
                File.WriteAllBytes(outputPath, responseBytes);
                
                // Логируем успешное завершение
                project.SendInfoToLog("Аудио успешно сгенерировано и сохранено в " + outputPath, true);
            }
            catch (WebException ex)
            {
                // Логируем ошибку
                project.SendErrorToLog("Ошибка при запросе к API: " + ex.Message);
            }
        }
 

Germango

Client
Регистрация
30.07.2013
Сообщения
37
Благодарностей
26
Баллы
18

Germango

Client
Регистрация
30.07.2013
Сообщения
37
Благодарностей
26
Баллы
18
Не актуально, справился с кодом.
 

inbizin

Client
Регистрация
09.08.2018
Сообщения
9
Благодарностей
0
Баллы
1

Germango

Client
Регистрация
30.07.2013
Сообщения
37
Благодарностей
26
Баллы
18
Привет! Можешь поделиться? а то я совместно с чатом гпт довести до ума тоже не могу никак)
Привет, вот код одного из кубиков:
C#:
string apiKey = "sk_111"; // Ваш API-ключ
string url = "https://api.elevenlabs.io/v1/text-to-speech/FGY2WhTYpPnrIDTdsKH5";

string nomerstrokizvuk = project.Variables["nomerkviza"].Value;
string q1 = project.Variables["q1"].Value;

// Формируем имя файла
string outputFileName = nomerstrokizvuk + "-" + q1 + ".mp3";

// Полный путь для сохранения аудиофайла
string outputPath = @"D:\YouTube\" + outputFileName;



// Получаем значение переменной
string textToSynthesize = project.Variables["q1_1"].Value;

// Формируем данные для запроса
string requestData = "{\"text\":\"" + textToSynthesize + "\", \"voice_id\":\"JBFqnCBsd6RMkjVDRZzb\", \"voice_settings\":{\"stability\":1.0, \"similarity_boost\":0.8, \"style\":0.7}, \"optimize_streaming_latency\":\"zero\", \"output_format\":\"mp3_22050\"}";

var client = new System.Net.WebClient();
client.Headers.Add("xi-api-key", apiKey);
client.Headers.Add("Content-Type", "application/json");

try
{
    // Отправляем POST-запрос
    byte[] responseBytes = client.UploadData(url, "POST", System.Text.Encoding.UTF8.GetBytes(requestData));

    // Сохраняем ответ (аудиофайл) на диск
    System.IO.File.WriteAllBytes(outputPath, responseBytes);

    // Логируем успешное завершение
    project.SendInfoToLog("Аудио успешно сгенерировано и сохранено в " + outputPath, true);
}
catch (System.Net.WebException ex)
{
    // Логируем ошибку
    project.SendErrorToLog("Ошибка при запросе к API: " + ex.Message);

    // Проверяем, является ли ошибка 401 (несанкционированный доступ)
    if (ex.Message.Contains("(401)"))
    {
        // Генерируем исключение для прерывания сценария
        throw new Exception("Сценарий остановлен из-за ошибки 401: Несанкционированный доступ");
    }
}
Вот альтернатива для apihost (там дешевле, но голос надо подобрать ибо основная масса роботизированные)
C#:
var url = "https://apihost.ru/api/v1/synthesize";
string textToSynthesize = project.Variables["q1_1"].Value; // текст для озвучки
var payload = "{\"data\": {\"lang\": \"en-US\", \"speaker\": \"292\", \"emotion\": \"neutral\", \"text\": \"" + textToSynthesize + "\", \"rate\": \"1.0\", \"pitch\": \"1.1\", \"type\": \"mp3\", \"pause\": \"0\"}}";

string nomerstrokizvuk = project.Variables["nomerstrokizvuk"].Value;
string q1 = project.Variables["q1"].Value;
string myapi = project.Variables["myapi"].Value;  // API
var headers = new System.Collections.Specialized.NameValueCollection();
headers.Add("Authorization", "Bearer " + myapi);
headers.Add("Content-Type", "application/json");

// Путь для сохранения лог файла на диск
string projectname = project.Variables["projectname"].Value;
string projectnumber = project.Variables["projectnumber"].Value;
string dir = project.Directory;   
var logFilePath = dir + "\\" + projectnumber + " " +  projectname + "\\Dubbing\\log.txt";

try
{
    using (var client = new System.Net.WebClient())
    {
        client.Headers.Add(headers);
        byte[] responseBytes = client.UploadData(url, "POST", System.Text.Encoding.UTF8.GetBytes(payload));
        string response = System.Text.Encoding.UTF8.GetString(responseBytes);

        // Запись строки в файл
        System.IO.File.AppendAllText(logFilePath, response + "\n");

        // Логируем ответ от сервера
        project.SendInfoToLog(response, true);
    }
}
catch (System.Net.WebException ex)
{
    project.SendErrorToLog("Ошибка при запросе: " + ex.Message);
    
    // Проверяем, содержит ли ошибка "Too Many Requests" или "Невозможно соединиться с удаленным сервером"
    if (ex.Message.Contains("(429) Too Many Requests") || ex.Message.Contains("Невозможно соединиться с удаленным сервером"))
    {
        // Останавливаем выполнение скрипта
        throw new Exception("Скрипт остановлен из-за ошибки: " + ex.Message);
    }
}

// Чтение последней строки из файла и запись в переменную
var lines = System.IO.File.ReadAllLines(logFilePath);
if (lines.Length > 0)
{
    project.Variables["responseLogq1"].Value = lines[lines.Length - 1];
}
В целом у меня скрипт выглядит подобным на скриншоте образом. Применял его для создания таких шортс.
 

Вложения

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)