Fish Audio S2 Pro: Быстрый старт с клонированием голоса и многоязычным TTS

Fish Audio S2 Pro: Быстрый старт с клонированием голоса и многоязычным TTS

Fish Audio S2 Pro доступен на Novita AI как размещенный TTS API без холодного старта. Это краткое руководство охватывает путь разработчика: получите ваш API-ключ, подтвердите эндпоинт, отправьте ваш первый TTS-запрос с клонированным голосом и разберитесь в параметрах, важных для клонирования голоса и управления эмоциями. S2 Pro построен на Dual-Autoregressive архитектуре, обученной на большом многоязычном корпусе — функция, которая отличает его от обычных TTS, заключается в том, что каждый клонированный вами голос работает во всех поддерживаемых языках без переобучения.

Когда использовать это руководство

Используйте это руководство, если вам нужно:

  • Синтезировать речь из текста на широком спектре поддерживаемых языков, используя клонированный голос.
  • Клонировать голос из аудиосэмпла длительностью 10–30 секунд и повторно использовать его в запросах без дополнительной платы за каждый запрос.
  • Управлять просодией и эмоциями в тексте с помощью тегов в квадратных скобках на естественном языке ([whisper], [excited]).
  • Создавать пайплайны, которым требуется многоязычный TTS без отдельных интеграций для каждого языка.

Если вам нужен только базовый английский TTS со встроенными голосами без клонирования, сначала оцените модель Fish Audio S1 или GLM TTS — преимущество S2 Pro проявляется, когда требуется кросс-языковое клонирование или точное управление эмоциями.

Шаг 1: Получите ваш Novita API-ключ

Создайте учетную запись Novita AI и сгенерируйте API-ключ в консоли Novita AI. Сохраните его как переменную окружения:

export NOVITA_API_KEY="your_api_key_here"

Не размещайте ключ в клиентском коде, frontend-сборках и публичных репозиториях.

Шаг 2: Подтвердите модель и эндпоинт

Документация Novita AI для Fish Audio S2 Pro TTS находится в справочнике API Fish Audio S2 Pro. Перед написанием кода проверьте текущий путь к эндпоинту и идентификатор модели — URL размещенного эндпоинта и схема запроса подтверждены в этом справочнике.

Для клонирования голоса в workflow используются три эндпоинта Novita:

Шаг Метод Эндпоинт
Загрузка аудиосэмпла POST https://api.novita.ai/v1/files
Создание клона (асинхронно) POST https://api.novita.ai/v1/async/voice-cloning
Опрос результата GET https://api.novita.ai/v1/async/task-result
TTS с клонированным голосом POST https://api.novita.ai/v4beta/txt2speech

Для клонирования голоса на этапе создания клона используется модель fish-audio-voice-cloning, отдельная от TTS-модели.

Шаг 3: Клонируйте голос

Клонирование голоса состоит из трех API-вызовов: загрузите короткий аудиосэмпл, создайте клон, затем получите voice_id. Получив voice_id, вы можете повторно использовать его в TTS-запросах неограниченное количество раз без дополнительной платы.

Требования к аудиосэмплу:

  • Длительность: 10–30 секунд для наилучших результатов
  • Формат: MP3 или WAV
  • Содержание: Чистая речь с минимальным фоновым шумом
  • Транскрипт: Предоставление точного произнесенного текста повышает точность клонирования

Python: Полный workflow клонирования

import base64
import os
import time
import requests

API_KEY = os.environ["NOVITA_API_KEY"]
BASE_URL = "https://api.novita.ai"

# Шаг 1: Загрузка аудиофайла
with open("voice_sample.mp3", "rb") as f:
    encoded_audio = base64.b64encode(f.read()).decode("utf-8")

upload_response = requests.post(
    f"{BASE_URL}/v1/files",
    headers={
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    },
    json={
        "file": encoded_audio,
        "purpose": "voice-cloning",
    },
)
upload_response.raise_for_status()
file_id = upload_response.json()["file_id"]
print(f"ID загруженного файла: {file_id}")

# Шаг 2: Создание клона голоса
clone_response = requests.post(
    f"{BASE_URL}/v1/async/voice-cloning",
    headers={
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    },
    json={
        "model": "fish-audio-voice-cloning",
        "audio_file_id": file_id,
        "text": "Текст, произнесенный в аудиосэмпле.",
    },
)
clone_response.raise_for_status()
task_id = clone_response.json()["task_id"]
print(f"ID задачи клонирования: {task_id}")

