Добавить в корзинуПозвонить
Найти в Дзене

ИИ-озвучка для видео: разбираем логику скрипта, который все делает за вас (почти)

Однажды ко мне обратился клиент с весьма редким для моей специфики запросом — попросил сделать ему закадровый перевод художественного фильма с немецкого языка с помощью ИИ. До сих пор я такие вещи делал для коммерческого контента, вручную, на совесть и за соответствующую плату. Но чтобы Вы поняли всю глубину ситуации, нужно сделать шаг назад. Незадолго до этого ко мне обращался один популярный психолог (не лично, конечно, через помощников, но не суть). Задача: перевести его лекции на английский, озвучить разными голосами (чтобы заказчик мог выбрать варианты), тоже с помощью ИИ, плюс добавить субтитры. Распознать и сгенерировать речь с помощью моих Python-скриптов или используемых мною сервисов — не проблема. А вот дальше начинался филиал ада. Выяснилось, что разные синтезированные голоса говорят с разной скоростью (расхождение на одной реплике достигало 2 секунд). Нужно было, чтобы озвучка включалась, только когда спикер шевелит губами, а субтитр появлялся ровно в тот момент, когда
Оглавление

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

Но чтобы Вы поняли всю глубину ситуации, нужно сделать шаг назад.

Незадолго до этого ко мне обращался один популярный психолог (не лично, конечно, через помощников, но не суть).

Задача: перевести его лекции на английский, озвучить разными голосами (чтобы заказчик мог выбрать варианты), тоже с помощью ИИ, плюс добавить субтитры.

Распознать и сгенерировать речь с помощью моих Python-скриптов или используемых мною сервисов — не проблема. А вот дальше начинался филиал ада.

Выяснилось, что разные синтезированные голоса говорят с разной скоростью (расхождение на одной реплике достигало 2 секунд). Нужно было, чтобы озвучка включалась, только когда спикер шевелит губами, а субтитр появлялся ровно в тот момент, когда его начинали произносить. То есть у разных голосов субтитры и голоса будут включаться в разное время, каждый ролик надо подгонять вручную.

Я настолько обалдел от своей беспомощности в этом вопросе, что даже советовался со знакомым видеомонтажником:

как синхронизировать сгенерированную речь с артикуляцией спикера?

Он пожал плечами и сказал, что это делается вручную. Потому что машина не понимает, где кончается одна фраза и начинается другая. В общем, ручная работа. Дорогая. Но там ролики были по 5-10 минут, так что как-то справился. Клиент, судя по его словам, остался доволен.

Часть того творчества можно посмотреть на этих роликах:

И вот, с этим багажом знаний я получаю новый запрос: перевести немецкий фильм. Длиной почти 200 минут. С бюджетом, который не предполагает ручной работы. Вообще. Я всё-же рискую и называю свою стандартную цену за свой труд. Ожидаемый отказ — «ДОРОГО!»

Что ж, удачи.

Но любопытство взяло верх. Я решил поиграться (должна же эта задача как-то решаться подручными средствами).

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

Сообщаю посреднику (клиент работал через него), что есть решение в рамках его бюджета. Тот уходит думать и возвращается с вопросом: «А можно ли изменить голос?» В браузере, разумеется, нельзя. Говорю, что нет. Посредник удивляется.

Тут удивляюсь уже я: «Если у вас есть свое решение, зачем вы пришли ко мне?» Оказалось, у них есть некий известный им сервис. Назвали. Я загрузил туда трехминутный отрывок фильма (см. ниже).

Кстати, было занятно послушать С. Гармаша, шпрехающего с весьма характерным акцентом (помню этот акцент еще со студенчества — я пытался его имитировать, когда переводил на немецкий).

В общем, сервис отказался его обрабатывать: старый фильм, низкое разрешение. И да, хочет предоплату. Я не против, если бы понимал, что он решит проблему. А вот последнее — совсем не факт.

Стало ясно, что придется строить свой «велосипед» на Python. Я решил сделать систему, которая будет работать без моего участия. Вот какая логика выстроилась в итоге.

Логика автоматической озвучки

Итак, вот как я построил себе сборочный конвейер. Моя задача — полностью автоматизировать процесс, исключив ручной труд.

Шаг 1: Извлечение аудиодорожки

Первым делом мы должны «выдрать» из видеофайла его звуковую дорожку. С помощью утилиты ffmpeg из видео извлекается вся дорожка и сохраняется в виде отдельного файла (в формате WAV, моно, 16 кГц — вполне рабочий стандарт).

Шаг 2: Транскрипция и создание субтитров

Теперь эту аудиодорожку нужно превратить в текст. Мы отправляем ее модели распознавания речи (в моем случае — Whisper). Поскольку файл большой, скрипт сначала делит его на кусочки по 10 минут. Модель «прослушивает» каждый кусок и возвращает текст с таймкодами: когда какая фраза была сказана. Из этих данных мы собираем стандартный файл субтитров в формате .srt.

Шаг 3: Машинный перевод

Полученный .srt-файл с оригинальным немецким текстом мы скармливаем ИИ-переводчику. Скрипт берет каждую реплику и отправляет ее в API языковой модели (я взял Deepseek V3), получая взамен перевод на русский. Результат сохраняется в новый файл — _rus.srt.

Шаг 4: Синтез речи

У нас есть переведенные субтитры с готовой разметкой по времени. Теперь нужно, чтобы их кто-то зачитал. Мы берем каждую переведенную фразу и отправляем ее в сервис синтеза речи (Text-to-Speech, например, от OpenAI). На выходе получаем набор аудиофрагментов с русской речью.

Шаг 5: Принудительная синхронизация

А вот и главная проблема. Русская фраза «Я полностью с вами согласен» гораздо длиннее немецкого «Ja». Если просто наложить озвучку, она начнет «наползать» на следующую реплику. Возникнет звуковая каша.

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

Решение нашлось одно, жесткое, но эффективное: принудительное ускорение. Скрипт стал проверять длительность сгенерированной русской фразы и заставлять ИИ ускорять реплики.

Оказалось, что ИИ ускоряет реплики паршиво, она просто выдает абракадабру. Тогда я решил ускорять фразы более приспособенной для этого библиотекой — ffmpeg.

Если она не помещается в отведенное ей по субтитрам время, скрипт с помощью того же ffmpeg (фильтр atempo) ускоряет аудиофайл на нужный процент. Например, если фраза на 20% длиннее, она ускоряется в 1.20 раза. Тон голоса при этом не меняется. Так я заставил уложиться каждую реплику в свой временной слот (см. скриншот лога):

Шаг 6: Сведение

Финальный этап. Мы берем исходное видео. Приглушаем его оригинальную звуковую дорожку до 10% громкости, чтобы она создавала фон. Поверх накладываем нашу новую, подогнанную по времени русскую озвучку. Собираем все вместе и получаем готовый видеофайл.

Итоги

В конечном итоге я получил видео, которое полностью соответствовало исходной задаче: перевод сделан ИИ, голос — ИИ, все фразы на месте, смысл понятен.

Однако результат клиента не устроил. И перевод «хреновый», и голоса «хреновые», и исполнение. Я лишь пожал плечами. Какой бюджет — такое и исполнение. Хотите лучше — платите больше, сделаю вручную. На том и расстались.

Но эксперимент мне понравился. В моей коллекции появился еще один полезный инструмент. Сырой, конечно, но рабочий.

Спасибо за внимание.

Надеюсь, было познавательно.