Как добавить озвучку и субтитры в видеопроект Opus 5.5

Синхронизируйте закадровый голос и субтитры по предложениям в проекте Remotion, созданном с Opus 5.5. Готовые MP4, WAV, SRT и исходники, проверка тайминга и исправление рассинхрона.

Линейный рисунок метронома на светлой бумаге на шалфейно-зелёном фоне, оранжевые полосы и надпись Opus 5.5

Чтобы добавить озвучку и субтитры в видео Opus 5.5, относитесь к таймингу звука как к данным проекта. Создайте или запишите озвучку, измерьте её, сопоставьте каждое предложение с временной шкалой, затем отрендерите звук и субтитры вместе. Попросить модель «синхронизировать субтитры», не дав ей реального тайминга, недостаточно.

В этом руководстве используется тот же проект на реальных скриншотах, что и в нашем руководстве по демо продукта. Можно начать с его файлов для скачивания, не проходя сначала ту статью. Цель — 30-секундный MP4 с озвучкой, читаемыми субтитрами по предложениям, редактируемым источником тайминга и отдельным SRT, а не новая подборка промптов или непроверенное обещание автоматического дубляжа.

Посмотрите и изучите пример со звуком

Реальный экспорт Remotion с английским синтетическим эталонным голосом. Голос намеренно служит вспомогательным средством для проверки тайминга, а не демонстрацией профессионального качества озвучки. Субтитры выводятся целыми предложениями и включают паузы для чтения.

Скачайте полный проект, MP4 с озвучкой, эталонный WAV и английский SRT. Статьи на пяти языках используют этот общий английский пример; мы не выдаём его за пять локализованных аудиоверсий. Поэтому озвучка, субтитры и интерфейс в роликах остаются на английском.

В реальном вызове модели использовался claude-opus-5-5 в официальном Claude Code от Anthropic для генерации кода Remotion. Модель получила имена файлов и текстовые инструкции к сценам, а не пиксели изображений или аудиозапись. Затем мы добавили реальные исходные снимки, сгенерировали эталонный голос с помощью eSpeak NG, исправили код и отрендерили видео локально. Такое разделение труда — основа руководства: Opus написал код, синтезатор речи создал звук, Remotion собрал итоговый файл.

Выберите подходящий способ работы с таймингом

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

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

Исходный материалРекомендуемый подходГлавный риск
Утверждённая непрерывная озвучкаИзмерьте или расшифруйте её, затем расставьте визуальный ряд и субтитры по реальной речиУгадывание тайминга предложений по количеству слов
Видео продукта фиксированной длиныНапишите короткие предложения для каждой сцены; измерьте каждую записьСкомканное или обрезанное предложение ради фиксированной склейки
Готовое видео с речьюПолучите временные метки из реальной звуковой дорожки, затем проверьте ихАвтоматическая расшифровка, принятая за проверенный файл субтитров
Многоязычная версияПерезапишите и заново разметьте по времени каждый языкПовторное использование английского тайминга, хотя длительность речи изменилась

Документация Remotion по субтитрам описывает импорт, отображение и экспорт субтитров. В этом проекте намеренно используется небольшое JSON-расписание предложений, чтобы тайминг был на виду и легко проверялся. Автоматическая расшифровка и принудительное выравнивание (forced alignment) здесь не выполняются.

Начните с готового голоса, затем замените его

Установите Node.js и npm перед запуском проекта. Для необязательных проверок медиафайлов в терминале, описанных ниже, также нужна отдельная установка FFmpeg, включая ffprobe; npm ci эту консольную команду не устанавливает. Рендерить можно через готовые скрипты npm, не используя необязательные команды проверки.

Распакуйте архив и запустите проект из его корня:

npm ci
npm start

Выберите DemoNarrated. В архиве уже есть public/narration.wav, поэтому для рендера не нужно устанавливать синтезатор речи или покупать голосовой сервис. Проверьте первое предложение в начале, предложение о документации около 13-й секунды и последнее предложение около 27-й секунды.

Реальный Remotion Studio с композицией с озвучкой, субтитром и звуковой дорожкой на временной шкале

Реальное превью проекта со звуковой дорожкой WAV. Видимая волновая форма доказывает, что звук в проекте есть; качество произношения и выравнивание по словам она не подтверждает.

Чтобы воспроизвести эталонный голос, установите eSpeak NG способом, описанным в документации для вашей системы, и выполните:

