.wav Datei Spalten

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
Benutzeravatar
Bio Salami
User
Beiträge: 63
Registriert: Mittwoch 28. Juli 2021, 14:10

Hey,
ich bin gerade dabei eine AI auf Stimm Erkennung zu trainieren. Dafür müsste ich meine .wav Datei in kleinere zb. 5 Sekunden lange Dateien speichern. Was wäre der einfachste weg?
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

einfach stumpf in 5s Schnipsel teilen oder an passender Stelle (also z.B. immer wenn Stille ist) teilen?

Wenn du eine grafischen Editor brauchst: Audacity ist ein ganz guter, kostenloser Audioeditor.

Gruß, noisefloor
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

WAV files liest man üblicherweise als numpy arrays ein, und zusammen mit der Samplerate kannst du einfach Teile da raus schnipseln.
Benutzeravatar
Bio Salami
User
Beiträge: 63
Registriert: Mittwoch 28. Juli 2021, 14:10

@noisefloor,
ich könnte es auch Manuel machen. Aber ich bräuchte ein Programm welches Audio Dateien (zb. 10 Minuten lang) in 2 Sekunden lange Dateien speichert.
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

In der Standardbibliothek gibt es das `wave`-Modul, mit dem man sich so etwas relativ leicht schreiben könnte.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

Bio Salami hat geschrieben: Freitag 22. Oktober 2021, 17:24 Dafür müsste ich meine .wav Datei in kleinere zb. 5 Sekunden lange Dateien speichern. Was wäre der einfachste weg?
Meiner Meinung nach ist SoX ein besonders einfacher Weg (vor allem unter Unix-Systemen; unter Windows geht es aber wohl auch irgendwie). Die Manpage zeigt ein konkretes Beispiel, um eine Wave-Datei in 30-Sekunden-Schnipsel zu teilen.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Lies dich mal in diesen Thread hier ein, insbesondere die Antworten liefern multiple Lösungen für dein Problem.

https://stackoverflow.com/questions/172 ... -in-python
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Ich, persönlich finde die von __deets__ vorgeschlagene Methode mit numpy (scipy) am schönsten. Da hat man komfortablen Zugriff auf die Daten und kann zum Beispiel auch schön plotten.

Code: Alles auswählen

import numpy as np
from scipy.io import wavfile
import matplotlib.pyplot as plt


def plot(audio, start, duration):
    rate, data = audio
    stop = start + duration
    fig, ax = plt.subplots(2)
    fig.suptitle(f"Start: {start}s, Dauer: {duration}s")
    start_index = int(start * rate)
    stop_index = int(stop * rate)
    samples = int(duration * rate)
    time_data = np.linspace(start, stop, samples)
    ax[0].set_title("Channel 1")
    ax[1].set_title("Channel 2")
    ax[0].grid(True)
    ax[1].grid(True)
    ax[0].plot(time_data, data[start_index:stop_index, 0])
    ax[1].plot(time_data, data[start_index:stop_index, 1])
    plt.show()


def split(audio, seconds, max_parts=None):
    rate, data = audio
    total_samples, _channels = data.shape
    part_samples = seconds * rate

    indices = np.arange(part_samples, total_samples, part_samples)
    for num, part in enumerate(np.vsplit(data, indices)):
        if max_parts and num >= max_parts:
            return
        yield (rate, part)


def main():
    audio = wavfile.read("sound.wav")

    plot(audio, start=10, duration=10)

    for num, part in enumerate(split(audio, seconds=2, max_parts=2)):
        rate, data = part
        wavfile.write(f"sound_part_{num:04d}.wav", rate, data)


if __name__ == "__main__":
    main()
Edit: optionaler Parameter um die Anzahl der Ausgabedateien zu begrenzen
tonikae
User
Beiträge: 90
Registriert: Sonntag 23. Februar 2020, 10:27

rogerb hat geschrieben: Samstag 23. Oktober 2021, 11:52 Ich, persönlich finde die von __deets__ vorgeschlagene Methode mit numpy (scipy) am schönsten. Da hat man komfortablen Zugriff auf die Daten und kann zum Beispiel auch schön plotten.
Da ist IMO generell der beste Weg Multimediadatei (nicht nur Audio, sondern auch Bilder) zu bearbeiten...sie in ein Array zu laden. Allerdings würde ich dafür nicht unbedingt Python verwenden.
Nicht böse sein, aber andere Sprachen kriegen das damit deutlich einfacher gebacken, Audio/Bilder/Schnipsel davon in einem Array zu bearbeiten.
Bsp(nicht in Python)

Code: Alles auswählen

using FileIO, Plots

data = load("Hells Bells.flac")[1][30750:689971,1]
bd,slen = 6000, length(data)

anim = @animate for a = 1:50
    plot(data, grid=false, legend=false, layout=(3, 1))
    plot!(data[90a:90a+bd], legend=false, annotations=(bd,.6,text(a,12,:right)), lc=:acton, sp=2)
    plot!(reverse(data), legend=false, xlabel="slen: $slen", lc=:orange, sp=3)
end;gif(anim,"animation.gif", fps=10)
Mit den paar Zeilen kriegt man das sogar animiert.

https://drive.google.com/file/d/1pM5ieA ... SOxQV/view
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Nicht böse sein, aber andere Sprachen kriegen das damit deutlich einfacher gebacken, Audio/Bilder/Schnipsel davon in einem Array zu bearbeiten.
Schönes Beispiel! Jeder hat halt seine Lieblingssprache, bzw. Sprache in der man sich am besten auskennt. Wenn ich nachts nicht schlafen müsste würde ich wahrscheinlich auch noch Julia lernen
Antworten