Spaces:
Running
on
Zero
Running
on
Zero
| 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) | |