python3 scripts/make_audio.py
npm run render:narrated

Мы использовали eSpeak NG 1.52.0, голос en-us и скорость 190 слов в минуту. Этот формантный голос намеренно звучит синтетически. Он удобен для проверки временной шкалы до выбора финальной озвучки; число — это настройка инструмента, а не гарантия одинакового темпа речи в каждом предложении.

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

Одно расписание для WAV, субтитров и SRT

Откройте scripts/make_audio.py. Его массив LINES — эталонный источник: у каждой записи есть время начала, время окончания субтитра и текст. Скрипт создаёт 30-секундный WAV, src/captions.json, public/captions.en.srt и audio-timing.json. Композиция импортирует сгенерированный JSON, поэтому в коде видео не нужно вести второй, вручную редактируемый список субтитров.

Измеренные эталонные фрагменты приведены ниже. Предложения оставлены на английском, потому что именно они звучат в общей английской звуковой дорожке примера и совпадают с субтитрами в видео и в SRT.

ПредложениеНачалоДлительность фрагмента WAVКонец фрагментаКонец субтитра
A clear product video starts with a clear brief.0,35 с2,664 с3,014 с3,60 с
Show the real interface. Here, we begin with the model catalog.4,35 с3,681 с8,031 с9,80 с
Then show where a viewer can find the documentation.11,35 с2,917 с14,267 с16,80 с
Connect each scene to an actual page, such as this API reference.18,35 с3,743 с22,093 с23,80 с
Keep the message simple. Plan, build, and verify.25,35 с3,537 с28,887 с29,50 с

Эти длительности включают хвостовые сэмплы сгенерированного фрагмента. Это не измерения отдельных фонем. Субтитры намеренно остаются на экране после окончания речи: у предложения о документации после его фрагмента WAV есть примерно 2,53 секунды дополнительного времени на чтение. Если нужен более плотный тайминг субтитров, сократите эту паузу, предварительно проверив реальную озвучку.

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

Для непрерывной записи на замену нужен другой подготовительный шаг. Экспортируйте один полноразмерный public/narration.wav, затем отредактируйте src/captions.json и SRT под реальную запись. Не запускайте после этого make_audio.py, если не собираетесь перезаписать свою запись эталонным голосом. Храните исходную запись и сгенерированный пример в отдельных сохранённых версиях.

Аккуратно переводите секунды в кадры

Композиция работает с частотой 30 fps. Субтитр на 11,35 секунды попадает между кадрами видео. Итоговый код использует Math.floor(start * fps) для первого видимого кадра, поэтому это предложение появляется на кадре 340, примерно на 11,333 секунды, — чуть раньше, чем начинается голос. Плавного появления, которое могло бы скрыть первое произнесённое слово, нет. Короткое затухание происходит в последние шесть кадров.

const first = Math.floor(caption.start * fps);
const last = Math.round(caption.end * fps);
const visible = frame >= first && frame < last;

Это иллюстрация итогового правила видимости; полный компонент также задаёт компоновку текста и затухание в конце. Округление до кадров — ожидаемое поведение. Не заявляйте о выравнивании звука с точностью до сэмпла на основании визуальной шкалы 30 fps.

Готовый проект на Remotion 4.0.424 импортирует Audio из remotion и получает путь к WAV через staticFile. Текущая документация Remotion описывает этот более старый HTML5-компонент как Html5Audio и рекомендует для новых интеграций звука более новый медиакомпонент. При воспроизведении примера сохраняйте зафиксированные в архиве версии; не смешивайте изменение API из текущей документации с необъяснённым обновлением пакетов.

Читаемые субтитры без скрытых слов

Горизонтальная композиция отводит субтитрам тёмную полосу, отделённую от скриншота. В сценах документации и API заголовок сцены находится слева, а субтитр предложения — справа. В вертикальной версии изображение и субтитры расположены друг под другом; её геометрия описана в руководстве по вертикальному видео.

Наши английские субтитры набраны кеглем 28 пикселей в горизонтальной версии и 30 пикселей в вертикальной. Это значения проекта, а не универсальные правила соцплатформ. Выбранная длина предложений помещается в проверенные макеты. Более длинный перевод может не поместиться.

Исходный код модели ограничивал текст двумя строками через CSS line-clamping. Мы убрали это правило, потому что после правки оно могло незаметно скрыть третью строку. Правильное решение для слишком длинного субтитра — разбить или перефразировать его, увеличить место или изменить макет, а не делать пропавшие слова невидимыми.

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

