Разбираем использование open-source Wunjo AI в ваших проектах с искусственным интеллектом и просто нейронные сети

Привет, дорогой Хабр! Давно не общались. Сегодня мы рассмотрим проект с открытым исходным кодом, позволяющий создавать дипфейки, клонировать речь, генерировать видео, удалять текст и объекты, а также получать изображения без фона, прямо на вашем компьютере. Поговорим о Wunjo AI и его возможностях для тех, кто еще не в курсе. В начале статьи ссылки на открытый код GitHub и установочные файлы, чтобы воспользоваться готовыми сборками. А в конце статьи я добавлю видео, в котором расскажу, какие нейронные сети применяются для работы с видео или со звуком, и как эти нейронные сети устроены и работают, либо можно спросить бота в блоге и получить ответ текстом.

Что может мой проект с открытым кодом?

Wunjo AI — это локальное приложение, которое работает даже на слабых компьютерах, предоставляя вам возможности по созданию контента, любой длительности, т.е. по своей природе веб-сервисы не могут позволить обрабатывать часовые фильмы, а Wunjo AI может — это долго. А приложение может запускаться хоть с флешки. Недавно я добавил фильтр, который обеспечивает безопасность, блокируя контент 18+ в дипфейках. Приложение полностью бесплатно и с открытым исходным кодом, используя вычислительные ресурсы вашего компьютера, а не сервера.

Я создал Wunjo AI с целью упрощения процесса создания медийного контента для авторов и для исследования общего искусственного интеллекта для создания контента. Версия v2 включает в себя идею объединить все модули с языковой моделью. Немного истории развития проекта:

  • Когда запустил приложение, там был доступен только синтез речи [статья].

  • Потом добавил дипфейк лица одним кликом, губ, клонирование речи и удаление объектов из видео [статья]. И за все время у меня на Хабре эта статья остаётся с большим количеством просмотров. Что создает ощущение, что с каждым новым функционалом я двигаю Wunjo не в то направление.

  • Далее изменение объектов и видео с помощью текстового запроса [статья].

  • И клонирование голоса из песен, улучшение изменения видео текстом, и удаление текста из видео одним кликом [статья].

На момент написания статьи Wunjo AI v1.6

Как применять Wunjo AI в своих проектах?

В новой статье и видео рассмотрим, как использовать Wunjo AI через Postman, а также создание полной сборки, включая установку драйверов и необходимых инструментов. Подробные инструкции по настройке приложения и проблемы, связанные с Windows, будут описаны в видео. С Linux намного проще, подробная инструкция. Для создания видео я арендовал машину на Windows 10, так как работаю в основном на Linux. Основное начало с 1:45, если вы планируете использовать проект на своей машине. Однако аренда сервера или игрового компьютера, может быть полезна, если у вас как и у меня мало видеопамяти, например для генерации видео или изменения видео с помощью текста.

И так, начинаем с кода. Первый шаг после скачивания кода с GitHub — заменить строку 1348 на app.run(port=8000, host="0.0.0.0"), чтобы приложение запустилось как обычное Flask-приложение с выбранным портом, а не FlaskUI. Для вывода информации в консоль, измените строку 1225 на if app.config['DEBUG']:, иначе вся информация будет доступно по GET запросам на 127.0.0.1:8000/console_log. Затем, для запуска в режиме разработчика, настройте зависимости и выполните briefcase dev.

Фронтенд часть будет доступна по адресу 127.0.0.1:8000, либо, если вы запустили на 0.0.0.0, по статическому IP: PORT из интернета или в локальной сети. В статье и видео показано, как работать с приложением через Postman, создавать сборки, устанавливать драйверы и программы.

Если у вас есть вопросы или нужна информация о конкретной нейронной сети в приложении, воспользуйтесь телеграмм ботом в wladblog для простого общения и получения ответов по Wunjo.

Работа с модулями Wunjo AI через Postman

Открываем консоль разработчика через F12 и выбираем модуль, например, анимацию рта.

Модуль анимации рта

Модуль анимации рта

Сделали запрос и получили адрес и тело запроса

Сделали запрос и получили адрес и тело запроса

В Postman указываем адрес 127.0.0.1:8000/synthesize_mouth_talk/, выбираем POST в формате JSON и используем тело запроса:

{
    "face_fields": {
        "x": 372,
        "y": 77,
        "canvasWidth": 588,
        "canvasHeight": 330
    },
    "source_media": "video_1710318305261_eJstB",
    "driven_audio": "audio_1710318305262",
    "type_file": "video",
    "media_start": "0",
    "media_end": "10.262993",
    "emotion_label": null,
    "similar_coeff": "1.2"
}