# Шаг 3: Опрос для получения voice_id
voice_id = None
while True:
    result = requests.get(
        f"{BASE_URL}/v1/async/task-result",
        headers={"Authorization": f"Bearer {API_KEY}"},
        params={"task_id": task_id},
    ).json()
    if result["status"].endswith("SUCCEED"):
        voice_id = result["result"]["voice_id"]
        print(f"ID клонированного голоса: {voice_id}")
        break
    elif "FAILED" in result["status"]:
        raise RuntimeError(f"Клонирование не удалось: {result}")
    time.sleep(2)

Сохраните voice_id. Вы будете использовать его как reference_id в каждом TTS-вызове.

cURL: Создание клона (после загрузки файла)

curl -s -X POST https://api.novita.ai/v1/async/voice-cloning \
  -H "Authorization: Bearer $NOVITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "fish-audio-voice-cloning",
    "audio_file_id": "YOUR_FILE_ID",
    "text": "Текст, произнесенный в аудиосэмпле."
  }'

Шаг 4: Отправьте TTS-запрос

После получения voice_id из Шага 3 передайте его как reference_id в TTS-запросе. Модель сгенерирует речь клонированным голосом.

Python

import os
import requests

API_KEY = os.environ["NOVITA_API_KEY"]
VOICE_ID = "your_cloned_voice_id"  # из Шага 3

response = requests.post(
    "https://api.novita.ai/v4beta/txt2speech",
    headers={
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    },
    json={
        "text": "Добро пожаловать в демонстрацию. Этот голос был клонирован из короткого аудиосэмпла.",
        "reference_id": VOICE_ID,
        "format": "mp3",
        "sample_rate": 44100,
    },
)
response.raise_for_status()
audio_url = response.json()["audio_url"]
print(f"URL аудио: {audio_url}")

cURL

curl -s -X POST https://api.novita.ai/v4beta/txt2speech \
  -H "Authorization: Bearer $NOVITA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Добро пожаловать в демонстрацию. Этот голос был клонирован из короткого аудиосэмпла.",
    "reference_id": "YOUR_CLONED_VOICE_ID",
    "format": "mp3",
    "sample_rate": 44100
  }'

Ответ содержит audio_url — предварительно подписанный URL, указывающий на сгенерированный аудиофайл.

Шаг 5: Проверьте цены, лимиты и распространенные ошибки

Цены (актуальные тарифы смотрите на novita.ai/pricing):

Операция Цена
Генерация TTS ~$15.00 / 1M символов
Клонирование голоса $0.10 за голос (единоразово)

Клонирование голоса оплачивается один раз за клон, а не за каждый TTS-запрос. После клонирования использование voice_id в TTS-вызовах оплачивается только по символьному тарифу TTS.

Лимиты на запрос:

Лимит Значение
Максимальная длина ввода 10 000 символов
Рекомендуемая длительность сэмпла для клонирования 10–30 секунд
Поддерживаемые выходные форматы mp3, opus, wav, pcm
Частота дискретизации аудио До 44 100 Гц

Распространенные ошибки:

Ошибка Причина Исправление
401 Unauthorized Неверный или отсутствующий API-ключ Проверьте, что NOVITA_API_KEY установлен и корректен
400 Bad Request при загрузке файла Аудиофайл слишком большой или неверного формата Используйте MP3/WAV, держите размер в пределах нескольких МБ
Статус задачи клонирования FAILED Аудиосэмпл слишком короткий или слишком шумный Используйте 10–30 с чистой речи
Пустое или неразборчивое аудио Поле text пустое или превышает лимит Держите ввод в пределах 10 000 символов

Теги управления эмоциями

S2 Pro поддерживает встроенные теги в виде [bracket], которые управляют тем, как модель произносит определенные слова или фразы. Они интерпретируются как инструкции на естественном языке во время генерации — вы не ограничены фиксированным списком токенов.

text_with_emotion = (
    "[cheerful] С возвращением! [pause] "
    "Я очень рад, что вы здесь. "
    "[whisper] Между нами, это часть секретна. [normal] "
    "В любом случае, давайте начнем."
)

response = requests.post(
    "https://api.novita.ai/v4beta/txt2speech",
    headers={
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    },
    json={
        "text": text_with_emotion,
        "reference_id": VOICE_ID,
        "format": "mp3",
        "sample_rate": 44100,
    },
)

