将TIMIT数据库中的Nist Wav文件读入python numpy数组

时间:2012-04-17 07:33:24

标签: python numpy scipy speech-recognition

这可能吗?当使用来自scikits.audiolab的wavread时,我似乎遇到了这个错误:

x86_64.egg/scikits/audiolab/pysndfile/matapi.pyc in basic_reader(filename, last, first)
     93             if not hdl.format.file_format == filetype:
     94                 raise ValueError, "%s is not a %s file (is %s)" \
---> 95                       % (filename, filetype, hdl.format.file_format)
     96 
     97             fs = hdl.samplerate

ValueError: si762.wav is not a wav file (is nist)

我猜它无法读取NIST的wav文件,但还有另一种方法可以轻松地将它们读入一个numpy数组吗?如果没有,那么阅读数据的最佳方式是什么?

可能重写audiolab wavread以识别nist标题??

3 个答案:

答案 0 :(得分:4)

回答我自己的问题,因为想出来但你可以使用scikits.audiolab中的Sndfile类,它支持大量的读写文件格式,具体取决于你拥有的libsndfile。然后你只需使用:

from scikits.audiolab import Sndfile, play
f = Sndfile(filename, 'r')
data = f.read_frames(10000)
play(data) # Just to test the read data

答案 1 :(得分:1)

为了扩展J Spen的答案,在使用scikits.audiolab时,如果您想要读取整个文件而不仅仅是指定数量的帧,您可以使用nframes参数Sndfile类来阅读整个事情。例如:

from scikits.audiolab import Sndfile, play
f = Sndfile(filename, 'r')
data = f.read_frames(f.nframes)
play(data) # Just to test the read data

我在文档中找不到任何对此的引用,但是它存在于源代码中。

答案 2 :(得分:0)

与上述答案相反,还有另一种阅读方式 多种格式的音频文件,例如 .wav、.aif、.mp3 等

import matplotlib.pyplot as plt
import soundfile as sf
import sounddevice as sd
# https://freewavesamples.com/files/Alesis-Sanctuary-QCard-Crotales-C6.wav
data, fs = sf.read('Alesis-Sanctuary-QCard-Crotales-C6.wav')
print(data.shape,fs)
sd.play(data, fs, blocking=True)
plt.plot(data)
plt.show()

输出:

(88116, 2) 44100

enter image description here