Интересные параметры, которые бы я выделил:

  1. media_start и media_end: Определяют временные рамки видео для возможности обрезки, например, до 1 минуты, если вы будете использовать в своём веб-приложении.

  2. face_fields: Представляет собой точку выбранного лица вместе с размерами изображения. Это необходимо для анимации рта (а) и получения реальных координат точки относительно размера видео/изображения (б). Можно указать реальный размер медиа с реальным положением точки или использовать относительные координаты, как в примере.

  3. similar_coeff: Определяет степень схожести лица в предыдущем кадре с лицом в следующем. Этот коэффициент регулируется в зависимости от качества контента и размера лица. При высоком качестве и большой площади лица коэффициент следует увеличить, чтобы правильно детектировать лицо в каждом кадре. В случае низкого качества и маленьких лиц, коэффициент следует уменьшить для повышения точности.

  4. type_file: Определяет, является ли файл видео или изображением. Параметры source_media и driven_audio представляют собой наши видео/изображения и аудио, соответственно.

Поговорим о source_media и driven_audio. Обратите внимание, что source_media и driven_audio не содержат абсолютного пути, только название файла. Файлы сохраняются в .wunjo/tmp перед запуском. Если необходимо использовать абсолютный путь или путь к новой медиа-папке, можно найти в коде строку os.path.join (TMP_FOLDER, something_name) и заменить ее на нужный путь. Возможно также оставить something_name, если используется абсолютный путь.

В общем помещаем наши исходники в директорию .wunjo/tmp перед запуском.

Исходники в .wunjo/tmp

Исходники в .wunjo/tmp

Отркываем Postman, выбираем метод POST, копируем запрос в формате JSON.

Postman

Postman

Полученный статус 200 указывает на успешное выполнение программы, в то время как другой статус может указывать на занятость процессора другими задачами.

Аналогично и для любого другого модуля. Посмотрим на запросы:

Дипфейк лица 127.0.0.1:8000/synthesize_face_swap/ имеет тело запроса:

{
    "face_target_fields": {
        "x": 372,
        "y": 77,
        "canvasWidth": 588,
        "canvasHeight": 330
    },
    "target_content": "video_1710319409907_mzk96",
    "video_start_target": "1.0105791794310721",
    "video_end_target": "9.544358916849015",
    "type_file_target": "video",
    "face_source_fields": {
        "x": 111,
        "y": 103,
        "canvasWidth": 252,
        "canvasHeight": 397
    },
    "source_content": "image_1710319409908_Dxbmj",
    "video_current_time_source": 0,
    "video_end_source": 0,
    "type_file_source": "img",
    "multiface": true,
    "similarface": false,
    "similar_coeff": "2"
}

Параметры face_target_fields, target_content, video_start_target, video_end_target, type_file_target отвечают за файл, на котором будет происходить замена лица, а face_source_fields, source_content, video_current_time_source, video_end_source, type_file_source — из которого будет браться лицо. При этом multiface — замена всех лиц, а similarface говорит о том, что в одном кадре, например, могут быть близнецы.

Посмотрим на удаление объектов или текста и получение объектов из видео с прозрачным фоном. Запрос отправляется на 127.0.0.1:8000/synthesize_retouch/ и тело запроса:

{
    "source": "video_1710320112143_0tmqx",
    "source_start": "0.00",
    "source_end": "2.23",
    "source_type": "video",
    "model_type": "retouch_object",
    "mask_text": true,
    "mask_color": "transparent",
    "masks": {
        "1": {
            "start_time": 0,
            "end_time": 2.234,
            "point_list": [
                {
                    "canvasHeight": 330,
                    "canvasWidth": 588,
                    "color": "lightblue",
                    "x": 373,
                    "y": 37
                }
            ]
        },
        "2": {
            "start_time": 1,
            "end_time": 

2.234,
            "point_list": [
                {
                    "canvasHeight": 330,
                    "canvasWidth": 588,
                    "color": "lightblue",
                    "x": 257,
                    "y": 35
                },
                {
                    "canvasHeight": 330,
                    "canvasWidth": 588,
                    "color": "red",
                    "x": 255,
                    "y": 81
                }
            ]
        }
    },
    "blur": "10",
    "upscale": false,
    "segment_percentage": 25,
    "delay_mask": 0
}

Из интересного, обратите внимание на point_list, где color lightblue или red. Lightblue — координаты точки для объекта, который нужно включить для SAM, а red — координаты точки для области, которую нужно исключить из получения маски объекта. Не говоря о том, что для каждого объекта можно задать свой кадр для взаимодействия. При этом mask_text означает, что работаем с текстом, который получается отдельной нейронной сетью автоматически, а mask_color означает, что выбранные объекты и текст сохраняются как отдельные изображения с прозрачным фоном. model_type — модель, которую используем, обычное удаление объекта или улучшенное, которое уже требует большое количество VRAM. Остальные параметры можно понять интуитивно, позапускав приложения в разных параметрах.

