Compare commits
13 Commits
cab2efa200
...
e6a1c8dd95
Author | SHA1 | Date |
---|---|---|
|
e6a1c8dd95 | |
|
0e3f2c8dc0 | |
|
464dc2a0aa | |
|
a05754fb28 | |
|
9727f34923 | |
|
a86544a4b4 | |
|
979da7aa1d | |
|
4a37bb2a97 | |
|
21d3c8766a | |
|
ee19c5158a | |
|
693c9bb268 | |
|
5132f86cdc | |
|
aed933c1db |
29
README.md
29
README.md
|
@ -10,9 +10,15 @@
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="media/demo.gif" alt="Demo GIF">
|
<img src="media/demo.gif" alt="Demo GIF">
|
||||||
<img src="media/avgpcperformancedemo.gif" alt="Performance Demo GIF">
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
## TLDR; Deepfake in 3 Steps!
|
||||||
|

|
||||||
|
1. Select a face
|
||||||
|
2. Select which camera to use
|
||||||
|
3. Press live!
|
||||||
|
|
||||||
|
|
||||||
## Disclaimer
|
## Disclaimer
|
||||||
###### This software is intended as a productive contribution to the AI-generated media industry. It aims to assist artists with tasks like animating custom characters or using them as models for clothing, etc.
|
###### This software is intended as a productive contribution to the AI-generated media industry. It aims to assist artists with tasks like animating custom characters or using them as models for clothing, etc.
|
||||||
|
|
||||||
|
@ -20,15 +26,18 @@
|
||||||
|
|
||||||
###### Users are expected to use this software responsibly and legally. If using a real person's face, obtain their consent and clearly label any output as a deepfake when sharing online. We are not responsible for end-user actions.
|
###### Users are expected to use this software responsibly and legally. If using a real person's face, obtain their consent and clearly label any output as a deepfake when sharing online. We are not responsible for end-user actions.
|
||||||
|
|
||||||
## Quick Start - Pre-built
|
## Quick Start - Pre-built (Windows / Nvidia)
|
||||||
<div align="center">
|
<a href="https://hacksider.gumroad.com/l/vccdmm"> <img src="https://github.com/user-attachments/assets/7d993b32-e3e8-4cd3-bbfb-a549152ebdd5" width="285" height="77" />
|
||||||
<a href="https://hacksider.gumroad.com/l/vccdmm">
|
|
||||||
<img src="https://github.com/user-attachments/assets/7d993b32-e3e8-4cd3-bbfb-a549152ebdd5" width="285" height="77" />
|
This is the fastest build you can get if you have a discrete NVIDIA GPU.
|
||||||
</a>
|
|
||||||
<a href="https://krshh.gumroad.com/l/Deep-Live-Cam-Mac">
|
## Quick Start - Pre-built (Mac / Silicon)
|
||||||
<img src="https://github.com/user-attachments/assets/d5d913b5-a7de-4609-96b9-979a5749a703" width="285" height="77" />
|
|
||||||
</a>
|
<a href="https://krshh.gumroad.com/l/Deep-Live-Cam-Mac"> <img src="https://github.com/user-attachments/assets/d5d913b5-a7de-4609-96b9-979a5749a703" width="285" height="77" />
|
||||||
</div>
|
|
||||||
|
This build is for those who are using Mac
|
||||||
|
|
||||||
|
###### This quickstart is perfect for non-technical users or those who don’t have time to manually install all the requirements. Just a heads-up: this is still an open-source project, so you can also install it manually if you prefer.
|
||||||
|
|
||||||
## Features - Everything is real-time
|
## Features - Everything is real-time
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
{
|
||||||
|
"Source x Target Mapper": "Source x Target Mapper",
|
||||||
|
"select an source image": "选择一个源图像",
|
||||||
|
"Preview": "预览",
|
||||||
|
"select an target image or video": "选择一个目标图像或视频",
|
||||||
|
"save image output file": "保存图像输出文件",
|
||||||
|
"save video output file": "保存视频输出文件",
|
||||||
|
"select an target image": "选择一个目标图像",
|
||||||
|
"source": "源",
|
||||||
|
"Select a target": "选择一个目标",
|
||||||
|
"Select a face": "选择一张脸",
|
||||||
|
"Keep audio": "保留音频",
|
||||||
|
"Face Enhancer": "面纹增强器",
|
||||||
|
"Many faces": "多脸",
|
||||||
|
"Show FPS": "显示帧率",
|
||||||
|
"Keep fps": "保持帧率",
|
||||||
|
"Keep frames": "保持帧数",
|
||||||
|
"Fix Blueish Cam": "修复偏蓝的摄像头",
|
||||||
|
"Mouth Mask": "口罩",
|
||||||
|
"Show Mouth Mask Box": "显示口罩盒",
|
||||||
|
"Start": "开始",
|
||||||
|
"Live": "直播",
|
||||||
|
"Destroy": "结束",
|
||||||
|
"Map faces": "识别人脸",
|
||||||
|
"Processing...": "处理中...",
|
||||||
|
"Processing succeed!": "处理成功!",
|
||||||
|
"Processing ignored!": "处理被忽略!",
|
||||||
|
"Failed to start camera": "启动相机失败",
|
||||||
|
"Please complete pop-up or close it.": "请先完成弹出窗口或者关闭它",
|
||||||
|
"Getting unique faces": "获取独特面部",
|
||||||
|
"Please select a source image first": "请先选择一个源图像",
|
||||||
|
"No faces found in target": "目标图像中没有人脸",
|
||||||
|
"Add": "添加",
|
||||||
|
"Clear": "清除",
|
||||||
|
"Submit": "确认",
|
||||||
|
"Select source image": "请选取源图像",
|
||||||
|
"Select target image": "请选取目标图像",
|
||||||
|
"Please provide mapping!": "请提供映射",
|
||||||
|
"Atleast 1 source with target is required!": "至少需要一个来源图像与目标图像相关!",
|
||||||
|
"At least 1 source with target is required!": "至少需要一个来源图像与目标图像相关!",
|
||||||
|
"Face could not be detected in last upload!": "最近上传的图像中没有检测到人脸!",
|
||||||
|
"Select Camera:": "选择摄像头",
|
||||||
|
"All mappings cleared!": "所有映射均已清除!",
|
||||||
|
"Mappings successfully submitted!": "成功提交映射!",
|
||||||
|
"Source x Target Mapper is already open.": "源 x 目标映射器已打开。"
|
||||||
|
}
|
|
@ -44,6 +44,7 @@ def parse_args() -> None:
|
||||||
program.add_argument('--mouth-mask', help='mask the mouth region', dest='mouth_mask', action='store_true', default=False)
|
program.add_argument('--mouth-mask', help='mask the mouth region', dest='mouth_mask', action='store_true', default=False)
|
||||||
program.add_argument('--video-encoder', help='adjust output video encoder', dest='video_encoder', default='libx264', choices=['libx264', 'libx265', 'libvpx-vp9'])
|
program.add_argument('--video-encoder', help='adjust output video encoder', dest='video_encoder', default='libx264', choices=['libx264', 'libx265', 'libvpx-vp9'])
|
||||||
program.add_argument('--video-quality', help='adjust output video quality', dest='video_quality', type=int, default=18, choices=range(52), metavar='[0-51]')
|
program.add_argument('--video-quality', help='adjust output video quality', dest='video_quality', type=int, default=18, choices=range(52), metavar='[0-51]')
|
||||||
|
program.add_argument('-l', '--lang', help='Ui language', default="en")
|
||||||
program.add_argument('--live-mirror', help='The live camera display as you see it in the front-facing camera frame', dest='live_mirror', action='store_true', default=False)
|
program.add_argument('--live-mirror', help='The live camera display as you see it in the front-facing camera frame', dest='live_mirror', action='store_true', default=False)
|
||||||
program.add_argument('--live-resizable', help='The live camera frame is resizable', dest='live_resizable', action='store_true', default=False)
|
program.add_argument('--live-resizable', help='The live camera frame is resizable', dest='live_resizable', action='store_true', default=False)
|
||||||
program.add_argument('--max-memory', help='maximum amount of RAM in GB', dest='max_memory', type=int, default=suggest_max_memory())
|
program.add_argument('--max-memory', help='maximum amount of RAM in GB', dest='max_memory', type=int, default=suggest_max_memory())
|
||||||
|
@ -78,6 +79,7 @@ def parse_args() -> None:
|
||||||
modules.globals.max_memory = args.max_memory
|
modules.globals.max_memory = args.max_memory
|
||||||
modules.globals.execution_providers = decode_execution_providers(args.execution_provider)
|
modules.globals.execution_providers = decode_execution_providers(args.execution_provider)
|
||||||
modules.globals.execution_threads = args.execution_threads
|
modules.globals.execution_threads = args.execution_threads
|
||||||
|
modules.globals.lang = args.lang
|
||||||
|
|
||||||
#for ENHANCER tumbler:
|
#for ENHANCER tumbler:
|
||||||
if 'face_enhancer' in args.frame_processor:
|
if 'face_enhancer' in args.frame_processor:
|
||||||
|
@ -253,5 +255,5 @@ def run() -> None:
|
||||||
if modules.globals.headless:
|
if modules.globals.headless:
|
||||||
start()
|
start()
|
||||||
else:
|
else:
|
||||||
window = ui.init(start, destroy)
|
window = ui.init(start, destroy, modules.globals.lang)
|
||||||
window.mainloop()
|
window.mainloop()
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
class LanguageManager:
|
||||||
|
def __init__(self, default_language="en"):
|
||||||
|
self.current_language = default_language
|
||||||
|
self.translations = {}
|
||||||
|
self.load_language(default_language)
|
||||||
|
|
||||||
|
def load_language(self, language_code) -> bool:
|
||||||
|
"""load language file"""
|
||||||
|
if language_code == "en":
|
||||||
|
return True
|
||||||
|
try:
|
||||||
|
file_path = Path(__file__).parent.parent / f"locales/{language_code}.json"
|
||||||
|
with open(file_path, "r", encoding="utf-8") as file:
|
||||||
|
self.translations = json.load(file)
|
||||||
|
self.current_language = language_code
|
||||||
|
return True
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(f"Language file not found: {language_code}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _(self, key, default=None) -> str:
|
||||||
|
"""get translate text"""
|
||||||
|
return self.translations.get(key, default if default else key)
|
Loading…
Reference in New Issue