File size: 2,091 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
from datasets import load_dataset
from pathlib import Path
import soundfile as sf
import pandas as pd
import argparse


def save_split(ds, split_name, out_audio_dir, out_csv, max_items=None):
    out_audio_dir = Path(out_audio_dir)
    out_audio_dir.mkdir(parents=True, exist_ok=True)

    rows = []
    n = len(ds) if max_items is None else min(len(ds), max_items)

    for i in range(n):
        item = ds[i]
        audio = item["audio"]
        speaker = item.get("speaker", f"unknown_{i}")
        accent = item.get("accent", "unknown").replace(" ", "_").replace("/", "_")

        wav_path = out_audio_dir / f"{split_name}_{i:06d}_{speaker}_{accent}.wav"
        sf.write(wav_path, audio["array"], audio["sampling_rate"])

        rows.append({
            "file_path": wav_path.resolve().as_posix(),
            "binary_label": 0,
            "attack_type": "bonafide",
            "start_fake": -1,
            "end_fake": -1,
            "dataset": "EdAcc",
            "split": split_name
        })

    pd.DataFrame(rows).to_csv(out_csv, index=False)
    print(f"Saved {out_csv} rows={len(rows)}")


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--out-audio-root", default="data/edacc/audio")
    parser.add_argument("--out-dir", default="data/metadata")
    parser.add_argument("--max-train", type=int, default=3000)
    parser.add_argument("--max-val", type=int, default=500)
    args = parser.parse_args()

    print("Downloading/loading EdAcc...")
    edacc = load_dataset("edinburghcstr/edacc")

    out_dir = Path(args.out_dir)
    out_dir.mkdir(parents=True, exist_ok=True)

    save_split(
        edacc["validation"],
        "train",
        Path(args.out_audio_root) / "train",
        out_dir / "edacc_train.csv",
        max_items=args.max_train
    )

    save_split(
        edacc["test"],
        "val",
        Path(args.out_audio_root) / "val",
        out_dir / "edacc_val.csv",
        max_items=args.max_val
    )


if __name__ == "__main__":
    main()