|
|
|
|
|
|
|
|
|
|
|
import os |
|
import json |
|
from tqdm import tqdm |
|
|
|
|
|
def cal_metadata(cfg): |
|
""" |
|
Dump metadata (singers.json, meta_info.json, utt2singer) for singer dataset or multi-datasets. |
|
""" |
|
from collections import Counter |
|
|
|
datasets = cfg.dataset |
|
|
|
print("-" * 10) |
|
print("Preparing metadata...") |
|
print("Including: \n{}\n".format("\n".join(datasets))) |
|
|
|
datasets.sort() |
|
|
|
for dataset in tqdm(datasets): |
|
save_dir = os.path.join(cfg.preprocess.processed_dir, dataset) |
|
assert os.path.exists(save_dir) |
|
|
|
|
|
train_metadata = os.path.join(save_dir, "train.json") |
|
test_metadata = os.path.join(save_dir, "test.json") |
|
|
|
|
|
with open(train_metadata, "r", encoding="utf-8") as f: |
|
train_utterances = json.load(f) |
|
with open(test_metadata, "r", encoding="utf-8") as f: |
|
test_utterances = json.load(f) |
|
|
|
train_utterances = sorted(train_utterances, key=lambda x: x["Duration"]) |
|
test_utterances = sorted(test_utterances, key=lambda x: x["Duration"]) |
|
|
|
|
|
with open(train_metadata, "w") as f: |
|
json.dump(train_utterances, f, indent=4, ensure_ascii=False) |
|
with open(test_metadata, "w") as f: |
|
json.dump(test_utterances, f, indent=4, ensure_ascii=False) |
|
|
|
|
|
singer_dict_file = os.path.join(save_dir, cfg.preprocess.spk2id) |
|
utt2singer_file = os.path.join(save_dir, cfg.preprocess.utt2spk) |
|
|
|
|
|
train_total_duration = sum(utt["Duration"] for utt in train_utterances) |
|
test_total_duration = sum(utt["Duration"] for utt in test_utterances) |
|
|
|
singer_names = set( |
|
f"{replace_augment_name(utt['Dataset'])}_{utt['Singer']}" |
|
for utt in train_utterances + test_utterances |
|
) |
|
|
|
|
|
with open(utt2singer_file, "w", encoding="utf-8") as f: |
|
for utt in train_utterances + test_utterances: |
|
f.write( |
|
f"{utt['Dataset']}_{utt['Uid']}\t{replace_augment_name(utt['Dataset'])}_{utt['Singer']}\n" |
|
) |
|
|
|
singer_names = sorted(singer_names) |
|
singer_lut = {name: i for i, name in enumerate(singer_names)} |
|
|
|
|
|
with open(singer_dict_file, "w", encoding="utf-8") as f: |
|
json.dump(singer_lut, f, indent=4, ensure_ascii=False) |
|
|
|
meta_info = { |
|
"dataset": dataset, |
|
"statistics": { |
|
"size": len(train_utterances) + len(test_utterances), |
|
"hours": round(train_total_duration / 3600, 4) |
|
+ round(test_total_duration / 3600, 4), |
|
}, |
|
"train": { |
|
"size": len(train_utterances), |
|
"hours": round(train_total_duration / 3600, 4), |
|
}, |
|
"test": { |
|
"size": len(test_utterances), |
|
"hours": round(test_total_duration / 3600, 4), |
|
}, |
|
"singers": {"size": len(singer_lut)}, |
|
} |
|
|
|
total_singer2mins = Counter() |
|
training_singer2mins = Counter() |
|
for utt in train_utterances: |
|
k = f"{replace_augment_name(utt['Dataset'])}_{utt['Singer']}" |
|
training_singer2mins[k] += utt["Duration"] / 60 |
|
total_singer2mins[k] += utt["Duration"] / 60 |
|
for utt in test_utterances: |
|
k = f"{replace_augment_name(utt['Dataset'])}_{utt['Singer']}" |
|
total_singer2mins[k] += utt["Duration"] / 60 |
|
|
|
training_singer2mins = dict( |
|
sorted(training_singer2mins.items(), key=lambda x: x[1], reverse=True) |
|
) |
|
training_singer2mins = {k: round(v, 2) for k, v in training_singer2mins.items()} |
|
meta_info["singers"]["training_minutes"] = training_singer2mins |
|
|
|
total_singer2mins = dict( |
|
sorted(total_singer2mins.items(), key=lambda x: x[1], reverse=True) |
|
) |
|
total_singer2mins = {k: round(v, 2) for k, v in total_singer2mins.items()} |
|
meta_info["singers"]["minutes"] = total_singer2mins |
|
|
|
with open(os.path.join(save_dir, "meta_info.json"), "w") as f: |
|
json.dump(meta_info, f, indent=4, ensure_ascii=False) |
|
|
|
for singer, min in training_singer2mins.items(): |
|
print(f"Singer {singer}: {min} mins for training") |
|
print("-" * 10, "\n") |
|
|
|
|
|
def replace_augment_name(dataset: str) -> str: |
|
"""Replace the augmented dataset name with the original dataset name. |
|
>>> print(replace_augment_name("dataset_equalizer")) |
|
dataset |
|
""" |
|
if "equalizer" in dataset: |
|
dataset = dataset.replace("_equalizer", "") |
|
elif "formant_shift" in dataset: |
|
dataset = dataset.replace("_formant_shift", "") |
|
elif "pitch_shift" in dataset: |
|
dataset = dataset.replace("_pitch_shift", "") |
|
elif "time_stretch" in dataset: |
|
dataset = dataset.replace("_time_stretch", "") |
|
else: |
|
pass |
|
return dataset |
|
|