Spaces:
Running
on
Zero
Running
on
Zero
File size: 2,736 Bytes
9d3cb0a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
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)
|