Source code for audiomate.formats.audacity

import re

from audiomate import annotations
from audiomate.utils import textfile

__TIME_JUNK_PATTERN = re.compile(r'[^0-9.\-]')


[docs]def write_label_file(path, entries): """ Writes an audacity label file. Start and end times are in seconds. Args: path (str): Path to write the file to. entries (list): List with entries to write. Example:: >>> data = [ >>> [0.0, 0.2, 'sie'], >>> [0.2, 2.2, 'hallo'] >>> ] >>> >>> write_label_file('/some/path/to/file.txt', data) """ textfile.write_separated_lines(path, entries, separator='\t')
[docs]def write_label_list(path, label_list): """ Writes the given `label_list` to an audacity label file. Args: path (str): Path to write the file to. label_list (audiomate.annotations.LabelList): Label list """ entries = [] for label in label_list: entries.append([label.start, label.end, label.value]) textfile.write_separated_lines(path, entries, separator='\t')
[docs]def read_label_file(path): """ Read the labels from an audacity label file. Args: path (str): Path to the label file. Returns: list: List of labels (start [sec], end [sec], label) Example:: >>> read_label_file('/path/to/label/file.txt') [ [0.0, 0.2, 'sie'], [0.2, 2.2, 'hallo'] ] """ labels = [] for record in textfile.read_separated_lines_generator(path, separator='\t', max_columns=3): value = '' if len(record) > 2: value = str(record[2]) labels.append([float(_clean_time(record[0])), float(_clean_time(record[1])), value]) return labels
[docs]def read_label_list(path): """ Reads labels from an Audacity label file and returns them wrapped in a :py:class:`audiomate.annotations.LabelList`. Args: path (str): Path to the Audacity label file Returns: audiomate.annotations.LabelList: Label list containing the labels """ ll = annotations.LabelList() for record in read_label_file(path): ll.add(annotations.Label(record[2], start=record[0], end=record[1])) return ll
def _clean_time(time_str): # According to https://en.wikipedia.org/wiki/Decimal_mark, only the comma or the dot are valid as a decimal # separator and both may only be used as a decimal separator. return re.sub(__TIME_JUNK_PATTERN, '', time_str.replace(',', '.'))