wladradchenko / wunjo.wladradchenko.ru

Wunjo CE: Face Swap, Lip Sync, Control Remove Objects & Text & Background, Restyling, Audio Separator, Clone Voice, Video Generation. Open Source, Local & Free.
https://wunjo.online
MIT License
873 stars 95 forks source link

Предложения по проекту #26

Closed BrasD99 closed 1 year ago

BrasD99 commented 1 year ago

Привет!

Я сейчас занимаюсь похожим проектом. Очень ждал твоей реализации клонирования голоса. Вижу, что ты остановился на https://github.com/CorentinJ/Real-Time-Voice-Cloning. На CPU данный проект работает очень медленно, результат очень слабый. Не рассматривал ли https://github.com/coqui-ai/TTS ? Мне понравились и скорость, и относительно хорошие результаты.

И касательно перевода текста, мне кажется, проще использовать обертку https://pypi.org/project/googletrans/ ;)

Но вот с клонированием голоса очень сложный вопрос. Хочется сделать что-то наподобие HeyGen, чтобы сохранялась интонация, тембр голоса. Я нашел https://mega-tts.github.io/demo-page/ с закрытым кодом. Мне кажется, нам надо двигаться в этом направлении. Идеальный дипфейк должен учитывать все особенности речи. Я продолжаю искать варианты, но пока что, увы, застрял на этом.

Если вдруг захочется обсудить то, к чему я пришел, можешь написать на brasd99@gmail.com, я собрал набор различных моделей, но ни одна из них, честно говоря, даже не близка к тому результату, что выдает HeyGen. А с нуля написать и обучить модель - мне на данный момент не хватит знаний.

Помимо этого я сейчас думаю над реализацией трекинга и реидентификации нескольких лиц. Чтобы пользователь мог перевести фильм в целом. Задача очень нетривиальная. Могу поделиться наработками.

wladradchenko commented 1 year ago

Привет.

Не видел, что в проекте https://github.com/coqui-ai/TTS есть клонирование голоса. Однако сейчас я вряд ли буду вырезать целый модуль, чтобы начать эксперименты с другим подходом. Я планирую улучшить качество клонирования голоса как это сделано в HeyGen, это будет в версии 1.6.0 или 1.6.1, я клонирование голоса оставил на самое последнее.

На данный момент ведётся работа над изменением компонентов видео по текстовым подсказкам с полным контролем слоев и сглаживанием перехода кадров. Предположительно это будет лучше в качестве чем WarpFusion.

Для перевода я использую request с запросами в Google Translate, я стараюсь не ставить много лишний библиотек, если без этого можно обойтись, так как лимит для создания билда на Windows 2Гб, сейчас проект 1.85Гб. Больше всего места съедает torch даже на CPU, потом onnixruntime. Если место будет в притык, тогда придется переносить словари в .wunjo - это может освободить ещё 150Мб, но усложнит код для словарей, что не хорошо.

BrasD99 commented 1 year ago

По поводу TTS делюсь примером. Надеюсь, пригодится: https://github.com/coqui-ai/TTS#example-text-to-speech-using-fairseq-models-in-1100-languages-

У них вышла XTTS, которую можно опробовать здесь: https://huggingface.co/spaces/coqui/xtts Но на моих примерах с английской речью с озвучкой русского текста она выдала не очень хорошие результаты, хотя заявлена поддержка русского языка.

wladradchenko commented 1 year ago

По документации ими заявлено использование токена https://docs.coqui.ai/docs , а сами модели как понимаю работают на их серверах.

BrasD99 commented 1 year ago

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

BrasD99 commented 1 year ago

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

UPD: https://tts.readthedocs.io/en/latest/

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

В моем проекте я вынес использование TTS в отдельный класс (TempFileManager - обертка над функционалом создания временных файлов):

from TTS.api import TTS
from core.temp_manager import TempFileManager

class VoiceCloner:
    def __init__(self, lang_code):
        self.tts = TTS(f'tts_models/{lang_code}/fairseq/vits')
        self.temp_manager = TempFileManager()

    def process(self, text, speaker_filename, out_filename=None):
        if not out_filename:
            out_filename = self.temp_manager.create_temp_file(suffix='.wav').name
        self.tts.tts_with_vc_to_file(
            text,
            speaker_wav=speaker_filename,
            file_path=out_filename
        )
        return out_filename
wladradchenko commented 1 year ago

@BrasD99 в любом случае, если появятся предложения в качестве коммитов для клонирования голоса, смело вносите. Недавно открыл под приложения tg канал , где вы также можете писать, про баги, фидбэек и предложения, да и вообще, что хотите видеть в будущих версиях.

BrasD99 commented 1 year ago

@wladradchenko Большое спасибо! На следующей неделе изучу код и попробую прислать пулл-реквест.