Ролик снят на русском, а говорит по-казахски тем же голосом. Как я собрал дубляж на своём сервере, не зная казахского

Ролик снят на русском, а говорит по-казахски тем же голосом. Как я собрал дубляж на своём сервере, не зная казахского

Задача звучала просто: ролики, снятые на русском, выпускать и на казахском — голосом того же спикера и с губами, которые двигаются под новый текст. Сложность в том, что никто в команде не говорит по-казахски. Рассказываю, как проверять качество на языке, которого не знаешь, какие модели не подошли и сколько всё это считает видеокарта.

Зачем это нужно

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

Хотелось другого: зритель видит того же человека, слышит его голос и видит, как губы произносят казахские слова.

Как устроен конвейер

Каждый ролик проходит семь шагов, всё работает на моём сервере, без внешних сервисов:

  1. Приём. Ролик кладётся в папку, система ждёт, пока файл докопируется, и забирает его.
  2. Разделение звука. Голос отделяется от музыки и шумов, чтобы потом вернуть фон под новую озвучку.
  3. Распознавание. Русская речь превращается в текст с точными таймингами каждой фразы.
  4. Перевод. Каждая реплика переводится на казахский с учётом длины: перевод должен уложиться в то же время, что и оригинал. Для этого считаются слоги, а слишком длинный перевод переписывается короче.
  5. Озвучка голосом спикера. Модель синтеза речи клонирует голос по короткому образцу и произносит казахский текст. Для каждой реплики делается до трёх дублей, выбирается лучший.
  6. Липсинк. Нейросеть LatentSync перерисовывает область рта под новую звуковую дорожку.
  7. Сборка. Новая речь, исходный фон, титры — и готовый ролик приходит в Telegram.

Главная проблема: как проверять язык, которого не знаешь

Никто в команде не говорит по-казахски. Слушать и решать «на слух» мы не могли. Поэтому качество проверяется машинами:

  • Разборчивость. Готовую казахскую озвучку распознают обратно два независимых распознавателя речи — Whisper и MMS от Meta. Если синтезированная фраза распознаётся близко к исходному казахскому тексту, значит, она произнесена разборчиво. Два распознавателя нужны, потому что у Whisper казахский слабый: если оба «спотыкаются» на одной реплике, проблема точно в произношении.
  • Похожесть голоса. Отдельная модель сравнивает голос в озвучке с «отпечатком» настоящего голоса спикера, собранным по 28 его записям.
  • Тайминг. Реплика не должна быть заметно быстрее оригинала: ускорение больше чем на 10–15 % слышно.

Реплика, не прошедшая пороги, не попадает в готовый ролик: система пробует другой дубль, потом более короткий перевод, а если не помогло — помечает ролик «нужен просмотр».

Что показала проба

Я сравнил несколько способов получить казахскую речь голосом спикера. Ниже — средние по шести репликам пробного ролика. Ошибки — доля неверно распознанных символов (меньше — лучше). Для ориентира: настоящие записи спикера похожи друг на друга на 0,989.

  • Прямое клонирование голоса, подгонка по длительности — ошибки (MMS): 0,022; похожесть голоса: 0,980; укладывается во время: да, ускорение ≤ 3 %
  • Диктор + перенос тембра (Seed-VC) — ошибки: 0,042; похожесть: 0,974; во время укладывается
  • Диктор + перенос тембра (RVC v2) — ошибки: 0,045; похожесть: 0,984; во время укладывается
  • Другой клон (VoxCPM) — ошибки: 0,166; похожесть: 0,975; не укладывается: одна реплика в 5 раз длиннее нужного

Выиграло прямое клонирование: модель KazakhTTS-OmniVoice произносит чище всех и при этом звучит голосом спикера. Перенос тембра чуть точнее по голосу, но портит произношение. После прослушивания пробы заказчик выбрал именно этот вариант.

Что не подошло

Половина работы в таких проектах — отсеять то, что не работает:

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

Лицензии я проверяю до того, как модель попадёт в работу. Красивое демо на модели с некоммерческой лицензией — это проблема для заказчика, а не решение.

Сколько считает видеокарта

Самый тяжёлый шаг — липсинк. На одной видеокарте Tesla V100 (16 ГБ) LatentSync обрабатывает 20 секунд видео примерно за 8 минут и забирает почти всю память карты (15,9 из 16,4 ГБ). Поэтому длинные ролики режутся на куски до 20 секунд, а места склейки проверяются отдельно, чтобы на стыке не дёргалось лицо.

Для коротких роликов это приемлемо: минутный ролик проходит липсинк примерно за полчаса, а очередь роликов спокойно считается ночью.

Итог

  • Ролик на русском можно выпустить на казахском голосом того же спикера и с подогнанными губами — на своём сервере, без облачных сервисов.
  • Качество на незнакомом языке можно и нужно мерить машинами: обратное распознавание двумя движками плюс сравнение голоса.
  • Лучший результат дало прямое клонирование голоса, а не классическая схема «диктор + перенос тембра».

Если вы снимаете ролики и хотите выпускать их на казахском или другом языке — напишите, покажу пример на вашем коротком ролике.

Я только запустил Telegram-канал «ИИ под столом» — показываю там системы, которые реально работают у меня на сервере, и рассказываю, как строю это дело с нуля: t.me/ai_pod_stolom. Написать напрямую: @Abvertiok.