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

时间:2017-06-25 16:19:21

标签: python audio scipy wav wave

我试图在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包的旧答案,但看起来它不再受支持了。

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

由于

6 个答案:

答案 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

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/

答案 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

enter image description here

TIMIT 数据库 wav 文件示例:https://catalog.ldc.upenn.edu/desc/addenda/LDC93S1.wav

答案 5 :(得分:0)

有时这可能是由于提取 7zip 文件的方法不正确造成的。我有一个类似的问题。我通过使用 7z x <datasetname>.7z

提取数据集解决了这个问题