Files
MioTTS/tools/validate_ljspeech.py
T
2026-02-04 00:37:18 -05:00

105 lines
3.2 KiB
Python

import argparse
import os
from typing import Tuple
def _validate_dataset(root: str, metadata_name: str, wavs_subdir: str) -> Tuple[int, int, int]:
valid_lines = 0
invalid_lines = 0
missing_wavs = 0
metadata_path = os.path.join(root, metadata_name)
if not os.path.isfile(metadata_path):
msg = f"metadata file not found: {metadata_path}"
raise FileNotFoundError(msg)
wavs_root = os.path.join(root, wavs_subdir)
if not os.path.isdir(wavs_root):
msg = f"wavs directory not found: {wavs_root}"
raise FileNotFoundError(msg)
with open(metadata_path, encoding="utf-8-sig") as f:
for idx, raw_line in enumerate(f, start=1):
line = raw_line.strip()
if not line:
continue
parts = line.split("|")
if len(parts) != 3:
invalid_lines += 1
print(f"[line {idx}] invalid field count ({len(parts)} != 3): {line}")
continue
file_id, normalized_text, original_text = parts
file_id = file_id.strip()
normalized_text = normalized_text.strip()
original_text = original_text.strip()
if not file_id or any(sep in file_id for sep in ("/", "\\")):
invalid_lines += 1
print(f"[line {idx}] invalid file_id: {file_id!r}")
continue
if not normalized_text:
invalid_lines += 1
print(f"[line {idx}] empty normalized_text")
continue
if not original_text:
invalid_lines += 1
print(f"[line {idx}] empty original_text")
continue
wav_path = os.path.join(wavs_root, f"{file_id}.wav")
if not os.path.isfile(wav_path):
missing_wavs += 1
print(f"[line {idx}] missing wav file: {wav_path}")
valid_lines += 1
return valid_lines, invalid_lines, missing_wavs
def main() -> None:
parser = argparse.ArgumentParser(description="Validate an LJSpeech-style dataset folder.")
parser.add_argument(
"--root",
required=True,
help="Path to LJSpeech dataset root containing wavs/ and metadata.csv.",
)
parser.add_argument(
"--metadata",
default="metadata.csv",
help="Metadata filename relative to root (default: metadata.csv).",
)
parser.add_argument(
"--wavs-subdir",
default="wavs",
help="Subdirectory under root containing wav files (default: wavs).",
)
args = parser.parse_args()
root = os.path.abspath(args.root)
if not os.path.isdir(root):
msg = f"dataset root is not a directory: {root}"
raise NotADirectoryError(msg)
print(f"Validating LJSpeech dataset in: {root}")
print(f" metadata: {args.metadata}")
print(f" wavs subdir: {args.wavs_subdir}")
valid, invalid, missing = _validate_dataset(root, args.metadata, args.wavs_subdir)
print()
print(f"Valid lines : {valid}")
print(f"Invalid lines : {invalid}")
print(f"Missing wav files: {missing}")
if invalid or missing:
raise SystemExit(1)
if __name__ == "__main__":
main()