Files

604 lines
21 KiB
Python
Raw Permalink Normal View History

2021-03-10 15:56:40 +00:00
import os
import io
import zipfile
2021-03-16 17:48:27 +00:00
import traceback
2021-03-18 12:27:38 +00:00
import torch
2021-09-08 17:12:20 +01:00
from datetime import datetime
2021-09-18 16:26:28 +01:00
from pathlib import Path
import re
2021-03-10 15:56:40 +00:00
from main import app, paths
2021-03-22 19:34:45 +00:00
from application.utils import (
start_progress_thread,
2021-09-18 13:23:16 +01:00
serve_file,
2021-03-22 19:34:45 +00:00
get_next_url,
2021-04-01 19:12:38 +01:00
get_suffix,
2021-04-07 20:26:51 +01:00
delete_folder,
2021-05-02 17:09:23 +01:00
import_dataset,
2021-03-22 19:34:45 +00:00
)
2021-11-28 18:56:59 +00:00
from dataset import AUDIO_FOLDER, UNLABELLED_FOLDER, METADATA_FILE, INFO_FILE, CHARACTER_ENCODING
2021-11-28 18:50:45 +00:00
from dataset.create_dataset import create_dataset
2021-11-28 18:38:21 +00:00
from dataset.utils import add_suffix
2021-04-15 00:23:55 +01:00
from dataset.extend_existing_dataset import extend_existing_dataset
from dataset.analysis import get_total_audio_duration, validate_dataset, update_dataset_info
2021-11-25 21:43:59 +00:00
from dataset.transcribe import Silero, DeepSpeech, SILERO_LANGUAGES
from training import TRAIN_FILE, VALIDATION_FILE
2021-11-26 17:15:58 +00:00
from training.train import train, TRAINING_PATH, DEFAULT_ALPHABET
from training.utils import (
get_available_memory,
get_gpu_memory,
get_batch_size,
load_symbols,
generate_timelapse_gif,
create_trainlist_vallist_files,
)
2021-12-08 20:11:27 +00:00
from training.hifigan.train import BATCH_SIZE_PER_GB, CONFIG_FILE
2021-12-05 17:07:07 +00:00
from training.hifigan.train import train as train_hifigan
from training.hifigan.utils import get_checkpoint_options
2021-04-24 16:06:12 +01:00
from synthesis.synthesize import load_model, synthesize
2021-08-01 19:36:37 +01:00
from synthesis.vocoders import Hifigan
2021-03-10 15:56:40 +00:00
2021-06-04 22:53:03 +01:00
from flask import redirect, render_template, request, send_file
2021-03-10 15:56:40 +00:00
URLS = {"/": "Build dataset", "/train": "Train", "/synthesis-setup": "Synthesis"}
2021-11-25 21:43:59 +00:00
ALPHABET_FOLDER = "alphabets"
2021-03-10 15:56:40 +00:00
TEXT_FILE = "text.txt"
2021-08-09 16:39:34 +01:00
SUBTITLE_FILE = "sub.srt"
2021-03-10 15:56:40 +00:00
CHECKPOINT_FOLDER = "checkpoints"
GRAPH_FILE = "graph.png"
RESULTS_FILE = "out.wav"
2021-05-02 17:09:05 +01:00
TEMP_DATASET_UPLOAD = "temp.zip"
2021-06-03 19:57:18 +01:00
TRANSCRIPTION_MODEL = "model.pbmm"
2021-11-26 17:15:58 +00:00
ENGLISH_LANGUAGE = "English"
2021-06-03 19:57:18 +01:00
ALPHABET_FILE = "alphabet.txt"
2021-03-10 15:56:40 +00:00
model = None
2021-04-24 16:06:12 +01:00
vocoder = None
2021-06-03 19:57:18 +01:00
symbols = None
2021-03-10 15:56:40 +00:00
2021-07-17 17:08:59 +01:00
def get_languages():
2021-11-25 21:43:59 +00:00
silero_languages = {language: True for language in SILERO_LANGUAGES}
custom_models = {
language: os.path.isfile(os.path.join(paths["languages"], language, TRANSCRIPTION_MODEL))
for language in os.listdir(paths["languages"])
}
return {**silero_languages, **custom_models}
2021-07-17 17:08:59 +01:00
def get_checkpoints():
# Checkpoints ordered by name (i.e. checkpoint_0, checkpoint_1000 etc.)
return {
model: sorted(
2021-07-26 13:14:41 +01:00
os.listdir(os.path.join(paths["models"], model)),
2021-07-26 17:06:51 +01:00
key=lambda name: int(name.split("_")[1]) if "_" in name and name.split("_")[1].isdigit() else 0,
2021-07-26 13:14:41 +01:00
reverse=True,
)
for model in os.listdir(paths["models"])
2021-07-27 20:58:04 +01:00
if os.listdir(os.path.join(paths["models"], model))
}
2021-12-05 17:07:07 +00:00
def get_hifigan_checkpoints():
return {
model: get_checkpoint_options(os.path.join(paths["hifigan_training"], model))
for model in os.listdir(paths["hifigan_training"])
if os.listdir(os.path.join(paths["hifigan_training"], model))
}
2021-11-26 17:15:58 +00:00
def get_symbols(language):
if language == ENGLISH_LANGUAGE:
return DEFAULT_ALPHABET
elif language in SILERO_LANGUAGES:
return load_symbols(os.path.join(ALPHABET_FOLDER, f"{language}.txt"))
else:
return load_symbols(os.path.join(paths["languages"], language, ALPHABET_FILE))
2021-03-13 15:37:10 +00:00
@app.errorhandler(Exception)
def handle_bad_request(e):
2021-03-22 19:34:45 +00:00
error = {"type": e.__class__.__name__, "text": str(e), "stacktrace": traceback.format_exc()}
2021-03-13 15:37:10 +00:00
return render_template("error.html", error=error)
2021-03-10 15:56:40 +00:00
@app.context_processor
def inject_data():
2021-04-04 15:26:31 +01:00
return {"urls": URLS, "path": request.path}
2021-03-10 15:56:40 +00:00
2021-04-04 15:26:31 +01:00
# Dataset
@app.route("/", methods=["GET"])
def get_create_dataset():
2021-07-23 15:40:32 +01:00
return render_template("index.html", datasets=os.listdir(paths["datasets"]), languages=get_languages())
2021-03-10 15:56:40 +00:00
2021-03-23 15:47:46 +00:00
2021-03-10 15:56:40 +00:00
@app.route("/", methods=["POST"])
def create_dataset_post():
2021-07-03 12:54:45 +01:00
min_confidence = float(request.form["confidence"])
2021-06-03 19:57:18 +01:00
language = request.form["language"]
2021-08-26 20:16:48 +01:00
combine_clips = request.form.get("combine_clips") is not None
min_length = float(request.form["min_length"])
max_length = float(request.form["max_length"])
2021-11-25 21:43:59 +00:00
transcription_model = (
Silero(language)
if language in SILERO_LANGUAGES
else DeepSpeech(os.path.join(paths["languages"], language, TRANSCRIPTION_MODEL))
2021-07-23 15:40:32 +01:00
)
2021-11-28 18:38:21 +00:00
symbols = get_symbols(language)
2021-08-09 16:39:34 +01:00
text_file = SUBTITLE_FILE if request.files["text_file"].filename.endswith(".srt") else TEXT_FILE
2021-04-23 11:44:20 +01:00
2021-03-10 15:56:40 +00:00
if request.form["name"]:
output_folder = os.path.join(paths["datasets"], request.form["name"])
if os.path.exists(output_folder):
request.files = None
raise Exception("Dataset name taken")
2021-04-25 13:42:42 +01:00
os.makedirs(output_folder, exist_ok=True)
2021-08-09 16:39:34 +01:00
text_path = os.path.join(output_folder, text_file)
2021-04-25 13:42:42 +01:00
audio_path = os.path.join(output_folder, request.files["audio_file"].filename)
2021-03-10 15:56:40 +00:00
2021-07-03 13:19:47 +01:00
with open(text_path, "w", encoding=CHARACTER_ENCODING) as f:
f.write(request.files["text_file"].read().decode(CHARACTER_ENCODING, "ignore").replace("\r\n", "\n"))
2021-03-10 15:56:40 +00:00
request.files["audio_file"].save(audio_path)
start_progress_thread(
create_dataset,
text_path=text_path,
audio_path=audio_path,
2021-06-04 11:23:29 +01:00
transcription_model=transcription_model,
output_folder=output_folder,
min_length=min_length,
max_length=max_length,
2021-07-03 12:54:45 +01:00
min_confidence=min_confidence,
2021-08-26 20:16:48 +01:00
combine_clips=combine_clips,
2021-11-28 18:56:59 +00:00
symbols=symbols,
2021-03-10 15:56:40 +00:00
)
else:
2021-07-25 19:49:26 +01:00
output_folder = os.path.join(paths["datasets"], request.form["dataset"])
2021-04-01 19:12:38 +01:00
suffix = get_suffix()
2021-08-09 16:39:34 +01:00
text_path = os.path.join(output_folder, add_suffix(text_file, suffix))
audio_path = os.path.join(output_folder, add_suffix(request.files["audio_file"].filename, suffix))
2021-03-10 15:56:40 +00:00
2021-07-03 13:19:47 +01:00
with open(text_path, "w", encoding=CHARACTER_ENCODING) as f:
f.write(request.files["text_file"].read().decode(CHARACTER_ENCODING, "ignore").replace("\r\n", "\n"))
2021-03-10 15:56:40 +00:00
request.files["audio_file"].save(audio_path)
start_progress_thread(
extend_existing_dataset,
text_path=text_path,
audio_path=audio_path,
2021-06-04 11:23:29 +01:00
transcription_model=transcription_model,
2021-11-28 18:38:21 +00:00
output_folder=output_folder,
2021-04-01 19:12:38 +01:00
suffix=suffix,
min_length=min_length,
max_length=max_length,
2021-07-03 12:54:45 +01:00
min_confidence=min_confidence,
2021-08-26 20:16:48 +01:00
combine_clips=combine_clips,
2021-11-28 18:56:59 +00:00
symbols=symbols,
2021-03-10 15:56:40 +00:00
)
return render_template("progress.html", next_url=get_next_url(URLS, request.path))
@app.route("/dataset-duration", methods=["GET"])
def get_dataset_duration():
dataset = request.values["dataset"]
dataset_error = validate_dataset(os.path.join(paths["datasets"], dataset))
2021-04-04 13:19:08 +01:00
if not dataset_error:
2021-10-14 21:35:16 +01:00
return get_total_audio_duration(os.path.join(paths["datasets"], dataset, INFO_FILE))
2021-04-04 13:19:08 +01:00
else:
return {"error": dataset_error}
2021-03-10 15:56:40 +00:00
2021-04-04 15:26:31 +01:00
# Training
@app.route("/train", methods=["GET"])
def get_train():
cuda_enabled = torch.cuda.is_available()
if cuda_enabled:
available_memory_gb = get_available_memory()
batch_size = get_batch_size(available_memory_gb)
else:
batch_size = None
return render_template(
2021-06-04 14:47:47 +01:00
"train.html",
cuda_enabled=cuda_enabled,
batch_size=batch_size,
datasets=os.listdir(paths["datasets"]),
2021-07-25 20:19:37 +01:00
checkpoints=get_checkpoints(),
2021-07-17 17:08:59 +01:00
languages=get_languages(),
2021-04-04 15:26:31 +01:00
)
2021-03-10 15:56:40 +00:00
@app.route("/train", methods=["POST"])
def train_post():
2021-06-03 19:57:18 +01:00
language = request.form["language"]
2021-11-26 17:15:58 +00:00
symbols = get_symbols(language)
2021-07-25 19:49:26 +01:00
dataset_name = request.form["dataset"]
2021-03-10 15:56:40 +00:00
epochs = request.form["epochs"]
2021-04-14 23:53:33 +01:00
batch_size = request.form["batch_size"]
2021-04-15 14:58:41 +01:00
early_stopping = request.form.get("early_stopping") is not None
2021-04-25 13:04:59 +01:00
iters_per_checkpoint = request.form["checkpoint_frequency"]
2021-08-09 13:35:48 +01:00
iters_per_backup_checkpoint = request.form["backup_checkpoint_frequency"]
2021-07-27 20:58:04 +01:00
train_size = 1 - float(request.form["validation_size"])
2021-09-17 17:45:31 +01:00
alignment_sentence = request.form["alignment_sentence"]
2021-07-17 17:43:20 +01:00
multi_gpu = request.form.get("multi_gpu") is not None
2021-07-26 13:14:41 +01:00
checkpoint_path = (
2021-07-27 20:58:04 +01:00
os.path.join(paths["models"], dataset_name, request.form["checkpoint"])
if request.form.get("checkpoint")
else None
2021-07-26 13:14:41 +01:00
)
2021-03-13 16:29:49 +00:00
2021-03-10 15:56:40 +00:00
metadata_path = os.path.join(paths["datasets"], dataset_name, METADATA_FILE)
use_metadata = os.path.isfile(metadata_path)
trainlist_path = os.path.join(paths["datasets"], dataset_name, TRAIN_FILE)
vallist_path = os.path.join(paths["datasets"], dataset_name, VALIDATION_FILE)
2021-03-10 15:56:40 +00:00
audio_folder = os.path.join(paths["datasets"], dataset_name, AUDIO_FOLDER)
checkpoint_folder = os.path.join(paths["models"], dataset_name)
2021-03-13 16:29:49 +00:00
if request.files.get("pretrained_model"):
transfer_learning_path = os.path.join("data", "pretrained.pt")
2021-03-22 21:05:33 +00:00
request.files["pretrained_model"].save(transfer_learning_path)
2021-03-13 16:29:49 +00:00
else:
2021-03-22 21:05:33 +00:00
transfer_learning_path = None
2021-03-13 16:29:49 +00:00
2021-03-10 15:56:40 +00:00
start_progress_thread(
train,
metadata_path=metadata_path if use_metadata else None,
trainlist_path=trainlist_path if not use_metadata else None,
vallist_path=vallist_path if not use_metadata else None,
audio_directory=audio_folder,
2021-03-10 15:56:40 +00:00
output_directory=checkpoint_folder,
2021-11-26 17:15:58 +00:00
symbols=symbols,
2021-07-25 20:19:37 +01:00
checkpoint_path=checkpoint_path,
2021-03-22 21:05:33 +00:00
transfer_learning_path=transfer_learning_path,
2021-03-10 15:56:40 +00:00
epochs=int(epochs),
2021-04-15 00:23:55 +01:00
batch_size=int(batch_size),
2021-04-23 11:50:11 +01:00
early_stopping=early_stopping,
2021-07-17 17:43:20 +01:00
multi_gpu=multi_gpu,
2021-04-25 13:42:59 +01:00
iters_per_checkpoint=int(iters_per_checkpoint),
2021-08-09 13:35:48 +01:00
iters_per_backup_checkpoint=int(iters_per_backup_checkpoint),
2021-07-27 20:58:04 +01:00
train_size=train_size,
2021-09-18 16:33:43 +01:00
alignment_sentence=alignment_sentence,
2021-03-10 15:56:40 +00:00
)
2021-09-18 16:33:43 +01:00
return render_template(
"progress.html", next_url=get_next_url(URLS, request.path), voice=Path(checkpoint_folder).stem
)
2021-03-10 15:56:40 +00:00
2021-09-18 13:23:16 +01:00
@app.route("/alignment-timelapse", methods=["GET"])
def download_alignment_timelapse():
name = request.args.get("name")
folder = os.path.join(TRAINING_PATH, name)
output = os.path.join(TRAINING_PATH, f"{name}-training.gif")
generate_timelapse_gif(folder, output)
2021-09-18 15:59:23 +01:00
return serve_file(output, f"{name}-training.gif", "image/png", as_attachment=False)
2021-09-18 13:23:16 +01:00
2021-04-04 15:26:31 +01:00
# Synthesis
@app.route("/synthesis-setup", methods=["GET"])
def get_synthesis_setup():
return render_template(
2021-04-24 20:48:06 +01:00
"synthesis-setup.html",
hifigan_models=os.listdir(paths["hifigan"]),
2021-12-08 20:11:27 +00:00
hifigan_custom_models=get_hifigan_checkpoints(),
2021-04-24 20:48:06 +01:00
models=os.listdir(paths["models"]),
checkpoints=get_checkpoints(),
2021-07-17 17:08:59 +01:00
languages=get_languages(),
2021-04-04 15:26:31 +01:00
)
2021-03-10 15:56:40 +00:00
@app.route("/synthesis-setup", methods=["POST"])
def synthesis_setup_post():
2021-07-27 15:23:13 +01:00
global model, vocoder, symbols
2021-07-25 19:49:26 +01:00
dataset_name = request.form["model"]
2021-06-03 19:57:18 +01:00
language = request.form["language"]
2021-11-26 17:15:58 +00:00
symbols = get_symbols(language)
2021-03-10 15:56:40 +00:00
checkpoint_folder = os.path.join(paths["models"], dataset_name)
checkpoint = os.path.join(checkpoint_folder, request.form["checkpoint"])
2021-03-10 15:56:40 +00:00
model = load_model(checkpoint)
2021-12-08 20:11:27 +00:00
if request.form["vocoder"].startswith("custom-"):
checkpoint_iteration = request.form["vocoder"].split("-")[1]
model_path = os.path.join(paths["hifigan_training"], dataset_name, f"g_{checkpoint_iteration}")
model_config_path = CONFIG_FILE
else:
hifigan_folder = os.path.join(paths["hifigan"], request.form["vocoder"])
model_path = os.path.join(hifigan_folder, "model.pt")
model_config_path = os.path.join(hifigan_folder, "config.json")
2021-12-12 21:15:33 +00:00
2021-12-08 20:11:27 +00:00
vocoder = Hifigan(model_path, model_config_path)
2021-03-10 15:56:40 +00:00
return redirect("/synthesis")
2021-09-17 18:26:16 +01:00
@app.route("/data/<path:path>")
def get_file(path):
2021-12-09 18:22:41 +00:00
subfolder = path.split("/")[0]
subpath = path.split("/")[1:-1]
2021-03-18 12:27:38 +00:00
filename = path.split("/")[-1]
mimetype = "image/png" if filename.endswith("png") else "audio/wav"
2021-12-09 18:22:41 +00:00
filepath = os.path.join(paths[subfolder], *subpath, filename)
return serve_file(filepath, filename, mimetype)
2021-03-18 12:44:21 +00:00
2021-03-18 12:27:38 +00:00
2021-04-05 15:47:46 +01:00
@app.route("/synthesis", methods=["GET", "POST"])
2021-03-10 15:56:40 +00:00
def synthesis_post():
2021-06-03 19:57:18 +01:00
global model, vocoder, symbols
if not model or not vocoder or not symbols:
2021-04-04 15:26:31 +01:00
return redirect("/synthesis-setup")
2021-03-10 15:56:40 +00:00
2021-04-05 15:47:46 +01:00
if request.method == "GET":
return render_template("synthesis.html")
else:
2021-08-29 16:27:52 +01:00
text = request.form.getlist("text")
if len(text) == 1:
text = text[0]
2021-08-29 17:16:51 +01:00
method = request.form["text_method"]
split_text = method == "paragraph"
2021-09-08 17:12:20 +01:00
parent_folder = os.path.join(paths["results"], datetime.now().strftime("%Y-%m"))
os.makedirs(parent_folder, exist_ok=True)
first_line = text[0] if type(text) == list else text
2021-11-25 17:37:52 +00:00
results_folder = os.path.join(
parent_folder, get_suffix() + "-" + re.sub("[^0-9a-zA-Z _]+", "", first_line.replace(" ", "_"))[:20]
)
2021-04-05 15:47:46 +01:00
os.makedirs(results_folder)
graph_path = os.path.join(results_folder, GRAPH_FILE)
audio_path = os.path.join(results_folder, RESULTS_FILE)
2021-12-09 18:22:41 +00:00
graph_web_path = os.path.relpath(graph_path).replace("\\", "/")
audio_web_path = os.path.relpath(audio_path).replace("\\", "/")
silence = float(request.form["silence"])
max_decoder_steps = int(request.form["max_decoder_steps"])
synthesize(
model,
text,
symbols,
graph_path,
audio_path,
vocoder,
silence,
max_decoder_steps=max_decoder_steps,
2021-09-06 22:39:43 +01:00
split_text=split_text,
)
2021-04-05 15:47:46 +01:00
return render_template(
"synthesis.html",
2021-08-29 16:27:52 +01:00
text=text,
2021-08-29 17:16:51 +01:00
method=method,
2021-04-05 15:47:46 +01:00
graph=graph_web_path,
audio=audio_web_path,
silence=silence,
max_decoder_steps=max_decoder_steps,
2021-04-05 15:47:46 +01:00
)
2021-03-10 15:56:40 +00:00
2021-12-05 17:07:07 +00:00
# Train hifigan
@app.route("/train-hifigan", methods=["GET"])
def get_train_hifigan():
cuda_enabled = torch.cuda.is_available()
if cuda_enabled:
available_memory = get_gpu_memory(0)
batch_size = int(available_memory * BATCH_SIZE_PER_GB)
else:
batch_size = None
return render_template(
"train-hifigan.html",
cuda_enabled=cuda_enabled,
batch_size=batch_size,
datasets=os.listdir(paths["datasets"]),
2021-12-12 21:15:33 +00:00
checkpoints=get_hifigan_checkpoints(),
2021-12-05 17:07:07 +00:00
)
# Train hifigan
@app.route("/train-hifigan", methods=["POST"])
def train_hifigan_post():
dataset_name = request.form["dataset"]
epochs = request.form["epochs"]
batch_size = request.form["batch_size"]
iters_per_checkpoint = request.form["checkpoint_frequency"]
iters_per_backup_checkpoint = request.form["backup_checkpoint_frequency"]
train_size = 1 - float(request.form["validation_size"])
audio_folder = os.path.join(paths["datasets"], dataset_name, AUDIO_FOLDER)
output_directory = os.path.join(paths["hifigan_training"], dataset_name)
if request.form.get("checkpoint_iteration"):
2021-12-12 21:15:33 +00:00
checkpoint_g = os.path.join(
paths["hifigan_training"], dataset_name, f"g_{request.form['checkpoint_iteration']}"
)
checkpoint_do = os.path.join(
paths["hifigan_training"], dataset_name, f"do_{request.form['checkpoint_iteration']}"
)
2021-12-05 17:07:07 +00:00
elif request.files.get("pretrained_model_g"):
checkpoint_g = os.path.join("data", "pretrained_model_g.pt")
checkpoint_do = os.path.join("data", "pretrained_model_do.pt")
request.files["pretrained_model_g"].save(checkpoint_g)
request.files["pretrained_model_do"].save(checkpoint_do)
else:
checkpoint_g = None
checkpoint_do = None
start_progress_thread(
train_hifigan,
audio_folder=audio_folder,
output_directory=output_directory,
checkpoint_g=checkpoint_g,
checkpoint_do=checkpoint_do,
epochs=int(epochs),
batch_size=int(batch_size),
iters_per_checkpoint=int(iters_per_checkpoint),
iters_per_backup_checkpoint=int(iters_per_backup_checkpoint),
train_size=train_size,
)
2021-12-12 21:15:33 +00:00
return render_template("progress.html", next_url="/synthesis")
2021-12-05 17:07:07 +00:00
2021-10-14 21:35:16 +01:00
# Manage datasets
@app.route("/manage-datasets", methods=["GET"])
def manage_datasets():
return render_template(
2021-11-25 17:37:52 +00:00
"manage-datasets.html", datasets=os.listdir(paths["datasets"]), selected=request.values.get("dataset")
2021-10-14 21:35:16 +01:00
)
2021-10-16 19:43:02 +01:00
@app.route("/unlabelled-clips", methods=["GET"])
def unlabelled_clips():
dataset = request.values["dataset"]
unlabelled_folder = os.path.join(paths["datasets"], dataset, UNLABELLED_FOLDER)
unlabelled_clips = os.listdir(unlabelled_folder) if os.path.isdir(unlabelled_folder) else []
return {"unlabelled": unlabelled_clips}
@app.route("/label-clip", methods=["POST"])
def label_clip():
dataset = request.values["dataset"]
clip = request.values["unlabelled_clip"]
text = request.values["sentence"]
# Update dataset size
update_dataset_info(
2022-02-06 21:02:24 +00:00
os.path.join(paths["datasets"], dataset, METADATA_FILE),
os.path.join(paths["datasets"], dataset, INFO_FILE),
os.path.join(paths["datasets"], dataset, UNLABELLED_FOLDER, clip),
2022-02-06 21:02:24 +00:00
text,
)
2021-10-16 19:43:02 +01:00
# Add to metadata
2022-07-03 10:28:35 +02:00
with open(os.path.join(paths["datasets"], dataset, METADATA_FILE), "a", encoding=CHARACTER_ENCODING) as f:
2021-10-16 19:43:02 +01:00
f.write(f"{clip}|{text}\n")
2021-10-16 19:43:27 +01:00
2021-10-16 19:43:02 +01:00
# Move clip
2021-10-16 19:43:27 +01:00
os.rename(
os.path.join(paths["datasets"], dataset, UNLABELLED_FOLDER, clip),
os.path.join(paths["datasets"], dataset, AUDIO_FOLDER, clip),
)
2021-10-16 19:43:02 +01:00
return redirect(f"/manage-datasets?dataset={dataset}")
2021-10-16 19:43:02 +01:00
2021-04-04 15:26:31 +01:00
# Import-export
2021-03-10 15:56:40 +00:00
@app.route("/import-export", methods=["GET"])
def import_export():
2021-04-15 13:27:50 +01:00
return render_template(
2021-07-26 13:14:41 +01:00
"import-export.html",
datasets=os.listdir(paths["datasets"]),
models=os.listdir(paths["models"]),
checkpoints=get_checkpoints(),
2021-04-15 13:27:50 +01:00
)
2021-03-10 15:56:40 +00:00
@app.route("/upload-dataset", methods=["POST"])
def upload_dataset():
dataset = request.files["dataset"]
2021-05-02 17:09:05 +01:00
dataset.save(TEMP_DATASET_UPLOAD)
2021-03-10 15:56:40 +00:00
dataset_name = request.values["name"]
dataset_directory = os.path.join(paths["datasets"], dataset_name)
audio_folder = os.path.join(dataset_directory, AUDIO_FOLDER)
2021-04-07 20:26:51 +01:00
assert not os.path.isdir(dataset_directory), "Output folder already exists"
2021-03-10 15:56:40 +00:00
2021-05-02 17:09:05 +01:00
start_progress_thread(
2021-05-02 17:09:23 +01:00
import_dataset, dataset=TEMP_DATASET_UPLOAD, dataset_directory=dataset_directory, audio_folder=audio_folder
2021-05-02 17:09:05 +01:00
)
2021-05-02 17:09:23 +01:00
2021-05-02 17:09:05 +01:00
return render_template("progress.html", next_url="/import-export")
2021-03-10 15:56:40 +00:00
@app.route("/download-dataset", methods=["POST"])
def download_dataset():
dataset_name = request.values["dataset"]
dataset_directory = os.path.join(paths["datasets"], dataset_name)
data = io.BytesIO()
create_trainlist_vallist_files(dataset_directory, os.path.join(dataset_directory, METADATA_FILE))
2021-03-10 15:56:40 +00:00
with zipfile.ZipFile(data, mode="w") as z:
2021-04-15 13:27:50 +01:00
z.write(os.path.join(dataset_directory, METADATA_FILE), METADATA_FILE)
if os.path.isfile(os.path.join(dataset_directory, INFO_FILE)):
z.write(os.path.join(dataset_directory, INFO_FILE), INFO_FILE)
2021-03-10 15:56:40 +00:00
audio_directory = os.path.join(dataset_directory, AUDIO_FOLDER)
for audiofile in os.listdir(audio_directory):
z.write(os.path.join(audio_directory, audiofile), os.path.join(AUDIO_FOLDER, audiofile))
z.write(os.path.join(dataset_directory, TRAIN_FILE), TRAIN_FILE)
z.write(os.path.join(dataset_directory, VALIDATION_FILE), VALIDATION_FILE)
2021-03-10 15:56:40 +00:00
data.seek(0)
return send_file(
data,
mimetype="application/zip",
as_attachment=True,
attachment_filename=f'{dataset_name.replace(" ", "_")}.zip',
)
@app.route("/upload-model", methods=["POST"])
def upload_model():
model_name = request.values["name"]
model_directory = os.path.join(paths["models"], model_name)
os.makedirs(model_directory, exist_ok=False)
model_path = os.path.join(model_directory, "model.pt")
2021-07-25 19:49:26 +01:00
request.files["model_upload"].save(model_path)
2021-03-10 15:56:40 +00:00
return render_template("import-export.html", message=f"Successfully uploaded {model_name} model")
@app.route("/download-model", methods=["POST"])
def download_model():
model_name = request.values["model"]
2021-07-25 19:49:26 +01:00
model_path = os.path.join(paths["models"], model_name, request.values["checkpoint"])
2021-03-10 15:56:40 +00:00
2021-07-25 19:49:26 +01:00
return send_file(model_path, as_attachment=True, attachment_filename=request.values["checkpoint"])
2021-04-04 18:52:36 +01:00
# Settings
@app.route("/settings", methods=["GET"])
def get_settings():
2021-04-07 20:26:51 +01:00
return render_template(
"settings.html",
datasets=os.listdir(paths["datasets"]),
models=os.listdir(paths["models"]),
)
2021-04-04 18:52:36 +01:00
@app.route("/delete-dataset", methods=["POST"])
def delete_dataset_post():
delete_folder(os.path.join(paths["datasets"], request.values["dataset"]))
return redirect("/settings")
@app.route("/delete-model", methods=["POST"])
def delete_model_post():
delete_folder(os.path.join(paths["models"], request.values["model"]))
return redirect("/settings")
2021-06-03 20:34:16 +01:00
@app.route("/upload-language", methods=["POST"])
def upload_language():
language = request.values["name"]
language_dir = os.path.join(paths["languages"], language)
os.makedirs(language_dir, exist_ok=True)
2021-11-25 21:43:59 +00:00
if request.files["model"]:
2021-11-25 21:03:46 +00:00
request.files["model"].save(os.path.join(language_dir, TRANSCRIPTION_MODEL))
2021-06-03 20:34:16 +01:00
request.files["alphabet"].save(os.path.join(language_dir, ALPHABET_FILE))
return redirect("/settings")
2021-07-26 21:38:13 +01:00
@app.route("/add-vocoder", methods=["POST"])
def add_vocoder():
name = request.values["name"]
2021-08-01 19:36:37 +01:00
hifigan_folder = os.path.join(paths["hifigan"], name)
os.makedirs(hifigan_folder)
model_path = os.path.join(hifigan_folder, "model.pt")
model_config_path = os.path.join(hifigan_folder, "config.json")
request.files["hifigan-model"].save(model_path)
request.files["hifigan-config"].save(model_config_path)
2021-07-26 21:38:13 +01:00
return redirect("/settings")