Озвучка видео через TTS API: как встроить в конвейер монтажа


Если видео собирается из десятков коротких сцен, ручная озвучка быстро становится отдельной производственной задачей. text to speech api позволяет вынести генерацию реплик в тот же конвейер, где уже хранятся сценарий, тайминги и файлы исходников. Для тестов API-ключ можно получить в разделе API: при выпуске первого ключа на баланс начисляется 50 ₽.

Практический сценарий выглядит так: текстовый файл содержит реплики по сценам, скрипт отправляет их на озвучку, получает результат и передаёт аудио дальше на монтаж. У операции «Озвучка текста (tts)» цена составляет 18 ₽ за 1000 знаков, поэтому стоимость можно считать непосредственно из объёма сценария. Такой подход удобен, когда нужно выпускать не один ролик, а серию с одинаковой структурой.

Ниже разберём не саму запись голоса как отдельную операцию, а место TTS внутри производства: как разделить сценарий, что делать с таймингами, как сводить голос с музыкой и где закадровый голос нейросеть начинает звучать заметно искусственно.

Где в монтаже озвучка экономит больше всего времени

На небольшом ролике ручная запись кажется простой: открыть сценарий, прочитать текст, вырезать ошибки и положить дорожку на таймлайн. Проблема появляется при изменениях. Если сцена стала длиннее на 4 секунды или из текста убрали одно предложение, часть дорожки приходится перезаписывать и снова выравнивать относительно изображения.

В автоматизированном процессе исходным объектом становится не аудиофайл, а текст сцены. Изменили реплику — повторно отправили только эту сцену на TTS. Поэтому api озвучки видео полезно рассматривать как один из этапов сборки, а не как замену всей монтажной программе.

Например, сценарий может состоять из 20 сцен по 10–20 секунд. Для каждой сцены достаточно хранить идентификатор, начало, конец и текст:

{
  "scene": "scene_07",
  "start": 61.4,
  "end": 74.0,
  "text": "Перед экспортом проверьте громкость голоса и оставьте запас по пикам."
}

Такой формат позволяет независимо перегенерировать сцену. В готовом проекте можно заменить только её аудиофайл, не трогая остальные 19 сцен.

У API есть отдельная операция TTS: «Озвучка текста (tts)». Её стоимость — 18 ₽ за 1000 знаков, причём цены указаны за один запуск, а для TTS единица расчёта — 1000 знаков. Если сценарий содержит 8000 знаков, ориентир по стоимости восьми тысяч знаков составит 144 ₽ при условии восьми запусков по 1000 знаков; фактический способ разбиения текста на запросы стоит учитывать отдельно.

Операция Цена Единица
Озвучка текста (tts) 18 ₽ 1000 знаков
Расшифровка записи (stt) 10 ₽ запуск
Убрать шум (denoise) 36 ₽ запуск
Звук из видео (ytaudio) 0 ₽ запуск
Создать музыку (music) 59 ₽ запуск

Оплата идёт за запуск, без абонентской платы и минимального платежа. При выпуске первого ключа на баланс начисляется 50 ₽, поэтому небольшой конвейер можно сначала проверить на нескольких сценах.

Озвучка видео через TTS API: сцены и дорожки
Озвучка видео через TTS API: сцены и дорожки

Сценарий по сценам: формат, который удобно озвучивать

Главная ошибка при автоматизации — отправлять на озвучку весь сценарий целиком. Для монтажа полезнее заранее разделить текст на смысловые блоки. Граница сцены становится границей отдельной TTS-задачи, а монтаж получает набор коротких файлов вместо одного длинного голоса.

Минимальный формат можно сделать даже в JSON или CSV. Например, для JSON удобно использовать массив сцен:

[
  {
    "id": "01",
    "in": 0.0,
    "out": 8.5,
    "text": "Сначала покажем проблему крупным планом."
  },
  {
    "id": "02",
    "in": 8.5,
    "out": 17.0,
    "text": "Затем переходим к общему плану и объясняем последовательность действий."
  }
]

