Ролик снят на русском, а говорит по-казахски тем же голосом. Как я собрал дубляж на своём сервере, не зная казахского
Задача звучала просто: ролики, снятые на русском, выпускать и на казахском — голосом того же спикера и с губами, которые двигаются под новый текст. Сложность в том, что никто в команде не говорит по-казахски. Рассказываю, как проверять качество на языке, которого не знаешь, какие модели не подошли и сколько всё это считает видеокарта.
Зачем это нужно
В Казахстане большая аудитория смотрит контент на казахском, и блогеры, онлайн-школы, бренды хотят говорить с ней на её языке. Обычный путь — нанять диктора и озвучить заново. Но тогда в ролике звучит чужой голос, а губы спикера двигаются не в такт словам. Для коротких роликов, где лицо спикера — главное, это сразу выдаёт перевод.
Хотелось другого: зритель видит того же человека, слышит его голос и видит, как губы произносят казахские слова.
Как устроен конвейер
Каждый ролик проходит семь шагов, всё работает на моём сервере, без внешних сервисов:
- Приём. Ролик кладётся в папку, система ждёт, пока файл докопируется, и забирает его.
- Разделение звука. Голос отделяется от музыки и шумов, чтобы потом вернуть фон под новую озвучку.
- Распознавание. Русская речь превращается в текст с точными таймингами каждой фразы.
- Перевод. Каждая реплика переводится на казахский с учётом длины: перевод должен уложиться в то же время, что и оригинал. Для этого считаются слоги, а слишком длинный перевод переписывается короче.
- Озвучка голосом спикера. Модель синтеза речи клонирует голос по короткому образцу и произносит казахский текст. Для каждой реплики делается до трёх дублей, выбирается лучший.
- Липсинк. Нейросеть LatentSync перерисовывает область рта под новую звуковую дорожку.
- Сборка. Новая речь, исходный фон, титры — и готовый ролик приходит в 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.