Das Speichern und Abspielen von Arrays als Audiodateien in Python kann für Musikwissenschaftler’innen äußerst wertvoll sein. Neben der Sound-Synthese spielt auch die Weiterverarbeitung in anderen Programmen eine wichtige Rolle in der Forschung. Auch als Sound-Designer ist der Blick über den Tellerrand der klassischen Programme eine gute Übung für die Kreativität. Lernen Sie hier, wie Sie Ihre Kreationen oder Forschungsprojekte als WAV-Datei speichern können.
Was ist eine WAV-Datei
Die WAV-Datei, auch Wave oder Wave-Datei genannt, ist ein Audio-Dateiformat, welche bis zu 4 GB groß sein kann. Während MP3-Dateien verlustbehaftet komprimiert sind, kann ein WAV.Kontainer unkomprimierte PCM-Rohdaten enthalten.

Der Name der WAV-Datei ist vom englischen Begriff „wave“ abgeleitet und bedeutet „Welle“. Sie können mit Python Audio Dateien im WAV-Format erstellen. Quelle: Pixabay
Python Audio Datei erhalten (3 Methoden)
Drei der praktischsten Methoden um aus einem Array eine WAV-Datei zu erstellen sind:
- Scipy ist für den wissenschaftlichen Gebrauch konzipiert. Die Bibliothek glänzt durch ihre Einfachheit und Genauigkeit.
- Das
waveModul ist bereits in Python enthalten und benötigt keine zusätzlichen Bibliotheken. - Soundfile ist ebenfalls schnell, einfach und vielseitig.
Python Audio — Sinus erstellen
Um eine WAV-Datei zu erhalten, benötigen Sie zunächst ein NumPy-Array. In diesem sind mehrdimensional Daten gespeichert. Die Daten in einem Array lassen sich als Graph darstellen oder als Audio abspielen. Ein Ton kann entstehen, wenn die Daten sich in gleichmäßigen Abständen wiederholen. Das nennt man Periodizität. Nicht-periodische Daten können auch als Audio abgespielt werden, klingen für das menschliche Ohr allerdings wie Rauschen.
import numpy as np
samplerate = 44100
def signal(f=440, s=1, A=1, fileformat=np.int16):
t = np.linspace(0, s, int(s*samplerate), endpoint=False)
amplitude = (np.iinfo(fileformat).max)*A
sine = amplitude * np.sin(2*np.pi*f*t)
return sine.astype(fileformat)
Dieser Quelltext definiert die Funktion signal(). Diese können Sie mit beliebigen Werten aufrufen. Die Funktion gibt ein Array mit den Werten eines Sinus zurück. Die wichtigsten Werte sind:
fdie Frequenz und somit Tonhöhe des Sinus.sdie Länge des Sinus in Sekunden.Adie Amplitude, sie beeinflusst wie die Lautstärke des Signals vom Computer gelesen wird.A=1ist in diesem Fall der höchstmögliche Wert des Dateiformates undA=0wäre Stille.fileformatdie Art der Enkodierung beziehungsweise die Bit-Tiefe. Geben Sie hiernp.int16für 16-Bit PCM,np.int32für 32-Bit PCM odernp.uint8für unsignierte 8-Bit PCM Enkodierung an.
In einem eigenen Artikel erklären wir ausführlich, wie Sie in Python einen Sinus plotten und abspielen.
Python Audio — Datei erhalten mit SciSciPy
SciPy ist eine Python Bibliothek. Sie ist für die Anwendung im wissenschaftlichen Bereich gedacht und hat viele nützliche Funktionen. Eine davon ist die write Funktion aus dem Modul scipy.io.wavfile(). Mit diesem Modul können Sie Eingangsdaten erstellen und Ausgangsdaten auslesen.
from scipy.io.wavfile import write
sine=signal(f=440, s=1, A=0.5, fileformat=np.int16)
write('python_audio.wav', samplerate, sine.astype(np.int16))
Importieren Sie zunächst das Modul mit from scipy.io.wavfile import write.
Rufen Sie dann sine=signal(f=440, s=1, A=0.5) mit den gewünschten Werten auf. Geben Sie im Anschluss einen Namen für die Datei ein. Beachten Sie, den Namen in Anführungszeichen zu setzen und mit .wav zu beenden. Fügen Sie die Variable für die samplerate hinzu und geben Sie mit sine.astype(np.int16) die Enkodierungsform an — in diesem Fall 16-bit PCM.
Die Funktion sollte dann eine Datei mit dem gewählten Namen im gleichen Ordner abspeichern, in dem das Programm gelaufen ist.
Python Audio — waveModul
Sollten Sie keine Lust haben weitere Bibliotheken zu installieren ist hier ein weiterer Weg in Python eine Audio-Datei zu erhalten: Das in Python eingebaute wave-Modul.
import wave
sine=signal(f=440, s=1, A=0.5, fileformat=np.int16)
filename = 'python_audio.wav'
with wave.open(filename, 'wb') as wf:
wf.setnchannels(1)
wf.setsampwidth(2)
wf.setframerate(samplerate)
wf.writeframes(sine.tobytes())
Importieren Sie zuerst das wave Modul. Legen Sie im Anschluss den Namen der Datei in der Variable filename fest.
Nutzen Sie die wave.open() Funktion:
- Um mit
wf.setnchannels(1)die Menge der Ausgangs-Kanäle festzulegen. Wenn Sie einen einzelnen Kanal einstellen, wie in diesem Fall, wird die Datei in Mono gespeichert. - Legen Sie mit
wf.setsampwidth(2)die Bit-Tiefe fest. Ein Wert von2bedeutet eine Bit-Tiefe von 16,4wären 32 Bit. Da das Sinus-Array auch mit 16-Bit gespeichert wurde, bietet sich 16 Bit hier an. - Bei
wf.setframerate()reicht es, wenn Sie die vorher festgelegtesamplerateVariable angeben. - Schreiben Sie dann mit
wf.writeframes(sine.tobytes())das Sinus-Array auf eine WAV-Datei.
Python Audio — Das Soundfile Modul
Die write Funktion des Soundfile Moduls eignet sich ebenfalls, um in Python Audio-Dateien zu erhalten.
import soundfile as sf
sine=signal(f=440, s=1, A=0.5, fileformat=np.int16)
filename = 'python_audio.wav'
sf.write(filename, sine, samplerate)
Installieren Sie dafür zuerst das Modul. Importieren Sie es dann mit import soundfile as sf. Legen Sie den Dateinamen fest und speichern Sie ihn in der Variable filename.
Schreiben Sie nun mit sf.write() unter Angabe dersamplerate das Sinus-Array als WAV-Datei. Das Modul übernimmt die Enkodierung von 16 Bit PCM aus dem Array. Diese haben Sie beim Aufrufen der Funktion signal() festgelegt.
Wie Sie sehen gibt es viele verschiedene Wege eine WAV-Datei in Python zu erzeugen. Je nach Anwendungsbereich können manche davon praktischer sein als andere. In einem weiteren Artikel zeigen wir Ihnen, wie Sie in Python Audio abspielen.