· ~1 мин чтения · Пантюхов Роман Владимирович
Озвучка в AI-видео обрывается на полуслове: как скорость речи ломает тайминг
В автоматически собранном ролике для соцсетей озвучка вдруг обрывалась на последнем слове, а вместе с ней исчезала и финальная фраза с номером телефона. Для рекламного ролика это прямой ущерб: вся концовка работала на то, чтобы человек позвонил. Причин оказалось две.
Первая причина: ffmpeg режет по короткому треку
Сравнение исходных файлов показало: озвучка длилась 7,74 секунды, а видеоряд — 6,58. При сборке итогового файла использовался параметр -shortest, который обрезает результат по самому короткому потоку. Хвост речи просто отрезался, а вместе с ним пропадало и слово в субтитрах. Параметр сам по себе правильный, но он предполагает, что озвучка не длиннее видео.
Вторая причина: угаданная скорость речи
Длину сценария система рассчитывала по константе «слов в секунду», равной 2,3. Я измерил реальную озвучку: сценарий из 51 слова звучал 26,2 секунды, то есть около 1,95 слова в секунду. Завышение на 15% приводило к тому, что текст систематически не умещался в отведённое время. Константу я понизил до 1,9 — намеренно чуть ниже измеренного. Перебор по длине стоит дорого (обрыв), недобор — дёшево (пара секунд музыки в конце).
Как исправить уже готовый ролик
Заново генерировать сценарий и озвучку не нужно: это лишние траты. Достаточно ускорить готовое аудио фильтром atempo на коэффициент «длина озвучки / (длина видео − запас)», пересчитать времена слов в субтитрах на тот же коэффициент и пересобрать итоговый файл из исходных материалов. Для этого нужно хранить «сырые» видео, озвучку и субтитры до сборки — поэтому такой архив я не удаляю.
Что добавил в пайплайн
Теперь сборка сама подгоняет озвучку под ролик: ускоряет её не более чем в 1,15 раза, а если этого мало — обрезает по границе фразы, а не посреди слова. Паузы между репликами ограничены 0,6 секунды. Подобные автоматизации входят в автопостинг в соцсети, где контент выходит без ручной сборки каждого ролика.