在 Python 中绘制 Wav 文件视听

Posted

技术标签:

【中文标题】在 Python 中绘制 Wav 文件视听【英文标题】:Plot a Wave files Audio Visually In Python 【发布时间】:2015-12-04 21:29:54 【问题描述】:

我正在尝试弄清楚如何以视觉方式绘制 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

【问题讨论】:

【参考方案1】:

来自the documentation:

Wave_read.readframes(n)

读取并返回最多 n 帧音频,作为字节串。

所以要读取一大块 24 帧,您只需调用

waveData = waveFile.readframes(24)

当您以读取 ('r') 模式打开文件时,文件指针从第 0 帧开始。当您从文件中读取帧时,您会将文件指针前进相同数量的帧。这意味着重复调用 waveFile.readframes(24) 将产生 24 帧的连续块,直到您到达文件末尾 - 无需传递不断变化的索引 i

要跟踪您在文件中的位置,您可以调用waveFile.tell(),并向前或向后跳到kth 帧,您可以使用waveFile.setpos(k)

顺便说一句,这种行为与标准 file objects 在 Python 中的工作方式非常一致。

【讨论】:

【参考方案2】:

我重新编码了一下,上面回答了帮助,但我需要做更多的按摩。因此,如果您需要以这种方式实时绘制音频,只需为您想要接收的尽可能多的帧调整 readframes。为了绘制每一帧,我最终不得不制作单独的 plt.figure id 这个代码片段将带您到哪里你想去

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

会产生这样的帧:

【讨论】:

以上是关于在 Python 中绘制 Wav 文件视听的主要内容,如果未能解决你的问题,请参考以下文章

使用python过滤wav文件

python绘制wav音频文件波形图

读取音频 wav 文件并绘制在 python 中平滑的音频频率响应

Python绘制wav文件音频图(静态)[matplotlib/wave]

如何在 Python 中绘制 MFCC?

在java中绘制wav文件