ich komme bei einem Projekt mit dem Programmieren in python3 nicht weiter und vielleicht kann mir wer von euch helfen.
Ich möchte Audiodateien zerhacken. Dabei gebe ich dem Programm eine Input.wav, diese soll in wählbar viele und wählbar lange Schnipsel zerlegt werden. Die Schnipsel werden von zufälligen Positionen aus der Input.wav heraus geholt und in einem Arbeitsordner durchnummeriert abgespeichert. In einem zweiten Schritt soll das Programm alle erstellten Schnipsel in zufälliger Reihenfolge aneinander hängen und als Output.wav abspeichern.
Soweit zur Idee. Nun komme ich an folgender Stelle nicht weiter: Ich weiß nicht, wie ich das Wave_write.writeframesraw(data) benutzen soll. Was genau ist dabei das "data"? Wie vermittle ich dem Programm, dass die Schnipseldateien sich ergeben sollen aus gewissen Frames der Input.wav? Und die zweite Frage, die sich später stellen wird, wie addiere ich die Schnippsel wieder zu einer neuen Output.wav?
Ich poste mal meinen bisherigen Fortschritt:
Code: Alles auswählen
# Mitschnitt Hakker
# Version 1
#
# Version Tmk zur Sichtung Ruben
#
# Stellen, an denen du die Ordnerstruktur fuer dich aendern musst sind markiert mit "#HIER" (4 Stellen)
#
# Aus Kompatibilitaet zu python2.6 sind hier keine Umlaute oder sz-ts drin.
#
# 2010-02-18, 2010-02-19
# Welcome
print('''''')
print('''=================''')
print('''Mitschnitt Hakker''')
print('''=================''')
print('''''')
print('''Mitschnitt Hakker zerlegt eine Wave-Audiodatei in kleine Schnippsel und frikkelt diese in zufaelliger Reihenfolge zu einer neuen Audiodatei zusammen.''')
print('''''')
print('''Die Eingabedatei kann alles sein, sie muss nur in "/home/<user>/Audio/" liegen, "Input.wav" heissen und eine Sounddatei sein. Und sie muss für das Python-Wave-Modul eine Sampling-Tiefe von 16 bit haben.''')
print('''''')
# Module laden
import os, sys, wave, random
# Datei laden
try:
InputFile = wave.open('/home/tmk/Audio/Input.wav','r') #HIER
print('''"Input.wav" gefunden, OK.''')
print('''Sampling-Rate ist''',int(InputFile.getframerate()),'''Hertz.''')
print('''Laenge der Datei ist''',int(InputFile.getnframes()) / int(InputFile.getframerate()),'''Sekunden =''',int(InputFile.getnframes()) / int(InputFile.getframerate()) / 60,'''Minuten =''',InputFile.getnframes(),'''einzelne Samples.''')
print('''''')
except:
print('''Erwartete "Input.wav" nicht in "/home/<user>/Audio/" gefunden.''')
print('''Entweder der Ordner oder die Datei fehlen oder heissen falsch oder die Sampling-Tiefe ist ungleich 16 bit. Python's Wave-Modul kann nur 16 bit.''')
print('''''')
print('''Versuche es nochmal.''')
print('''''')
sys.exit()
# Auf Ordner /home/<user>/Audio/Schnippsel/ prüfen und ggfs anlegen (Arbeitsordner)
try:
os.mkdir('/home/tmk/Audio/Schnippsel') #HIER
print('''Lege Arbeitsordner "/home/<user>/Audio/Schnippsel/" an, OK.''')
print('''''')
except:
print('''Arbeitsordner "/home/<user>/Audio/Schnippsel/" gefunden, OK.''')
print('''''')
# SchnippselLength
SchnippselLength = int(input('''Wie lang soll ein Schnippsel werden (in Sekunden)? '''))
if int(SchnippselLength) <= 0:
print('''''')
print('''Schnippsel koennen nicht kleiner gleich Null sein. Das geht einfach nicht. Danke fuers Probieren.''')
print('''Versuche es nochmal.''')
print('''''')
sys.exit()
elif int(SchnippselLength) < int(InputFile.getnframes()) / int(InputFile.getframerate()):
print('''''')
else:
print('''''')
print('''Schnippsel sollten kuerzer sein als die Eingabedatei.''')
print('''Versuche es nochmal.''')
print('''''')
sys.exit()
# SchnippselAnzahl
print('''Bei richtig vielen Schnippseln, gemessen an der Laenge der Eingabedatei, werden sich die Inhalte, nicht 1 zu 1, aber doch, wiederholen.''')
SchnippselAnzahl = int(input('''Wie viele Schnippsel sollen von zufaelligen Positionen aus der Eingabedatei herausgeholt werden? '''))
print('''''')
if int(SchnippselAnzahl) <= 0:
print('''Hole''',int(SchnippselAnzahl),'''Schnippsel.''')
print('''OK, fertig.''')
print('''''')
sys.exit()
else:
print('''Zerhacke "Input.wav" in''',int(SchnippselAnzahl),int(SchnippselLength),'''Sekunden lange Schnippsel. Bitte warten...''')
print('''''')
# bis hier ist alles cool.
# ab hier weiß ich noch nicht so recht weiter...
# Zerhakken
i = 1 # das ist für die Dateinamenerzeugung der Schnippsel und zur Anzeige der Durchlaufsnummer. Ich liebe Konsolenoutput! :-)
while int(SchnippselAnzahl) > 0:
r = random.randint(1,round(int(InputFile.getnframes()) - int(InputFile.getframerate()) * int(SchnippselLength))) # Erzeugt die Zufallszahl - SchnippselLength in Frames
# InputFile.setpos(r)
# OutputFile.setparams(2,2,int(InputFile.getframerate()),(wie viele samples))
# Recorde von Stelle InputFile.setpos(r) + SchnippselLength in Frames nach BetweenFile --- kein plan bis jetzt wie...
BetweenFile = wave.open('/home/tmk/Audio/Schnippsel/schnipp'+str(i)+'.wav','w') #HIER
BetweenFile.setnchannels(2)
BetweenFile.setframerate(int(InputFile.getframerate()))
BetweenFile.setsampwidth(2) # 2 = 2 Byte = 16 Bit also OK
print('''Durchgang Nummer''',int(i),'''- Extrahiere''',int(SchnippselLength),'''Sekunden ab Frame''',int(r))
print('''''')
SchnippselAnzahl = int(SchnippselAnzahl) - 1
i = int(i) + 1
# Zusammensetzen
OutputFile = wave.open('/home/tmk/Audio/zerhakkt.wav','w') #HIER
OutputFile.setnchannels(2)
OutputFile.setframerate(int(InputFile.getframerate()))
OutputFile.setsampwidth(2)
# randommaessig aus den int(SchnippselAnzahl) Stuecken 1 neue wav bauen, sodass alle Schnippsel 1 mal drin vorkommen.
# Dateien schließen! jeht irgendwie nicht...
InputFile.close()
BetweenFile.close()
OutputFile.close()
# Verabschiedung