Когда мы работаем с mel-spectrogram для создания функции для сети глубокого обучения, размер функции имеет важное значение. Эта статья позволяет людям понять, как рассчитывается размер функции, после чего мы можем реализовать извлечение функций самостоятельно. мы сделаем несколько шагов, сначала загрузим данные из wav-файла, затем напрямую воспользуемся API mel_spectrogram из librosa, после этого мы будем шаг за шагом вычислять mel_spectrogram вручную. Наконец, мы сравним руководство со сквозной версией.
Шаг 1. Загрузите данные из wav-файла в программу.
Если вы используете Python, используйте librosa lib с функцией загрузки, чтобы загрузить только 1 канал из файла wav, мы можем реализовать это
def load_sound_file(path, mono=False, channel=0): signal, sr = librosa.load(path, sr=None, mono=mono) if signal.ndim < 2: sound_file = signal, sr else: sound_file = signal[channel, :], sr return sound_file y,sr= load_sound_file('cant-do-that-44100.wav') dur = librosa.get_duration(y=y,sr=sr) print(len(y),sr,dur) # Output is # 166671 44100 3.7793877551020407
Шаг 2: Сгенерируйте мел-спектрограмму непосредственно с помощью librora lib
n_fft (длина БПФ), n_mel (количество ячеек мела), настройки hop_length, которые являются параметрами по умолчанию во многих библиотеках и приложениях.
n_fft= 2048 n_mels= 128 win_length = n_fft hop_length= 512 S=librosa.feature.melspectrogram(y=y,sr=sr,n_fft=n_fft, hop_length=hop_length, n_mels=n_mels, win_length=win_length) import matplotlib.pyplot as plt fig, ax = plt.subplots() S_dB = librosa.power_to_db(S, ref=np.max) img = librosa.display.specshow(S_dB, x_axis='time', y_axis='mel', sr=sr, ax=ax) fig.colorbar(img, ax=ax, format='%+2.0f dB') ax.set(title='Mel-frequency spectrogram') print(S_dB.shape) # Output is (128, 326)
Что делает мел-шкала, так это то, что мел-шкала больше фокусируется на низких частотах и подавляет высокие, а затем помещает все частоты в мел-бин, поэтому на выходе будет ровно мел-бин.
Шаг 3. Создайте банк мел-фильтров и рассчитайте power_spectrogram
filter_banks = librosa.filters.mel(n_fft = n_fft, sr = sr, n_mels = n_mels) print('filterBankSize:',filter_banks.shape) D = np.abs(librosa.stft(y,n_fft=n_fft, hop_length=hop_length,win_length=win_length))**2 librosa.display.specshow(librosa.amplitude_to_db(D,ref=np.max),sr=sr, y_axis='log', x_axis='time') plt.title('Power spectrogram') plt.colorbar(format='%+2.0f dB') plt.tight_layout() print('Power_SpectSize:', D.shape) # Output # FilterBankSize: (128, 1025) # PowerSpectSize: (1025, 326)
Шаг 4. Сгенерируйте mel из спектрограммы мощности и сравните две версии
my_S= filter_banks.dot(D) my_S_dB =librosa.power_to_db(my_S, ref=np.max) print(my_S_dB.shape) librosa.display.specshow(my_S_dB,sr=sr, y_axis='mel', x_axis='time') plt.title('mel from power spectrogram') plt.colorbar(format='%+2.0f dB') plt.tight_layout()
Спектрограмма Mel теперь может быть заархивирована из спектрограммы мощности после применения банка фильтров mel. Давайте сравним результат между ними
from sklearn.metrics import mean_squared_error mean_squared_error(my_S_dB,S_dB) # Output is 0.0 means perfectly matching between them