Поле id нужно для связи текста и результата. in и out задают ожидаемый интервал на таймлайне, а text содержит только то, что действительно должно быть произнесено.

Перед отправкой текста стоит убрать технические комментарии редактора, дубли заголовков и пометки вроде «здесь показать график». Их наличие в TTS-тексте приводит не к ошибке монтажа, а к лишним словам в аудио, что иногда обнаруживается только после сборки.

Если в одной сцене есть длинная фраза и короткая реплика, их тоже можно разделить. Например, сцену на 15 секунд разумно представить двумя блоками по 6 и 5 секунд, оставив несколько секунд под естественную паузу или действие в кадре.

Читать  Убрать шум с видео: съёмка в темноте и что с ней можно сделать

Сам API работает по схеме с отдельным запуском операции и проверкой результата. Базовый адрес — https://genius-bot.ru/wp-json/genius/v1, а для запуска используется POST /generate. Авторизация передаётся заголовком Authorization: Bearer <ключ>.

Конкретные поля тела запроса зависят от операции и должны соответствовать параметрам, которые API возвращает для доступной операции. Поэтому в автоматическом скрипте полезно сначала получить список операций через GET /services, а затем использовать параметры, указанные для TTS.

curl -X GET "https://genius-bot.ru/wp-json/genius/v1/services" \
  -H "Authorization: Bearer YOUR_API_KEY"

Такой запрос удобен как первый диагностический шаг: скрипт получает список операций и их цены, после чего можно проверить наличие tts до запуска производственной очереди.

Тайминги: как подогнать речь под длину сцены

В монтаже недостаточно получить корректно произнесённый текст. Голос должен помещаться в интервал, который отведён ему изображением. Если сцена заканчивается на 12-й секунде, а синтезированная реплика длится 15 секунд, простой сдвиг дорожки проблему не решает.

Поэтому после получения каждого результата нужно измерять длительность аудиофайла. Сценарий можно считать подходящим, если длительность голоса меньше либо примерно равна продолжительности сцены за вычетом заранее заложенной паузы.

Удобно использовать условие вида:

available = scene_out - scene_in
if voice_duration > available:
    mark_for_review(scene_id)
else:
    place_on_timeline(scene_id, scene_in)

Важно не превращать подгонку в агрессивное ускорение голоса. Если фраза регулярно не помещается, сначала сокращают текст или увеличивают длительность сцены. Иначе монтаж начинает зависеть от скорости речи, а не от смысла изображения.

Ещё один практический приём — резервировать небольшой интервал между сценами. Например, при сцене длиной 12 секунд можно целиться не в 12 секунд голоса, а в 10–11 секунд. Оставшееся время используется для естественного перехода, смены кадра или музыкального хвоста.

При пакетной обработке полезно автоматически разделять результаты на три состояния: «помещается», «требует проверки» и «явно не помещается». Тогда редактор не прослушивает все сцены подряд, а работает только с теми, где длительность отличается от расчётной.

Для небольших партий можно запускать задачи последовательно. Для большого количества сцен следует учитывать ограничение частоты: не больше 60 запросов в минуту на один ключ. Это относится к API-запросам, поэтому очередь должна учитывать не только количество TTS-сцен, но и обращения к /services, /balance и /tasks/{id}.

Подгонка длины речи под длительность сцены
Подгонка длины речи под длительность сцены

Сведение: громкость, паузы, музыка под голосом

После TTS начинается обычная работа со звуком. Синтезированную дорожку не стоит автоматически считать готовой финальной фонограммой: её нужно разместить на таймлайне, проверить пики, паузы и соотношение с музыкой.

Для конвейера удобно разделить процесс на три дорожки: голос, музыка и дополнительные звуки. Голос остаётся отдельным файлом для каждой сцены, музыка — непрерывной или разбитой на музыкальные блоки, а эффекты располагаются независимо.

