From 6490dcb5d435b2c1feebdd3822b2fc35b0fbfc25 Mon Sep 17 00:00:00 2001 From: Alcoft <101468238+alcoftTAO@users.noreply.github.com> Date: Sun, 27 Jul 2025 02:51:36 +0000 Subject: [PATCH] bug fixes (#53) * bug fixes * bug fixes --- rvc/modules/vc/modules.py | 78 +++++++++++++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 16 deletions(-) diff --git a/rvc/modules/vc/modules.py b/rvc/modules/vc/modules.py index 56c8e90..ab499ed 100644 --- a/rvc/modules/vc/modules.py +++ b/rvc/modules/vc/modules.py @@ -37,16 +37,25 @@ class VC: self.config = Config() def get_vc(self, sid: str | Path, *to_return_protect: int): - logger.info("Get sid: " + os.path.basename(sid)) + logger.info("Get sid: " + os.path.basename(sid) if hasattr(sid, "name") or isinstance(sid, str) else "ERROR") return_protect = [ to_return_protect[0] if self.if_f0 != 0 and to_return_protect else 0.5, to_return_protect[1] if self.if_f0 != 0 and to_return_protect else 0.33, ] - person = sid if os.path.exists(sid) else f'{os.getenv("weight_root")}/{sid}' - logger.info(f"Loading: {person}") + if hasattr(sid, "name"): + sid = sid.name + elif not isinstance(sid, str): + raise RuntimeError(f"pathlib.Path or str expected for sid. Got {type(sid)}") + weight_root = os.getenv("weight_root") + person = sid if os.path.exists(sid) else f'{weight_root if weight_root is not None else "."}/{sid}' + logger.info(f"Loading: {person}") + + if not os.path.exists(person) or person.endswith("/"): + raise FileNotFoundError(f"model file not found (path: {person}).") + self.cpt = torch.load(person, weights_only=False, map_location="cpu") self.tgt_sr = self.cpt["config"][-1] self.cpt["config"][-3] = self.cpt["weight"]["emb_g.weight"].shape[0] # n_spk @@ -66,7 +75,7 @@ class VC: del self.net_g.enc_q - if sid == "" or []: + if len(sid) == 0: logger.info("Clean model cache") del (self.hubert_model, self.tgt_sr, self.net_g) (self.net_g) = self.n_spk = index = None @@ -88,19 +97,53 @@ class VC: def vc_inference( self, sid: int, - input_audio_path: Path, + input_audio_path: Path | str, f0_up_key: int = 0, f0_method: str = "rmvpe", - f0_file: Path | None = None, - index_file: Path | None = None, + f0_file: Path | str | None = None, + index_file: Path | str | None = None, index_rate: float = 0.75, filter_radius: int = 3, resample_sr: int = 0, rms_mix_rate: float = 0.25, protect: float = 0.33, - hubert_path: str | None = None, + hubert_path: str | Path | None = None, ): - hubert_path = os.getenv("hubert_path") if not hubert_path else hubert_path + if hubert_path is None: + hubert_path = os.getenv("hubert_path") + elif hasattr(hubert_path, "name"): + hubert_path = hubert_path.name + elif not isinstance(hubert_path, str): + raise RuntimeError(f"pathlib.Path, str, or None expected for hubert_path. Got {type(hubert_path)}") + + if hubert_path is None or not os.path.exists(hubert_path): + raise FileNotFoundError("hubert_path not found.") + + if hasattr(input_audio_path, "name"): + input_audio_path = input_audio_path.name + elif not isinstance(input_audio_path, str): + raise RuntimeError(f"pathlib.Path or str expected for input_audio_path. Got {type(input_audio_path)}") + + if not os.path.exists(input_audio_path): + raise FileNotFoundError("input_audio_path not found.") + + if isinstance(f0_file, str): + f0_file = Path(f0_file) + elif not isinstance(f0_file, Path) and f0_file is not None: + raise RuntimeError(f"pathlib.Path, str, or None expected for f0_file. Got {type(f0_file)}") + + if hasattr(f0_file, "name") and not os.path.exists(f0_file.name): + logger.warning("f0_file not found. Will use None instead.") + f0_file = None + + if hasattr(index_file, "name"): + index_file = index_file.name + elif not isinstance(index_file, str) and index_file is not None: + raise RuntimeError(f"pathlib.Path, str, or None expected for index_file. Got {type(index_file)}") + + if index_file is not None and not os.path.exists(index_file): + logger.warning("index_file not found. Will use None instead.") + index_file = None try: audio = load_audio(input_audio_path, 16000) @@ -145,28 +188,31 @@ class VC: def vc_multi( self, sid: int, - paths: list, - opt_root: Path, + paths: list[Path | str], + opt_root: Path | str, f0_up_key: int = 0, f0_method: str = "rmvpe", - f0_file: Path | None = None, - index_file: Path | None = None, + f0_file: Path | str | None = None, + index_file: Path | str | None = None, index_rate: float = 0.75, filter_radius: int = 3, resample_sr: int = 0, rms_mix_rate: float = 0.25, protect: float = 0.33, output_format: str = "wav", - hubert_path: str | None = None, + hubert_path: str | Path | None = None, ): + if hasattr(opt_root, "name"): + opt_root = opt_root.name + try: os.makedirs(opt_root, exist_ok=True) - paths = [path.name for path in paths] + paths = [path.name if hasattr(path, "name") else path for path in paths] infos = [] for path in paths: tgt_sr, audio_opt, _, info = self.vc_inference( sid, - Path(path), + path, f0_up_key, f0_method, f0_file,