import csv import os from pathlib import Path from tqdm import tqdm from ..core import AudioSignal def create_csv( audio_files: list, output_csv: Path, loudness: bool = False, data_path: str = None ): """Converts a folder of audio files to a CSV file. If ``loudness = True``, the output of this function will create a CSV file that looks something like: .. csv-table:: :header: path,loudness daps/produced/f1_script1_produced.wav,-16.299999237060547 daps/produced/f1_script2_produced.wav,-16.600000381469727 daps/produced/f1_script3_produced.wav,-17.299999237060547 daps/produced/f1_script4_produced.wav,-16.100000381469727 daps/produced/f1_script5_produced.wav,-16.700000762939453 daps/produced/f3_script1_produced.wav,-16.5 .. note:: The paths above are written relative to the ``data_path`` argument which defaults to the environment variable ``PATH_TO_DATA`` if it isn't passed to this function, and defaults to the empty string if that environment variable is not set. You can produce a CSV file from a directory of audio files via: >>> import audiotools >>> directory = ... >>> audio_files = audiotools.util.find_audio(directory) >>> output_path = "train.csv" >>> audiotools.data.preprocess.create_csv( >>> audio_files, output_csv, loudness=True >>> ) Note that you can create empty rows in the CSV file by passing an empty string or None in the ``audio_files`` list. This is useful if you want to sync multiple CSV files in a multitrack setting. The loudness of these empty rows will be set to -inf. Parameters ---------- audio_files : list List of audio files. output_csv : Path Output CSV, with each row containing the relative path of every file to ``data_path``, if specified (defaults to None). loudness : bool Compute loudness of entire file and store alongside path. """ info = [] pbar = tqdm(audio_files) for af in pbar: af = Path(af) pbar.set_description(f"Processing {af.name}") _info = {} if af.name == "": _info["path"] = "" if loudness: _info["loudness"] = -float("inf") else: _info["path"] = af.relative_to(data_path) if data_path is not None else af if loudness: _info["loudness"] = AudioSignal(af).ffmpeg_loudness().item() info.append(_info) with open(output_csv, "w") as f: writer = csv.DictWriter(f, fieldnames=list(info[0].keys())) writer.writeheader() for item in info: writer.writerow(item)