wave
模块提供了一个处理 WAV
声音格式的便利接口。它不支持压缩/解压,但是支持单声道/立体声。
wave
模块定义了以下函数和异常:
wave.open(file, mode=None)
如果 file
是一个字符串,打开对应文件名的文件。否则就把它作为文件类对象来处理。mode
可以为以下值:
# 只读模式
'rb'
# 只写模式
'wb'
注意:不支持同时读写WAV
文件。
mode
设为 'rb'
时返回一个 Wave_read
对象,而 mode
设为 'wb'
时返回一个 Wave_write
对象。如果省略 mode
并指定 file
来传入一个文件类对象,则 file.mode
会被用作 mode
的默认值。
如果操作的是文件对象,当使用 wave
对象的 close()
方法时,并不会真正关闭文件对象,这需要调用文件对象的close()
方法来关闭文件对象。
wave.openfp(file, mode)
同 open()
,用于向后兼容。
Deprecated since version 3.7, will be removed in version 3.9.
exception wave.Error
当不符合WAV
格式或无法操作时引发的错误。
一、Wave_read对象
由 open()
返回的 Wave_read
对象,有以下几种方法:
Wave_read.close() # 关闭 `wave` 打开的数据流并使对象不可用。当对象销毁时会自动调用。
Wave_read.getnchannels() # 返回声道数量(1 为单声道,2 为立体声)
Wave_read.getsampwidth() # 返回采样字节长度
Wave_read.getframerate() # 返回采样频率
Wave_read.getnframes() # 返回音频总帧数
Wave_read.getcomptype() # 返回压缩类型(只支持 'NONE' 类型)
Wave_read.getcompname() # getcomptype() 的通俗版本。使用 'not compressed' 代替 'NONE'
Wave_read.getparams() # 返回一个 namedtuple() (nchannels, sampwidth, framerate, nframes, comptype,compname),与 get*() 方法的输出相同
Wave_read.readframes(n) # 读取并返回以 bytes 对象表示的最多 n 帧音频
Wave_read.rewind() # 设置当前文件指针位置
下面是一个读取wav
音频文件,并绘制wav
文件的波形图的示例:
# -*- coding: utf-8 -*-
import os
import wave
import pylab as pl
import numpy as np
# 打开WAV文档
f = wave.open(r"1.wav", "rb")
fsize = os.path.getsize("1.wav")
print("fsize: ", fsize)
# 读取格式信息
# (nchannels, sampwidth, framerate, nframes, comptype, compname)
# 通道数 采样字节长度 采样频率 总帧数(总的采样数)
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
print("nchannels: ", nchannels)
print("sampwidth: ", sampwidth)
print("framerate: ", framerate)
print("nframes: ", nframes)
# 读取波形数据,读取并返回以 bytes 对象表示的最多 n 帧音频。
str_data = f.readframes(nframes)
# print(str_data)
f.close()
# 将波形数据转换为数组
wave_data = np.fromstring(str_data, dtype=np.short)
# print(wave_data)
print("size : ", wave_data.size)
# for i in range(wave_data.size):
# if i % 10 == 0:
# print();
# print(wave_data[i])
if nchannels == 2:
wave_data.shape = -1, 2
wave_data = wave_data.T
time = np.arange(0, nframes) * (1.0 / framerate)
# 绘制波形
pl.subplot(211)
pl.plot(time, wave_data[0])
pl.subplot(212)
pl.plot(time, wave_data[1], c="g")
pl.xlabel("time (seconds)")
pl.show()
elif nchannels == 1:
wave_data.shape = -1, 1
wave_data = wave_data.T
time = np.arange(0, nframes) * (1.0 / framerate)
# 绘制波形
# pl.subplot(211)
pl.plot(time, wave_data[0], 'c')
pl.savefig("1.png")
pl.xlabel("time (seconds)")
pl.show()
二、Wave_write 对象
Wave_write.close() # 关闭 `wave` 打开的数据流并使对象不可用。当对象销毁时会自动调用。
Wave_write.setnchannels(n) # 设置声道数量(1 为单声道,2 为立体声)
Wave_write.setframerate(n) # 设置采样频率