在 Python 中绘制 Wav 文件视听
Plot a Wave files Audio Visually In Python
我想弄清楚如何直观地绘制 wav 文件的音频。在我的代码中,如果我执行 wavefile.readframe(-1)
我会绘制整个 wav 文件,我的代码现在的工作方式是我只得到一个银色(一帧!)我想在每个图像上显示 24 帧音频从波形文件中绘制出来,这样我就可以制作动画了。希望这很清楚。
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np
import wave , sys , os , struct
waveFile = wave.open('mono.wav','r')
length = waveFile.getnframes()
for i in range(0,length):
print i # so we know where we are at.
waveData = waveFile.readframes(i)
fs = waveFile.getframerate()
signal = np.fromstring(waveData, 'Int16')
Time=np.linspace(0, len(signal)/fs, num=len(signal))
plt.axis('off')
plt.plot(Time,signal , 'w')
plt.savefig('signal' + str(i) + '.png' , facecolor='none', edgecolor='none', transparent=True, frameon=False)
plt.close
Wave_read.readframes
(n)
Reads and returns at most n frames of audio, as a string of bytes.
因此,要读取 24 帧的大块,您只需调用
waveData = waveFile.readframes(24)
当您以读取 ('r'
) 模式打开文件时,文件指针从第 0 帧开始。当您从文件中读取帧时,您会将文件指针前进相同数量的帧。这意味着重复调用 waveFile.readframes(24)
将产生连续的 24 帧块,直到您到达文件末尾 - 无需传递不断变化的索引 i
.
要跟踪您在文件中的位置,您可以调用 waveFile.tell()
, and to skip forwards or backwards to the k
th frame you can use waveFile.setpos(k)
。
顺便说一下,这种行为与标准 file objects 在 Python 中的工作方式非常一致。
我重新编码了一下,上面的回答有帮助,但我需要做更多的按摩。因此,如果您需要以这种方式实时绘制音频,只需调整读取帧以获得您想要接收的帧数。要绘制每个帧,我不得不制作单独的 plt.figure id's 此代码片段将得到你想去的地方
wave_file = wave.open('mono.wav', 'r')
data_size = wave_file.getnframes()
sample_rate = wave_file.getframerate()
while True:
waveData = wave_file.readframes(10000)
signal = np.fromstring(waveData , 'Int16')
Time=np.linspace(0, len(signal), num=len(signal))
plt.figure()
fig = plt.figure(figsize=(xinch,yinch) , frameon=False)
#fig = plt.figure(frameon=False)
ax = fig.add_axes([0, 0, 1, 1])
#ax.axis('off')
plt.axis('off')
line = plt.plot(Time,signal , 'w')
plt.setp(line, linewidth=10)
plt.savefig('signal' + str(x) + '.png')
plt.close
x+= 1
if wave_file.tell() == data_size:
break
将产生如下帧:
我想弄清楚如何直观地绘制 wav 文件的音频。在我的代码中,如果我执行 wavefile.readframe(-1)
我会绘制整个 wav 文件,我的代码现在的工作方式是我只得到一个银色(一帧!)我想在每个图像上显示 24 帧音频从波形文件中绘制出来,这样我就可以制作动画了。希望这很清楚。
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np
import wave , sys , os , struct
waveFile = wave.open('mono.wav','r')
length = waveFile.getnframes()
for i in range(0,length):
print i # so we know where we are at.
waveData = waveFile.readframes(i)
fs = waveFile.getframerate()
signal = np.fromstring(waveData, 'Int16')
Time=np.linspace(0, len(signal)/fs, num=len(signal))
plt.axis('off')
plt.plot(Time,signal , 'w')
plt.savefig('signal' + str(i) + '.png' , facecolor='none', edgecolor='none', transparent=True, frameon=False)
plt.close
Wave_read.readframes
(n)Reads and returns at most n frames of audio, as a string of bytes.
因此,要读取 24 帧的大块,您只需调用
waveData = waveFile.readframes(24)
当您以读取 ('r'
) 模式打开文件时,文件指针从第 0 帧开始。当您从文件中读取帧时,您会将文件指针前进相同数量的帧。这意味着重复调用 waveFile.readframes(24)
将产生连续的 24 帧块,直到您到达文件末尾 - 无需传递不断变化的索引 i
.
要跟踪您在文件中的位置,您可以调用 waveFile.tell()
, and to skip forwards or backwards to the k
th frame you can use waveFile.setpos(k)
。
顺便说一下,这种行为与标准 file objects 在 Python 中的工作方式非常一致。
我重新编码了一下,上面的回答有帮助,但我需要做更多的按摩。因此,如果您需要以这种方式实时绘制音频,只需调整读取帧以获得您想要接收的帧数。要绘制每个帧,我不得不制作单独的 plt.figure id's 此代码片段将得到你想去的地方
wave_file = wave.open('mono.wav', 'r')
data_size = wave_file.getnframes()
sample_rate = wave_file.getframerate()
while True:
waveData = wave_file.readframes(10000)
signal = np.fromstring(waveData , 'Int16')
Time=np.linspace(0, len(signal), num=len(signal))
plt.figure()
fig = plt.figure(figsize=(xinch,yinch) , frameon=False)
#fig = plt.figure(frameon=False)
ax = fig.add_axes([0, 0, 1, 1])
#ax.axis('off')
plt.axis('off')
line = plt.plot(Time,signal , 'w')
plt.setp(line, linewidth=10)
plt.savefig('signal' + str(x) + '.png')
plt.close
x+= 1
if wave_file.tell() == data_size:
break
将产生如下帧: