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) | |