import os import re import tqdm import collections import argparse import numpy as np from suno_utils.audio import Audio from suno_utils.utils.text import ( write_jsonl, read_jsonl, write_json, read_json, normalize_whitespace, ) from suno_utils.utils.s3 import read_from_s3, check_s3_file_exists, open_from_s3 # parse parser = argparse.ArgumentParser() parser.add_argument("--index", required=True, help="partial index") parser.add_argument("--num_partial", required=True, help="number of partial data") args = parser.parse_args() index = int(args.index) num_partial = int(args.num_partial) # load data metadata_path = "/app/suno/data/audio_mono_24khz/ytm_tagged/metadata/" if not os.path.exists(os.path.join(metadata_path, "ids_63.npy")): print("process metadata...") print("loading metadata...") ytm_metas = read_jsonl("/app/suno/data/chirp_v3/metadata/ytm_tagged.jsonl") original_metas = read_from_s3( "s3://suno-data/datasets/bundles/v2/ytm_tagged/metas.jsonl", read_f=read_jsonl, ) original_ids_to_ix = {m["id"]: i for i, m in enumerate(original_metas)} print("loaded!") for index in range(64): print("processing %d..." % index) # split data hop = len(ytm_metas) // num_partial if index == num_partial: p_ytm_metas = ytm_metas[hop * index - 1 :] else: p_ytm_metas = ytm_metas[hop * index : (index + 1) * hop] ids = [m["id"] for m in p_ytm_metas] file_paths = [ original_metas[original_ids_to_ix[m["id"]]]["s3_filepath"] for m in p_ytm_metas ] np.save(open(os.path.join(metadata_path, "ids_%d.npy" % index), "wb"), ids) np.save( open(os.path.join(metadata_path, "filepaths_%d.npy" % index), "wb"), file_paths, ) print("load precomputed files...") index = int(args.index) ids = np.load(os.path.join(metadata_path, "ids_%d.npy" % index)) file_paths = np.load(os.path.join(metadata_path, "filepaths_%d.npy" % index)) print("loaded!") # resample audio print("start resampling...") audio_path = "/app/suno/data/audio_mono_24khz/ytm_tagged/audio/" for i in tqdm.tqdm(range(len(ids))): _id = ids[i] save_path = os.path.join(audio_path, _id + ".wav") if not os.path.exists(save_path): try: audio = Audio.from_s3(file_paths[i], sample_rate=24000, n_channels=1) if (audio.duration_s) > (30 and audio.duration_s < 500): audio.write_wav(save_path) except: continue