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:

python 多个wav音频文件 生成srt字幕 python处理音频文件_音频编码解码


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:

python 多个wav音频文件 生成srt字幕 python处理音频文件_ci_02


然后通过wavio.write()函数将波形文件写出:

wavio.write("./data/sin+cos.wav", x, rate, sampwidth=3)

打开Au查看一下导出的波形文件:

python 多个wav音频文件 生成srt字幕 python处理音频文件_ci_03


看起来没问题。这大概就是wavio模块所干的事情了。