Closed BrasD99 closed 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Мб, но усложнит код для словарей, что не хорошо.
По поводу TTS делюсь примером. Надеюсь, пригодится: https://github.com/coqui-ai/TTS#example-text-to-speech-using-fairseq-models-in-1100-languages-
У них вышла XTTS, которую можно опробовать здесь: https://huggingface.co/spaces/coqui/xtts Но на моих примерах с английской речью с озвучкой русского текста она выдала не очень хорошие результаты, хотя заявлена поддержка русского языка.
По документации ими заявлено использование токена https://docs.coqui.ai/docs , а сами модели как понимаю работают на их серверах.
Веса модели загружаются локально. И она работает, соответственно, локально. При первом запуске она смотрит, загружена ли модель, название которой пробрасывается в аргументы конструктора. Если нет, то сначала загружает, а потом идет инференс на самом компьютере.
То, что ты прислал - документация для их 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
@BrasD99 в любом случае, если появятся предложения в качестве коммитов для клонирования голоса, смело вносите. Недавно открыл под приложения tg канал , где вы также можете писать, про баги, фидбэек и предложения, да и вообще, что хотите видеть в будущих версиях.
@wladradchenko Большое спасибо! На следующей неделе изучу код и попробую прислать пулл-реквест.
Привет!
Я сейчас занимаюсь похожим проектом. Очень ждал твоей реализации клонирования голоса. Вижу, что ты остановился на 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. А с нуля написать и обучить модель - мне на данный момент не хватит знаний.
Помимо этого я сейчас думаю над реализацией трекинга и реидентификации нескольких лиц. Чтобы пользователь мог перевести фильм в целом. Задача очень нетривиальная. Могу поделиться наработками.