Seite 1 von 1

Inhalt eines Wav files bearbeiten

Verfasst: Montag 22. Januar 2024, 22:40
von opus59
Moin,

Ich suche nach der Möglichkeit den Inhalt eines .wav files zu bearbeiten.
Genauerer gesagt möchte ich an einer bestimmten Stelle einen kurzen Ton (Sinuswelle) hinzufügen.
Mittels .writeframes() geht das m.E. nur ans Ende des files

Re: Inhalt eines Wav files bearbeiten

Verfasst: Dienstag 23. Januar 2024, 00:19
von __deets__
Du liest die als Ganzes ein & modifizierst die gewünschte stelle, und schreibst alles weg.

Re: Inhalt eines Wav files bearbeiten

Verfasst: Dienstag 23. Januar 2024, 05:44
von snafu
Muss es dafür unbedingt Python sein? Ich würde sowas wahrscheinlich mit ffmpeg auf der Kommandozeile machen. Die entsprechenden Parameter für die Arbeitsschritte (Sinus-Ton mit bestimmter Länge erzeugen + diesen an bestimmter Stelle einfügen) kann man per Google herausfinden. Falls du bis heute Abend nichts hast, setze ich mich da evtl. mal dran.

Re: Inhalt eines Wav files bearbeiten

Verfasst: Dienstag 23. Januar 2024, 06:21
von opus59
snafu hat geschrieben: Dienstag 23. Januar 2024, 05:44 Muss es dafür unbedingt Python sein?
Leider ja, die Daten für die Änderung (welcher Zeitpumkt, Amplitude und Freuenz) ergeben sich durch die aktuellen Daten der laufenden Anwendung. Das ganze File zu schreiben 6 Sekunden) würde m.E. zu lange dauern.
Bin ich mit .writeframes auf dem Holzweg?

Re: Inhalt eines Wav files bearbeiten

Verfasst: Dienstag 23. Januar 2024, 07:21
von __blackjack__
@opus59: Es wird nicht anders gehen, weil man in Dateien nichts irgendwo mitten drin einfügen kann.

Re: Inhalt eines Wav files bearbeiten

Verfasst: Dienstag 23. Januar 2024, 12:39
von opus59
__blackjack__ hat geschrieben: Dienstag 23. Januar 2024, 07:21 ..., weil man in Dateien nichts irgendwo mitten drin einfügen kann.
Natürlich muss man die Datei öffnen (und dabei einlesen). Wenn ich die eingelesenen Daten an der richtigen Stelle ändere und dann alles wieder speichere sollte es doch gehen.

Re: Inhalt eines Wav files bearbeiten

Verfasst: Dienstag 23. Januar 2024, 12:41
von sparrow
@opus59: Na, was denn nun? "Das ganze File zu speichern" dauert dir zu lange aber "alles wieder speichern" geht?

Re: Inhalt eines Wav files bearbeiten

Verfasst: Dienstag 23. Januar 2024, 12:49
von __deets__
opus59 hat geschrieben: Dienstag 23. Januar 2024, 12:39
__blackjack__ hat geschrieben: Dienstag 23. Januar 2024, 07:21 ..., weil man in Dateien nichts irgendwo mitten drin einfügen kann.
Natürlich muss man die Datei öffnen (und dabei einlesen). Wenn ich die eingelesen Daten an der richtigen Stelle ändere und dann alles wieder speichere sollte es doch gehen.
Alles wieder speichern ist was ich schon vorgeschlagen habe. ALLES wieder speichern. Es gibt - zumindest für echtes einfügen, also verschieben der Daten danach - keine substantiell andere Lösung. Man kann etwas optimieren mit erst-ab-da schreiben, muss dann aber zb auch den WAV Header anpassen, und der ist ja am Anfang. Muss man aber selbst bauen & hilft nur wirklich, wenn Daten weit hinten eingefügt werden.

Mit bordmitteln des WAV-file-Moduls ist es also immer die gesamte Datei.

Und dann gäbe es noch Memory mapped IO wenn es statt einfügen ersetzen ist. Da kann man tatsächlich etwas sparen.

Aber auch das nur handgemacht.

Re: Inhalt eines Wav files bearbeiten

Verfasst: Dienstag 23. Januar 2024, 20:02
von opus59
__deets__ hat geschrieben: Dienstag 23. Januar 2024, 12:49 Mit bordmitteln des WAV-file-Moduls ist es also immer die gesamte Datei.
Verstanden, dann war ich auf dem falschen Weg.
Danke für die Antworten!

Re: Inhalt eines Wav files bearbeiten

Verfasst: Mittwoch 24. Januar 2024, 18:02
von opus59
"händisch" erledigt!

Code: Alles auswählen

from scipy.io import wavfile
from scipy.io.wavfile import write
import numpy as np

    wav_fname = 'PingEcho.wav' #name of the original file
    echoLength = 0.2 #fixed length of the echo-sound [sec]
    fd =800 #frequency
    samplerate, data = wavfile.read(wav_fname)
    if samplerate!=44100:
        return
    td=distance*3600/speedOfSound  #calculates the timedelay of the echo-sound [sec]
    t = np.linspace(td, td+ echoLength, num=int(samplerate * echoLength)) #creates an array in the desired length, initially with the timesteps of the echo-sound
    newSamples =t.size
    amplitude = np.iinfo(np.int16).max
    echodata = amplitude * np.sin(2. * np.pi * fd * t) #creation of the frequency samples
    echoIndices=np.linspace(int(td*samplerate),int((td+echoLength)*samplerate-1),num=newSamples,dtype='int32')#array with the indices to be updated of the prerecorded wav 
    np.put(data, echoIndices, echoData) #udpdating the original data with echoData
    write("PingEchoNew.wav", samplerate, data.astype(np.int16))# saving the newly created wav file

Re: Inhalt eines Wav files bearbeiten

Verfasst: Mittwoch 24. Januar 2024, 18:09
von __deets__
Oeh. Das schreibt doch einfach nur das gesamte Wave-File raus, da ist doch kein Unterschied zur Ausgangsfrage.

Re: Inhalt eines Wav files bearbeiten

Verfasst: Donnerstag 25. Januar 2024, 07:36
von opus59
Äh, nein.

Neu geschrieben (oder genauer gesagt neu berechnet) werden nur die Daten für 0,2 Sekunden. Diese werden an die festgelegte (Zeit-) Stelle geschrieben.

Re: Inhalt eines Wav files bearbeiten

Verfasst: Donnerstag 25. Januar 2024, 08:41
von __deets__
Nö. Du liest die gesamte Datei in data ein. Modifizierst sie an an einer Stelle. Und schreibst das gesamte WAV file neu, sogar in eine neue Datei. Und das zu vermeiden war / so zumindest hat dich jeder hier verstanden - das Ziel.

Re: Inhalt eines Wav files bearbeiten

Verfasst: Donnerstag 25. Januar 2024, 09:54
von sparrow
Was übrigens genau das is, was __deets__ in der ersten Antwort geschrieben hat.

Re: Inhalt eines Wav files bearbeiten

Verfasst: Donnerstag 25. Januar 2024, 09:58
von DeaD_EyE
Anspruchsvoller wird es, wenn man es als Stream anbieten will, ohne etwas zu schreiben.

[Quelle] -> Python-Programm -> Unix-Socket -> Anderes Programm, dass den Stream liest