Spaces:
Running
on
L4
Running
on
L4
| import base64 | |
| from pathlib import Path | |
| from typing import Union | |
| from loguru import logger | |
| from natsort import natsorted | |
| AUDIO_EXTENSIONS = { | |
| ".mp3", | |
| ".wav", | |
| ".flac", | |
| ".ogg", | |
| ".m4a", | |
| ".wma", | |
| ".aac", | |
| ".aiff", | |
| ".aif", | |
| ".aifc", | |
| } | |
| VIDEO_EXTENSIONS = { | |
| ".mp4", | |
| ".avi", | |
| } | |
| def audio_to_bytes(file_path): | |
| if not file_path or not Path(file_path).exists(): | |
| return None | |
| with open(file_path, "rb") as wav_file: | |
| wav = wav_file.read() | |
| return wav | |
| def read_ref_text(ref_text): | |
| path = Path(ref_text) | |
| if path.exists() and path.is_file(): | |
| with path.open("r", encoding="utf-8") as file: | |
| return file.read() | |
| return ref_text | |
| def list_files( | |
| path: Union[Path, str], | |
| extensions: set[str] = None, | |
| recursive: bool = False, | |
| sort: bool = True, | |
| ) -> list[Path]: | |
| """List files in a directory. | |
| Args: | |
| path (Path): Path to the directory. | |
| extensions (set, optional): Extensions to filter. Defaults to None. | |
| recursive (bool, optional): Whether to search recursively. Defaults to False. | |
| sort (bool, optional): Whether to sort the files. Defaults to True. | |
| Returns: | |
| list: List of files. | |
| """ | |
| if isinstance(path, str): | |
| path = Path(path) | |
| if not path.exists(): | |
| raise FileNotFoundError(f"Directory {path} does not exist.") | |
| files = [file for ext in extensions for file in path.rglob(f"*{ext}")] | |
| if sort: | |
| files = natsorted(files) | |
| return files | |
| def load_filelist(path: Path | str) -> list[tuple[Path, str, str, str]]: | |
| """ | |
| Load a Bert-VITS2 style filelist. | |
| """ | |
| files = set() | |
| results = [] | |
| count_duplicated, count_not_found = 0, 0 | |
| LANGUAGE_TO_LANGUAGES = { | |
| "zh": ["zh", "en"], | |
| "jp": ["jp", "en"], | |
| "en": ["en"], | |
| } | |
| with open(path, "r", encoding="utf-8") as f: | |
| for line in f.readlines(): | |
| splits = line.strip().split("|", maxsplit=3) | |
| if len(splits) != 4: | |
| logger.warning(f"Invalid line: {line}") | |
| continue | |
| filename, speaker, language, text = splits | |
| file = Path(filename) | |
| language = language.strip().lower() | |
| if language == "ja": | |
| language = "jp" | |
| assert language in ["zh", "jp", "en"], f"Invalid language {language}" | |
| languages = LANGUAGE_TO_LANGUAGES[language] | |
| if file in files: | |
| logger.warning(f"Duplicated file: {file}") | |
| count_duplicated += 1 | |
| continue | |
| if not file.exists(): | |
| logger.warning(f"File not found: {file}") | |
| count_not_found += 1 | |
| continue | |
| results.append((file, speaker, languages, text)) | |
| if count_duplicated > 0: | |
| logger.warning(f"Total duplicated files: {count_duplicated}") | |
| if count_not_found > 0: | |
| logger.warning(f"Total files not found: {count_not_found}") | |
| return results | |