Spaces:
Running
on
Zero
Running
on
Zero
| """preprocess_mir1k.py""" | |
| import os | |
| import glob | |
| import re | |
| import json | |
| from typing import Dict, List, Tuple | |
| import numpy as np | |
| from utils.audio import get_audio_file_info, load_audio_file | |
| from utils.midi import midi2note, note_event2midi | |
| from utils.note2event import note2note_event, sort_notes, validate_notes, trim_overlapping_notes | |
| from utils.event2note import event2note_event | |
| from utils.note_event_dataclasses import Note, NoteEvent | |
| from utils.utils import note_event2token2note_event_sanity_check | |
| # def create_spleeter_audio_stem(vocal_audio_file, accomp_audio_file, mir_st500_id) -> Dict: | |
| # program = MIR_ST500_PROGRAM | |
| # is_drum = [0, 0] | |
| # audio_tracks = [] # multi-channel audio array (C, T) | |
| # vocal_audio = load_audio_file(vocal_audio_file, dtype=np.int16) / 2**15 # returns bytes | |
| # audio_tracks.append(vocal_audio.astype(np.float16)) | |
| # accomp_audio = load_audio_file(accomp_audio_file, dtype=np.int16) / 2**15 # returns bytes | |
| # audio_tracks.append(accomp_audio.astype(np.float16)) | |
| # max_length = max(len(vocal_audio), len(accomp_audio)) | |
| # # collate all the audio tracks into a single array | |
| # n_tracks = 2 | |
| # audio_array = np.zeros((n_tracks, max_length), dtype=np.float16) | |
| # for j, audio in enumerate(audio_tracks): | |
| # audio_array[j, :len(audio)] = audio | |
| # stem_content = { | |
| # 'mir_st500_id': mir_st500_id, | |
| # 'program': np.array(program, dtype=np.int64), | |
| # 'is_drum': np.array(is_drum, dtype=np.int64), | |
| # 'n_frames': max_length, # int | |
| # 'audio_array': audio_array # (n_tracks, n_frames) | |
| # } | |
| # return stem_content | |
| # def create_note_note_event_midi_from_mir1k_annotation(ann, midi_file, mir_st500_id): | |
| # """ | |
| # Args: | |
| # ann: List[List[float, float, float]] # [onset, offset, pitch] | |
| # mir_st500_id: str | |
| # Returns: | |
| # notes: List[Note] | |
| # note_events: List[NoteEvent] | |
| # midi: List[List[int]] | |
| # """ | |
| # notes = [] | |
| # for onset, offset, pitch in ann: | |
| # notes.append( | |
| # Note( | |
| # is_drum=False, | |
| # program=100, | |
| # onset=float(onset), | |
| # offset=float(offset), | |
| # pitch=int(pitch), | |
| # velocity=1)) | |
| # notes = sort_notes(notes) | |
| # notes = validate_notes(notes) | |
| # notes = trim_overlapping_notes(notes) | |
| # note_events = note2note_event(notes) | |
| # # Write midi file | |
| # note_event2midi(note_events, midi_file) | |
| # print(f"Created {midi_file}") | |
| # return { # notes | |
| # 'mir_st500_id': mir_st500_id, | |
| # 'program': MIR_ST500_PROGRAM, | |
| # 'is_drum': [0, 0], | |
| # 'duration_sec': note_events[-1].time, | |
| # 'notes': notes, | |
| # }, { # note_events | |
| # 'mir_st500_id': mir_st500_id, | |
| # 'program': MIR_ST500_PROGRAM, | |
| # 'is_drum': [0, 0], | |
| # 'duration_sec': note_events[-1].time, | |
| # 'note_events': note_events, | |
| # } | |
| def preprocess_mir1k_16k(data_home=os.PathLike, dataset_name='mir1k', sanity_check=False) -> None: | |
| """ | |
| Splits: | |
| - train: index 1 to 400, 346 files (54 files missing) | |
| - test: index 401 to 500, 94 files (6 files missing) | |
| - all: 440 files (60 files missing) | |
| Writes: | |
| - {dataset_name}_{split}_file_list.json: a dictionary with the following keys: | |
| { | |
| index: | |
| { | |
| 'mir_st500_id': mir_st500_id, | |
| 'n_frames': (int), | |
| 'mix_audio_file': 'path/to/mix.wav', | |
| 'notes_file': 'path/to/notes.npy', | |
| 'note_events_file': 'path/to/note_events.npy', | |
| 'midi_file': 'path/to/midi.mid', | |
| 'program': List[int], # [100, 129], 100 for singing voice, and 129 for unannotated | |
| 'is_drum': List[int], # [0] or [1] | |
| } | |
| } | |
| """ | |
| # Directory and file paths | |
| base_dir = os.path.join(data_home, dataset_name + '_yourmt3_16k') | |
| output_index_dir = os.path.join(data_home, 'yourmt3_indexes') | |
| os.makedirs(output_index_dir, exist_ok=True) |