download_ssc.py
SSC dataset downloader - 78 lines.
View on GitHub (speech-neuro/download_ssc.py).
Source
Section titled “Source”"""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()