首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从python的TIMIT数据库读取WAV文件

从python的TIMIT数据库读取WAV文件
EN

Stack Overflow用户
提问于 2017-06-25 16:19:21
回答 6查看 14.4K关注 0票数 13

我试图从python中的TIMIT数据库读取一个wav文件,但是我得到了一个错误:

当我使用wave时:

代码语言:javascript
复制
wave.Error: file does not start with RIFF id

当我使用枕木时:

代码语言:javascript
复制
ValueError: File format b'NIST'... not understood.

当我使用librosa的时候,程序被卡住了。我尝试使用sox将其转换为wav:

代码语言:javascript
复制
cmd = "sox " + wav_file + " -t wav " + new_wav
subprocess.call(cmd, shell=True)

但没什么用。我看到了一个引用包scikits.audiolab的旧答案,但它看起来已经不再受支持了。

如何读取这些文件以获得数据的ndarray?

谢谢

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-06-26 00:37:30

您的文件不是WAV文件。显然,它是一个NIST球面文件。在最不发达国家网页中:“许多最不发达国家语料库包含NIST球面格式的语音文件。”根据NIST文件格式的描述,文件的前四个字符是NIST。这就是枕错误告诉您的:它不知道如何读取以NIST开头的文件。

如果您想使用您尝试过的任何库读取该文件,我怀疑您将不得不使用转换文件到WAV。若要强制使用程序sph2pipe将WAV转换为WAV,请使用命令选项-f wav (或等效地,-f rif)。

代码语言:javascript
复制
sph2pipe -f wav input.sph output.wav
票数 8
EN

Stack Overflow用户

发布于 2017-06-25 20:47:21

从命令行发出这个命令来验证它是wav文件..。或者不是

代码语言:javascript
复制
xxd -b myaudiofile.wav | head

如果它的wav格式,它将显示如下

代码语言:javascript
复制
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。

代码语言:javascript
复制
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

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/

票数 3
EN

Stack Overflow用户

发布于 2017-11-18 21:38:48

如果您想要对文件夹中的每个wav文件都有效的通用代码,请运行:

代码语言:javascript
复制
forfiles /s /m *.wav /c "cmd /c sph2pipe -f wav @file @fnameRIFF.wav"

它搜索每个wav文件,这些文件可以找到并创建名称< base_name >RIFF.wav的the和wave都可以读取的wav文件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44748258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档