babysor/MockingBird · critical · Exception

No speakers found. Make sure you are pointing to the directo

Error message

No speakers found. Make sure you are pointing to the directory containing all preprocessed speaker directories.

What it means

Raised when constructing SpeakerVerificationDataset with a datasets_root that contains no subdirectories: the training data root must hold one directory per (preprocessed) speaker. An empty or flat directory (e.g. pointing at files instead of speaker folders) triggers this exception at dataset construction.

Source

Thrown at models/encoder/data_objects/speaker_verification_dataset.py:15

from models.encoder.data_objects.random_cycler import RandomCycler
from models.encoder.data_objects.speaker_batch import SpeakerBatch
from models.encoder.data_objects.speaker import Speaker
from models.encoder.params_data import partials_n_frames
from torch.utils.data import Dataset, DataLoader
from pathlib import Path

# TODO: improve with a pool of speakers for data efficiency

class SpeakerVerificationDataset(Dataset):
    def __init__(self, datasets_root: Path):
        self.root = datasets_root
        speaker_dirs = [f for f in self.root.glob("*") if f.is_dir()]
        if len(speaker_dirs) == 0:
            raise Exception("No speakers found. Make sure you are pointing to the directory "
                            "containing all preprocessed speaker directories.")
        self.speakers = [Speaker(speaker_dir) for speaker_dir in speaker_dirs]
        self.speaker_cycler = RandomCycler(self.speakers)

    def __len__(self):
        return int(1e10)
        
    def __getitem__(self, index):
        return next(self.speaker_cycler)
    
    def get_logs(self):
        log_string = ""
        for log_fpath in self.root.glob("*.txt"):
            with log_fpath.open("r") as log_file:
                log_string += "".join(log_file.readlines())
        return log_string
    
    

View on GitHub (pinned to 28dc5e14f1)

Solutions

  1. Run encoder preprocessing first so per-speaker folders exist under the datasets root
  2. Point datasets_root at the directory whose immediate children are speaker directories (e.g. .../SV2TTS/encoder, not a single speaker folder or the repo root)
  3. Verify with ls that the directory contains one folder per speaker before training

Example fix

# before
python encoder_train.py -d datasets/SV2TTS   # no speaker subdirs here
# after (root containing preprocessed speaker folders)
python encoder_train.py -d datasets/SV2TTS/encoder
Defensive patterns

Strategy: validation

Validate before calling

root = Path(datasets_root)
speaker_dirs = [f for f in root.glob('*') if f.is_dir()]
if not speaker_dirs:
    raise SystemExit(f'{root} has no speaker subdirectories; run encoder_preprocess first')
dataset = SpeakerVerificationDataset(root)

Type guard

def is_valid_datasets_root(root: Path) -> bool:
    return root.is_dir() and any(f.is_dir() for f in root.glob('*'))

Try / catch

try:
    SpeakerVerificationDataset(root)
except Exception as e:
    raise SystemExit(f'Bad datasets root {root}: {e}') from e

Prevention

When it happens

Trigger: Instantiating SpeakerVerificationDataset(Path) where the path has no immediate subdirectories — e.g. passing the datasets root before encoder preprocessing created per-speaker folders, or passing a speaker's own folder instead of its parent.

Common situations: Skipping the encoder_preprocess step; wrong -d/--datasets_root argument (pointing at the wrong level of the tree); preprocessing wrote output elsewhere.

Related errors


AI-assisted analysis of babysor/MockingBird@28dc5e14f1 (2026-08-27). Data as JSON: /api/errors/1d705762fbdf8712. Report an issue: GitHub.