我试图在python中从TIMIT数据库读取一个wav文件,但是我收到一个错误:
当我使用wave时:
wave.Error: file does not start with RIFF id
当我使用scipy时:
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包的旧答案,但看起来它不再受支持了。
如何阅读这些文件以获取数据的数据?
由于
答案 0 :(得分:4)
您的文件不是WAV文件。显然它是一个NIST SPHERE文件。来自LDC web page:“许多LDC语料库包含NIST SPHERE格式的语音文件。”根据NIST File Format的描述,文件的前四个字符为{{ 1}}。这就是scipy错误告诉你的:它不知道如何读取以NIST
开头的文件。
我怀疑如果你想用你试过的任何库读取文件,你必须convert the file到WAV。要使用程序NIST
强制转换为WAV,请使用命令选项sph2pipe
(或等效地,-f wav
),例如
-f rif
答案 1 :(得分:2)
从命令行发出此命令以验证其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文件以字符RIFF开头 这是文件使用wav编解码器的强制指示...如果你的系统(我在linux上)没有上面的命令行实用程序:xxd然后使用any hex editor like wxHexEditor同样检查你的wav文件以确认你看到RIFF ...如果没有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
答案 2 :(得分:2)
如果你想要一个适用于文件夹内的每个wav文件的通用代码:
forfiles /s /m *.wav /c "cmd /c sph2pipe -f wav @file @fnameRIFF.wav"
它搜索每个可以找到并创建wav文件的wav文件,scipy和wave都可以读取名称< base_name> RIFF.wav
答案 3 :(得分:0)
我写了一个python脚本,它将所有说话者从所有方言说来的所有.WAV文件转换为NIST格式,转换成.wav文件, 可以在您的系统上播放。
注意:所有方言文件夹都位于./TIMIT/TRAIN/中。您可能需要根据您的项目结构(或者如果您使用的是Windows)更改Dialects_path
<Project...>
...
<ItemGroup>
<FilesToDelete Include="MyPath/*.cs" />
</ItemGroup>
<Target Name="DeleteSpecificFiles" BeforeTargets="build">
<Message Text="Specific Files: @(FilesToDelete)"/>
<Message Text ="Beginning to delete specific files before build or rebuild..."/>
<Delete Files="@(FilesToDelete)"/>
</Target>
</Project>
答案 4 :(得分:0)
请使用 sounddevice 和 soundfile 获取 numpy 数组数据(和播放)使用以下代码:
import matplotlib.pyplot as plt
import soundfile as sf
import sounddevice as sd
# https://catalog.ldc.upenn.edu/desc/addenda/LDC93S1.wav
data, fs = sf.read('LDC93S1.wav')
print(data.shape,fs)
sd.play(data, fs, blocking=True)
plt.plot(data)
plt.show()
输出
(46797,) 16000
TIMIT 数据库 wav 文件示例:https://catalog.ldc.upenn.edu/desc/addenda/LDC93S1.wav
答案 5 :(得分:0)
有时这可能是由于提取 7zip 文件的方法不正确造成的。我有一个类似的问题。我通过使用 7z x <datasetname>.7z