February 27, 2023

Как апскейлить аниме с опен сорсом и нейросетями

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

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

Исходные видео

Старое аниме в хорошем качестве в интернете можно найти только на торрентах.

Оказалось, выкладыванием аниме на рутрекер оказывается занимаются какие-то берсерки. Они собирают по всему интернету японские двд, файлы с озвучками и субтитрами, синхронизируют их какими-то специальными программами. Затем выкладывают это все и прикладывают сравнения с десятком других раздач, где объясняют, чем они лучше. Я был сильно впечатлен фанатичностью и скурпулезностью.

Авторы раздач обьясняют, зачем они выложили то, что уже было

Сначала я нашел раздачу с самым лучшим качеством интересующей меня серии, это оказался рип с японского DVD без русской озвучки. Поэтому я нашел раздачу с единственной профессиональной озвучкой сериала на русском - от 2х2. Это был TV рип с плохим качеством и логотипом телеканала.

Сводим видео и аудио

Оказалось, что два видеофайла из двух расходятся на несколько секунд. Чтобы решить эту проблему, мне нужно было узнать, на какое время они расходятся. Я положил их на таймлайн в монтажной программе и двигал покадрово, чтобы узнать точное время разницы. У меня под рукой оказалась бесплатная версия DaVinci Resolve.

Наложил два видео поверх и двигал видео дорожки пока они не совпадут

Для работы с видео есть очень мощная программа командной строки - FFmpeg. С его помощью я объединил аудио из одного файла и видео из другого из выясненной задержкой. Такая команда сдвигает первый источник видео на 1 минуту 5 секунд, маппит видео сигнал из первого входного файла на видео выходного файла и аудио сигнал из второго входного файла на аудио выходного файла.

ffmpeg \
-i NARUTO\ Shippuuden\ 165\ RAW.mp4 \
-i Naruto.Shippuuden.165.IPTVRip.2x2.XviD.Rus.avi \
-ss 00:01:05 \
-c:v copy \
-map 0:v:0 \
-map 1:a:0 \
new.mp4

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

ffmpeg \
-i -i cycle_speech.mp4 \
-itsoffset 0.8 \
-i cycle_speech.mp4 \
-map 0:0 \
-map 1:1 \
shifted_4k.mp4

С помощью стандартной мак утилиты QuickTime я вырезал интересующий меня фрагмент и сохранил отдельным файлом.

Обрезал видео инструментом Trim в QuickTime

AI Upscale

Для апскейла я использовал Real-ESRGAN. Кстати его же использовал Сбер для своей версии DALL-E. Это очень удобный в использовании тул, я также пробовал его файнтюнить, все получается легко и непринужденно. Кроме того, разработчики выпустили обученную модель и инструмент для апскейла аниме видео, показав, что они аутперформят другие решения.

Сравнение моделей для апсейла аниме

Сам метод использует то-то и заключается в том-то

Чтобы воспользоваться методом, нужно установить модуль из исходников, скачать веса модели для аниме видео и запустить скрипт для инференса. Подробная инструкция тут

Для инференса я использовал 3070ti, поднятие разрешения в 4 раза, видео длиной 7 минут, 8 параллельных потоков. Расчет занял 28 минут и 35 секунд.

Подготовка к публикации

Настало время заливать видео на ютуб и возникло две проблемы. Во-первых, к этому моменту я уже узнал, как много разных настроек и параметров у видеофайлов, и к этому видео нужно как-то их подобрать правильно. Во-вторых, итоговое расширение получилось не стандартным 4к, а больше - 5120 × 2880.

Я нашел на гитхабе перечисление всех настроек в ffmpeg, которые соответствуют рекомендациям качетсва для видео на ютубе.

Проблема возникла только с кодировщиком аудио, чтобы работал libfdk_aac, нужно компилировать ffmpeg из исходников, так как это библиотека с закрытым кодом. Но это уже перебор, я использовал встроенный кодировщик aac, проблем не заметил. Итоговая команда со скейлом до разрешения 4к.

ffmpeg \
Real-ESRGAN/results/cycle_speech__x4.mp4 \
-movflags faststart \
-c:v libx264 \
-profile:v high \
-bf 2 \
-g 30 \
-crf 18 \
-pix_fmt yuv420p \
-b:a 384k \
-c:a aac \
-profile:a aac_low \
-vf scale=3840:2160 \
cycle_speech_youtube_4k.mp4

Комментируйте, ставьте реакции, рассказывайте друзьям и подписывайтесь на телеграм канал!