Commit
·
4ba2448
1
Parent(s):
dce1c7d
Upload 10 files
Browse files- .gitignore +31 -0
- Dockerfile +33 -0
- LICENSE +21 -0
- app.py +160 -0
- docker-compose.yml +15 -0
- requirements.txt +10 -0
- requirements_audiocraft.txt +4 -0
- requirements_bark_hubert_quantizer.txt +4 -0
- requirements_rvc.txt +3 -0
- update.py +33 -0
.gitignore
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Ignore Python bytecode
|
| 2 |
+
__pycache__
|
| 3 |
+
|
| 4 |
+
# Ignore settings
|
| 5 |
+
config.json
|
| 6 |
+
.env
|
| 7 |
+
|
| 8 |
+
# Ignore generated files
|
| 9 |
+
outputs/
|
| 10 |
+
favorites/
|
| 11 |
+
voices/
|
| 12 |
+
collections/
|
| 13 |
+
outputs-rvc/
|
| 14 |
+
voices-tortoise/
|
| 15 |
+
|
| 16 |
+
# Ignore model checkpoints
|
| 17 |
+
data/
|
| 18 |
+
|
| 19 |
+
# Ignore temporary files
|
| 20 |
+
temp/
|
| 21 |
+
|
| 22 |
+
# Ignore node modules
|
| 23 |
+
node_modules/
|
| 24 |
+
|
| 25 |
+
# Editors
|
| 26 |
+
.vscode/
|
| 27 |
+
.idea/
|
| 28 |
+
.sourcery.yaml
|
| 29 |
+
|
| 30 |
+
# Ignore temporary Jupiter notebooks
|
| 31 |
+
*.temp.ipynb
|
Dockerfile
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Python 3.10 w/ Nvidia Cuda
|
| 2 |
+
FROM nvidia/cuda:11.8.0-devel-ubuntu22.04 AS env_base
|
| 3 |
+
|
| 4 |
+
# Install Pre-reqs
|
| 5 |
+
RUN apt-get update && apt-get install --no-install-recommends -y \
|
| 6 |
+
git vim nano build-essential python3-dev python3-venv python3-pip gcc g++ ffmpeg
|
| 7 |
+
|
| 8 |
+
# Setup venv
|
| 9 |
+
RUN pip3 install virtualenv
|
| 10 |
+
RUN virtualenv /venv
|
| 11 |
+
ENV VIRTUAL_ENV=/venv
|
| 12 |
+
RUN python3 -m venv $VIRTUAL_ENV
|
| 13 |
+
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
|
| 14 |
+
RUN pip3 install --upgrade pip setuptools && \
|
| 15 |
+
pip3 install torch torchvision torchaudio
|
| 16 |
+
|
| 17 |
+
# Set working directory
|
| 18 |
+
WORKDIR /app
|
| 19 |
+
|
| 20 |
+
# Clone the repo
|
| 21 |
+
RUN git clone https://github.com/rsxdalv/tts-generation-webui.git
|
| 22 |
+
|
| 23 |
+
# Set working directory to the cloned repo
|
| 24 |
+
WORKDIR /app/tts-generation-webui
|
| 25 |
+
|
| 26 |
+
# Install all requirements
|
| 27 |
+
RUN pip3 install -r requirements.txt
|
| 28 |
+
RUN pip3 install -r requirements_audiocraft.txt
|
| 29 |
+
RUN pip3 install -r requirements_bark_hubert_quantizer.txt
|
| 30 |
+
RUN pip3 install -r requirements_rvc.txt
|
| 31 |
+
|
| 32 |
+
# Run the server
|
| 33 |
+
CMD python server.py
|
LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
MIT License
|
| 2 |
+
|
| 3 |
+
Copyright (c) 2023 Roberts Slisans
|
| 4 |
+
|
| 5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 6 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 7 |
+
in the Software without restriction, including without limitation the rights
|
| 8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 9 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 10 |
+
furnished to do so, subject to the following conditions:
|
| 11 |
+
|
| 12 |
+
The above copyright notice and this permission notice shall be included in all
|
| 13 |
+
copies or substantial portions of the Software.
|
| 14 |
+
|
| 15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 21 |
+
SOFTWARE.
|
app.py
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import src.utils.setup_or_recover as setup_or_recover
|
| 3 |
+
import src.utils.dotenv_init as dotenv_init
|
| 4 |
+
import gradio as gr
|
| 5 |
+
|
| 6 |
+
from src.config.load_config import default_config
|
| 7 |
+
from src.config.config import config
|
| 8 |
+
|
| 9 |
+
from src.css.css import full_css
|
| 10 |
+
from src.Joutai import Joutai
|
| 11 |
+
from src.history_tab.collections_directories_atom import collections_directories_atom
|
| 12 |
+
|
| 13 |
+
setup_or_recover.dummy()
|
| 14 |
+
dotenv_init.init()
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
def reload_config_and_restart_ui():
|
| 18 |
+
os._exit(0)
|
| 19 |
+
# print("Reloading config and restarting UI...")
|
| 20 |
+
# config = load_config()
|
| 21 |
+
# gradio_interface_options = config["gradio_interface_options"] if "gradio_interface_options" in config else {}
|
| 22 |
+
# demo.close()
|
| 23 |
+
# time.sleep(1)
|
| 24 |
+
# demo.launch(**gradio_interface_options)
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
gradio_interface_options = (
|
| 28 |
+
config["gradio_interface_options"]
|
| 29 |
+
if "gradio_interface_options" in config
|
| 30 |
+
else default_config
|
| 31 |
+
)
|
| 32 |
+
|
| 33 |
+
with gr.Blocks(
|
| 34 |
+
css=full_css,
|
| 35 |
+
title="TTS Generation WebUI",
|
| 36 |
+
analytics_enabled=False, # it broke too many times
|
| 37 |
+
) as demo:
|
| 38 |
+
gr.Markdown("# TTS Generation WebUI (Bark, MusicGen + AudioGen, Tortoise, RVC)")
|
| 39 |
+
with Joutai.singleton.tabs:
|
| 40 |
+
from src.tortoise.generation_tab_tortoise import generation_tab_tortoise
|
| 41 |
+
from src.settings_tab_gradio import settings_tab_gradio
|
| 42 |
+
from src.bark.generation_tab_bark import generation_tab_bark
|
| 43 |
+
from src.history_tab.main import history_tab
|
| 44 |
+
from src.bark.settings_tab_bark import settings_tab_bark
|
| 45 |
+
from src.history_tab.voices_tab import voices_tab
|
| 46 |
+
from src.vocos.vocos_tabs import vocos_tabs
|
| 47 |
+
from src.studio.studio_tab import simple_remixer_tab
|
| 48 |
+
|
| 49 |
+
register_use_as_history_button = generation_tab_bark()
|
| 50 |
+
|
| 51 |
+
try:
|
| 52 |
+
from src.bark.clone.tab_voice_clone import tab_voice_clone
|
| 53 |
+
|
| 54 |
+
tab_voice_clone(register_use_as_history_button)
|
| 55 |
+
except Exception as e:
|
| 56 |
+
from src.bark.clone.tab_voice_clone_error import tab_voice_clone_error
|
| 57 |
+
|
| 58 |
+
tab_voice_clone_error(e)
|
| 59 |
+
print("Failed to load voice clone demo")
|
| 60 |
+
print(e)
|
| 61 |
+
|
| 62 |
+
try:
|
| 63 |
+
from src.musicgen.musicgen_tab import generation_tab_musicgen
|
| 64 |
+
|
| 65 |
+
generation_tab_musicgen()
|
| 66 |
+
except Exception as e:
|
| 67 |
+
from src.musicgen.musicgen_tab_error import musicgen_tab_error
|
| 68 |
+
|
| 69 |
+
musicgen_tab_error(e)
|
| 70 |
+
print("Failed to load musicgen demo")
|
| 71 |
+
print(e)
|
| 72 |
+
|
| 73 |
+
try:
|
| 74 |
+
from src.rvc_tab.rvc_tab import rvc_conversion_tab
|
| 75 |
+
|
| 76 |
+
rvc_conversion_tab()
|
| 77 |
+
except Exception as e:
|
| 78 |
+
from src.rvc_tab.rvc_tab_error import rvc_tab_error
|
| 79 |
+
|
| 80 |
+
rvc_tab_error(e)
|
| 81 |
+
print("Failed to load rvc demo")
|
| 82 |
+
print(e)
|
| 83 |
+
|
| 84 |
+
try:
|
| 85 |
+
from src.demucs.demucs_tab import demucs_tab
|
| 86 |
+
|
| 87 |
+
demucs_tab()
|
| 88 |
+
except Exception as e:
|
| 89 |
+
from src.demucs.demucs_tab_error import demucs_tab_error
|
| 90 |
+
|
| 91 |
+
demucs_tab_error(e)
|
| 92 |
+
print("Failed to load demucs demo")
|
| 93 |
+
print(e)
|
| 94 |
+
|
| 95 |
+
vocos_tabs()
|
| 96 |
+
generation_tab_tortoise()
|
| 97 |
+
|
| 98 |
+
collections_directories_atom.render()
|
| 99 |
+
history_tab(register_use_as_history_button)
|
| 100 |
+
history_tab(register_use_as_history_button, directory="favorites")
|
| 101 |
+
history_tab(
|
| 102 |
+
register_use_as_history_button, directory="outputs", show_collections=True
|
| 103 |
+
)
|
| 104 |
+
voices_tab(register_use_as_history_button)
|
| 105 |
+
|
| 106 |
+
with gr.Tab("Settings"):
|
| 107 |
+
from src.settings_tab_gradio import settings_tab_gradio
|
| 108 |
+
|
| 109 |
+
settings_tab_gradio(reload_config_and_restart_ui, gradio_interface_options)
|
| 110 |
+
|
| 111 |
+
from src.bark.settings_tab_bark import settings_tab_bark
|
| 112 |
+
|
| 113 |
+
settings_tab_bark()
|
| 114 |
+
from src.utils.model_location_settings_tab import (
|
| 115 |
+
model_location_settings_tab,
|
| 116 |
+
)
|
| 117 |
+
|
| 118 |
+
model_location_settings_tab()
|
| 119 |
+
|
| 120 |
+
remixer_input = simple_remixer_tab()
|
| 121 |
+
Joutai.singleton.tabs.render()
|
| 122 |
+
|
| 123 |
+
|
| 124 |
+
def print_pretty_options(options):
|
| 125 |
+
print("Gradio interface options:")
|
| 126 |
+
max_key_length = max(len(key) for key in options.keys())
|
| 127 |
+
for key, value in options.items():
|
| 128 |
+
if key == "auth" and value is not None:
|
| 129 |
+
print(f" {key}:{' ' * (max_key_length - len(key))} {value[0]}:******")
|
| 130 |
+
else:
|
| 131 |
+
print(f" {key}:{' ' * (max_key_length - len(key))} {value}")
|
| 132 |
+
|
| 133 |
+
|
| 134 |
+
# detect if --share is passed
|
| 135 |
+
if "--share" in os.sys.argv:
|
| 136 |
+
print("Gradio share mode enabled")
|
| 137 |
+
gradio_interface_options["share"] = True
|
| 138 |
+
|
| 139 |
+
|
| 140 |
+
print("Starting Gradio server...")
|
| 141 |
+
if not gradio_interface_options["enable_queue"]:
|
| 142 |
+
print("Warning: Gradio server queue is disabled. Automatically enabling")
|
| 143 |
+
gradio_interface_options["enable_queue"] = True
|
| 144 |
+
if gradio_interface_options["auth"] is not None:
|
| 145 |
+
# split username:password into (username, password)
|
| 146 |
+
gradio_interface_options["auth"] = tuple(
|
| 147 |
+
gradio_interface_options["auth"].split(":")
|
| 148 |
+
)
|
| 149 |
+
print("Gradio server authentication enabled")
|
| 150 |
+
print_pretty_options(gradio_interface_options)
|
| 151 |
+
|
| 152 |
+
|
| 153 |
+
def start_server():
|
| 154 |
+
demo.queue(
|
| 155 |
+
concurrency_count=gradio_interface_options.get("concurrency_count", 5),
|
| 156 |
+
).launch(**gradio_interface_options)
|
| 157 |
+
|
| 158 |
+
|
| 159 |
+
if __name__ == "__main__":
|
| 160 |
+
start_server()
|
docker-compose.yml
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version: '3'
|
| 2 |
+
services:
|
| 3 |
+
tts-generation-webui:
|
| 4 |
+
image: rsxdalv/tts-generation-webui
|
| 5 |
+
restart: unless-stopped
|
| 6 |
+
ports:
|
| 7 |
+
- "7860:7860"
|
| 8 |
+
container_name: tts-generation-webui
|
| 9 |
+
deploy:
|
| 10 |
+
resources:
|
| 11 |
+
reservations:
|
| 12 |
+
devices:
|
| 13 |
+
- driver: nvidia
|
| 14 |
+
device_ids: ['0']
|
| 15 |
+
capabilities: [gpu]
|
requirements.txt
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
safetensors==0.3.1 # Until they fix it
|
| 2 |
+
torch==2.0.0 # BSD 3-Clause - ensures torch is not reinstalled
|
| 3 |
+
ffmpeg-python # Apache 2.0
|
| 4 |
+
gradio==3.35.2
|
| 5 |
+
python-dotenv==1.0.0
|
| 6 |
+
soundfile==0.12.1; sys_platform == 'win32' # torchaudio
|
| 7 |
+
# sox # torchaudio for linux
|
| 8 |
+
suno-bark @ git+https://github.com/suno-ai/bark@56b0ba13f7c281cbffa07ea9abf7b30273a60b6a#egg=suno-bark # MIT License
|
| 9 |
+
vocos==0.0.2 # MIT License
|
| 10 |
+
tortoise @ git+https://github.com/rsxdalv/tortoise-tts@72eccabcb7d4c7a9d943a2c9b63211e4286cf385#egg=tortoise # Apache 2.0
|
requirements_audiocraft.txt
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
torch==2.0.0 # BSD 3-Clause - ensures torch is not reinstalled
|
| 2 |
+
# audiocraft==0.0.1 # MIT License
|
| 3 |
+
xformers==0.0.19 # For torch==2.0.0 project plane
|
| 4 |
+
audiocraft @ git+https://[email protected]/facebookresearch/audiocraft@e96018613ac82b1afe0f0cce7861dfe08ba2b3bf#egg=audiocraft # MIT License
|
requirements_bark_hubert_quantizer.txt
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
torch==2.0.0 # BSD 3-Clause - ensures torch is not reinstalled
|
| 2 |
+
# pre-install fairseq for bark_hubert_quantizer
|
| 3 |
+
fairseq @ https://github.com/Sharrnah/fairseq/releases/download/v0.12.4/fairseq-0.12.4-cp310-cp310-win_amd64.whl ; sys_platform == 'win32' # MIT License
|
| 4 |
+
bark_hubert_quantizer @ git+https://github.com/rsxdalv/bark-voice-cloning-HuBERT-quantizer@bark_hubert_quantizer#egg=bark_hubert_quantizer # MIT License
|
requirements_rvc.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
torch==2.0.0 # BSD 3-Clause - ensures torch is not reinstalled
|
| 2 |
+
torchcrepe @ git+https://github.com/rsxdalv/torchcrepe@patch-1 # MIT License
|
| 3 |
+
rvc-beta @ git+https://github.com/rsxdalv/Retrieval-based-Voice-Conversion-WebUI@package # MIT License
|
update.py
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import subprocess
|
| 2 |
+
|
| 3 |
+
|
| 4 |
+
def do(cmd): # https://stackoverflow.com/a/62986640
|
| 5 |
+
try:
|
| 6 |
+
run = subprocess.run(cmd, shell=True)
|
| 7 |
+
run.check_returncode()
|
| 8 |
+
return run
|
| 9 |
+
except subprocess.CalledProcessError as e:
|
| 10 |
+
print(e.stderr.decode().strip())
|
| 11 |
+
raise e
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
def try_install(requirements, name=None):
|
| 15 |
+
try:
|
| 16 |
+
print(f"Installing {name or requirements} dependencies...")
|
| 17 |
+
do(f"pip install -r {requirements}")
|
| 18 |
+
print(f"Successfully installed {name or requirements} dependencies")
|
| 19 |
+
except Exception:
|
| 20 |
+
print(f"Failed to install {name or requirements} dependencies")
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
def main():
|
| 24 |
+
print("Updating dependencies...")
|
| 25 |
+
try_install("requirements_audiocraft.txt", "musicgen, audiocraft")
|
| 26 |
+
try_install("requirements_bark_hubert_quantizer.txt", "Bark Voice Clone, bark-hubert-quantizer")
|
| 27 |
+
try_install("requirements_rvc.txt", "RVC")
|
| 28 |
+
# hydracore fix because of fairseq
|
| 29 |
+
do("pip install hydra-core==1.3.2")
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
if __name__ == "__main__":
|
| 33 |
+
main()
|