Примеры тегов, которые понимает модель:

Тег Эффект
[whisper] Шепот
[excited] Более высокая энергия, ускоренный темп
[calm] Замедленный, размеренный тон
[laughs] Смех, встроенный в речь
[professional broadcast tone] Стиль диктора новостей
[pitch up] Повышение тона для следующего текста
[pause] Короткая пауза

Теги представляют собой свободные описания, а не фиксированные значения перечисления. Модель изучила соответствия тегов акустическим характеристикам из обучающих данных, поэтому описательные фразы также работают. Экспериментируйте с конкретными тегами для вашего случая использования; результаты могут варьироваться при необычных формулировках.

Ключевые параметры

Параметр Тип Примечания
text string Обязательно. До 10 000 символов.
reference_id string Обязательно. ID голосовой модели — клонированный voice_id или ссылка на системный голос.
format string Выходной формат: mp3, opus, wav, pcm. По умолчанию: mp3.
sample_rate integer Частота дискретизации аудио в Гц. 44100 рекомендуется для высокого качества.
temperature number Управляет случайностью генерации. Выше = более разнообразная просодия.
top_p number Порог nucleus sampling.

Полную схему параметров и любые дополнительные опции, специфичные для S2 Pro, смотрите в справочнике API Novita AI Fish Audio S2 Pro.

Устранение неполадок

Клонированный голос звучит роботизированно или непоследовательно. Вероятно, сэмпл был слишком коротким или содержал фоновый шум. Запишите чистый 20–30-секундный отрезок с ровным темпом и без наложений. Предоставление точной текстовой транскрипции сэмпла в запросе на клонирование улучшает выравнивание фонем.

URL аудио возвращает 404 после опроса. Предварительно подписанные URL имеют срок действия. Загрузите или обработайте аудио сразу после получения URL.

Теги эмоций не дают ожидаемого эффекта. Поведение тегов зависит от распределения обучающих данных. Попробуйте более описательные формулировки — например, [very softly, barely audible] вместо [quiet]. Некоторые теги будут работать лучше других; сначала тестируйте с короткими вводами.

Статус задачи клонирования остается в состоянии ожидания. Добавьте интервал опроса (1–2 секунды между проверками), чтобы избежать ограничения скорости на эндпоинт результата задачи. Если задача остается в ожидании более двух минут, проверьте шаг загрузки файла — возможно, file_id истек.

Необходимо использовать один и тот же голос для разных языков. Передайте тот же voice_id с текстом на любом поддерживаемом языке. S2 Pro применяет тембр клонированного голоса к новому языку без необходимости отдельного клонирования. Проверьте справочник API S2 Pro для получения актуального списка поддерживаемых языков.

Часто задаваемые вопросы

Чем S2 Pro отличается от Fish Audio S1? S2 Pro использует более крупную Dual-Autoregressive архитектуру, обученную на обширном многоязычном корпусе. Практические различия: более широкая языковая поддержка, встроенное управление эмоциями через теги в квадратных скобках и возможность многоголосого синтеза, отсутствующая в S1. Смотрите справочник API S2 Pro для актуального списка языков.

Можно ли клонировать голос один раз и использовать его для всех поддерживаемых языков? Да. Голос, клонированный из англоязычного сэмпла, может генерировать речь на японском, испанском, арабском или любом другом поддерживаемом языке с использованием того же voice_id. Модель переносит тембр голоса между языками без дополнительного обучения.

Какой длины должен быть голосовой сэмпл? 10–30 секунд чистой, ровной речи. Более короткие сэмплы могут работать, но дают менее стабильные результаты. Сэмплы длиннее 30 секунд значимо не улучшают качество клонирования.

Взимается ли плата за клонирование голоса за каждый TTS-запрос? Нет. Плата в размере $0.10 за клонирование голоса является единоразовой за каждый клон. После создания использование этого voice_id в TTS-запросах оплачивается только по символьному тарифу TTS.

Что произойдет, если я пропущу reference_id? Проверьте справочник API S2 Pro для получения информации о текущем поведении по умолчанию — модель может использовать голос по умолчанию или требовать reference.

Как получить API-ключ? Зарегистрируйтесь на novita.ai и сгенерируйте ключ в консоли Novita AI.

Рекомендуемые статьи