【发布时间】:2019-07-24 03:29:33
【问题描述】:
我正在尝试构建一个音频到可见波形转换器a la联觉,但我遇到了一个可爱的小错误:
/Users/nathanielastudillo/anaconda/lib/python3.6/site-packages/scipy/io/wavfile.py:172: WavFileWarning: Chunk (non-data) not understood, skipping it.
WavFileWarning)
Traceback (most recent call last):
File "<ipython-input-8-c1948c42b069>", line 5, in <module>
rate, audio = wavfile.read('3 - Headache.wav')
File "/Users/nathanielastudillo/anaconda/lib/python3.6/site-packages/scipy/io/wavfile.py", line 166, in read
data = _read_data_chunk(fid, comp, noc, bits, mmap=mmap)
File "/Users/nathanielastudillo/anaconda/lib/python3.6/site-packages/scipy/io/wavfile.py", line 71, in _read_data_chunk
data = numpy.fromstring(fid.read(size), dtype=dtype)
TypeError: data type "<i3" not understood
真的很愉快。我对 numpy 的 dtype documentation 进行了一些挖掘,发现 wavfile.py 难以咀嚼的非数据块是一个 little-endian 有符号整数,大概是 3 个字节长,由 @mgilson 对 @ 的评论987654322@。
无论出于何种原因,numpy 似乎都不想使用 3 字节 little-endian 有符号整数。我想使用提到的修复程序here,但我什至无法加载文件。尝试将修改后的 wavefile.py 版本一起破解是否有意义?有谁知道我该如何解决这个问题?我的实现,借用this,是:
from scipy import signal
from scipy.io import wavfile
import scipy.io.wavfile
M=1024
rate, audio = wavfile.read('3 - Headache.wav')
freqs, times, spect = signal.spectrogram(audio, fs=rate, window='hanning',
nperseg=1024, noverlap=M - 100,
detrend=False, scaling='spectrum')
【问题讨论】:
-
您使用的是哪个版本的 scipy?您可以通过
import scipy; print(scipy.__version__)查询 -
如果 WAV 文件使用 24 位数据,scipy can not read it。你可以试试wavio,这是我写的一个小型 Python 库。它是 Python 标准
wave库的包装器,可将数据作为 numpy 数组返回。 -
如何使用例如librosa 还是其他十几个专业音频库之一?如果你知道 scipy 这种数据类型存在固有的问题......
-
我会试试 wavio 和 librosa。当我找到解决方案时会报告。
标签: python numpy audio scipy signal-processing