我可以将librosa生成的光谱图转换回音频吗?

2024-06-01 09:09:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我将一些音频文件转换为光谱图,并使用以下代码将其保存到文件中:

import os
from matplotlib import pyplot as plt
import librosa
import librosa.display
import IPython.display as ipd

audio_fpath = "./audios/"
spectrograms_path = "./spectrograms/"
audio_clips = os.listdir(audio_fpath)

def generate_spectrogram(x, sr, save_name):
    X = librosa.stft(x)
    Xdb = librosa.amplitude_to_db(abs(X))
    fig = plt.figure(figsize=(20, 20), dpi=1000, frameon=False)
    ax = fig.add_axes([0, 0, 1, 1], frameon=False)
    ax.axis('off')
    librosa.display.specshow(Xdb, sr=sr, cmap='gray', x_axis='time', y_axis='hz')
    plt.savefig(save_name, quality=100, bbox_inches=0, pad_inches=0)
    librosa.cache.clear()

for i in audio_clips:
    audio_fpath = "./audios/"
    spectrograms_path = "./spectrograms/"
    audio_length = librosa.get_duration(filename=audio_fpath + i)
    j=60
    while j < audio_length:
        x, sr = librosa.load(audio_fpath + i, offset=j-60, duration=60)
        save_name = spectrograms_path + i + str(j) + ".jpg"
        generate_spectrogram(x, sr, save_name)
        j += 60
        if j >= audio_length:
            j = audio_length
            x, sr = librosa.load(audio_fpath + i, offset=j-60, duration=60)
            save_name = spectrograms_path + i + str(j) + ".jpg"
            generate_spectrogram(x, sr, save_name)

我想保留音频中最详细的内容和质量,这样我就可以在不损失太多的情况下将它们恢复为音频(每个80MB)

是否可以将它们转回到音频文件?我怎么做

Example spectrograms

我尝试使用librosa.feature.inverse.mel_to_音频,但没有效果,我认为它不适用

我现在有1300个频谱图文件,我想用它们训练一个生成性的对抗网络,这样我就可以生成新的音频,但如果我以后听不到结果,我不想这样做


Tags: pathnameimportsavedisplayplt音频audio
1条回答
网友
1楼 · 发布于 2024-06-01 09:09:56

是的,可以使用Griffin Lim算法(GLA)等恢复大部分信号并估计相位。它的Python“快速”实现可以在librosa中找到。以下是如何使用它:

import numpy as np
import librosa

y, sr = librosa.load(librosa.util.example_audio_file(), duration=10)
S = np.abs(librosa.stft(y))
y_inv = librosa.griffinlim(S)

这就是原作和重建的样子:

reconstruction

默认情况下,该算法随机初始化相位,然后迭代正向和反向STFT操作以估计相位

查看代码,要重建信号,只需执行以下操作:

import numpy as np

X_inv = librosa.griffinlim(np.abs(X))

当然,这只是一个例子。正如@PaulR所指出的,在您的例子中,您需要从jpeg加载数据(这是有损的!),然后首先对amplitude_to_db应用逆变换

由于人工神经网络的进步,该算法,特别是相位估计,可以进一步改进Here是一篇讨论一些增强功能的文章

相关问题 更多 >