|
import argparse |
|
import os |
|
from typing import NoReturn |
|
|
|
import librosa |
|
import numpy as np |
|
import soundfile |
|
|
|
from bytesep.dataset_creation.pack_audios_to_hdf5s.instruments_solo import ( |
|
read_csv as read_instruments_solo_csv, |
|
) |
|
from bytesep.dataset_creation.pack_audios_to_hdf5s.maestro import ( |
|
read_csv as read_maestro_csv, |
|
) |
|
from bytesep.utils import load_random_segment |
|
|
|
|
|
def create_evaluation(args) -> NoReturn: |
|
r"""Random mix and write out audios for evaluation. |
|
|
|
Args: |
|
violin_dataset_dir: str, the directory of the violin dataset |
|
piano_dataset_dir: str, the directory of the piano dataset |
|
evaluation_audios_dir: str, the directory to write out randomly selected and mixed audio segments |
|
sample_rate: int |
|
channels: int, e.g., 1 | 2 |
|
evaluation_segments_num: int |
|
mono: bool |
|
|
|
Returns: |
|
NoReturn |
|
""" |
|
|
|
|
|
violin_dataset_dir = args.violin_dataset_dir |
|
piano_dataset_dir = args.piano_dataset_dir |
|
evaluation_audios_dir = args.evaluation_audios_dir |
|
sample_rate = args.sample_rate |
|
channels = args.channels |
|
evaluation_segments_num = args.evaluation_segments_num |
|
mono = True if channels == 1 else False |
|
|
|
split = 'test' |
|
segment_seconds = 10.0 |
|
|
|
random_state = np.random.RandomState(1234) |
|
|
|
violin_meta_csv = os.path.join(violin_dataset_dir, 'validation.csv') |
|
violin_names_dict = read_instruments_solo_csv(violin_meta_csv) |
|
violin_audio_names = violin_names_dict['{}'.format(split)] |
|
|
|
piano_meta_csv = os.path.join(piano_dataset_dir, 'maestro-v2.0.0.csv') |
|
piano_names_dict = read_maestro_csv(piano_meta_csv) |
|
piano_audio_names = piano_names_dict['{}'.format(split)] |
|
|
|
for source_type in ['violin', 'piano', 'mixture']: |
|
output_dir = os.path.join(evaluation_audios_dir, split, source_type) |
|
os.makedirs(output_dir, exist_ok=True) |
|
|
|
for n in range(evaluation_segments_num): |
|
|
|
print('{} / {}'.format(n, evaluation_segments_num)) |
|
|
|
|
|
violin_audio_name = random_state.choice(violin_audio_names) |
|
violin_audio_path = os.path.join(violin_dataset_dir, "mp3s", violin_audio_name) |
|
|
|
violin_audio = load_random_segment( |
|
audio_path=violin_audio_path, |
|
random_state=random_state, |
|
segment_seconds=segment_seconds, |
|
mono=mono, |
|
sample_rate=sample_rate, |
|
) |
|
|
|
|
|
output_violin_path = os.path.join( |
|
evaluation_audios_dir, split, 'violin', '{:04d}.wav'.format(n) |
|
) |
|
soundfile.write( |
|
file=output_violin_path, data=violin_audio.T, samplerate=sample_rate |
|
) |
|
print("Write out to {}".format(output_violin_path)) |
|
|
|
|
|
piano_audio_name = random_state.choice(piano_audio_names) |
|
piano_audio_path = os.path.join(piano_dataset_dir, piano_audio_name) |
|
|
|
piano_audio = load_random_segment( |
|
audio_path=piano_audio_path, |
|
random_state=random_state, |
|
segment_seconds=segment_seconds, |
|
mono=mono, |
|
sample_rate=sample_rate, |
|
) |
|
|
|
|
|
output_piano_path = os.path.join( |
|
evaluation_audios_dir, split, 'piano', '{:04d}.wav'.format(n) |
|
) |
|
soundfile.write( |
|
file=output_piano_path, data=piano_audio.T, samplerate=sample_rate |
|
) |
|
print("Write out to {}".format(output_piano_path)) |
|
|
|
|
|
mixture_audio = violin_audio + piano_audio |
|
|
|
|
|
output_mixture_path = os.path.join( |
|
evaluation_audios_dir, split, 'mixture', '{:04d}.wav'.format(n) |
|
) |
|
soundfile.write( |
|
file=output_mixture_path, data=mixture_audio.T, samplerate=sample_rate |
|
) |
|
print("Write out to {}".format(output_mixture_path)) |
|
|
|
|
|
if __name__ == "__main__": |
|
parser = argparse.ArgumentParser() |
|
|
|
parser.add_argument( |
|
"--violin_dataset_dir", |
|
type=str, |
|
required=True, |
|
help="The directory of the violin dataset.", |
|
) |
|
parser.add_argument( |
|
"--piano_dataset_dir", |
|
type=str, |
|
required=True, |
|
help="The directory of the piano dataset.", |
|
) |
|
parser.add_argument( |
|
"--evaluation_audios_dir", |
|
type=str, |
|
required=True, |
|
help="The directory to write out randomly selected and mixed audio segments.", |
|
) |
|
parser.add_argument( |
|
"--sample_rate", |
|
type=int, |
|
required=True, |
|
help="Sample rate", |
|
) |
|
parser.add_argument( |
|
"--channels", |
|
type=int, |
|
required=True, |
|
help="Audio channels, e.g, 1 or 2.", |
|
) |
|
parser.add_argument( |
|
"--evaluation_segments_num", |
|
type=int, |
|
required=True, |
|
help="The number of segments to create for evaluation.", |
|
) |
|
|
|
|
|
args = parser.parse_args() |
|
|
|
create_evaluation(args) |
|
|