Ich muss den in einer WAV-Datei geschriebenen Ton analysieren. Dafür muss ich diese Datei in eine Reihe von Zahlen umwandeln (z. B. Arrays). Ich denke, ich muss das Wave-Paket verwenden. Ich weiß jedoch nicht, wie genau es funktioniert. Zum Beispiel habe ich folgendes gemacht:
import wave
w = wave.open('/usr/share/sounds/ekiga/voicemail.wav', 'r')
for i in range(w.getnframes()):
frame = w.readframes(i)
print frame
Als Ergebnis dieses Codes erwartete ich, den Schalldruck als Funktion der Zeit zu sehen. Im Gegensatz dazu sehe ich viele seltsame, mysteriöse Symbole (die keine Hexadezimalzahlen sind). Kann mir jemand dabei helfen?
data
ist ein 2-D-Numpy-Array,data.shape
gibt also ein Tupel von (num_samples, num_channels) zurückMit dem
struct
Modul können Sie die Wave-Frames (die sich in der komplementären Binärdatei von 2 zwischen -32768 und 32767 befinden (dh0x8000
und0x7FFF
)) lesen. Dies liest eine MONO, 16-BIT, WAVE-Datei. Ich fand diese Webseite sehr nützlich, um dies zu formulieren:Dieses Snippet liest 1 Frame. Verwenden Sie zum Lesen von mehr als einem Frame (z. B. 13)
quelle
Verschiedene Python-Module zum Lesen von WAV:
Es gibt mindestens die folgenden Bibliotheken zum Lesen von Wave-Audiodateien:
Das einfachste Beispiel:
Dies ist ein einfaches Beispiel für SoundFile:
Format der Ausgabe:
Achtung, die Daten haben nicht immer das gleiche Format, das von der Bibliothek abhängt. Zum Beispiel:
Ausgabe:
SoundFile- und Audiolab-Rückgabe schwebt zwischen -1 und 1 (wie bei matab ist dies die Konvention für Audiosignale). Scipy- und Wave-Return-Ganzzahlen, die Sie entsprechend der Anzahl der Codierungsbits in Floats konvertieren können, zum Beispiel:
quelle
IMHO ist SoundFile der einfachste Weg, Audiodaten aus einer Sounddatei in ein NumPy-Array zu übertragen :
Dies unterstützt auch sofort einsatzbereite 24-Bit-Dateien.
Es sind viele Sounddateibibliotheken verfügbar. Ich habe eine Übersicht geschrieben, in der Sie einige Vor- und Nachteile sehen können. Es enthält auch eine Seite, auf der erklärt wird, wie eine 24-Bit-WAV-Datei mit dem
wave
Modul gelesen wird .quelle
Sie können dies mit dem Modul scikits.audiolab erreichen . Für die Funktion sind NumPy und SciPy sowie libsndfile erforderlich.
Beachten Sie, dass ich es nur unter Ubunutu und nicht unter OSX zum Laufen bringen konnte.
Jetzt haben Sie die WAV-Daten
quelle
scikits.audiolab
wurde seit 2010 nicht aktualisiert und es ist wahrscheinlich nur Python 2.Wenn Sie ein Audio Block für Block verarbeiten möchten, sind einige der angegebenen Lösungen in dem Sinne ziemlich schrecklich, dass sie das Laden des gesamten Audios in den Speicher implizieren, was zu vielen Cache-Fehlern führt und Ihr Programm verlangsamt. Python-Wavefile bietet einige Python-Konstrukte für die blockweise Verarbeitung von NumPy mithilfe einer effizienten und transparenten Blockverwaltung mithilfe von Generatoren. Andere pythonische Besonderheiten sind der Kontextmanager für Dateien, Metadaten als Eigenschaften ... und wenn Sie die gesamte Dateischnittstelle möchten, weil Sie einen schnellen Prototyp entwickeln und sich nicht um die Effizienz kümmern, ist die gesamte Dateischnittstelle immer noch vorhanden.
Ein einfaches Beispiel für die Verarbeitung wäre:
In diesem Beispiel wird derselbe Block zum Lesen der gesamten Datei verwendet, selbst im Fall des letzten Blocks, der normalerweise kleiner als die erforderliche Größe ist. In diesem Fall erhalten Sie ein Stück des Blocks. Vertrauen Sie also der zurückgegebenen Blocklänge, anstatt eine fest codierte 512-Größe für die weitere Verarbeitung zu verwenden.
quelle
Wenn Sie Übertragungen für die Wellenformdaten durchführen möchten , sollten Sie möglicherweise speziell SciPy verwenden
scipy.io.wavfile
.quelle
Ich musste eine 1-Kanal-24-Bit-WAV-Datei lesen. Der obige Beitrag von Nak war sehr nützlich. Wie oben von basj erwähnt, ist 24-Bit jedoch nicht einfach. Ich habe es endlich mit dem folgenden Snippet zum Laufen gebracht:
Eine zusätzliche Skalierung ist erforderlich, wenn Sie Ergebnisse zwischen -1 und +1 benötigen. Vielleicht finden einige von Ihnen das nützlich
quelle
Wenn es sich nur um zwei Dateien handelt und die Abtastrate sehr hoch ist, können Sie sie einfach verschachteln.
quelle
Sie können auch eine einfache
import wavio
Bibliothek verwenden. Sie benötigen auch einige Grundkenntnisse des Klangs.quelle
PyDub ( http://pydub.com/ ) wurde nicht erwähnt und das sollte behoben werden. IMO ist dies die derzeit umfassendste Bibliothek zum Lesen von Audiodateien in Python, allerdings nicht ohne Fehler. Lesen einer WAV-Datei:
PS. In diesem Beispiel geht es um das Lesen einer WAV-Datei, aber PyDub kann viele verschiedene Formate sofort verarbeiten. Die Einschränkung ist, dass es sowohl auf nativer Python-WAV-Unterstützung als auch auf ffmpeg basiert. Daher muss ffmpeg installiert sein und viele der pydub-Funktionen hängen von der ffmpeg-Version ab. Wenn ffmpeg das kann, kann es normalerweise auch pydub (was ziemlich mächtig ist).
Haftungsausschluss: Ich bin nicht mit dem Projekt verbunden, aber ich bin ein starker Benutzer.
quelle