这可能吗?当使用来自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标题??
答案 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