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