Попросите Opus об ограниченной правке тайминга

Этот промпт для адаптации пригодится, когда вы уже измерили свою озвучку. Замените заполнители реальными значениями времени; это не дополнительный тест модели.

Обнови только существующую композицию DemoNarrated.
Сохрани утверждённые скриншоты, 30 fps и текущий порядок сцен.
Новая озвучка — public/narration.wav.
Вот измеренные интервалы предложений в секундах:
[вставьте начало, конец и точный произносимый текст]

Используй один источник данных для субтитров. Сохрани каждое произнесённое слово.
Показывай каждое предложение не позже его первого произнесённого слова; объясни округление до кадров.
Не выдумывай временные метки отдельных слов или результаты автоматической расшифровки.
Добавляй паузу для чтения только там, где я явно её указал.
Не используй line-clamping, чтобы скрывать переполнение.
Если предложение пересекает склейку сцены, укажи его, а не обрезай звук молча.
Верни изменённые файлы, допущения о тайминге и кадры для проверки.

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

Экспортируйте и диагностируйте реальный файл

npm run render:narrated
ffprobe -v error -show_entries stream=codec_name,codec_type,duration,sample_rate \
  -show_entries format=duration -of json out/narrated.mp4

В отрендеренном примере есть видеопоток H.264 и аудиопоток AAC. Временная шкала видео — 30 секунд; сжатый звук может показывать немного иную длительность потока или контейнера из-за заполнения (padding) кодировщика. Наш эталонный WAV длится ровно 30 секунд. Проверяйте слышимое содержимое и синхронизацию, а не принимайте небольшой хвост AAC за ошибку длительности сцены.

СимптомГде вероятнее искатьЧто менять
Весь MP4 без звукаКомпозиция, флаг mute, путь к WAV и метаданные потокаИспользуйте render:narrated, проверьте аудиофайл и убедитесь, что звук при рендере не был отключён.
Каждое предложение запаздывает на одну и ту же величинуТишина в начале или общее смещение стартаИсправьте единое смещение и снова проверьте первое и последнее предложения.
Рассинхрон нарастает к концу видеоНеверные допущения о длительности, скорость звука или исходная шкалаИзмерьте реальную запись; не подгоняйте каждый субтитр по угаданному числу слов.
Одно предложение пересекает склейкуДлительность этого предложения и граница сценыСократите или перезапишите его либо удлините сцену и весь зависимый тайминг.
На экране пропадают словаПеренос текста и фиксированный блок субтитровРазбейте предложение или измените размер макета; никогда не скрывайте переполнение.
В превью звук есть, а в итоговом экспорте нетИтоговый файл и команда рендераПроверьте аудиопоток MP4, а не только волновую форму в Studio.
SRT и вшитые субтитры различаютсяПоследний редактированный источник и порядок перегенерацииПерегенерируйте оба из одного расписания или при замене записи осознанно обновите оба.

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

Отделяйте работу со звуком от доступа к модели

Карточка модели Opus 5.5 указывает модель, которая используется в этом процессе написания кода. Пример не подтверждает ни доступность TTS в Ofox, ни тарифицируемый рендер видео; зафиксированный вызов модели шёл через официальный Claude Code, а звук был создан локально.

Общий производственный путь описан в основном руководстве по видео с Opus, выбор исходников — в руководстве по демо из скриншотов, а перед переводом ролика в формат для мобильных устройств пригодится вертикальная адаптация. Надёжная передача включает итоговый MP4, WAV, соответствующий файл субтитров и точную версию проекта, из которой они получены.

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

Сгенерировал ли Opus 5.5 озвучку?
Нет. Opus сгенерировал код видеопроекта. В этом примере используется явно синтетический эталонный голос eSpeak NG, а Remotion объединяет WAV с видео.
Синхронизированы ли эти субтитры по словам?
Нет. В примере пять субтитров по предложениям, выводимых по расписанию, с дополнительным временем на чтение после каждого аудиофрагмента. Подсветка по словам требует реальных временных меток слов и отдельной проверки.
Можно ли заменить голос, не генерируя дизайн видео заново?
Да. Замените аудио и обновите под него тайминг субтитров, сохранив утверждённый визуальный ряд. Если новая озвучка не укладывается в длительность сцены или проекта, перед экспортом пересмотрите общую временную шкалу.