74 lines
2.7 KiB
Python
74 lines
2.7 KiB
Python
# Env - chords_extraction on devfair
|
|
|
|
import pickle
|
|
import argparse
|
|
from chord_extractor.extractors import Chordino # type: ignore
|
|
from chord_extractor import clear_conversion_cache, LabelledChordSequence # type: ignore
|
|
import os
|
|
from tqdm import tqdm
|
|
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('--src_jsonl_file', type=str, required=True,
|
|
help='abs path to .jsonl file containing list of absolute file paths seperated by new line')
|
|
parser.add_argument('--target_output_dir', type=str, required=True,
|
|
help='target directory to save parsed chord files to, individual files will be saved inside')
|
|
parser.add_argument("--override", action="store_true")
|
|
args = parser.parse_args()
|
|
return args
|
|
|
|
|
|
def save_to_db_cb(tgt_dir: str):
|
|
# Every time one of the files has had chords extracted, receive the chords here
|
|
# along with the name of the original file and then run some logic here, e.g. to
|
|
# save the latest data to DB
|
|
def inner(results: LabelledChordSequence):
|
|
path = results.id.split(".wav")
|
|
|
|
sequence = [(item.chord, item.timestamp) for item in results.sequence]
|
|
|
|
if len(path) != 2:
|
|
print("Something")
|
|
print(path)
|
|
else:
|
|
file_idx = path[0].split("/")[-1]
|
|
with open(f"{tgt_dir}/{file_idx}.chords", "wb") as f:
|
|
# dump the object to the file
|
|
pickle.dump(sequence, f)
|
|
return inner
|
|
|
|
|
|
if __name__ == "__main__":
|
|
'''This script extracts chord data from a list of audio files using the Chordino extractor,
|
|
and saves the extracted chords to individual files in a target directory.'''
|
|
print("parsed args")
|
|
args = parse_args()
|
|
files_to_extract_from = list()
|
|
with open(args.src_jsonl_file, "r") as json_file:
|
|
for line in tqdm(json_file.readlines()):
|
|
# fpath = json.loads(line.replace("\n", ""))['path']
|
|
fpath = line.replace("\n", "")
|
|
if not args.override:
|
|
fname = fpath.split("/")[-1].replace(".wav", ".chords")
|
|
if os.path.exists(f"{args.target_output_dir}/{fname}"):
|
|
continue
|
|
files_to_extract_from.append(line.replace("\n", ""))
|
|
|
|
print(f"num files to parse: {len(files_to_extract_from)}")
|
|
|
|
chordino = Chordino()
|
|
|
|
# Optionally clear cache of file conversions (e.g. wav files that have been converted from midi)
|
|
clear_conversion_cache()
|
|
|
|
# Run bulk extraction
|
|
res = chordino.extract_many(
|
|
files_to_extract_from,
|
|
callback=save_to_db_cb(args.target_output_dir),
|
|
num_extractors=80,
|
|
num_preprocessors=80,
|
|
max_files_in_cache=400,
|
|
stop_on_error=False,
|
|
)
|