Skip to content

download_ssc.py

SSC dataset downloader - 78 lines. View on GitHub (speech-neuro/download_ssc.py).

"""Download and inspect the Spiking Speech Commands (SSC) dataset.

SSC is the neuromorphic version of Google Speech Commands, encoded through
a biophysical cochlea model (700 frequency channels).  This script downloads
all three splits and prints summary statistics.

Usage:
    uv run python speech-neuro/download_ssc.py
"""

import os
import numpy as np
import tonic

SAVE_DIR = os.path.join(os.path.dirname(__file__), "../assets")


def download_split(split: str):
    print(f"\nDownloading SSC {split} split...")
    ds = tonic.datasets.SSC(save_to=SAVE_DIR, split=split)
    print(f"  Samples: {len(ds)}")
    print(f"  Sensor size: {ds.sensor_size}")

    # Inspect a sample (read raw h5 to avoid Tonic's overflow bug)
    import h5py

    h5_path = os.path.join(SAVE_DIR, "SSC", f"ssc_{split}.h5")
    with h5py.File(h5_path, "r") as f:
        labels = f["labels"][:]
        times_0 = f["spikes/times"][0]
        units_0 = f["spikes/units"][0]

    print(f"  Classes: {len(np.unique(labels))} ({labels.min()}-{labels.max()})")
    print(
        f"  Sample 0: {len(times_0)} events, "
        f"duration={times_0.max() - times_0.min():.3f}s, "
        f"channels={units_0.min()}-{units_0.max()}"
    )

    # Event rate statistics (first 100 samples)
    import h5py

    with h5py.File(h5_path, "r") as f:
        n_check = min(100, len(labels))
        event_counts = [len(f["spikes/times"][i]) for i in range(n_check)]
        durations = [float(f["spikes/times"][i].max() - f["spikes/times"][i].min()) for i in range(n_check)]

    print(
        f"  Events/sample (first {n_check}): "
        f"mean={np.mean(event_counts):.0f}, "
        f"min={np.min(event_counts)}, max={np.max(event_counts)}"
    )
    print(
        f"  Duration (first {n_check}): "
        f"mean={np.mean(durations):.3f}s, "
        f"min={np.min(durations):.3f}s, max={np.max(durations):.3f}s"
    )

    return ds


def main():
    print("=" * 60)
    print("Spiking Speech Commands (SSC) Dataset")
    print("  Source: Zenke Lab (Heidelberg)")
    print("  Encoding: Biophysical cochlea model (700 channels)")
    print("  Task: 35-class spoken word classification")
    print("=" * 60)

    for split in ("train", "valid", "test"):
        download_split(split)

    print("\nDone. Data saved to:", os.path.abspath(SAVE_DIR))


if __name__ == "__main__":
    main()