我试图从python中的TIMIT数据库读取一个wav文件,但是我得到了一个错误:
当我使用wave时:
wave.Error: file does not start with RIFF id当我使用枕木时:
ValueError: File format b'NIST'... not understood.当我使用librosa的时候,程序被卡住了。我尝试使用sox将其转换为wav:
cmd = "sox " + wav_file + " -t wav " + new_wav
subprocess.call(cmd, shell=True)但没什么用。我看到了一个引用包scikits.audiolab的旧答案,但它看起来已经不再受支持了。
如何读取这些文件以获得数据的ndarray?
谢谢
发布于 2017-06-26 00:37:30
发布于 2017-06-25 20:47:21
从命令行发出这个命令来验证它是wav文件..。或者不是
xxd -b myaudiofile.wav | head如果它的wav格式,它将显示如下
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 @...@.
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 ......这里还有另一种显示二进制文件内容的方法,比如WAV。
od -A x -t x1z -v audio_util_test_file_custom.wav | head
000000 52 49 46 46 24 80 00 00 57 41 56 45 66 6d 74 20 >RIFF$...WAVEfmt <
000010 10 00 00 00 01 00 01 00 44 ac 00 00 88 58 01 00 >........D....X..<
000020 02 00 10 00 64 61 74 61 00 80 00 00 00 00 78 05 >....data......x.<
000030 ed 0a 5e 10 c6 15 25 1b 77 20 ba 25 eb 2a 08 30 >..^...%.w .%.*.0<
000040 0e 35 fc 39 cf 3e 84 43 1a 48 8e 4c de 50 08 55 >.5.9.>.C.H.L.P.U<
000050 0b 59 e4 5c 91 60 12 64 63 67 85 6a 74 6d 30 70 >.Y.\.`.dcg.jtm0p<
000060 b8 72 0a 75 25 77 09 79 b4 7a 26 7c 5d 7d 5a 7e >.r.u%w.y.z&|]}Z~<
000070 1c 7f a3 7f ee 7f fd 7f d0 7f 67 7f c3 7e e3 7d >..........g..~.}<
000080 c9 7c 74 7b e6 79 1e 78 1f 76 e8 73 7b 71 d9 6e >.|t{.y.x.v.s{q.n<
000090 03 6c fa 68 c1 65 57 62 c0 5e fd 5a 0f 57 f8 52 >.l.h.eWb.^.Z.W.R<注意,wav文件以字符RIFF开头,这是该文件使用wav编解码器的强制性指示符.如果您的系统(我在linux上)没有上面的命令行实用程序: xxd,那么使用任何像wxHexEditor这样的十六进制编辑器类似地检查您的wav文件以确认您看到了.如果没有RIFF,那么它就是一个wav文件。
以下是wav格式规范的详细信息
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
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/
发布于 2017-11-18 21:38:48
如果您想要对文件夹中的每个wav文件都有效的通用代码,请运行:
forfiles /s /m *.wav /c "cmd /c sph2pipe -f wav @file @fnameRIFF.wav"它搜索每个wav文件,这些文件可以找到并创建名称< base_name >RIFF.wav的the和wave都可以读取的wav文件。
https://stackoverflow.com/questions/44748258
复制相似问题