diff --git a/rvc/utils/cli/cli.py b/rvc/utils/cli/cli.py new file mode 100644 index 0000000..cfe5da0 --- /dev/null +++ b/rvc/utils/cli/cli.py @@ -0,0 +1,33 @@ +import re +from typing import Optional, Pattern + +import click + +from rvc.utils.cli.handler.infer import infer +from rvc.utils.cli.handler.train import train +from rvc.utils.cli.handler.uvr5 import uvr +from rvc.utils.cli.utils.dlmodel import dlmodel +from rvc.utils.cli.utils.env import env +from rvc.utils.cli.utils.initialize import init + + +@click.group( + context_settings={"help_option_names": ["-h", "--help"]}, + help="rvc cli feature list", +) +def cli(): + pass + + +def main(): + cli.add_command(infer) + cli.add_command(train) + cli.add_command(uvr) + cli.add_command(dlmodel) + cli.add_command(env) + cli.add_command(init) + cli() + + +if __name__ == "__main__": + main() diff --git a/rvc/utils/cli/handler/infer.py b/rvc/utils/cli/handler/infer.py new file mode 100644 index 0000000..ef473af --- /dev/null +++ b/rvc/utils/cli/handler/infer.py @@ -0,0 +1,132 @@ +import logging +from pathlib import Path + +import click +from dotenv import load_dotenv +from scipy.io import wavfile + +from rvc.modules.vc.modules import VC + +logging.getLogger("numba").setLevel(logging.WARNING) + + +@click.command( + context_settings={"help_option_names": ["-h", "--help"]}, + help="inference audio", +) +@click.option( + "-m", + "--modelPath", + is_flag=False, + type=str, + help="Model path or filename (reads in the directory set in env)", + required=True, +) +@click.option( + "-i", + "--inputPath", + is_flag=False, + type=Path, + help="input audio path or folder", + required=True, +) +@click.option( + "-o", + "--outputPath", + is_flag=False, + type=Path, + help="output audio path or folder", + required=True, +) +@click.option( + "-s", "--sid", is_flag=False, type=int, help="Speaker/Singer id", default=0 +) +@click.option("-fu", "--f0upkey", is_flag=False, type=int, help="Transpose", default=0) +@click.option( + "-fm", + "--f0method", + is_flag=False, + type=str, + help="Pitch extraction algorith", + default="rmvpe", +) +@click.option( + "-ff", "--f0file", is_flag=False, type=Path, help="F0 curve file (optional)" +) +@click.option("-if", "--indexFile", is_flag=False, type=Path, help="Feature index file") +@click.option( + "-ir", + "--indexRate", + is_flag=False, + type=float, + help="Search feature ratio", + default=0.75, +) +@click.option( + "-fr", + "--filterRadius", + is_flag=False, + type=int, + help="Apply median filtering", + default=3, +) +@click.option( + "-rsr", + "--resamplesr", + is_flag=False, + type=int, + help="Resample the output audio", + default=0, +) +@click.option( + "-rmr", + "--rmsmixrate", + is_flag=False, + type=float, + help="Adjust the volume envelope scaling", + default=0.25, +) +@click.option( + "-p", + "--protect", + is_flag=False, + type=float, + help="Protect voiceless consonants and breath sounds", + default=0.33, +) +def infer( + modelpath, + inputpath, + outputpath, + sid, + f0upkey, + f0method, + f0file, + indexfile, + indexrate, + filterradius, + resamplesr, + rmsmixrate, + protect, +): + load_dotenv() + vc = VC() + vc.get_vc(modelpath) + tgt_sr, audio_opt, times, _ = vc.vc_single( + sid, + inputpath, + f0upkey, + f0method, + f0file, + indexfile, + indexrate, + filterradius, + resamplesr, + rmsmixrate, + protect, + ) + if outputpath: + wavfile.write(outputpath, tgt_sr, audio_opt) + click.echo(times) + click.echo(f"Finish inference. Check {outputpath}") + return tgt_sr, audio_opt, times diff --git a/rvc/utils/cli/handler/train.py b/rvc/utils/cli/handler/train.py new file mode 100644 index 0000000..d5ff831 --- /dev/null +++ b/rvc/utils/cli/handler/train.py @@ -0,0 +1,6 @@ +import click + + +@click.command() +def train(): + pass diff --git a/rvc/utils/cli/handler/uvr5.py b/rvc/utils/cli/handler/uvr5.py new file mode 100644 index 0000000..249ec6b --- /dev/null +++ b/rvc/utils/cli/handler/uvr5.py @@ -0,0 +1,6 @@ +import click + + +@click.command() +def uvr(): + pass diff --git a/rvc/utils/cli/utils/dlmodel.py b/rvc/utils/cli/utils/dlmodel.py new file mode 100644 index 0000000..6322648 --- /dev/null +++ b/rvc/utils/cli/utils/dlmodel.py @@ -0,0 +1,9 @@ +import urllib + +import click + + +@click.command() +def dlmodel() -> None: + # Download models [harvest, uvr5, and more ] + pass diff --git a/rvc/utils/cli/utils/env.py b/rvc/utils/cli/utils/env.py new file mode 100644 index 0000000..0393dd4 --- /dev/null +++ b/rvc/utils/cli/utils/env.py @@ -0,0 +1,40 @@ +""" +setup or cleanup enviroment file +usage: rvc env [create / cleanup] +Default: [nowDir/.env] + +""" + +import os + +import click + + +@click.group() +def env(): + pass + + +@env.command() +def create(): + env_file_path = os.path.join(os.getcwd(), ".env") + + if not os.path.exists(env_file_path): + default_values = { + "weight_root": "", + "weight_uvr5_root": "", + "index_root": "", + "rmvpe_root": "", + "hubert_path": "", + "save_uvr_path": "", + "TEMP": "", + "pretrained": "", + } + + with open(env_file_path, "w") as env_file: + for key, value in default_values.items(): + env_file.write(f"{key}={value}\n") + + click.echo(f"{env_file_path} created successfully.") + else: + click.echo(f"{env_file_path} already exists, no change") diff --git a/rvc/utils/cli/utils/initialize.py b/rvc/utils/cli/utils/initialize.py new file mode 100644 index 0000000..eda931c --- /dev/null +++ b/rvc/utils/cli/utils/initialize.py @@ -0,0 +1,11 @@ +""" +Uage: rvc init +download model and setup environmmnt file + +""" +import click + + +@click.command() +def init(): + pass