| from __future__ import annotations |
|
|
| import argparse |
| import os |
|
|
| import py7zr |
| import requests |
|
|
| RECORD = "4783391" |
| FILES = { |
| "development": ("clotho_audio_development.7z", "clotho_captions_development.csv"), |
| "validation": ("clotho_audio_validation.7z", "clotho_captions_validation.csv"), |
| "evaluation": ("clotho_audio_evaluation.7z", "clotho_captions_evaluation.csv"), |
| } |
|
|
| def zenodo_files(): |
| r = requests.get(f"https://zenodo.org/api/records/{RECORD}", timeout=30) |
| r.raise_for_status() |
| return {f["key"]: (f["links"]["self"], f["size"]) for f in r.json()["files"]} |
|
|
| def download(url, dest, expected_size=None): |
| if os.path.exists(dest) and (expected_size is None or os.path.getsize(dest) == expected_size): |
| print(f"[fetch] {dest} already present ({os.path.getsize(dest)} bytes), skipping", flush=True) |
| return |
| with requests.get(url, stream=True, timeout=60) as r: |
| r.raise_for_status() |
| total = int(r.headers.get("content-length", 0)) |
| done = 0 |
| with open(dest + ".part", "wb") as f: |
| for chunk in r.iter_content(chunk_size=1 << 20): |
| f.write(chunk) |
| done += len(chunk) |
| if total: |
| print(f"\r[fetch] {os.path.basename(dest)} {done/1e6:.0f}/{total/1e6:.0f} MB", |
| end="", flush=True) |
| print(flush=True) |
| os.rename(dest + ".part", dest) |
| if expected_size is not None and os.path.getsize(dest) != expected_size: |
| raise RuntimeError(f"{dest}: size {os.path.getsize(dest)} != expected {expected_size}") |
|
|
| def main(): |
| ap = argparse.ArgumentParser() |
| ap.add_argument("--root", default="/root/clotho_raw") |
| ap.add_argument("--splits", nargs="+", default=["development", "validation", "evaluation"]) |
| args = ap.parse_args() |
| os.makedirs(args.root, exist_ok=True) |
|
|
| links = zenodo_files() |
| for split in args.splits: |
| audio_key, caption_key = FILES[split] |
| audio_path = os.path.join(args.root, audio_key) |
| caption_path = os.path.join(args.root, caption_key) |
|
|
| audio_url, audio_size = links[audio_key] |
| caption_url, caption_size = links[caption_key] |
| print(f"[fetch] {split}: {audio_key} ({audio_size/1e6:.0f} MB)", flush=True) |
| download(audio_url, audio_path, audio_size) |
| download(caption_url, caption_path, caption_size) |
|
|
| extract_dir = os.path.join(args.root, split) |
| if not os.path.isdir(extract_dir): |
| print(f"[fetch] extracting {audio_key}", flush=True) |
| with py7zr.SevenZipFile(audio_path, mode="r") as z: |
| z.extractall(path=args.root) |
| wavs = [f for f in os.listdir(extract_dir) if f.endswith(".wav")] |
| print(f"[fetch] {split}: {len(wavs)} wav files in {extract_dir}", flush=True) |
|
|
| print("FETCHDONE", flush=True) |
|
|
| if __name__ == "__main__": |
| main() |
|
|