wavio
模块介绍
wavio
是一个实现wav
文件读写的模块,最近正好在研究计算机听觉,需要一个能够轻松读写音频的库或者模块,网上貌似都是scipy的音频模块或者wave,但是这两者都有点问题。
后来在某个不知名的网站上遇到了wavio
这个库,作者也是因为不满意scipy的音频处理库,一怒之下写的这个模块。这个模块需要额外安装,直接通过pip
指令就可以了。
wavio.read()
实现读入
开门见山,这个模块只有两个函数wavio.read()
和wavio.write()
。一读一写。
选择这个库还有一个原因就是,这个库是将wav
文件以numpy
数组(ndarray对象)的方式读入的。下面通过实例来演示wavio.read()
。
先导入需要的库:
import numpy as np
import wavio
import matplotlib.pyplot as plt
我先读入一段我用手机录的吉他曲:
wav = wavio.read("./data/test.wav")
wav
out:
Wav(data.shape=(5776711, 2), data.dtype=int16, rate=48000, sampwidth=2)
可以看到,wavio.read()
只需要一个参数,也就是wav文件路径,就可以完成读入操作。读入操作返回一个wavio.Wav
对象,这个对象有如下的数据成员:
- data:波形文件采样点对应的
numpy
数组。这个数组有两个维度,第一个维度为单个通道采样点的数量,第二个维度为音频的通道数。 - rate:采样率。
- sampwidth:位深度。此处为2,代表wav是双声道的。
通常的DAW(数字音频工作站)都会自动绘制波形文件的图像,在了解了wavio.Wav
对象的结构后,我们也可以轻松绘制图像:
left_wav, right_wav = wav.data.T # 根据上述的描述,我们需要转置,才能得到两个声道的波形文件
plt.figure(figsize=[24, 16])
fig, (ax1, ax2) = plt.subplots(2, 1)
ax1.plot(left_wav)
ax2.plot(right_wav)
plt.xlabel("time")
plt.show()
out:
wavio.write()
实现写
既然,我们可以将一个波形文件绘制成图像,那么我们也可以反过来,将我们杂乱无章的、或许有趣或许乏味的图像导出成波形文件,我们可以通过wavio.write()
来实现。
由于是导出,所以我们需要指定一堆参数来指定导出的波形文件,我们可以试着先生成一张图片(小学声学知识告诉我们,声音是周期函数的组合,所以或一张周期函数):
import numpy as np
import matplotlib.pyplot as plt
import wavio
rate = 22050 # samples per second
T = 3 # sample duration (seconds)
f = 440.0 # sound frequency (Hz)
t = np.linspace(0, T, T*rate, endpoint=False)
x = np.sin(4*np.pi * f * t) + np.cos(2*np.pi * f * t)
plt.plot(t[::100], x[::100])
plt.show()
out:
然后通过wavio.write()
函数将波形文件写出:
wavio.write("./data/sin+cos.wav", x, rate, sampwidth=3)
打开Au查看一下导出的波形文件:
看起来没问题。这大概就是wavio模块所干的事情了。