forked from OpenTalker/SadTalker
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
269 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,197 @@ | ||
# this scripts installs necessary requirements and launches main program in webui.py | ||
# borrow from : https://github.com/AUTOMATIC1111/stable-diffusion-webui/blob/master/launch.py | ||
import subprocess | ||
import os | ||
import sys | ||
import importlib.util | ||
import shlex | ||
import platform | ||
import json | ||
|
||
python = sys.executable | ||
git = os.environ.get('GIT', "git") | ||
index_url = os.environ.get('INDEX_URL', "") | ||
stored_commit_hash = None | ||
skip_install = False | ||
dir_repos = "repositories" | ||
script_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) | ||
|
||
if 'GRADIO_ANALYTICS_ENABLED' not in os.environ: | ||
os.environ['GRADIO_ANALYTICS_ENABLED'] = 'False' | ||
|
||
|
||
def check_python_version(): | ||
is_windows = platform.system() == "Windows" | ||
major = sys.version_info.major | ||
minor = sys.version_info.minor | ||
micro = sys.version_info.micro | ||
|
||
if is_windows: | ||
supported_minors = [10] | ||
else: | ||
supported_minors = [7, 8, 9, 10, 11] | ||
|
||
if not (major == 3 and minor in supported_minors): | ||
|
||
raise (f""" | ||
INCOMPATIBLE PYTHON VERSION | ||
This program is tested with 3.10.6 Python, but you have {major}.{minor}.{micro}. | ||
If you encounter an error with "RuntimeError: Couldn't install torch." message, | ||
or any other error regarding unsuccessful package (library) installation, | ||
please downgrade (or upgrade) to the latest version of 3.10 Python | ||
and delete current Python and "venv" folder in WebUI's directory. | ||
You can download 3.10 Python from here: https://www.python.org/downloads/release/python-3109/ | ||
{"Alternatively, use a binary release of WebUI: https://github.com/AUTOMATIC1111/stable-diffusion-webui/releases" if is_windows else ""} | ||
Use --skip-python-version-check to suppress this warning. | ||
""") | ||
|
||
|
||
def commit_hash(): | ||
global stored_commit_hash | ||
|
||
if stored_commit_hash is not None: | ||
return stored_commit_hash | ||
|
||
try: | ||
stored_commit_hash = run(f"{git} rev-parse HEAD").strip() | ||
except Exception: | ||
stored_commit_hash = "<none>" | ||
|
||
return stored_commit_hash | ||
|
||
|
||
def run(command, desc=None, errdesc=None, custom_env=None, live=False): | ||
if desc is not None: | ||
print(desc) | ||
|
||
if live: | ||
result = subprocess.run(command, shell=True, env=os.environ if custom_env is None else custom_env) | ||
if result.returncode != 0: | ||
raise RuntimeError(f"""{errdesc or 'Error running command'}. | ||
Command: {command} | ||
Error code: {result.returncode}""") | ||
|
||
return "" | ||
|
||
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, env=os.environ if custom_env is None else custom_env) | ||
|
||
if result.returncode != 0: | ||
|
||
message = f"""{errdesc or 'Error running command'}. | ||
Command: {command} | ||
Error code: {result.returncode} | ||
stdout: {result.stdout.decode(encoding="utf8", errors="ignore") if len(result.stdout)>0 else '<empty>'} | ||
stderr: {result.stderr.decode(encoding="utf8", errors="ignore") if len(result.stderr)>0 else '<empty>'} | ||
""" | ||
raise RuntimeError(message) | ||
|
||
return result.stdout.decode(encoding="utf8", errors="ignore") | ||
|
||
|
||
def check_run(command): | ||
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) | ||
return result.returncode == 0 | ||
|
||
|
||
def is_installed(package): | ||
try: | ||
spec = importlib.util.find_spec(package) | ||
except ModuleNotFoundError: | ||
return False | ||
|
||
return spec is not None | ||
|
||
|
||
def repo_dir(name): | ||
return os.path.join(script_path, dir_repos, name) | ||
|
||
|
||
def run_python(code, desc=None, errdesc=None): | ||
return run(f'"{python}" -c "{code}"', desc, errdesc) | ||
|
||
|
||
def run_pip(args, desc=None): | ||
if skip_install: | ||
return | ||
|
||
index_url_line = f' --index-url {index_url}' if index_url != '' else '' | ||
return run(f'"{python}" -m pip {args} --prefer-binary{index_url_line}', desc=f"Installing {desc}", errdesc=f"Couldn't install {desc}") | ||
|
||
|
||
def check_run_python(code): | ||
return check_run(f'"{python}" -c "{code}"') | ||
|
||
|
||
def git_clone(url, dir, name, commithash=None): | ||
# TODO clone into temporary dir and move if successful | ||
|
||
if os.path.exists(dir): | ||
if commithash is None: | ||
return | ||
|
||
current_hash = run(f'"{git}" -C "{dir}" rev-parse HEAD', None, f"Couldn't determine {name}'s hash: {commithash}").strip() | ||
if current_hash == commithash: | ||
return | ||
|
||
run(f'"{git}" -C "{dir}" fetch', f"Fetching updates for {name}...", f"Couldn't fetch {name}") | ||
run(f'"{git}" -C "{dir}" checkout {commithash}', f"Checking out commit for {name} with hash: {commithash}...", f"Couldn't checkout commit {commithash} for {name}") | ||
return | ||
|
||
run(f'"{git}" clone "{url}" "{dir}"', f"Cloning {name} into {dir}...", f"Couldn't clone {name}") | ||
|
||
if commithash is not None: | ||
run(f'"{git}" -C "{dir}" checkout {commithash}', None, "Couldn't checkout {name}'s hash: {commithash}") | ||
|
||
|
||
def git_pull_recursive(dir): | ||
for subdir, _, _ in os.walk(dir): | ||
if os.path.exists(os.path.join(subdir, '.git')): | ||
try: | ||
output = subprocess.check_output([git, '-C', subdir, 'pull', '--autostash']) | ||
print(f"Pulled changes for repository in '{subdir}':\n{output.decode('utf-8').strip()}\n") | ||
except subprocess.CalledProcessError as e: | ||
print(f"Couldn't perform 'git pull' on repository in '{subdir}':\n{e.output.decode('utf-8').strip()}\n") | ||
|
||
|
||
def run_extension_installer(extension_dir): | ||
path_installer = os.path.join(extension_dir, "install.py") | ||
if not os.path.isfile(path_installer): | ||
return | ||
|
||
try: | ||
env = os.environ.copy() | ||
env['PYTHONPATH'] = os.path.abspath(".") | ||
|
||
print(run(f'"{python}" "{path_installer}"', errdesc=f"Error running install.py for extension {extension_dir}", custom_env=env)) | ||
except Exception as e: | ||
print(e, file=sys.stderr) | ||
|
||
|
||
def prepare_environment(): | ||
global skip_install | ||
|
||
torch_command = os.environ.get('TORCH_COMMAND', "pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 --extra-index-url https://download.pytorch.org/whl/cu117") | ||
requirements_file = os.environ.get('REQS_FILE', "requirements.txt") | ||
|
||
commit = commit_hash() | ||
|
||
print(f"Python {sys.version}") | ||
print(f"Commit hash: {commit}") | ||
|
||
if not is_installed("torch") or not is_installed("torchvision"): | ||
run(f'"{python}" -m {torch_command}', "Installing torch and torchvision", "Couldn't install torch", live=True) | ||
|
||
run_python("import torch; assert torch.cuda.is_available(), 'Torch is not able to use GPU; add --skip-torch-cuda-test to COMMANDLINE_ARGS variable to disable this check'") | ||
|
||
run_pip(f"install -r \"{requirements_file}\"", "requirements for SadTalker WebUI (may take longer time in first time)") | ||
|
||
|
||
def start(): | ||
print(f"Launching SadTalker Web UI") | ||
from app import sadtalker_demo | ||
demo = sadtalker_demo() | ||
demo.launch(share=True) | ||
|
||
if __name__ == "__main__": | ||
prepare_environment() | ||
start() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
@echo off | ||
|
||
IF NOT EXIST venv ( | ||
python -m venv venv | ||
) ELSE ( | ||
echo venv folder already exists, skipping creation... | ||
) | ||
call .\venv\Scripts\activate.bat | ||
|
||
set PYTHON="venv\Scripts\Python.exe" | ||
echo venv %PYTHON% | ||
|
||
%PYTHON% Launcher.py | ||
|
||
echo. | ||
echo Launch unsuccessful. Exiting. | ||
pause |