Python Forum
How to extract and label audio using timestamp annotation - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: How to extract and label audio using timestamp annotation (/thread-31256.html)



How to extract and label audio using timestamp annotation - Mergorine - Nov-30-2020

I would like to extract and label certain segments of an audio file (audio.wav). The start and end times of the segments are given by the DateTimeStamp (first column) and the duration of action in milliseconds (third column) in another file, the annotation file (annotat.csv):


DateTimeStamp ---------- Action -- Duration of action in milliseconds
04/16/20 21:25:36:241 ----- A ----- 502
04/16/20 21:25:36:317 ----- B ----- 2253
04/16/20 21:25:36:734 ----- X ----- 118
04/16/20 21:25:36:837 ----- C ----- 10
04/16/20 21:25:37:537 ----- D ----- 797
04/16/20 21:25:37:606 ----- X ----- 70
04/16/20 21:25:37:874 ----- A ----- 1506
. ----- . -----.
The audio.wav file starts at the time of the first DateTimeStamp of the file annot.csv. How can I use the info in the annotat.csv file to save the segments (audio_seg) as individual files with unique filenames containing the info in the "Action" column of the annotat.csv file?

This is how far I got today:
import io
import pandas
import numpy as np
import librosa
import soundfile as sf


def read_data(annotat, date_format):
    df = pandas.read_csv(annotat, sep=',')

    # Use proper pandas datatypes
    df['Time'] = pandas.to_datetime(df['DateTime'], format=date_format)
    df['Duration'] = pandas.to_timedelta(df['Duration ms'], unit='ms')
    df['Offset'] = pandas.to_datetime(df['StartOffset ms'], unit='ms')
    df = df.drop(columns=['DateTime', 'Duration ms', 'StartOffset ms'])

    # Compute start and end time of each segment
    # audio starts at time of first segment
    first = df['Time'].iloc[0]
    df['Start'] = df['Time'] - first
    df['End'] = df['Start'] + df['Duration']

    return df

def extract_segments(y, sr, segments):
    # compute segment regions in number of samples
    starts = numpy.floor(segments.Start.dt.total_seconds() * sr).astype(int)
    ends = numpy.ceil(segments.End.dt.total_seconds() * sr).astype(int)

    # slice the audio into segments
    for start, end in zip(starts, ends):
        audio_seg = y[start:end]
        print('extracting audio segment:', len(audio_seg), 'samples')
        
segments = read_data("C:/Users/Mergorine/Audio/annotat.csv", date_format="%m/%d/%y %H:%M:%S:%f")
print(segments)

y, sr = librosa.load("C:/Users/Mergorine/Audio/audio.wav", sr=16000, duration=2027)
extract_segments(y, sr, segments)