Паузы лучше проектировать ещё на этапе сценария. Если диктор должен остановиться перед важной фразой, это должно отражаться в тексте или структуре сцены, а не исправляться случайным разрезанием готового аудио.

Синтез речи для роликов особенно чувствителен к соседним сценам. Если одна реплика заканчивается практически одновременно со сменой кадра, а следующая начинается без паузы, последовательность может восприниматься как слишком плотная. Иногда достаточно оставить 300–700 мс между смысловыми блоками, но точное значение зависит от темпа конкретного ролика.

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

Если в конвейере уже есть запись диктора, TTS можно использовать только для изменившихся фрагментов. Например, из 20 сцен сценария изменились 3. Вместо перезаписи всего ролика достаточно отправить на генерацию эти три сцены и заменить соответствующие аудиофайлы.

Для обратной задачи в API предусмотрена операция «Расшифровка записи (stt)» стоимостью 10 ₽ за запуск. Это позволяет включить расшифровку в процесс работы с уже записанными материалами, если требуется получить текстовую основу для дальнейшего редактирования.

Что выдаёт машинную озвучку и как это лечится

Самый заметный признак синтеза — одинаковая манера произнесения разных по смыслу предложений. Человек естественно меняет темп, делает паузу перед важным словом и перестраивает интонацию в зависимости от контекста. Машинный голос может соблюдать текст слишком буквально.

Читать  Улучшить качество видео нейросетью: что реально исправляется

Первое средство коррекции — сам сценарий. Короткие предложения проще контролировать по таймингу. Длинную конструкцию из трёх смысловых частей лучше разделить, если монтаж предполагает три разных кадра.

Второй признак — механические паузы. Когда каждая сцена имеет одинаковый ритм, ролик начинает звучать шаблонно. Помогает разная длина реплик и осознанное чередование коротких и длинных сцен.

Третий признак — несоответствие слов и изображения. Если на экране человек только начинает действие, а голос уже рассказывает его результат, проблема находится не в качестве синтеза, а в монтаже тайминга. В этом случае нужно менять границы сцены или текст, а не просто генерировать голос заново.

Четвёртый признак — чрезмерно идеальная дикция. Для объяснительного ролика это может быть приемлемо, но в более разговорном формате искусственность заметнее. Здесь особенно важно не маскировать проблему лишней обработкой: эквализация или компрессия не изменят интонационную структуру фразы.

Полезно также делать контрольную прослушку только после сборки с изображением. Отдельная TTS-фраза может звучать нормально, но в контексте видеоряда оказаться слишком быстрой, слишком длинной или плохо совпадать с визуальным акцентом.

Таким образом, закадровый голос нейросеть не стоит оценивать только по чистоте звука. Для монтажа важнее три параметра: соответствует ли текст сцене, укладывается ли речь в доступное время и сохраняется ли естественный ритм между соседними фрагментами.

Сведение голоса и музыки в ролике
Сведение голоса и музыки в ролике

Конвейер на десять роликов в день

Для серии из десяти роликов структура конвейера может быть простой. На вход поступают десять файлов сценариев, каждый сценарий разбит на сцены, а на выходе получается отдельная директория с аудио по идентификаторам сцен.

Первый этап — чтение сценариев и проверка структуры. Второй — запуск TTS-задач. Третий — опрос состояния через GET /tasks/{id}. Четвёртый — проверка длительности и сборка результатов с учётом таймингов.

Вместо постоянного опроса можно использовать webhook. При запуске операции передаётся необязательный параметр callback_url, и после готовности задачи API отправляет на этот адрес POST. Это позволяет не держать отдельный цикл проверки каждой задачи.

Минимальный пример на Python с библиотекой requests может выглядеть так:

import requests

