def METHOD_NAME(args):
    os.makedirs(args.output_root, exist_ok=True)
    manifest = {}
    tgt_audios = []
    for split in args.data_split:
        print(f"Processing {split}...")
        manifest[split] = {c: [] for c in MANIFEST_COLUMNS}
        missing_tgt_audios = []
        src_audios = list(args.source_dir.glob(f"{split}/*.wav"))
        for src_audio in tqdm(src_audios):
            sample_id = src_audio.stem
            tgt_audio = args.target_dir / split / f"{sample_id}.wav"
            if not tgt_audio.is_file():
                missing_tgt_audios.append(sample_id)
                continue
            tgt_audios.append(tgt_audio)
            src_n_frames = sf.info(src_audio.as_posix()).frames
            manifest[split]["id"].append(sample_id)
            manifest[split]["src_audio"].append(src_audio.as_posix())
            manifest[split]["src_n_frames"].append(
                src_n_frames // 160
            )  # estimation of 10-ms frame for 16kHz audio
        print(f"Processed {len(manifest[split]['id'])} samples")
        if len(missing_tgt_audios) > 0:
            print(
                f"{len(missing_tgt_audios)} with missing target data (first 3 examples: {', '.join(missing_tgt_audios[:3])})"
            )
    # Extract features and pack features into ZIP
    zip_path = prepare_target_data(args, tgt_audios)
    print("Fetching ZIP manifest...")
    tgt_audio_paths, tgt_audio_lengths = get_zip_manifest(zip_path)
    print("Generating manifest...")
    for split in args.data_split:
        print(f"Processing {split}...")
        for sample_id in tqdm(manifest[split]["id"]):
            manifest[split]["tgt_audio"].append(tgt_audio_paths[sample_id])
            manifest[split]["tgt_n_frames"].append(tgt_audio_lengths[sample_id])
        out_manifest = args.output_root / f"{split}.tsv"
        print(f"Writing manifest to {out_manifest}...")
        save_df_to_tsv(pd.DataFrame.from_dict(manifest[split]), out_manifest)
    # Generate config YAML
    win_len_t = args.win_length / args.sample_rate
    hop_len_t = args.hop_length / args.sample_rate
    extra = {
        "features": {
            "type": "spectrogram+melscale+log",
            "sample_rate": args.sample_rate,
            "eps": 1e-5, "n_mels": args.n_mels, "n_fft": args.n_fft,
            "window_fn": "hann", "win_length": args.win_length,
            "hop_length": args.hop_length,
            "win_len_t": win_len_t, "hop_len_t": hop_len_t,
            "f_min": args.f_min, "f_max": args.f_max,
            "n_stft": args.n_fft // 2 + 1
        }
    }
    gen_config_yaml(
        args.output_root,
        audio_root=args.output_root.as_posix(),
        specaugment_policy="lb",
        feature_transform=["utterance_cmvn", "delta_deltas"],
        extra=extra,
    )