想用Python读取wav文件?这么做!

一句话总结:国外大神各种python读写wav的库都试过了,我跑了下他的代码,推荐soundfile,scipy,ewave,不推荐Pyhon官方库wave

不推荐:

不要用官方库(wave)!!!垃圾!!!不支持读float的wav!!!(但是如果不想装第三方库而且不用读float的wav还是可以的,如下代码,读一个16bit的int的wav还是很轻松)

import wave
import matplotlib.pyplot as plt
import numpy as np
with wave.open('data/test_wav_pcm16.wav') as w:
    framerate = w.getframerate()
    frames = w.getnframes()
    channels = w.getnchannels()
    width = w.getsampwidth()
    print('sampling rate:', framerate, 'Hz')
    print('length:', frames, 'samples')
    print('channels:', channels)
    print('sample width:', width, 'bytes')
    data = w.readframes(frames)
np.frombuffer(data, dtype='B')
sig = np.frombuffer(data, dtype='<i2').reshape(-1, channels)
plt.plot(sig)
plt.show()

推荐1:第三方库-soundfile,安装方法:pip install soundfile

支持16bit,24bit的整数型wav!!

支持32位float的wav!!

import soundfile as sf
import matplotlib.pyplot as plt
# 读取16bit整数wav
sig, samplerate = sf.read('data/test_wav_pcm16.wav')
f1 = plt.figure(1)
plt.plot(sig)
# 读取24bit整数wav
sig, samplerate = sf.read('data/test_wav_pcm24.wav')
f2 = plt.figure(2)
plt.plot(sig)
# 读取32bit浮点数wav
sig, samplerate = sf.read('data/test_wav_float32.wav')
f3 = plt.figure(3)
plt.plot(sig)
plt.show()

推荐2:第三方库-scipy,安装方法:pip install scipy

支持16bit的整数型wav!!

支持32位float的wav!!

from scipy.io import wavfile
import matplotlib.pyplot as plt
# 读取16bit整数wav
fs, sig = wavfile.read('data/test_wav_pcm16.wav')
print("sampling rate = {} Hz, length = {} samples, channels = {}".format(fs, *sig.shape))
print(sig)
f1 = plt.figure(1)
plt.plot(sig)
# 读取32bit浮点数wav
fs, sig = wavfile.read('data/test_wav_float32.wav')
f2 = plt.figure(2)
plt.plot(sig)
plt.show()

推荐3:第三方库-ewave,安装方法:pip install ewave

支持16bit的整数型wav!!

支持32位float的wav!!

import ewave
import matplotlib.pyplot as plt
# 读取16bit整数wav
with ewave.open('data/test_wav_pcm16.wav') as w:
    print("samplerate = {0.sampling_rate} Hz, length = {0.nframes} samples, "
          "channels = {0.nchannels}, dtype = {0.dtype!r}".format(w))
    data = w.read()
f1 = plt.figure(1)
plt.plot(data)
# 读取32bit浮点数wav