BASE_URL = "https://genius-bot.ru/wp-json/genius/v1"
API_KEY = "YOUR_API_KEY"

headers = {
    "Authorization": f"Bearer {API_KEY}"
}

services = requests.get(
    f"{BASE_URL}/services",
    headers=headers,
    timeout=30
)
services.raise_for_status()

print(services.json())

Для самого запуска операции структура запроса должна соответствовать параметрам, которые возвращаются API для нужной операции. Поэтому в рабочем скрипте разумно не зашивать предположения о параметрах TTS, а сначала получить описание доступных операций и использовать его как источник актуальной конфигурации.

После запуска сохраняйте идентификатор задачи рядом с идентификатором сцены. Например, запись scene_07 → task_1842 позволяет однозначно определить, какой результат нужно поставить на таймлайн после завершения обработки.

jobs = {
    "scene_01": "task_1840",
    "scene_02": "task_1841",
    "scene_07": "task_1842"
}

for scene_id, task_id in jobs.items():
    response = requests.get(
        f"{BASE_URL}/tasks/{task_id}",
        headers=headers,
        timeout=30
    )
    response.raise_for_status()
    print(scene_id, response.json())

Для десяти роликов стоит добавить локальную очередь. Она должна хранить текст сцены, идентификатор задачи, статус, длительность результата и отметку о прохождении проверки. При повторном запуске скрипт сможет продолжить работу с последнего успешного этапа, а не генерировать уже готовые сцены повторно.

Также полезно контролировать баланс. Для этого предусмотрен GET /balance. Если сценарии обрабатываются пакетами, проверку остатка можно выполнять перед запуском очереди и после каждой крупной партии.

Авторизация одинакова для этих запросов: используется заголовок Authorization: Bearer <ключ>. Сам ключ выдаётся в разделе API после входа и показывается один раз, поэтому его стоит хранить в переменной окружения или секрет-хранилище, а не записывать непосредственно в сценарий или исходный код.

Если часть вашего приложения уже использует клиентскую библиотеку OpenAI, для чатовых операций предусмотрена совместимость с форматом OpenAI: доступны POST /chat/completions и GET /models, а в клиенте достаточно изменить base_url и ключ. Тариф на чат составляет 40 ₽ за миллион токенов запроса и 400 ₽ за миллион токенов ответа. Для TTS при этом используется отдельная операция с тарифом 18 ₽ за 1000 знаков.

В результате конвейер можно представить как последовательность: сценарий → сцены → TTS-задачи → готовые аудиофайлы → проверка длительности → монтаж → сведение. Такая схема особенно удобна при серийном производстве, потому что изменение одной реплики не требует повторять весь процесс.

Читать  Восстановить старое видео: семейный архив, VHS и оцифровка

Частые вопросы

Сколько стоит озвучка текста через API?

Операция «Озвучка текста (tts)» стоит 18 ₽ за 1000 знаков. Цены указаны за один запуск, а для TTS единицей расчёта являются 1000 знаков.

Как авторизоваться в API?

Нужно передавать заголовок Authorization: Bearer <ключ>. Ключ выдаётся после входа в разделе API и показывается один раз.

Можно ли получать уведомление о готовности озвучки?

Да. При запуске задачи можно передать необязательный параметр callback_url. После готовности API отправляет POST на указанный адрес.

Как проверить состояние TTS-задачи?

Для этого используется маршрут GET /tasks/{id}, где {id} — идентификатор созданной задачи.

Есть ли ограничение на количество запросов?

На один API-ключ допускается не больше 60 запросов в минуту. Для пакетной обработки это нужно учитывать при формировании очереди и проверок статуса.

Где посмотреть доступные операции и цены?

Список операций и цен возвращает GET /services. Актуальные параметры подключения и раздел для получения ключа доступны в разделе API сервиса.

API для разработчиковОзвучка, музыка, видео и картинки одним ключом. Пробный баланс при выпуске.
Получить ключ