2017-06-25 3 views
3

Ich versuche, eine WAV-Datei aus der TIMIT Datenbank in Python zu lesen, aber ich erhalte eine Fehlermeldung:eine WAV-Datei aus TIMIT Datenbank in Python zu lesen

Wenn ich Welle bin mit:

wave.Error: file does not start with RIFF id 

wenn ich verwende scipy:

ValueError: File format b'NIST'... not understood. 

und wenn ich librosa bin mit, habe das Programm stecken. Ich habe versucht, es zu konvertieren in wav sox mit:

cmd = "sox " + wav_file + " -t wav " + new_wav 
subprocess.call(cmd, shell=True) 

und es half nicht. Ich habe eine alte Antwort gesehen, die auf das Paket scikits.audioLab verweist, aber es sieht so aus, als ob es nicht mehr unterstützt wird.

Wie kann ich diese Datei lesen, um ein Array der Daten zu erhalten?

Dank

+0

Sie könnten versuchen, die Datei mit dem Modul [soundfile] (http://pysoundfile.readthedocs.io/) oder einem der anderen libsndfile Wrapper, die die unterstützen sollte NIST-Format. – Matthias

Antwort

3

Die Datei ist keine WAV-Datei. Anscheinend ist es eine NIST SPHERE-Datei. Aus der LDC web page: "Viele LDC-Korpora enthalten Sprachdateien im NIST SPHERE-Format." Gemäß der Beschreibung der NIST File Format sind die ersten vier Zeichen der Datei NIST. Das ist, was der scipy Fehler Ihnen sagt: Es kann nicht eine Datei lesen, die mit NIST beginnt.

Ich vermute, Sie müssen convert the file zu WAV, wenn Sie die Datei mit einer der Bibliotheken, die Sie versucht haben, lesen möchten.Um die Konvertierung zu WAV unter Verwendung des Programms sph2pipe zu erzwingen, verwenden Sie die Befehlsoption -f wav (oder äquivalent -f rif), z.

sph2pipe -f wav input.sph output.wav 
+0

Bitte sehen Sie meine Antwort im Haupt-Thread, danke – oren

+0

Ich aktualisierte meine Antwort mit einer Notiz über die Verwendung von '-f wav'. –

+0

Großartig, jetzt funktioniert es. Vielen Dank! – oren

1

Ausgabe dieses von der Kommandozeile seines eine WAV-Datei, um zu überprüfen ... oder nicht

xxd -b myaudiofile.wav | head 

wenn sein WAV-Format es die so etwas wie

00000000: 01010010 01001001 01000110 01000110 10111100 10101111 RIFF.. 
00000006: 00000001 00000000 01010111 01000001 01010110 01000101 ..WAVE 
0000000c: 01100110 01101101 01110100 00100000 00010000 00000000 fmt .. 
00000012: 00000000 00000000 00000001 00000000 00000001 00000000 ...... 
00000018: 01000000 00011111 00000000 00000000 01000000 00011111 @[email protected] 
0000001e: 00000000 00000000 00000001 00000000 00001000 00000000 ...... 
00000024: 01100100 01100001 01110100 01100001 10011000 10101111 data.. 
0000002a: 00000001 00000000 10000001 10000000 10000001 10000000 ...... 
00000030: 10000001 10000000 10000001 10000000 10000001 10000000 ...... 
00000036: 10000001 10000000 10000001 10000000 10000001 10000000 ...... 

Mitteilung erscheint WAV-Datei beginnt mit den Zeichen RIFF das ist der obligatorische Indikator die Datei verwendet WAV-Codec ... wenn Ihr System (ich bin auf Linux) nicht über die Befehlszeile Utilit haben y: xxd dann any hex editor like wxHexEditor verwenden, um Ihre ähnlich WAV-Datei untersuchen Sie die RIFF sehen zu bestätigen ... wenn kein RIFF dann seine nicht einfach eine WAV-Datei

Hier sind Details von WAV-Format-Spezifikationen

http://soundfile.sapp.org/doc/WaveFormat/

http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html

http://unusedino.de/ec64/technical/formats/wav.html

http://www.drdobbs.com/database/inside-the-riff-specification/184409308

https://www.gamedev.net/articles/programming/general-and-gameplay-programming/loading-a-wave-file-r709

http://www.topherlee.com/software/pcm-tut-wavformat.html

http://www.labbookpages.co.uk/audio/javaWavFiles.html

http://www.johnloomis.org/cpe102/asgn/asgn1/riff.html

http://nagasm.org/ASL/sound05/

0

Wenn Sie einen generischen Code, der in den Ordner Lauf für jede WAV-Datei funktioniert:

forfiles /s /m *.wav /c "cmd /c sph2pipe -f wav @file @fnameRIFF.wav" 

Es ist für jede WAV-Datei suchen, finden und eine WAV-Datei, die sowohl scipy und Welle erstellen kann mit dem Namen lesen < base_name> RIFF.wav

+0

Dies ergänzt mit Warren Weckesser Lösung von Sph2pipe ... Ich hätte es als Kommentar gesetzt, aber ich habe den Ruf noch nicht benötigt. –