Wie kann ich Audio-Segmente samt Beschriftung aus einer Log-Datei speichern?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Robotto
User
Beiträge: 1
Registriert: Dienstag 1. Dezember 2020, 18:26

Ich möchte bestimmte Segmente einer Audiodatei (audio.wav) extrahieren und beschriften. Die Start- und Endzeiten der Segmente werden durch den DateTimeStamp (erste Spalte) und die Dauer der Aktion in Millisekunden (dritte Spalte) in einer anderen Datei, der Annotationsdatei (annotat.csv), angegeben:

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

Die Datei audio.wav beginnt zum Zeitpunkt des ersten DateTimeStamp der Datei annot.csv.

Wie kann ich die Informationen in der Datei annotat.csv verwenden, um die Segmente (audio_seg) als einzelne Dateien mit eindeutigen Dateinamen zu speichern, die die Informationen in der Spalte "Aktion" der Datei annotat.csv enthalten?

Bisher bin ich soweit gekommen:

Code: Alles auswählen

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/Me/Audio/annotat.csv", date_format="%m/%d/%y %H:%M:%S:%f")
print(segments)
 
y, sr = librosa.load("C:/Users/Me/Audio/audio.wav", sr=16000, duration=2027)
extract_segments(y, sr, segments)
Antworten