Посмотрим на изменение видео текстом. Запросы отправляются на 127.0.0.1:8000/synthesize_diffuser/ и тело запроса:

{
    "source": "video_1710320796223_0MOh9",
    "source_start": "0.00",
    "source_end": "2.06",
    "source_type": "video",
    "masks": {
        "1": {
            "start_time": 0,
            "end_time": 2.059,
            "point_list": [
                {
                    "canvasHeight": 330,
                    "canvasWidth": 588,
                    "color": "lightblue",
                    "x": 373,
                    "y": 39
                }
            ],
            "input_strength": "0.95",
            "input_seed": "0",
            "input_scale": "7.5",
            "prompt": "a superman",
            "n_prompt": "deformation"
        },
        "background": {
            "start_time": "0.00",
            "end_time": "2.06",
            "point_list": null,
            "input_strength": "0.7",
            "input_seed": "0",
            "input_scale": "7.5",
            "prompt": "a dog room",
            "n_prompt": ""
        }
    },
    "interval_generation": "20",
    "controlnet": "canny",
    "preprocessor_loose_cfattn": "loose_cfattn",
    "preprocessor_freeu": "freeu",
    "segment_percentage": 25,
    "thickness_mask": 10,
    "sd_model_name": "null"
}

Из интересного prompt и n_prompt (negative prompt) связаны с моделью Stable Diffusion 1.5 и позволяют работать с промтами для каждого объекта или для фона. Параметр interval_generation определяет интервал генерации нового изображения на основе текущего и предыдущего, а sd_model_name — название модели, если null, используется default. Остальные параметры можно изучить ручным способом.

Посмотрим на дополнительные фичи, их можно изучить самостоятельно. Там есть улучшение видео, лица, разделение звуков или улучшение речи. Запросы отправляются на 127.0.0.1:8000/synthesize_media_editor/ и тело запроса:

{
    "source": "image_1710321056462_fws2c",
    "gfpgan": "gfpgan",
    "animesgan": false,
    "realesrgan": false,
    "get_frames": false,
    "vocals": false,
    "residual": false,
    "voicefixer": false,
    "media_start": 0,
    "media_end": 0,
    "media_type": "img"
}

Где gfpgan, animesgan, realesrgan, get_frames, vocals, residual, voicefixer — это запускаемые методы.

И закончим всё синтезом речи и клонированием голоса. Запросы отправляются на 127.0.0.1:8000/synthesize_speech/ и тело запроса:

[
    {
        "text": "И закончим всё синтезом речи и клонированием голоса",
        "voice": [
            "Russian man"
        ],
        "rate": "1",
        "pitch": "1",
        "volume": "0",
        "auto_translation": false,
        "lang_translation": "ru",
        "use_voice_clone_on_audio": true,
        "rtvc_audio_clone_voice": "rtvc_audio_1710321345864_uMSb0"
    }
]

Важно знать, что параметр voice отвечает за выбор голоса для создания синтеза речи, а rtvc_audio_clone_voice представляет собой аудиофайл в папке .wunjo/tmp, который будет использоваться для клонирования речи. Клонирования речи работает качественее с аудиофайлами продолжительностью от 30 до 60 секунд, не рекомендуется превышать этот временной диапазон.

Параметр use_voice_clone_on_audio определяет, следует ли использовать клонирование речи из предоставленного аудиофайла. Для задания языка текста, который требуется озвучить клонированной речью, используется параметр lang_translation.

И, наконец, несколько слов об общем подходе. В данном контексте, я предоставил описание того, как использовать POST/GET запросы для различных модулей Wunjo AI в ваших проектах. Важно отметить, что вы можете создавать уникальные комбинации модулей, например, комбинировать замену лица с анимацией губ.

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

Просто нейронные сети

В приложении, помимо возможности работы с дипфейками для лица и анимации губ, представлено около 40 других нейронных сетей для работы с видео и изображениями на момент написания данной статьи. Полный перечень можно найти в файле deepfake.json по следующей ссылке в GitHub.

Кроме того, в приложении представлено около 20 нейронных сетей для работы со звуком. Полные списки доступны в файлахrtvc.jsonиvoice.json по ссылке.

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

И остается вопрос: есть ли в одном из этих видео мой настоящий голос? Ну, да ладно. Сохраняйте проект себе на GitHub, чтобы не потерять и следить за его развитием и версией v2, и создавайте форки для сохранения текущих изменений. Теперь точно всё! До новых обновлений.

© Habrahabr.ru