File size: 3,555 Bytes
127b976
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112

from __future__ import annotations

import argparse
import random
from pathlib import Path

import pandas as pd


AUDIO_EXTENSIONS = {
    ".wav", ".flac", ".mp3", ".m4a", ".ogg", ".opus", ".aac"
}


def find_audio_files(audio_root: Path):
    files = []
    for p in audio_root.rglob("*"):
        if p.is_file() and p.suffix.lower() in AUDIO_EXTENSIONS:
            files.append(p)
    return sorted(files)


def make_rows(files, split_name: str):
    rows = []
    for p in files:
        rows.append({
            "file_path": p.resolve().as_posix(),
            "binary_label": 0,
            "attack_type": "bonafide",
            "start_fake": -1,
            "end_fake": -1,
            "dataset": "GLOBE",
            "split": split_name,
            "source_file": p.name,
            "source_folder": p.parent.name,
        })
    return rows


def save_csv(rows, out_csv: Path):
    out_csv.parent.mkdir(parents=True, exist_ok=True)
    df = pd.DataFrame(rows)
    df.to_csv(out_csv, index=False)
    print(f"Saved: {out_csv}")
    print(f"Rows: {len(df)}")
    if len(df):
        print(df[["dataset", "split", "binary_label", "attack_type"]].value_counts())


def main():
    parser = argparse.ArgumentParser(
        description=(
            "Create small real/bonafide GLOBE metadata CSVs for AuralGuard. "
            "This does not train anything; it only creates train/val/test CSV files."
        )
    )
    parser.add_argument(
        "--audio-root",
        required=True,
        help="Folder containing GLOBE audio files. The script searches recursively."
    )
    parser.add_argument(
        "--out-dir",
        default="data/metadata",
        help="Where to save train_globe.csv, val_globe.csv, globe_test.csv"
    )
    parser.add_argument("--max-train", type=int, default=2000)
    parser.add_argument("--max-val", type=int, default=300)
    parser.add_argument("--max-test", type=int, default=300)
    parser.add_argument("--seed", type=int, default=42)
    args = parser.parse_args()

    audio_root = Path(args.audio_root)
    if not audio_root.exists():
        raise FileNotFoundError(f"Audio root does not exist: {audio_root}")

    files = find_audio_files(audio_root)
    print(f"Found audio files: {len(files)}")

    if len(files) == 0:
        raise RuntimeError(
            "No audio files found. Check the folder path or supported extensions: "
            + ", ".join(sorted(AUDIO_EXTENSIONS))
        )

    rng = random.Random(args.seed)
    rng.shuffle(files)

    n_train = min(args.max_train, len(files))
    n_val = min(args.max_val, max(0, len(files) - n_train))
    n_test = min(args.max_test, max(0, len(files) - n_train - n_val))

    train_files = files[:n_train]
    val_files = files[n_train:n_train + n_val]
    test_files = files[n_train + n_val:n_train + n_val + n_test]

    out_dir = Path(args.out_dir)
    save_csv(make_rows(train_files, "train"), out_dir / "train_globe.csv")
    save_csv(make_rows(val_files, "val"), out_dir / "val_globe.csv")
    save_csv(make_rows(test_files, "test"), out_dir / "globe_test.csv")

    print("\nDone.")
    print("Recommended next step:")
    print('python scripts\\check_metadata.py --csv "data\\metadata\\train_globe.csv"')
    print('python scripts\\check_metadata.py --csv "data\\metadata\\val_globe.csv"')
    print('python scripts\\check_metadata.py --csv "data\\metadata\\globe_test.csv"')


if __name__ == "__main__":
    main()