首页 > 解决方案 > 有没有办法使用 librosa 的波形图来存储图形的坐标而不是显示波形图的图像?

问题描述

我正在开发一个使用 Librosa 的音频项目,并从在线示例中获取以下代码。我希望能够将构成图形的坐标存储在数组中,而不是打开具有幅度与时间关系图的图像。我已经尝试了很多在 stackoverflow 以及其他网站上发现的不同示例,但都没有运气。我对python比较陌生,这是我关于stackoverflow的第一个问题,所以请善待。

import librosa.display
import matplotlib.pyplot as plt
from IPython.display import display, Audio
filename = 'queen2.mp3'
samples, sampleRate = librosa.load(filename)
display(Audio(filename))
plt.figure(figsize=(12, 4))
librosa.display.waveplot(y, sr=None, max_points=200)
plt.show()

标签: python-3.xlibrosa

解决方案


librosa 是开源的(在ISC 许可下),因此您可以查看代码以了解它是如何做到的。函数的文档有一个方便的[source]链接,可以让你编写代码。对于librosa.display.waveplot,您会看到它调用了一个函数__envelope()来计算包络。大概是您所追求的这些坐标。

hop_length = 1
y = __envelope(y, hop_length)

y_top = y[0]
y_bottom = -y[-1]
import numpy as np

def __envelope(x, hop):
    '''Compute the max-envelope of non-overlapping frames of x at length hop

    x is assumed to be multi-channel, of shape (n_channels, n_samples).
    '''
    x_frame = np.abs(util.frame(x, frame_length=hop, hop_length=hop))
    return x_frame.max(axis=1)

推荐阅读