Могу ли я преобразовать спектрограммы, сгенерированные с помощью librosa, обратно в аудио? - PullRequest
3 голосов
/ 10 апреля 2020

Я преобразовал некоторые аудиофайлы в спектрограммы и сохранил их в файлы, используя следующий код:

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)

Я хотел сохранить большую детализацию и качество от aud ios, чтобы я мог включить они возвращаются к аудио без особых потерь (по 80 МБ каждый).

Можно ли превратить их обратно в аудиофайлы? Как я могу это сделать?

Example spectrograms

Я пытался использовать librosa.feature.inverse.mel_to_audio, но это не сработало, и я не могу думаю, что это применимо.

Теперь у меня есть 1300 файлов спектрограмм, и я хочу обучить с ними Генеративную состязательную сеть, чтобы я мог генерировать новые aud ios, но я не хочу делать это, если я не буду иметь возможность прослушать результаты позже.

1 Ответ

5 голосов
/ 10 апреля 2020

Да, можно восстановить большую часть сигнала и оценить фазу, например, с помощью алгоритма Гриффина-Лима (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

Алгоритм default случайным образом инициализирует фазы, а затем выполняет итерацию операций прямого и обратного STFT для оценки фаз.

Глядя на свой код, чтобы восстановить сигнал, вам просто нужно сделать:

import numpy as np

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

Это просто пример, конечно. Как указывает @PaulR, в вашем случае вам необходимо загрузить данные из jpeg (что с потерями!), А затем применить обратное преобразование сначала к amplitude_to_db.

Алгоритм, особенно оценка фазы может быть улучшена благодаря достижениям в искусственных нейронных сетях. Здесь - это одна статья, в которой обсуждаются некоторые улучшения.

...