|
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
|
|
|